public async Task TestBlockedOperationCancel(bool areMultipleFilesAvailable, int filesCount) { var taskCompletionSource = new TaskCompletionSource <bool>(); var options = OperationContinuationOptions.CreateContinuationOptions(FilePath, true, OperationContinuationMode.Skip); var operationsStateServiceMock = new Mock <IOperationsStateService>(); var operationStateViewModelFactoryMock = new Mock <IOperationStateViewModelFactory>(); var applicationDispatcherMock = new Mock <IApplicationDispatcher>(); applicationDispatcherMock .Setup(m => m.Dispatch(It.IsAny <Action>())) .Callback <Action>(action => action()); applicationDispatcherMock .Setup(m => m.DispatchAsync(It.IsAny <Func <Task> >())) .Callback <Func <Task> >(async func => { await func(); taskCompletionSource.SetResult(true); }); var dialogServiceMock = new Mock <IDialogService>(); dialogServiceMock .Setup(m => m.ShowDialogAsync <OverwriteOptionsDialogResult, OverwriteOptionsNavigationParameter>( nameof(OverwriteOptionsDialogViewModel), It.IsAny <OverwriteOptionsNavigationParameter>())) .Callback <string, OverwriteOptionsNavigationParameter>((_, p) => { Assert.Equal(areMultipleFilesAvailable, p.AreMultipleFilesAvailable); Assert.Equal(Source, p.SourceFilePath); Assert.Equal(Destination, p.DestinationFilePath); }) .Returns(Task.FromResult(new OverwriteOptionsDialogResult(options))); var viewModel = new OperationsStatesListViewModel( operationsStateServiceMock.Object, operationStateViewModelFactoryMock.Object, applicationDispatcherMock.Object, dialogServiceMock.Object); var state = OperationState.InProgress; var operationMock = new Mock <IOperation>(); operationMock .Setup(m => m.ContinueAsync(options)) .Verifiable(); operationMock .SetupGet(m => m.State) .Returns(() => state); operationMock .SetupGet(m => m.CurrentBlockedFile) .Returns((Source, Destination)); var array = new string[0]; var dictionary = new Dictionary <string, string>(); for (var i = 0; i < filesCount; i++) { dictionary[i.ToString()] = i.ToString(); } var settings = new BinaryFileSystemOperationSettings( array, array, array, array, dictionary, array); var operationInfo = new OperationInfo(OperationType.Copy, settings); operationMock .SetupGet(m => m.Info) .Returns(operationInfo); var operationStartedEventArgs = new OperationStartedEventArgs(operationMock.Object); operationsStateServiceMock.Raise(m => m.OperationStarted += null, operationStartedEventArgs); Assert.True(viewModel.AreAnyOperationsAvailable); state = OperationState.Blocked; var operationStateChangedEventArgs = new OperationStateChangedEventArgs(state); operationMock.Raise(m => m.StateChanged += null, operationStateChangedEventArgs); Assert.True(viewModel.AreAnyOperationsAvailable); var task = await Task.WhenAny(Task.Delay(1000), taskCompletionSource.Task); if (task != taskCompletionSource.Task) { taskCompletionSource.SetResult(false); } var result = await taskCompletionSource.Task; Assert.True(result); await Task.Delay(500); operationMock.Verify(m => m.ContinueAsync(options), Times.Once()); }
public async Task TestInProgressOperation(OperationState operationState, bool isLastSuccessful) { var stateViewModelMock = new Mock <IOperationStateViewModel>(); stateViewModelMock .Setup(m => m.State) .Returns(operationState); _autoMocker .Setup <IApplicationDispatcher>(m => m.Dispatch(It.IsAny <Action>())) .Callback <Action>(action => action()); _autoMocker .Setup <IOperationStateViewModelFactory, IOperationStateViewModel>(m => m.Create(It.IsAny <IOperation>())) .Returns(stateViewModelMock.Object); var configuration = new OperationsStatesConfiguration { MaximumFinishedOperationsCount = 1 }; _autoMocker.Use(configuration); var viewModel = _autoMocker.CreateInstance <OperationsStatesListViewModel>(); var state = OperationState.InProgress; var operationMock = new Mock <IOperation>(); operationMock .SetupGet(m => m.State) .Returns(() => state); var array = new string[0]; var dictionary = new Dictionary <string, string>(); for (var i = 0; i < 5; i++) { dictionary[i.ToString()] = i.ToString(); } var settings = new BinaryFileSystemOperationSettings( array, array, array, array, dictionary, array); var operationInfo = new OperationInfo(OperationType.Copy, settings); operationMock .SetupGet(m => m.Info) .Returns(operationInfo); Assert.False(viewModel.IsInProgress); Assert.Equal(0, viewModel.TotalProgress); var operationStartedEventArgs = new OperationStartedEventArgs(operationMock.Object); _autoMocker .GetMock <IOperationsStateService>() .Raise(m => m.OperationStarted += null, operationStartedEventArgs); Assert.NotEmpty(viewModel.ActiveOperations); Assert.Single(viewModel.ActiveOperations); Assert.Empty(viewModel.InactiveOperations); _autoMocker .Setup <IOperationsStateService, IReadOnlyList <IOperation> >(m => m.ActiveOperations) .Returns(new[] { operationMock.Object }); const double progress = 0.5; var args = new OperationProgressChangedEventArgs(progress); operationMock .Setup(m => m.CurrentProgress) .Returns(progress); operationMock .Raise(m => m.ProgressChanged += null, args); Assert.NotEmpty(viewModel.ActiveOperations); Assert.Single(viewModel.ActiveOperations); Assert.Empty(viewModel.InactiveOperations); Assert.True(viewModel.IsInProgress); Assert.Equal(50, viewModel.TotalProgress); var taskCompletionSource = new TaskCompletionSource <bool>(); _autoMocker .Setup <IApplicationDispatcher>(m => m.Dispatch(It.IsAny <Action>())) .Callback <Action>(action => { action(); taskCompletionSource.SetResult(true); }); state = operationState; var finishedArgs = new OperationStateChangedEventArgs(state); operationMock .Raise(m => m.StateChanged += null, finishedArgs); var task = await Task.WhenAny(Task.Delay(1000), taskCompletionSource.Task); if (task != taskCompletionSource.Task) { taskCompletionSource.SetResult(false); } var result = await taskCompletionSource.Task; Assert.True(result); Assert.NotEmpty(viewModel.InactiveOperations); Assert.Single(viewModel.InactiveOperations); Assert.Empty(viewModel.ActiveOperations); Assert.Equal(viewModel.IsLastOperationSuccessful, isLastSuccessful); }
private void OperationsStateServiceOnOperationStarted(object sender, OperationStartedEventArgs e) => _applicationDispatcher.Dispatch(() => AddOperation(e.Operation));
public async Task TestBlockedOperationCancel() { var taskCompletionSource = new TaskCompletionSource <bool>(); _autoMocker .Setup <IApplicationDispatcher>(m => m.Dispatch(It.IsAny <Action>())) .Callback <Action>(action => action()); _autoMocker .Setup <IApplicationDispatcher>(m => m.DispatchAsync(It.IsAny <Func <Task> >())) .Callback <Func <Task> >(async func => { await func(); taskCompletionSource.SetResult(true); }); var viewModel = _autoMocker.CreateInstance <OperationsStatesListViewModel>(); var state = OperationState.InProgress; var operationMock = new Mock <IOperation>(); operationMock .Setup(m => m.CancelAsync()) .Verifiable(); operationMock .SetupGet(m => m.State) .Returns(() => state); operationMock .SetupGet(m => m.CurrentBlockedFile) .Returns((Source, Destination)); var array = new string[0]; var dictionary = new Dictionary <string, string>(); for (var i = 0; i < 5; i++) { dictionary[i.ToString()] = i.ToString(); } var settings = new BinaryFileSystemOperationSettings( array, array, array, array, dictionary, array); var operationInfo = new OperationInfo(OperationType.Copy, settings); operationMock .SetupGet(m => m.Info) .Returns(operationInfo); var operationStartedEventArgs = new OperationStartedEventArgs(operationMock.Object); _autoMocker .GetMock <IOperationsStateService>() .Raise(m => m.OperationStarted += null, operationStartedEventArgs); Assert.True(viewModel.AreAnyOperationsAvailable); state = OperationState.Blocked; var operationStateChangedEventArgs = new OperationStateChangedEventArgs(state); operationMock.Raise(m => m.StateChanged += null, operationStateChangedEventArgs); Assert.True(viewModel.AreAnyOperationsAvailable); var task = await Task.WhenAny(Task.Delay(1000), taskCompletionSource.Task); if (task != taskCompletionSource.Task) { taskCompletionSource.SetResult(false); } var result = await taskCompletionSource.Task; Assert.True(result); await Task.Delay(500); operationMock.Verify(m => m.CancelAsync(), Times.Once); }