public async Task Counts_Conflict()
    {
        var model = CreateDefaultSettingModel();

        await model.LoadFileElements();

        var fileElementVMs = new FileElementsGridViewModel(model);
        await Task.Delay(10);

        fileElementVMs.IsAnyFiles.Value
        .Should().BeTrue("ファイル読込後なので、ファイルはあるはず");

        ListCollectionView cViewFileElementVMs = (ListCollectionView)fileElementVMs.CViewFileElementVMs;

        //ステージ 衝突する置換後
        const string conflictText = "A";

        model.Setting.ReplaceTexts.Add(new("B", conflictText));
        model.Setting.ReplaceTexts.Add(new("C", conflictText));

        await model.Replace();

        await model.WaitIdleUI().Timeout(3000);

        await fileElementVMs.CountReplaced
        .WaitShouldBe(2, 3000d, "B→A・C→Aの2つの置換する設定があるので");

        await fileElementVMs.CountConflicted
        .WaitShouldBe(3, 3000d, "元々A・B→A・C→Aの3つが衝突するので");

        fileElementVMs.IsReplacedAny.Value
        .Should().BeTrue("置換する設定があるので");
        fileElementVMs.IsNotConflictedAny.Value
        .Should().BeFalse("衝突するので");

        foreach (FileElementViewModel vm in cViewFileElementVMs)
        {
            (vm.PathModel.OutputFileName.Contains(conflictText) == vm.IsConflicted.Value)
            .Should().BeTrue("Aを含んだファイル名は衝突しているはず");
        }

        //ステージ 衝突ファイルのみ表示にした後
        fileElementVMs.IsVisibleConflictedOnly.Value = true;

        await cViewFileElementVMs.ObserveProperty(x => x.Count)
        .WaitShouldBe(3, 3000d, "元々A・B→A・C→Aの3つのファイルにフィルタ後は絞られたはず");

        //ステージ 衝突&置換ファイルのみ表示にした後
        fileElementVMs.IsVisibleReplacedOnly.Value = true;

        await cViewFileElementVMs.ObserveProperty(x => x.Count)
        .WaitShouldBe(2, 3000d, "B→A・C→Aの2つのファイルにフィルタ後は絞られたはず");

        //ステージ すべてのファイル表示にした後
        fileElementVMs.IsVisibleConflictedOnly.Value = false;
        fileElementVMs.IsVisibleReplacedOnly.Value   = false;

        await cViewFileElementVMs.ObserveProperty(x => x.Count)
        .WaitShouldBe(6, 3000d, "フィルタ削除後はすべてのファイルがあるはず");
    }