---
generated_at: 2026-02-20 10:30:00
metrics:
  claims_total: 85
  claims_with_evidence: 82
  claims_without_evidence: 3
confidence_derived: 0.96
---

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

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.96**
  - 根拠あり：82 / 85、根拠なし：3
- 優先レビュー（高）
  1. **C-76 (UT-LNT-076)**: dubLintRunningの再入防止ロジックの内部状態テスト - 実行時の競合状態を正確にテストする方法が不明確
  2. **C-80 (UT-LNT-080)**: retryDubAtEndによるループ繰り返し - 非同期的な状態変更を伴うためテスト手法の根拠不足
  3. **C-17 (UT-LNT-017)**: static assertによるコンパイル時エラー - 単体テストではなくコンパイル時チェックであり、テスト可能性が不明確

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

- E-01: `source/served/linters/dfmt.d` - dfmtリンター実装（134行）
- E-02: `source/served/linters/diagnosticmanager.d` - 診断管理機能（89行）
- E-03: `source/served/linters/dscanner.d` - DScannerリンター実装（498行、unittestブロック含む）
- E-04: `source/served/linters/dub.d` - DUBビルドリンター実装（263行）
- E-05: `docs/code-to-docs/単体テストケース一覧/plan.md` - モジュール構成・対象ファイル定義

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | lint関数がフォーマッティング有効時にリントを実行する | E-01 (24-36行: lint関数定義、enableFormatting/DfmtComponent存在チェック) | ○ |
| C-02 | lint関数がフォーマッティング無効時にスキップする | E-01 (27-28行: enableFormatting=falseで早期リターン) | ○ |
| C-03 | DfmtComponent未登録時にスキップする | E-01 (30-31行: has!DfmtComponentチェック) | ○ |
| C-04 | 不明なdfmtコマンドにwarning診断が生成される | E-01 (81-86行: Type.unknown分岐、99-113行: unittest) | ○ |
| C-05 | 冗長なdfmt on/offにhint診断が生成される | E-01 (68-80行: dfmtOn/Off分岐、115-133行: unittest) | ○ |
| C-06 | 正しいon/off切替時に診断が生成されない | E-01 (50-53行: fmtOn==onの場合の処理、68-80行: 分岐ロジック) | ○ |
| C-07 | dfmt命令なしドキュメントで空配列が返る | E-01 (56行: foreach命令ループ、90行: 空appenderのdata返却) | ○ |
| C-08 | 空ドキュメントで空配列が返る | E-01 (40行: findDfmtInstructions呼び出し、56行: foreachループ) | ○ |
| C-09 | 診断のrangeが正しく設定される | E-01 (60-64行: movePositionBytes/TextRange設定) | ○ |
| C-10 | clear関数で診断がクリアされる | E-01 (93-97行: clear関数定義) | ○ |
| C-11 | 複数プロバイダの診断が結合される | E-02 (16-37行: combineDiagnostics関数、19-36行: 二重ループ) | ○ |
| C-12 | 同一URIの診断が1エントリに統合される | E-02 (24-29行: 既存URI検索、34行: 診断追加) | ○ |
| C-13 | 全プロバイダが空の場合にcombinedが空になる | E-02 (18行: length=0リセット、19行: foreachループ) | ○ |
| C-14 | 1プロバイダのみ診断がある場合 | E-02 (19-36行: foreachプロバイダループ) | ○ |
| C-15 | 既存URIに対して既存配列参照が返される | E-02 (46-48行: 既存URI検索と参照返却) | ○ |
| C-16 | 新規URIに対して新規配列が作成される | E-02 (50行: pushRefで新規エントリ追加) | ○ |
| C-17 | slot範囲外がコンパイル時エラーになる | E-02 (45行: static assert) | △ |
| C-18 | uriHint指定時に該当URIのみ送信 | E-02 (64行: uriHint条件チェック) | ○ |
| C-19 | uriHint空で全診断送信 | E-02 (64行: !uriHint.lengthの条件) | ○ |
| C-20 | 以前公開URIで現在診断なしがクリアされる | E-02 (75-88行: publishedUris比較・クリア処理) | ○ |
| C-21 | pushRefで配列に要素追加と参照返却 | E-02 (53-57行: pushRef関数定義) | ○ |
| C-22 | D言語ドキュメントがDScannerでリントされる | E-03 (34-96行: lint関数定義) | ○ |
| C-23 | D言語以外ではスキップされる | E-03 (36-37行: getLanguageId!="d"チェック) | ○ |
| C-24 | リンティング無効時にスキップ | E-03 (45-46行: enableLinting/enableStaticLintingチェック) | ○ |
| C-25 | 除外ファイルの場合に空診断設定 | E-03 (48-52行: isExcludedFile分岐) | ○ |
| C-26 | @suppressで抑制された問題がスキップ | E-03 (69-73行: @suppress検索ロジック) | ○ |
| C-27 | ignoredKeysの問題がスキップ | E-03 (63-64行: ignoredKeys.canFindチェック) | ○ |
| C-28 | DscannerComponent未登録時にスキップ | E-03 (41-42行: !instanceチェック) | ○ |
| C-29 | isExcludedFileが除外パターン一致でtrue | E-03 (98-113行: globMatch処理) | ○ |
| C-30 | isExcludedFileが除外パターン不一致でfalse | E-03 (107-112行: foreachループ後のreturn false) | ○ |
| C-31 | ワークスペース外ファイルでfalse | E-03 (102-103行: startsWith(workspace.folder.uri)チェック) | ○ |
| C-32 | 空の除外リストでfalse | E-03 (107行: foreachが実行されずreturn false) | ○ |
| C-33 | dscanner.iniが存在する場合のパス返却 | E-03 (129-130行: buildPath/existsチェック) | ○ |
| C-34 | dscanner.ini非存在時のデフォルト値 | E-03 (131行: ini="dscanner.ini"フォールバック) | ○ |
| C-35 | instance=nullの場合のデフォルト値 | E-03 (123-127行: !instanceチェックとデフォルト返却) | ○ |
| C-36 | convertFromWorkspacedの基本変換 | E-03 (136-152行: range/severity/relatedInformation設定) | ○ |
| C-37 | autofixesのdata属性設定 | E-03 (147-151行: autofixes.length条件とdata設定) | ○ |
| C-38 | 空supplementalの処理 | E-03 (141-146行: supplemental.map処理) | ○ |
| C-39 | diagnosticDataToCodeReplacementの正常変換 | E-03 (180-189行: CodeReplacement生成) | ○ |
| C-40 | diagnosticDataToCodeReplacementの不正JSON | E-03 (183-188行: object/arrayアクセスの暗黙的例外) | ○ |
| C-41 | diagnosticDataToResolveContextの正常変換 | E-03 (202-213行: ResolveContext生成) | ○ |
| C-42 | diagnosticDataToResolveContextの不正JSON | E-03 (206-212行: object/arrayアクセスの暗黙的例外) | ○ |
| C-43 | getDscannerDiagnosticRangeのindex情報あり | E-03 (218-227行: index非0ブランチ) | ○ |
| C-44 | getDscannerDiagnosticRangeのindex情報なし | E-03 (229-234行: elseブランチ) | ○ |
| C-45 | unused_parameterでhint/unnecessaryタグ | E-03 (239-244行: unused_parameter条件) | ○ |
| C-46 | unused_variableでhint/unnecessaryタグ | E-03 (240行: unused_variable条件) | ○ |
| C-47 | errorタイプでerror重要度 | E-03 (247-248行: type=="error"条件) | ○ |
| C-48 | warningタイプでwarning重要度 | E-03 (247-248行: else分岐のwarning) | ○ |
| C-49 | dscanner clear関数の動作 | E-03 (115-119行: clear関数定義) | ○ |
| C-50 | toJson(DScannerAutoFix) CodeReplacements変換 | E-03 (154-170行: toJson関数、replacements match) | ○ |
| C-51 | toJson(DScannerAutoFix) ResolveContext変換 | E-03 (154-170行: toJson関数、context match) | ○ |
| C-52 | toJson(CodeReplacement)の変換 | E-03 (172-178行: toJson関数) | ○ |
| C-53 | toJson(ResolveContext)の変換 | E-03 (191-200行: toJson関数) | ○ |
| C-54 | DiagnosticTester初期化 | E-03 (262-284行: thisコンストラクタ) | ○ |
| C-55 | DiagnosticTester shutdown | E-03 (291-299行: shutdown関数) | ○ |
| C-56 | DiagnosticTester lint | E-03 (301-305行: lint関数) | ○ |
| C-57 | DiagnosticTester diagnosticsAt(Position) | E-03 (307-311行: diagnosticsAt関数) | ○ |
| C-58 | DiagnosticTester diagnosticsAt(Position, key) | E-03 (313-323行: diagnosticsAt(key)関数) | ○ |
| C-59 | DiagnosticTester syntaxErrorsAt | E-03 (325-330行: syntaxErrorsAt関数) | ○ |
| C-60 | DiagnosticTester build | E-03 (332-353行: build関数) | ○ |
| C-61 | fixPath: 絶対パスの.dファイル処理 | E-04 (36行: isAbsoluteチェック、43行: .d拡張子チェック) | ○ |
| C-62 | fixPath: 相対パスのcwd基準解決 | E-04 (36行: buildNormalizedPath(cwd, path)) | ○ |
| C-63 | fixPath: -mixin-サフィックス除去 | E-04 (31-33行: indexOf("-mixin-")と切り詰め) | ○ |
| C-64 | fixPath: workspaceRootへのフォールバック | E-04 (39-40行: !exists(absPath)条件とworkspaceRootフォールバック) | ○ |
| C-65 | fixPath: stringImportPathsからの検索 | E-04 (50-61行: chain/buildNormalizedPath/existsループ) | ○ |
| C-66 | fixPath: 空のstringImportPaths | E-04 (50-63行: chainループとfound=falseフォールバック) | ○ |
| C-67 | mapDubLintType: Deprecation→information | E-04 (74-75行: Deprecation分岐) | ○ |
| C-68 | mapDubLintType: Warning→warning | E-04 (76-77行: Warning分岐) | ○ |
| C-69 | mapDubLintType: Error→error | E-04 (78-79行: Error分岐) | ○ |
| C-70 | applyDubLintType: severity設定 | E-04 (85行: mapDubLintType呼び出し) | ○ |
| C-71 | applyDubLintType: Deprecationでdeprecatedタグ | E-04 (86-87行: Deprecation条件とtags設定) | ○ |
| C-72 | applyDubLintType: 非DeprecationではTagなし | E-04 (86行: Deprecation条件の暗黙的else) | ○ |
| C-73 | dub lint: 基本動作 | E-04 (94-232行: lint関数全体) | ○ |
| C-74 | dub lint: リンティング無効時 | E-04 (107-108行: enableLinting/enableDubLintingチェック) | ○ |
| C-75 | dub lint: DubComponent未登録時 | E-04 (102-104行: !instanceチェック) | ○ |
| C-76 | dub lint: dubLintRunning再入防止 | E-04 (110-114行: dubLintRunning条件) | △ |
| C-77 | dub lint: ビルド不可パッケージ | E-04 (124-129行: isValidBuildConfigurationチェック) | ○ |
| C-78 | dub lint: supplemental→relatedInformation | E-04 (188-198行: supplemental.map処理) | ○ |
| C-79 | dub lint: instantiated from here処理 | E-04 (203-225行: instantiated from hereブランチ) | ○ |
| C-80 | dub lint: retryDubAtEndループ | E-04 (120-122行: do-whileとretryDubAtEnd) | △ |
| C-81 | extendErrorRange: メッセージベースの範囲拡張 | E-04 (241-252行: resolveDiagnosticRange呼び出し) | ○ |
| C-82 | extendErrorRange: wordRangeAtフォールバック | E-04 (246-252行: result[0]!=result[1]条件、255行: wordRangeAt) | ○ |
| C-83 | extendErrorRange: 空ドキュメント処理 | E-04 (238-239行: rawText.lengthチェック) | ○ |
| C-84 | extendErrorRange: メッセージ空時のwordRangeAt | E-04 (241行: info.message.length条件、255行: wordRangeAt) | ○ |
| C-85 | dub clear関数の動作 | E-04 (258-262行: clear関数定義) | ○ |

## 4) 不足情報（Unknown / Missing）
- C-17: static assertはコンパイル時チェックであり、通常の単体テストフレームワークでは直接テストできない可能性がある。D言語のunittestブロック内でstatic assertの失敗をテストする方法について確認が必要。
  - 候補：D言語のコンパイル時テスト手法 / __traits(compiles, ...) を使用したテスト / 除外してコンパイルエラーテストとして扱う
- C-76: dubLintRunningはモジュールレベルの可変グローバル状態であり、単体テストで正確に再入状態をシミュレートする方法が不明確。
  - 候補：グローバル状態のモック / テスト前後のdubLintRunning手動設定 / 統合テストとして扱う
- C-80: retryDubAtEndによるdo-whileループの繰り返しは、lint実行中に非同期的にフラグが変更される想定であり、単体テストでの再現が困難。
  - 候補：フラグの直接操作によるテスト / タイマーベースのテスト / 統合テストとして扱う

## 5) リスクフラグ（レビュー観点）
- 0: 低リスク - dfmt.d, diagnosticmanager.d の関数はロジックが明確でテストケースの根拠が十分
- 1: 中リスク - dscanner.d のJSON変換関数群（toJson/diagnosticDataTo*）は不正入力時の挙動がD言語のランタイム例外に依存しており、テスト期待結果の正確性に注意
- 1: 中リスク - dub.d のlint関数は外部依存（DubComponent、ファイルシステム、RPC）が多く、モック戦略がテストの品質に大きく影響する
- 2: 高リスク - dub.d のdubLintRunning/retryDubAtEndに関する並行性テスト（C-76, C-80）は、グローバル状態の操作を伴うため単体テストとしての実現可能性を要確認

## 6) レビュアーチェックリスト（最小）
- [ ] dfmt.d の既存unittest（99-133行）がテストケースC-04, C-05の期待結果と整合しているか確認
- [ ] dscanner.d の既存unittest（357-498行）がテストケースの期待結果と整合しているか確認
- [ ] diagnosticmanager.d のcombineDiagnostics関数がNumDiagnosticProviders=3の全スロットを正しく処理するテストケースが十分か確認
- [ ] dub.d のfixPath関数のテストケースがファイルシステム依存のテスト戦略を考慮しているか確認
- [ ] C-17（static assertのコンパイル時エラーテスト）の実現可能性を確認し、必要に応じて除外または代替テスト手法を検討
- [ ] C-76, C-80のグローバル状態テストについて、統合テストへの移行を検討
- [ ] dscanner.d のDiagnosticTesterクラス（テスト用ヘルパー、C-54〜C-60）のテスト優先度が「低」で問題ないか確認
