---
generated_at: 2026-02-25 12:00:00
metrics:
  claims_total: 110
  claims_with_evidence: 107
  claims_without_evidence: 3
confidence_derived: 0.97
---

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

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.97**
  - 根拠あり：107 / 110、根拠なし：3
- 優先レビュー（高）
  1. **C-092（Toggle カスタムコンポーネント注入）**：カスタムコンポーネント渡し時の実際の動作確認がソースコード上の型定義のみに基づく
  2. **C-093（Toggle onFocusイベント）**：onFocusはpropsとして渡されるがContainer経由の伝搬をテストで検証する必要がある
  3. **C-094（Toggle onBlurイベント）**：onBlurはpropsとして渡されるがContainer経由の伝搬をテストで検証する必要がある

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

- E-01: `packages/decap-cms-ui-default/src/Icon.js` - getRotation関数定義（L39-46）、Icon関数コンポーネント（L55-67）、sizesオブジェクト（L48-53）
- E-02: `packages/decap-cms-ui-default/src/AuthenticationPage.js` - renderPageLogo関数（L43-48）、AuthenticationPage関数コンポーネント（L77-105）、PropTypes定義（L107-120）
- E-03: `packages/decap-cms-ui-default/src/Dropdown.js` - Dropdown関数（L85-108）、DropdownItem関数（L119-130）、DropdownCheckedItem関数（L154-161）、StyledMenuItem関数（L52-76）、PropTypes定義
- E-04: `packages/decap-cms-ui-default/src/FieldLabel.js` - getStateColors関数（L20-24）、stateColorsオブジェクト（L5-18）、FieldLabel styled component（L26-57）
- E-05: `packages/decap-cms-ui-default/src/GoBackButton.js` - GoBackButtonクラス（L23-44）、render メソッド（L34-43）、PropTypes定義（L24-27）
- E-06: `packages/decap-cms-ui-default/src/IconButton.js` - IconButton関数（L26-38）、sizesオブジェクト（L7-10）
- E-07: `packages/decap-cms-ui-default/src/ListItemTopBar.js` - ListItemTopBar関数（L48-76）、DragHandle関数（L38-46）、PropTypes定義（L78-85）
- E-08: `packages/decap-cms-ui-default/src/Loader.js` - Loaderクラス（L59-122）、renderChild メソッド（L91-116）、setAnimation メソッド（L80-89）、componentWillUnmount（L74-78）
- E-09: `packages/decap-cms-ui-default/src/ObjectWidgetTopBar.js` - ObjectWidgetTopBarクラス（L52-130）、renderAddUI（L75-84）、renderTypesDropdown（L86-104）、renderAddButton（L106-113）、render（L115-129）
- E-10: `packages/decap-cms-ui-default/src/Toggle.js` - Toggle関数コンポーネント（L47-82）、handleToggle関数（L60-65）、PropTypes定義（L84-94）
- E-11: `packages/decap-cms-ui-default/src/WidgetPreviewContainer.js` - styled div定義（L3-6）
- E-12: `packages/decap-cms-ui-default/src/styles.js` - reactSelectStyles（L373-417）、GlobalStyles関数（L433-525）、colorsRaw（L34-53）、colors（L55-87）、zIndex（L419-431）
- E-13: `packages/decap-cms-ui-default/src/Icon/icons.js` - iconsマッピング（L39-42）、config定義（L22-32）
- E-14: `packages/decap-cms-ui-default/src/Icon/images/_index.js` - imagesオブジェクト（L52-102）
- E-15: `packages/decap-cms-ui-default/src/index.js` - DecapCmsUiDefaultオブジェクト（L34-67）、named exports（L68-102）

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-001 | getRotation: iconDirection='left', newDirection='right'で'-180deg'が返る | E-01 (L39-46: rotations定義と計算式) | ○ |
| C-002 | getRotation: 同方向で'0deg'が返る | E-01 (L44: degrees計算) | ○ |
| C-003 | getRotation: down->upで'180deg'が返る | E-01 (L43-45: rotations[up]-rotations[down]) | ○ |
| C-004 | getRotation: iconDirection=undefinedで'0deg'が返る | E-01 (L40: !iconDirection条件) | ○ |
| C-005 | getRotation: newDirection=undefinedで'0deg'が返る | E-01 (L40: !newDirection条件) | ○ |
| C-006 | getRotation: 両方undefinedで'0deg'が返る | E-01 (L40: 早期return) | ○ |
| C-007 | getRotation: null値で'0deg'が返る | E-01 (L40: !null === true) | ○ |
| C-008 | Icon: 有効なtypeでSVGがレンダリングされる | E-01 (L56: icons[type].image参照) | ○ |
| C-009 | Icon: デフォルトsize='medium'が適用される | E-01 (L55: size='medium'デフォルト引数) | ○ |
| C-010 | Icon: 名前付きサイズがピクセル値に変換される | E-01 (L48-53: sizesオブジェクト, L61: sizes[size]) | ○ |
| C-011 | Icon: カスタムサイズ文字列が直接使用される | E-01 (L61: sizes[size] || size) | ○ |
| C-012 | Icon: direction指定で回転が適用される | E-01 (L62: getRotation呼び出し) | ○ |
| C-013 | Icon: 存在しないtypeでエラーが発生する | E-01 (L56: icons[type]がundefinedでプロパティアクセスエラー) | ○ |
| C-014 | renderPageLogo: logoUrl指定でCustomLogoIconが返る | E-02 (L44: if(logoUrl)条件) | ○ |
| C-015 | renderPageLogo: falsyでDecapLogoIconが返る | E-02 (L47: elseブランチ) | ○ |
| C-016 | renderPageLogo: 空文字列でDecapLogoIconが返る | E-02 (L44: 空文字列はfalsy) | ○ |
| C-017 | AuthenticationPage: 基本propsでレンダリング | E-02 (L77-105: コンポーネント定義) | ○ |
| C-018 | AuthenticationPage: loginErrorMessage表示 | E-02 (L92: 条件付きレンダリング) | ○ |
| C-019 | AuthenticationPage: loginErrorMessage=null非表示 | E-02 (L92: falsyでnull) | ○ |
| C-020 | AuthenticationPage: renderButtonContentでLoginButton表示 | E-02 (L96-99: 条件付きレンダリング) | ○ |
| C-021 | AuthenticationPage: renderPageContentでカスタムコンテンツ | E-02 (L93-95: 条件付きレンダリング) | ○ |
| C-022 | AuthenticationPage: siteUrlでGoBackButton表示 | E-02 (L101: &&条件) | ○ |
| C-023 | AuthenticationPage: siteUrl未指定でGoBackButton非表示 | E-02 (L101: falsyでfalse) | ○ |
| C-024 | AuthenticationPage: logoUrl指定でNetlifyCreditIcon表示 | E-02 (L102: authLogoUrl条件) | ○ |
| C-025 | AuthenticationPage: logo.srcがlogoUrlの代替 | E-02 (L88: logoUrl || logo?.src) | ○ |
| C-026 | AuthenticationPage: loginDisabled=trueでボタン無効化 | E-02 (L97: disabled={loginDisabled}) | ○ |
| C-027 | AuthenticationPage: onLoginコールバック呼び出し | E-02 (L97: onClick={onLogin}) | ○ |
| C-028 | AuthenticationPage: showAbortButton=!siteUrl | E-02 (L95: showAbortButton: !siteUrl) | ○ |
| C-029 | Dropdown: renderButtonでボタン表示 | E-03 (L100: renderButton()呼び出し) | ○ |
| C-030 | Dropdown: childrenがMenu内に表示 | E-03 (L101-105: Menu > DropdownList > children) | ○ |
| C-031 | Dropdown: デフォルトプロパティ値 | E-03 (L86-90: デフォルト引数定義) | ○ |
| C-032 | Dropdown: closeOnSelectionデフォルト値 | E-03 (L86: closeOnSelection=true) | ○ |
| C-033 | Dropdown: dropdownPosition='right'適用 | E-03 (L44-49: position propsの条件分岐) | ○ |
| C-034 | DropdownItem: labelとicon表示 | E-03 (L119-130: レンダリングロジック) | ○ |
| C-035 | DropdownItem: icon未指定で非表示 | E-03 (L123-127: icon条件チェック) | ○ |
| C-036 | DropdownItem: isActive=trueでアクティブスタイル | E-03 (L121: isActive props, L61: 色適用) | ○ |
| C-037 | DropdownItem: iconSmall=trueでxsmallサイズ | E-03 (L125: size={iconSmall ? 'xsmall' : 'small'}) | ○ |
| C-038 | DropdownCheckedItem: checked=true表示 | E-03 (L154-161: checked props) | ○ |
| C-039 | DropdownCheckedItem: checked=false表示 | E-03 (L154-161: checked props) | ○ |
| C-040 | DropdownCheckedItem: labelテキスト表示 | E-03 (L158: label表示) | ○ |
| C-041 | getStateColors: hasErrors=trueでerror色 | E-04 (L21: if(hasErrors)条件) | ○ |
| C-042 | getStateColors: isActive=trueでactive色 | E-04 (L22: if(isActive)条件) | ○ |
| C-043 | getStateColors: デフォルトでdefault色 | E-04 (L23: return stateColors.default) | ○ |
| C-044 | getStateColors: hasErrorsがisActiveより優先 | E-04 (L21-22: if文の順序) | ○ |
| C-045 | FieldLabel: デフォルト状態でレンダリング | E-04 (L26-57: styled component定義) | ○ |
| C-046 | GoBackButton: hrefとテキスト表示 | E-05 (L34-43: render) | ○ |
| C-047 | GoBackButton: arrowアイコンsmallサイズ | E-05 (L39: Icon type='arrow' size='small') | ○ |
| C-048 | GoBackButton: 翻訳キー確認 | E-05 (L40: t('ui.default.goBackToSite')) | ○ |
| C-049 | IconButton: typeとsizeがアイコンに渡される | E-06 (L34: Icon type={type} size={size}) | ○ |
| C-050 | IconButton: isActive=trueでアクティブ色 | E-06 (L29: isActive props) | ○ |
| C-051 | IconButton: onClickコールバック | E-06 (L32: onClick={onClick}) | ○ |
| C-052 | IconButton: title属性 | E-06 (L33: title={title}) | ○ |
| C-053 | ListItemTopBar: onCollapseToggleで折りたたみボタン表示 | E-07 (L61-65: 条件付きレンダリング) | ○ |
| C-054 | ListItemTopBar: collapsed=trueでchevron right | E-07 (L63: direction={collapsed ? 'right' : 'down'}) | ○ |
| C-055 | ListItemTopBar: onCollapseToggle未指定で非表示 | E-07 (L61: onCollapseToggle ? 条件) | ○ |
| C-056 | ListItemTopBar: onRemoveとallowRemoveで削除ボタン | E-07 (L67: onRemove && allowRemove条件) | ○ |
| C-057 | ListItemTopBar: allowRemove=falseで非表示 | E-07 (L67-73: else分岐で空span) | ○ |
| C-058 | ListItemTopBar: dragHandleとallowReorderで表示 | E-07 (L66: dragHandle && allowReorder条件) | ○ |
| C-059 | ListItemTopBar: allowReorder=falseで非表示 | E-07 (L66: falseで空span) | ○ |
| C-060 | ListItemTopBar: onCollapseToggleコールバック | E-07 (L62: onClick={onCollapseToggle}) | ○ |
| C-061 | ListItemTopBar: onRemoveコールバック | E-07 (L68: onClick={onRemove}) | ○ |
| C-062 | DragHandle: Wrapperでdrag-handleアイコン表示 | E-07 (L38-46: DragHandle関数) | ○ |
| C-063 | Loader: 文字列childrenでLoaderText表示 | E-08 (L96-97: typeof children == 'string'分岐) | ○ |
| C-064 | Loader: 配列childrenでアニメーション表示 | E-08 (L98-114: Array.isArray分岐) | ○ |
| C-065 | Loader: undefined childrenでnull返却 | E-08 (L94: if(!children) return null) | ○ |
| C-066 | Loader: 配列でinterval設定 | E-08 (L80-89: setAnimation, L99: this.setAnimation()) | ○ |
| C-067 | Loader: interval重複防止 | E-08 (L81: if(this.interval) return) | ○ |
| C-068 | Loader: インターバルで次アイテム切り替え | E-08 (L84-88: setInterval内のsetState) | ○ |
| C-069 | Loader: 最後から先頭に循環 | E-08 (L85-86: currentItem === children.length - 1 ? 0 : ...) | ○ |
| C-070 | Loader: アンマウント時clearInterval | E-08 (L74-78: componentWillUnmount) | ○ |
| C-071 | Loader: interval未設定時のアンマウント | E-08 (L75: if(this.interval)条件) | ○ |
| C-072 | ObjectWidgetTopBar: allowAdd=falseでnull | E-09 (L76: if(!this.props.allowAdd) return null) | ○ |
| C-073 | ObjectWidgetTopBar: allowAdd=trueでAddButton | E-09 (L81-82: else分岐) | ○ |
| C-074 | ObjectWidgetTopBar: types指定でDropdown | E-09 (L79-80: types && types.size > 0) | ○ |
| C-075 | ObjectWidgetTopBar: 空typesでAddButton | E-09 (L79: types.size > 0がfalse) | ○ |
| C-076 | ObjectWidgetTopBar: AddButtonクリックでonAdd | E-09 (L108: onClick={this.props.onAdd}) | ○ |
| C-077 | ObjectWidgetTopBar: ラベルとアイコン表示 | E-09 (L109-110: ラベルとaddアイコン) | ○ |
| C-078 | ObjectWidgetTopBar: タイプ別DropdownItem | E-09 (L95-101: types.map) | ○ |
| C-079 | ObjectWidgetTopBar: タイプ選択でonAddType | E-09 (L99: onClick={() => this.props.onAddType(type.get('name'))) | ○ |
| C-080 | ObjectWidgetTopBar: labelフォールバックでname使用 | E-09 (L98: type.get('label', type.get('name'))) | ○ |
| C-081 | ObjectWidgetTopBar: onCollapseToggleコールバック | E-09 (L121: onClick={onCollapseToggle}) | ○ |
| C-082 | ObjectWidgetTopBar: collapsed=trueでchevron right | E-09 (L122: direction={collapsed ? 'right' : 'down'}) | ○ |
| C-083 | ObjectWidgetTopBar: collapsed=falseでchevron down | E-09 (L122: 上記の逆分岐) | ○ |
| C-084 | ObjectWidgetTopBar: heading表示 | E-09 (L120: hasHeading={!!heading}, L124: {heading}) | ○ |
| C-085 | Toggle: active=trueで初期化 | E-10 (L58: useState(active)) | ○ |
| C-086 | Toggle: active=falseで初期化 | E-10 (L58: useState(active)) | ○ |
| C-087 | Toggle: クリックでトグル反転 | E-10 (L61: setIsActive(prev => !prev)) | ○ |
| C-088 | Toggle: onChangeが新しい値で呼び出される | E-10 (L62-64: onChange(!isActive)) | ○ |
| C-089 | Toggle: onChange未指定でエラーなし | E-10 (L62: if(onChange)条件) | ○ |
| C-090 | Toggle: role='switch'属性 | E-10 (L74: role="switch") | ○ |
| C-091 | Toggle: aria-checked連動 | E-10 (L75: aria-checked={isActive?.toString()}) | ○ |
| C-092 | Toggle: カスタムコンポーネント注入 | E-10 (L54-56: デフォルト引数でカスタム可能) | △ |
| C-093 | Toggle: onFocusコールバック | E-10 (L69: onFocus={onFocus}) | △ |
| C-094 | Toggle: onBlurコールバック | E-10 (L70: onBlur={onBlur}) | △ |
| C-095 | reactSelectStyles control: border: 0 | E-12 (L374-381: controlスタイル定義) | ○ |
| C-096 | reactSelectStyles option: isSelected時の色 | E-12 (L383-391: option条件分岐) | ○ |
| C-097 | reactSelectStyles option: isFocused時の色 | E-12 (L383-391: option条件分岐) | ○ |
| C-098 | reactSelectStyles option: デフォルトtransparent | E-12 (L383-391: 最後のフォールバック) | ○ |
| C-099 | reactSelectStyles indicatorSeparator: 表示条件 | E-12 (L394-397: hasValue && isClearable条件) | ○ |
| C-100 | reactSelectStyles indicatorSeparator: 非表示条件 | E-12 (L394-397: display: 'none'フォールバック) | ○ |
| C-101 | GlobalStyles: Globalコンポーネントレンダリング | E-12 (L433-525: GlobalStyles関数) | ○ |
| C-102 | icons: imageプロパティ変換 | E-13 (L39-41: mapValues変換ロジック) | ○ |
| C-103 | icons: config定義のプロパティ反映 | E-13 (L22-32: config, L40: config[name]) | ○ |
| C-104 | icons: config未定義でimageのみ | E-13 (L40: config[name] || {}) | ○ |
| C-105 | icons: chevronのdirection='down' | E-13 (L27-29: chevron config) | ○ |
| C-106 | index.js: named export確認 | E-15 (L68-102: export文) | ○ |
| C-107 | index.js: DecapCmsUiDefaultオブジェクト | E-15 (L34-67: オブジェクト定義) | ○ |
| C-108 | WidgetPreviewContainer: div要素レンダリング | E-11 (L3-6: styled.div定義) | ○ |
| C-109 | colorsRaw定数値 | E-12 (L34-53: colorsRaw定義) | ○ |
| C-110 | zIndex定数値 | E-12 (L419-431: zIndex定義) | ○ |

## 4) 不足情報（Unknown / Missing）
- C-092: カスタムコンポーネント（Container, Background, Handle）の差し替え時の動作は、PropTypes定義とデフォルト引数から推測。実際のカスタムコンポーネント使用例がコード内に存在しないため、期待結果の正確性をレビューで確認が必要。
  - 候補：外部モジュールでの使用例調査 / 統合テストでの確認 / styled-components互換性テスト
- C-093, C-094: onFocus/onBlurはToggleContainer（button要素）に直接渡されるが、実際にイベントがバブリングするかはブラウザ環境での動作確認が必要。
  - 候補：Testing LibraryでのfireEvent.focus/blur検証 / jsdomの動作仕様確認

## 5) リスクフラグ（レビュー観点）
- 0（低リスク）: テストケースの大部分（107/110）はソースコードの直接的な実装に基づいており、条件分岐・関数シグネチャ・PropTypes定義と整合している
- 1（中リスク）: Loader.setAnimationのsetInterval（C-066〜C-069）はタイマー系テストのためfakeTimers設定が必要
- 1（中リスク）: ObjectWidgetTopBarのtypes propsはImmutable.js Listを前提としており、テスト時にImmutableオブジェクトの準備が必要
- 0（低リスク）: styled-components / Emotionベースのスタイルテストは、レンダリング確認に留まりCSS値の検証は含めていない

## 6) レビュアーチェックリスト（最小）
- [ ] getRotation関数の回転計算（C-001〜C-007）が全方向組み合わせで正しいか
- [ ] AuthenticationPage の logoUrl / logo.src の優先順位ロジック（C-025）が実際のユースケースと一致するか
- [ ] Loader の setAnimation/componentWillUnmount（C-066〜C-071）のタイマー管理テストが適切か
- [ ] ObjectWidgetTopBar の types が Immutable.js List であることのテスト環境準備が記載されているか（C-074, C-075, C-078〜C-080）
- [ ] Toggle の useState 初期値と onChange コールバックの値（C-088）が React のバッチ更新と整合するか
- [ ] reactSelectStyles の各関数スタイル（C-095〜C-100）のテスト方法が明確か
- [ ] DropdownCheckedItem の readOnly checkbox（C-038, C-039）がアクセシビリティ観点で問題ないか
