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); }