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 WithIllegal() { var expected = // "Track.Changes(x, y) failed for item: ObservableCollection<ComplexType>[0].Illegal.\r\n" + "Track.Changes(x, y) failed.\r\n" + "The type IllegalType does not notify changes.\r\n" + "The property WithIllegal.Illegal of type IllegalType is not supported.\r\n" + "Solve the problem by any of:\r\n" + "* Implement INotifyPropertyChanged for IllegalType or use a type that does.\r\n" + "* Make IllegalType immutable or use an immutable type.\r\n" + " - For immutable types the following must hold:\r\n" + " - Must be a sealed class or a struct.\r\n" + " - All fields and properties must be readonly.\r\n" + " - All field and property types must be immutable.\r\n" + " - All indexers must be readonly.\r\n" + " - Event fields are ignored.\r\n" + "* Use PropertiesSettings and specify how change tracking is performed:\r\n" + " - ReferenceHandling.Structural means that a the entire graph is tracked.\r\n" + " - ReferenceHandling.References means that only the root level changes are tracked.\r\n" + " - Exclude a combination of the following:\r\n" + " - The property WithIllegal.Illegal.\r\n" + " - The type IllegalType.\r\n"; var item = new WithIllegal(); var settings = PropertiesSettings.GetOrCreate(); var exception = Assert.Throws <NotSupportedException>(() => Track.Changes(item, settings)); Assert.AreEqual(expected, exception.Message); exception = Assert.Throws <NotSupportedException>(() => Track.Changes(item)); Assert.AreEqual(expected, exception.Message); }
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); } }