Пример #1
0
    public void AddSerialNumberPattern_AddChangeReAdd()
    {
        var model = new MainModel(new MockFileSystem(), Scheduler.Immediate);
        var settingVM = new SettingAppViewModel(model);
        model.Initialize();

        AddSerialNumberViewModel addSerialNumberVM = settingVM.AddSerialNumberVM;

        const string addSerialNumberHead = "$n";

        //ステージ1 追加前
        settingVM.ReplaceTexts
            .Should().NotContain(x => x.ReplaceText.Value.Contains(addSerialNumberHead), "まだ含まれていないはず");

        addSerialNumberVM.SampleDiffVMs.Value
            .Select(x => x.SampleDiff.NewText.ToRawText())
            .Should().BeEquivalentTo(new[]
            {
                "1_aaa.txt",
                "2_bbb.txt",
                "3_ccc.txt",
                "4_ddd.txt"
            });

        //ステージ2 追加後
        addSerialNumberVM.StartNumber.Value = 10;
        addSerialNumberVM.Step.Value = 5;
        addSerialNumberVM.ZeroPadCount.Value = 3;
        addSerialNumberVM.IsDirectoryReset.Value = true;
        addSerialNumberVM.IsInverseOrder.Value = true;
        addSerialNumberVM.PrefixText.Value = "[";
        addSerialNumberVM.PostfixText.Value = "]_";

        addSerialNumberVM.AddSettingCommand.Execute();

        settingVM.ReplaceTexts
            .Should().Contain(x => x.ReplaceText.Value == @"[$n<10,5,000,r,i>]_", "含まれているはず");
        addSerialNumberVM.SampleDiffVMs.Value
            .Select(x => x.SampleDiff.NewText.ToRawText())
            .Should().BeEquivalentTo(new[]
            {
                "[020]_aaa.txt",
                "[015]_bbb.txt",
                "[010]_ccc.txt",
                "[010]_ddd.txt"
            });

        //ステージ3 追加後編集
        ReplacePatternViewModel addedPattern = settingVM.ReplaceTexts.Where(x => x.ReplaceText.Value.Contains(addSerialNumberHead)).First();
        const string changedTarget = "XXX";
        addedPattern.ReplaceText.Value = changedTarget;

        settingVM.ReplaceTexts
            .Should().NotContain(x => x.ReplaceText.Value.Contains(addSerialNumberHead), "変更したので、含まれていないはず");

        //ステージ4 再度追加
        addSerialNumberVM.AddSettingCommand.Execute();
        settingVM.ReplaceTexts
            .Should().Contain(x => x.ReplaceText.Value == @"[$n<10,5,000,r,i>]_", "含まれているはず");
    }
Пример #2
0
    public void CommonReplacePattern()
    {
        var model = new MainModel(new MockFileSystem(), Scheduler.Immediate);
        var settingVM = new SettingAppViewModel(model);
        model.Initialize();

        //英数小文字を大文字にするパターン(ex. low -> LOW)を取得
        const string commonReplacePatternTarget = "[a-z]";
        CommonPatternViewModel commonReplacePattern = settingVM.CommonReplacePatternVMs
                .Where(x => x.TargetPattern == commonReplacePatternTarget)
                .First();

        //ステージ1 追加前
        commonReplacePattern.TargetPattern
            .Should().Be(commonReplacePatternTarget);
        commonReplacePattern.ReplaceText
            .Should().Contain("\\u");
        commonReplacePattern.AsExpression
            .Should().BeTrue();
        commonReplacePattern.SampleDiff.OldText.ToRawText()
            .Should().Contain("low");
        commonReplacePattern.SampleDiff.NewText.ToRawText()
            .Should().Contain("LOW");

        settingVM.ReplaceTexts
            .Should().NotContain(x => x.TargetPattern.Value == commonReplacePatternTarget, "まだ含まれていないはず");

        //ステージ2 追加後
        commonReplacePattern.AddSettingCommand.Execute();
        settingVM.ReplaceTexts
            .Should().Contain(x => x.TargetPattern.Value == commonReplacePatternTarget, "含まれているはず");

        //ステージ3 追加後編集
        ReplacePatternViewModel addedPattern = settingVM.ReplaceTexts.Where(x => x.TargetPattern.Value == commonReplacePatternTarget).First();
        const string changedTarget = "XXX";
        addedPattern.TargetPattern.Value = changedTarget;

        settingVM.CommonReplacePatternVMs
            .Should().NotContain(x => x.TargetPattern == changedTarget, "追加先で編集しても、元のプロパティは変更されないはず")
            .And.Contain(x => x.TargetPattern == commonReplacePatternTarget, "追加先で編集しても、元のプロパティは変更されないはず");

        CommonPattern.ReplacePatterns
            .Should().NotContain(x => x.TargetPattern == changedTarget, "追加先で編集しても、元のプロパティは変更されないはず")
            .And.Contain(x => x.TargetPattern == commonReplacePatternTarget, "追加先で編集しても、元のプロパティは変更されないはず");
    }
    public async Task CommandsCanExecute()
    {
        var fileSystem    = AppExtension.CreateMockFileSystem(new[] { filePathA, filePathB });
        var syncScheduler = new SynchronizationContextScheduler(SynchronizationContext.Current !);
        var model         = new MainModel(fileSystem, syncScheduler);
        var mainVM        = new MainWindowViewModel(model);

        mainVM.Initialize();
        await mainVM.WaitIdle().Timeout(3000d);

        await Task.Delay(100);

        //ステージ1 初期状態
        var canExecuteUsuallyCommand = new ICommand[]
        {
            mainVM.AddFilesFromDialogCommand,
            mainVM.LoadFilesFromCurrentPathCommand,
            mainVM.LoadFilesFromDialogCommand,
            mainVM.LoadFilesFromNewPathCommand,
            mainVM.ShowHelpPageCommand,
            mainVM.ShowInformationPageCommand,
        };

        for (int i = 0; i < canExecuteUsuallyCommand.Length; i++)
        {
            canExecuteUsuallyCommand[i]
            .CanExecute(null)
            .Should().BeTrue($"すべて実行可能はなず (indexCommand:{i})");
        }

        mainVM.ReplaceCommand.CanExecute()
        .Should().BeFalse("実行不可能のはず");

        //ステージ2 ファイル読み込み中
        Task <bool> isIdleTask = mainVM.IsIdle.WaitUntilValueChangedAsync();

        mainVM.LoadFilesFromNewPathCommand.Execute(new[] { targetDirPath });
        await isIdleTask.Timeout(10000d);

        //CI上ではなぜか失敗することもある
        //canExecuteUsuallyCommand
        //    .Concat(new[] { mainVM.ReplaceCommand })
        //    .ForEach((c, i) =>
        //        c.CanExecute(null)
        //        .Should().BeFalse($"すべて実行不可能はなず (indexCommand:{i})"));

        //ステージ2 ファイル読み込み後
        await mainVM.WaitIdle().Timeout(3000);

        await Task.Delay(100);

        var canExecuteCommand = canExecuteUsuallyCommand
                                .Concat(new[] { mainVM.ReplaceCommand })
                                .Select((command, index) => (command, index));

        foreach (var(command, index) in canExecuteCommand)
        {
            command.CanExecute(null)
            .Should().BeTrue($"すべて実行可能はなず (indexCommand:{index})");
        }

        mainVM.RenameExecuteCommand.CanExecute()
        .Should().BeFalse("実行不可能のはず");

        //ステージ3 重複したリネーム後
        var replaceConflict = new ReplacePattern(fileNameA, fileNameB);

        mainVM.SettingVM.Value.ReplaceTexts.Add(new ReplacePatternViewModel(replaceConflict));
        await mainVM.ReplaceCommand.ExecuteAsync();

        await mainVM.WaitIdle().Timeout(3000);

        await Task.Delay(10);

        mainVM.RenameExecuteCommand.CanExecute()
        .Should().BeFalse("まだ実行不可能のはず");

        //ステージ4 なにも変化しないリネーム後
        mainVM.SettingVM.Value.ReplaceTexts.Clear();
        await mainVM.ReplaceCommand.ExecuteAsync();

        await mainVM.WaitIdle().Timeout(3000);

        await Task.Delay(10);

        mainVM.RenameExecuteCommand.CanExecute()
        .Should().BeFalse($"まだ実行不可能のはず。IsIdle:{mainVM.IsIdle.Value}, CountConflicted:{model.CountConflicted.Value}, CountReplaced:{model.CountReplaced.Value}");

        //ステージ5 有効なネーム後
        var replaceSafe   = new ReplacePattern(fileNameA, $"XXX_{fileNameA}");
        var replaceSafeVM = new ReplacePatternViewModel(replaceSafe);

        replaceSafeVM.ToString()
        .Should().ContainAll(fileNameA, "XXX_");
        mainVM.SettingVM.Value.ReplaceTexts.Add(replaceSafeVM);
        await mainVM.ReplaceCommand.ExecuteAsync();

        await mainVM.WaitIdle().Timeout(3000);

        await Task.Delay(10);

        mainVM.RenameExecuteCommand.CanExecute()
        .Should().BeTrue($"実行可能になったはず。IsIdle:{mainVM.IsIdle.Value}, CountConflicted:{model.CountConflicted.Value}, CountReplaced:{model.CountReplaced.Value}");

        //ステージ6 リネーム保存後
        await mainVM.RenameExecuteCommand.ExecuteAsync();

        await mainVM.WaitIdle().Timeout(3000);

        await Task.Delay(10);

        foreach (var(command, index) in canExecuteCommand)
        {
            command.CanExecute(null)
            .Should().BeTrue($"すべて実行可能はなず (indexCommand:{index})");
        }

        mainVM.RenameExecuteCommand.CanExecute()
        .Should().BeFalse($"実行不可能に戻ったはず。IsIdle:{mainVM.IsIdle.Value}, CountConflicted:{model.CountConflicted.Value}, CountReplaced:{model.CountReplaced.Value}");
    }