---
generated_at: 2026-02-25 10:00:00
metrics:
  claims_total: 108
  claims_with_evidence: 103
  claims_without_evidence: 5
confidence_derived: 0.95
---

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

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.95**
  - 根拠あり：103 / 108、根拠なし：5
- 優先レビュー（高）
  1. **C-58 (handleChangeFor メタデータマージ)**：metadata引数がImmutableMapの場合のtoJS()変換の実際の動作確認が必要
  2. **C-84〜C-86 (focus メソッド)**：setStateコールバック内での非同期処理の検証が必要
  3. **C-89 (label_singular単数形ラベル)**：renderListControl内のラベル表示ロジックの実際のDOM出力確認が必要

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

- E-01: `packages/decap-cms-widget-list/src/index.js` - Widget関数定義、エクスポート
- E-02: `packages/decap-cms-widget-list/src/ListControl.js` - ListControlクラス（メインコンポーネント）、handleSummary、validateItem、LabelComponent、SortableList、SortableListItem、DragHandle
- E-03: `packages/decap-cms-widget-list/src/schema.js` - スキーマ定義オブジェクト
- E-04: `packages/decap-cms-widget-list/src/typedListHelpers.js` - getTypedFieldForValue、resolveFunctionForTypedField、resolveFieldKeyType、getErrorMessageForTypedFieldAndValue
- E-05: `packages/decap-cms-widget-list/src/__tests__/ListControl.spec.js` - 既存テスト（26テストケース）
- E-06: `packages/decap-cms-widget-list/package.json` - 依存関係定義

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | Widget関数がデフォルトオプションで正しいオブジェクトを返す | E-01 (L8-16) | ○ |
| C-02 | Widget関数がカスタムオプションで上書きする | E-01 (L8-16, スプレッド演算子) | ○ |
| C-03 | DecapCmsWidgetListエクスポートの構成 | E-01 (L18) | ○ |
| C-04 | handleSummaryがテンプレートを展開する | E-02 (L148-154) | ○ |
| C-05 | handleSummaryがファイルテンプレート変数を展開する | E-02 (L149-153, addFileTemplateFields) | ○ |
| C-06 | validateItemがMapに対しtrueを返す | E-02 (L156-165) | ○ |
| C-07 | validateItemがMap以外にfalseを返す | E-02 (L157-163) | ○ |
| C-08 | validateItemがnullにfalseを返す | E-02 (L157) | ○ |
| C-09 | constructor: collapsed=trueで初期化 | E-02 (L209-222) | ○ |
| C-10 | constructor: collapsed=falseで初期化 | E-02 (L212-213) | ○ |
| C-11 | constructor: collapsedデフォルトtrue | E-02 (L212) | ○ |
| C-12 | constructor: value=undefinedで空配列初期化 | E-02 (L213-214) | ○ |
| C-13 | constructor: 空リストで空配列初期化 | E-02 (L213-214) | ○ |
| C-14 | valueToString: Listをカンマ区切りに変換 | E-02 (L229-242) | ○ |
| C-15 | valueToString: 配列をカンマ区切りに変換 | E-02 (L231) | ○ |
| C-16 | valueToString: 空リストを空文字列に変換 | E-02 (L232) | ○ |
| C-17 | valueToString: 非List/Array値のフォールバック | E-02 (L234-239) | ○ |
| C-18 | valueToString: カンマ後スペース追加 | E-02 (L241) | ○ |
| C-19 | getValueType: MULTIPLEの判定 | E-02 (L246) | ○ |
| C-20 | getValueType: SINGLEの判定 | E-02 (L248) | ○ |
| C-21 | getValueType: MIXEDの判定 | E-02 (L250) | ○ |
| C-22 | getValueType: nullの判定 | E-02 (L252) | ○ |
| C-23 | shouldComponentUpdate: 常にtrue | E-02 (L264-266) | ○ |
| C-24 | handleChange: カンマ区切りリスト変換 | E-02 (L268-280) | ○ |
| C-25 | handleChange: 空文字列入力 | E-02 (L272) | ○ |
| C-26 | handleChange: 末尾カンマの重複防止 | E-02 (L273-275) | ○ |
| C-27 | handleFocus: setActiveStyle呼び出し | E-02 (L282-284) | ○ |
| C-28 | handleBlur: 値のトリムとフォーマット | E-02 (L286-293) | ○ |
| C-29 | handleBlur: 空白のフィルタリング | E-02 (L290) | ○ |
| C-30 | handleAdd: SINGLEタイプのアイテム追加 | E-02 (L295-303) | ○ |
| C-31 | handleAdd: MULTIPLEタイプのアイテム追加 | E-02 (L295-303) | ○ |
| C-32 | singleDefault: default値取得 | E-02 (L305-307) | ○ |
| C-33 | singleDefault: default未設定でnull | E-02 (L306) | ○ |
| C-34 | getFieldsDefault: 複数フィールドのデフォルト値集約 | E-02 (L325-350) | ○ |
| C-35 | getFieldsDefault: null defaultスキップ | E-02 (L344-346) | ○ |
| C-36 | getFieldsDefault: ネストされたobjectの再帰処理 | E-02 (L332-336) | ○ |
| C-37 | getFieldsDefault: 空フィールドリスト | E-02 (L326) | ○ |
| C-38 | addItem: 末尾追加（add_to_top=false） | E-02 (L352-370) | ○ |
| C-39 | addItem: 先頭追加（add_to_top=true） | E-02 (L354, L365-366) | ○ |
| C-40 | addItem: value=nullのフォールバック | E-02 (L364) | ○ |
| C-41 | handleAddType: MIXEDタイプのアイテム追加 | E-02 (L313-316) | ○ |
| C-42 | mixedDefault: typeKey付きデフォルト生成 | E-02 (L318-323) | ○ |
| C-43 | processControlRef: ref格納 | E-02 (L372-379) | ○ |
| C-44 | processControlRef: null ref処理 | E-02 (L373) | ○ |
| C-45 | validate: 子ウィジェットのvalidate呼び出し | E-02 (L381-392) | ○ |
| C-46 | validate: props.validate呼び出し | E-02 (L388-389) | ○ |
| C-47 | validateSize: 範囲内で空配列返却 | E-02 (L394-413), E-05 (L751-770) | ○ |
| C-48 | validateSize: min未満でRANGEエラー | E-02 (L394-413), E-05 (L665-688) | ○ |
| C-49 | validateSize: max超過でRANGEエラー | E-02 (L394-413), E-05 (L721-749) | ○ |
| C-50 | validateSize: min/max範囲外（min未満）でRANGEエラー | E-02 (L394-413), E-05 (L639-663) | ○ |
| C-51 | validateSize: min/max範囲外（max超過）でRANGEエラー | E-02 (L394-413), E-05 (L690-719) | ○ |
| C-52 | validateSize: required=falseで空許容 | E-02 (L400-401), E-05 (L772-791) | ○ |
| C-53 | validateSize: min/max未設定 | E-02 (L396-397) | ○ |
| C-54 | getObjectValue: 正常なインデックス | E-02 (L420) | ○ |
| C-55 | getObjectValue: 範囲外インデックスでMap() | E-02 (L420) | ○ |
| C-56 | handleChangeFor: MULTIPLEフィールド更新 | E-02 (L422-438) | ○ |
| C-57 | handleChangeFor: SINGLEフィールド直接更新 | E-02 (L427-429, L430-431) | ○ |
| C-58 | handleChangeFor: メタデータマージ | E-02 (L433-435) | △ |
| C-59 | handleRemove: アイテム削除 | E-02 (L440-498), E-05 (L603-637) | ○ |
| C-60 | handleRemove: 状態更新 | E-02 (L467-474) | ○ |
| C-61 | handleRemove: childRef除去 | E-02 (L477) | ○ |
| C-62 | handleRemove: 空リスト時のエラークリア | E-02 (L491-494) | ○ |
| C-63 | handleRemove: fieldsErrorsクリア | E-02 (L482-488) | ○ |
| C-64 | handleItemCollapseToggle: 個別トグル | E-02 (L500-512) | ○ |
| C-65 | handleItemCollapseToggle: 他アイテム非影響 | E-02 (L503-508) | ○ |
| C-66 | handleCollapseAllToggle: 全折りたたみ | E-02 (L514-532), E-05 (L145-178) | ○ |
| C-67 | handleCollapseAllToggle: 全展開 | E-02 (L514-532), E-05 (L215-248) | ○ |
| C-68 | handleCollapseAllToggle: minimize_collapsed時トグル | E-02 (L522-528), E-05 (L513-543) | ○ |
| C-69 | handleCollapseAllToggle: minimize_collapsed展開 | E-02 (L524-527), E-05 (L545-576) | ○ |
| C-70 | objectLabel: MIXEDラベル（summaryなし） | E-02 (L538-547), E-05 (L285-310) | ○ |
| C-71 | objectLabel: MIXEDサマリー | E-02 (L545-546), E-05 (L340-367) | ○ |
| C-72 | objectLabel: SINGLEラベル | E-02 (L549-556), E-05 (L369-379) | ○ |
| C-73 | objectLabel: SINGLEサマリー | E-02 (L553-555), E-05 (L393-404) | ○ |
| C-74 | objectLabel: MULTIPLEラベル（最初のフィールド値） | E-02 (L557-567), E-05 (L406-425) | ○ |
| C-75 | objectLabel: MULTIPLEサマリー | E-02 (L564-565), E-05 (L444-464) | ○ |
| C-76 | objectLabel: MULTIPLEで値なしフォールバック | E-02 (L566), E-05 (L427-442) | ○ |
| C-77 | objectLabel: MIXEDで不正なアイテム型 | E-02 (L539-541) | ○ |
| C-78 | objectLabel: valueType=nullで空文字列 | E-02 (L569) | ○ |
| C-79 | onSortEnd: 並び順更新 | E-02 (L572-594) | ○ |
| C-80 | onSortEnd: 状態更新 | E-02 (L582-593) | ○ |
| C-81 | hasError: エラーあり判定 | E-02 (L596-603) | ○ |
| C-82 | hasError: エラーなし判定 | E-02 (L596-603) | ○ |
| C-83 | hasError: 空エラーマップ | E-02 (L598) | ○ |
| C-84 | focus: 折りたたみ時の自動展開 | E-02 (L605-631) | △ |
| C-85 | focus: 展開済みの直接フォーカス | E-02 (L624-630) | △ |
| C-86 | focus: アイテム折りたたみ時の展開 | E-02 (L608-623) | △ |
| C-87 | render: 単純リストでinput表示 | E-02 (L812-818), E-05 (L72-77) | ○ |
| C-88 | render: 複合リストでListControl表示 | E-02 (L812-818), E-05 (L88-114) | ○ |
| C-89 | renderListControl: label_singular単数形 | E-02 (L753-754) | △ |
| C-90 | renderListControl: allow_add=false | E-02 (L774) | ○ |
| C-91 | renderListControl: minimize_collapsed表示制御 | E-02 (L784-788), E-05 (L513-576) | ○ |
| C-92 | renderErroneousTypedItem: エラーメッセージ表示 | E-02 (L725-746) | ○ |
| C-93 | LabelComponent: label表示 | E-02 (L166-173) | ○ |
| C-94 | LabelComponent: nameフォールバック | E-02 (L167) | ○ |
| C-95 | LabelComponent: optional表示 | E-02 (L171) | ○ |
| C-96 | getTypedFieldForValue: 一致するtype返却 | E-04 (L5-10) | ○ |
| C-97 | getTypedFieldForValue: 不一致でundefined | E-04 (L9) | ○ |
| C-98 | getTypedFieldForValue: カスタムtypeKey | E-04 (L6-8) | ○ |
| C-99 | resolveFunctionForTypedField: 正しいtype返却 | E-04 (L12-19) | ○ |
| C-100 | resolveFunctionForTypedField: 不一致でundefined | E-04 (L17) | ○ |
| C-101 | resolveFieldKeyType: カスタムtypeKey | E-04 (L21-23) | ○ |
| C-102 | resolveFieldKeyType: デフォルト'type' | E-04 (L22) | ○ |
| C-103 | getErrorMessageForTypedFieldAndValue: typeなしエラー | E-04 (L25-35) | ○ |
| C-104 | getErrorMessageForTypedFieldAndValue: 不正typeエラー | E-04 (L25-35) | ○ |
| C-105 | getErrorMessageForTypedFieldAndValue: カスタムtypeKey | E-04 (L26-27) | ○ |
| C-106 | schema: allow_addプロパティ | E-03 (L3) | ○ |
| C-107 | schema: min/maxプロパティ | E-03 (L12-13) | ○ |
| C-108 | schema: 全プロパティの完全性 | E-03 (L2-13) | ○ |

## 4) 不足情報（Unknown / Missing）
- **C-58 (handleChangeFor メタデータマージ)**: metadataがImmutableMapの場合のtoJS()変換と、Object.assignによるマージの正確な動作は実行時テストでの確認が必要。metadataがnullの場合のハンドリングパスも含む
  - 候補：実行時テスト / decap-cms-lib-widgets のmetadata仕様
- **C-84〜C-86 (focus メソッド)**: setStateのコールバック関数内でchildRefsのfocusを呼ぶ非同期パターンは、React 19のバッチ更新動作との組み合わせで実行時検証が必要
  - 候補：React 19 setState仕様 / 統合テスト
- **C-89 (label_singular単数形)**: renderListControl内のラベルロジック（items.size === 1判定）は既存テストでカバーされていない
  - 候補：既存テスト追加 / DOM出力の手動確認

## 5) リスクフラグ（レビュー観点）
- 0: **スキーマ定義 (C-106〜C-108)** - 静的定義のため低リスク
- 0: **typedListHelpers (C-96〜C-105)** - 純粋関数でありテストが容易
- 1: **handleChangeFor (C-56〜C-58)** - Immutable.jsのメソッドチェーンとメタデータの変換が含まれ、中リスク
- 1: **handleRemove (C-59〜C-63)** - 状態管理・エラークリア・値更新が複合的に行われるため中リスク
- 1: **onSortEnd (C-79〜C-80)** - 配列のsplice操作によるミュータブルな操作とImmutableの組み合わせ
- 2: **focus (C-84〜C-86)** - setState非同期コールバック内でのDOM操作は高リスク

## 6) レビュアーチェックリスト（最小）
- [ ] validateSizeのテストケース（C-47〜C-53）が既存テスト（E-05）と整合していること
- [ ] handleChangeFor（C-56〜C-58）のメタデータ処理が実際のCMS運用と整合すること
- [ ] focus（C-84〜C-86）の非同期動作がReact 19環境で正しく動作するか検証すること
- [ ] objectLabelの各valueType（C-70〜C-78）のテストケースが既存テスト（E-05）と重複していないこと
- [ ] handleRemoveのエラークリア処理（C-62〜C-63）がfieldsErrorsの各パターンをカバーしていること
- [ ] addItem（C-38〜C-40）のadd_to_topオプションがkeys/itemsCollapsedの整合性を保つこと
