---
generated_at: 2026-02-22 10:00:00
metrics:
  claims_total: 94
  claims_with_evidence: 90
  claims_without_evidence: 4
confidence_derived: 0.96
---

# 根拠レポート：mruby-struct 単体テストケース一覧

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.96**
  - 根拠あり：90 / 94、根拠なし：4
- 優先レビュー（高）
  1. **C-35 (UT-STR-035)**: 再帰構造の==比較の詳細な期待結果は推測による
  2. **C-85 (UT-STR-085)**: dig途中nilの挙動はRuby標準の挙動からの推測
  3. **C-93 (UT-STR-093)**: Struct.[]のインスタンス生成はCコードの登録から推測
  4. **C-94 (UT-STR-094)**: Enumerableのincludeはstruct.rbから確認可能だが、ancestors出力の正確な内容は要確認

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。

- E-01: `mrbgems/mruby-struct/src/struct.c` - Struct実装のCソースコード（全メソッド定義）
- E-02: `mrbgems/mruby-struct/mrblib/struct.rb` - StructのRuby実装（each, each_pair, select, dig）
- E-03: `mrbgems/mruby-struct/test/struct.rb` - 既存テストコード（テストケースの妥当性確認に使用）
- E-04: `mrbgems/mruby-struct/mrbgem.rake` - gem定義ファイル
- E-05: `docs/code-to-docs/単体テストケース一覧/plan.md` - テスト計画

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 (UT-STR-001) | シンボル引数で匿名Structクラスが生成される | E-01 (mrb_struct_s_def, L266-325), E-03 (L8-12) | ○ |
| C-02 (UT-STR-002) | 文字列名付きStructクラスが定数として登録される | E-01 (make_struct, L184-218) | ○ |
| C-03 (UT-STR-003) | ブロック付きでメソッド定義が可能 | E-01 (L321-323), E-03 (L20-21) | ○ |
| C-04 (UT-STR-004) | keyword_init: trueでStructクラスが生成される | E-01 (L280-289, L319), E-03 (L257-275) | ○ |
| C-05 (UT-STR-005) | keyword_init: falseでStructクラスが生成される | E-01 (L409-410), E-03 (L277-291) | ○ |
| C-06 (UT-STR-006) | keyword_initなしでStructクラスが生成される | E-01 (L412-418), E-03 (L233-255) | ○ |
| C-07 (UT-STR-007) | 引数なしでArgumentError | E-01 (L276-278) | ○ |
| C-08 (UT-STR-008) | 重複メンバ名でArgumentError | E-01 (L304-314) | ○ |
| C-09 (UT-STR-009) | 不正クラス名でNameError | E-01 (L197-198), E-03 (L185-187) | ○ |
| C-10 (UT-STR-010) | 配列をメンバとして渡した場合TypeError | E-01 (L301), E-03 (L179-183) | ○ |
| C-11 (UT-STR-011) | 既存定数の再定義で警告・上書き | E-01 (L200-203) | ○ |
| C-12 (UT-STR-012) | 非真偽値のkeyword_initはtruthy扱い | E-01 (L402), E-03 (L293-303) | ○ |
| C-13 (UT-STR-013) | Structのサブクラスとして生成される | E-01 (L190, L204), E-03 (L10, L189-197) | ○ |
| C-14 (UT-STR-014) | 位置引数で初期化される | E-01 (mrb_struct_init_with_args, L331-346), E-03 (L15-16) | ○ |
| C-15 (UT-STR-015) | 引数が少ない場合残りがnil | E-01 (L342-344) | ○ |
| C-16 (UT-STR-016) | 引数なしで全メンバnil | E-01 (L342-344), E-03 (L248-250) | ○ |
| C-17 (UT-STR-017) | メンバ数超過でArgumentError | E-01 (L335-337), E-03 (L103-108) | ○ |
| C-18 (UT-STR-018) | keyword_init: nilでハッシュ引数によるキーワード初期化 | E-01 (L412-418), E-03 (L236-238) | ○ |
| C-19 (UT-STR-019) | ハッシュ引数の順序が異なっても正しく初期化 | E-01 (L355-364), E-03 (L240-242) | ○ |
| C-20 (UT-STR-020) | 一部キーワードのみ指定で残りnil | E-01 (L361-363), E-03 (L244-246) | ○ |
| C-21 (UT-STR-021) | 不明キーワードでArgumentError | E-01 (L372-386), E-03 (L252-254) | ○ |
| C-22 (UT-STR-022) | keyword_init: trueでキーワード引数初期化 | E-01 (L402-407), E-03 (L260-262) | ○ |
| C-23 (UT-STR-023) | keyword_init: trueで引数なしは全メンバnil | E-01 (L406), E-03 (L264-266) | ○ |
| C-24 (UT-STR-024) | keyword_init: trueで位置引数はArgumentError | E-01 (L403-405), E-03 (L268-270) | ○ |
| C-25 (UT-STR-025) | keyword_init: trueで複数ハッシュはArgumentError | E-01 (L403), E-03 (L272-274) | ○ |
| C-26 (UT-STR-026) | keyword_init: falseで位置引数が動作 | E-01 (L409-410), E-03 (L280-282) | ○ |
| C-27 (UT-STR-027) | keyword_init: falseでハッシュがそのまま格納 | E-01 (L410), E-03 (L284-286) | ○ |
| C-28 (UT-STR-028) | initialize_copyで同一クラスのコピー | E-01 (mrb_struct_init_copy, L424-438) | ○ |
| C-29 (UT-STR-029) | 同一オブジェクトならそのまま返却 | E-01 (L429) | ○ |
| C-30 (UT-STR-030) | 異なるStructクラスでTypeError | E-01 (L430-432), E-03 (L165-177) | ○ |
| C-31 (UT-STR-031) | 同じ値で==がtrue | E-01 (mrb_struct_equal, L592-624), E-03 (L14-18) | ○ |
| C-32 (UT-STR-032) | 異なる値で==がfalse | E-01 (L616-618) | ○ |
| C-33 (UT-STR-033) | 異なるクラスで==がfalse | E-01 (L600-601) | ○ |
| C-34 (UT-STR-034) | 同一オブジェクトで==がtrue | E-01 (L597-599) | ○ |
| C-35 (UT-STR-035) | 再帰構造の==比較で無限ループしない | E-01 (L608), E-03 (L118-123: inspectテストでの再帰参照) | △ |
| C-36 (UT-STR-036) | eql?で同値がtrue | E-01 (mrb_struct_eql, L634-666) | ○ |
| C-37 (UT-STR-037) | eql?で異なる値がfalse | E-01 (L659-661) | ○ |
| C-38 (UT-STR-038) | eql?で異なるクラスがfalse | E-01 (L644-646) | ○ |
| C-39 (UT-STR-039) | []でシンボルアクセス | E-01 (mrb_struct_aref, L500-513), E-03 (L27) | ○ |
| C-40 (UT-STR-040) | []で文字列アクセス | E-01 (L505-508), E-03 (L28) | ○ |
| C-41 (UT-STR-041) | []で正インデックスアクセス | E-01 (L512), E-03 (L29) | ○ |
| C-42 (UT-STR-042) | []で負インデックスアクセス | E-01 (struct_index, L459-471), E-03 (L30) | ○ |
| C-43 (UT-STR-043) | 範囲外インデックスでIndexError | E-01 (L467-469), E-03 (L32) | ○ |
| C-44 (UT-STR-044) | 存在しないメンバ名でNameError | E-01 (L455), E-03 (L33) | ○ |
| C-45 (UT-STR-045) | 不正な型でTypeError | E-01 (L512: mrb_as_int), E-03 (L31) | ○ |
| C-46 (UT-STR-046) | 負インデックス境界でIndexError | E-01 (L464-466) | ○ |
| C-47 (UT-STR-047) | []=でシンボル代入 | E-01 (mrb_struct_aset, L553-572), E-03 (L39-40) | ○ |
| C-48 (UT-STR-048) | []=で文字列代入 | E-01 (L561-564), E-03 (L41-42) | ○ |
| C-49 (UT-STR-049) | []=でインデックス代入 | E-01 (L569-570), E-03 (L43-44) | ○ |
| C-50 (UT-STR-050) | []=で負インデックス代入 | E-01 (L569), E-03 (L45-46) | ○ |
| C-51 (UT-STR-051) | []=で範囲外IndexError | E-01 (L569: struct_index), E-03 (L48) | ○ |
| C-52 (UT-STR-052) | []=で不存在メンバNameError | E-01 (L527), E-03 (L49) | ○ |
| C-53 (UT-STR-053) | []=で不正な型TypeError | E-01 (L569: mrb_as_int), E-03 (L47) | ○ |
| C-54 (UT-STR-054) | frozen Structへの[]=でFrozenError | E-01 (mrb_struct_modify macro L83), E-03 (L208) | ○ |
| C-55 (UT-STR-055) | membersでメンバ一覧取得 | E-01 (mrb_struct_members, L98-102), E-03 (L72-75) | ○ |
| C-56 (UT-STR-056) | Struct.membersでメンバ一覧取得 | E-01 (mrb_struct_s_members_m, L75-81), E-03 (L11) | ○ |
| C-57 (UT-STR-057) | sizeでメンバ数取得 | E-01 (mrb_struct_len, L675-679), E-03 (L127) | ○ |
| C-58 (UT-STR-058) | lengthでメンバ数取得 | E-01 (L790-791), E-03 (L128) | ○ |
| C-59 (UT-STR-059) | to_aで配列変換 | E-01 (mrb_struct_to_a, L688-692), E-03 (L133) | ○ |
| C-60 (UT-STR-060) | valuesで配列変換 | E-01 (L792), E-03 (L134) | ○ |
| C-61 (UT-STR-061) | to_hでハッシュ変換 | E-01 (mrb_struct_to_h, L700-711), E-03 (L137-140) | ○ |
| C-62 (UT-STR-062) | values_atで単一インデックス取得 | E-01 (mrb_struct_values_at, L714-722), E-03 (L144) | ○ |
| C-63 (UT-STR-063) | values_atで複数インデックス取得 | E-01 (L714-722), E-03 (L145) | ○ |
| C-64 (UT-STR-064) | values_atで範囲外IndexError | E-01 (L721: struct_aref_int), E-03 (L146) | ○ |
| C-65 (UT-STR-065) | inspectで文字列表現 | E-01 (mrb_struct_to_s, L731-761), E-03 (L118-123) | ○ |
| C-66 (UT-STR-066) | 名前付きStructのinspectにクラス名含む | E-01 (L738-741) | ○ |
| C-67 (UT-STR-067) | 再帰構造のinspectで省略表記 | E-01 (L742-745), E-03 (L122) | ○ |
| C-68 (UT-STR-068) | to_sがinspectと同一 | E-01 (L787-788), E-02 (L51) | ○ |
| C-69 (UT-STR-069) | getterアクセサで値取得 | E-01 (mrb_struct_ref, L112-124, make_struct_define_accessors L163-182), E-03 (L85-95) | ○ |
| C-70 (UT-STR-070) | setterアクセサで値設定 | E-01 (mrb_struct_set_m, L153-161), E-03 (L97-98) | ○ |
| C-71 (UT-STR-071) | 不存在アクセサでNoMethodError | E-03 (L100) | ○ |
| C-72 (UT-STR-072) | frozenでsetter禁止 | E-01 (mrb_struct_modify macro L83), E-03 (L207) | ○ |
| C-73 (UT-STR-073) | 13メンバの大きなStructで全アクセサ動作 | E-03 (L82-101) | ○ |
| C-74 (UT-STR-074) | eachで各メンバの値がブロックに渡される | E-02 (L13-18), E-03 (L52-59) | ○ |
| C-75 (UT-STR-075) | eachがselfを返す | E-02 (L17) | ○ |
| C-76 (UT-STR-076) | 1メンバのStructでeach動作 | E-02 (L13-18) | ○ |
| C-77 (UT-STR-077) | each_pairでペアがブロックに渡される | E-02 (L26-31), E-03 (L62-69) | ○ |
| C-78 (UT-STR-078) | each_pairがselfを返す | E-02 (L30) | ○ |
| C-79 (UT-STR-079) | selectで条件合致要素取得 | E-02 (L39-46), E-03 (L77-80) | ○ |
| C-80 (UT-STR-080) | selectで結果なし時空配列 | E-02 (L40: ary = []) | ○ |
| C-81 (UT-STR-081) | selectで全一致時全要素返却 | E-02 (L39-46) | ○ |
| C-82 (UT-STR-082) | dig単一キーで値取得 | E-02 (L61-68), E-03 (L151) | ○ |
| C-83 (UT-STR-083) | digネストで値取得 | E-02 (L64), E-03 (L152) | ○ |
| C-84 (UT-STR-084) | dig数値インデックスで値取得 | E-02 (L62), E-03 (L153) | ○ |
| C-85 (UT-STR-085) | dig途中nilでnil返却 | E-02 (L64: n&.dig) | △ |
| C-86 (UT-STR-086) | dupでStruct複製 | E-03 (L110-116) | ○ |
| C-87 (UT-STR-087) | dupオブジェクトが等しい | E-03 (L114) | ○ |
| C-88 (UT-STR-088) | freezeで変更不可 | E-01 (L83), E-03 (L199-210) | ○ |
| C-89 (UT-STR-089) | freeze前の値保持 | E-03 (L203-204, L209) | ○ |
| C-90 (UT-STR-090) | ブロック内でprivateメソッド定義 | E-03 (L212-231) | ○ |
| C-91 (UT-STR-091) | ブロック内でpublicメソッド呼び出し | E-03 (L224-226) | ○ |
| C-92 (UT-STR-092) | ブロック定義のスコープ制限 | E-03 (L20-21) | ○ |
| C-93 (UT-STR-093) | Struct.[]でインスタンス生成 | E-01 (L213: mrb_instance_new登録) | △ |
| C-94 (UT-STR-094) | StructがEnumerableをinclude | E-02 (L6: include Enumerable) | △ |

## 4) 不足情報（Unknown / Missing）
- **C-35**: MRB_RECURSIVE_BINARY_FUNC_Pマクロの具体的な動作仕様が外部定義（mruby内部マクロ）のため、再帰構造での==比較の正確な期待結果を直接確認できない
  - 候補：mruby内部ヘッダ（internal.h） / CRubyのStruct仕様
- **C-85**: `&.`（safe navigation operator）によるnil伝播はRuby標準動作からの推測。既存テストコードに該当テストケースがない
  - 候補：mruby-struct/test/struct.rb にdigのnilテスト追加 / CRuby仕様書
- **C-93**: Struct.[]はmrb_instance_newにマッピングされているが、直接的なテストが既存テストコードにない
  - 候補：mruby-struct/test/struct.rb / CRubyのStruct.[]仕様
- **C-94**: Struct#ancestorsの出力内容はRuby実装依存であり、Enumerableが含まれることはstruct.rbのinclude文から確認できるが、ancestorsの完全な出力は確認不可
  - 候補：mruby VM実行による確認

## 5) リスクフラグ（レビュー観点）
- 0: 低リスク - 大部分のテストケースはソースコード（struct.c, struct.rb）と既存テストコード（test/struct.rb）に直接根拠あり
- 1: 中リスク - keyword_init機能のテストケース（UT-STR-018〜027）は比較的新しい機能であり、エッジケースが不足している可能性あり
- 1: 中リスク - 再帰構造関連のテスト（UT-STR-035, UT-STR-067）はmruby内部マクロに依存しており、動作の正確性はVM実行でのみ確認可能
- 0: 低リスク - 各メソッドのISO規格番号（15.2.18.x.x）に基づくテストは既存テストコードとも整合している

## 6) レビュアーチェックリスト（最小）
- [ ] keyword_init関連テストケース（UT-STR-018〜027）がkeyword_init: nil/true/false の3パターンを網羅しているか確認
- [ ] 再帰構造の==比較（UT-STR-035）の期待結果がmrubyの実際の動作と合致するかVM実行で確認
- [ ] dig途中nil（UT-STR-085）の期待結果がmrubyの&.演算子の実装と合致するか確認
- [ ] frozen状態でのsetter/[]=テスト（UT-STR-054, UT-STR-072, UT-STR-088）がFrozenErrorを適切に期待しているか確認
- [ ] 大量メンバ（13メンバ）テスト（UT-STR-073）のカバー範囲が十分か確認
- [ ] Struct.[]（UT-STR-093）の動作がmruby実装で実際にサポートされているか確認
