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);
    }
Example #3
0
 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);
    }