public void Frozen_object_should_throw_ObjectFreezenException_when_trying_to_set_a_property()
        {
            var pet = Freezable.MakeFreezable <Pet>();

            pet.Age = 3;

            Freezable.Freeze(pet);
            Assert.IsTrue(Freezable.IsFrozen(pet));

            Assert.Throws <ObjectFreezenException>(() => pet.Name = "This should throw");
        }
        public void Freezable_should_not_intercept_normal_methods()
        {
            var pet = Freezable.MakeFreezable <Pet>();

            Freezable.Freeze(pet);
            Assert.IsTrue(Freezable.IsFrozen(pet));

            var dummy = pet.ToString(); // not intercepted
            var interceptedMethodsCount = GetInterceptedMethodsCountFor <FreezableInterceptor>(pet);

            Assert.AreEqual(0, interceptedMethodsCount);
        }
        public void Freezable_should_work_normally()
        {
            var rex = Freezable.MakeFreezable <Pet>();

            rex.Name = "Rex";
            rex.Age += 50;
            Assert.AreEqual(50, rex.Age);
            rex.Deceased = true;

            Freezable.Freeze(rex);

            Assert.IsTrue(Freezable.IsFrozen(rex));

            try {
                rex.Age++;
                Assert.Fail("rex is frozen!!!");
            }
            catch (ObjectFreezenException) {
                Console.WriteLine("Oops. it's frozen. Can't change that anymore.");
            }
        }