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); }
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 }); }
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(); }
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 }); }
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); }
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 }); }
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(); }
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 }); }