예제 #1
0
        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);
            }
        }
예제 #3
0
        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);
            }
        }
예제 #4
0
        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
        }