public void ObservableWhere_AddRemoveTest()
        {
            var source = new ObservableCollection<int>(Enumerable.Range(0, 10));
            var target = source.ObservableWhere(s => (s & 1) != 0);

            NotifyCollectionChangedEventArgs lastEventArgs = null;

            NotifyCollectionChangedEventHandler callback = (_, e) => lastEventArgs = e;

            target.CollectionChanged += callback;

            source.Remove(2);
            Assert.IsTrue(target.SequenceEqual(new[] { 1, 3, 5, 7, 9 }));
            Assert.IsNull(lastEventArgs);

            source.Remove(3);
            Assert.IsTrue(target.SequenceEqual(new[] { 1, 5, 7, 9 }));
            Assert.AreEqual(NotifyCollectionChangedAction.Remove, lastEventArgs.Action);
            Assert.AreEqual(3, lastEventArgs.OldItems[0]);
            lastEventArgs = null;

            source.Remove(4);
            Assert.IsTrue(target.SequenceEqual(new[] { 1, 5, 7, 9 }));
            Assert.IsNull(lastEventArgs);

            source.Remove(5);
            Assert.IsTrue(target.SequenceEqual(new[] { 1, 7, 9 }));
            Assert.AreEqual(NotifyCollectionChangedAction.Remove, lastEventArgs.Action);
            Assert.AreEqual(5, lastEventArgs.OldItems[0]);
            lastEventArgs = null;

            source.Add(4);
            Assert.IsTrue(target.SequenceEqual(new[] { 1, 7, 9 }));
            Assert.IsNull(lastEventArgs);

            source.Add(5);
            Assert.IsTrue(target.SequenceEqual(new[] { 1, 7, 9, 5 }));
            Assert.AreEqual(NotifyCollectionChangedAction.Add, lastEventArgs.Action);
            Assert.AreEqual(5, lastEventArgs.NewItems[0]);
            lastEventArgs = null;

            source.Insert(2, 5);
            Assert.IsTrue(target.SequenceEqual(new[] { 1, 7, 9, 5, 5 }));
            Assert.AreEqual(NotifyCollectionChangedAction.Add, lastEventArgs.Action);
            Assert.AreEqual(5, lastEventArgs.NewItems[0]);
        }