---
generated_at: 2026-02-20 10:00:00
metrics:
  claims_total: 76
  claims_with_evidence: 73
  claims_without_evidence: 3
confidence_derived: 0.96
---

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

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.96**
  - 根拠あり：73 / 76、根拠なし：3
- 優先レビュー（高）
  1. **C-68（連続大文字の処理）**：コード上のロジックからの推測。wasUpperフラグの動作が複雑で、期待結果の正確性に要確認
  2. **C-75（全大文字のディレクトリ名）**：連続大文字時のハイフン挿入ロジックの解釈が正確か要確認
  3. **C-76（全特殊文字のディレクトリ名）**：先頭文字が特殊文字の場合のtoLower動作が未確認

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

- E-01: `source/served/workers/profilegc.d` - ProfileGCEntry構造体定義（L15-22）
- E-02: `source/served/workers/profilegc.d` - PerDocumentCache.process()メソッド（L30-62）
- E-03: `source/served/workers/profilegc.d` - ProfileGCCache.update()メソッド（L67-88）
- E-04: `source/served/workers/profilegc.d` - ProfileGCCache.clear()メソッド（L90-94）
- E-05: `source/served/workers/profilegc.d` - provideProfileGCCodeLens()関数（L99-120）
- E-06: `source/served/workers/profilegc.d` - getProfileGCEntries()関数（L122-129）
- E-07: `source/served/workers/profilegc.d` - setupProfileGCWatchers()関数（L131-150）
- E-08: `source/served/workers/profilegc.d` - onProfileGCProjectAvailable()関数（L152-156）
- E-09: `source/served/workers/profilegc.d` - onChangeProfileGC()関数（L158-172）
- E-10: `source/served/workers/rename_listener.d` - FileOpenInfo構造体定義（L17-47）
- E-11: `source/served/workers/rename_listener.d` - FileOpenInfo.expired()メソッド（L27-30）
- E-12: `source/served/workers/rename_listener.d` - FileOpenInfo.setCreated()メソッド（L33-38）
- E-13: `source/served/workers/rename_listener.d` - FileOpenInfo.setOpened()メソッド（L41-46）
- E-14: `source/served/workers/rename_listener.d` - RecentFiles構造体定義（L49-91）
- E-15: `source/served/workers/rename_listener.d` - RecentFiles.get()メソッド（L56-90）
- E-16: `source/served/workers/rename_listener.d` - markRecentlyChangedFile()関数（L95-101）
- E-17: `source/served/workers/rename_listener.d` - markRecentFileCreated()関数（L103-106）
- E-18: `source/served/workers/rename_listener.d` - markRecentFileOpened()関数（L108-112）
- E-19: `source/served/workers/rename_listener.d` - onFullyCreate()関数（L116-127）
- E-20: `source/served/workers/rename_listener.d` - onFullyCreateDSource()関数（L129-149）
- E-21: `source/served/workers/rename_listener.d` - onFullyCreateDubJson()関数（L151-164）
- E-22: `source/served/workers/rename_listener.d` - onFullyCreateDubSdl()関数（L166-179）
- E-23: `source/served/workers/rename_listener.d` - determineDubPackageName()関数（L182-224）

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | 有効なprofilegc.logの内容が正しくパースされること | E-02 | ○ |
| C-02 | 複数行の入力が正しくパースされること | E-02 | ○ |
| C-03 | パース結果のURIがrelativeToUriを基準に構築されること | E-02 (L54) | ○ |
| C-04 | displayFileにファイル名部分が設定されること | E-02 (L55) | ○ |
| C-05 | 既存のentriesがnullにリセットされてから再パースされること | E-02 (L32) | ○ |
| C-06 | 空文字列が渡された場合にエントリが生成されないこと | E-02 (L33-34) | ○ |
| C-07 | カラム数が5未満の行がスキップされること | E-02 (L36-37) | ○ |
| C-08 | コロンの後に数値以外が含まれる行がスキップされること | E-02 (L46) | ○ |
| C-09 | 1行だけの入力が正しくパースされること | E-02 | ○ |
| C-10 | 行番号が0の場合 | E-02 (L49) | ○ |
| C-11 | bytesAllocatedが0の場合 | E-02 (L51) | ○ |
| C-12 | allocationCountが0の場合 | E-02 (L52) | ○ |
| C-13 | URIからprofilegc.logを読み込みキャッシュが更新されること | E-03 (L73-76) | ○ |
| C-14 | FileExceptionが発生した場合にキャッシュが削除されること | E-03 (L78-82) | ○ |
| C-15 | 一般的なExceptionが発生した場合にキャッシュが削除されること | E-03 (L83-87) | ○ |
| C-16 | 指定URIのキャッシュが削除されること | E-04 (L93) | ○ |
| C-17 | 存在しないURIに対してclearを呼んでもエラーにならないこと | E-04 | ○ |
| C-18 | 一致するURIのエントリに対してCodeLensが返却されること | E-05 (L106-118) | ○ |
| C-19 | CodeLensの範囲がentry.line - 1に設定されること | E-05 (L113) | ○ |
| C-20 | enableGCProfilerDecorationsがfalseの場合にnullが返却されること | E-05 (L102-103) | ○ |
| C-21 | キャッシュにエントリが存在しない場合に空配列が返却されること | E-05 (L106-119) | ○ |
| C-22 | URIが一致しないエントリはCodeLensに含まれないこと | E-05 (L110) | ○ |
| C-23 | 全キャッシュのエントリが統合されて返却されること | E-06 (L126-128) | ○ |
| C-24 | キャッシュが空の場合に空配列が返却されること | E-06 | ○ |
| C-25 | 動的登録がサポートされている場合にファイルウォッチャーが登録されること | E-07 (L134-149) | ○ |
| C-26 | 動的登録がサポートされていない場合に登録がスキップされること | E-07 (L134-137) | ○ |
| C-27 | 登録が失敗した場合にエラーログが出力されること | E-07 (L148) | ○ |
| C-28 | プロジェクト利用可能時にprofilegc.logのキャッシュが更新されること | E-08 (L155) | ○ |
| C-29 | profilegc.logが作成された場合にキャッシュが更新されること | E-09 (L166-168) | ○ |
| C-30 | profilegc.logが変更された場合にキャッシュが更新されること | E-09 (L167-168) | ○ |
| C-31 | profilegc.logが削除された場合にキャッシュがクリアされること | E-09 (L169-170) | ○ |
| C-32 | profilegc.log以外のファイル変更が無視されること | E-09 (L163-164) | ○ |
| C-33 | 作成から5秒以上経過している場合にtrueが返却されること | E-11 (L29) | ○ |
| C-34 | 作成から5秒以内の場合にfalseが返却されること | E-11 (L29) | ○ |
| C-35 | atがSysTime.initの場合にtrueが返却されること | E-11 (L29) | ○ |
| C-36 | ちょうど5秒経過した場合の動作 | E-11 (L29) | ○ |
| C-37 | createdフラグがtrueに設定されること | E-12 (L35) | ○ |
| C-38 | openedがtrueの場合にonFullyCreateが呼ばれること | E-12 (L36-37) | ○ |
| C-39 | openedがfalseの場合にonFullyCreateが呼ばれないこと | E-12 (L36) | ○ |
| C-40 | openedフラグがtrueに設定されること | E-13 (L43) | ○ |
| C-41 | createdがtrueの場合にonFullyCreateが呼ばれること | E-13 (L44-45) | ○ |
| C-42 | createdがfalseの場合にonFullyCreateが呼ばれないこと | E-13 (L44) | ○ |
| C-43 | 既存のURIに対して同じFileOpenInfoが返却されること | E-15 (L61-72) | ○ |
| C-44 | 存在しないURIに対して新しいFileOpenInfoが作成されること | E-15 (L75-90) | ○ |
| C-45 | 有効期限切れのURIに対してフラグがリセットされること | E-15 (L65-69) | ○ |
| C-46 | 最も古いエントリが置換されること | E-15 (L75-89) | ○ |
| C-47 | infos配列が全て空の場合に最初のスロットが使用されること | E-15 (L75-89) | ○ |
| C-48 | FileChangeType.createdのイベントでmarkRecentFileCreatedが呼ばれること | E-16 (L98-100) | ○ |
| C-49 | FileChangeType.created以外のイベントが無視されること | E-16 (L99) | ○ |
| C-50 | 指定URIのFileOpenInfoにcreatedフラグが設定されること | E-17 (L105) | ○ |
| C-51 | 指定URIのFileOpenInfoにopenedフラグが設定されること | E-18 (L111) | ○ |
| C-52 | .dファイルの場合にonFullyCreateDSourceが呼ばれること | E-19 (L119-120) | ○ |
| C-53 | dub.jsonの場合にonFullyCreateDubJsonが呼ばれること | E-19 (L123-124) | ○ |
| C-54 | dub.sdlの場合にonFullyCreateDubSdlが呼ばれること | E-19 (L125-126) | ○ |
| C-55 | 上記以外のファイルの場合に何も実行されないこと | E-19 (L119-127) | ○ |
| C-56 | モジュール名正規化パッチが存在する場合にapplyEditが送信されること | E-20 (L138-146) | ○ |
| C-57 | パッチ適用後に情報メッセージが表示されること | E-20 (L147) | ○ |
| C-58 | generateModuleNamesがfalseの場合に処理がスキップされること | E-20 (L132-133) | ○ |
| C-59 | 正規化パッチが空の場合にapplyEditが送信されないこと | E-20 (L141) | ○ |
| C-60 | 空のdub.jsonに対してテンプレートが挿入されること | E-21 (L153-163) | ○ |
| C-61 | テンプレートにディレクトリ名から決定されたパッケージ名が含まれること（dub.json） | E-21 (L156-159) | ○ |
| C-62 | 既にコンテンツがあるdub.jsonに対して何もしないこと | E-21 (L154) | ○ |
| C-63 | 空のdub.sdlに対してテンプレートが挿入されること | E-22 (L168-178) | ○ |
| C-64 | テンプレートにディレクトリ名から決定されたパッケージ名が含まれること（dub.sdl） | E-22 (L171-174) | ○ |
| C-65 | 既にコンテンツがあるdub.sdlに対して何もしないこと | E-22 (L169) | ○ |
| C-66 | シンプルなディレクトリ名がそのままパッケージ名になること | E-23 (L186-223) | ○ |
| C-67 | キャメルケースがハイフン区切りに変換されること | E-23 (L203-210) | ○ |
| C-68 | 連続する大文字がそのまま小文字化されること | E-23 (L203-210) | △ |
| C-69 | 英数字以外とアンダースコア以外の文字がハイフンに変換されること | E-23 (L196-197) | ○ |
| C-70 | 連続するハイフンが1つに縮約されること | E-23 (L199-201) | ○ |
| C-71 | 先頭と末尾のハイフンが除去されること | E-23 (L219-222) | ○ |
| C-72 | アンダースコアがそのまま保持されること | E-23 (L196) | ○ |
| C-73 | 空のディレクトリ名の場合に空文字列が返却されること | E-23 (L187-188) | ○ |
| C-74 | 1文字のディレクトリ名の場合 | E-23 (L191, L194) | ○ |
| C-75 | 全て大文字のディレクトリ名の場合 | E-23 (L203-210) | △ |
| C-76 | 全て特殊文字のディレクトリ名の場合 | E-23 (L196-222) | △ |

## 4) 不足情報（Unknown / Missing）
- C-68（連続大文字の処理）：wasUpperフラグによる条件分岐が複雑であり、連続大文字（例: "HTTPServer"）の場合、2文字目以降の大文字でハイフンが挿入されるかどうかの正確な動作は実行してみないと確定できない。コードからは「wasUpperがtrueの場合にはハイフンが挿入されない」と読めるが、最終的な出力文字列の形式は実行確認が望ましい
  - 候補：実行テスト / Dコンパイラによるユニットテスト / デバッガによるステップ実行
- C-75（全大文字のディレクトリ名）：C-68と同様に連続大文字の処理ロジックの正確な解釈に依存する
  - 候補：実行テスト / ロジックのトレース検証
- C-76（全特殊文字のディレクトリ名）：先頭文字がアルファベットでない場合のtolowerの動作（Dのstd.ascii.toLower）が未確認。また、全てハイフンに変換された後の先頭末尾除去による結果が空文字列になる可能性がある
  - 候補：D言語のstd.asciiドキュメント確認 / 実行テスト

## 5) リスクフラグ（レビュー観点）
- 0: 低リスク - profilegc.d全般：ソースコードから直接読み取れるロジックであり、テストケースとの対応が明確
- 0: 低リスク - rename_listener.dのFileOpenInfo/RecentFiles：シンプルな状態管理であり、テストケースの妥当性が高い
- 1: 中リスク - determineDubPackageName()：文字列変換ロジックが複雑で、特に連続大文字や特殊文字のエッジケースでの期待結果が実行確認なしでは確定困難
- 0: 低リスク - onFullyCreate系関数：条件分岐が明確で、テストケースとの対応が直接的

## 6) レビュアーチェックリスト（最小）
- [ ] determineDubPackageName()の連続大文字テストケース（C-68, C-75）の期待結果が正しいか実行確認する
- [ ] 全特殊文字入力（C-76）の期待結果をD言語のstd.ascii.toLowerの仕様と照合する
- [ ] profilegc.logのパースで、typeStart計算ロジック（L38-40）のエッジケースが十分にカバーされているか確認する
- [ ] FileOpenInfoのexpired()で「ちょうど5秒」の境界値（C-36）の期待結果が `>` 演算子の仕様と整合するか確認する
- [ ] onFullyCreateDSource()のパッチ適用で、複数パッチがある場合のテストケースが不足していないか確認する
- [ ] RecentFiles.get()の置換ロジック（C-46）で、同じatを持つ複数エントリがある場合の動作を確認する
