diff --git a/src/ObservableCollections.R3/ObservableCollectionR3Extensions.cs b/src/ObservableCollections.R3/ObservableCollectionR3Extensions.cs index 16d681b..2b4c0d3 100644 --- a/src/ObservableCollections.R3/ObservableCollectionR3Extensions.cs +++ b/src/ObservableCollections.R3/ObservableCollectionR3Extensions.cs @@ -438,10 +438,10 @@ protected override void Handler(in NotifyCollectionChangedEventArgs eventArgs case NotifyCollectionChangedAction.Add: case NotifyCollectionChangedAction.Remove: case NotifyCollectionChangedAction.Reset when countPrev != collection.Count: + countPrev = collection.Count; observer.OnNext(collection.Count); break; } - countPrev = collection.Count; } } } diff --git a/tests/ObservableCollections.R3.Tests/ObservableCollectionExtensionsTest.cs b/tests/ObservableCollections.R3.Tests/ObservableCollectionExtensionsTest.cs index 85f9355..ff26392 100644 --- a/tests/ObservableCollections.R3.Tests/ObservableCollectionExtensionsTest.cs +++ b/tests/ObservableCollections.R3.Tests/ObservableCollectionExtensionsTest.cs @@ -161,7 +161,7 @@ public void ObserveReplace() collection[1] = 444; events.Count.Should().Be(1); } - + [Fact] public void ObserveDictionaryReplace() { @@ -247,6 +247,27 @@ public void ObserveCountChanged() events.Count.Should().Be(3); } + [Fact] + public void ObserveCountChanged_WithSideEffect() + { + var events = new List(); + var collection = new ObservableList([]); + + using var _ = collection.ObserveCountChanged().Subscribe(count => + { + events.Add(count); + // Side effect - when count is 1, clear the list + if(count == 1) collection.Clear(); + }); + + events.Should().BeEmpty(); + + collection.Add(12); + + collection.Count.Should().Be(0); + events.Should().BeEquivalentTo([1, 0]); + } + [Fact] public void ObserveCountChanged_NotifyCurrent() { @@ -257,4 +278,4 @@ public void ObserveCountChanged_NotifyCurrent() .Subscribe(count => events.Add(count)); events[0].Should().Be(3); } -} \ No newline at end of file +}