---
generated_at: 2026-03-01 12:00:00
metrics:
  claims_total: 68
  claims_with_evidence: 64
  claims_without_evidence: 4
confidence_derived: 0.94
---

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

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.94**
  - 根拠あり：64 / 68、根拠なし：4
- 優先レビュー（高）
  1. **C-18（punycodeツールチップ）**：IDNドメインの具体的な挙動はコード上try-catch内で処理されており、実際のpunycode/unicode比較の振る舞いは実行環境依存
  2. **C-47（textFromCmarkString）**：テンプレート関数であり、cmark内部構造体の詳細仕様は外部ライブラリ依存
  3. **C-62（tight list判定）**：cmark_node_get_list_tightの戻り値に依存し、cmarkライブラリの内部仕様確認が必要
  4. **C-63（loose list判定）**：同上

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

- E-01: `src/cascadia/UIMarkdown/MarkdownToXaml.h` - MarkdownToXamlクラス定義（メンバ変数・メソッド宣言）
- E-02: `src/cascadia/UIMarkdown/MarkdownToXaml.cpp` - MarkdownToXaml実装（Convert, _RenderNode, ヘルパー関数等）
- E-03: `src/cascadia/UIMarkdown/Builder.h` - Builder WinRTクラス定義
- E-04: `src/cascadia/UIMarkdown/Builder.cpp` - Builder実装（Convert: u16u8変換 + MarkdownToXaml呼び出し）
- E-05: `src/cascadia/UIMarkdown/Builder.idl` - Builder IDL定義（WinRT公開API仕様）
- E-06: `src/cascadia/UIMarkdown/CodeBlock.h` - CodeBlockクラス定義（プロパティ・イベント宣言）
- E-07: `src/cascadia/UIMarkdown/CodeBlock.cpp` - CodeBlock実装（コンストラクタ、_playPressed）
- E-08: `src/cascadia/UIMarkdown/CodeBlock.idl` - CodeBlock IDL定義（WinRT公開API仕様）
- E-09: `src/cascadia/UIMarkdown/CodeBlock.xaml` - CodeBlock XAML UI定義
- E-10: `src/cascadia/UIMarkdown/init.cpp` - DllMain実装
- E-11: `src/cascadia/UIMarkdown/pch.h` - プリコンパイル済みヘッダー（依存ライブラリ一覧）

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | Builder::Convertが有効なMarkdownからRichTextBlockを生成する | E-03, E-04 | ○ |
| C-02 | 空文字列入力で空のRichTextBlockが返る | E-04, E-02 | ○ |
| C-03 | baseUrlが空でも変換が成功する | E-04, E-02 (L72-78) | ○ |
| C-04 | UTF-16からUTF-8変換がtil::u16u8で行われる | E-04 (L12) | ○ |
| C-05 | H1見出しのフォントサイズが30である | E-02 (L27, L244) | ○ |
| C-06 | H2見出しのフォントサイズが24である | E-02 (L27, L244) | ○ |
| C-07 | H6でHeaderMinFontSize(16)を下回らない | E-02 (L27-28, L244: std::max) | ○ |
| C-08 | 太字がBoldフォントウェイトで描画される | E-02 (L370-372) | ○ |
| C-09 | 太字終了後にNormalに戻る | E-02 (L370-372) | ○ |
| C-10 | イタリックがItalicフォントスタイルで描画される | E-02 (L376-378) | ○ |
| C-11 | イタリック終了後にNormalに戻る | E-02 (L376-378) | ○ |
| C-12 | インラインコードがCodeFontFamilyで描画される | E-02 (L29, L348-358) | ○ |
| C-13 | インラインコード後にルートFontFamilyに戻る | E-02 (L357) | ○ |
| C-14 | コードブロックがCodeBlockコントロールで描画される | E-02 (L249-264) | ○ |
| C-15 | コードブロック末尾改行がトリムされる | E-02 (L254-256) | ○ |
| C-16 | リンクがHyperlinkで描画される | E-02 (L381-421) | ○ |
| C-17 | 相対URLがbaseUrlで解決される | E-02 (L395) | ○ |
| C-18 | punycode/unicode差異時のツールチップ表示 | E-02 (L400-405) | △ |
| C-19 | 不正URLリンクで例外が発生しない | E-02 (L408-410: catch(...)) | ○ |
| C-20 | 画像がImageコントロールで描画される | E-02 (L424-453) | ○ |
| C-21 | 画像altテキストがToolTipに設定される | E-02 (L310-313) | ○ |
| C-22 | 不正画像URLで例外が発生しない | E-02 (L445-447: catch(...)) | ○ |
| C-23 | レベル1リストが丸ビュレットで描画される | E-02 (L19-23, L226) | ○ |
| C-24 | レベル2リストが白丸ビュレットで描画される | E-02 (L19-23, L226) | ○ |
| C-25 | レベル3以上が黒四角ビュレットで描画される | E-02 (L226: std::clamp(_, 0, 2)) | ○ |
| C-26 | リスト内ParagraphにインデントMarginが設定される | E-02 (L86-97) | ○ |
| C-27 | ブロック引用がインデントされる | E-02 (L174-198) | ○ |
| C-28 | ブロック引用終了時にインデントが0未満にならない | E-02 (L196-197: std::max(0, ...)) | ○ |
| C-29 | LinebreakがLineBreak要素として挿入される | E-02 (L324-327) | ○ |
| C-30 | SoftbreakがスペースRunとして処理される | E-02 (L329-345) | ○ |
| C-31 | HTMLブロックが無視される | E-02 (L267-271) | ○ |
| C-32 | インラインHTMLが無視される | E-02 (L361-363) | ○ |
| C-33 | 水平線が無視される | E-02 (L277-279) | ○ |
| C-34 | RichTextBlockがテキスト選択可能 | E-02 (L76) | ○ |
| C-35 | WrapWholeWordsが設定される | E-02 (L77) | ○ |
| C-36 | ContextFlyout(TextMenuFlyout)が設定される | E-02 (L75) | ○ |
| C-37 | _CurrentParagraphが遅延初期化される | E-02 (L80-101) | ○ |
| C-38 | 既存Paragraphが再利用される | E-02 (L82-83, L100) | ○ |
| C-39 | インデント中にTextIndentとMarginが設定される | E-02 (L85-97) | ○ |
| C-40 | ブロック引用のみの場合TextIndentが設定されない | E-02 (L92-93) | ○ |
| C-41 | _NewRunがnull時に_CurrentRun()を呼ぶ | E-02 (L120-125) | ○ |
| C-42 | _NewRunがフォント属性を引き継ぐ | E-02 (L126-139) | ○ |
| C-43 | _EndRunが_lastRunをnullptrにする | E-02 (L141-144) | ○ |
| C-44 | _EndSpanが_EndRunを呼び_lastSpanをnullptrにする | E-02 (L145-149) | ○ |
| C-45 | _EndParagraphが_EndSpanを呼び_lastParagraphをnullptrにする | E-02 (L150-154) | ○ |
| C-46 | _makeDefaultTextBlockの設定値 | E-02 (L156-163) | ○ |
| C-47 | textFromCmarkStringのstring_view変換 | E-02 (L31-35) | △ |
| C-48 | textFromLiteralがcmark_node_get_literalを呼ぶ | E-02 (L36-39) | ○ |
| C-49 | textFromUrlがcmark_node_get_urlを呼ぶ | E-02 (L40-43) | ○ |
| C-50 | CodeBlockコンストラクタがCommandlinesを設定 | E-07 (L19-22) | ○ |
| C-51 | 空文字列でCodeBlock初期化 | E-07 (L19-22) | ○ |
| C-52 | 複数行コマンドでCodeBlock初期化 | E-07 (L19-22) | ○ |
| C-53 | _playPressedがRequestRunCommandsイベントを発火 | E-07 (L23-29) | ○ |
| C-54 | _playPressedがHandled=trueを設定 | E-07 (L28) | ○ |
| C-55 | RequestRunCommandsArgsに現在のCommandlinesが渡される | E-07 (L26-27) | ○ |
| C-56 | PlayButtonVisibilityの初期値がCollapsed | E-06 (L23) | ○ |
| C-57 | PlayButtonVisibility変更時にPropertyChanged発火 | E-06 (L23: WINRT_OBSERVABLE_PROPERTY) | ○ |
| C-58 | Commandlinesプロパティの取得・設定 | E-06 (L18) | ○ |
| C-59 | RequestRunCommandsArgsコンストラクタ | E-06 (L31-34) | ○ |
| C-60 | 複合Markdownテキストの統合描画 | E-02 (全体) | ○ |
| C-61 | 見出し前に空Paragraphが挿入される | E-02 (L241) | ○ |
| C-62 | tight listの場合にParagraphが分割されない | E-02 (L281-304) | △ |
| C-63 | loose listの場合にParagraphが分割される | E-02 (L281-304) | △ |
| C-64 | 空Markdownで空のRichTextBlockが返る | E-02 (L56-70) | ○ |
| C-65 | 画像終了時に_lastImageがnullptrにリセット | E-02 (L450-452) | ○ |
| C-66 | リンク終了時に_EndSpanが呼ばれる | E-02 (L419-421) | ○ |
| C-67 | DLL_PROCESS_ATTACHでDisableThreadLibraryCallsが呼ばれTRUEが返る | E-10 (L7-21) | ○ |
| C-68 | DLL_PROCESS_DETACHでTRUEが返る | E-10 (L7-21) | ○ |

## 4) 不足情報（Unknown / Missing）
- **C-18（punycodeツールチップ）**: IDNドメインを含むURLの実際の挙動はWindows.Foundation.Uriの実装に依存しており、コード上はAbsoluteUri/AbsoluteCanonicalUriの比較ロジックが確認できるが、実際のpunycode変換結果はランタイム環境依存
  - 候補：Windows.Foundation.Uriドキュメント / IDNテスト用URL / 実機テスト
- **C-47（textFromCmarkString）**: テンプレート関数で、引数の型がcmark内部構造体（data/lenメンバ）であり、cmarkライブラリのヘッダーファイルが参照できない状態では完全な検証が困難
  - 候補：cmark/cmark.h / cmarkドキュメント / libcmarkソースコード
- **C-62, C-63（tight/loose list判定）**: cmark_node_get_list_tightの返却値によりParagraphの分割制御が変わるが、cmarkライブラリ側の判定基準の詳細仕様が未確認
  - 候補：cmarkドキュメント / CommonMark仕様書 / libcmarkソースコード

## 5) リスクフラグ（レビュー観点）
- **リスク1（中）**: cmarkライブラリ依存部分（textFromCmarkString, tight/loose判定）はcmarkのバージョンアップで挙動が変わる可能性がある
- **リスク0（低）**: CodeBlock._playPressedのイベント発火は単純な処理であり、テスト容易性が高い
- **リスク1（中）**: URL解決（リンク・画像）ではcatch(...)で全例外を捕捉しているため、特定エラー種別のテストが困難
- **リスク0（低）**: DllMainは標準的なDLL初期化パターンであり、特殊なリスクはない

## 6) レビュアーチェックリスト（最小）
- [ ] MarkdownToXaml::Convertの各ノードタイプ（HEADING, STRONG, EMPH, CODE, CODE_BLOCK, LINK, IMAGE, LIST, BLOCK_QUOTE等）に対するテストケースが網羅されているか
- [ ] CodeBlockのコンストラクタとイベント発火（_playPressed）のテストケースが適切か
- [ ] Builder::Convertのu16u8変換を経由した呼び出しチェーンが正しくテストされているか
- [ ] 境界値テスト（H6フォントサイズ下限、リスト3段ネスト、インデント0未満防止）が妥当か
- [ ] 異常系テスト（不正URL、空入力）のカバレッジが十分か
- [ ] cmarkライブラリ依存部分（tight/loose list、textFromCmarkString）のテスト可能性を確認したか
- [ ] 未サポート要素（HTML_BLOCK, HTML_INLINE, THEMATIC_BREAK）の無視動作テストが必要か検討したか
