---
generated_at: 2026-03-01 12:00:00
metrics:
  claims_total: 104
  claims_with_evidence: 101
  claims_without_evidence: 3
confidence_derived: 0.97
---

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

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.97**
  - 根拠あり：101 / 104、根拠なし：3
- 優先レビュー（高）
  1. **C-006 (UT-CAC-006)**：times=0の境界値における動作はコードの暗黙的動作に依存し、仕様として明示されていない
  2. **C-032 (UT-CAC-032)**：constructorからの`return`による最適化はJSの仕様に依存するため、テスト実装時に注意が必要
  3. **C-048 (UT-CAC-048)**：ItemCacheFacade.provideのキャッシュヒット時の戻り値が `return cacheEntry` であるが、callbackに渡されていない（潜在バグの可能性）

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

- E-01: `lib/Cache.js` - Cacheクラス定義（L54-161）、needCalls関数（L44-52）、静的プロパティ（L163-166）
- E-02: `lib/CacheFacade.js` - CacheFacadeクラス定義（L195-345）、ItemCacheFacadeクラス定義（L97-193）、MultiItemCacheクラス定義（L34-95）
- E-03: `lib/CodeGenerationResults.js` - CodeGenerationResultsクラス定義（L23-165）
- E-04: `lib/HookWebpackError.js`（間接参照）- makeWebpackError, makeWebpackErrorCallback関数
- E-05: `tapable` パッケージ - AsyncParallelHook, AsyncSeriesBailHook, SyncHookの仕様
- E-06: `enhanced-resolve` パッケージ - forEachBail関数の仕様
- E-07: `neo-async` パッケージ - asyncLib.each関数の仕様
- E-08: `lib/cache/getLazyHashedEtag.js`（間接参照）- getLazyHashedEtag関数
- E-09: `lib/cache/mergeEtags.js`（間接参照）- mergeEtags関数
- E-10: `lib/util/runtime.js`（間接参照）- RuntimeSpecMap, runtimeToString
- E-11: `lib/util/MapHelpers.js`（間接参照）- getOrInsert関数
- E-12: `lib/config/defaults.js`（間接参照）- DEFAULTS.HASH_FUNCTION

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-001 | needCalls: 指定回数呼び出し後にコールバック実行 | E-01 (L44-52) | ○ |
| C-002 | needCalls: エラーなし完了時のcallback引数 | E-01 (L44-52) | ○ |
| C-003 | needCalls: エラー時即座終了 | E-01 (L48-51) | ○ |
| C-004 | needCalls: エラー後の二重コールバック防止 | E-01 (L49: times=0設定) | ○ |
| C-005 | needCalls: times=1の境界値 | E-01 (L45-47) | ○ |
| C-006 | needCalls: times=0の境界値 | E-01 (L45: --times === 0にはならない) | △ |
| C-007 | Cache.constructor: hooksプロパティの初期化 | E-01 (L55-69) | ○ |
| C-008 | Cache.constructor: hooks.getの型 | E-01 (L58), E-05 | ○ |
| C-009 | Cache.constructor: hooks.storeの型 | E-01 (L60), E-05 | ○ |
| C-010 | Cache.constructor: hooks.beginIdleの型 | E-01 (L64), E-05 | ○ |
| C-011 | Cache.get: フックからデータ取得 | E-01 (L79-103) | ○ |
| C-012 | Cache.get: null→undefined変換 | E-01 (L87-89) | ○ |
| C-013 | Cache.get: 単一gotHandler | E-01 (L97-98) | ○ |
| C-014 | Cache.get: 複数gotHandler | E-01 (L90-96) | ○ |
| C-015 | Cache.get: gotHandler 0件 | E-01 (L99-101) | ○ |
| C-016 | Cache.get: エラー時WebpackError変換 | E-01 (L83-84), E-04 | ○ |
| C-017 | Cache.store: hooks.store呼び出し | E-01 (L113-120) | ○ |
| C-018 | Cache.store: 保存完了callback | E-01 (L113-120) | ○ |
| C-019 | Cache.store: エラー時WebpackError変換 | E-01 (L118), E-04 | ○ |
| C-020 | Cache.storeBuildDependencies: 正常呼び出し | E-01 (L128-133) | ○ |
| C-021 | Cache.storeBuildDependencies: エラー処理 | E-01 (L131), E-04 | ○ |
| C-022 | Cache.beginIdle: hooks.beginIdle.call呼び出し | E-01 (L138-140) | ○ |
| C-023 | Cache.endIdle: 正常完了 | E-01 (L146-150) | ○ |
| C-024 | Cache.endIdle: エラー処理 | E-01 (L148), E-04 | ○ |
| C-025 | Cache.shutdown: 正常完了 | E-01 (L156-160) | ○ |
| C-026 | Cache.shutdown: エラー処理 | E-01 (L158), E-04 | ○ |
| C-027 | Cache.STAGE_MEMORY = -10 | E-01 (L163) | ○ |
| C-028 | Cache.STAGE_DEFAULT = 0 | E-01 (L164) | ○ |
| C-029 | Cache.STAGE_DISK = 10 | E-01 (L165) | ○ |
| C-030 | Cache.STAGE_NETWORK = 20 | E-01 (L166) | ○ |
| C-031 | MultiItemCache.constructor: items保持 | E-02 (L38-39) | ○ |
| C-032 | MultiItemCache.constructor: 1件最適化 | E-02 (L42) | △ |
| C-033 | MultiItemCache.get: forEachBailによる順次取得 | E-02 (L50-51), E-06 | ○ |
| C-034 | MultiItemCache.get: 全キャッシュミス | E-02 (L50-51), E-06 | ○ |
| C-035 | MultiItemCache.getPromise: 順次取得 | E-02 (L63-68) | ○ |
| C-036 | MultiItemCache.getPromise: 全ミス | E-02 (L63-68) | ○ |
| C-037 | MultiItemCache.store: 並列保存 | E-02 (L77-83), E-07 | ○ |
| C-038 | MultiItemCache.store: エラー処理 | E-02 (L77-83), E-07 | ○ |
| C-039 | MultiItemCache.storePromise: 並列保存 | E-02 (L90-94) | ○ |
| C-040 | MultiItemCache.storePromise: エラー処理 | E-02 (L90-94) | ○ |
| C-041 | ItemCacheFacade.constructor: プロパティ保持 | E-02 (L103-107) | ○ |
| C-042 | ItemCacheFacade.get: デリゲーション | E-02 (L114-116) | ○ |
| C-043 | ItemCacheFacade.getPromise: resolve | E-02 (L122-132) | ○ |
| C-044 | ItemCacheFacade.getPromise: reject | E-02 (L126-127) | ○ |
| C-045 | ItemCacheFacade.store: デリゲーション | E-02 (L140-142) | ○ |
| C-046 | ItemCacheFacade.storePromise: resolve | E-02 (L149-159) | ○ |
| C-047 | ItemCacheFacade.storePromise: reject | E-02 (L153-154) | ○ |
| C-048 | ItemCacheFacade.provide: キャッシュヒット | E-02 (L167-170) | △ |
| C-049 | ItemCacheFacade.provide: キャッシュミスのcompute & store | E-02 (L171-178) | ○ |
| C-050 | ItemCacheFacade.provide: getエラー | E-02 (L169) | ○ |
| C-051 | ItemCacheFacade.provide: computerエラー | E-02 (L172) | ○ |
| C-052 | ItemCacheFacade.provide: storeエラー | E-02 (L173-174) | ○ |
| C-053 | ItemCacheFacade.providePromise: キャッシュヒット | E-02 (L186-188) | ○ |
| C-054 | ItemCacheFacade.providePromise: compute & store | E-02 (L189-191) | ○ |
| C-055 | ItemCacheFacade.providePromise: async computer | E-02 (L189) | ○ |
| C-056 | CacheFacade.constructor: プロパティ保持 | E-02 (L201-205) | ○ |
| C-057 | CacheFacade.getChildCache: 名前結合 | E-02 (L212-216) | ○ |
| C-058 | CacheFacade.getChildCache: 設定継承 | E-02 (L213-215) | ○ |
| C-059 | CacheFacade.getItemCache: 名前とetag | E-02 (L224-230) | ○ |
| C-060 | CacheFacade.getItemCache: null etag | E-02 (L224-230) | ○ |
| C-061 | CacheFacade.getLazyHashedEtag | E-02 (L236-238), E-08 | ○ |
| C-062 | CacheFacade.mergeEtags | E-02 (L245-247), E-09 | ○ |
| C-063 | CacheFacade.get: 名前空間付き取得 | E-02 (L256-258) | ○ |
| C-064 | CacheFacade.getPromise: resolve | E-02 (L266-276) | ○ |
| C-065 | CacheFacade.getPromise: reject | E-02 (L269-270) | ○ |
| C-066 | CacheFacade.store: 名前空間付き保存 | E-02 (L286-288) | ○ |
| C-067 | CacheFacade.storePromise: resolve | E-02 (L297-307) | ○ |
| C-068 | CacheFacade.storePromise: reject | E-02 (L300-301) | ○ |
| C-069 | CacheFacade.provide: キャッシュヒット | E-02 (L317-320) | ○ |
| C-070 | CacheFacade.provide: compute & store | E-02 (L321-328) | ○ |
| C-071 | CacheFacade.provide: getエラー | E-02 (L319) | ○ |
| C-072 | CacheFacade.provide: computerエラー | E-02 (L322) | ○ |
| C-073 | CacheFacade.provide: storeエラー | E-02 (L323-324) | ○ |
| C-074 | CacheFacade.providePromise: キャッシュヒット | E-02 (L338-340) | ○ |
| C-075 | CacheFacade.providePromise: compute & store | E-02 (L341-343) | ○ |
| C-076 | CodeGenerationResults.constructor: map初期化 | E-03 (L29) | ○ |
| C-077 | CodeGenerationResults.constructor: デフォルトhashFunction | E-03 (L27), E-12 | ○ |
| C-078 | CodeGenerationResults.constructor: カスタムhashFunction | E-03 (L27) | ○ |
| C-079 | CodeGenerationResults.add: 基本add | E-03 (L155-164), E-11 | ○ |
| C-080 | CodeGenerationResults.add: 複数ランタイム追加 | E-03 (L155-164) | ○ |
| C-081 | CodeGenerationResults.add: 上書き動作 | E-03 (L163: map.set) | ○ |
| C-082 | CodeGenerationResults.get: 基本get | E-03 (L39-77) | ○ |
| C-083 | CodeGenerationResults.get: runtime undefined 単一エントリ | E-03 (L49-63) | ○ |
| C-084 | CodeGenerationResults.get: runtime undefined 同一結果 | E-03 (L50-61) | ○ |
| C-085 | CodeGenerationResults.get: 存在しないモジュール | E-03 (L41-48) | ○ |
| C-086 | CodeGenerationResults.get: 存在しないランタイム | E-03 (L65-76) | ○ |
| C-087 | CodeGenerationResults.get: 一意でない結果 | E-03 (L52-59) | ○ |
| C-088 | CodeGenerationResults.has: true | E-03 (L84-96) | ○ |
| C-089 | CodeGenerationResults.has: false（存在しないモジュール） | E-03 (L86-88) | ○ |
| C-090 | CodeGenerationResults.has: runtime undefined 単一 | E-03 (L91-95) | ○ |
| C-091 | CodeGenerationResults.has: runtime undefined 同一結果 | E-03 (L91-93) | ○ |
| C-092 | CodeGenerationResults.has: runtime undefined 異なる結果 | E-03 (L91-93) | ○ |
| C-093 | CodeGenerationResults.has: 存在しないランタイム | E-03 (L89-90) | ○ |
| C-094 | CodeGenerationResults.getSource | E-03 (L104-108) | ○ |
| C-095 | CodeGenerationResults.getSource: 存在しないsourceType | E-03 (L106) | ○ |
| C-096 | CodeGenerationResults.getRuntimeRequirements | E-03 (L115-117) | ○ |
| C-097 | CodeGenerationResults.getRuntimeRequirements: null | E-03 (L117) | ○ |
| C-098 | CodeGenerationResults.getData | E-03 (L125-128) | ○ |
| C-099 | CodeGenerationResults.getData: data undefined | E-03 (L127) | ○ |
| C-100 | CodeGenerationResults.getData: 存在しないキー | E-03 (L127) | ○ |
| C-101 | CodeGenerationResults.getHash: 基本動作 | E-03 (L135-147) | ○ |
| C-102 | CodeGenerationResults.getHash: キャッシュ動作 | E-03 (L137, L146) | ○ |
| C-103 | CodeGenerationResults.getHash: 事前計算済み | E-03 (L137) | ○ |
| C-104 | CodeGenerationResults.getHash: runtimeRequirements null | E-03 (L143-145) | ○ |

## 4) 不足情報（Unknown / Missing）
- **C-006**: `needCalls`にtimes=0を渡した場合の動作は、コード上で明示的に定義されていない。`--times`により-1になり、`=== 0`条件を満たさないためcallbackは呼ばれないと推測されるが、意図された仕様かどうかは不明。
  - 候補：開発者への確認 / 既存テストコードの確認 / 設計ドキュメントの参照
- **C-032**: `MultiItemCache`のコンストラクタで`return`を使うパターンはJavaScriptの言語仕様に依存する特殊な挙動（コンストラクタからオブジェクトを返すとnew式の結果がそのオブジェクトになる）。ESLintの`no-constructor-return`を意図的に無効化しており、コメントでも`@ts-expect-error`を使用していることから意図的だが、テスト実装時にはinstanceofチェック等に注意が必要。
  - 候補：JavaScript言語仕様 / TypeScript型定義の確認
- **C-048**: `ItemCacheFacade.provide`メソッドのL170で`return cacheEntry`とあるが、これはcallbackを呼ばずに値を返しているだけであり、非同期コールバックパターンとして不完全に見える（潜在バグの可能性）。テストでは「キャッシュ値が返される」と記載したが、実際にはcallbackが呼ばれない可能性がある。
  - 候補：実際の呼び出し元コードの確認 / 既存テストの確認 / 開発者への確認

## 5) リスクフラグ（レビュー観点）
- **リスク2（高）**: C-048 - ItemCacheFacade.provideのキャッシュヒット時にcallbackが呼ばれずにreturnされている。これはバグの可能性があり、テスト実装時に実際の挙動を確認する必要がある。
- **リスク1（中）**: C-006 - needCallsのtimes=0の境界値テストは、実際にこの値で呼ばれるケースが存在するか確認が必要。
- **リスク1（中）**: C-032 - MultiItemCacheの1件最適化のコンストラクタreturnパターンは、テストフレームワークによっては`new MultiItemCache([item])`の戻り値の型チェックが予期しない結果になる可能性がある。
- **リスク0（低）**: 静的プロパティ（C-027〜C-030）は定数値の確認のみであり、変更リスクは低い。

## 6) レビュアーチェックリスト（最小）
- [ ] C-048: ItemCacheFacade.provideのキャッシュヒット時の挙動（L170の`return cacheEntry`）がcallbackを呼ばないことが意図的かどうか確認する
- [ ] C-032: MultiItemCacheのコンストラクタからのreturnパターンが`new`式で期待通りに動作することを確認する
- [ ] C-006: needCallsにtimes=0が渡されるユースケースが実際に存在するか確認する
- [ ] CacheFacade.provideのキャッシュヒット時（L320の`return cacheEntry`）も同様のパターンであり、C-069のテストケースも同じ注意が必要
- [ ] 外部ライブラリ（tapable, enhanced-resolve, neo-async）のモック方法がテスト実装で適切か確認する
