public async Task Add_to_projected_list()
        {
            var list = new ListReactiveCollectionSource<int>();

            var projectedList = list.ReactiveCollection
                .Select(x => x.ToString(CultureInfo.InvariantCulture));

            var notificationsTask = projectedList.Changes
                .Take(4)
                .ToArray()
                .ToTask();

            list.Add(1);
            list.Add(2);
            list.Add(3);

            var notifications = await notificationsTask;

            notifications[0].Index.Should().NotHaveValue();
            notifications[1].Index.Should().Be(0);
            notifications[2].Index.Should().Be(1);
            notifications[3].Index.Should().Be(2);
            notifications[0].Action.Should().Be(NotifyCollectionChangedAction.Reset);
            notifications[1].Action.Should().Be(NotifyCollectionChangedAction.Add);
            notifications[2].Action.Should().Be(NotifyCollectionChangedAction.Add);
            notifications[3].Action.Should().Be(NotifyCollectionChangedAction.Add);
            notifications[0].NewItems.Should().BeEmpty();
            notifications[1].NewItems.Should().Equal("1");
            notifications[2].NewItems.Should().Equal("2");
            notifications[3].NewItems.Should().Equal("3");
        }
예제 #2
0
        public void Contains()
        {
            var list = new ListReactiveCollectionSource <int>
            {
                1
            };

            list.Contains(1).Should().BeTrue();
            list.Contains(2).Should().BeFalse();
        }
        public async Task First_notification_is_reset()
        {
            var list = new ListReactiveCollectionSource<int>();

            var notification = await list.ReactiveCollection.Changes.FirstAsync().ToTask();

            notification.Action.Should().Be(NotifyCollectionChangedAction.Reset);
            notification.OldItems.Should().BeEmpty();
            notification.NewItems.Should().BeEmpty();
            notification.Current.Should().BeEmpty();
        }
        public async Task Contains()
        {
            var list = new ListReactiveCollectionSource <int>
            {
                1
            };

            await Verify((
                             list.Contains(1),
                             list.Contains(2)));
        }
예제 #5
0
        public async Task First_notification_is_reset()
        {
            var list = new ListReactiveCollectionSource <int>();

            var notification = await list.ReactiveCollection.Changes.FirstAsync().ToTask();

            notification.Action.Should().Be(NotifyCollectionChangedAction.Reset);
            notification.OldItems.Should().BeEmpty();
            notification.NewItems.Should().BeEmpty();
            notification.Current.Should().BeEmpty();
        }
예제 #6
0
        public void IndexOf()
        {
            var list = new ListReactiveCollectionSource <int>
            {
                1, 2, 3
            };

            list.IndexOf(3).Should().Be(2);
            list.IndexOf(2).Should().Be(1);
            list.IndexOf(1).Should().Be(0);
        }
        public async Task IndexOf()
        {
            var list = new ListReactiveCollectionSource <int>
            {
                1, 2, 3
            };

            await Verify((
                             list.IndexOf(3),
                             list.IndexOf(2),
                             list.IndexOf(1)));
        }
        public async Task Add()
        {
            var list = new ListReactiveCollectionSource <int>();

            var notificationTask = list.ReactiveCollection.Changes
                                   .Skip(1)
                                   .FirstAsync()
                                   .ToTask();

            list.Add(1);

            await Verify(notificationTask);
        }
        public async Task RemoveAll()
        {
            var list = new ListReactiveCollectionSource <int>();

            var notificationTask = list.ReactiveCollection.Changes
                                   .Skip(2)
                                   .FirstAsync()
                                   .ToTask();

            list.AddRange(new[] { 1, 2, 3 });
            list.RemoveAll(x => x % 2 == 0);

            await Verify(notificationTask);
        }
        public async Task SetItem()
        {
            var list = new ListReactiveCollectionSource <int>();

            var notificationTask = list.ReactiveCollection.Changes
                                   .Skip(2)
                                   .FirstAsync()
                                   .ToTask();

            list.AddRange(new[] { 1, 2, 3, 4, 5 });
            list.SetItem(2, 6);

            await Verify(notificationTask);
        }
        public async Task Sort_with_comparison()
        {
            var list = new ListReactiveCollectionSource <int>();

            var notificationTask = list.ReactiveCollection.Changes
                                   .Skip(2)
                                   .FirstAsync()
                                   .ToTask();

            list.AddRange(new[] { 2, 1, 3, 5, 0 });
            list.Sort((x, y) => y.CompareTo(x));

            await Verify(notificationTask);
        }
        public async Task CopyTo()
        {
            var list = new ListReactiveCollectionSource <int>();

            var range = new[] { 1, 2, 3 };

            list.AddRange(range);

            var target = new int[5];

            list.CopyTo(target, 2);

            await Verify(target);
        }
예제 #13
0
        public void CopyTo()
        {
            var list = new ListReactiveCollectionSource <int>();

            var range = new[] { 1, 2, 3 };

            list.AddRange(range);

            var target = new int[5];

            list.CopyTo(target, 2);

            target.Should().Equal(0, 0, 1, 2, 3);
        }
        public async Task InsertRange()
        {
            var list = new ListReactiveCollectionSource <int>();

            var notificationTask = list.ReactiveCollection.Changes
                                   .Skip(2)
                                   .FirstAsync()
                                   .ToTask();

            list.Add(1);

            var range = new[] { 1, 2, 3 };

            list.InsertRange(1, range);

            await Verify(notificationTask);
        }
예제 #15
0
        public async Task RemoveAll()
        {
            var list = new ListReactiveCollectionSource <int>();

            var notificationTask = list.ReactiveCollection.Changes
                                   .Skip(2)
                                   .FirstAsync()
                                   .ToTask();

            list.AddRange(new[] { 1, 2, 3 });
            list.RemoveAll(x => x % 2 == 0);

            var notification = await notificationTask;

            notification.Action.Should().Be(NotifyCollectionChangedAction.Reset);
            notification.Current.Should().Equal(1, 3);
        }
예제 #16
0
        public async Task Sort_with_comparison()
        {
            var list = new ListReactiveCollectionSource <int>();

            var notificationTask = list.ReactiveCollection.Changes
                                   .Skip(2)
                                   .FirstAsync()
                                   .ToTask();

            list.AddRange(new[] { 2, 1, 3, 5, 0 });
            list.Sort((x, y) => y.CompareTo(x));

            var notification = await notificationTask;

            notification.Action.Should().Be(NotifyCollectionChangedAction.Reset);
            notification.Current.Should().Equal(5, 3, 2, 1, 0);
        }
예제 #17
0
        public async Task Sort()
        {
            var list = new ListReactiveCollectionSource <int>();

            var notificationTask = list.ReactiveCollection.Changes
                                   .Skip(2)
                                   .FirstAsync()
                                   .ToTask();

            list.AddRange(new[] { 2, 1, 3, 5, 0 });
            list.Sort();

            var notification = await notificationTask;

            notification.Action.Should().Be(NotifyCollectionChangedAction.Reset);
            notification.Current.Should().Equal(0, 1, 2, 3, 5);
        }
        public async Task Add()
        {
            var list = new ListReactiveCollectionSource<int>();

            var notificationTask = list.ReactiveCollection.Changes
                .Skip(1)
                .FirstAsync()
                .ToTask();

            list.Add(1);

            var notification = await notificationTask;

            notification.Index.Should().Be(0);
            notification.Action.Should().Be(NotifyCollectionChangedAction.Add);
            notification.NewItems.Should().Equal(1);
            notification.OldItems.Should().BeEmpty();
            notification.Current.Should().Equal(1);
        }
예제 #19
0
        public async Task Add()
        {
            var list = new ListReactiveCollectionSource <int>();

            var notificationTask = list.ReactiveCollection.Changes
                                   .Skip(1)
                                   .FirstAsync()
                                   .ToTask();

            list.Add(1);

            var notification = await notificationTask;

            notification.Index.Should().Be(0);
            notification.Action.Should().Be(NotifyCollectionChangedAction.Add);
            notification.NewItems.Should().Equal(1);
            notification.OldItems.Should().BeEmpty();
            notification.Current.Should().Equal(1);
        }
예제 #20
0
        public async Task Replace()
        {
            var list = new ListReactiveCollectionSource <int>();

            var notificationTask = list.ReactiveCollection.Changes
                                   .Skip(2)
                                   .FirstAsync()
                                   .ToTask();

            list.AddRange(new[] { 1, 2, 3, 4, 1 });
            list.Replace(1, 5);

            var notification = await notificationTask;

            notification.Action.Should().Be(NotifyCollectionChangedAction.Replace);
            notification.OldItems.Should().Equal(1);
            notification.NewItems.Should().Equal(5);
            notification.Current.Should().Equal(5, 2, 3, 4, 1);
        }
예제 #21
0
        public async Task RemoveRange2()
        {
            var list = new ListReactiveCollectionSource <int>();

            var notificationTask = list.ReactiveCollection.Changes
                                   .Skip(2)
                                   .FirstAsync()
                                   .ToTask();

            list.AddRange(new[] { 1, 2, 3, 4 });
            list.RemoveRange(2, 2);

            var notification = await notificationTask;

            notification.Action.Should().Be(NotifyCollectionChangedAction.Remove);
            notification.OldItems.Should().ContainInOrder(3, 4);
            notification.NewItems.Should().BeEmpty();
            notification.Current.Should().Equal(1, 2);
        }
예제 #22
0
        public void GetEnumerator()
        {
            var list = new ListReactiveCollectionSource <int>
            {
                1,
                2,
                3
            };

            using (var enumerator = list.GetEnumerator())
            {
                enumerator.MoveNext().Should().BeTrue();
                enumerator.Current.Should().Be(1);

                enumerator.MoveNext().Should().BeTrue();
                enumerator.Current.Should().Be(2);

                enumerator.MoveNext().Should().BeTrue();
                enumerator.Current.Should().Be(3);

                enumerator.MoveNext().Should().BeFalse();
            }
        }
        public async Task Select_after_Where_behaves_correctly()
        {
            var list = new ListReactiveCollectionSource<int>();

            var changesTask = list.ReactiveCollection
                .Where(x => x % 2 == 0)
                .Select(x => x.ToString(CultureInfo.InvariantCulture))
                .Changes
                .Take(6)
                .ToArray()
                .ToTask();

            list.Add(1);
            list.Add(2);
            list.Remove(2);
            list.Remove(1);
            list.Add(4);
            list.Insert(0, 2);
            list[0] = 3;

            var changes = await changesTask;

            changes[0].Action.Should().Be(NotifyCollectionChangedAction.Reset);
            changes[1].Action.Should().Be(NotifyCollectionChangedAction.Add);
            changes[1].Current.Should().Equal("2");
            changes[2].Action.Should().Be(NotifyCollectionChangedAction.Remove);
            changes[3].Action.Should().Be(NotifyCollectionChangedAction.Add);
            changes[3].Current.Should().Equal("4");
            changes[4].Action.Should().Be(NotifyCollectionChangedAction.Add);
            changes[4].Current.Should().Equal("4", "2");
            changes[4].Index.Should().Be(1);
            changes[5].Action.Should().Be(NotifyCollectionChangedAction.Remove);
            changes[5].Index.Should().Be(1);
            changes[5].Index.Should().Be(1);
            changes[5].Current.Should().Equal("4");
        }
        public async Task Sort()
        {
            var list = new ListReactiveCollectionSource<int>();

            var notificationTask = list.ReactiveCollection.Changes
                .Skip(2)
                .FirstAsync()
                .ToTask();

            list.AddRange(new[] { 2, 1, 3, 5, 0 });
            list.Sort();

            var notification = await notificationTask;

            notification.Action.Should().Be(NotifyCollectionChangedAction.Reset);
            notification.Current.Should().Equal(0, 1, 2, 3, 5);
        }
        public void List_ToObservableCollection_Remove_multiple()
        {
            var list = new ListReactiveCollectionSource<int>();
            var observableCollection = list.ReactiveCollection.ToObservableCollection();

            using (Observable
                .FromEventPattern<NotifyCollectionChangedEventHandler, NotifyCollectionChangedEventArgs>(eh => ((INotifyCollectionChanged)observableCollection).CollectionChanged += eh, eh => ((INotifyCollectionChanged)observableCollection).CollectionChanged -= eh)
                .Subscribe())
            {
                list.AddRange(new[] { 1, 2, 3, 4, 5, 6, 7 });
                list.RemoveRange(2, 3);

                ((ICollection)observableCollection).Should().Equal(new[] { 1, 2, 6, 7 });
            }
        }
        public async Task SortedSet_ToObservableCollection_Clear()
        {
            var list = new ListReactiveCollectionSource<int>();
            var observableCollection = (INotifyCollectionChanged)list.ReactiveCollection.ToObservableCollection();

            var eventTask = Observable
                .FromEventPattern<NotifyCollectionChangedEventHandler, NotifyCollectionChangedEventArgs>(eh => observableCollection.CollectionChanged += eh, eh => observableCollection.CollectionChanged -= eh)
                .Skip(1)
                .Select(x => x.EventArgs)
                .FirstAsync()
                .ToTask();

            list.AddRange(new[] { 1, 2, 3, 4, 5 });
            list.RemoveAll(x => x > 2);

            var ev = await eventTask;

            ev.Action.Should().Be(NotifyCollectionChangedAction.Reset);
            ((ICollection)observableCollection).Should().Equal(new[] { 1, 2 });
        }
        public async Task RemoveRange2()
        {
            var list = new ListReactiveCollectionSource<int>();

            var notificationTask = list.ReactiveCollection.Changes
                .Skip(2)
                .FirstAsync()
                .ToTask();

            list.AddRange(new[] { 1, 2, 3, 4 });
            list.RemoveRange(2, 2);

            var notification = await notificationTask;

            notification.Action.Should().Be(NotifyCollectionChangedAction.Remove);
            notification.OldItems.Should().ContainInOrder(3, 4);
            notification.NewItems.Should().BeEmpty();
            notification.Current.Should().Equal(1, 2);
        }
        public void Where_after_Where_squashes_both_operators()
        {
            var list = new ListReactiveCollectionSource<int>();

            var projectedList = list.ReactiveCollection
                .Where(x => x % 2 == 0)
                .Where(x => x % 3 == 0);

            var transformed = projectedList as ListTransformationReactiveCollection<int, int>;

            transformed.Should().NotBeNull();
            transformed.Source.Should().BeSameAs(list.ReactiveCollection);
            transformed.Selector.Should().BeNull();
            transformed.Filter.Should().NotBeNull();
            transformed.Filter(2).Should().BeFalse();
            transformed.Filter(3).Should().BeFalse();
            transformed.Filter(4).Should().BeFalse();
            transformed.Filter(6).Should().BeTrue();
        }
        public async Task Add_to_filtered_list()
        {
            var list = new ListReactiveCollectionSource<int>();

            var projectedList = list
                .ReactiveCollection
                .Where(x => x % 2 == 0);

            var notificationTask = projectedList.Changes
                .Skip(1)
                .FirstAsync()
                .ToTask();

            list.Add(1);
            list.Add(3);           
            list.Add(2);

            var notification = await notificationTask;

            notification.Index.Should().Be(0);
            notification.Action.Should().Be(NotifyCollectionChangedAction.Add);
            notification.NewItems.Should().Equal(2);
        }
        public async Task Replace_in_projected_list()
        {
            var list = new ListReactiveCollectionSource<int>();

            var projectedList = list.ReactiveCollection
                .Select(x => x.ToString(CultureInfo.InvariantCulture));

            var notificationTask = projectedList.Changes
                .Skip(2)
                .FirstAsync()
                .ToTask();

            list.AddRange(new[] { 1, 2, 3 });
            list.Replace(2, 4);

            var notification = await notificationTask;

            notification.Index.Should().Be(1);
            notification.Action.Should().Be(NotifyCollectionChangedAction.Replace);
            notification.OldItems.Should().Equal("2");
            notification.NewItems.Should().Equal("4");
            notification.Current.Should().Equal("1", "4", "3");
        }
        public async Task RemoveAll()
        {
            var list = new ListReactiveCollectionSource<int>();

            var notificationTask = list.ReactiveCollection.Changes
                .Skip(2)
                .FirstAsync()
                .ToTask();

            list.AddRange(new[] { 1, 2, 3 });
            list.RemoveAll(x => x % 2 == 0);

            var notification = await notificationTask;

            notification.Action.Should().Be(NotifyCollectionChangedAction.Reset);
            notification.Current.Should().Equal(1, 3);
        }
        public void SortSet_after_Where_squashes_both_operators()
        {
            var list = new ListReactiveCollectionSource<int>();

            var projectedList = list.ReactiveCollection
                .Where(x => x % 2 == 0)
                .SortSet();

            var transformed = projectedList as SortedSetTransformationReactiveCollection<int, int>;

            transformed.Should().NotBeNull();
            transformed.Source.Should().BeSameAs(list.ReactiveCollection);
            transformed.Selector.Should().BeNull();
            transformed.Filter.Should().NotBeNull();
        }
        public async Task Where_after_Where_behaves_correctly()
        {
            var list = new ListReactiveCollectionSource<int>();

            var changesTask = list.ReactiveCollection
                .Where(x => x % 2 == 0)
                .Where(x => x % 3 == 0)
                .Changes
                .Take(3)
                .ToArray()
                .ToTask();

            list.Add(1);
            list.Add(2);
            list.Add(3);
            list.Add(6);
            list.Remove(1);
            list.Remove(2);
            list.Remove(3);
            list.Remove(6);

            var changes = await changesTask;

            changes[0].Action.Should().Be(NotifyCollectionChangedAction.Reset);
            changes[1].Action.Should().Be(NotifyCollectionChangedAction.Add);
            changes[1].Current.Should().Equal(6);
            changes[2].Action.Should().Be(NotifyCollectionChangedAction.Remove);
            changes[2].Current.Should().BeEmpty();
        }
        public async Task Concat_Clear()
        {
            var source1 = new ListReactiveCollectionSource<int>();
            var source2 = new ListReactiveCollectionSource<int>();

            var concat = source1.ReactiveCollection.Concat(source2.ReactiveCollection);

            var notificationsTask = concat.Changes
                .Skip(2)
                .Take(3)
                .ToArray()
                .ToTask();

            source1.Add(1);
            source2.Add(2);
            source1.Clear();
            source2.Clear();

            var notifications = await notificationsTask;

            notifications.Should().HaveCount(3);
            notifications[0].Current.Should().Equal(1, 2);
            notifications[1].Action.Should().Be(NotifyCollectionChangedAction.Remove);
            notifications[1].Index.Should().Be(0);
            notifications[1].OldItems.Should().Equal(1);
            notifications[1].Current.Should().Equal(2);
            notifications[2].Action.Should().Be(NotifyCollectionChangedAction.Remove);
            notifications[2].Index.Should().Be(0);
            notifications[2].OldItems.Should().Equal(2);
            notifications[2].Current.Should().BeEmpty();
        }
        public async Task SortedSet_ToObservableCollection_does_not_raise_events_on_event_subscription()
        {
            var list = new ListReactiveCollectionSource<int> { 1, 2, 3 };

            var observableCollection = (INotifyCollectionChanged)list.ReactiveCollection.ToObservableCollection();

            var eventsTask = Observable
                .FromEventPattern<NotifyCollectionChangedEventHandler, NotifyCollectionChangedEventArgs>(eh => observableCollection.CollectionChanged += eh, eh => observableCollection.CollectionChanged -= eh)
                .Select(x => x.EventArgs)
                .FirstAsync()
                .ToTask();

            ((ICollection)observableCollection).Should().Equal(1, 2, 3);
            list.Add(4);

            var ev = await eventsTask;

            ev.Action.Should().Be(NotifyCollectionChangedAction.Add);
            ev.NewItems.Should().Equal(4);
            ((ICollection)observableCollection).Should().Equal(1, 2, 3, 4);
        }
        public async Task Add_to_sorted_list_with_Changes()
        {
            var list = new ListReactiveCollectionSource<int>();

            var projectedList = list
                .ReactiveCollection
                .Sort();

            var notificationTask = projectedList.Changes
                .Skip(3)
                .FirstAsync()
                .ToTask();

            list.Add(3);
            list.Add(1);
            list.Add(2);

            var notification = await notificationTask;

            notification.Action.Should().Be(NotifyCollectionChangedAction.Add);
            notification.NewItems.Should().Equal(2);
            notification.Current.Should().Equal(1, 2, 3);
        }
        public async Task List_ToObservableCollection_Replace()
        {
            var list = new ListReactiveCollectionSource<int>();
            var observableCollection = (INotifyCollectionChanged)list.ReactiveCollection.ToObservableCollection();

            var eventsTask = Observable
                .FromEventPattern<NotifyCollectionChangedEventHandler, NotifyCollectionChangedEventArgs>(eh => observableCollection.CollectionChanged += eh, eh => observableCollection.CollectionChanged -= eh)
                .Take(3)
                .Select(x => x.EventArgs)
                .ToArray()
                .ToTask();

            list.Add(1);
            list.Add(2);
            list.Replace(1, 3);

            var events = await eventsTask;

            events[0].Action.Should().Be(NotifyCollectionChangedAction.Add);
            events[1].Action.Should().Be(NotifyCollectionChangedAction.Add);
            events[2].Action.Should().Be(NotifyCollectionChangedAction.Replace);
            events[2].OldItems.Should().Equal(1);
            events[2].NewItems.Should().Equal(3);
            ((ICollection)observableCollection).Should().Equal(3, 2);
        }
        public async Task Remove_from_sorted_list_with_Changes()
        {
            var list = new ListReactiveCollectionSource<int>();

            var projectedList = list
                .ReactiveCollection
                .Sort();

            var notificationTask = projectedList.Changes
                .Skip(2)
                .FirstAsync()
                .ToTask();

            list.AddRange(new[] { 3, 2, 1 });
            list.Remove(2);

            var notification = await notificationTask;

            notification.Action.Should().Be(NotifyCollectionChangedAction.Remove);
            notification.NewItems.Should().BeEmpty();
            notification.OldItems.Should().Equal(2);
            notification.Current.Should().Equal(1, 3);
        }
        public void Contains()
        {
            var list = new ListReactiveCollectionSource<int>
            {
                1
            };

            list.Contains(1).Should().BeTrue();
            list.Contains(2).Should().BeFalse();
        }
        public async Task Replace_in_sorted_list_with_Changes()
        {
            var list = new ListReactiveCollectionSource<int>();

            var projectedList = list
                .ReactiveCollection
                .Sort();

            var notificationsTask = projectedList.Changes
                .Skip(2)
                .Take(2)
                .ToArray()
                .ToTask();

            list.AddRange(new[] { 3, 2, 1 });
            list.Replace(2, 4);

            var notifications = await notificationsTask;

            notifications[0].Action.Should().Be(NotifyCollectionChangedAction.Remove);
            notifications[0].OldItems.Should().Equal(2);
            notifications[1].Action.Should().Be(NotifyCollectionChangedAction.Add);
            notifications[1].NewItems.Should().Equal(4);
            notifications[0].Current.Should().Equal(1, 3);
            notifications[1].Current.Should().Equal(1, 3, 4);
        }
        public async Task Sort_with_comparison()
        {
            var list = new ListReactiveCollectionSource<int>();

            var notificationTask = list.ReactiveCollection.Changes
                .Skip(2)
                .FirstAsync()
                .ToTask();

            list.AddRange(new[] { 2, 1, 3, 5, 0 });
            list.Sort((x, y) => y.CompareTo(x));

            var notification = await notificationTask;

            notification.Action.Should().Be(NotifyCollectionChangedAction.Reset);
            notification.Current.Should().Equal(5, 3, 2, 1, 0);
        }
        public void Select_after_Where_squashes_both_operators()
        {
            var list = new ListReactiveCollectionSource<int>();

            var projectedList = list.ReactiveCollection
                .Where(x => x % 2 == 0)
                .Select(x => x.ToString(CultureInfo.InvariantCulture));

            var transformed = projectedList as ListTransformationReactiveCollection<int, string>;

            transformed.Should().NotBeNull();
            transformed.Source.Should().BeSameAs(list.ReactiveCollection);
            transformed.Selector.Should().NotBeNull();
            transformed.Filter.Should().NotBeNull();
        }
        public async Task SetItem()
        {
            var list = new ListReactiveCollectionSource<int>();

            var notificationTask = list.ReactiveCollection.Changes
                .Skip(2)
                .FirstAsync()
                .ToTask();

            list.AddRange(new[] { 1, 2, 3, 4, 5 });
            list.SetItem(2, 6);

            var notification = await notificationTask;

            notification.Action.Should().Be(NotifyCollectionChangedAction.Replace);
            notification.Index.Should().Be(2);
            notification.OldItems.Should().Equal(3);
            notification.NewItems.Should().Equal(6);
            notification.Current.Should().Equal(1, 2, 6, 4, 5);
        }
        public async Task Concat_Add_Delayed()
        {
            var source1 = new ListReactiveCollectionSource<int>();
            var source2 = new ListReactiveCollectionSource<int>();

            source1.Add(1);
            source2.Add(2);

            var concat = source1.ReactiveCollection.Concat(source2.ReactiveCollection);

            var notification = await concat.Changes
                .FirstAsync()
                .ToTask();

            notification.Action.Should().Be(NotifyCollectionChangedAction.Reset);
            notification.Current.Should().Equal(1, 2);
        }
        public async Task First_notification_is_reset()
        {
            var list = new ListReactiveCollectionSource <int>();

            await Verify(list.ReactiveCollection.Changes.FirstAsync().ToTask());
        }
        public async Task Concat_Replace_single()
        {
            var source1 = new ListReactiveCollectionSource<int>();
            var source2 = new ListReactiveCollectionSource<int>();

            var concat = source1.ReactiveCollection.Concat(source2.ReactiveCollection);

            var notificationsTask = concat.Changes
                .Skip(2)
                .Take(3)
                .ToArray()
                .ToTask();

            source1.AddRange(new[] { 1, 2, 3 });
            source2.AddRange(new[] { 4, 5, 6 });
            source1.Replace(2, -2);
            source2.Replace(5, -5);

            var notifications = await notificationsTask;

            notifications.Should().HaveCount(3);
            notifications[0].Current.Should().Equal(1, 2, 3, 4, 5, 6);
            notifications[1].Action.Should().Be(NotifyCollectionChangedAction.Replace);
            notifications[1].Index.Should().Be(1);
            notifications[1].OldItems.Should().Equal(2);
            notifications[1].NewItems.Should().Equal(-2);
            notifications[1].Current.Should().Equal(1, -2, 3, 4, 5, 6);
            notifications[2].Action.Should().Be(NotifyCollectionChangedAction.Replace);
            notifications[2].Index.Should().Be(4);
            notifications[2].OldItems.Should().Equal(5);
            notifications[2].NewItems.Should().Equal(-5);
            notifications[2].Current.Should().Equal(1, -2, 3, 4, -5, 6);
        }
        public void IndexOf()
        {
            var list = new ListReactiveCollectionSource<int>
            {
                1, 2, 3
            };

            list.IndexOf(3).Should().Be(2);
            list.IndexOf(2).Should().Be(1);
            list.IndexOf(1).Should().Be(0);
        }
        public void Select_after_Select_squashes_both_operators()
        {
            var list = new ListReactiveCollectionSource<int>();

            var projectedList = list.ReactiveCollection
                .Select(x => x.ToString())
                .Select(int.Parse);

            var transformed = projectedList as ListTransformationReactiveCollection<int, int>;

            transformed.Should().NotBeNull();
            transformed.Source.Should().BeSameAs(list.ReactiveCollection);
            transformed.Selector.Should().NotBeNull();
            transformed.Filter.Should().BeNull();
        }
        public async Task Remove_from_filtered_list()
        {
            var list = new ListReactiveCollectionSource<int>();

            var projectedList = list
                .ReactiveCollection
                .Where(x => x % 2 == 0);

            var notificationTask = projectedList.Changes
                .Skip(2)
                .FirstAsync()
                .ToTask();

            list.AddRange(new[] { 1, 2, 3 });
            list.Remove(2);

            var notification = await notificationTask;

            notification.Index.Should().Be(0);
            notification.Action.Should().Be(NotifyCollectionChangedAction.Remove);
            notification.NewItems.Should().BeEmpty();
            notification.OldItems.Should().Equal(2);
            notification.Current.Should().BeEmpty();
        }
        public async Task Replace_in_filtered_list_replacement2()
        {
            var list = new ListReactiveCollectionSource<int>(new[] { 1 });

            var projectedList = list.ReactiveCollection
                .Where(x => x % 2 == 0);

            var notificationTask = projectedList.Changes
                .Skip(1)
                .FirstAsync()
                .ToTask();

            list.Replace(1, 3);
            list.Replace(3, 4);

            var notification = await notificationTask;

            notification.Index.Should().Be(0);
            notification.Action.Should().Be(NotifyCollectionChangedAction.Add);
            notification.OldItems.Should().BeEmpty();
            notification.NewItems.Should().Equal(4);
            notification.Current.Should().Equal(4);
        }