---
generated_at: 2026-02-25 12:00:00
metrics:
  claims_total: 98
  claims_with_evidence: 91
  claims_without_evidence: 7
confidence_derived: 0.93
---

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

## 本レポートについて

### 目的
本レポートは、生成された単体テストケース一覧の信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.93**
  - 根拠あり：91 / 98、根拠なし：7
- 優先レビュー（高）
  1. **C-25 (keyToPathArray ブラケットのみ)**：実際の挙動を未検証（コード解析による推測）
  2. **C-31 (expandPath 非配列値)**：Array.isArray分岐の挙動を推測
  3. **C-93 (validateMinMax value=undefined)**：Optional chaining の挙動を推測

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。

- E-01: `packages/decap-cms-lib-widgets/src/stringTemplate.ts` -- stringTemplate モジュールのソースコード（262行）
- E-02: `packages/decap-cms-lib-widgets/src/validations.ts` -- validations モジュールのソースコード（31行）
- E-03: `packages/decap-cms-lib-widgets/src/index.ts` -- エントリポイントのソースコード（8行）
- E-04: `packages/decap-cms-lib-widgets/src/__tests__/stringTemplate.spec.js` -- 既存テスト（241行）
- E-05: `packages/decap-cms-lib-widgets/package.json` -- パッケージ定義（依存関係: immutable, lodash, dayjs, path-browserify）

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | formatDate: 1桁の日付にゼロを先頭付与 | E-01 (L46-48) | ○ |
| C-02 | formatDate: 2桁の日付がそのまま返却 | E-01 (L46-48) | ○ |
| C-03 | formatDate: 0が渡された場合のゼロ埋め | E-01 (L46-48) | ○ |
| C-04 | dateParsers.year: 年が正しく取得 | E-01 (L51), E-04 (L69) | ○ |
| C-05 | dateParsers.month: 月がゼロ埋め2桁 | E-01 (L52), E-04 (L73) | ○ |
| C-06 | dateParsers.day: 日がゼロ埋め2桁 | E-01 (L53), E-04 (L77) | ○ |
| C-07 | dateParsers.hour: 時がゼロ埋め2桁 | E-01 (L54), E-04 (L81) | ○ |
| C-08 | dateParsers.minute: 分がゼロ埋め2桁 | E-01 (L55), E-04 (L85) | ○ |
| C-09 | dateParsers.second: 秒がゼロ埋め2桁 | E-01 (L56), E-04 (L89) | ○ |
| C-10 | dateParsers.month: 12月の境界値 | E-01 (L52) | ○ |
| C-11 | dateParsers.hour: 0時の境界値 | E-01 (L54) | ○ |
| C-12 | parseDateFromEntry: dateFieldNameに基づいて日付取得 | E-01 (L59-66), E-04 (L31-36) | ○ |
| C-13 | parseDateFromEntry: 空文字でundefined | E-01 (L60-62), E-04 (L39) | ○ |
| C-14 | parseDateFromEntry: nullでundefined | E-01 (L60-62), E-04 (L41) | ○ |
| C-15 | parseDateFromEntry: undefinedでundefined | E-01 (L60-62), E-04 (L42) | ○ |
| C-16 | parseDateFromEntryData: 有効な日付からDate返却 | E-01 (L68-80) | ○ |
| C-17 | parseDateFromEntryData: 空文字でundefined | E-01 (L72-74) | ○ |
| C-18 | parseDateFromEntryData: 無効日付でundefined | E-01 (L76-79), E-04 (L45-49) | ○ |
| C-19 | parseDateFromEntryData: 存在しないキーでundefined | E-01 (L75-79) | ○ |
| C-20 | keyToPathArray: 単純キーが配列長1 | E-01 (L84-108), E-04 (L13-15) | ○ |
| C-21 | keyToPathArray: ネストパスの分割 | E-01 (L84-108), E-04 (L17-27) | ○ |
| C-22 | keyToPathArray: ドット区切りの分割 | E-01 (L84-108) | ○ |
| C-23 | keyToPathArray: 空文字で空配列 | E-01 (L85-87) | ○ |
| C-24 | keyToPathArray: undefinedで空配列 | E-01 (L84-87) | ○ |
| C-25 | keyToPathArray: ブラケットのみで空配列 | E-01 (L94-102) | △ |
| C-26 | expandPath: ワイルドカードパス展開 | E-01 (L110-143), E-04 (L181-197) | ○ |
| C-27 | expandPath: ネストワイルドカード展開 | E-01 (L110-143), E-04 (L199-223) | ○ |
| C-28 | expandPath: ワイルドカードなしパス | E-01 (L125-126), E-04 (L225-239) | ○ |
| C-29 | expandPath: 末尾ワイルドカード | E-01 (L119-121) | ○ |
| C-30 | expandPath: 空配列のワイルドカード | E-01 (L131-139) | ○ |
| C-31 | expandPath: 非配列値へのワイルドカード | E-01 (L131) | △ |
| C-32 | getExplicitFieldReplacement: fields.プレフィックスで値取得 | E-01 (L147-157) | ○ |
| C-33 | getExplicitFieldReplacement: プレフィックスなしでundefined | E-01 (L148-150) | ○ |
| C-34 | getExplicitFieldReplacement: オブジェクト値のJSON変換 | E-01 (L153-155) | ○ |
| C-35 | getFilterFunction: upper解決 | E-01 (L9, L159-172) | ○ |
| C-36 | getFilterFunction: lower解決 | E-01 (L11-13, L159-172) | ○ |
| C-37 | getFilterFunction: date解決 | E-01 (L15-17, L159-172) | ○ |
| C-38 | getFilterFunction: default解決 | E-01 (L19-21, L159-172) | ○ |
| C-39 | getFilterFunction: ternary解決 | E-01 (L23-25, L159-172) | ○ |
| C-40 | getFilterFunction: truncate解決 | E-01 (L27-37, L159-172) | ○ |
| C-41 | getFilterFunction: 不正フィルタでnull | E-01 (L159-172) | ○ |
| C-42 | getFilterFunction: 空文字でnull | E-01 (L160) | ○ |
| C-43 | compileStringTemplate: year変数コンパイル | E-01 (L174-226), E-04 (L68-70) | ○ |
| C-44 | compileStringTemplate: month変数コンパイル | E-01 (L174-226), E-04 (L72-74) | ○ |
| C-45 | compileStringTemplate: day変数コンパイル | E-01 (L174-226), E-04 (L76-78) | ○ |
| C-46 | compileStringTemplate: hour変数コンパイル | E-01 (L174-226), E-04 (L80-82) | ○ |
| C-47 | compileStringTemplate: minute変数コンパイル | E-01 (L174-226), E-04 (L84-86) | ○ |
| C-48 | compileStringTemplate: second変数コンパイル | E-01 (L174-226), E-04 (L88-90) | ○ |
| C-49 | compileStringTemplate: slug変数置換 | E-01 (L200-201) | ○ |
| C-50 | compileStringTemplate: 複合テンプレート | E-01 (L174-226), E-04 (L96-105) | ○ |
| C-51 | compileStringTemplate: processor適用 | E-01 (L206-207), E-04 (L107-111) | ○ |
| C-52 | compileStringTemplate: upperフィルタ適用 | E-01 (L208-213), E-04 (L113-122) | ○ |
| C-53 | compileStringTemplate: lowerフィルタ適用 | E-01 (L208-213), E-04 (L113-122) | ○ |
| C-54 | compileStringTemplate: dateフィルタ適用 | E-01 (L208-213), E-04 (L124-133) | ○ |
| C-55 | compileStringTemplate: defaultフィルタ値あり | E-01 (L208-213), E-04 (L135-144) | ○ |
| C-56 | compileStringTemplate: defaultフィルタ値なし | E-01 (L208-213), E-04 (L135-144) | ○ |
| C-57 | compileStringTemplate: ternaryフィルタtruthy | E-01 (L208-213), E-04 (L146-155) | ○ |
| C-58 | compileStringTemplate: ternaryフィルタfalsy | E-01 (L208-213), E-04 (L146-155) | ○ |
| C-59 | compileStringTemplate: truncateデフォルト省略記号 | E-01 (L208-213), E-04 (L157-166) | ○ |
| C-60 | compileStringTemplate: truncateカスタム省略記号 | E-01 (L208-213), E-04 (L168-177) | ○ |
| C-61 | compileStringTemplate: 日付必須で未定義時エラー | E-01 (L195-197, L219-222), E-04 (L92-94) | ○ |
| C-62 | compileStringTemplate: date=nullで日付処理スキップ | E-01 (L185-186) | ○ |
| C-63 | compileStringTemplate: fields.プレフィックスでフィールド優先 | E-01 (L191-194) | ○ |
| C-64 | compileStringTemplate: 変数なしテンプレート | E-01 (L187-188) | ○ |
| C-65 | compileStringTemplate: 空テンプレート | E-01 (L187-188) | △ |
| C-66 | extractTemplateVars: テンプレート変数抽出 | E-01 (L228-236), E-04 (L53-59) | ○ |
| C-67 | extractTemplateVars: マッチなしで空配列 | E-01 (L228-236), E-04 (L61-63) | ○ |
| C-68 | extractTemplateVars: 空テンプレートで空配列 | E-01 (L228-236) | △ |
| C-69 | extractTemplateVars: フィルタ付き変数名抽出 | E-01 (L228-236) | ○ |
| C-70 | addFileTemplateFields: dirname/filename/extension設定 | E-01 (L246-261) | ○ |
| C-71 | addFileTemplateFields: folder相対パス | E-01 (L253) | ○ |
| C-72 | addFileTemplateFields: 空パスでfields返却 | E-01 (L247-249) | ○ |
| C-73 | addFileTemplateFields: 拡張子なしファイル | E-01 (L257) | ○ |
| C-74 | addFileTemplateFields: ルート直下ファイル | E-01 (L246-261) | △ |
| C-75 | filters upper: 大文字変換 | E-01 (L9) | ○ |
| C-76 | filters lower: 小文字変換 | E-01 (L12) | ○ |
| C-77 | filters date: フォーマット変換 | E-01 (L16) | ○ |
| C-78 | filters default: 値あり時そのまま | E-01 (L20) | ○ |
| C-79 | filters default: 値なし時デフォルト | E-01 (L20) | ○ |
| C-80 | filters ternary: truthy時match[1] | E-01 (L24) | ○ |
| C-81 | filters ternary: 空文字時match[2] | E-01 (L24) | ○ |
| C-82 | filters truncate: デフォルト省略記号 | E-01 (L28-36) | ○ |
| C-83 | filters truncate: カスタム省略記号 | E-01 (L28-36) | ○ |
| C-84 | filters truncate: 切り詰め不要 | E-01 (L28-36) | △ |
| C-85 | validateMinMax: 正常範囲内でundefined | E-02 (L24-30) | ○ |
| C-86 | validateMinMax: min未満でrangeMinエラー | E-02 (L26-28) | ○ |
| C-87 | validateMinMax: max超過でrangeMaxエラー | E-02 (L28-30) | ○ |
| C-88 | validateMinMax: min===maxで不一致時rangeCountExact | E-02 (L24-25) | ○ |
| C-89 | validateMinMax: min!==maxで範囲外時rangeCount | E-02 (L24-25) | ○ |
| C-90 | validateMinMax: min/max未指定でundefined | E-02 (L24-30) | ○ |
| C-91 | validateMinMax: sizeがminと一致 | E-02 (L24-30) | ○ |
| C-92 | validateMinMax: sizeがmaxと一致 | E-02 (L24-30) | ○ |
| C-93 | validateMinMax: value=undefinedでエラーなし | E-02 (L24-30) | △ |
| C-94 | validateMinMax: 翻訳関数の呼び出し検証 | E-02 (L12-22) | ○ |
| C-95 | validateMinMax: min=0の境界値 | E-02 (L26) | ○ |
| C-96 | index: stringTemplateエクスポート | E-03 (L1, L8) | ○ |
| C-97 | index: validationsエクスポート | E-03 (L2, L8) | ○ |
| C-98 | index: DecapCmsLibWidgetsオブジェクト | E-03 (L4-7) | ○ |

## 4) 不足情報（Unknown / Missing）
- **C-25 (keyToPathArray ブラケットのみ)**: `[]` のみを入力とした場合のkeyToPathArrayの正確な出力は実行でのみ確認可能。コード解析上は空配列になるが、既存テストでカバーされていない
  - 候補：実行テスト / デバッグ実行
- **C-31 (expandPath 非配列値)**: `Array.isArray(value)` が false の場合、分岐に入らず paths は空配列のまま返却されると推測。しかし既存テストでカバーなし
  - 候補：実行テスト / コードレビュー
- **C-65 (空テンプレート)**: 空文字列テンプレートに対するreplace結果は空文字列と推測だが、既存テストなし
  - 候補：実行テスト
- **C-68 (extractTemplateVars 空テンプレート)**: 空文字列に対するmatch結果はnullで、`|| []` により空配列と推測だが、既存テストなし
  - 候補：実行テスト
- **C-74 (addFileTemplateFields ルート直下)**: `dirname('file.md')` が `.` を返すことはNode.jsの仕様だが、ブラウザ環境での path-browserify の挙動を未検証
  - 候補：path-browserify ドキュメント / 実行テスト
- **C-84 (truncate 切り詰め不要)**: lodash truncate の挙動に依存。length超過しない場合はそのまま返却されるはずだが直接テストなし
  - 候補：lodash ドキュメント / 実行テスト
- **C-93 (validateMinMax value=undefined)**: Optional chaining `value?.size` が undefined を返し、isNumber チェックで false になるためエラーなしと推測だが、直接テストなし
  - 候補：実行テスト / TypeScript型推論

## 5) リスクフラグ（レビュー観点）
- **0: 低リスク** - stringTemplate の dateParsers, keyToPathArray, extractTemplateVars は既存テスト（E-04）で十分検証済み
- **0: 低リスク** - compileStringTemplate は既存テストで多数のパターンがカバー済み
- **1: 中リスク** - validations.ts は既存テストファイルが存在しないため、全テストケースがコード解析のみに基づく
- **1: 中リスク** - addFileTemplateFields は既存テストがなく、path-browserify の挙動依存がある
- **0: 低リスク** - filters（upper, lower, date, default, ternary, truncate）はcompileStringTemplateの既存テストで間接的に検証済み

## 6) レビュアーチェックリスト（最小）
- [ ] validations.ts のバリデーションロジック（条件分岐の優先順位）が正しくテストケースに反映されているか確認
- [ ] expandPath で非配列値にワイルドカードを適用した場合の実際の挙動を確認（C-31）
- [ ] addFileTemplateFields の path-browserify 依存部分がブラウザ環境で期待通りに動作するか確認（C-74）
- [ ] validateMinMax で value が undefined の場合に例外が発生しないことを実行テストで確認（C-93）
- [ ] truncate フィルタで文字列長が指定長以下の場合の lodash truncate の挙動を確認（C-84）
- [ ] min=0 かつ value.size=0 の場合、rangeMin 条件の `min > 0` により正常と判定されることを確認（C-95）
