---
generated_at: 2026-02-25 15:00:00
metrics:
  claims_total: 47
  claims_with_evidence: 44
  claims_without_evidence: 3
confidence_derived: 0.94
---

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

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.94**
  - 根拠あり：44 / 47、根拠なし：3
- 優先レビュー（高）
  1. **C-29（UT-TXT-029）**：長大文字列の境界値テストにおけるしきい値10000文字の根拠が不明
  2. **C-25（UT-TXT-025）**：falseをvalueに渡した場合のフォールバック動作の具体的な描画結果が推測
  3. **C-26（UT-TXT-026）**：数値をvalueに渡した場合のTextareaの具体的な描画結果が推測（外部ライブラリ依存）

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

- E-01: `packages/decap-cms-widget-text/src/index.js` - Widget関数定義（L4-11）およびDecapCmsWidgetTextエクスポート定義（L13-14）
- E-02: `packages/decap-cms-widget-text/src/TextControl.js` - TextControlクラスコンポーネント（propTypes L6-13, defaultProps L15-17, componentDidMount L19-22, shouldComponentUpdate L31-33, render L35-51）
- E-03: `packages/decap-cms-widget-text/src/TextPreview.js` - TextPreview関数コンポーネント（L5-7）およびpropTypes定義（L9-11）
- E-04: `packages/decap-cms-widget-text/package.json` - パッケージ定義（依存関係: react-textarea-autosize ^8.0.0, peerDependencies: react ^19.1.0, prop-types ^15.7.2）

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | Widget()がデフォルトで{ name: 'text', controlComponent, previewComponent }を返す | E-01（L4-11: return { name: 'text', controlComponent, previewComponent, ...opts }） | ○ |
| C-02 | Widget()のnameプロパティがデフォルトで'text'である | E-01（L6: name: 'text'） | ○ |
| C-03 | Widget()のcontrolComponentがTextControlである | E-01（L1: import controlComponent from './TextControl', L7: controlComponent） | ○ |
| C-04 | Widget()のpreviewComponentがTextPreviewである | E-01（L2: import previewComponent from './TextPreview', L8: previewComponent） | ○ |
| C-05 | optsでnameをオーバーライドできる | E-01（L9: ...opts スプレッド演算子でnameが上書きされる） | ○ |
| C-06 | optsで追加プロパティをマージできる | E-01（L9: ...opts） | ○ |
| C-07 | optsでcontrolComponentをオーバーライドできる | E-01（L9: ...opts でcontrolComponentも上書き可能） | ○ |
| C-08 | 空オブジェクトを渡すとデフォルト値が維持される | E-01（L4: opts={} がデフォルト引数、...{} は何も追加しない） | ○ |
| C-09 | DecapCmsWidgetTextがWidget関数を含む | E-01（L13: { Widget, controlComponent, previewComponent }） | ○ |
| C-10 | DecapCmsWidgetTextがcontrolComponentを含む | E-01（L13） | ○ |
| C-11 | DecapCmsWidgetTextがpreviewComponentを含む | E-01（L13） | ○ |
| C-12 | デフォルトエクスポートがDecapCmsWidgetTextと同一 | E-01（L13-14: export const + export default） | ○ |
| C-13 | TextControlが全propsで正しくTextareaを描画する | E-02（L35-50: render()内のTextarea JSX要素） | ○ |
| C-14 | forIDがTextareaのid属性に設定される | E-02（L41: id={forID}） | ○ |
| C-15 | valueがTextareaのvalue属性に設定される | E-02（L42: value={value \|\| ''}） | ○ |
| C-16 | classNameWrapperがTextareaのclassNameに設定される | E-02（L43: className={classNameWrapper}） | ○ |
| C-17 | onChangeイベントでe.target.valueがコールバックに渡される | E-02（L48: onChange={e => onChange(e.target.value)}） | ○ |
| C-18 | onFocusイベントでsetActiveStyleが呼ばれる | E-02（L44: onFocus={setActiveStyle}） | ○ |
| C-19 | onBlurイベントでsetInactiveStyleが呼ばれる | E-02（L45: onBlur={setInactiveStyle}） | ○ |
| C-20 | TextareaのminRowsが5である | E-02（L46: minRows={5}） | ○ |
| C-21 | TextareaのcssにfontFamily='inherit'が設定されている | E-02（L47: css={{ fontFamily: 'inherit' }}） | ○ |
| C-22 | value=nullの場合にTextareaのvalueが空文字列になる | E-02（L42: value={value \|\| ''}, nullは falsyなので'' にフォールバック） | ○ |
| C-23 | value=undefinedの場合にdefaultPropsで空文字列が使用される | E-02（L15-17: defaultProps = { value: '' }, L42: value \|\| ''） | ○ |
| C-24 | value=0の場合にTextareaのvalueが空文字列になる | E-02（L42: value={value \|\| ''}, 0はfalsyなので''にフォールバック） | ○ |
| C-25 | value=falseの場合にTextareaのvalueが空文字列になる | E-02（L42: value \|\| '' でfalseはfalsyだが、PropTypes.nodeにfalseを渡すケースは稀で実運用上の根拠が薄い） | △ |
| C-26 | value=123の場合にTextareaが描画される | E-02（L9: PropTypes.nodeは数値許容だが、react-textarea-autosizeの具体的な描画結果は外部ライブラリ依存） | △ |
| C-27 | forID未指定でTextareaがid属性なしで描画される | E-02（L8: forID: PropTypes.string でisRequiredではない, L41: id={forID}） | ○ |
| C-28 | 空文字列のvalueでTextareaが正しく描画される | E-02（L42: value={value \|\| ''}, '' \|\| '' = ''） | ○ |
| C-29 | 10000文字の長大文字列でTextareaが正しく描画される | E-02（L42: valueをそのまま渡すが、10000文字という閾値の根拠なし） | △ |
| C-30 | 改行を含む複数行テキストで正しく描画される | E-02（L42: valueをそのまま渡す設計）, E-04（description: multiline plain string） | ○ |
| C-31 | shouldComponentUpdateが常にtrueを返す | E-02（L31-33: shouldComponentUpdate() { return true; }） | ○ |
| C-32 | componentDidMountでPropTypes.checkPropTypesが呼ばれる | E-02（L19-22: PropTypes.checkPropTypes(TextControl.propTypes, this.props, 'prop', 'TextControl')） | ○ |
| C-33 | onChangeがPropTypes.func.isRequired | E-02（L7: onChange: PropTypes.func.isRequired） | ○ |
| C-34 | classNameWrapperがPropTypes.string.isRequired | E-02（L10: classNameWrapper: PropTypes.string.isRequired） | ○ |
| C-35 | setActiveStyleがPropTypes.func.isRequired | E-02（L11: setActiveStyle: PropTypes.func.isRequired） | ○ |
| C-36 | setInactiveStyleがPropTypes.func.isRequired | E-02（L12: setInactiveStyle: PropTypes.func.isRequired） | ○ |
| C-37 | forIDがPropTypes.string | E-02（L8: forID: PropTypes.string） | ○ |
| C-38 | valueがPropTypes.node | E-02（L9: value: PropTypes.node） | ○ |
| C-39 | defaultPropsのvalueが空文字列 | E-02（L15-17: defaultProps = { value: '' }） | ○ |
| C-40 | TextPreviewが文字列valueでWidgetPreviewContainer内にテキスト表示する | E-03（L5-7: <WidgetPreviewContainer>{value}</WidgetPreviewContainer>） | ○ |
| C-41 | WidgetPreviewContainerコンポーネントが使用されている | E-03（L3: import, L6: JSX内で使用） | ○ |
| C-42 | TextPreviewがReactノードのvalueで描画する | E-03（L5-7, L10: PropTypes.node） | ○ |
| C-43 | TextPreviewにvalue=undefinedでエラーなく描画される | E-03（L5-7: {undefined}はReactで何も描画しない） | ○ |
| C-44 | TextPreviewにvalue=nullでエラーなく描画される | E-03（L5-7: {null}はReactで何も描画しない） | ○ |
| C-45 | TextPreviewに空文字列で空描画される | E-03（L5-7: {''}はReactで空テキストノード） | ○ |
| C-46 | TextPreviewに改行を含むテキストでそのまま表示される | E-03（L5-7: {value}をそのまま子要素として渡す設計） | ○ |
| C-47 | TextPreview.propTypes.valueがPropTypes.nodeである | E-03（L9-11: value: PropTypes.node） | ○ |

## 4) 不足情報（Unknown / Missing）
- C-25: value=false のフォールバック動作については、`value || ''` の JavaScript 挙動から推測可能だが、実運用上 false が渡されるユースケースの根拠が薄い。テストケースとしては防御的テストの位置づけ
  - 候補：Decap CMS のフィールド値管理仕様 / 実際の運用でfalseが渡されるケースの調査
- C-26: PropTypes.node は数値を許容するが、react-textarea-autosize の value prop に数値を渡した場合の具体的な描画結果（toString変換等）は外部ライブラリの実装に依存する
  - 候補：react-textarea-autosize のドキュメント / React の input value 変換仕様
- C-29: 長大文字列テストの境界値 10000 文字は、ソースコードに明示的な文字数制限が存在しないため、テストケースとしての閾値は任意に設定した
  - 候補：react-textarea-autosize の仕様書 / ブラウザの textarea 文字数上限 / 実際の運用要件

## 5) リスクフラグ（レビュー観点）
- 0: テストケース全体の構造とカバレッジ（3ファイル全てを網羅、47件のテストケースで十分なカバレッジ、低リスク）
- 0: Widget関数のテストケース（シンプルなファクトリ関数で低リスク）
- 1: TextControlのvalue || '' フォールバック（C-22, C-23, C-24）：0やfalseなどのfalsy値が意図せず空文字列に変換される可能性あり。設計上の意図確認が望ましい
- 1: TextControlのonChangeハンドリング（C-17）：ユーザー入力に直結する中核機能。e.target.value を直接渡す設計の妥当性を確認すべき
- 1: componentDidMountのPropTypes.checkPropTypes呼び出し（C-32）：React 19 の破壊的変更への対応。将来的な互換性リスクがある
- 0: TextPreviewのテストケース（単純な表示コンポーネントで低リスク）

## 6) レビュアーチェックリスト（最小）
- [ ] TextControlの `value || ''` フォールバック（C-22, C-23, C-24）が 0 や false などの falsy 値で意図しない動作をしないか確認
- [ ] TextControlのonChange（C-17）が実際に e.target.value を正しく抽出してコールバックに渡す設計であることを確認
- [ ] componentDidMountのPropTypes.checkPropTypes（C-32）がReact 19環境で期待通り動作するか確認
- [ ] 長大文字列テスト（C-29）の閾値10000文字が実運用上適切か確認
- [ ] TextPreviewのWidgetPreviewContainerをテスト時にどのようにモック化するか方針を確認
- [ ] value=0 のフォールバック（C-24）が意図的な設計か、バグの可能性があるか確認（数値0が正当な入力となるケースの有無）
