---
generated_at: 2026-02-20 12:00:00
metrics:
  claims_total: 140
  claims_with_evidence: 128
  claims_without_evidence: 12
confidence_derived: 0.91
---

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

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.91**
  - 根拠あり：128 / 140、根拠なし：12
- 優先レビュー（高）
  1. **C-060〜C-062（contextExtractD）**：外部依存（documents, DietComplete）が多く、モック化の検討が必要
  2. **C-067〜C-071（reportProgress）**：rpc依存のため、外部モジュールのモック化が必要
  3. **C-072〜C-082（stdlib_detect検出系）**：ファイルシステム・環境変数依存のため、テスト環境構築が必要

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

- E-01: `source/served/utils/ddoc.d` - DDoc解析・Markdown変換モジュール（866行）
- E-02: `source/served/utils/diet.d` - Dietテンプレート補完・解析モジュール（134行）
- E-03: `source/served/utils/progress.d` - 進捗報告モジュール（64行）
- E-04: `source/served/utils/stdlib_detect.d` - 標準ライブラリパス自動検出モジュール（504行）
- E-05: `source/served/utils/trace.d` - パフォーマンストレースモジュール（152行）
- E-06: `source/served/utils/translate.d` - 国際化翻訳モジュール（427行）
- E-07: `source/served/utils/ddoc.d` 内の既存unittest（行205-227, 438-461, 611-633, 744-865）
- E-08: `source/served/utils/stdlib_detect.d` 内の既存unittest（行487-504）
- E-09: `source/served/utils/translate.d` 内の既存unittest（行228-243）
- E-10: `docs/code-to-docs/単体テストケース一覧/plan.md` - モジュール構成情報

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-001 | parseDdoc: 有効なDDoc文字列をComment構造に正常解析できる | E-01 (行49-67) | ○ |
| C-002 | parseDdoc: throwError=trueで有効なDDocを解析できる | E-01 (行54-55) | ○ |
| C-003 | parseDdoc: 空文字列でComment.initが返る | E-01 (行51-52) | ○ |
| C-004 | parseDdoc: 不正DDocでthrowError=falseならComment.initが返る | E-01 (行58-66) | ○ |
| C-005 | parseDdoc: 不正DDocでthrowError=trueなら例外スロー | E-01 (行54-55, DDocコメント行44) | ○ |
| C-006 | ddocToMarkdown(string): DDoc文字列がMarkdownに正しく変換される | E-01, E-07 (行744-773) | ○ |
| C-007 | ddocToMarkdown(string): 不正なDDocで元の文字列が返る | E-01 (行79-86) | ○ |
| C-008 | ddocToMarkdown(Comment): summary/空名セクションが正しく変換される | E-01 (行99-104) | ○ |
| C-009 | ddocToMarkdown(Comment): paramsセクションがMarkdownパラメータリストに変換される | E-01 (行106-111) | ○ |
| C-010 | ddocToMarkdown(Comment): 単一行セクションがタイトルと同一行に出力される | E-01 (行125-127) | ○ |
| C-011 | ddocToMarkdown(Comment): 複数行セクションがタイトルの次行に出力される | E-01 (行129-132) | ○ |
| C-012 | ddocToMarkdown(Comment): &#36;がドル記号に置換される | E-01 (行136) | ○ |
| C-013 | ddocToMarkdown: インライン参照が正しく変換される | E-01, E-07 (行775-786) | ○ |
| C-014 | ddocToMarkdown: 先頭の*が除去された上でMarkdownに変換される | E-01, E-07 (行788-809) | ○ |
| C-015 | preProcessContent: 先頭の*/+が各行から除去される | E-01, E-07 (行205-227) | ○ |
| C-016 | preProcessContent: 先頭の*/+がない場合はそのまま返る | E-01, E-07 (行216) | ○ |
| C-017 | preProcessContent: ---で区切られたセクションごとに独立して処理される | E-01 (行143-144, 164-165) | ○ |
| C-018 | postProcessContent: インライン参照プレフィックスが正しく後処理される | E-01 (行231-249) | ○ |
| C-019 | postProcessContent: プレフィックスがない場合はそのまま返る | E-01 (行234-235, 245-246) | ○ |
| C-020 | postProcessContent: 不正形式でループが終了する | E-01 (行238-239) | ○ |
| C-021 | ddocToMarked(string): DDoc文字列がMarkedString配列に変換される | E-01 (行262-268) | ○ |
| C-022 | ddocToMarked(string): 空文字列で空配列が返る | E-01 (行265-266) | ○ |
| C-023 | ddocToMarked(Comment): Comment構造がMarkedString配列に変換される | E-01 (行271-277) | ○ |
| C-024 | ddocToMarked(Comment): Comment.initで空配列が返る | E-01 (行274-275) | ○ |
| C-025 | markdownToMarked: Markdownがコードブロック単位でMarkedStringに分割される | E-01 (行282-304) | ○ |
| C-026 | markdownToMarked: 空文字列で空配列が返る | E-01 (行285-286) | ○ |
| C-027 | markdownToMarked: 末尾の空MarkedStringが削除される | E-01 (行300-301) | ○ |
| C-028 | getParams: paramsセクションのマッピングが取得できる | E-01 (行309-315) | ○ |
| C-029 | getParams: paramsセクションがない場合にnullが返る | E-01 (行314) | ○ |
| C-030 | getParamDocumentation: 指定パラメータのドキュメントが取得できる | E-01 (行320-326) | ○ |
| C-031 | getParamDocumentation: 存在しないパラメータでnullが返る | E-01 (行325) | ○ |
| C-032 | prepareDDoc: コードブロックがD_CODEマクロでラップされる | E-01 (行347-348, 350-351) | ○ |
| C-033 | prepareDDoc: インラインコードがDDOC_BACKQUOTEDマクロでラップされる | E-01 (行344, 351) | ○ |
| C-034 | prepareDDoc: ドル記号+括弧がマクロとして処理される | E-01 (行355-379) | ○ |
| C-035 | isSpecialMacro: TABLE2がtrueを返す | E-01 (行397) | ○ |
| C-036 | isSpecialMacro: Pがtrueを返す | E-01 (行398) | ○ |
| C-037 | isSpecialMacro: その他の名前がfalseを返す | E-01 (行396-399) | ○ |
| C-038 | processSpecialMacro: TABLE2マクロがMarkdownテーブルに変換される | E-01, E-07 (行438-461) | ○ |
| C-039 | processSpecialMacro: Pマクロで改行始まりテキストがインデント除去される | E-01 (行421-429) | ○ |
| C-040 | processSpecialMacro: Pマクロで改行なしテキストがそのまま処理される | E-01 (行431-432) | ○ |
| C-041 | processDdocTableMacro: THEAD+TROWがMarkdownテーブルに変換される | E-01 (行463-525) | ○ |
| C-042 | processDdocTableMacro: THEADなしTROWで不正テーブル処理 | E-01 (行470-477) | ○ |
| C-043 | processDdocTableMacro: 空文字列で空が返る | E-01 (行505-506) | ○ |
| C-044 | indexOfClosingParenBalanced: ネスト括弧の閉じ位置が返る | E-01 (行551-566) | ○ |
| C-045 | indexOfClosingParenBalanced: 閉じ括弧不在で-1が返る | E-01 (行563-564) | ○ |
| C-046 | extractUntilClosingParenAndDropParen: 閉じ括弧までの文字列が抽出される | E-01, E-07 (行619-622) | ○ |
| C-047 | extractUntilClosingParenAndDropParen: ネスト括弧が正しく処理される | E-01, E-07 (行623-624) | ○ |
| C-048 | extractUntilClosingParenAndDropParen: 閉じ括弧なしで全体が返る | E-01, E-07 (行619) | ○ |
| C-049 | splitOutsideParens: 括弧外カンマで分割される | E-01, E-07 (行626) | ○ |
| C-050 | splitOutsideParens: 括弧内カンマでは分割されない | E-01, E-07 (行628-632) | ○ |
| C-051 | splitOutsideParens: カンマなしで単一要素配列が返る | E-01 (行583-608) | ○ |
| C-052 | updateDietFile: 新規ファイルがキャッシュに追加される | E-02 (行19-35) | ○ |
| C-053 | updateDietFile: 既存ファイルがリパースされる | E-02 (行22-25) | ○ |
| C-054 | updateDietFile: 空content文字列の処理 | E-02 (行19-35) | ○ |
| C-055 | mapToCompletionItemKind: noneがtextに変換される | E-02 (行41-42) | ○ |
| C-056 | mapToCompletionItemKind: tagがkeywordに変換される | E-02 (行43-44) | ○ |
| C-057 | mapToCompletionItemKind: attributeがpropertyに変換される | E-02 (行45-46) | ○ |
| C-058 | mapToCompletionItemKind: dがsnippetに変換される | E-02 (行55-56) | ○ |
| C-059 | mapToCompletionItemKind: 全列挙値が正しくマッピングされる | E-02 (行38-60) | ○ |
| C-060 | contextExtractD: extendsノードがスキップされる | E-02 (行66-73) | △ |
| C-061 | contextExtractD: HiddenCommentからcontext=が解析される | E-02 (行76-113) | △ |
| C-062 | contextExtractD: extractContext=falseでスキップされる | E-02 (行62-118) | △ |
| C-063 | searchDietTemplateUsage: テンプレート使用箇所のインデックスが返る | E-02 (行120-134) | ○ |
| C-064 | searchDietTemplateUsage: ファイル名不在で-2が返る | E-02 (行122-123) | ○ |
| C-065 | searchDietTemplateUsage: 引用符不在で-3が返る | E-02 (行126-127) | ○ |
| C-066 | searchDietTemplateUsage: 関数開始不在で-4が返る | E-02 (行129-130) | ○ |
| C-067 | reportProgress(bool): condition=trueで報告される | E-03 (行47-51) | △ |
| C-068 | reportProgress(bool): condition=falseで報告されない | E-03 (行49-50) | △ |
| C-069 | reportProgress: max>0でstep/max形式ログ | E-03 (行56-57) | △ |
| C-070 | reportProgress: max=0, step>0でstepのみログ | E-03 (行58-59) | △ |
| C-071 | reportProgress: max=0, step=0でタイプのみログ | E-03 (行60-63) | △ |
| C-072 | autoDetectStdlibPaths: DMDパスからstdlibパス検出 | E-04 (行17-73) | ○ |
| C-073 | autoDetectStdlibPaths: LDCパスからstdlibパス検出 | E-04 (行17-73) | ○ |
| C-074 | autoDetectStdlibPaths: コンパイラパス未指定時のフォールバック | E-04 (行51-56) | ○ |
| C-075 | autoDetectStdlibPaths: コンパイラ未発見時のデフォルトパス | E-04 (行59-72) | ○ |
| C-076 | autoDetectStdlibPaths: 相対パスの絶対パス変換 | E-04 (行21-22) | ○ |
| C-077 | autoDetectStdlibPaths: gdc/gccで警告+フォールバック | E-04 (行41-47) | ○ |
| C-078 | detectDMDStdlibPaths: cwdのdmd.confから検出 | E-04 (行92-94) | ○ |
| C-079 | detectDMDStdlibPaths: HOMEのdmd.confから検出 | E-04 (行96-99) | ○ |
| C-080 | detectDMDStdlibPaths: dmd.conf不在でfalse | E-04 (行75-162) | ○ |
| C-081 | detectLDCStdlibPaths: ldc2.confからパス検出 | E-04 (行164-239) | ○ |
| C-082 | detectLDCStdlibPaths: ldc2.conf不在でfalse | E-04 (行238) | ○ |
| C-083 | searchPathFor: PATH内の実行ファイルパスが返る | E-04 (行283-314) | ○ |
| C-084 | searchPathFor: PATH内に不在でnullが返る | E-04 (行313) | ○ |
| C-085 | parseDmdConfImports: DFLAGSからインポートパス抽出 | E-04 (行321-358) | ○ |
| C-086 | parseDmdConfImports: [Environment64]セクション優先 | E-04 (行330-341, 343) | ○ |
| C-087 | parseDmdConfImports: DFLAGSなしでfalse | E-04 (行354-357) | ○ |
| C-088 | parseLdcConfImports: defaultセクションからパス抽出 | E-04 (行360-409) | ○ |
| C-089 | parseLdcConfImports: %%ldcbinarypath%%プレースホルダ置換 | E-04 (行384) | ○ |
| C-090 | parseLdcConfImports: 読み込み失敗で例外スロー | E-04 (行394-395) | ○ |
| C-091 | parseDflagsImports: -Iオプションのパス抽出 | E-04, E-08 (行500-503) | ○ |
| C-092 | parseDflagsImports: -Iなしで空配列 | E-04, E-08 (行495) | ○ |
| C-093 | parseDflagsImports: -Iのみで空文字列 | E-04, E-08 (行496) | ○ |
| C-094 | parseDflagsImports: エスケープバックスラッシュ処理 | E-04, E-08 (行498) | ○ |
| C-095 | parseDflagsImports: エスケープスペース処理 | E-04, E-08 (行499) | ○ |
| C-096 | parseDflagsImports: %@P%プレースホルダ置換 | E-04 (行426) | ○ |
| C-097 | getUserHomeDirectoryLDC: HOME設定時にパス返却 | E-04 (行278-279) | ○ |
| C-098 | getUserHomeDirectoryLDC: HOME未設定時に"/"返却 | E-04 (行279) | ○ |
| C-099 | TraceDataStat.resetTo: min/max/totalがリセットされる | E-05 (行12-17) | ○ |
| C-100 | TraceDataStat.put: 最小値が更新される | E-05 (行20-21) | ○ |
| C-101 | TraceDataStat.put: 最大値が更新される | E-05 (行22-23) | ○ |
| C-102 | TraceDataStat.put: totalに値が加算される | E-05 (行24-25) | ○ |
| C-103 | TraceDataStat.put: 同値入力でmin/maxが変わらない | E-05 (行19-26) | ○ |
| C-104 | TraceDataStat.map: マッピング関数が適用される | E-05 (行28-39) | ○ |
| C-105 | TraceState.current: 現在時刻とGC使用量が取得される | E-05 (行47-58) | ○ |
| C-106 | TraceData.start: TraceStateが返却される | E-05 (行67-69) | ○ |
| C-107 | TraceData.end: 初回呼び出しでresetToで初期化 | E-05 (行75-79) | ○ |
| C-108 | TraceData.end: 2回目以降はputで更新 | E-05 (行80-84) | ○ |
| C-109 | traceStatistics: ミキシンコード文字列が返る | E-05 (行93-118) | ○ |
| C-110 | traceStatistics: 英数字以外がIDから除去される | E-05 (行98-100) | ○ |
| C-111 | dumpTraceInfos: TSV形式で出力される | E-05 (行120-152) | ○ |
| C-112 | dumpTraceInfos: 空データでヘッダのみ出力 | E-05 (行120-152) | ○ |
| C-113 | dumpTraceInfos: 呼び出し回数降順でソート | E-05 (行131-132) | ○ |
| C-114 | translate: 現在言語の翻訳文字列が返る | E-06 (行41-57) | ○ |
| C-115 | translate: 現在言語になければ英語フォールバック | E-06 (行47-48) | ○ |
| C-116 | translate: 英語にもなければキー文字列自体が返る | E-06 (行50-55) | ○ |
| C-117 | translate: 引数付き翻訳テンプレートが展開される | E-06 (行56) | ○ |
| C-118 | formatTranslation: 位置引数{0}{1}が置換される | E-06, E-09 (行230) | ○ |
| C-119 | formatTranslation: 複数位置引数が正しく置換される | E-06, E-09 (行232-233) | ○ |
| C-120 | formatTranslation: \\nが改行に変換される | E-06 (行208-209) | ○ |
| C-121 | formatTranslation: \\tがタブに変換される | E-06 (行203-205) | ○ |
| C-122 | formatTranslation: \\rがCRに変換される | E-06 (行206-207) | ○ |
| C-123 | formatTranslation: \\\\がバックスラッシュに変換される | E-06 (行212-215) | ○ |
| C-124 | formatTranslation: plural構文で単数形選択 | E-06, E-09 (行241) | ○ |
| C-125 | formatTranslation: plural構文で複数形選択 | E-06, E-09 (行240) | ○ |
| C-126 | formatTranslation: plural構文でネスト展開 | E-06, E-09 (行242) | ○ |
| C-127 | formatTranslation: plural #の後にform番号がなければ例外 | E-06 (行82-83) | ○ |
| C-128 | formatTranslation: plural引数の閉じ括弧がなければ例外 | E-06 (行148-149) | ○ |
| C-129 | formatTranslation: 範囲外引数番号でnullが挿入される | E-06 (行186-188) | ○ |
| C-130 | formatTranslation: 引数なしでそのまま返る | E-06 (行62-64) | ○ |
| C-131 | resolvePlural: form=0で常に0が返る | E-06 (行253-254) | ○ |
| C-132 | resolvePlural: form=1でn=1なら0、それ以外なら1 | E-06 (行256-257) | ○ |
| C-133 | resolvePlural: form=2でn=0/1なら0、それ以外なら1 | E-06 (行259-260) | ○ |
| C-134 | resolvePlural: form=7のロシア語ルール | E-06 (行296-304) | ○ |
| C-135 | resolvePlural: form=12のセム語6段階ルール | E-06 (行344-361) | ○ |
| C-136 | resolvePlural: form=18のウェールズ語6段階ルール | E-06 (行407-422) | ○ |
| C-137 | resolvePlural: 未知のform番号で例外スロー | E-06 (行424) | ○ |
| C-138 | resolvePlural: form=1, n=0で1が返る | E-06 (行256-257) | ○ |
| C-139 | resolvePlural: form=3, n=10で0が返る | E-06 (行263-264) | ○ |
| C-140 | resolvePlural: form=3, n=11で2が返る | E-06 (行265-268) | ○ |

## 4) 不足情報（Unknown / Missing）
- **C-060〜C-062（contextExtractD）**：この関数はDietComplete, TagNode, HiddenComment, documentsなど多数の外部型に依存しており、テスト環境の構築方法について根拠が不十分。実際にテストを作成する際には、これらの依存をモック化する戦略が必要。
  - 候補：DietCompleteのモック実装 / テスト用のdietファイル / documentsのスタブ
- **C-067〜C-071（reportProgress）**：rpcオブジェクトとstartupTimeへの依存があり、これらはserved.typesモジュールから提供される。テスト時のモック化戦略が不明。
  - 候補：rpcのモック / startupTimeの初期化 / 出力のキャプチャ方法

## 5) リスクフラグ（レビュー観点）
- **リスク1（中リスク）**: contextExtractD（C-060〜C-062）は外部依存が多く、単体テストの実現可能性について要検討。統合テストとして実施する方が適切な可能性がある。
- **リスク1（中リスク）**: reportProgress（C-067〜C-071）はrpc依存のため、テスト環境の構築コストが高い。ログ出力のキャプチャ方法を検討する必要がある。
- **リスク0（低リスク）**: stdlib_detect系の関数（C-072〜C-098）はファイルシステムと環境変数に依存するが、テスト用の一時ファイルと環境変数のモックで対応可能。
- **リスク0（低リスク）**: ddoc.d、translate.dの多くのテストケースは既存のunittestで検証済みであり、信頼性が高い。

## 6) レビュアーチェックリスト（最小）
- [ ] ddoc.d: 既存unittestがカバーしていない関数（prepareDDoc, matchSpecialMacro等）のテストケースが十分か確認
- [ ] diet.d: contextExtractDのテスト戦略（モック化 vs 統合テスト）を決定
- [ ] progress.d: rpc依存のテスト方法を決定（モック/スタブ/出力キャプチャ）
- [ ] stdlib_detect.d: ファイルシステム依存のテストにおけるテスト用設定ファイルの準備方法を確認
- [ ] trace.d: TraceDataStat/TraceData/TraceStateの組み合わせテストが十分か確認
- [ ] translate.d: 全ての複数形ルール（form 0〜19）の境界値テストが網羅されているか確認
- [ ] CSV全体: テストケースの優先度（高/中/低）が適切に設定されているか確認
