Esempio n. 1
0
        public void CanTrackListPropertyChanges()
        {
            A a = TrackableObjectFactory.CreateFrom(new A());

            a.Items.Add("hola");

            B b = TrackableObjectFactory.CreateFrom(new B());

            b.Dogs.First().Name = "Rex";
            b.Dogs.Add(new Dog {
                Name = "Rex"
            });

            C c = TrackableObjectFactory.CreateFrom(new C());

            c.Dogs.Add(new Dog {
                Name = "Rex"
            });

            IObjectChangeTracker Atracking = a.GetChangeTracker();
            IObjectChangeTracker Btracking = b.GetChangeTracker();
            IObjectChangeTracker Ctracking = c.GetChangeTracker();

            Assert.AreEqual(1, Atracking.ChangedProperties.Count);
            Assert.AreEqual(1, Btracking.ChangedProperties.Count);
            Assert.AreEqual(1, Ctracking.ChangedProperties.Count);
        }
        public void CanUndoAcceptSimplePropertyChangesAndContinueTrackingChanges()
        {
            const string initialValue = "hello world";
            const string changedValue = "hello world 2";

            A a = TrackableObjectFactory.CreateFrom(new A {
                Text = initialValue
            });

            a.Text = changedValue;

            IObjectChangeTracker changeTracker = a.GetChangeTracker();

            a.UndoChanges();

            a.Text = changedValue;

            Assert.AreEqual(1, changeTracker.ChangedProperties.Count);

            a.AcceptChanges();

            a.Text = initialValue;

            Assert.AreEqual(1, changeTracker.ChangedProperties.Count);
        }
        public void CanTrackSimplePropertyChanges()
        {
            const string initialValue = "hello world";
            const string changedValue = "hello world 2";

            A a = TrackableObjectFactory.CreateFrom(new A {
                Text = initialValue
            });

            a.Text = changedValue;

            Assert.AreNotEqual(initialValue, a.Text);
            Assert.AreEqual(changedValue, a.Text);

            IObjectChangeTracker changeTracker = a.GetChangeTracker();

            Assert.AreEqual(1, changeTracker.ChangedProperties.Count);
            Assert.AreEqual(1, changeTracker.UnchangedProperties.Count);

            IDeclaredObjectPropertyChangeTracking tracking = changeTracker.ChangedProperties.OfType <IDeclaredObjectPropertyChangeTracking>().Single();

            Assert.AreEqual("Text", tracking.Property.Name);
            Assert.AreEqual(initialValue, tracking.OldValue);
            Assert.AreEqual(changedValue, tracking.CurrentValue);
        }
        public void CanTrackChangesOfAssociations()
        {
            const string initialAText = "hello";
            const string initialBText = "world";
            const string initialCText = "!";
            const string initialDText = "boh!";

            A a = TrackableObjectFactory.CreateFrom
                  (
                new A
            {
                Text = initialAText,
                B    = new B
                {
                    Text = initialBText,
                    C    = new C
                    {
                        Text    = initialCText,
                        ListOfD = new List <D>
                        {
                            new D {
                                Text = initialDText
                            }
                        }
                    }
                }
            }
                  );

            IObjectChangeTracker tracker = a.GetChangeTracker();
            int changeCount = 0;

            tracker.Changed += (s, e) =>
            {
                changeCount++;
            };

            a.B.C.Text = "changed 1!";
            a.B.Text   = "changed 2!";
            a.Text     = "changed 3!";
            a.B.C.ListOfD.First().Text = "changed 4!";
            a.B.C.ListOfD.Add(new D {
                Text = "changed 5!"
            });

            Assert.AreEqual(5, changeCount);
            Assert.AreEqual(4, tracker.ChangedProperties.Count);
            Assert.AreEqual(2, tracker.UnchangedProperties.Count);
            Assert.AreEqual("changed 1!", a.B.C.Text);
            Assert.AreEqual("changed 2!", a.B.Text);
            Assert.AreEqual("changed 3!", a.Text);
            Assert.AreEqual("changed 4!", a.B.C.ListOfD.First().Text);
            Assert.AreEqual("changed 5!", a.B.C.ListOfD.Last().Text);
        }
Esempio n. 5
0
        public void CanTrackSetPropertyChanges()
        {
            C c = TrackableObjectFactory.CreateFrom(new C());

            IObjectChangeTracker Ctracking = c.GetChangeTracker();
            IReadOnlyChangeTrackableCollection trackableCollection = (IReadOnlyChangeTrackableCollection)c.Dogs;

            c.Dogs.Add(new Dog {
                Name = "Rex"
            });

            Assert.AreEqual(1, Ctracking.ChangedProperties.Count);
        }
        public void AffectTheSameValueObjectStayInUnchangedState()
        {
            const int initialValue = 0;
            var       a            = TrackableObjectFactory.CreateFrom(new ClassWithIntegers {
                Foo = initialValue
            });
            IObjectChangeTracker changeTracker = a.GetChangeTracker();

            Assert.AreEqual(0, changeTracker.ChangedProperties.Count);
            Assert.AreEqual(1, changeTracker.UnchangedProperties.Count);

            a.Foo = 2;
            a.Foo = initialValue;

            Assert.AreEqual(0, changeTracker.ChangedProperties.Count);
            Assert.AreEqual(1, changeTracker.UnchangedProperties.Count);
        }
        public void CanGetTrackingObjectGraph()
        {
            A a = TrackableObjectFactory.CreateFrom
                  (
                new A
            {
                Text = "hey",
                B    = new B
                {
                    Text = "hurray",
                    C    = new C
                    {
                        Text    = "uhm",
                        ListOfD = new List <D> {
                            new D {
                                Text = "ohm"
                            }
                        }
                    }
                }
            }
                  );

            IObjectChangeTracker changeTracker = a.GetChangeTracker();

            var C_ListOfDGraph = changeTracker.GetTrackingGraphFromProperty(typeof(C).GetTypeInfo().GetProperty("ListOfD"));

            Assert.AreEqual(typeof(C).GetProperty("ListOfD"), C_ListOfDGraph.AggregateHierarchy[2].Property.GetBaseProperty());
            Assert.AreEqual(typeof(B).GetProperty("C"), C_ListOfDGraph.AggregateHierarchy[1].Property.GetBaseProperty());
            Assert.AreEqual(typeof(A).GetProperty("B"), C_ListOfDGraph.AggregateHierarchy[0].Property.GetBaseProperty());
            Assert.AreEqual(a, C_ListOfDGraph.Parent);

            changeTracker.Changed += (s, e) =>
            {
                DeclaredObjectPropertyChangeEventArgs declaredArgs = e as DeclaredObjectPropertyChangeEventArgs;

                IObjectGraphTrackingInfo graphInfo = declaredArgs.GraphTrackingInfo;

                Assert.AreEqual(typeof(B).GetProperty("Text"), graphInfo.AggregateHierarchy[1].Property.GetBaseProperty());
                Assert.AreEqual(typeof(A).GetProperty("B"), graphInfo.AggregateHierarchy[0].Property.GetBaseProperty());
                Assert.AreEqual(a, graphInfo.Parent);
            };

            a.B.Text = "hello world";
        }
        public void CanAcceptObjectGraphChanges()
        {
            const string initialValue = "hello world";
            const string changedValue = "hello world 2";

            A a = TrackableObjectFactory.CreateFrom
                  (
                new A
            {
                Text = initialValue,
                B    = new B
                {
                    Text = initialValue,
                    C    = new C
                    {
                        Text    = initialValue,
                        ListOfD = new List <D> {
                            new D {
                                Text = "initialValue"
                            }
                        }
                    }
                }
            }
                  );

            a.Text     = changedValue;
            a.B.Text   = changedValue;
            a.B.C.Text = changedValue;
            a.B.C.ListOfD.Add(new D {
                Text = changedValue
            });

            IObjectChangeTracker changeTracker = a.GetChangeTracker();

            a.AcceptChanges();

            Assert.AreEqual(changedValue, a.Text);
            Assert.AreEqual(changedValue, a.B.Text);
            Assert.AreEqual(changedValue, a.B.C.Text);
            Assert.AreEqual(2, a.B.C.ListOfD.Count);
        }
Esempio n. 9
0
        public void CanConfigureClassWithReadOnlyProperties()
        {
            IObjectChangeTrackingConfiguration config = ObjectChangeTracking.CreateConfiguration();

            config.TrackTypesFromAssembly(typeof(ConfigurationTest).GetTypeInfo().Assembly, searchSettings: new TypeSearchSettings
            {
                Mode   = TypeSearchMode.AttributeConfigurationOnly,
                Filter = t => t == typeof(ClassWithReadOnlyProperties)
            });

            ITrackableObjectFactory factory = config.CreateTrackableObjectFactory();

            ClassWithReadOnlyProperties instance = factory.CreateFrom(new ClassWithReadOnlyProperties());

            instance.Text = "hey";

            IObjectChangeTracker tracker = instance.GetChangeTracker();

            Assert.AreEqual(1, tracker.ChangedProperties.Count);
            Assert.AreEqual(1, ((ObjectChangeTracker)tracker).PropertyTrackings.Count);
        }
Esempio n. 10
0
        public void CanConfigureNonTrackablePropertiesFromBaseClasses()
        {
            IObjectChangeTrackingConfiguration config = ObjectChangeTracking.CreateConfiguration();

            config.TrackTypesFromAssembly(typeof(ConfigurationTest).GetTypeInfo().Assembly, searchSettings: new TypeSearchSettings
            {
                Mode      = TypeSearchMode.AttributeConfigurationOnly,
                Recursive = true,
                Filter    = t =>
                {
                    return(t.DeclaringType == typeof(ConfigurationTest));
                }
            });

            ITrackableObjectFactory trackableObjectFactory      = config.CreateTrackableObjectFactory();
            DerivedClassOfBaseClassWithNonTrackableProperty obj = trackableObjectFactory.CreateOf <DerivedClassOfBaseClassWithNonTrackableProperty>();

            IObjectChangeTracker changeTracker = obj.GetChangeTracker();

            Assert.AreEqual(1, changeTracker.Count());
            Assert.IsTrue(changeTracker.First().PropertyName == "Text2");
        }
Esempio n. 11
0
        public void CanTrackDynamicObjectPropertyChanges()
        {
            dynamic dynamicObject = TrackableObjectFactory.CreateFrom(new TestDynamicObject());

            dynamicObject.Text  = "hello world 1";
            dynamicObject.Text  = "hello world 2";
            dynamicObject.Text2 = "hello world 3";
            ((TestDynamicObject)dynamicObject).DeclaredText = "hello world 4";
            ((TestDynamicObject)dynamicObject).DeclaredText = "hello world 5";

            IObjectChangeTracker          tracker  = ((object)dynamicObject).GetChangeTracker();
            IObjectPropertyChangeTracking tracking = tracker.GetDynamicTrackingByProperty("Text");

            Assert.AreEqual(2, tracker.ChangedProperties.Count);
            Assert.AreEqual("Text", tracking.PropertyName);
            Assert.AreEqual("hello world 1", tracking.OldValue);
            Assert.AreEqual("hello world 2", tracking.CurrentValue);
            Assert.AreEqual("hello world 1", ((object)dynamicObject).OldPropertyValue("Text"));
            Assert.AreEqual(null, ((TestDynamicObject)dynamicObject).OldPropertyValue(o => o.DeclaredText));
            Assert.AreEqual("hello world 2", ((object)dynamicObject).CurrentPropertyValue("Text"));
            Assert.AreEqual("hello world 5", ((TestDynamicObject)dynamicObject).CurrentPropertyValue(o => o.DeclaredText));
            Assert.IsTrue(((object)dynamicObject).PropertyHasChanged("Text"));
            Assert.IsFalse(((object)dynamicObject).PropertyHasChanged("Text2"));
        }