public void ViewModel_WhenInitialized_WithRefreshOnCollectionUpdateNotification_ShouldRefresh( IFixture fixture, TestSchedulers scheduler, int[] expectedValue) { //arrange var notifications = scheduler.CreateColdObservable(OnNext(200, 1)); var observer = scheduler.CreateObserver <ObservableViewModelNotification>(); var sut = new UpdatableObservableViewModelBuilderOptions <int, int[], int>( _ => { }, ct => Task.FromResult(expectedValue), () => notifications, scheduler, scheduler, scheduler) .UpdateAction((i, o) => () => { }) .RefreshOnCollectionUpdateNotification() .ToViewModel(); sut.Subscribe(observer); //act scheduler.Start(); //assert var expected = new ObservableViewModelNotification() { Status = ObservableViewModelStatus.Value, Value = expectedValue }; observer.Values().Last().Value.As <ObservableCollection <int> >().ShouldAllBeEquivalentTo(expectedValue); }
public async Task ViewModel_WhenRefreshed_ShouldDisposePreviousNotificationsSubscriptions( IFixture fixture, TestSchedulers scheduler, int[] values) { //arrange var notifications = scheduler.CreateColdObservable <int>(); var sut = new UpdatableObservableViewModelBuilderOptions <int, int[], int>( _ => { }, ct => Task.FromResult(values), () => notifications, scheduler, scheduler, scheduler) .UpdateAction((i, o) => () => { }) .ToViewModel(); const long disposeTime = 805; //act scheduler.Start(); await sut.RefreshAsync(); //we advance to an arbitrary time scheduler.AdvanceBy(disposeTime); //the subscription to the new observable should happen here //the first subscription should be dispose at the current scheduler time await sut.RefreshAsync(); //assert notifications.Subscriptions[0].Unsubscribe.Should().Be(disposeTime); }
public async Task ViewModel_WhenEmpty_WithRefreshOnCollectionUpdateNotification_ShouldRefresh( IFixture fixture, TestSchedulers scheduler, int[] expectedValue) { //arrange var notifications = scheduler.CreateColdObservable(OnNext(200, 1)); var observer = scheduler.CreateObserver <ObservableViewModelNotification>(); var count = 0; var sut = new UpdatableObservableViewModelBuilderOptions <int, int[], int>( _ => { }, ct => Task.FromResult(expectedValue), () => notifications, scheduler, scheduler, scheduler) .UpdateAction((i, o) => () => { }) .RefreshOnCollectionUpdateNotification() .EmptyPredicate(_ => ++ count == 1) .ToViewModel(); sut.Subscribe(observer); //act await sut.RefreshAsync(); scheduler.AdvanceBy(300); //assert observer.Values().Last().Value.As <ObservableCollection <int> >().ShouldAllBeEquivalentTo(expectedValue); }
public async Task ViewModel_ShouldReturnCorrectValue( IFixture fixture, TestSchedulers scheduler) { //arrange const int insertionIndex = 5; var initialList = fixture.CreateMany <int>(10).ToArray(); var addedList = fixture.CreateMany <int>(10).ToArray(); var expected = initialList.Take(insertionIndex) .Concat(addedList.Reverse()) .Concat(initialList.Skip(insertionIndex)) .ToArray(); var notifications = scheduler.CreateColdObservable(addedList.Select((i, ii) => OnNext(Subscribed + 1 + ii, i)).ToArray()); var sut = new UpdatableObservableViewModelBuilderOptions <int, int[], int>( _ => { }, ct => Task.FromResult(initialList), () => notifications, scheduler, scheduler, scheduler) .UpdateAction((i, o) => () => o.Insert(insertionIndex, i)) .ToViewModel(); //act scheduler.Start(); await sut.RefreshAsync(); scheduler.AdvanceBy(Disposed); var actual = ((IObservableViewModel <ObservableCollection <int> >)sut).CurrentValue; //assert actual.ShouldAllBeEquivalentTo(expected); }
public void Execute_WhenExuctingWhileOtherExecutionIsOccuring_ShouldCancelPreviousExecution( [Frozen] TestSchedulers schedulers) { //arrange var firstObservable = schedulers.CreateColdObservable(OnNext(200, new object()), OnNext(300, new object())); var secondObservable = schedulers.CreateColdObservable(OnNext(400, new object()), OnNext(500, new object())); var i = 0; Func <object, IObservable <object> > observableFactory = _ => ++ i == 1 ? firstObservable : secondObservable; var sut = new ObservableMvvmCommand <object, object>(observableFactory, schedulers, schedulers, "name", new AlwaysTrueCanExecuteStrategy <object>()); //act sut.Execute(null); schedulers.AdvanceBy(250); sut.Execute(null); schedulers.AdvanceBy(350); //assert firstObservable.Subscriptions.Single().Unsubscribe.Should().Be(250); }