Ejemplo n.º 1
0
        public async Task RemoveFiltered()
        {
            var source = new ObservableCollection <int> {
                1, 2, 3
            };

            using (var view = source.AsFilteredView(x => x % 2 == 0))
            {
                using (var actual = view.SubscribeAll())
                {
                    view.RemoveAt(0);
                    await Application.Current.Dispatcher.SimulateYield();

                    CollectionAssert.IsEmpty(view);
                    CollectionAssert.AreEqual(new[] { 1, 3 }, source);
                    var expected = new EventArgs[]
                    {
                        CachedEventArgs.CountPropertyChanged,
                        CachedEventArgs.IndexerPropertyChanged,
                        Diff.CreateRemoveEventArgs(2, 0)
                    };
                    CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);
                }
            }
        }
            public static void DisposeAfterNotifyRemove()
            {
                var source = new ObservableCollection <int> {
                    1
                };

                using var view   = source.AsMappingView(CreateStrictMock, WithIndex, x => x.Object.Dispose());
                using var actual = view.SubscribeAll();
                var mock = view[0];

                mock.Setup(x => x.Dispose()).Callback(() => actual.Add(EventArgs.Empty));
                source.RemoveAt(0);
                mock.Verify(x => x.Dispose(), Times.Once);
                CollectionAssert.AreEqual(source, view.Select(x => x.Object.Value));
                CollectionAssert.AreEqual(source.Select((_, i) => i), view.Select(x => x.Object.Index));
                var expected = new List <EventArgs>
                {
                    CachedEventArgs.CountPropertyChanged,
                    CachedEventArgs.IndexerPropertyChanged,
                    Diff.CreateRemoveEventArgs(mock, 0),
                    EventArgs.Empty,
                };

                CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);
            }
Ejemplo n.º 3
0
        public static void RemoveVisibleBuffered()
        {
            var source = new ObservableCollection <int> {
                1, 2, 3
            };
            var scheduler = new TestScheduler();

            using var view = source.AsReadOnlyFilteredView(x => x % 2 == 0, TimeSpan.FromMilliseconds(100), scheduler);
            scheduler.Start();
            using var actual = view.SubscribeAll();
            CollectionAssert.AreEqual(new[] { 2 }, view);
            CollectionAssert.IsEmpty(actual);

            source.Remove(2);
            scheduler.Start();
            CollectionAssert.IsEmpty(view);
            var expected = new EventArgs[]
            {
                CachedEventArgs.CountPropertyChanged,
                CachedEventArgs.IndexerPropertyChanged,
                Diff.CreateRemoveEventArgs(2, 0),
            };

            CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);
        }
Ejemplo n.º 4
0
            public static void Remove()
            {
                var model1 = Collections.ReadOnlyViews.MappingViewTests.Model.Create(1);
                var model2 = Collections.ReadOnlyViews.MappingViewTests.Model.Create(2);
                var model3 = Collections.ReadOnlyViews.MappingViewTests.Model.Create(3);
                var source = new ObservableCollection <Collections.ReadOnlyViews.MappingViewTests.Model <int> >(
                    new[]
                {
                    model1,
                    model1,
                    model1,
                    model2,
                    model2,
                    model2,
                    model3,
                    model3,
                    model3,
                });

                using var view   = source.AsMappingView(Collections.ReadOnlyViews.MappingViewTests.Vm.Create);
                using var actual = view.SubscribeAll();
                var mapped0 = view[0];

                source.RemoveAt(0);
                CollectionAssert.AreEqual(source, view.Select(x => x.Model));
                var expected = new List <EventArgs>
                {
                    CachedEventArgs.CountPropertyChanged,
                    CachedEventArgs.IndexerPropertyChanged,
                    Diff.CreateRemoveEventArgs(mapped0, 0),
                };

                CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);
            }
Ejemplo n.º 5
0
        public async Task UpdatesAndNotifiesOnObservableCollectionChangedWhenFiltered()
        {
            var source = new ObservableCollection <int> {
                1, 2
            };

            using var view = source.AsFilteredView(x => true);
            source.Add(1);
            await Application.Current.Dispatcher.SimulateYield();

            using var actual = view.SubscribeAll();
            view.Filter      = x => x < 2;
            await Application.Current.Dispatcher.SimulateYield();

            var expected = new EventArgs[]
            {
                CachedEventArgs.GetOrCreatePropertyChangedEventArgs("Filter"),
                CachedEventArgs.CountPropertyChanged,
                CachedEventArgs.IndexerPropertyChanged,
                Diff.CreateRemoveEventArgs(2, 1),
            };

            CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);
            CollectionAssert.AreEqual(new[] { 1, 1 }, view);
        }
Ejemplo n.º 6
0
        public static void SetSourceRemove()
        {
            using var view   = new ReadOnlySerialView <int>(new[] { 1, 2, 3 });
            using var actual = view.SubscribeAll();
            var newSource = new[] { 1, 2 };

            view.SetSource(newSource);
            CollectionAssert.AreEqual(newSource, view);
            var expected = new List <EventArgs>
            {
                CachedEventArgs.CountPropertyChanged,
                CachedEventArgs.IndexerPropertyChanged,
                Diff.CreateRemoveEventArgs(3, 2),
                CachedEventArgs.GetOrCreatePropertyChangedEventArgs("Source"),
            };

            CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);

            newSource = new[] { 1 };
            view.SetSource(newSource);
            CollectionAssert.AreEqual(newSource, view);
            expected.AddRange(
                new EventArgs[]
            {
                CachedEventArgs.CountPropertyChanged,
                CachedEventArgs.IndexerPropertyChanged,
                Diff.CreateRemoveEventArgs(2, 1),
                CachedEventArgs.GetOrCreatePropertyChangedEventArgs("Source"),
            });
            CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);
        }
        public void RemoveVisible()
        {
            var source = new ObservableCollection <int> {
                1, 2, 3
            };
            var scheduler = new TestScheduler();

            using (var view = source.AsReadOnlyFilteredView(x => x % 2 == 0, scheduler))
            {
                scheduler.Start();
                using (var actual = view.SubscribeAll())
                {
                    source.Remove(2);
                    scheduler.Start();
                    CollectionAssert.IsEmpty(view);
                    var expected = new EventArgs[]
                    {
                        CachedEventArgs.CountPropertyChanged,
                        CachedEventArgs.IndexerPropertyChanged,
                        Diff.CreateRemoveEventArgs(2, 0)
                    };
                    CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);
                }
            }
        }
Ejemplo n.º 8
0
            public void Remove()
            {
                var source = new ObservableCollection <int> {
                    1
                };

                using (var modelView = source.AsMappingView(Model.Create))
                {
                    using (var modelViewChanges = modelView.SubscribeAll())
                    {
                        using (var vmView = modelView.AsMappingView(Vm.Create))
                        {
                            using (var vmViewChanges = vmView.SubscribeAll())
                            {
                                var oldModel = modelView[0];
                                var oldView  = vmView[0];
                                source.Remove(1);

                                var expected = new EventArgs[]
                                {
                                    CachedEventArgs.CountPropertyChanged,
                                    CachedEventArgs.IndexerPropertyChanged,
                                    null
                                };
                                expected[2] = Diff.CreateRemoveEventArgs(oldModel, 0);
                                CollectionAssert.AreEqual(expected, modelViewChanges, EventArgsComparer.Default);
                                expected[2] = Diff.CreateRemoveEventArgs(oldView, 0);
                                CollectionAssert.AreEqual(expected, vmViewChanges, EventArgsComparer.Default);
                            }
                        }
                    }
                }
            }
Ejemplo n.º 9
0
 private static IReadOnlyList <EventArgs> CreateRemoveEventArgsCollection(object item, int index)
 {
     return(new EventArgs[]
     {
         Notifier.CountPropertyChangedEventArgs,
         Notifier.IndexerPropertyChangedEventArgs,
         Diff.CreateRemoveEventArgs(item, index),
     });
 }
Ejemplo n.º 10
0
        public void ClearOne()
        {
            var before = new[] { 1 };
            var ints   = new ObservableCollection <int>(before);

            ints.Clear();
            var actual = Diff.CollectionChange(new[] { 1 }, ints);

            AssertEx.AreEqual(Diff.CreateRemoveEventArgs(1, 0), actual);
        }
            public void Repro2()
            {
                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 = 4; i < 10; i++)
                            {
                                source.Add(i);
                            }

                            scheduler.Start();
                            CollectionAssert.AreEqual(new[] { 1 }, view);
                            CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);

                            source.Clear();
                            scheduler.Start();
                            CollectionAssert.IsEmpty(view);
                            expected.AddRange(new EventArgs[]
                            {
                                CachedEventArgs.CountPropertyChanged,
                                CachedEventArgs.IndexerPropertyChanged,
                                Diff.CreateRemoveEventArgs(1, 0),
                            });
                            CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);
                        }
                    }
                }
            }
Ejemplo n.º 12
0
        public void RemoveNonFiltered()
        {
            var ints    = new ObservableCollection <int>(new[] { 1, 2, 3 });
            var view    = ints.AsReadOnlyFilteredView(x => x % 2 == 0);
            var changes = view.SubscribeAll();

            ints.Remove(2);
            CollectionAssert.IsEmpty(view);
            var expected = new EventArgs[]
            {
                Notifier.CountPropertyChangedEventArgs,
                Notifier.IndexerPropertyChangedEventArgs,
                Diff.CreateRemoveEventArgs(2, 0)
            };

            CollectionAssert.AreEqual(expected, changes, EventArgsComparer.Default);
        }
Ejemplo n.º 13
0
        /// <inheritdoc/>
        protected override void RemoveItem(int index)
        {
            var item        = this[index];
            var sourceIndex = this.SourceIndex(index);

            base.RemoveItem(index);
            var change = Diff.CreateRemoveEventArgs(item, index);

            this.UpdatedSourceWith = change;
            this.Notify(change);
            if (sourceIndex >= 0)
            {
                this.Source.RemoveAt(sourceIndex);
            }

            this.UpdatedSourceWith = null;
        }
Ejemplo n.º 14
0
        public void FilterRemoveOne()
        {
            using var actual = this.View.SubscribeAll();
            this.View.Filter = x => x < 3;
            this.Scheduler?.Start();

            CollectionAssert.AreEqual(new[] { 1, 2 }, this.View);
            var expected = new List <EventArgs>
            {
                CachedEventArgs.CountPropertyChanged,
                CachedEventArgs.IndexerPropertyChanged,
                Diff.CreateRemoveEventArgs(3, 2),
            };

            Assert.AreEqual(1, actual.Count(x => EventArgsComparer.Equals(x, FilterChangedEventArgs)));
            CollectionAssert.AreEqual(expected, actual.Where(x => !EventArgsComparer.Equals(x, FilterChangedEventArgs)), EventArgsComparer.Default);
        }
Ejemplo n.º 15
0
        public void EnqueueTrimsOverflowAndNotifies()
        {
            var queue = new ObservableFixedSizeQueue <int>(2);

            queue.Enqueue(1);
            queue.Enqueue(2);
            using var actual = queue.SubscribeAll();
            queue.Enqueue(3);
            CollectionAssert.AreEqual(new[] { 2, 3 }, queue);
            var expected = new EventArgs[]
            {
                Diff.CreateRemoveEventArgs(1, 0),
                Diff.CreateAddEventArgs(3, 1),
            };

            CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);
        }
Ejemplo n.º 16
0
        public void FilterEnumerable()
        {
            var subject = new Subject <object>();
            var source  = Enumerable.Range(1, 3);
            var view    = source.AsReadOnlyFilteredView(Filter, subject);
            var actual  = view.SubscribeAll();

            _filter = x => x < 3;
            subject.OnNext(null);
            CollectionAssert.AreEqual(new[] { 1, 2 }, view);
            var expected = new EventArgs[]
            {
                Notifier.CountPropertyChangedEventArgs,
                Notifier.IndexerPropertyChangedEventArgs,
                Diff.CreateRemoveEventArgs(3, 2),
            };

            CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);
        }
Ejemplo n.º 17
0
        public void NotifiesRemove()
        {
            var ints             = new ObservableCollection <int>(new[] { 1 });
            var expected         = ints.SubscribeAll();
            var modelView        = ints.AsMappingView(x => new Model(x));
            var modelViewChanges = modelView.SubscribeAll();
            var vmView           = modelView.AsMappingView(x => new Vm {
                Model = x
            });
            var vmViewChanges = vmView.SubscribeAll();

            var oldModel = modelView[0];
            var oldView  = vmView[0];

            ints.Remove(1);

            expected[2] = Diff.CreateRemoveEventArgs(oldModel, 0);
            CollectionAssert.AreEqual(expected, modelViewChanges, EventArgsComparer.Default);
            expected[2] = Diff.CreateRemoveEventArgs(oldView, 0);
            CollectionAssert.AreEqual(expected, vmViewChanges, EventArgsComparer.Default);
        }
Ejemplo n.º 18
0
        public void FilterRemoveOne()
        {
            _view.Filter = x => x < 3;
            if (_scheduler != null)
            {
                _scheduler.Start();
            }
            CollectionAssert.AreEqual(new[] { 1, 2 }, _view);
            var expected = new EventArgs[]
            {
                Notifier.CountPropertyChangedEventArgs,
                Notifier.IndexerPropertyChangedEventArgs,
                Diff.CreateRemoveEventArgs(3, 2),
            };

            _actual.RemoveAll(
                x =>
                x is PropertyChangedEventArgs &&
                ((PropertyChangedEventArgs)x).PropertyName == FilterChangedEventArgs.PropertyName);
            CollectionAssert.AreEqual(expected, _actual, EventArgsComparer.Default);
        }
Ejemplo n.º 19
0
        public void UpdatesAndNotifiesOnObservableCollectionChangedWhenFiltered()
        {
            var ints = new ObservableCollection <int>(new List <int> {
                1, 2
            });
            var view = ints.AsFilteredView(x => true);

            ints.Add(1);
            var actual = view.SubscribeAll();

            view.Filter = x => x < 2;
            view.Refresh();
            var expected = new EventArgs[]
            {
                Notifier.CountPropertyChangedEventArgs,
                Notifier.IndexerPropertyChangedEventArgs,
                Diff.CreateRemoveEventArgs(2, 1),
                new PropertyChangedEventArgs("Filter"),
            };

            CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);
            CollectionAssert.AreEqual(new[] { 1, 1 }, view);
        }
            public void Remove()
            {
                var source = new ObservableCollection <int>
                {
                    1,
                    1,
                    1,
                    2,
                    2,
                    2,
                    3,
                    3,
                    3,
                };

                using (var view = source.AsMappingView(CreateStrictMock, x => x.Object.Dispose()))
                {
                    using (var actual = view.SubscribeAll())
                    {
                        var mock = view[0];
                        mock.Setup(x => x.Dispose());
                        source.RemoveAt(0);
                        mock.Verify(x => x.Dispose(), Times.Once);
                        CollectionAssert.AreEqual(source, view.Select(x => x.Object.Value));
                        var expected = new List <EventArgs>
                        {
                            CachedEventArgs.CountPropertyChanged,
                            CachedEventArgs.IndexerPropertyChanged,
                            Diff.CreateRemoveEventArgs(mock, 0),
                        };
                        CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);

                        mock = view[0];
                        mock.Setup(x => x.Dispose());
                        source.RemoveAt(0);
                        mock.Verify(x => x.Dispose(), Times.Once);
                        CollectionAssert.AreEqual(source, view.Select(x => x.Object.Value));
                        expected.AddRange(new EventArgs[]
                        {
                            CachedEventArgs.CountPropertyChanged,
                            CachedEventArgs.IndexerPropertyChanged,
                            Diff.CreateRemoveEventArgs(mock, 0),
                        });
                        CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);

                        mock = view[0];
                        mock.Setup(x => x.Dispose());
                        source.RemoveAt(0);
                        mock.Verify(x => x.Dispose(), Times.Once);
                        CollectionAssert.AreEqual(source, view.Select(x => x.Object.Value));
                        expected.AddRange(new EventArgs[]
                        {
                            CachedEventArgs.CountPropertyChanged,
                            CachedEventArgs.IndexerPropertyChanged,
                            Diff.CreateRemoveEventArgs(mock, 0),
                        });
                        CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);
                    }

                    foreach (var mock in view)
                    {
                        mock.Setup(x => x.Dispose());
                    }
                }
            }
Ejemplo n.º 21
0
            public static void Remove()
            {
                var model1 = Collections.ReadOnlyViews.MappingViewTests.Model.Create(1);
                var model2 = Collections.ReadOnlyViews.MappingViewTests.Model.Create(2);
                var model3 = Collections.ReadOnlyViews.MappingViewTests.Model.Create(3);
                var source = new ObservableCollection <Collections.ReadOnlyViews.MappingViewTests.Model <int> >(
                    new[]
                {
                    model1,
                    model1,
                    model1,
                    model2,
                    model2,
                    model2,
                    model3,
                    model3,
                    model3,
                });

                using var view   = source.AsMappingView(CreateStrictMock, x => x.Object.Dispose());
                using var actual = view.SubscribeAll();
                var mock = view[0];

                source.RemoveAt(0);
                mock.Verify(x => x.Dispose(), Times.Never);
                CollectionAssert.AreEqual(source, view.Select(x => x.Object.Model));
                var expected = new List <EventArgs>
                {
                    CachedEventArgs.CountPropertyChanged,
                    CachedEventArgs.IndexerPropertyChanged,
                    Diff.CreateRemoveEventArgs(mock, 0),
                };

                CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);

                source.RemoveAt(0);
                mock.Verify(x => x.Dispose(), Times.Never);
                CollectionAssert.AreEqual(source, view.Select(x => x.Object.Model));
                expected.AddRange(new EventArgs[]
                {
                    CachedEventArgs.CountPropertyChanged,
                    CachedEventArgs.IndexerPropertyChanged,
                    Diff.CreateRemoveEventArgs(mock, 0),
                });
                CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);

                mock.Setup(x => x.Dispose());
                source.RemoveAt(0);
                mock.Verify(x => x.Dispose(), Times.Once);
                CollectionAssert.AreEqual(source, view.Select(x => x.Object.Model));
                expected.AddRange(new EventArgs[]
                {
                    CachedEventArgs.CountPropertyChanged,
                    CachedEventArgs.IndexerPropertyChanged,
                    Diff.CreateRemoveEventArgs(mock, 0),
                });
                CollectionAssert.AreEqual(expected, actual, EventArgsComparer.Default);

                foreach (var toDispose in view)
                {
                    toDispose.Setup(x => x.Dispose());
                }
            }