示例#1
0
        public async Task UpdateAsyncUsesIdentityComparerGivenAtConstruction()
        {
            IEnumerable <IntWrapper> originalItems         = new IntWrapper[] { 1, 2, 3 };
            IEnumerable <ItemChange <IntWrapper> > changes = new ItemChange <IntWrapper>[]
            {
                new ItemChange <IntWrapper>(ChangeType.Updated, 2)
            };

            var loader = new AsyncLoader <IntWrapper>(
                Seq.ListBased,
                loadDataAsync: _ => Task.FromResult(originalItems),
                fetchUpdatesAsync: (_, __) => Task.FromResult(changes),
                identityComparer: new IntWrapperComparer(),
                eventContext: new RunInlineSynchronizationContext());
            await loader.LoadAsync();  // load original items

            loader.CollectionChanged += (s, e) =>
            {
                // Verify that the resulting change was exactly the incoming change
                e.Should().Equal(changes);
            };

            await loader.UpdateAsync();  // --- Perform ---

            // Verify that no changes to the int values in the collection were made
            loader.Should().Equal(new IntWrapper[] { 1, 2, 3 }, (x, y) => x.Value == y.Value);
        }
示例#2
0
        public async Task UpdateAsyncPreservesItemsAddedDuringUpdate()
        {
            IEnumerable <ItemChange <int> > changes = new[]
            {
                new ItemChange <int>(ChangeType.Added, 2),
                new ItemChange <int>(ChangeType.Added, 3)
            };

            var updateTask = new TaskCompletionSource <IEnumerable <ItemChange <int> > >();
            var loader     = new AsyncLoader <int>(
                seqFactory: Seq.ListBased,
                fetchUpdatesAsync: (_, __) => updateTask.Task);


            // --- Perform ---
            var finishUpdate = loader.UpdateAsync();  // returns a continuation stuck waiting for updateTask to complete

            loader.Conj(1);

            updateTask.SetResult(changes); // complete updateTask...
            await finishUpdate;            // ...and wait for completion to finish


            loader.ShouldAllBeEquivalentTo(new[] { 1, 2, 3 });
        }
示例#3
0
        public async Task CanUpdateEmptyLoaderWithEmptyChanges()
        {
            var loader = new AsyncLoader <int>(
                seqFactory: Seq.ListBased,
                fetchUpdatesAsync: (_, __) => Task.FromResult(Enumerable.Empty <ItemChange <int> >()));

            await loader.UpdateAsync();  // --- Perform ---

            loader.Should().BeEmpty();
        }
示例#4
0
        public async Task CanUpdateEmptyLoaderWithSingleAddition()
        {
            IEnumerable <ItemChange <int> > changes = new[] { new ItemChange <int>(ChangeType.Added, 1) };

            var loader = new AsyncLoader <int>(
                seqFactory: Seq.ListBased,
                fetchUpdatesAsync: (_, __) => Task.FromResult(changes));

            await loader.UpdateAsync(); // --- Perform ---

            loader.ShouldAllBeEquivalentTo(new[] { 1 });
        }
示例#5
0
        public async Task CanUpdateNonEmptyLoaderWithEmptyChanges()
        {
            IEnumerable <int> initialItems = new[] { 1, 2, 3 };

            var loader = new AsyncLoader <int>(
                seqFactory: Seq.ListBased,
                loadDataAsync: _ => Task.FromResult(initialItems),
                fetchUpdatesAsync: (_, __) => Task.FromResult(Enumerable.Empty <ItemChange <int> >()));
            await loader.LoadAsync();   // load initial data

            await loader.UpdateAsync(); // --- Perform ---

            loader.ShouldAllBeEquivalentTo(initialItems);
        }
示例#6
0
        public async Task UpdateAsyncDoesNotAddOrRemoveItemsForUpdateItemChange()
        {
            IEnumerable <int> originalItems         = new int[] { 1 };
            IEnumerable <ItemChange <int> > changes = new ItemChange <int>[] { new ItemChange <int>(ChangeType.Updated, 1) };

            var loader = new AsyncLoader <int>(
                Seq.ListBased,
                loadDataAsync: tok => Task.FromResult(originalItems),
                fetchUpdatesAsync: (items, tok) => Task.FromResult(changes));
            await loader.LoadAsync();

            loader.Should().Equal(new[] { 1 }); // sanity check

            await loader.UpdateAsync();         // --- Perform ---

            loader.Should().Equal(new[] { 1 });
        }
示例#7
0
        public async Task UpdateAsyncCanRemoveSingleItemFromLoader()
        {
            IEnumerable <int> originalItems         = new int[] { 1 };
            IEnumerable <ItemChange <int> > changes = new ItemChange <int>[] { new ItemChange <int>(ChangeType.Removed, 1) };

            var loader = new AsyncLoader <int>(
                Seq.ListBased,
                loadDataAsync: tok => Task.FromResult(originalItems),
                fetchUpdatesAsync: (items, tok) => Task.FromResult(changes));
            await loader.LoadAsync();

            loader.Should().NotBeEmpty(); // sanity check

            await loader.UpdateAsync();   // --- Perform ---

            loader.Should().BeEmpty();
        }
示例#8
0
        public async Task UpdateAsyncRetainsOrder()
        {
            IEnumerable <int> originalItems         = new int[] { 1, 2, 3 };
            IEnumerable <ItemChange <int> > changes = new ItemChange <int>[]
            {
                new ItemChange <int>(ChangeType.Updated, 2),
                new ItemChange <int>(ChangeType.Added, 4)
            };

            var loader = new AsyncLoader <int>(
                Seq.ListBased,
                loadDataAsync: tok => Task.FromResult(originalItems),
                fetchUpdatesAsync: (items, tok) => Task.FromResult(changes));
            await loader.LoadAsync();   // load original items

            await loader.UpdateAsync(); // --- Perform ---

            loader.Should().Equal(new[] { 1, 2, 3, 4 });
        }