---
generated_at: 2026-03-01 12:00:00
metrics:
  claims_total: 88
  claims_with_evidence: 82
  claims_without_evidence: 6
confidence_derived: 0.93
---

# 根拠レポート：cascadia-WinRTUtils 単体テストケース一覧

## 本レポートについて

### 目的
本レポートは、生成された設計書・ドキュメントの信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.93**
  - 根拠あり：82 / 88、根拠なし：6
- 優先レビュー（高）
  1. **C-52 (OpenImagePicker デフォルトフォルダ設定)**: PicturesLibraryフォルダのSHGetKnownFolderItem呼び出しはCATCH_LOG()で非致命的としているため、テスト環境での動作が不確実
  2. **C-84, C-85 (EnsureAllResourcesArePresent)**: Debugモード専用コードであり、リンカセクション(.util$res$a / $z)に依存するため、テスト方法が制約される
  3. **C-86, C-87, C-88 (RS_fmt_impl)**: fmt::formatの実行時フォーマット文字列の動作は、実際のリソースファイルの内容に依存する

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

- E-01: `src/cascadia/WinRTUtils/inc/ScopedResourceLoader.h` - ScopedResourceLoaderクラス定義
- E-02: `src/cascadia/WinRTUtils/ScopedResourceLoader.cpp` - ScopedResourceLoader実装
- E-03: `src/cascadia/WinRTUtils/inc/ThrottledFunc.h` - ThrottledFuncテンプレートクラス定義・実装
- E-04: `src/cascadia/WinRTUtils/inc/SafeDispatcherTimer.h` - SafeDispatcherTimer構造体定義・実装
- E-05: `src/cascadia/WinRTUtils/inc/Utils.h` - FilePicker, OpenFilePicker, SaveFilePicker, ThemeLookup定義
- E-06: `src/cascadia/WinRTUtils/Utils.cpp` - OpenImagePicker実装
- E-07: `src/cascadia/WinRTUtils/inc/WtExeUtils.h` - IsPackaged, IsDevBuild, GetWtExePath, QuoteAndEscapeCommandlineArg定義
- E-08: `src/cascadia/WinRTUtils/inc/LibraryResources.h` - LibraryResourcesマクロ定義、RS_fmt_impl
- E-09: `src/cascadia/WinRTUtils/LibraryResources.cpp` - GetLibraryResourceLoader, GetLibraryResourceString, HasLibraryResourceWithName, EnsureAllResourcesArePresent実装
- E-10: `src/cascadia/WinRTUtils/pch.h` - プリコンパイル済みヘッダー（依存関係確認用）

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | ScopedResourceLoaderが有効なリソースロケータベースで構築される | E-01, E-02 | ○ |
| C-02 | 存在しないリソースロケータベースで例外がスローされる | E-02 | ○ |
| C-03 | 空文字列のリソースロケータベースで例外がスローされる | E-02 | ○ |
| C-04 | GetResourceMapがリソースマップを返却する | E-01, E-02 | ○ |
| C-05 | GetLocalizedStringが存在するリソースキーでローカライズ文字列を取得する | E-02 | ○ |
| C-06 | GetLocalizedStringが存在しないリソースキーで例外をスローする | E-02 | ○ |
| C-07 | GetLocalizedStringが空文字列キーで例外をスローする | E-02 | ○ |
| C-08 | HasResourceWithNameが存在するリソースキーでtrueを返す | E-02 | ○ |
| C-09 | HasResourceWithNameが存在しないリソースキーでfalseを返す | E-02 | ○ |
| C-10 | HasResourceWithNameが空文字列キーで適切に動作する | E-02 | ○ |
| C-11 | WithQualifierが修飾子付きの新しいScopedResourceLoaderを生成する | E-02 | ○ |
| C-12 | WithQualifierで元のリソースマップが共有される | E-02 | ○ |
| C-13 | ResourceMapアクセサが内部のリソースマップを返す | E-01 | ○ |
| C-14 | ResourceContextアクセサが内部のコンテキストを返す | E-01 | ○ |
| C-15 | ThrottledFuncがleading=true, trailing=trueで構築される | E-03 | ○ |
| C-16 | ThrottledFuncがleading=trueのみで構築される | E-03 | ○ |
| C-17 | ThrottledFuncがtrailing=trueのみで構築される | E-03 | ○ |
| C-18 | leading=false, trailing=falseでinvalid_argumentがスローされる | E-03 | ○ |
| C-19 | delayが0以下でinvalid_argumentがスローされる | E-03 | ○ |
| C-20 | delayが最小正値で正常に構築される | E-03 | ○ |
| C-21 | leading=trueで初回呼び出し時に即座に関数が実行される | E-03 | ○ |
| C-22 | trailing=trueでタイマー満了後に関数が実行される | E-03 | ○ |
| C-23 | タイマー実行中の再Run呼び出しで引数が更新される | E-03 | ○ |
| C-24 | debounce=trueでタイマーがリセットされる | E-03 | ○ |
| C-25 | ModifyPendingが保留中引数を変更する | E-03 | ○ |
| C-26 | ModifyPendingが保留中引数なし時にfuncを呼ばない | E-03 | ○ |
| C-27 | SafeDispatcherTimerがタイマー未作成時にfalseを返す | E-04 | ○ |
| C-28 | SafeDispatcherTimerがタイマー作成後にtrueを返す | E-04 | ○ |
| C-29 | Interval getterが設定済みの値を返す | E-04 | ○ |
| C-30 | Interval setterが値を設定する | E-04 | ○ |
| C-31 | Interval設定時にタイマーが遅延作成される | E-04 | ○ |
| C-32 | IsEnabledがStart前にfalseを返す | E-04 | ○ |
| C-33 | IsEnabledがStart後にtrueを返す | E-04 | ○ |
| C-34 | IsEnabledがStop後にfalseを返す | E-04 | ○ |
| C-35 | Tickでイベントハンドラが登録される | E-04 | ○ |
| C-36 | Tickで既存ハンドラが置き換えられる | E-04 | ○ |
| C-37 | Startでタイマーが開始される | E-04 | ○ |
| C-38 | Stopでタイマーが停止される | E-04 | ○ |
| C-39 | タイマー未作成時のStopが安全に動作する | E-04 | ○ |
| C-40 | Destroyでタイマーが破棄されハンドラが解除される | E-04 | ○ |
| C-41 | タイマー未作成時のDestroyが安全に動作する | E-04 | ○ |
| C-42 | デストラクタでDestroyが呼ばれる | E-04 | ○ |
| C-43 | FilePickerがsaveDialog=falseでCLSID_FileOpenDialogを作成する | E-05 | ○ |
| C-44 | FilePickerがsaveDialog=trueでCLSID_FileSaveDialogを作成する | E-05 | ○ |
| C-45 | ファイル選択成功時にパスが返却される | E-05 | ○ |
| C-46 | キャンセル時に空文字列が返却される | E-05 | ○ |
| C-47 | Showの失敗時(キャンセル以外)に例外がスローされる | E-05 | ○ |
| C-48 | FOS_FORCEFILESYSTEM等のオプションが設定される | E-05 | ○ |
| C-49 | OpenFilePickerがsaveDialog=falseでFilePickerを呼ぶ | E-05 | ○ |
| C-50 | SaveFilePickerがsaveDialog=trueでFilePickerを呼ぶ | E-05 | ○ |
| C-51 | OpenImagePickerが画像フィルタ付きでファイルピッカーを開く | E-06 | ○ |
| C-52 | OpenImagePickerのデフォルトフォルダがPicturesLibraryに設定される | E-06 | △ |
| C-53 | ThemeLookupがDefault時にres.Lookupの結果を返す | E-05 | ○ |
| C-54 | ThemeLookupがDark時にDark辞書から検索する | E-05 | ○ |
| C-55 | ThemeLookupがLight時にLight辞書から検索する | E-05 | ○ |
| C-56 | テーマ辞書にキーなし時にデフォルトLookupにフォールバックする | E-05 | ○ |
| C-57 | MUXリソース辞書(Source付き)がスキップされる | E-05 | ○ |
| C-58 | IsPackagedがパッケージ化アプリでtrueを返す | E-07 | ○ |
| C-59 | IsPackagedが非パッケージアプリでfalseを返す | E-07 | ○ |
| C-60 | IsDevBuildがWindowsTerminalDevパッケージでtrueを返す | E-07 | ○ |
| C-61 | IsDevBuildが非Devパッケージでfalseを返す | E-07 | ○ |
| C-62 | IsDevBuildが非パッケージ時にtrueを返す | E-07 | ○ |
| C-63 | GetWtExePathがDevビルドでwtd.exeを返す | E-07 | ○ |
| C-64 | GetWtExePathがリリースビルドでwt.exeを返す | E-07 | ○ |
| C-65 | GetWtExePathが非パッケージでWindowsTerminal.exeを返す | E-07 | ○ |
| C-66 | GetWtExePathが全パス解決失敗時にwt.exeをフォールバック返却する | E-07 | ○ |
| C-67 | GetWtExePathがstatic変数でキャッシュされる | E-07 | ○ |
| C-68 | QuoteAndEscapeCommandlineArgが通常文字列をクォートで囲む | E-07 | ○ |
| C-69 | バックスラッシュがそのまま保持される | E-07 | ○ |
| C-70 | ダブルクォートがエスケープされる | E-07 | ○ |
| C-71 | セミコロンがエスケープされる | E-07 | ○ |
| C-72 | 末尾バックスラッシュが倍増される | E-07 | ○ |
| C-73 | ダブルクォート前のバックスラッシュが倍増される | E-07 | ○ |
| C-74 | 空文字列が空のクォート付き文字列になる | E-07 | ○ |
| C-75 | スペース含有文字列が正しくクォートされる | E-07 | ○ |
| C-76 | ワンライナー版QuoteAndEscapeCommandlineArgが正しく動作する | E-07 | ○ |
| C-77 | 返却値のcapacityがarg.size()+2以上である | E-07 | ○ |
| C-78 | GetLibraryResourceLoaderが有効なScopedResourceLoaderを返す | E-09 | ○ |
| C-79 | GetLibraryResourceLoaderが複数回呼び出しで同一オブジェクトを返す | E-09 | ○ |
| C-80 | GetLibraryResourceStringが存在するリソースキーで文字列を取得する | E-09 | ○ |
| C-81 | GetLibraryResourceStringが存在しないリソースキーでFAIL_FASTする | E-09 | △ |
| C-82 | HasLibraryResourceWithNameが存在するキーでtrueを返す | E-09 | ○ |
| C-83 | HasLibraryResourceWithNameが存在しないキーでfalseを返す | E-09 | ○ |
| C-84 | EnsureAllResourcesArePresentが全リソース存在時に正常完了する | E-09 | △ |
| C-85 | EnsureAllResourcesArePresentがリソース不在時にFAIL_FASTする | E-09 | △ |
| C-86 | RS_fmt_implがフォーマット文字列にパラメータを正しく埋め込む | E-08 | △ |
| C-87 | RS_fmt_implが複数パラメータを正しく埋め込む | E-08 | △ |
| C-88 | RS_fmt_implがパラメータ不足時にfmt例外をスローする | E-08 | ○ |

## 4) 不足情報（Unknown / Missing）
- **C-52**: `SHGetKnownFolderItem(FOLDERID_PicturesLibrary, ...)` の呼び出しはOSの状態に依存し、テスト環境でPicturesLibraryが利用可能かどうか不確実。CATCH_LOG()で非致命的として処理されているため、テストでのモック方法の検討が必要。
  - 候補：COM モック / テスト用フォルダ / 環境依存テストとしてスキップ
- **C-81**: `GetLibraryResourceString` は `CATCH_FAIL_FAST()` マクロでラップされており、FAIL_FASTの発生条件はWILライブラリの実装に依存。テストでの検証方法の検討が必要。
  - 候補：プロセス終了テスト / 例外キャッチによる代替検証 / デバッガアタッチテスト
- **C-84, C-85**: `EnsureAllResourcesArePresent` はDebugビルド専用コードで、リンカのセクション配置 (`.util$res$a`〜`.util$res$z`) に依存する。テスト環境でのセクション配置の再現は困難。
  - 候補：Debugビルド専用の統合テスト / セクション配置を模擬するテスト
- **C-86, C-87**: `RS_fmt_impl` は `fmt::format(fmt::runtime(...))` を使用するが、実際のフォーマット文字列はリソースファイルから動的に取得されるため、テスト用リソースの準備が必要。
  - 候補：テスト用リソースファイル / GetLibraryResourceStringのモック

## 5) リスクフラグ（レビュー観点）
- **2: 高リスク** - `FAIL_FAST`/`CATCH_FAIL_FAST()`を使用する関数群（GetLibraryResourceString, GetLibraryResourceLoader, EnsureAllResourcesArePresent）: プロセス終了が発生するため、テストフレームワーク側での対応が必要
- **1: 中リスク** - WinRT/COMに依存する関数群（FilePicker, OpenImagePicker, ScopedResourceLoader）: COMの初期化やWinRTコンポーネントのモック化が必要
- **1: 中リスク** - DispatcherQueue依存（ThrottledFunc, SafeDispatcherTimer）: UIスレッドのディスパッチャーキューのモック化が必要
- **1: 中リスク** - 静的変数（magic static）を使用する関数（IsPackaged, IsDevBuild, GetWtExePath, GetLibraryResourceLoader）: テスト間の状態分離が困難
- **0: 低リスク** - 純粋関数（QuoteAndEscapeCommandlineArg）: 外部依存なし、容易にテスト可能

## 6) レビュアーチェックリスト（最小）
- [ ] QuoteAndEscapeCommandlineArgのエスケープ処理が、Windowsのコマンドライン解析仕様と一致しているか確認
- [ ] ThrottledFuncのスレッド安全性（_lockの使用箇所）がテストケースで十分にカバーされているか確認
- [ ] SafeDispatcherTimerのDestroy処理で、Tickハンドラの解除漏れがないかテストケースで確認されているか
- [ ] FAIL_FAST系関数のテストが実行環境で安全に実行可能か確認（プロセス終了テストの方法）
- [ ] ThemeLookupのテーマ辞書検索ロジックで、複数のMergedDictionaries内の順序がテストされているか確認
- [ ] GetWtExePathのパス生成ロジックで、LocalAppDataAppsPathの環境変数展開がテストされているか確認
