public void DelayedPropertyChangeNotifications()
        {
            dynamic        i   = new TestItems.Item();
            IPropertyOwner ipo = (IPropertyOwner)i;
            List <string>  log = CreateItemPropertyNotificationLog(i);

            i.Name = "Good name"; // ⚡Name Changing, Changed
            log.Add("after Name");
            i.Cost = 1;           // ⚡Cost and CostIsDefaulted Changing, Changed
            log.Add("after Cost");
            CollectionAssert.AreEqual(new[] {
                "-Name: ", "+Name: Good name", "after Name",
                "-Cost: 43", "-CostIsDefaulted: True", "+Cost: 1", "+CostIsDefaulted: False", "after Cost"
            }, log);

            log.Clear();
            using (ipo.DelayedPropertyChangeNotification()) {
                i.Name = "No name";      // ⚡Name Changing
                log.Add("after Name");
                i.Cost = 2;              // ⚡Cost Changing
                log.Add("after Cost");
                i.Name = "Another name"; // no ⚡
                CollectionAssert.AreEqual(new[] { "-Name: Good name", "after Name", "-Cost: 1", "after Cost" }, log);
                log.Clear();
            } // ⚡Name and Cost Changed
            CollectionAssert.AreEqual(new[] { "+Name: Another name", "+Cost: 2" }, log);

            Assert.AreEqual(default(decimal), i.Price);
            i.Price = 144M;
            Assert.AreEqual(144M, i.Price);
            log.Clear();
            i["Price"] = null;
            Assert.AreEqual(0M, i.Price);
            i.Price = 89;
            CollectionAssert.AreEqual(new[] { "-Price: 144", "+Price: 0", "-Price: 0", "+Price: 89" }, log);
        }
        public void DefaultsAndPropertyChangeNotifications()
        {
            dynamic i = new TestItems.Item()
            {
                Name = "Testing, testing ..."
            };
            IPropertyOwner ipo = (IPropertyOwner)i;

            Assert.IsTrue(i.CostIsDefaulted);
            Assert.AreEqual(43L, i.Cost);

            List <string> log = CreateItemPropertyNotificationLog(i);

            i.Cost = 89L;
            Assert.IsFalse(i.CostIsDefaulted);
            Assert.AreEqual(89L, i.Cost);
            CollectionAssert.AreEqual(new[] { "-Cost: 43", "-CostIsDefaulted: True", "+Cost: 89", "+CostIsDefaulted: False" }, log);

            log.Clear();
            i["Cost"] = TestItems.ItemBase.CostDefault;
            Assert.IsFalse(i.CostIsDefaulted);
            Assert.AreEqual(43L, i.Cost);
            CollectionAssert.AreEqual(new[] { "-Cost: 89", "+Cost: 43" }, log);

            log.Clear();
            i["Cost"] = null;
            Assert.IsTrue(i.CostIsDefaulted);
            Assert.AreEqual(43L, i.Cost);
            CollectionAssert.AreEqual(new[] { "-Cost: 43", "-CostIsDefaulted: False", "+Cost: 43", "+CostIsDefaulted: True" }, log);

            log.Clear();
            ipo.SetToDefault(nameof(i.Cost));
            Assert.AreEqual(0, log.Count);

            Assert.IsTrue(i.LabelIsDefaulted);
            Assert.AreEqual("<label it>", i.Label);

            log.Clear();
            i.Label = "Well known";
            Assert.IsFalse(i.LabelIsDefaulted);
            Assert.AreEqual("Well known", i.Label);
            CollectionAssert.AreEqual(
                new[] { "-Label: <label it>", "-LabelIsDefaulted: True", "+Label: Well known", "+LabelIsDefaulted: False" }, log);

            log.Clear();
            i.Label = TestItems.ItemBase.LabelDefault;
            Assert.IsFalse(i.LabelIsDefaulted);
            Assert.AreEqual("<label it>", i.Label);
            CollectionAssert.AreEqual(new[] { "-Label: Well known", "+Label: <label it>" }, log);

            log.Clear();
            ipo.SetToDefault(nameof(i.Label));
            Assert.IsTrue(i.LabelIsDefaulted);
            Assert.AreEqual(TestItems.ItemBase.LabelDefault, i.Label);
            CollectionAssert.AreEqual(
                new[] { "-Label: <label it>", "-LabelIsDefaulted: False", "+Label: <label it>", "+LabelIsDefaulted: True" }, log);

            log.Clear();
            i.Name = null;
            CollectionAssert.AreEqual(
                new[] { "-Name: Testing, testing ...", "+Name: " }, log);
        }