---
generated_at: 2026-03-01 15:00:00
metrics:
  claims_total: 58
  claims_with_evidence: 55
  claims_without_evidence: 3
confidence_derived: 0.95
---

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

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.95**
  - 根拠あり：55 / 58、根拠なし：3
- 優先レビュー（高）
  1. **C-28（エスケープシーケンス処理）**：ソースコード上ではエスケープバイトの専用処理は見当たらず、synライブラリに委譲されている。テスト可能性は要確認
  2. **C-46（全バイト範囲0..=255のパース）**：整数リテラル範囲としての動作は推測に基づく部分あり
  3. **C-15（属性なしバリアントの処理）**：ソースコード上で明示的なスキップ処理はなく、bytes/bytes_rangeの属性パースで何も返さないことによる暗黙的な除外

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

- E-01: `crates/classification-macros/src/lib.rs` 行32-33 -- `#[proc_macro_derive(ClassifyBytes, attributes(bytes, bytes_range, fallback))]` pub fn classify_bytes_derive
- E-02: `crates/classification-macros/src/lib.rs` 行37-44 -- enum以外の場合のエラー処理（`Data::Enum`マッチ失敗時のコンパイルエラー生成）
- E-03: `crates/classification-macros/src/lib.rs` 行48-49 -- byte_map（256要素配列）とfallback_variantの初期化
- E-04: `crates/classification-macros/src/lib.rs` 行56-65 -- `has_fallback_attr`の呼び出しと複数fallbackエラー処理
- E-05: `crates/classification-macros/src/lib.rs` 行68 -- `get_bytes_attrs`呼び出し
- E-06: `crates/classification-macros/src/lib.rs` 行71 -- `get_bytes_range_attrs`呼び出し
- E-07: `crates/classification-macros/src/lib.rs` 行74-82 -- バイトマップへのマッピング処理（all_bytesの結合とbyte_mapへの代入）
- E-08: `crates/classification-macros/src/lib.rs` 行86 -- fallback_variantのexpect（未設定時panic）
- E-09: `crates/classification-macros/src/lib.rs` 行89-95 -- 256要素の配列生成（未マッピング値はfallbackに割当）
- E-10: `crates/classification-macros/src/lib.rs` 行98-116 -- TABLE定数（pub const TABLE: [#enum_name; 256]）、From<u8>、From<&u8>のimpl生成
- E-11: `crates/classification-macros/src/lib.rs` 行122-127 -- `has_fallback_attr`関数定義（attr.path().is_ident("fallback")による判定）
- E-12: `crates/classification-macros/src/lib.rs` 行130-141 -- `get_bytes_attrs`関数定義（is_ident("bytes")フィルタ、panic!によるエラー伝播）
- E-13: `crates/classification-macros/src/lib.rs` 行144-160 -- `parse_bytes_attr`関数定義（Punctuated<Lit, Comma>パース、Lit::Byteマッチ、それ以外でErr）
- E-14: `crates/classification-macros/src/lib.rs` 行163-174 -- `get_bytes_range_attrs`関数定義（is_ident("bytes_range")フィルタ、panic!によるエラー伝播）
- E-15: `crates/classification-macros/src/lib.rs` 行178-217 -- `parse_bytes_range_attr`関数定義（Punctuated<Expr, Comma>パース、ExprRange分解、Closed/HalfOpen分岐、from<=to/from<to条件）
- E-16: `crates/classification-macros/src/lib.rs` 行223-253 -- `extract_byte_literal`関数定義（Lit::Byte、Lit::Intマッチ、base10_parse::<u64>、255超過チェック、その他リテラル/非リテラルのErr）
- E-17: `crates/classification-macros/src/lib.rs` 行8-31 -- doc comment（使用例: #[bytes], #[bytes_range], #[fallback]の例示）
- E-18: `crates/classification-macros/Cargo.toml` -- proc-macroクレート定義（edition = "2021"）、依存関係（syn = "2", quote = "1", proc-macro2 = "1"）

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | bytes属性とfallbackを持つenumに対してderiveが正しく展開される | E-01, E-03, E-07, E-09, E-10, E-17 | ○ |
| C-02 | bytes_range属性を持つenumに対してderiveが正しく展開される | E-01, E-06, E-07, E-09, E-10 | ○ |
| C-03 | bytes属性とbytes_range属性を組み合わせたenumが正しく展開される | E-05, E-06, E-07, E-09 | ○ |
| C-04 | 生成されたTABLE定数が256要素である | E-03, E-09, E-10 | ○ |
| C-05 | マッピングされていないバイト値がfallbackに割り当てられる | E-09 | ○ |
| C-06 | From<u8>トレイト実装が生成される | E-10（行105-108） | ○ |
| C-07 | From<&u8>トレイト実装が生成される | E-10（行111-115） | ○ |
| C-08 | 複数バリアントの統合マッピングが正しく動作する | E-05, E-06, E-07, E-09 | ○ |
| C-09 | 生成されたTABLE定数がpubである | E-10（行100: pub const TABLE） | ○ |
| C-10 | enum以外の型に適用した場合コンパイルエラー | E-02 | ○ |
| C-11 | 複数の#[fallback]でコンパイルエラー | E-04 | ○ |
| C-12 | #[fallback]がない場合panic | E-08 | ○ |
| C-13 | fallbackのみのenumが正しく展開される | E-08, E-09 | ○ |
| C-14 | 全256バイト網羅時のfallback不使用 | E-07, E-09 | ○ |
| C-15 | 属性なしバリアントが無視される | E-05, E-06, E-07 | △ |
| C-16 | #[fallback]属性ありでtrue | E-11 | ○ |
| C-17 | #[fallback]属性なしでfalse | E-11 | ○ |
| C-18 | 他の属性とfallback属性が共存する場合true | E-11（any()イテレータで全属性を走査） | ○ |
| C-19 | 属性なしバリアントでfalse | E-11 | ○ |
| C-20 | 単一バイトリテラルの収集 | E-12, E-13 | ○ |
| C-21 | 複数バイトリテラルの収集 | E-12, E-13 | ○ |
| C-22 | 複数bytes属性からの結合収集 | E-12（forループで全attrsを走査） | ○ |
| C-23 | bytes属性以外がスキップされる | E-12（行133のis_ident条件） | ○ |
| C-24 | bytes属性がない場合空のVec | E-12 | ○ |
| C-25 | get_bytes_attrsのpanicによるエラー伝播 | E-12（行137のpanic!） | ○ |
| C-26 | カンマ区切りバイトリテラルのパース | E-13 | ○ |
| C-27 | 単一バイトリテラルのパース | E-13 | ○ |
| C-28 | エスケープシーケンスのバイトリテラルのパース | E-13 | △ |
| C-29 | バイトリテラル以外（文字列）でErr | E-13（行151-155） | ○ |
| C-30 | 整数リテラルでErr（bytesでは不許可） | E-13（行151-155、Lit::Byteのみ許可） | ○ |
| C-31 | バイト値0のパース | E-13 | ○ |
| C-32 | バイト値255のパース | E-13 | ○ |
| C-33 | 単一閉範囲の収集 | E-14, E-15 | ○ |
| C-34 | 複数範囲の収集（単一属性内） | E-14, E-15 | ○ |
| C-35 | 複数bytes_range属性からの結合収集 | E-14（forループで全attrsを走査） | ○ |
| C-36 | bytes_range属性なしで空のVec | E-14 | ○ |
| C-37 | get_bytes_range_attrsのpanicによるエラー伝播 | E-14（行169のpanic!） | ○ |
| C-38 | 閉範囲（..=）のパース | E-15（行195-199） | ○ |
| C-39 | 半開範囲（..）のパース | E-15（行201-206） | ○ |
| C-40 | カンマ区切り複数範囲のパース | E-15（Punctuated<Expr, Comma>） | ○ |
| C-41 | 整数リテラルによる範囲パース | E-15, E-16 | ○ |
| C-42 | 閉範囲でfrom == toの場合1要素 | E-15（行197のif条件、from<=toで通過） | ○ |
| C-43 | 閉範囲でfrom > toの場合空のVec | E-15（行197のif条件） | ○ |
| C-44 | 半開範囲でfrom == toの場合空のVec | E-15（行203のif条件） | ○ |
| C-45 | 半開範囲でfrom > toの場合空のVec | E-15（行203のif条件） | ○ |
| C-46 | 全バイト範囲（0..=255）のパース | E-15, E-16 | △ |
| C-47 | 範囲式でない式でErr | E-15（行208-212） | ○ |
| C-48 | バイトリテラルからu8抽出 | E-16（行227） | ○ |
| C-49 | 10進整数リテラルからu8抽出 | E-16（行230-231） | ○ |
| C-50 | 16進整数リテラルからu8抽出 | E-16（行230-231） | ○ |
| C-51 | 整数リテラル0からu8抽出 | E-16（行232のif条件） | ○ |
| C-52 | 整数リテラル255からu8抽出 | E-16（行232のif条件、value<=255で通過） | ○ |
| C-53 | 整数256でErr | E-16（行234-237） | ○ |
| C-54 | 大きな整数リテラルでErr | E-16（行234-237） | ○ |
| C-55 | バイト・整数以外のリテラルでErr | E-16（行240-243） | ○ |
| C-56 | ブールリテラルでErr | E-16（行240-243） | ○ |
| C-57 | リテラル式でないExpr（変数参照）でErr | E-16（行247-250） | ○ |
| C-58 | 二項演算式でErr | E-16（行247-250） | ○ |

## 4) 不足情報（Unknown / Missing）
- C-15（属性なしバリアントの処理）：ソースコード上で属性なしバリアントを明示的にスキップする処理はない。`get_bytes_attrs`と`get_bytes_range_attrs`がそれぞれ該当属性のないバリアントに対して空のVecを返し、結果として`all_bytes`が空となりbyte_mapに何も書き込まれないという暗黙的な挙動に基づく。動作自体は正しいが、意図的な設計かどうかはコード上から確定できない。
  - 候補：開発者への確認 / 実際のコンパイルテスト
- C-28（エスケープシーケンスのバイトリテラルパース）：synライブラリがエスケープシーケンスをどのように処理するかはsyn内部の実装に依存する。`parse_bytes_attr`関数自体にエスケープ専用の処理ロジックはなく、`Lit::Byte`の`value()`がエスケープ後の値を返すことをsynに委任している。テスト可能ではあるが、テスト対象がsyn側の挙動である可能性が高い。
  - 候補：synライブラリのドキュメント / synのテストコード / Rustリファレンスのバイトリテラル仕様
- C-46（全バイト範囲0..=255）：整数リテラル `0` と `255` を `extract_byte_literal` で処理する際の動作はコードで確認できるが、`u8` 型の `0..=255` 範囲イテレーションが256要素すべてを正しく生成するかは、Rustの標準ライブラリの範囲イテレータの実装に依存する。ソースコード上では `from..=to` で extend しているため正常動作が期待されるが、`u8` のオーバーフロー挙動を含めた検証は実際のコンパイルテストで確認すべきである。
  - 候補：Rustリファレンスの範囲式仕様 / 実際のコンパイルテスト

## 5) リスクフラグ（レビュー観点）
- 1: proc-macroのためテスト実行には `trybuild` 等の専用テストフレームワークが必要。通常の `#[test]` では内部関数を直接テストできない（`has_fallback_attr`, `parse_bytes_attr`, `get_bytes_attrs`, `get_bytes_range_attrs`, `parse_bytes_range_attr`, `extract_byte_literal` は全て非public関数）。統合テスト経由でのマクロ展開結果を検証する方式が現実的
- 1: `get_bytes_attrs` と `get_bytes_range_attrs` はパースエラー時に `panic!` するため、エラーハンドリングがコンパイルエラーではなくパニックとなる。これはマクロ展開時に意図的な設計だが、テストではパニックのキャッチ（`#[should_panic]`または`std::panic::catch_unwind`）が必要
- 0: `byte_map` 配列の初期化に `[const { None }; 256]` という const ブロック構文が使用されており、Rust edition 2021以降の機能である点は問題なし（Cargo.tomlで edition = "2021" を確認済み: E-18）
- 0: `fallback_variant` の未設定チェックに `expect` を使用しており（E-08）、`to_compile_error()` ではなくパニックとなる。他のエラー（enum以外、fallback重複）がコンパイルエラーとして返却されるのと異なる設計であることに注意

## 6) レビュアーチェックリスト（最小）
- [ ] proc-macroのテスト方法（trybuildクレート等）の選定は妥当か
- [ ] 内部関数（has_fallback_attr, parse_bytes_attr等）のテストはマクロ展開経由の統合テストで十分か、それともpub化してユニットテストすべきか
- [ ] panic!によるエラーハンドリング（get_bytes_attrs, get_bytes_range_attrs内、およびexpectによるfallback必須チェック）のテスト方針は適切か
- [ ] エスケープシーケンス（C-28）のテストはsynの責務と判断して省略可能か
- [ ] 全256バイト範囲のテスト（C-46）は実際にコンパイルテストで確認するか
- [ ] テストケースの優先度設定は妥当か（特に「高」に分類されたバリデーション系テスト）
- [ ] 属性なしバリアント（C-15）の処理が意図的な設計であるか開発者に確認すべきか
