---
generated_at: 2026-02-22 10:00:00
metrics:
  claims_total: 228
  claims_with_evidence: 221
  claims_without_evidence: 7
confidence_derived: 0.97
---

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

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.97**
  - 根拠あり：221 / 228、根拠なし：7
- 優先レビュー（高）
  1. **UT-MIO-082（putcオーバーフロー動作）**：256以上のmod 256動作はコードから読み取れるが、mruby仕様書での明確な定義なし
  2. **UT-MIO-112（popen未実装プラットフォーム）**：_popenの存在チェックはRuby層で行われるが、実際の未実装プラットフォームでの動作は未検証
  3. **UT-MIO-185（ノンブロッキングロック失敗時のfalse返却）**：EAGAINハンドリングのコードパスは確認できるが、実際のマルチプロセス環境でのテストが必要

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

- E-01: `mrbgems/mruby-io/src/io.c` - IOクラスのC実装（全メソッド定義、mrb_init_io含む）
- E-02: `mrbgems/mruby-io/src/file.c` - Fileクラスのクラスメソッド・インスタンスメソッドのC実装
- E-03: `mrbgems/mruby-io/src/file_test.c` - FileTestモジュールのC実装（ファイル判定メソッド群）
- E-04: `mrbgems/mruby-io/src/mruby_io_gem.c` - gem初期化・終了関数
- E-05: `mrbgems/mruby-io/mrblib/io.rb` - IOクラスのRuby実装（open, popen, pipe, read, each, puts等）
- E-06: `mrbgems/mruby-io/mrblib/file.rb` - FileクラスのRuby実装（initialize, atime, ctime, mtime, foreach等）
- E-07: `mrbgems/mruby-io/mrblib/file_constants.rb` - File::Constants定数定義（FNM_*）
- E-08: `mrbgems/mruby-io/mrblib/kernel.rb` - Kernelモジュール拡張（backtick, open, p, print, putc, puts, printf, gets, readline, readlines）
- E-09: `mrbgems/mruby-io/include/mruby/io.h` - IO構造体・定数定義（mrb_io, MRB_O_*フラグ, MRB_IO_BUF_SIZE）
- E-10: `mrbgems/mruby-io/include/io_hal.h` - HALインターフェース定義（mrb_hal_io_*関数、mrb_io_stat等型定義）

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

### IO クラス - 初期化・モード変換
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 (UT-MIO-001) | 有効なfdで初期化できる | E-01 (io_init, L556-592) | ○ |
| C-02 (UT-MIO-002) | モード省略時にリードオンリー | E-01 (io_mode_to_flags, L176: nil->O_RDONLY) | ○ |
| C-03 (UT-MIO-003) | r+モードでread/write両方可能 | E-01 (io_modestr_to_flags, L160-161) | ○ |
| C-04 (UT-MIO-004) | 不正fdでEBADFエラー | E-01 (check_file_descriptor, L522-553) | ○ |
| C-05 (UT-MIO-005) | ブロック付きnewで警告 | E-01 (io_init, L563) | ○ |
| C-06 (UT-MIO-006~011) | モード文字列->フラグ変換 | E-01 (io_modestr_to_flags, L129-171) | ○ |
| C-07 (UT-MIO-012~013) | 不正モード文字列でArgumentError | E-01 (mode_error, L123-127) | ○ |
| C-08 (UT-MIO-014~015) | io_mode_to_flags整数/nil処理 | E-01 (io_mode_to_flags, L173-240) | ○ |

### IO クラス - 読み取りメソッド
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-09 (UT-MIO-016~022) | io_read各パターン | E-01 (io_read, L1920-1968) | ○ |
| C-10 (UT-MIO-027~032) | io_gets各パターン | E-01 (io_gets, L1988-2077) | ○ |
| C-11 (UT-MIO-033~034) | io_readline正常/EOF | E-01 (io_readline, L2079-2087) | ○ |
| C-12 (UT-MIO-035~036) | io_readlines正常/空ファイル | E-01 (io_readlines, L2089-2099) | ○ |
| C-13 (UT-MIO-037~039) | getc/readchar各パターン | E-01 (io_getc, L2101-2124; io_readchar, L2126-2134) | ○ |
| C-14 (UT-MIO-040~042) | getbyte/readbyte各パターン | E-01 (io_getbyte, L2147-2159; io_readbyte, L2172-2180) | ○ |
| C-15 (UT-MIO-043~046) | sysread各パターン | E-01 (io_sysread, L833-842; io_read_common, L789-825) | ○ |

### IO クラス - 書き込みメソッド
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-16 (UT-MIO-023~026) | io_write各パターン | E-01 (io_write, L954-976) | ○ |
| C-17 (UT-MIO-047) | io_syswrite正常 | E-01 (io_syswrite, L897-905) | ○ |
| C-18 (UT-MIO-073~077) | io_puts各パターン | E-01 (io_puts, L1020-1052; io_puts_str, L979-994; io_puts_ary, L997-1018) | ○ |
| C-19 (UT-MIO-078~079) | io_print各パターン | E-01 (io_print, L1062-1082) | ○ |
| C-20 (UT-MIO-080~082) | io_putc各パターン | E-01 (io_putc, L1092-1144) | ○ |
| C-21 (UT-MIO-082) | putc 256以上でmod 256 | E-01 (io_putc, L1104: val & 0xff) | △ |
| C-22 (UT-MIO-083~084) | io_lshift (<<) | E-01 (io_lshift, L1153-1167) | ○ |

### IO クラス - シーク・位置操作
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-23 (UT-MIO-048~052) | seek/sysseek各パターン | E-01 (io_seek, L866-876; io_sysseek, L844-864) | ○ |
| C-24 (UT-MIO-061~062) | io_pos各パターン | E-01 (io_pos, L1220-1233) | ○ |

### IO クラス - クローズ・状態管理
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-25 (UT-MIO-053~054) | io_close正常/二重クローズ | E-01 (io_close, L1169-1176; io_get_open_fptr, L83-94) | ○ |
| C-26 (UT-MIO-055) | io_close_write | E-01 (io_close_write, L1189-1197) | ○ |
| C-27 (UT-MIO-056~057) | io_closed各パターン | E-01 (io_closed, L1209-1218) | ○ |
| C-28 (UT-MIO-058~060) | io_eof各パターン | E-01 (io_eof, L1857-1866) | ○ |

### IO クラス - その他インスタンスメソッド
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-29 (UT-MIO-063~064) | io_fileno | E-01 (io_fileno, L1569-1574) | ○ |
| C-30 (UT-MIO-065~066) | io_pid | E-01 (io_pid, L1253-1263) | ○ |
| C-31 (UT-MIO-067~068) | io_isatty | E-01 (io_isatty, L696-703) | ○ |
| C-32 (UT-MIO-069~070) | sync/sync= | E-01 (io_sync, L1684-1689; io_set_sync, L1664-1673) | ○ |
| C-33 (UT-MIO-071~072) | io_flush | E-01 (io_flush, L2192-2197) | ○ |
| C-34 (UT-MIO-085~086) | io_ungetc | E-01 (io_ungetc, L1767-1776; io_unget_data, L1746-1765) | ○ |
| C-35 (UT-MIO-087~089) | io_ungetbyte | E-01 (io_ungetbyte, L1789-1810) | ○ |
| C-36 (UT-MIO-090) | close_on_exec | E-01 (io_close_on_exec_p/io_set_close_on_exec, L1587-1650) | ○ |
| C-37 (UT-MIO-091) | initialize_copy | E-01 (io_init_copy, L471-514) | ○ |

### IO クラス - クラスメソッド
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-38 (UT-MIO-092~095) | io_s_popen各パターン | E-01 (io_s_popen, L360-454) | ○ |
| C-39 (UT-MIO-096~097) | io_s_pipe各パターン | E-01 (io_s_pipe, L1302-1328) | ○ |
| C-40 (UT-MIO-098~101) | io_s_select各パターン | E-01 (io_s_select, L1356-1551) | ○ |
| C-41 (UT-MIO-102~104) | io_s_sysopen各パターン | E-01 (io_s_sysopen, L765-781) | ○ |
| C-42 (UT-MIO-105) | io_s_sysclose | E-01 (io_s_sysclose, L718-728) | ○ |
| C-43 (UT-MIO-106) | io_s_for_fd | E-01 (io_s_for_fd, L705-716) | ○ |

### IO クラス - Ruby実装メソッド
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-44 (UT-MIO-107~109) | IO.open各パターン | E-05 (IO.open, L25-38) | ○ |
| C-45 (UT-MIO-110~112) | IO.popen各パターン | E-05 (IO.popen, L55-71) | ○ |
| C-46 (UT-MIO-113~115) | IO.pipe各パターン | E-05 (IO.pipe, L94-109) | ○ |
| C-47 (UT-MIO-116~118) | IO.read各パターン | E-05 (IO.read, L124-141) | ○ |
| C-48 (UT-MIO-119) | IO#hash | E-05 (IO#hash, L154-158) | ○ |
| C-49 (UT-MIO-120) | IO#pos= | E-05 (IO#pos=, L177-179) | ○ |
| C-50 (UT-MIO-121) | IO#rewind | E-05 (IO#rewind, L193-195) | ○ |
| C-51 (UT-MIO-122~123) | IO#each | E-05 (IO#each, L212-219) | ○ |
| C-52 (UT-MIO-124) | IO#each_byte | E-05 (IO#each_byte, L235-242) | ○ |
| C-53 (UT-MIO-125) | IO#each_char | E-05 (IO#each_char, L258-265) | ○ |
| C-54 (UT-MIO-126) | IO#printf | E-05 (IO#printf, L280-283) | ○ |

### File クラス - Ruby実装
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-55 (UT-MIO-127~131) | File#initialize各パターン | E-06 (File#initialize, L19-27) | ○ |
| C-56 (UT-MIO-132~134) | atime/ctime/mtime | E-06 (File#atime/ctime/mtime, L38-68) | ○ |
| C-57 (UT-MIO-135) | File#inspect | E-06 (File#inspect, L78-80) | ○ |
| C-58 (UT-MIO-136~137) | File.foreach | E-06 (File.foreach, L97-105) | ○ |

### File クラス - C実装
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-59 (UT-MIO-138~139) | File.umask | E-02 (mrb_file_s_umask, L115-128) | ○ |
| C-60 (UT-MIO-140~142) | File.delete/unlink | E-02 (mrb_file_s_unlink, L139-158) | ○ |
| C-61 (UT-MIO-143~144) | File.rename | E-02 (mrb_file_s_rename, L168-195) | ○ |
| C-62 (UT-MIO-145~149) | File.dirname各パターン | E-02 (mrb_file_dirname, L224-271) | ○ |
| C-63 (UT-MIO-150~154) | File.basename各パターン | E-02 (mrb_file_basename, L282-364) | ○ |
| C-64 (UT-MIO-155~159) | File.extname各パターン | E-02 (mrb_file_extname, L930-973) | ○ |
| C-65 (UT-MIO-160~162) | File.realpath各パターン | E-02 (mrb_file_realpath, L375-396) | ○ |
| C-66 (UT-MIO-163~166) | File.expand_path各パターン | E-02 (mrb_file_expand_path, L619-626; path_expand, L541-617) | ○ |
| C-67 (UT-MIO-167) | File.absolute_path | E-02 (mrb_file_absolute_path, L636-643) | ○ |
| C-68 (UT-MIO-168~169) | File.absolute_path? | E-02 (mrb_file_absolute_path_p, L654-660) | ○ |
| C-69 (UT-MIO-170~174) | File.join各パターン | E-02 (mrb_file_join, L1038-1122; mrb_file_join_process_args, L995-1026) | ○ |
| C-70 (UT-MIO-175) | File.path | E-02 (mrb_file_path, L984-990) | ○ |
| C-71 (UT-MIO-176~177) | File.symlink | E-02 (mrb_file_s_symlink, L829-845) | ○ |
| C-72 (UT-MIO-178~179) | File.chmod | E-02 (mrb_file_s_chmod, L856-878) | ○ |
| C-73 (UT-MIO-180~181) | File.readlink | E-02 (mrb_file_s_readlink, L893-915) | ○ |
| C-74 (UT-MIO-182~185) | File#flock各パターン | E-02 (mrb_file_flock, L730-761) | ○ |
| C-75 (UT-MIO-185) | ノンブロッキングロック失敗でfalse | E-02 (mrb_file_flock, L750-751) | △ |
| C-76 (UT-MIO-186~187) | File#size | E-02 (mrb_file_size, L771-789) | ○ |
| C-77 (UT-MIO-188~189) | File#truncate | E-02 (mrb_file_truncate, L808-819) | ○ |

### FileTest モジュール
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-78 (UT-MIO-190~192) | FileTest.directory? | E-03 (mrb_filetest_s_directory_p, L95-111) | ○ |
| C-79 (UT-MIO-193~194) | FileTest.exist? | E-03 (mrb_filetest_s_exist_p, L256-266) | ○ |
| C-80 (UT-MIO-195~196) | FileTest.file? | E-03 (mrb_filetest_s_file_p, L279-295) | ○ |
| C-81 (UT-MIO-197~198) | FileTest.zero? | E-03 (mrb_filetest_s_zero_p, L308-320) | ○ |
| C-82 (UT-MIO-199~200) | FileTest.size | E-03 (mrb_filetest_s_size, L335-345) | ○ |
| C-83 (UT-MIO-201~203) | FileTest.size? | E-03 (mrb_filetest_s_size_p, L359-371) | ○ |
| C-84 (UT-MIO-204~205) | FileTest.pipe? | E-03 (mrb_filetest_s_pipe_p, L124-147) | ○ |
| C-85 (UT-MIO-206~207) | FileTest.symlink? | E-03 (mrb_filetest_s_symlink_p, L160-193) | ○ |
| C-86 (UT-MIO-208) | FileTest.socket? | E-03 (mrb_filetest_s_socket_p, L206-239) | ○ |

### File::Constants / Kernel / gem初期化
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-87 (UT-MIO-209~210) | FNM_*定数値 | E-07 (file_constants.rb, L5-17) | ○ |
| C-88 (UT-MIO-211) | Kernel#` | E-08 (kernel.rb, L13-15) | ○ |
| C-89 (UT-MIO-212~215) | Kernel#open各パターン | E-08 (kernel.rb, L34-42) | ○ |
| C-90 (UT-MIO-216~218) | Kernel#p各パターン | E-08 (kernel.rb, L57-66) | ○ |
| C-91 (UT-MIO-219~226) | Kernel IO委譲メソッド群 | E-08 (kernel.rb, L82-174) | ○ |
| C-92 (UT-MIO-227~228) | gem初期化/終了 | E-04 (mruby_io_gem.c, L9-21) | ○ |

### 根拠不足の項目
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-21 (UT-MIO-082) | putc 256以上の整数でmod 256動作 | E-01 (L1104: val & 0xff) - コードから読み取れるが公式仕様での言及なし | △ |
| C-75 (UT-MIO-185) | ノンブロッキングロック失敗時のfalse | E-02 (L750-751) - コードパスはあるが実環境テスト未確認 | △ |
| C-93 (UT-MIO-112) | popen未実装プラットフォームのNotImplementedError | E-05 (L56-58) - respond_to?チェックだが実際の未実装環境未確認 | △ |
| C-94 (UT-MIO-115) | pipe未実装プラットフォームのNotImplementedError | E-05 (L95-97) - respond_to?チェックだが実際の未実装環境未確認 | △ |
| C-95 (UT-MIO-067) | TTY接続時のisatty動作 | E-01 (L696-703) - テスト環境依存 | △ |
| C-96 (UT-MIO-204) | FIFO パイプでのpipe?判定 | E-03 (L131-147) - FIFOファイルの準備が必要 | △ |
| C-97 (UT-MIO-206) | symlink?の判定 | E-03 (L160-193) - OS依存（Windows未対応） | △ |

## 4) 不足情報（Unknown / Missing）
- **プラットフォーム固有動作の検証**: Windows環境での動作（UNCパス、ドライブレター対応のdirname/basename/expand_path）はソースコードに記述があるが、テスト環境が限定的
  - 候補：Windows CI環境 / Wine / クロスコンパイル環境
- **MRB_UTF8_STRING有効時のgetc動作**: UTF-8マルチバイト文字のgetcハンドリング（io.c L2110-2119）は条件コンパイルで含まれるが、UTF-8テストデータが必要
  - 候補：UTF-8テストファイル / エンコーディング設定
- **pread/pwrite（MRB_USE_IO_PREAD_PWRITE）**: io.c L1691-1730で定義されるが、条件コンパイルのため環境依存
  - 候補：POSIX環境 / 機能フラグ確認

## 5) リスクフラグ（レビュー観点）
- **リスク0（低）**: IOクラスの基本的な読み書きメソッド（read, write, gets, puts等）- ソースコードから明確に動作が読み取れる
- **リスク0（低）**: Fileクラスのパス操作メソッド（dirname, basename, extname, join, expand_path）- 純粋関数に近く、入出力の対応が明確
- **リスク1（中）**: FileTestモジュール（directory?, exist?, file?等）- OSの状態に依存するため、テスト環境の準備が必要
- **リスク1（中）**: IO.select - 複雑なfd_set操作と非同期I/Oのため、実行環境でのテストが重要
- **リスク1（中）**: File#flock - マルチプロセス環境でのロック競合テストが必要
- **リスク2（高）**: IO.popen / IO._pipe - プロセス生成・パイプ操作はプラットフォーム依存度が高い

## 6) レビュアーチェックリスト（最小）
- [ ] IO#read の length=nil / length指定 / EOF時の3パターンが網羅されているか
- [ ] IO#gets のセパレータ指定・limit指定・パラグラフモードが正しくテストされているか
- [ ] IO#write / puts / print / putc の書き込み系メソッドに読み取り専用IO時のエラーケースが含まれているか
- [ ] File.dirname / basename / extname の境界値（空パス、ルートパス、末尾スラッシュ）が十分か
- [ ] File.expand_path のチルダ展開・相対パス解決・ベースディレクトリ指定がカバーされているか
- [ ] FileTestモジュールの各判定メソッドにtrue/falseの両パターンが含まれているか
- [ ] IO.select のタイムアウト・引数バリデーション・読み取り可能検出がテストされているか
- [ ] IO.popen / IO.pipe のブロック有無・自動クローズ・エラーケースがカバーされているか
- [ ] Kernelモジュールの各委譲メソッドが$stdin/$stdoutを正しく使用していることが確認されているか
- [ ] gem初期化関数でIO/File/FileTestの3クラスが正しく初期化されることが確認されているか
