---
generated_at: 2026-02-25 12:00:00
metrics:
  claims_total: 68
  claims_with_evidence: 65
  claims_without_evidence: 3
confidence_derived: 0.96
---

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

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.96**
  - 根拠あり：65 / 68、根拠なし：3
- 優先レビュー（高）
  1. **C-65 (UT-SEL-065)**: setActiveStyleのフォーカスイベントハンドリング - コード上onFocus={setActiveStyle}は確認できるが、実際のイベント発火テストの詳細根拠が不十分
  2. **C-66 (UT-SEL-066)**: setInactiveStyleのブラーイベントハンドリング - コード上onBlur={setInactiveStyle}は確認できるが、実際のイベント発火テストの詳細根拠が不十分
  3. **C-54 (UT-SEL-054)**: 空リストのプレビュー表示 - ListPreviewコンポーネントの空List入力時の挙動は明示的にテストされていない

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

- E-01: `packages/decap-cms-widget-select/src/SelectControl.js` - SelectControlクラス、optionToString、convertToOption、getSelectedValue関数の定義
- E-02: `packages/decap-cms-widget-select/src/SelectPreview.js` - SelectPreview、ListPreviewコンポーネントの定義
- E-03: `packages/decap-cms-widget-select/src/index.js` - Widget関数、DecapCmsWidgetSelectエクスポートの定義
- E-04: `packages/decap-cms-widget-select/src/schema.js` - スキーマ定義オブジェクト
- E-05: `packages/decap-cms-widget-select/src/__tests__/select.spec.js` - 既存テストケース（28テスト）
- E-06: `packages/decap-cms-widget-select/package.json` - パッケージ定義、依存関係情報

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | UT-SEL-001: optionToStringに文字列valueのオプションを渡すと文字列が返る | E-01 (L10-14: typeof option.value === 'string') | ○ |
| C-02 | UT-SEL-002: optionToStringに数値valueのオプションを渡すと数値が返る | E-01 (L10-14: typeof option.value === 'number') | ○ |
| C-03 | UT-SEL-003: optionToStringにvalue=0のオプションを渡すと0が返る | E-01 (L10-14), E-05 (L142-152: numberOptions[0].value=0テスト) | ○ |
| C-04 | UT-SEL-004: optionToStringにnullを渡すとnullが返る | E-01 (L11: option && ... の短絡評価) | ○ |
| C-05 | UT-SEL-005: optionToStringにundefinedを渡すとnullが返る | E-01 (L11: option && ... の短絡評価) | ○ |
| C-06 | UT-SEL-006: optionToStringにオブジェクトvalueを渡すとnullが返る | E-01 (L11: typeof判定でstring/number以外はnull) | ○ |
| C-07 | UT-SEL-007: optionToStringにbooleanのvalueを渡すとnullが返る | E-01 (L11: typeof判定でstring/number以外はnull) | ○ |
| C-08 | UT-SEL-008: convertToOptionに文字列を渡すとlabel/value同値のオブジェクトが返る | E-01 (L17-18: typeof raw === 'string') | ○ |
| C-09 | UT-SEL-009: convertToOptionにImmutableMapを渡すとJSオブジェクトに変換される | E-01 (L20: Map.isMap(raw) ? raw.toJS()) | ○ |
| C-10 | UT-SEL-010: convertToOptionにプレーンオブジェクトを渡すとそのまま返る | E-01 (L20: Map.isMapがfalseならrawをそのまま返却) | ○ |
| C-11 | UT-SEL-011: getSelectedValueで単一選択時に一致するオプションが返る | E-01 (L36: find(options, ['value', value])), E-05 (L92-102) | ○ |
| C-12 | UT-SEL-012: getSelectedValueで単一選択時に一致しない場合nullが返る | E-01 (L36: || null) | ○ |
| C-13 | UT-SEL-013: getSelectedValueで複数選択時にImmutable Listから一致するオプション配列が返る | E-01 (L24-34), E-05 (L247-256) | ○ |
| C-14 | UT-SEL-014: getSelectedValueで複数選択時に通常配列から一致するオプション配列が返る | E-01 (L25: List.isList(value) ? value.toJS() : value) | ○ |
| C-15 | UT-SEL-015: getSelectedValueで複数選択時にnullが渡されるとnullが返る | E-01 (L27-29: !selectedOptions || !Array.isArray) | ○ |
| C-16 | UT-SEL-016: getSelectedValueで複数選択時にundefinedが渡されるとnullが返る | E-01 (L27-29: !selectedOptions) | ○ |
| C-17 | UT-SEL-017: getSelectedValueで複数選択時に空Listが渡されると空配列が返る | E-01 (L31-34: mapとfilterで空配列になる) | ○ |
| C-18 | UT-SEL-018: getSelectedValueで複数選択時に部分一致のみ返る | E-01 (L33: .filter(Boolean)で未一致を除外) | ○ |
| C-19 | UT-SEL-019: isValidでmultiple=falseの場合エラーなし | E-01 (L67-69), E-05 (L356-362) | ○ |
| C-20 | UT-SEL-020: isValidでmultiple=trueかつmin/max未設定でエラーなし | E-01 (L62-80), E-05 (L328-334) | ○ |
| C-21 | UT-SEL-021: isValidでmin条件を満たす場合エラーなし | E-01 (L62-80), E-05 (L328-334) | ○ |
| C-22 | UT-SEL-022: isValidでmax条件を満たす場合エラーなし | E-01 (L62-80), E-05 (L335-341) | ○ |
| C-23 | UT-SEL-023: isValidでmin/max両方の条件を満たす場合エラーなし | E-01 (L62-80), E-05 (L342-348) | ○ |
| C-24 | UT-SEL-024: isValidでmin未満の場合rangeMinエラー | E-01 (L71-77), E-05 (L291-296) | ○ |
| C-25 | UT-SEL-025: isValidでmax超過の場合rangeMaxエラー | E-01 (L71-77), E-05 (L297-303) | ○ |
| C-26 | UT-SEL-026: isValidでmin/max設定時にmin未満でrangeCountエラー | E-01 (L71-77), E-05 (L305-311) | ○ |
| C-27 | UT-SEL-027: isValidでmin/max設定時にmax超過でrangeCountエラー | E-01 (L71-77), E-05 (L312-318) | ○ |
| C-28 | UT-SEL-028: isValidでmin=max設定時に件数不一致でrangeCountExactエラー | E-01 (L71-77), E-05 (L319-327) | ○ |
| C-29 | UT-SEL-029: isValidでmin=max設定時に件数一致でエラーなし | E-01 (L71-77), E-05 (L349-355) | ○ |
| C-30 | UT-SEL-030: isValidで値が空(undefined)の場合min設定があってもエラーなし | E-01 (L71-77), E-05 (L363-376) | ○ |
| C-31 | UT-SEL-031: isValidでmultiple=falseの場合min/maxが設定されていてもスキップ | E-01 (L67-69), E-05 (L356-362) | ○ |
| C-32 | UT-SEL-032: handleChangeで単一選択時にonChangeが値で呼ばれる | E-01 (L94-95), E-05 (L92-102) | ○ |
| C-33 | UT-SEL-033: handleChangeで数値0のオプション選択時にonChangeが0で呼ばれる | E-01 (L94-95, L10-14), E-05 (L142-152) | ○ |
| C-34 | UT-SEL-034: handleChangeで複数選択時にonChangeがImmutable Listで呼ばれる | E-01 (L91-93), E-05 (L155-167) | ○ |
| C-35 | UT-SEL-035: handleChangeで数値0を含む複数選択時にonChangeが正しく呼ばれる | E-01 (L91-93, L10-14), E-05 (L269-283) | ○ |
| C-36 | UT-SEL-036: handleChangeで単一選択クリア時にonChangeがnullで呼ばれる | E-01 (L88-90), E-05 (L104-113, L115-123) | ○ |
| C-37 | UT-SEL-037: handleChangeでrequired=true複数選択クリア時にonChangeが空Listで呼ばれる | E-01 (L87-88), E-05 (L221-232) | ○ |
| C-38 | UT-SEL-038: handleChangeでrequired=false複数選択クリア時にonChangeがnullで呼ばれる | E-01 (L88-90), E-05 (L234-245) | ○ |
| C-39 | UT-SEL-039: handleChangeで複数選択アイテム部分削除時にonChangeが残りのリストで呼ばれる | E-01 (L91-93), E-05 (L169-179) | ○ |
| C-40 | UT-SEL-040: componentDidMountでrequired=true, multiple=true, 値なしの場合に空リストで初期化 | E-01 (L107-108), E-05 (L182-188) | ○ |
| C-41 | UT-SEL-041: componentDidMountでrequired=true, multiple=true, 値がList以外の場合にList変換 | E-01 (L104-106), E-05 (L212-219) | ○ |
| C-42 | UT-SEL-042: componentDidMountでrequired=false, multiple=trueの場合onChangeが呼ばれない | E-01 (L104: required判定), E-05 (L190-196) | ○ |
| C-43 | UT-SEL-043: componentDidMountでrequired=true, multiple=true, 値が既にListの場合onChangeが呼ばれない | E-01 (L105: List.isList(value)判定) | ○ |
| C-44 | UT-SEL-044: renderで単一選択のデフォルト値が正しく表示される | E-01 (L119-124), E-05 (L125-130) | ○ |
| C-45 | UT-SEL-045: renderで文字列オプションのデフォルト値が正しく表示される | E-01 (L119-124), E-05 (L132-140) | ○ |
| C-46 | UT-SEL-046: renderで複数選択のデフォルト値が正しく表示される | E-01 (L119-124), E-05 (L247-256) | ○ |
| C-47 | UT-SEL-047: renderで文字列オプションの複数選択デフォルト値が正しく表示される | E-01 (L119-124), E-05 (L258-267) | ○ |
| C-48 | UT-SEL-048: renderでrequired=true, multiple=falseの場合isClearable=false | E-01 (L117: !field.get('required', true) || isMultiple) | ○ |
| C-49 | UT-SEL-049: renderでrequired=falseの場合isClearable=true | E-01 (L117: !false = true) | ○ |
| C-50 | UT-SEL-050: renderでmultiple=trueの場合isClearable=true | E-01 (L117: || isMultiple) | ○ |
| C-51 | UT-SEL-051: SelectPreviewで文字列値が表示される | E-02 (L20: !List.isList(value)分岐でvalueを直接表示) | ○ |
| C-52 | UT-SEL-052: SelectPreviewでImmutable Listがリスト形式で表示される | E-02 (L20: List.isList(value)分岐でListPreview表示) | ○ |
| C-53 | UT-SEL-053: SelectPreviewでnull/undefinedの場合何も表示されない | E-02 (L21: !value && null) | ○ |
| C-54 | UT-SEL-054: SelectPreviewで空Listの場合空のulが表示される | E-02 (L8-14) | △ |
| C-55 | UT-SEL-055: ListPreviewで複数の値がli要素で表示される | E-02 (L8-14: values.map) | ○ |
| C-56 | UT-SEL-056: ListPreviewで1つの値がli要素1つで表示される | E-02 (L8-14: values.map) | ○ |
| C-57 | UT-SEL-057: Widget関数が引数なしでデフォルトウィジェットオブジェクトを返す | E-03 (L5-13: Widget関数の定義) | ○ |
| C-58 | UT-SEL-058: Widget関数にオプションを渡すとマージされたオブジェクトが返る | E-03 (L12: ...opts によるスプレッド) | ○ |
| C-59 | UT-SEL-059: DecapCmsWidgetSelectエクスポートにWidget, controlComponent, previewComponentが含まれる | E-03 (L15: エクスポート定義) | ○ |
| C-60 | UT-SEL-060: スキーマにoptionsが必須プロパティとして定義 | E-04 (L24: required: ['options']) | ○ |
| C-61 | UT-SEL-061: スキーマにmultipleがboolean型で定義 | E-04 (L3: type: 'boolean') | ○ |
| C-62 | UT-SEL-062: スキーマにminがinteger型で定義 | E-04 (L4: type: 'integer') | ○ |
| C-63 | UT-SEL-063: スキーマにmaxがinteger型で定義 | E-04 (L5: type: 'integer') | ○ |
| C-64 | UT-SEL-064: スキーマのoptionsが文字列・数値・オブジェクトのoneOfで定義 | E-04 (L8-20: oneOf定義) | ○ |
| C-65 | UT-SEL-065: フォーカス時にsetActiveStyleが呼ばれる | E-01 (L130: onFocus={setActiveStyle}) | △ |
| C-66 | UT-SEL-066: ブラー時にsetInactiveStyleが呼ばれる | E-01 (L131: onBlur={setInactiveStyle}) | △ |
| C-67 | UT-SEL-067: Deleteキーで単一選択の値がクリアされる | E-01 (L88-90), E-05 (L104-113) | ○ |
| C-68 | UT-SEL-068: Deleteキーで複数選択の値がクリアされる | E-01 (L87-90), E-05 (L198-209) | ○ |

## 4) 不足情報（Unknown / Missing）
- **C-54**: 空のImmutable Listを`SelectPreview`に渡した場合の挙動は、既存テスト(`select.spec.js`)で明示的にテストされていない。コード上は`List.isList(value)`がtrueとなりListPreviewが呼ばれ、空のul要素がレンダリングされると推測されるが、空Listが`truthy`として扱われるかはImmutableの実装に依存する。
  - 候補：Immutableライブラリのドキュメント / 実際のレンダリングテスト / E2Eテスト
- **C-65, C-66**: setActiveStyle / setInactiveStyleのイベントハンドリングは、renderメソッド内で`onFocus`/`onBlur`にバインドされていることはコードで確認できるが、react-selectコンポーネントの内部的なイベント伝播の詳細は外部ライブラリの実装に依存するため根拠が不十分。
  - 候補：react-selectのドキュメント / 統合テスト / E2Eテスト

## 5) リスクフラグ（レビュー観点）
- 0: 低リスク - schema.jsのテストケース（C-60〜C-64）はスキーマ定義のスナップショット的な確認であり、バリデーションロジック自体は`decap-cms-lib-widgets`パッケージに委譲されている
- 0: 低リスク - ListPreview（C-55, C-56）は単純なmap表示コンポーネントであり、テスト失敗リスクは低い
- 1: 中リスク - react-selectライブラリのバージョンアップにより、イベントハンドリング（C-65, C-66）やUI操作（クリアボタン等）の挙動が変わる可能性がある
- 1: 中リスク - Immutableライブラリ（v3.7.6）のList/Mapに依存する変換処理（convertToOption, getSelectedValue）は、ライブラリバージョン変更時に影響を受ける可能性がある

## 6) レビュアーチェックリスト（最小）
- [ ] optionToStringのnull/undefined処理（C-04, C-05）が期待通りか確認
- [ ] getSelectedValueの複数選択時のImmutable List / 通常配列両対応（C-13, C-14）が網羅的か確認
- [ ] handleChangeの条件分岐（required x multiple の組み合わせ）が全パターン網羅されているか確認（C-32〜C-39）
- [ ] componentDidMountの初期化ロジック（C-40〜C-43）が全条件分岐をカバーしているか確認
- [ ] isClearableの算出ロジック（C-48〜C-50）の全条件パターンが正しいか確認
- [ ] SelectPreviewの空List表示（C-54）の実際の挙動を確認
- [ ] react-selectのフォーカス/ブラーイベント（C-65, C-66）が期待通り発火するか確認
