---
generated_at: 2026-01-29 10:30:00
metrics:
  claims_total: 117
  claims_with_evidence: 117
  claims_without_evidence: 0
confidence_derived: 1.00
---

# 根拠レポート：Core-System-CustomField 単体テストケース一覧

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**1.00**
  - 根拠あり：117 / 117、根拠なし：0
- 優先レビュー（高）
  1. **UT-CFD-047〜052**: CustomFieldService名前バリデーションのテストケース - CUSTOM_FIELD_NAME_PATTERNの正規表現に基づく
  2. **UT-CFD-035〜044**: CustomFieldService型マッピングのテストケース - match式による型変換ロジックに基づく
  3. **UT-CFD-114〜117**: CustomFieldSetActionController APIエンドポイントのテストケース - 実際のビジネスロジックに基づく

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

- E-01: `src/Core/System/CustomField/CustomFieldDefinition.php` - CustomFieldエンティティ定義
- E-02: `src/Core/System/CustomField/CustomFieldEntity.php` - CustomFieldエンティティクラス
- E-03: `src/Core/System/CustomField/CustomFieldCollection.php` - CustomFieldコレクションクラス
- E-04: `src/Core/System/CustomField/CustomFieldService.php` - CustomFieldサービスクラス
- E-05: `src/Core/System/CustomField/CustomFieldException.php` - CustomField例外クラス
- E-06: `src/Core/System/CustomField/CustomFieldTypes.php` - CustomField型定数クラス
- E-07: `src/Core/System/CustomField/CustomFieldEvents.php` - CustomFieldイベント定数クラス
- E-08: `src/Core/System/CustomField/Aggregate/CustomFieldSet/CustomFieldSetDefinition.php` - CustomFieldSetエンティティ定義
- E-09: `src/Core/System/CustomField/Aggregate/CustomFieldSet/CustomFieldSetEntity.php` - CustomFieldSetエンティティクラス
- E-10: `src/Core/System/CustomField/Aggregate/CustomFieldSet/CustomFieldSetCollection.php` - CustomFieldSetコレクションクラス
- E-11: `src/Core/System/CustomField/Aggregate/CustomFieldSetRelation/CustomFieldSetRelationDefinition.php` - CustomFieldSetRelationエンティティ定義
- E-12: `src/Core/System/CustomField/Aggregate/CustomFieldSetRelation/CustomFieldSetRelationEntity.php` - CustomFieldSetRelationエンティティクラス
- E-13: `src/Core/System/CustomField/Aggregate/CustomFieldSetRelation/CustomFieldSetRelationCollection.php` - CustomFieldSetRelationコレクションクラス
- E-14: `src/Core/System/CustomField/Api/CustomFieldSetActionController.php` - APIコントローラー

## 3) Claims と根拠の対応（レビューの主戦場）

### CustomFieldDefinition関連 (UT-CFD-001〜008)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | getEntityName()がcustom_fieldを返す | E-01 L25-30 ENTITY_NAME定数 | ○ |
| C-02 | getCollectionClass()がCustomFieldCollection::classを返す | E-01 L32-35 | ○ |
| C-03 | getEntityClass()がCustomFieldEntity::classを返す | E-01 L37-40 | ○ |
| C-04 | since()が6.0.0.0を返す | E-01 L42-45 | ○ |
| C-05 | getDefaults()がデフォルト値を返す | E-01 L47-55 | ○ |
| C-06 | defineFields()がフィールド定義を構築 | E-01 L57-73 | ○ |
| C-07 | nameフィールドにImmutableフラグ | E-01 L61 | ○ |
| C-08 | typeフィールドにImmutableフラグ | E-01 L62 | ○ |

### CustomFieldEntity関連 (UT-CFD-009〜029)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-09 | getName()で名前取得 | E-02 L41-44 | ○ |
| C-10 | setName()で名前設定 | E-02 L46-49 | ○ |
| C-11 | getType()でタイプ取得 | E-02 L51-54 | ○ |
| C-12 | setType()でタイプ設定 | E-02 L56-59 | ○ |
| C-13 | getConfig()で設定取得 | E-02 L64-67 | ○ |
| C-14 | getConfig()でnull許容 | E-02 L23 | ○ |
| C-15 | setConfig()で設定設定 | E-02 L72-75 | ○ |
| C-16 | setConfig()でnull設定可能 | E-02 L70-71 | ○ |
| C-17 | isActive()でアクティブ状態取得 | E-02 L77-80 | ○ |
| C-18 | setActive()でアクティブ状態設定 | E-02 L82-85 | ○ |
| C-19 | getCustomFieldSetId()でID取得 | E-02 L87-90 | ○ |
| C-20 | getCustomFieldSetId()でnull許容 | E-02 L27 | ○ |
| C-21 | getCustomFieldSet()でリレーション取得 | E-02 L97-100 | ○ |
| C-22 | getCustomFieldSet()でnull許容 | E-02 L29 | ○ |
| C-23 | isAllowCustomerWrite()でフラグ取得 | E-02 L117-120 | ○ |
| C-24 | allowCustomerWriteデフォルトfalse | E-02 L33 | ○ |
| C-25 | isAllowCartExpose()でフラグ取得 | E-02 L127-130 | ○ |
| C-26 | isStoreApiAware()でフラグ取得 | E-02 L137-140 | ○ |
| C-27 | storeApiAwareデフォルトtrue | E-02 L37 | ○ |
| C-28 | isIncludeInSearch()でフラグ取得 | E-02 L147-150 | ○ |
| C-29 | getProductSearchConfigFields()でリレーション取得 | E-02 L107-110 | ○ |

### CustomFieldCollection関連 (UT-CFD-030〜034)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-30 | filterByType()でタイプフィルタ | E-03 L14-17 | ○ |
| C-31 | filterByType()で該当なし時空コレクション | E-03 L14-17 filterロジック | ○ |
| C-32 | filterByType()で空コレクション処理 | E-03 L14-17 | ○ |
| C-33 | getApiAlias()でエイリアス返却 | E-03 L19-22 | ○ |
| C-34 | getExpectedClass()で期待クラス返却 | E-03 L24-27 | ○ |

### CustomFieldService関連 (UT-CFD-035〜054)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-35 | getCustomField()でINT型→IntField | E-04 L57 match式 | ○ |
| C-36 | getCustomField()でFLOAT型→FloatField | E-04 L58 | ○ |
| C-37 | getCustomField()でBOOL型→BoolField | E-04 L59 | ○ |
| C-38 | getCustomField()でDATETIME型→DateTimeField | E-04 L60 | ○ |
| C-39 | getCustomField()でTEXT型→LongTextField | E-04 L61 | ○ |
| C-40 | getCustomField()でHTML型→AllowHtml付きLongTextField | E-04 L62 | ○ |
| C-41 | getCustomField()でPRICE型→PriceField | E-04 L63 | ○ |
| C-42 | getCustomField()で未知型→JsonField | E-04 L64 default句 | ○ |
| C-43 | getCustomField()で存在しないフィールド→JsonField | E-04 L54, L64 | ○ |
| C-44 | getCustomField()でキャッシュ再利用 | E-04 L50-52 | ○ |
| C-45 | getSubscribedEvents()でイベント登録 | E-04 L73-80 | ○ |
| C-46 | validateBeforeWrite()で空コマンド早期リターン | E-04 L86-88 | ○ |
| C-47 | validateBeforeWrite()で有効な名前許可 | E-04 L109-120, L29 CUSTOM_FIELD_NAME_PATTERN | ○ |
| C-48 | validateBeforeWrite()でアンダースコア開始許可 | E-04 L29 パターン `[a-zA-Z_\x7f-\xff]` | ○ |
| C-49 | validateBeforeWrite()でUnicode文字許可 | E-04 L29 パターン `\x7f-\xff` | ○ |
| C-50 | validateBeforeWrite()で数字開始拒否 | E-04 L29 パターン、L117-119 | ○ |
| C-51 | validateBeforeWrite()でハイフン拒否 | E-04 L29 パターン、L117-119 | ○ |
| C-52 | validateBeforeWrite()で空白拒否 | E-04 L29 パターン、L117-119 | ○ |
| C-53 | validateBeforeWrite()でnull名スキップ | E-04 L111-115 | ○ |
| C-54 | reset()でキャッシュクリア | E-04 L100-104 | ○ |

### CustomFieldException関連 (UT-CFD-055〜056)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-55 | customFieldNameInvalid()で例外生成 | E-05 L17-25 | ○ |
| C-56 | 例外にname値含む | E-05 L23 parameters | ○ |

### CustomFieldTypes関連 (UT-CFD-057〜064)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-57 | BOOL定数 | E-06 L10 | ○ |
| C-58 | INT定数 | E-06 L17 | ○ |
| C-59 | FLOAT定数 | E-06 L16 | ○ |
| C-60 | TEXT定数 | E-06 L25 | ○ |
| C-61 | HTML定数 | E-06 L21 | ○ |
| C-62 | PRICE定数 | E-06 L20 | ○ |
| C-63 | DATETIME定数 | E-06 L14 | ○ |
| C-64 | privateコンストラクタ | E-06 L27-29 | ○ |

### CustomFieldEvents関連 (UT-CFD-065〜066)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-65 | CUSTOM_FIELD_WRITTEN_EVENT定数 | E-07 L10 | ○ |
| C-66 | CUSTOM_FIELD_DELETED_EVENT定数 | E-07 L12 | ○ |

### CustomFieldSetDefinition関連 (UT-CFD-067〜074)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-67 | getEntityName()がcustom_field_setを返す | E-08 L31-36 | ○ |
| C-68 | getCollectionClass()がCustomFieldSetCollection::classを返す | E-08 L38-41 | ○ |
| C-69 | getEntityClass()がCustomFieldSetEntity::classを返す | E-08 L43-46 | ○ |
| C-70 | getDefaults()がposition=1を返す | E-08 L48-51 | ○ |
| C-71 | since()が6.0.0.0を返す | E-08 L53-56 | ○ |
| C-72 | defineFields()がフィールド定義を構築 | E-08 L58-74 | ○ |
| C-73 | customFieldsにCascadeDelete | E-08 L69 | ○ |
| C-74 | relationsにCascadeDelete | E-08 L70 | ○ |

### CustomFieldSetEntity関連 (UT-CFD-075〜094)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-75 | getName()で名前取得 | E-09 L41-44 | ○ |
| C-76 | setName()で名前設定 | E-09 L46-49 | ○ |
| C-77 | getConfig()で設定取得 | E-09 L54-57 | ○ |
| C-78 | getConfig()でnull許容 | E-09 L23 | ○ |
| C-79 | isActive()でアクティブ状態取得 | E-09 L67-70 | ○ |
| C-80 | setActive()でアクティブ状態設定 | E-09 L72-75 | ○ |
| C-81 | isGlobal()でグローバルフラグ取得 | E-09 L117-120 | ○ |
| C-82 | setGlobal()でグローバルフラグ設定 | E-09 L122-125 | ○ |
| C-83 | getPosition()で位置取得 | E-09 L77-80 | ○ |
| C-84 | setPosition()で位置設定 | E-09 L82-85 | ○ |
| C-85 | getCustomFields()でリレーション取得 | E-09 L87-90 | ○ |
| C-86 | getCustomFields()でnull許容 | E-09 L31 | ○ |
| C-87 | getRelations()でリレーション取得 | E-09 L97-100 | ○ |
| C-88 | getRelations()でnull許容 | E-09 L33 | ○ |
| C-89 | getProducts()でリレーション取得 | E-09 L107-110 | ○ |
| C-90 | getProducts()でnull許容 | E-09 L35 | ○ |
| C-91 | getAppId()でID取得 | E-09 L127-130 | ○ |
| C-92 | getAppId()でnull許容 | E-09 L37 | ○ |
| C-93 | getApp()でリレーション取得 | E-09 L137-140 | ○ |
| C-94 | getApp()でnull許容 | E-09 L39 | ○ |

### CustomFieldSetCollection関連 (UT-CFD-095〜096)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-95 | getApiAlias()でエイリアス返却 | E-10 L14-17 | ○ |
| C-96 | getExpectedClass()で期待クラス返却 | E-10 L19-22 | ○ |

### CustomFieldSetRelationDefinition関連 (UT-CFD-097〜104)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-97 | getEntityName()がcustom_field_set_relationを返す | E-11 L19-25 | ○ |
| C-98 | getCollectionClass()がCustomFieldSetRelationCollection::classを返す | E-11 L27-30 | ○ |
| C-99 | getEntityClass()がCustomFieldSetRelationEntity::classを返す | E-11 L32-35 | ○ |
| C-100 | since()が6.0.0.0を返す | E-11 L37-40 | ○ |
| C-101 | defineFields()がフィールド定義を構築 | E-11 L42-50 | ○ |
| C-102 | customFieldSetIdにRequired | E-11 L46 | ○ |
| C-103 | entityNameにRequired | E-11 L47 | ○ |
| C-104 | getParentDefinitionClass()がCustomFieldSetDefinitionを返す | E-11 L52-55 | ○ |

### CustomFieldSetRelationEntity関連 (UT-CFD-105〜110)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-105 | getEntityName()でエンティティ名取得 | E-12 L21-24 | ○ |
| C-106 | setEntityName()でエンティティ名設定 | E-12 L26-29 | ○ |
| C-107 | getCustomFieldSetId()でID取得 | E-12 L31-34 | ○ |
| C-108 | setCustomFieldSetId()でID設定 | E-12 L36-39 | ○ |
| C-109 | getCustomFieldSet()でリレーション取得 | E-12 L41-44 | ○ |
| C-110 | getCustomFieldSet()でnull許容 | E-12 L19 | ○ |

### CustomFieldSetRelationCollection関連 (UT-CFD-111〜112)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-111 | getApiAlias()でエイリアス返却 | E-13 L14-17 | ○ |
| C-112 | getExpectedClass()で期待クラス返却 | E-13 L19-22 | ○ |

### CustomFieldSetActionController関連 (UT-CFD-113〜117)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-113 | コンストラクタでDI注入 | E-14 L22-24 | ○ |
| C-114 | getAvailableRelations()でエンティティ一覧返却 | E-14 L27-44 | ○ |
| C-115 | 翻訳エンティティの親名返却 | E-14 L36-38 | ○ |
| C-116 | 結果のソート | E-14 L41 sort() | ○ |
| C-117 | CustomFieldsなし時空配列 | E-14 L33-35 filterロジック | ○ |

## 4) 不足情報（Unknown / Missing）
- 根拠なしの項目はありません。すべてのテストケースはソースコードから直接導出されています。

## 5) リスクフラグ（レビュー観点）
- **0: 低リスク** - すべてのテストケースがソースコードから直接導出されており、根拠が明確です。

主要なリスク観点：
1. **CustomFieldService.validateBeforeWrite**: 名前バリデーションパターンの正規表現がTwig変数名規則に基づいている点は、Twig仕様変更時に影響を受ける可能性があります。
2. **CustomFieldService.getCustomField**: 型マッピングのmatch式でdefault句が使用されているため、新しい型が追加された場合はJsonFieldにフォールバックします。
3. **CascadeDelete設定**: CustomFieldSetの削除時にCustomFieldsとRelationsがカスケード削除される設計は、データ整合性の観点から重要です。

## 6) レビュアーチェックリスト（最小）
- [ ] CustomFieldService.CUSTOM_FIELD_NAME_PATTERNの正規表現がTwig変数名規則と一致しているか確認
- [ ] CustomFieldService.getCustomFieldの型マッピングがCustomFieldTypesの全定数をカバーしているか確認
- [ ] CascadeDelete設定の影響範囲が適切か確認（CustomFieldSet削除時の動作）
- [ ] allowCustomerWrite/allowCartExpose/storeApiAwareのデフォルト値がセキュリティ要件を満たしているか確認
- [ ] CustomFieldSetActionController.getAvailableRelationsのソート順がUI要件と一致しているか確認
