public void ManyOnNextsOneReset() { var source = new ObservableCollection <int> { 1, 2, 3 }; var scheduler = new TestScheduler(); using (var trigger = new Subject <object>()) { using (var view = new FilteredView <int>(source, x => true, TimeSpan.FromMilliseconds(10), scheduler, leaveOpen: true, triggers: trigger)) { using (var actual = view.SubscribeAll()) { source.Clear(); for (var i = 0; i < 10; i++) { trigger.OnNext(null); } CollectionAssert.IsEmpty(actual); CollectionAssert.AreEqual(new[] { 1, 2, 3 }, view); scheduler.Start(); var expected = new EventArgs[] { CachedEventArgs.CountPropertyChanged, CachedEventArgs.IndexerPropertyChanged, CachedEventArgs.NotifyCollectionReset }; CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default); CollectionAssert.IsEmpty(view); } } } }
public void AddTriggerThenManyOnNextOneAdd() { var source = new ObservableCollection <int> { 1, 2, 3 }; var scheduler = new TestScheduler(); using var trigger = new Subject <object?>(); using var view = new FilteredView <int>(source, x => true, TimeSpan.FromMilliseconds(10), scheduler, leaveOpen: true, triggers: trigger); using var actual = view.SubscribeAll(); source.Add(4); for (var i = 0; i < 10; i++) { trigger.OnNext(null); } CollectionAssert.IsEmpty(actual); CollectionAssert.AreEqual(new[] { 1, 2, 3 }, view); scheduler.Start(); var expected = new EventArgs[] { CachedEventArgs.CountPropertyChanged, CachedEventArgs.IndexerPropertyChanged, Diff.CreateAddEventArgs(4, 3), }; CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default); CollectionAssert.AreEqual(new[] { 1, 2, 3, 4 }, view); }
public void Repro1() { var source = new ObservableCollection <int> { 1, 2, 3 }; var scheduler = new TestScheduler(); var max = 5; using (var trigger = new Subject <object>()) { // ReSharper disable once AccessToModifiedClosure using (var view = new FilteredView <int>(source, x => x < max, TimeSpan.FromMilliseconds(10), scheduler, leaveOpen: true, triggers: trigger)) { using (var actual = view.SubscribeAll()) { CollectionAssert.AreEqual(new[] { 1, 2, 3 }, view); CollectionAssert.IsEmpty(actual); max = 2; trigger.OnNext(null); scheduler.Start(); var expected = new List <EventArgs> { CachedEventArgs.CountPropertyChanged, CachedEventArgs.IndexerPropertyChanged, CachedEventArgs.NotifyCollectionReset, }; CollectionAssert.AreEqual(new[] { 1 }, view); CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default); for (var i = 0; i < 10; i++) { source.Add(i); } scheduler.Start(); CollectionAssert.AreEqual(new[] { 1, 0, 1 }, view); expected.AddRange(new EventArgs[] { CachedEventArgs.CountPropertyChanged, CachedEventArgs.IndexerPropertyChanged, CachedEventArgs.NotifyCollectionReset, }); CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default); source.Clear(); scheduler.Start(); CollectionAssert.IsEmpty(view); expected.AddRange(new EventArgs[] { CachedEventArgs.CountPropertyChanged, CachedEventArgs.IndexerPropertyChanged, CachedEventArgs.NotifyCollectionReset, }); CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default); } } } }
public void Clear() { var source = new ObservableCollection <int> { 1, 2, 3 }; using var expected = source.SubscribeAll(); var scheduler = new TestScheduler(); using var view = new FilteredView <int>(source, x => true, TimeSpan.FromMilliseconds(10), scheduler, leaveOpen: true); using var actual = view.SubscribeAll(); source.Clear(); CollectionAssert.IsEmpty(actual); scheduler.Start(); CollectionAssert.AreEqual(source, view); CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default); }
public void UpdatesAndNotifiesOnCollectionChanged() { var ints = new ObservableCollection <int> { 1, 2, 3 }; using (var expected = ints.SubscribeAll()) { var scheduler = new TestScheduler(); using (var view = new FilteredView <int>(ints, x => true, TimeSpan.FromMilliseconds(10), scheduler, leaveOpen: true)) { using (var actual = view.SubscribeAll()) { ints.Add(4); CollectionAssert.IsEmpty(actual); scheduler.Start(); CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default); } } } }
public void Repro3() { var source = new ObservableCollection <int> { 1, 2, 3 }; var scheduler = new TestScheduler(); var max = 5; using var trigger = new Subject <object?>(); //// ReSharper disable once AccessToModifiedClosure using var view = new FilteredView <int>(source, x => x < max, TimeSpan.Zero, scheduler, leaveOpen: true, triggers: trigger); using var actual = view.SubscribeAll(); CollectionAssert.AreEqual(new[] { 1, 2, 3 }, view); CollectionAssert.IsEmpty(actual); max = 2; trigger.OnNext(null); scheduler.Start(); var expected = new List <EventArgs> { CachedEventArgs.CountPropertyChanged, CachedEventArgs.IndexerPropertyChanged, CachedEventArgs.NotifyCollectionReset, }; CollectionAssert.AreEqual(new[] { 1 }, view); CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default); source.Clear(); view.Refresh(); scheduler.Start(); CollectionAssert.IsEmpty(view); expected.AddRange(new EventArgs[] { CachedEventArgs.CountPropertyChanged, CachedEventArgs.IndexerPropertyChanged, Diff.CreateRemoveEventArgs(1, 0), }); CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default); }
public void Move() { var source = new ObservableCollection <int> { 1, 2, 3 }; var scheduler = new TestScheduler(); using var view = new FilteredView <int>(source, x => true, TimeSpan.FromMilliseconds(10), scheduler, leaveOpen: true); using var actual = view.SubscribeAll(); source.Move(0, 2); CollectionAssert.IsEmpty(actual); scheduler.Start(); CollectionAssert.AreEqual(source, view); var expected = new List <EventArgs> { CachedEventArgs.CountPropertyChanged, CachedEventArgs.IndexerPropertyChanged, CachedEventArgs.NotifyCollectionReset, }; CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default); }