---
generated_at: 2026-02-22 10:30:00
metrics:
  claims_total: 114
  claims_with_evidence: 114
  claims_without_evidence: 0
confidence_derived: 1.00
---

# 根拠レポート：Avalonia.Dialogs 単体テストケース一覧

## 本レポートについて

### 目的
本レポートは、生成された単体テストケース一覧の信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

### チェック方法
以下の観点でドキュメントの内容（Claim：主張）を検証しています：

1. **根拠の有無確認**：各主張に対して、ソースコード・既存設計書・要件定義書などの根拠（Evidence）が存在するか
2. **根拠との整合性**：主張の内容が根拠と矛盾していないか
3. **網羅性**：参照すべき情報源を適切にカバーしているか

### 信頼度スコアの算出
- **confidence_derived** = 根拠あり件数 / 総主張件数
- 状態「○」：根拠あり、「△」：根拠不足または要確認

### 本レポートの使い方
1. まず「サマリー」で全体の信頼度と優先レビュー項目を確認
2. 「Claims と根拠の対応」で △ の項目を重点的にレビュー
3. 「不足情報」で補完が必要な情報源を確認

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**1.00**
  - 根拠あり：114 / 114、根拠なし：0
- 優先レビュー（高）
  1. **ManagedFileChooserViewModel関連テスト（UT-DLG-049〜084）**：複雑なビジネスロジック
  2. **ManagedStorageProvider関連テスト（UT-DLG-085〜098）**：非同期ダイアログ処理
  3. **ManagedFileChooserFilterViewModel関連テスト（UT-DLG-007〜014）**：ファイルフィルタリングロジック

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。抽出フェーズで付けたIDをそのまま出す。

- E-01: `src/Avalonia.Dialogs/ManagedFileDialogOptions.cs`
- E-02: `src/Avalonia.Dialogs/ManagedFileChooserOverwritePrompt.cs`
- E-03: `src/Avalonia.Dialogs/Internal/ManagedFileChooserFilterViewModel.cs`
- E-04: `src/Avalonia.Dialogs/Internal/ChildFitter.cs`
- E-05: `src/Avalonia.Dialogs/Internal/ManagedFileChooserNavigationItem.cs`
- E-06: `src/Avalonia.Dialogs/Internal/BclMountedVolumeInfoProvider.cs`
- E-07: `src/Avalonia.Dialogs/Internal/ManagedFileChooserViewModel.cs`
- E-08: `src/Avalonia.Dialogs/Internal/FileSizeStringConverter.cs`
- E-09: `src/Avalonia.Dialogs/Internal/AvaloniaDialogsInternalViewModelBase.cs`
- E-10: `src/Avalonia.Dialogs/Internal/ManagedFileChooserSources.cs`
- E-11: `src/Avalonia.Dialogs/Internal/ManagedFileChooserItemType.cs`
- E-12: `src/Avalonia.Dialogs/Internal/ManagedFileChooserItemViewModel.cs`
- E-13: `src/Avalonia.Dialogs/Internal/ResourceSelectorConverter.cs`
- E-14: `src/Avalonia.Dialogs/ManagedStorageProvider.cs`
- E-15: `src/Avalonia.Dialogs/AboutAvaloniaDialog.xaml.cs`
- E-16: `src/Avalonia.Dialogs/ManagedFileChooser.cs`
- E-17: `src/Avalonia.Dialogs/ManagedFileDialogExtensions.cs`

## 3) Claims と根拠の対応（レビューの主戦場）

### ManagedFileDialogOptions（UT-DLG-001〜002）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | デフォルト値でレコードが作成される | E-01: record定義、プロパティ宣言 | ○ |
| C-02 | AllowDirectorySelectionが設定可能 | E-01: `AllowDirectorySelection { get; set; }` | ○ |

### ManagedFileChooserOverwritePrompt（UT-DLG-003〜006）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-03 | FileNameプロパティが動作する | E-02: `SetAndRaise(FileNameProperty, ref _fileName, value)` | ○ |
| C-04 | ConfirmでResultがtrueで発火 | E-02: `Result?.Invoke(true)` | ○ |
| C-05 | CancelでResultがfalseで発火 | E-02: `Result?.Invoke(false)` | ○ |
| C-06 | Resultがnullでも例外なし | E-02: `Result?.Invoke(true)` null条件演算子使用 | ○ |

### ManagedFileChooserFilterViewModel（UT-DLG-007〜014）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-07 | フィルタが正しく作成される | E-03: コンストラクタでRegexパターン生成 | ○ |
| C-08 | *.*で_patternsがnull | E-03: `if (filter.Patterns?.Contains("*.*") == true) return;` | ○ |
| C-09 | Matchがパターン一致でtrue | E-03: `_patterns.Any(ext => ext.IsMatch(filename))` | ○ |
| C-10 | Matchがパターン不一致でfalse | E-03: Any()がfalseを返す | ○ |
| C-11 | _patternsがnullで全マッチ | E-03: `return _patterns == null || ...` | ○ |
| C-12 | 空文字列でfalse | E-03: Regexマッチングの動作 | ○ |
| C-13 | 大文字小文字無視 | E-03: `RegexOptions.IgnoreCase` | ○ |
| C-14 | ToStringがNameを返す | E-03: `override string ToString() => Name` | ○ |

### ChildFitter（UT-DLG-015〜018）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-15 | MeasureOverrideがSize(0,0)を返す | E-04: `return new Size(0, 0)` | ○ |
| C-16 | ArrangeOverrideがfinalSizeを返す | E-04: `return finalSize` | ○ |
| C-17 | 子要素がMeasureされる | E-04: `Child?.Measure(finalSize)` | ○ |
| C-18 | Childがnullでも例外なし | E-04: `Child?.Measure` null条件演算子 | ○ |

### ManagedFileChooserNavigationItem（UT-DLG-019〜021）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-19 | DisplayNameが動作 | E-05: `public string? DisplayName { get; set; }` | ○ |
| C-20 | Pathが動作 | E-05: `public string? Path { get; set; }` | ○ |
| C-21 | ItemTypeが動作 | E-05: `public ManagedFileChooserItemType ItemType { get; set; }` | ○ |

### BclMountedVolumeInfoProvider（UT-DLG-022〜026）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-22 | ドライブがコレクションに追加 | E-06: `mountedDrives.Add(new MountedVolumeInfo {...})` | ○ |
| C-23 | 未準備ドライブがスキップ | E-06: `if (!drive.IsReady) continue` | ○ |
| C-24 | 空ラベルでディレクトリ名使用 | E-06: `string.IsNullOrEmpty(drive.VolumeLabel.Trim()) ? directory : drive.VolumeLabel` | ○ |
| C-25 | Disposable.Emptyが返る | E-06: `return Disposable.Empty` | ○ |
| C-26 | 例外がキャッチされる | E-06: `catch { continue; }` | ○ |

### FileSizeStringConverter（UT-DLG-027〜030）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-27 | longが人間可読形式に変換 | E-08: `ByteSizeHelper.ToString((ulong)size, true)` | ○ |
| C-28 | 0以下で空文字列 | E-08: `if (value is long size && size > 0)` else `return ""` | ○ |
| C-29 | long以外で空文字列 | E-08: `if (value is long size ...)` パターンマッチング | ○ |
| C-30 | ConvertBackがNotImplemented | E-08: `throw new NotImplementedException()` | ○ |

### AvaloniaDialogsInternalViewModelBase（UT-DLG-031〜033）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-31 | 値変更でtrue・イベント発火 | E-09: `if (!EqualityComparer<T>.Default.Equals(field, value)) { ... PropertyChanged?.Invoke(...); return true; }` | ○ |
| C-32 | 同値でfalse・イベント非発火 | E-09: `if (!...) { ... } return false;` | ○ |
| C-33 | RaisePropertyChangedでイベント発火 | E-09: `PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName))` | ○ |

### ManagedFileChooserSources（UT-DLG-034〜039）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-34 | GetAllItemsが連結を返す | E-10: `GetUserDirectories().Concat(GetFileSystemRoots()).ToArray()` | ○ |
| C-35 | 存在するディレクトリのみ返す | E-10: `.Where(Directory.Exists)` | ○ |
| C-36 | 重複パスが除外 | E-10: `.Distinct()` | ○ |
| C-37 | MountedVolumesから項目作成 | E-10: `MountedVolumes.Select(...)` | ○ |
| C-38 | ラベルnullでサイズから生成 | E-10: `if (displayName == null & x.VolumeSizeBytes > 0) { displayName = $"{ByteSizeHelper...}` | ○ |
| C-39 | アクセス不可ボリュームスキップ | E-10: `catch (Exception) { return null; }` + `.Where(x => x != null)` | ○ |

### ManagedFileChooserItemViewModel（UT-DLG-040〜045）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-40 | デフォルトコンストラクタ | E-12: `public ManagedFileChooserItemViewModel() { }` | ○ |
| C-41 | NavigationItemから初期化 | E-12: コンストラクタで`ItemType = item.ItemType; Path = item.Path; DisplayName = item.DisplayName;` | ○ |
| C-42 | FolderでIcon_Folder | E-12: `case ManagedFileChooserItemType.Folder: return "Icon_Folder"` | ○ |
| C-43 | VolumeでIcon_Volume | E-12: `case ManagedFileChooserItemType.Volume: return "Icon_Volume"` | ○ |
| C-44 | FileでIcon_File | E-12: `default: return "Icon_File"` | ○ |
| C-45 | PropertyChangedが発火 | E-12: `RaiseAndSetIfChanged` 使用 | ○ |

### ResourceSelectorConverter（UT-DLG-046〜048）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-46 | リソースキーで値を返す | E-13: `TryGetResource((string)key!, null, out var value); return value;` | ○ |
| C-47 | 存在しないキーでnull | E-13: TryGetResourceの動作（outパラメータがnull） | ○ |
| C-48 | ConvertBackがNotImplemented | E-13: `throw new NotImplementedException()` | ○ |

### ManagedFileChooserViewModel（UT-DLG-049〜084）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-49 | ManagedFileDialogOptionsで初期化 | E-07: コンストラクタ `public ManagedFileChooserViewModel(ManagedFileDialogOptions options)` | ○ |
| C-50 | FilePickerOpenOptionsで初期化 | E-07: コンストラクタ、`Title = filePickerOpen.Title ?? "Open file"` | ○ |
| C-51 | FilePickerSaveOptionsで初期化 | E-07: コンストラクタ、`_savingFile = true` | ○ |
| C-52 | FolderPickerOpenOptionsで初期化 | E-07: コンストラクタ、`_selectingDirectory = true` | ○ |
| C-53 | AllowMultipleでMultiple | E-07: `if (filePickerOpen.AllowMultiple) { SelectionMode = SelectionMode.Multiple; }` | ○ |
| C-54 | FileTypeFilterからFilters設定 | E-07: `Filters.AddRange(filePickerOpen.FileTypeFilter.Select(...))` | ○ |
| C-55 | LocationでPropertyChanged | E-07: `RaiseAndSetIfChanged(ref _location, value)` | ○ |
| C-56 | FileNameでPropertyChanged | E-07: `RaiseAndSetIfChanged(ref _fileName, value)` | ○ |
| C-57 | QuickLinksにLocationがある場合インデックス | E-07: `if (i.Path == Location) { return index; }` | ○ |
| C-58 | QuickLinksにない場合-1 | E-07: `return -1;` | ○ |
| C-59 | SelectedFilter変更でRefresh | E-07: `set { ... Refresh(); }` | ○ |
| C-60 | ShowHiddenFiles変更でRefresh | E-07: `set { ... Refresh(); }` | ○ |
| C-61 | Navigateでitems更新 | E-07: `Items.Clear(); ... Items.AddRange(...)` | ○ |
| C-62 | 存在しないパスでルートへ | E-07: `if (!Directory.Exists(path)) { NavigateRoot(...); }` | ○ |
| C-63 | 隠しファイルフィルタ | E-07: `if (!ShowHiddenFiles) { ... infos.Where(i => !i.Name.StartsWith(".")) }` | ○ |
| C-64 | SelectedFilterでフィルタ | E-07: `if (SelectedFilter != null) { infos = infos.Where(... || SelectedFilter.Match(i.Name)); }` | ○ |
| C-65 | ディレクトリ選択でファイル非表示 | E-07: `if (_selectingDirectory) { if (!(x is DirectoryInfo)) return false; }` | ○ |
| C-66 | initialSelectionNameで選択 | E-07: `if (initialSelectionName != null) { ... SelectedItems.Add(sel); }` | ○ |
| C-67 | UnauthorizedAccessException処理 | E-07: `catch (System.UnauthorizedAccessException) { }` | ○ |
| C-68 | GoUpで親へナビゲート | E-07: `var parent = Path.GetDirectoryName(Location); ... Navigate(parent);` | ○ |
| C-69 | ルートでGoUp無効 | E-07: `if (string.IsNullOrWhiteSpace(parent)) { return; }` | ○ |
| C-70 | CancelでCancelRequested発火 | E-07: `CancelRequested?.Invoke();` | ○ |
| C-71 | 重複Cancel防止 | E-07: `if (!_alreadyCancelled) { _alreadyCancelled = true; ... }` | ○ |
| C-72 | CanOkでディレクトリ選択判定 | E-07: `(_selectingDirectory && !string.IsNullOrWhiteSpace(Location))` | ○ |
| C-73 | CanOkでファイル保存判定 | E-07: `(_savingFile && !string.IsNullOrWhiteSpace(FileName))` | ○ |
| C-74 | CanOkでSelectedItems判定 | E-07: `SelectedItems.Count > 0 && ...` | ○ |
| C-75 | CanOkでfalse | E-07: 条件を満たさない場合の戻り値 | ○ |
| C-76 | OkでディレクトリComplete | E-07: `if (_selectingDirectory) { CompleteRequested?.Invoke(new[] { Location! }); }` | ○ |
| C-77 | Okでファイル保存Complete | E-07: `CompleteRequested?.Invoke(new[] { fullName });` | ○ |
| C-78 | 拡張子付与 | E-07: `if (!Path.HasExtension(FileName) ...) { FileName = Path.ChangeExtension(...) }` | ○ |
| C-79 | 上書き確認 | E-07: `if (_overwritePrompt && File.Exists(fullName)) { OverwritePrompt?.Invoke(fullName); }` | ○ |
| C-80 | ファイル選択Complete | E-07: `CompleteRequested?.Invoke(SelectedItems.Select(i => i.Path!).ToArray());` | ○ |
| C-81 | SelectSingleFileでComplete | E-07: `CompleteRequested?.Invoke(new[] { item.Path! });` | ○ |
| C-82 | EnterPressedでナビゲート | E-07: `if (Directory.Exists(Location)) { Navigate(Location); }` | ○ |
| C-83 | EnterPressedでComplete | E-07: `else if (File.Exists(Location)) { CompleteRequested?.Invoke(...) }` | ○ |
| C-84 | RefreshでNavigate | E-07: `public void Refresh() => Navigate(Location);` | ○ |

### ManagedStorageProvider（UT-DLG-085〜098）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-85 | コンストラクタで初期化 | E-14: `public ManagedStorageProvider(TopLevel? parent, ManagedFileDialogOptions? managedOptions = null)` | ○ |
| C-86 | optionsがnullでデフォルト | E-14: `_managedOptions = managedOptions ?? new ManagedFileDialogOptions();` | ○ |
| C-87 | CanSaveがtrue | E-14: `public override bool CanSave => true;` | ○ |
| C-88 | CanOpenがtrue | E-14: `public override bool CanOpen => true;` | ○ |
| C-89 | CanPickFolderがtrue | E-14: `public override bool CanPickFolder => true;` | ○ |
| C-90 | OpenFilePickerAsyncで結果返却 | E-14: `return results.Select(f => new BclStorageFile(...)).ToArray();` | ○ |
| C-91 | SaveFilePickerAsyncで結果返却 | E-14: `return ... new BclStorageFile(new FileInfo(result)) : null;` | ○ |
| C-92 | キャンセルでnull | E-14: 条件演算子の評価 | ○ |
| C-93 | SaveFilePickerWithResultAsyncで結果 | E-14: `return new SaveFilePickerResult { File = file, SelectedFileType = filterType };` | ○ |
| C-94 | OpenFolderPickerAsyncで結果返却 | E-14: `return results.Select(f => new BclStorageFolder(...)).ToArray();` | ○ |
| C-95 | ContentRootFactory使用 | E-14: `var root = _managedOptions.ContentRootFactory?.Invoke();` | ○ |
| C-96 | 非WindowでContentControl | E-14: `if (_parent is not null and not Window) { root = new ContentControl(); }` | ○ |
| C-97 | Window/nullでWindow | E-14: `else { root = new Window(); }` | ○ |
| C-98 | InvalidOperationException | E-14: `throw new InvalidOperationException("Managed File Chooser requires...")` | ○ |

### AboutAvaloniaDialog（UT-DLG-099〜101）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-99 | Version形式 | E-15: `$@"v{s_version.ToString(2)}"` | ○ |
| C-100 | IsDevelopmentBuild判定 | E-15: `s_version.Revision == 999` | ○ |
| C-101 | Copyright形式 | E-15: `$"(C) {DateTime.Now.Year} The Avalonia Project"` | ○ |

### ManagedFileChooser（UT-DLG-102〜108）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-102 | ハンドラ登録 | E-16: `AddHandler(PointerPressedEvent, OnPointerPressed, RoutingStrategies.Tunnel)` | ○ |
| C-103 | ダブルクリックでファイル選択 | E-16: `if (model.ItemType == ManagedFileChooserItemType.File) { Model?.SelectSingleFile(model); }` | ○ |
| C-104 | ダブルクリックでナビゲート | E-16: `else { Model?.Navigate(model.Path); }` | ○ |
| C-105 | クイックリンククリック | E-16: `var isQuickLink = _quickLinksRoot.IsLogicalAncestorOf(...)` | ○ |
| C-106 | DataContextがnullで安全 | E-16: `if (model == null) { return; }` | ○ |
| C-107 | テンプレート部品取得 | E-16: `_quickLinksRoot = e.NameScope.Get<Control>("PART_QuickLinks");` | ○ |
| C-108 | 初期スクロール | E-16: `_filesView.ScrollIntoView(indexOfPreselected - 1);` | ○ |

### ManagedFileDialogExtensions（UT-DLG-109〜114）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-109 | CreateProviderでManagedStorageProvider | E-17: `return new ManagedStorageProvider(topLevel, _options);` | ○ |
| C-110 | UseManagedSystemDialogsでバインド | E-17: `AvaloniaLocator.CurrentMutable.Bind<IStorageProviderFactory>().ToConstant(...)` | ○ |
| C-111 | ジェネリック版 | E-17: `return builder.UseManagedSystemDialogs(() => new TWindow());` | ○ |
| C-112 | optionsOverride使用 | E-17: `var options = optionsOverride ?? AvaloniaLocator.Current.GetService<ManagedFileDialogOptions>()` | ○ |
| C-113 | customRootFactoryでwith | E-17: `options = options with { ContentRootFactory = customRootFactory };` | ○ |
| C-114 | CustomVolumeInfoProviderバインド | E-17: `if (options?.CustomVolumeInfoProvider is not null) { ... .Bind<IMountedVolumeInfoProvider>()...}` | ○ |

## 4) 不足情報（Unknown / Missing）
- なし。すべてのテストケースは対応するソースコードを直接解析して生成されました。

## 5) リスクフラグ（レビュー観点）
- **0: 低リスク** - 全テストケースがソースコードに基づいており、根拠が明確です。
- ただし、以下の点についてはレビュー時に注意が必要です：
  - ManagedFileChooserViewModelの非同期処理（OnSelectionChangedAsync）のテストは実行時の競合状態に注意
  - プラットフォーム依存の処理（Windows/Linux/macOSでの動作差異）
  - ファイルシステムアクセスを伴うテストのモック化

## 6) レビュアーチェックリスト（最小）
- [ ] テストケースのカバレッジが十分か（各publicメソッド・プロパティがカバーされているか）
- [ ] 境界値テストが網羅されているか
- [ ] 異常系テストが適切に設計されているか
- [ ] テスト優先度の設定が妥当か
- [ ] プラットフォーム固有の動作に関するテストケースが考慮されているか
- [ ] 非同期処理のテストケースが適切に設計されているか
