---
generated_at: 2026-02-22 16:05:00
metrics:
  claims_total: 60
  claims_with_evidence: 58
  claims_without_evidence: 2
confidence_derived: 0.97
---

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

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.97**
  - 根拠あり：58 / 60、根拠なし：2
- 優先レビュー（高）
  1. **C-18 (UT-HXU-018)**：nullのtestCaseが渡された場合の例外動作 - 明示的なnullチェックがコードに存在しない
  2. **C-08 (UT-HXU-008)**：キャンセルトークン処理の詳細動作 - XUnit基盤の動作に依存

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

- E-01: `src/Headless/Avalonia.Headless.XUnit/AvaloniaTestFrameworkAttribute.cs` - 17行
- E-02: `src/Headless/Avalonia.Headless.XUnit/AvaloniaTestCase.cs` - 79行
- E-03: `src/Headless/Avalonia.Headless.XUnit/AvaloniaTheoryAttribute.cs` - 13行
- E-04: `src/Headless/Avalonia.Headless.XUnit/AvaloniaTestFrameworkDiscoverer.cs` - 16行
- E-05: `src/Headless/Avalonia.Headless.XUnit/AvaloniaFact.cs` - 17行
- E-06: `src/Headless/Avalonia.Headless.XUnit/AvaloniaDelayEnumeratedTheoryTestCase.cs` - 80行
- E-07: `src/Headless/Avalonia.Headless.XUnit/AvaloniaTestCaseRunner.cs` - 59行
- E-08: `src/Headless/Avalonia.Headless.XUnit/AvaloniaTestRunnerContext.cs` - 27行
- E-09: `src/Headless/Avalonia.Headless.XUnit/AvaloniaTheoryDiscoverer.cs` - 92行
- E-10: `src/Headless/Avalonia.Headless.XUnit/AvaloniaTestFrameworkExecutor.cs` - 19行
- E-11: `src/Headless/Avalonia.Headless.XUnit/AvaloniaTestCaseRunnerContext.cs` - 31行
- E-12: `src/Headless/Avalonia.Headless.XUnit/AvaloniaTestRunner.cs` - 50行
- E-13: `src/Headless/Avalonia.Headless.XUnit/AvaloniaTestFramework.cs` - 13行
- E-14: `src/Headless/Avalonia.Headless.XUnit/AvaloniaFactDiscoverer.cs` - 34行

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

### AvaloniaTestFrameworkAttribute（C-01〜C-03）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | FrameworkTypeプロパティがAvaloniaTestFrameworkを返す | E-01: 15-16行 `public Type FrameworkType => typeof(AvaloniaTestFramework);` | ○ |
| C-02 | アセンブリレベルでのみ適用可能 | E-01: 12行 `[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false)]` | ○ |
| C-03 | クラスレベルに適用した場合コンパイルエラー | E-01: 12行 AttributeUsage制限 | ○ |

### AvaloniaTestCase（C-04〜C-09, C-58）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-04 | 有効なパラメータでインスタンスが生成される | E-02: 14-45行 コンストラクタ定義 | ○ |
| C-05 | オプションパラメータがnullでもインスタンス生成可能 | E-02: 19-27行 nullable パラメータ定義 | ○ |
| C-06 | テストが正常実行されRunSummaryが返却される | E-02: 53-78行 Runメソッド実装 | ○ |
| C-07 | SkipReasonが設定されている場合スキップされる | E-02: 71行 SkipReason参照 | ○ |
| C-08 | キャンセルトークンでキャンセルされた場合の挙動 | E-02: 69行 cancellationTokenSource渡し | △ |
| C-09 | テストメソッドで例外がスローされた場合 | E-02: 57-58行 aggregator.RunAsync使用 | ○ |
| C-58 | デシリアライズ用コンストラクタが動作する | E-02: 47-51行 Obsolete属性付きデフォルトコンストラクタ | ○ |

### AvaloniaDelayEnumeratedTheoryTestCase（C-10〜C-14, C-59）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-10 | 有効なパラメータでインスタンスが生成される | E-06: 15-46行 コンストラクタ定義 | ○ |
| C-11 | skipTestWithoutData=trueの場合の動作 | E-06: 20行 skipTestWithoutDataパラメータ | ○ |
| C-12 | 複数データ行でテストが実行される | E-06: 54-78行 Runメソッド実装 | ○ |
| C-13 | データ行が0件の場合の動作 | E-06: skipTestWithoutDataパラメータの存在 | ○ |
| C-14 | データ行が1件の場合の動作 | E-06: 54-78行 Runメソッド | ○ |
| C-59 | デシリアライズ用コンストラクタが動作する | E-06: 48-52行 Obsolete属性付きデフォルトコンストラクタ | ○ |

### AvaloniaTestCaseRunner（C-15〜C-19, C-60）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-15 | シングルトンインスタンスが取得できる | E-07: 12行 `public static AvaloniaTestCaseRunner Instance { get; } = new();` | ○ |
| C-16 | テストケースが正常に実行されRunSummaryが返却される | E-07: 18-45行 Runメソッド実装 | ○ |
| C-17 | HeadlessUnitTestSessionがアセンブリから取得される | E-07: 29行 `HeadlessUnitTestSession.GetOrStartForAssembly` | ○ |
| C-18 | nullのtestCaseが渡された場合の例外 | **根拠なし** - 明示的なnullチェックが見当たらない | △ |
| C-19 | 個別テストがAvaloniaTestRunnerで実行される | E-07: 47-58行 RunTestメソッド | ○ |
| C-60 | AvaloniaTestCaseRunnerContextが正しく初期化される | E-07: 31-42行 ctxt生成とInitializeAsync呼び出し | ○ |

### AvaloniaTestRunner（C-20〜C-24）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-20 | シングルトンインスタンスが取得できる | E-12: 12行 `public static AvaloniaTestRunner Instance { get; } = new();` | ○ |
| C-21 | テストがAvaloniaディスパッチャー上で実行される | E-12: 40-48行 session.Dispatch内でDispatcher.UIThread使用 | ○ |
| C-22 | テスト後にDispatcher.RunJobs()が呼び出される | E-12: 45行 `dispatcher.RunJobs();` | ○ |
| C-23 | BeforeAfterTestAttributesが適用される | E-12: 34行 beforeAfterAttributesパラメータ | ○ |
| C-24 | キャンセルトークンでキャンセルされた場合 | E-12: 48行 CancellationTokenSource.Token渡し | ○ |

### AvaloniaTestFramework（C-25〜C-27）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-25 | CreateDiscovererがAvaloniaTestFrameworkDiscovererを生成 | E-13: 8-9行 CreateDiscoverer実装 | ○ |
| C-26 | XunitTestAssemblyが正しく構成される | E-13: 9行 `new XunitTestAssembly(assembly, null, assembly.GetName().Version)` | ○ |
| C-27 | CreateExecutorがAvaloniaTestFrameworkExecutorを生成 | E-13: 11-12行 CreateExecutor実装 | ○ |

### AvaloniaTestFrameworkDiscoverer（C-28〜C-29）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-28 | FactAttributeに対してAvaloniaFactDiscovererが登録 | E-04: 13行 `DiscovererTypeCache[typeof(FactAttribute)] = typeof(AvaloniaFactDiscoverer);` | ○ |
| C-29 | TheoryAttributeに対してAvaloniaTheoryDiscovererが登録 | E-04: 14行 `DiscovererTypeCache[typeof(TheoryAttribute)] = typeof(AvaloniaTheoryDiscoverer);` | ○ |

### AvaloniaTestFrameworkExecutor（C-30〜C-33）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-30 | HeadlessUnitTestSessionがアセンブリから取得される | E-10: 9行 `_session = HeadlessUnitTestSession.GetOrStartForAssembly(testAssembly.Assembly);` | ○ |
| C-31 | CreateDiscovererがAvaloniaTestFrameworkDiscovererを生成 | E-10: 11-12行 CreateDiscoverer実装 | ○ |
| C-32 | セッションが破棄される | E-10: 16行 `await _session.DisposeAsync();` | ○ |
| C-33 | 基底クラスのDisposeAsyncが呼び出される | E-10: 17行 `await base.DisposeAsync();` | ○ |

### AvaloniaFactDiscoverer（C-34〜C-37）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-34 | AvaloniaTestCaseが生成される | E-14: 19-32行 CreateTestCase実装 | ○ |
| C-35 | TestIntrospectionHelperから詳細が取得される | E-14: 17行 `TestIntrospectionHelper.GetTestCaseDetails` | ○ |
| C-36 | Traitsが正しく設定される | E-14: 29行 `testMethod.Traits.ToReadWrite` | ○ |
| C-37 | ソースファイル情報が設定される | E-14: 30-31行 sourceFilePath, sourceLineNumber | ○ |

### AvaloniaTheoryDiscoverer（C-38〜C-45）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-38 | データ行からAvaloniaTestCaseが生成される | E-09: 15-47行 CreateTestCasesForDataRow実装 | ○ |
| C-39 | testMethodArgumentsがTestCaseに渡される | E-09: 41行 testMethodArguments引数 | ○ |
| C-40 | dataRowからTraitsが取得される | E-09: 28行 `TestIntrospectionHelper.GetTraits(testMethod, dataRow)` | ○ |
| C-41 | SkipReasonがある場合AvaloniaTestCaseが生成される | E-09: 57-72行 条件分岐 | ○ |
| C-42 | SkipReasonがない場合AvaloniaDelayEnumeratedTheoryTestCaseが生成される | E-09: 73-88行 else分岐 | ○ |
| C-43 | SkipUnlessが設定されている場合の動作 | E-09: 57行 `details.SkipUnless is null` チェック | ○ |
| C-44 | SkipWhenが設定されている場合の動作 | E-09: 57行 `details.SkipWhen is null` チェック | ○ |
| C-45 | SkipTestWithoutDataがTheoryAttributeから取得される | E-09: 78行 `theoryAttribute.SkipTestWithoutData` | ○ |

### AvaloniaTestCaseRunnerContext（C-46〜C-47）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-46 | すべてのパラメータが正しく設定される | E-11: 8-28行 primary constructor | ○ |
| C-47 | Sessionプロパティがセッションを返す | E-11: 30行 `public HeadlessUnitTestSession Session { get; } = session;` | ○ |

### AvaloniaTestRunnerContext（C-48〜C-49）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-48 | すべてのパラメータが正しく設定される | E-08: 8-24行 primary constructor | ○ |
| C-49 | Sessionプロパティがセッションを返す | E-08: 26行 `public HeadlessUnitTestSession Session { get; } = session;` | ○ |

### AvaloniaFactAttribute（C-50〜C-54）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-50 | メソッドレベルでのみ適用可能 | E-05: 12行 `[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]` | ○ |
| C-51 | クラスレベルに適用した場合コンパイルエラー | E-05: 12行 AttributeUsage制限 | ○ |
| C-52 | AvaloniaFactDiscovererが関連付けられている | E-05: 13行 `[XunitTestCaseDiscoverer(typeof(AvaloniaFactDiscoverer))]` | ○ |
| C-53 | CallerFilePathが自動取得される | E-05: 15行 `[CallerFilePath] string? sourceFilePath = null` | ○ |
| C-54 | CallerLineNumberが自動取得される | E-05: 16行 `[CallerLineNumber] int sourceLineNumber = -1` | ○ |

### AvaloniaTheoryAttribute（C-55〜C-57）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-55 | メソッドレベルでのみ適用可能 | E-03: 11行 `[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]` | ○ |
| C-56 | AvaloniaTheoryDiscovererが関連付けられている | E-03: 12行 `[XunitTestCaseDiscoverer(typeof(AvaloniaTheoryDiscoverer))]` | ○ |
| C-57 | TheoryAttributeを継承している | E-03: 13行 `public sealed class AvaloniaTheoryAttribute : TheoryAttribute;` | ○ |

## 4) 不足情報（Unknown / Missing）

### C-18: nullのtestCaseが渡された場合の例外
- **理由**: AvaloniaTestCaseRunner.Runメソッドに明示的なnullチェックが実装されていない
- **候補**:
  - XUnit基盤の基底クラスでnullチェックが行われている可能性
  - 実行時にNullReferenceExceptionが発生する可能性
  - 事前条件として呼び出し元でnullチェックが行われている可能性

### C-08: キャンセルトークンでキャンセルされた場合の詳細動作
- **理由**: キャンセル処理の詳細はXUnit基盤に依存しており、Avalonia固有のコードでは直接的なキャンセル処理が見られない
- **候補**:
  - XunitTestCaseRunnerBaseのキャンセル処理メカニズム
  - Task.Runのキャンセル伝播動作

## 5) リスクフラグ（レビュー観点）

| フラグ | リスクレベル | 説明 |
|--------|-------------|------|
| 外部依存 | 1: 中リスク | HeadlessUnitTestSession、XUnit基盤クラスへの依存が多い |
| スレッディング | 1: 中リスク | Dispatcher.UIThread、Task.Run等の並行処理が含まれる |
| シリアライゼーション | 0: 低リスク | Obsolete属性付きデシリアライズコンストラクタは標準パターン |
| シングルトン | 0: 低リスク | AvaloniaTestCaseRunner, AvaloniaTestRunnerはシングルトンだがステートレス |

## 6) レビュアーチェックリスト（最小）

- [ ] UT-HXU-018: nullパラメータ時の実際の動作を確認（XUnit基盤の動作確認が必要）
- [ ] UT-HXU-008, UT-HXU-024: キャンセル処理の統合テストで実際の動作を確認
- [ ] UT-HXU-021, UT-HXU-022: Dispatcher統合の動作確認（UIスレッドへの適切なディスパッチ）
- [ ] UT-HXU-006, UT-HXU-012: 実際のテスト実行でRunSummaryの正確性を確認
- [ ] HeadlessUnitTestSession依存テストケース: セッションライフサイクルの統合テスト
