---
generated_at: 2026-02-22 10:00:00
metrics:
  claims_total: 40
  claims_with_evidence: 37
  claims_without_evidence: 3
confidence_derived: 0.93
---

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

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.93**
  - 根拠あり：37 / 40、根拠なし：3
- 優先レビュー（高）
  1. **C-35 Integer型タグの動作確認**：mrubyにおけるFixnumのオブジェクト同一性がmrb_obj_eqでどう扱われるか要確認
  2. **C-37 同値別文字列オブジェクトの不一致**：mrubyのString freezeやintern挙動による実装依存の可能性
  3. **C-39 深いネストのcatch**：3段以上のネストの動作は既存テストに存在しないため推測

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

- E-01: `mrbgems/mruby-catch/src/catch.c` - catch/throwのC実装（バイトコード、find_catcher、throw_m、gem_init/final）
- E-02: `mrbgems/mruby-catch/mrblib/catch.rb` - UncaughtThrowErrorクラス定義（initialize、attr_reader :tag/:value）
- E-03: `mrbgems/mruby-catch/test/catch.rb` - 既存テストケース（8テストアサーション）
- E-04: `mrbgems/mruby-catch/README.md` - catch/throw/UncaughtThrowErrorの仕様説明
- E-05: `mrbgems/mruby-catch/mrbgem.rake` - gem仕様定義（ライセンス、作者、概要）

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | タグ付きcatchブロックがブロックの戻り値を返すこと | E-03 (assert "no throw"), E-04 | ○ |
| C-02 | throwによりcatchブロックが値を返すこと | E-03 (assert "return throw value"), E-01 (throw_m), E-04 | ○ |
| C-03 | throwの第2引数省略時にnilが返ること | E-03 (assert "no throw value"), E-01 (obj=mrb_nil_value) | ○ |
| C-04 | catchがブロックにタグを渡すこと | E-03 (assert "pass the given tag to block"), E-01 (catch_iseq SEND :call n=1) | ○ |
| C-05 | タグ省略時にObject.newが自動生成されること | E-03 (assert "without catch arguments"), E-01 (catch_iseq GETCONST Object, SEND :new), E-04 | ○ |
| C-06 | ネストしたcatchで外側のタグへthrowできること | E-03 (assert "without catch arguments"), E-04 | ○ |
| C-07 | 異なるタグのネストcatchで外側へthrow時に中間ブロックがスキップされること | E-03 (assert "catches across invocation boundaries") | ○ |
| C-08 | 同一タグのネストcatchで内側のcatchが優先されること | E-03 (assert "catches in the nested invocation with the same key") | ○ |
| C-09 | throwがループやbegin/rescueを貫通すること | E-03 (assert "return throw value" - loop/begin/rescue内でthrow) | ○ |
| C-10 | throwが対応するcatchブロックの戻り値を設定すること | E-01 (throw_m: mrb_break_value_set), E-03 | ○ |
| C-11 | throwの第2引数省略時にnilが返ること | E-01 (throw_m: mrb_get_args "o|o", obj=mrb_nil_value), E-03 | ○ |
| C-12 | 対応するcatchが存在しない場合にUncaughtThrowErrorが発生すること | E-01 (throw_m: ci_index==0 -> mrb_exc_raise UncaughtThrowError), E-03 (assert "tag identity, uncaught throw"), E-04 | ○ |
| C-13 | タグがオブジェクト同一性で比較されること | E-01 (find_catcher: mrb_obj_eq), E-03 (assert "tag identity, uncaught throw") | ○ |
| C-14 | UncaughtThrowError発生時にtagとvalueが正しく設定されること | E-03 (assert "tag identity, uncaught throw": e.tag, e.value), E-01, E-02 | ○ |
| C-15 | UncaughtThrowErrorのメッセージが適切であること | E-03 (assert_match "uncaught throw *"), E-02 (super "uncaught throw #{tag.inspect}") | ○ |
| C-16 | コールスタック内で一致するcatchブロックが見つかること | E-01 (find_catcher: ci->proc==&catch_proc && mrb_obj_eq) | ○ |
| C-17 | コールスタック内にcatchブロックが存在しない場合に0が返ること | E-01 (find_catcher: return 0) | ○ |
| C-18 | ネストしたcatchで最も内側の一致するcatchが見つかること | E-01 (find_catcher: ci = mrb->c->ci - 1, n > 0でループ), E-03 (assert "catches in the nested invocation with the same key") | ○ |
| C-19 | gem初期化によりKernel#catchが定義されること | E-01 (gem_init: mrb_define_method_raw catch) | ○ |
| C-20 | gem初期化によりKernel#throwが定義されること | E-01 (gem_init: mrb_define_private_method_id throw) | ○ |
| C-21 | catchメソッドがprivateメソッドであること | E-01 (gem_init: m.flags |= MRB_METHOD_PRIVATE_FL) | ○ |
| C-22 | throwメソッドがprivateメソッドであること | E-01 (gem_init: mrb_define_private_method_id) | ○ |
| C-23 | UncaughtThrowErrorが正しく初期化されること | E-02 (def initialize(tag, value)) | ○ |
| C-24 | initializeがtagを正しく設定すること | E-02 (@tag = tag) | ○ |
| C-25 | initializeがvalueを正しく設定すること | E-02 (@value = value) | ○ |
| C-26 | initializeがメッセージを正しく設定すること | E-02 (super("uncaught throw #{tag.inspect}")) | ○ |
| C-27 | attr_reader :tagがタグを返すこと | E-02 (attr_reader :tag) | ○ |
| C-28 | attr_reader :valueが値を返すこと | E-02 (attr_reader :value) | ○ |
| C-29 | UncaughtThrowErrorがArgumentErrorを継承していること | E-02 (class UncaughtThrowError < ArgumentError) | ○ |
| C-30 | tagにnilを指定した場合のメッセージ | E-02 (tag.inspect -> "nil") | ○ |
| C-31 | tagに文字列を指定した場合のメッセージ | E-02 (tag.inspect -> 文字列表現) | ○ |
| C-32 | valueにnilを指定した場合 | E-02 (@value = value) | ○ |
| C-33 | ブロック内で何も実行しない場合のcatchの戻り値 | E-01 (catch_iseq: RETURN R2 - ブロックの戻り値を返す) | ○ |
| C-34 | Symbolをタグとして使用した場合 | E-03 (複数テストで:foo, :bar等のSymbol使用), E-01 | ○ |
| C-35 | 整数をタグとして使用した場合 | **根拠なし** | △ |
| C-36 | 文字列をタグとして使用した場合（同一オブジェクト） | E-01 (find_catcher: mrb_obj_eq - 任意のオブジェクト型をサポート), E-04 (any Ruby object) | ○ |
| C-37 | 同値の別文字列オブジェクトをタグに使用した場合 | **根拠なし** | △ |
| C-38 | throwの引数が1つの場合 | E-01 (throw_m: mrb_get_args "o|o", MRB_ARGS_ARG(1,1)) | ○ |
| C-39 | 深いネスト（3段以上）のcatchで最外へthrowできること | **根拠なし** | △ |
| C-40 | gem終了処理が正常に完了すること | E-01 (gem_final: 空実装) | ○ |

## 4) 不足情報（Unknown / Missing）
- **C-35（Integer型タグ）**: 既存テストやドキュメントにInteger型タグの使用例がない。README.mdでは「any Ruby object」と記載があるが、mrubyのmrb_obj_eqにおけるFixnumの同一性比較の挙動は実装依存の可能性がある。
  - 候補：mrubyコアのmrb_obj_eq実装 / mruby Fixnumの仕様ドキュメント / CRubyとの互換性情報
- **C-37（同値別文字列オブジェクトの不一致）**: mrb_obj_eqはオブジェクト同一性を比較するため、同値でも別オブジェクトの文字列は不一致となると推測するが、mrubyのString interning挙動によっては一致する可能性もある。既存テストにこのケースはない。
  - 候補：mrubyコアのmrb_obj_eq実装 / mruby String interning仕様
- **C-39（深いネストのcatch）**: 既存テストは2段ネストまで。find_catcherのループ構造から3段以上でも動作すると推測されるが、明示的なテストやドキュメントはない。
  - 候補：find_catcherのループ実装の解析 / 追加テストの実施

## 5) リスクフラグ（レビュー観点）
- 0: 低リスク - UncaughtThrowError関連のテスト（C-23〜C-32）は純粋なRubyクラスであり、ソースコードから直接確認可能
- 0: 低リスク - catch/throwの基本動作テスト（C-01〜C-11）は既存テストと高い対応関係がある
- 1: 中リスク - find_catcher関数のテスト（C-16〜C-18）はstatic関数のため直接呼び出しができず、throw経由の間接テストとなる
- 1: 中リスク - Integer/String型タグの境界値テスト（C-35, C-37）はmrb_obj_eqの実装依存であり、プラットフォームやmrubyバージョンにより挙動が異なる可能性がある
- 0: 低リスク - privateメソッドのアクセス制御テスト（C-21, C-22）はソースコード上のフラグ設定から確認可能

## 6) レビュアーチェックリスト（最小）
- [ ] C-13のオブジェクト同一性テストが、mrb_obj_eqの実際の挙動と一致しているか確認
- [ ] C-35のInteger型タグテストについて、mrubyのFixnum同一性比較の仕様を確認
- [ ] C-37の同値別文字列オブジェクトテストについて、mrubyのString interning挙動を確認
- [ ] find_catcher関数のstatic関数テスト方針（間接テスト）が適切かレビュー
- [ ] 既存テスト（test/catch.rb）との重複・網羅性のバランスが適切か確認
- [ ] catch/throwがKernelモジュールのprivateメソッドとして正しく動作するか確認
