public void IgnoresPropertyLambda()
            {
                var source   = new WithIllegal();
                var settings = new PropertiesSettingsBuilder().IgnoreProperty <WithIllegal>(x => x.Illegal)
                               .CreateSettings(ReferenceHandling.Structural);
                var propertyChanges = new List <string>();
                var changes         = new List <EventArgs>();

                using (var tracker = Track.Changes(source, settings))
                {
                    tracker.PropertyChanged += (_, e) => propertyChanges.Add(e.PropertyName);
                    tracker.Changed         += (_, e) => changes.Add(e);
                    Assert.AreEqual(0, tracker.Changes);
                    CollectionAssert.IsEmpty(propertyChanges);
                    CollectionAssert.IsEmpty(changes);

                    source.Value++;
                    Assert.AreEqual(1, tracker.Changes);
                    CollectionAssert.AreEqual(new[] { "Changes" }, propertyChanges);
                    var expected = new[] { RootChangeEventArgs.Create(ChangeTrackerNode.GetOrCreate(source, tracker.Settings, isRoot: false).Value, new PropertyChangeEventArgs(source, source.GetProperty(nameof(source.Value)))) };
                    CollectionAssert.AreEqual(expected, changes, EventArgsComparer.Default);

                    source.Illegal = new IllegalType();
                    Assert.AreEqual(1, tracker.Changes);
                    CollectionAssert.AreEqual(new[] { "Changes" }, propertyChanges);
                    CollectionAssert.AreEqual(expected, changes, EventArgsComparer.Default);
                }
            }
            public void IgnoresPropertyLambda()
            {
                var source = new WithIllegal();
                var settings = new PropertiesSettingsBuilder().IgnoreProperty<WithIllegal>(x => x.Illegal)
                                                              .CreateSettings(ReferenceHandling.Structural);
                var propertyChanges = new List<string>();
                var changes = new List<EventArgs>();
                using (var tracker = Track.Changes(source, settings))
                {
                    tracker.PropertyChanged += (_, e) => propertyChanges.Add(e.PropertyName);
                    tracker.Changed += (_, e) => changes.Add(e);
                    Assert.AreEqual(0, tracker.Changes);
                    CollectionAssert.IsEmpty(propertyChanges);
                    CollectionAssert.IsEmpty(changes);

                    source.Value++;
                    Assert.AreEqual(1, tracker.Changes);
                    CollectionAssert.AreEqual(new[] { "Changes" }, propertyChanges);
                    var expected = new[] { RootChangeEventArgs.Create(ChangeTrackerNode.GetOrCreate(source, tracker.Settings, false).Value, new PropertyChangeEventArgs(source, source.GetProperty(nameof(source.Value)))) };
                    CollectionAssert.AreEqual(expected, changes, EventArgsComparer.Default);

                    source.Illegal = new IllegalType();
                    Assert.AreEqual(1, tracker.Changes);
                    CollectionAssert.AreEqual(new[] { "Changes" }, propertyChanges);
                    CollectionAssert.AreEqual(expected, changes, EventArgsComparer.Default);
                }
            }
 public void AddPropertyThrowsOnNested()
 {
     var builder = new PropertiesSettingsBuilder();
     var exception = Assert.Throws<ArgumentException>(() => builder.IgnoreProperty<ComplexType>(x => x.Name.Length));
     var expected = "property must be a property expression like foo => foo.Bar\r\n" +
                    "Nested properties are not allowed";
     Assert.AreEqual(expected, exception.Message);
 }
        public void AddPropertyThrowsOnNested()
        {
            var builder   = new PropertiesSettingsBuilder();
            var exception = Assert.Throws <ArgumentException>(() => builder.IgnoreProperty <ComplexType>(x => x.Name.Length));
            var expected  = "property must be a property expression like foo => foo.Bar\r\n" +
                            "Nested properties are not allowed";

            Assert.AreEqual(expected, exception.Message);
        }
        public void AddImmutableType()
        {
            var settings = new PropertiesSettingsBuilder().AddImmutableType<ComplexType>()
                                                          .CreateSettings();
            Assert.AreEqual(true, settings.IsImmutable(typeof(ComplexType)));

            settings = new PropertiesSettingsBuilder().AddImmutableType(typeof(ComplexType))
                                                      .CreateSettings();
            Assert.AreEqual(true, settings.IsImmutable(typeof(ComplexType)));
        }
        public void AddImmutableType()
        {
            var settings = new PropertiesSettingsBuilder().AddImmutableType <ComplexType>()
                           .CreateSettings();

            Assert.AreEqual(true, settings.IsImmutable(typeof(ComplexType)));

            settings = new PropertiesSettingsBuilder().AddImmutableType(typeof(ComplexType))
                       .CreateSettings();
            Assert.AreEqual(true, settings.IsImmutable(typeof(ComplexType)));
        }