public void Update_an_object_using_precompiled_accessors() { var bingo = new Bingo { X = 3, Y = 4 }; var x = CompiledAccessors.CompiledGetter(typeof(Bingo), "X")(bingo); Assert.AreEqual(3, x); CompiledAccessors.CompiledSetter(typeof(Bingo), "X")(bingo, 4); x = CompiledAccessors.CompiledGetter(typeof(Bingo), "X")(bingo); Assert.AreEqual(4, x); var smartSetter = CompiledAccessors.CompiledSmartSetter(typeof(Bingo), "Message"); Assert.IsNotNull(smartSetter); // a smart setter sets the property only if value is different var changed = smartSetter(bingo, "test"); Assert.IsTrue(changed); changed = smartSetter(bingo, "test"); Assert.IsFalse(changed); changed = smartSetter(bingo, "different"); Assert.IsTrue(changed); }
public void Intercept_changes_with_interface_wrapper() { { var instance = new Abcd(); var rules = new AbcdRules(); Assert.AreEqual(4, rules.RulesCount); var abcd = new InterfaceWrapper <IAbcd>(instance, rules); var inotify = (INotifyPropertyChanged)abcd; var changed = new List <string>(); inotify.PropertyChanged += (sender, args) => changed.Add(args.PropertyName); abcd.Target.A = 1; Assert.AreEqual(100, abcd.Target.A); Assert.AreEqual(100, instance.A); Assert.AreEqual(4, changed.Count); } { var instance = new Bingo(); var bingo = new InterfaceWrapper <IBingo>(instance, new BingoRules()); var inotify = (INotifyPropertyChanged)bingo; var changed = new List <string>(); inotify.PropertyChanged += (sender, args) => changed.Add(args.PropertyName); bingo.Target.X = 1; Assert.AreEqual("BINGO", bingo.Target.Message); Assert.AreEqual(101, instance.X); Assert.AreEqual(3, changed.Count); bingo.Target.Message = "BONGO"; Assert.AreEqual("BONGO", bingo.Target.Message); } }
public void Check_cascading_by_rule_engine() { var bingo = new Bingo(); var rules = new BingoRules(); { // setting Message property does not trigger any rule var modified = rules.SetProperty("Message", bingo, bingo, "test"); Assert.AreEqual(1, modified.Count); Assert.IsTrue(modified.Contains("Message")); Assert.AreEqual("test", bingo.Message); } { var modified = rules.SetProperty("X", bingo, bingo, 3); Assert.AreEqual(3, modified.Count); Assert.IsTrue(modified.Contains("X")); Assert.IsTrue(modified.Contains("Y")); Assert.IsTrue(modified.Contains("Message")); Assert.AreEqual("BINGO", bingo.Message); var x = bingo.X; // setting the same value should not trigger any rule modified = rules.SetProperty("X", bingo, bingo, x); Assert.AreEqual(0, modified.Count); } { var abcd = new Abcd(); var abcdRules = new AbcdRules(); var modified = abcdRules.SetProperty("A", abcd, abcd, 1); Assert.AreEqual(4, modified.Count); Assert.IsTrue(modified.Contains("A")); Assert.IsTrue(modified.Contains("B")); Assert.IsTrue(modified.Contains("C")); Assert.IsTrue(modified.Contains("D")); Assert.AreEqual(100, abcd.A); } }
public void Precompiled_accessors_are_much_faster_then_reflexion_based_ones() { var property = typeof(Bingo).GetProperty("X"); var getter = CompiledAccessors.CompiledGetter(typeof(Bingo), "X"); var setter = CompiledAccessors.CompiledSetter(typeof(Bingo), "X"); var smartSetter = CompiledAccessors.CompiledSmartSetter(typeof(Bingo), "X"); var bingo = new Bingo { X = 3, Y = 4 }; var time0 = TimeInMilliseconds(i => { var before = (int)getter(bingo); setter(bingo, before + 1); }, 1000000); Console.WriteLine("Compiled took {0} ms", time0); var time1 = TimeInMilliseconds(i => { var before = (int)property.GetValue(bingo); property.SetValue(bingo, before + 1); }, 1000000); Console.WriteLine("Reflexion-based took {0} ms", time1); var time2 = TimeInMilliseconds(i => smartSetter(bingo, i), 1000000); Console.WriteLine("Compiled smart seter took {0} ms", time2); Assert.Less(time2 * 5, time1); // compiled smart setters should be faster Assert.Less(time0 * 5, time1); // compiled accessors should be much faster than reflexion based ones }