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>]_", "含まれているはず"); }
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}"); }