---
generated_at: 2026-03-01 10:30:00
metrics:
  claims_total: 160
  claims_with_evidence: 155
  claims_without_evidence: 5
confidence_derived: 0.97
---

# 根拠レポート: nu-protocol単体テストケース一覧

## 本レポートについて

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

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

1. **根拠の有無確認**: 各テストケースに対して、ソースコードからの根拠（Evidence）が存在するか
2. **根拠との整合性**: テストケースの内容がソースコードと矛盾していないか
3. **網羅性**: テスト対象となるべき公開APIを適切にカバーしているか

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）: **0.97**
  - 根拠あり: 155 / 160、根拠なし: 5
- 優先レビュー（高）
  1. **UT-NUP-148〜151**: EngineStateの詳細動作は実装依存の部分があり、追加検証が必要
  2. **UT-NUP-143〜147**: PipelineDataのサブタイプ関係は複雑で、エッジケースの検証が必要
  3. **UT-NUP-152**: Configのデフォルト値は設定ファイルとの整合性確認が必要

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

- E-01: `crates/nu-protocol/src/value/mod.rs` - Value列挙型の定義とメソッド実装
- E-02: `crates/nu-protocol/src/span.rs` - Span構造体とSpanned<T>の定義
- E-03: `crates/nu-protocol/src/ty.rs` - Type列挙型とサブタイプ関係の実装
- E-04: `crates/nu-protocol/src/signature.rs` - Signature、Flag、PositionalArg、Category
- E-05: `crates/nu-protocol/src/value/record.rs` - Record構造体とCasedRecordの実装
- E-06: `crates/nu-protocol/src/value/filesize.rs` - Filesize構造体とFilesizeUnit
- E-07: `crates/nu-protocol/src/value/range.rs` - IntRange、FloatRange、Range列挙型
- E-08: `crates/nu-protocol/src/value/duration.rs` - TimePeriodとformat_duration関数
- E-09: `crates/nu-protocol/src/lev_distance.rs` - レーベンシュタイン距離計算関数群
- E-10: `crates/nu-protocol/src/did_you_mean.rs` - did_you_mean関数
- E-11: `crates/nu-protocol/src/pipeline/pipeline_data.rs` - PipelineData列挙型
- E-12: `crates/nu-protocol/src/engine/engine_state.rs` - EngineState構造体
- E-13: `crates/nu-protocol/src/config/mod.rs` - Config構造体
- E-14: `crates/nu-protocol/src/ast/operator.rs` - Comparison、Math、Boolean、Bits演算子
- E-15: `crates/nu-protocol/src/errors/shell_error/mod.rs` - ShellError列挙型
- E-16: `crates/nu-protocol/Cargo.toml` - クレート依存関係とフィーチャ定義

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

### Value型変換メソッド（UT-NUP-001〜020）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | as_bool()がBool値からbool型を正しく返す | E-01 (line 292-298) | ○ |
| C-02 | as_bool()が非Bool値でCantConvertエラーを返す | E-01 (line 282-289) | ○ |
| C-03 | as_int()がInt値からi64型を正しく返す | E-01 (line 300-307) | ○ |
| C-04 | as_int()が非Int値でCantConvertエラーを返す | E-01 (line 282-289) | ○ |
| C-05 | as_float()がFloat値からf64型を正しく返す | E-01 (line 309-316) | ○ |
| C-06 | coerce_float()がInt値をf64に変換する | E-01 (line 333-339) | ○ |
| C-07 | coerce_float()がFloat値をf64に変換する | E-01 (line 333-339) | ○ |
| C-08 | coerce_float()がString値でエラーを返す | E-01 (line 333-339) | ○ |
| C-09 | as_str()がString値から&strを返す | E-01 (line 386-393) | ○ |
| C-10 | coerce_str()がBool値をCow<str>に変換する | E-01 (line 433-449) | ○ |
| C-11 | coerce_str()がInt値をCow<str>に変換する | E-01 (line 433-449) | ○ |
| C-12 | coerce_str()がDate値をRFC3339形式に変換する | E-01 (line 444-446) | ○ |
| C-13 | coerce_str()がUTF-8 Binary値を文字列に変換する | E-01 (line 440-443) | ○ |
| C-14 | coerce_str()が非UTF-8 Binary値でエラーを返す | E-01 (line 440-443) | ○ |
| C-15 | as_filesize()がFilesize値を正しく返す | E-01 (line 341-348) | ○ |
| C-16 | as_duration()がDuration値をi64で返す | E-01 (line 350-357) | ○ |
| C-17 | as_date()がDate値をDateTime型で返す | E-01 (line 359-366) | ○ |
| C-18 | as_range()がRange値を返す | E-01 (line 368-375) | ○ |
| C-19 | into_string()がString値の所有権を返す | E-01 (line 395-402) | ○ |
| C-20 | into_range()がRange値の所有権を返す | E-01 (line 377-384) | ○ |

### Span操作（UT-NUP-021〜046）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-21 | Span::new()が有効なSpanを生成する | E-02 (line 146-153) | ○ |
| C-22 | 開始と終了が同じ位置のSpanが生成できる | E-02 (line 146-153) | ○ |
| C-23 | Span::unknown()がstart=0, end=0を返す | E-02 (line 155-157) | ○ |
| C-24 | Span::test_data()がテスト用Spanを返す | E-02 (line 159-170) | ○ |
| C-25 | len()がSpanの長さを計算する | E-02 (line 177-179) | ○ |
| C-26 | 空Spanのlen()が0を返す | E-02 (line 177-179) | ○ |
| C-27 | is_empty()が空でないSpanでfalseを返す | E-02 (line 181-183) | ○ |
| C-28 | is_empty()が空Spanでtrueを返す | E-02 (line 181-183) | ○ |
| C-29 | contains()が範囲内位置でtrueを返す | E-02 (line 215-217) | ○ |
| C-30 | contains()が開始位置でtrueを返す | E-02 (line 215-217) | ○ |
| C-31 | contains()が終了位置でfalseを返す | E-02 (line 215-217) | ○ |
| C-32 | contains_span()が子Spanの包含を判定する | E-02 (line 219-221) | ○ |
| C-33 | contains_span()が超過Spanでfalseを返す | E-02 (line 219-221) | ○ |
| C-34 | subspan()が部分Spanを生成する | E-02 (line 190-201) | ○ |
| C-35 | subspan()が無効オフセットでNoneを返す | E-02 (line 190-201) | ○ |
| C-36 | split_at()がSpanを分割する | E-02 (line 203-213) | ○ |
| C-37 | split_at()が境界値でNoneを返す | E-02 (line 203-213) | ○ |
| C-38 | append()が2つのSpanを結合する | E-02 (line 261-270) | ○ |
| C-39 | merge()が順序不定のSpanを結合する | E-02 (line 277-282) | ○ |
| C-40 | concat()が複数Spanを連結する | E-02 (line 293-306) | ○ |
| C-41 | concat()が空配列でunknown Spanを返す | E-02 (line 293-306) | ○ |
| C-42 | merge_many()がイテレータからマージする | E-02 (line 313-318) | ○ |
| C-43 | from_row_column()が行列からSpanを生成する | E-02 (line 232-251) | ○ |
| C-44 | Spanned::as_ref()が参照を返す | E-02 (line 18-25) | ○ |
| C-45 | Spanned::map()が値に関数を適用する | E-02 (line 48-55) | ○ |
| C-46 | into_spanned()がSpannedを生成する | E-02 (line 130-134) | ○ |

### Type型システム（UT-NUP-047〜060）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-47 | 同一型はサブタイプ関係が成り立つ（反射性） | E-03 (line 64, 82-83) | ○ |
| C-48 | すべての型はAnyのサブタイプ | E-03 (line 84) | ○ |
| C-49 | IntはNumberのサブタイプ | E-03 (line 91) | ○ |
| C-50 | FloatはNumberのサブタイプ | E-03 (line 91) | ○ |
| C-51 | List<Int>はList<Int>のサブタイプ | E-03 (line 93) | ○ |
| C-52 | List<Int>はList<Any>のサブタイプ（共変性） | E-03 (line 93) | ○ |
| C-53 | 同一型のwidenは同じ型を返す | E-03 (line 117-118) | ○ |
| C-54 | IntとFloatのwidenはNumberを返す | E-03 (line 121-124) | ○ |
| C-55 | GlobとStringのwidenはStringを返す | E-03 (line 126) | ○ |
| C-56 | is_numeric()がIntでtrueを返す | E-03 (line 223-225) | ○ |
| C-57 | is_numeric()がStringでfalseを返す | E-03 (line 223-225) | ○ |
| C-58 | is_list()がList型でtrueを返す | E-03 (line 227-229) | ○ |
| C-59 | to_shape()がIntをSyntaxShape::Intに変換する | E-03 (line 236-267) | ○ |
| C-60 | get_non_specified_string()が型名文字列を返す | E-03 (line 271-297) | ○ |

### Signature（UT-NUP-061〜072）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-61 | Signature::new()がシグネチャを生成する | E-04 (line 348-366) | ○ |
| C-62 | Signature::build()がヘルプ付きで生成する | E-04 (line 438-440) | ○ |
| C-63 | description()が説明を設定する | E-04 (line 446-449) | ○ |
| C-64 | get_input_type()が入力型を取得する | E-04 (line 374-391) | ○ |
| C-65 | get_input_type()が空でAnyを返す | E-04 (line 375-376) | ○ |
| C-66 | get_output_type()が出力型を取得する | E-04 (line 399-416) | ○ |
| C-67 | Flag::new()がフラグを生成する | E-04 (line 44-57) | ○ |
| C-68 | Flag::short()が短縮フラグを設定する | E-04 (line 59-65) | ○ |
| C-69 | PositionalArg::new()が位置引数を生成する | E-04 (line 113-124) | ○ |
| C-70 | Category::fmt()がカテゴリ名を出力する | E-04 (line 235-272) | ○ |
| C-71 | category_from_string()がカテゴリを生成する | E-04 (line 275-309) | ○ |
| C-72 | 未知カテゴリがCustomになる | E-04 (line 308) | ○ |

### Record操作（UT-NUP-073〜087）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-73 | Record::new()が空Recordを生成する | E-05 (line 263-266) | ○ |
| C-74 | Record::with_capacity()が容量指定で生成する | E-05 (line 268-272) | ○ |
| C-75 | push()がキー値を追加する | E-05 (line 344-346) | ○ |
| C-76 | len()がRecordの長さを返す | E-05 (line 333-335) | ○ |
| C-77 | 空Recordのlen()が0を返す | E-05 (line 333-335) | ○ |
| C-78 | is_empty()が空Recordでtrueを返す | E-05 (line 329-331) | ○ |
| C-79 | CasedRecord::get()がキーで値を取得する | E-05 (line 49-52) | ○ |
| C-80 | CasedRecord::get()が存在しないキーでNoneを返す | E-05 (line 49-52) | ○ |
| C-81 | contains()が存在するキーでtrueを返す | E-05 (line 45-47) | ○ |
| C-82 | remove()がキーで値を削除する | E-05 (line 60-63) | ○ |
| C-83 | insert()が新キーを挿入する | E-05 (line 68-78) | ○ |
| C-84 | insert()が既存キーを更新する | E-05 (line 68-78) | ○ |
| C-85 | from_raw_cols_vals()が列値からRecordを生成する | E-05 (line 304-319) | ○ |
| C-86 | from_raw_cols_vals()が不一致でエラーを返す | E-05 (line 313-318) | ○ |
| C-87 | retain()が条件フィルタを適用する | E-05 (line 378-383) | ○ |

### Filesize（UT-NUP-088〜101）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-88 | Filesize::new()がバイト数から生成する | E-06 (line 40-42) | ○ |
| C-89 | get()がバイト数を取得する | E-06 (line 57-59) | ○ |
| C-90 | from_unit()が単位付きで生成する | E-06 (line 48-54) | ○ |
| C-91 | from_unit()がオーバーフローでNoneを返す | E-06 (line 48-54) | ○ |
| C-92 | is_positive()が正値でtrueを返す | E-06 (line 62-64) | ○ |
| C-93 | is_negative()が負値でtrueを返す | E-06 (line 66-68) | ○ |
| C-94 | largest_metric_unit()がメトリック単位を返す | E-06 (line 94-111) | ○ |
| C-95 | largest_binary_unit()がバイナリ単位を返す | E-06 (line 128-145) | ○ |
| C-96 | Add演算が2つのFilesizeを加算する | E-06 (line 262-268) | ○ |
| C-97 | Add演算がオーバーフローでNoneを返す | E-06 (line 262-268) | ○ |
| C-98 | Sub演算が2つのFilesizeを減算する | E-06 (line 270-276) | ○ |
| C-99 | Mul演算がFilesizeと整数を乗算する | E-06 (line 278-284) | ○ |
| C-100 | FilesizeUnit::as_bytes()がバイト数を返す | E-06 (line 381-398) | ○ |
| C-101 | KiBが1024バイトである | E-06 (line 391) | ○ |

### Range（UT-NUP-102〜117）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-102 | IntRange::new()が整数範囲を生成する | E-07 (line 23-81) | ○ |
| C-103 | stepが0でエラーを返す | E-07 (line 47-49) | ○ |
| C-104 | contains()が範囲内値でtrueを返す | E-07 (line 163-186) | ○ |
| C-105 | contains()が開始値でtrueを返す | E-07 (line 163-186) | ○ |
| C-106 | contains()が終了値(inclusive)でtrueを返す | E-07 (line 163-186) | ○ |
| C-107 | contains()が範囲外でfalseを返す | E-07 (line 163-186) | ○ |
| C-108 | is_unbounded()が無制限でtrueを返す | E-07 (line 144-146) | ○ |
| C-109 | absolute_start()が正のstartで正しい位置を返す | E-07 (line 88-93) | ○ |
| C-110 | absolute_start()が負のstartで末尾位置を返す | E-07 (line 88-93) | ○ |
| C-111 | FloatRange::new()が浮動小数点範囲を生成する | E-07 (line 322-400) | ○ |
| C-112 | FloatRange::new()がNaNでエラーを返す | E-07 (line 352-354) | ○ |
| C-113 | FloatRange::contains()が浮動小数点を判定する | E-07 (line 418-441) | ○ |
| C-114 | Range::new()がInt値からIntRangeを生成する | E-07 (line 594-611) | ○ |
| C-115 | Range::new()がFloat値からFloatRangeを生成する | E-07 (line 602-608) | ○ |
| C-116 | Range::contains()がInt値の包含を判定する | E-07 (line 613-623) | ○ |
| C-117 | is_bounded()が有限範囲でtrueを返す | E-07 (line 625-630) | ○ |

### Duration（UT-NUP-118〜123）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-118 | TimePeriod::to_text()がナノ秒を文字列化する | E-08 (line 22-35) | ○ |
| C-119 | TimePeriod::to_text()が週を文字列化する | E-08 (line 22-35) | ○ |
| C-120 | format_duration()が期間を整形する | E-08 (line 44-57) | ○ |
| C-121 | format_duration()が負の期間を整形する | E-08 (line 44-57, 65-69) | ○ |
| C-122 | format_duration_as_timeperiod()が複合期間を分解する | E-08 (line 59-181) | ○ |
| C-123 | format_duration_as_timeperiod()が0期間でSecondsを返す | E-08 (line 176-178) | ○ |

### Levenshtein距離（UT-NUP-124〜132）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-124 | lev_distance()が同一文字列で0を返す | E-09 (line 19-54) | ○ |
| C-125 | lev_distance()が1文字差で1を返す | E-09 (line 19-54) | ○ |
| C-126 | lev_distance()が制限超過でNoneを返す | E-09 (line 49-53) | ○ |
| C-127 | lev_distance()が空文字列との距離を計算する | E-09 (line 24-29) | ○ |
| C-128 | levenshtein_distance()が制限なしで計算する | E-09 (line 57-59) | ○ |
| C-129 | find_best_match_for_name_with_substrings()が最適候補を返す | E-09 (line 108-114) | ○ |
| C-130 | 大文字小文字を無視してマッチする | E-09 (line 146-151) | ○ |
| C-131 | did_you_mean()がタイポ提案を返す | E-10 (line 1-17) | ○ |
| C-132 | did_you_mean()が候補なしでNoneを返す | E-10 (line 1-17) | ○ |

### PipelineData（UT-NUP-133〜147）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-133 | PipelineData::empty()が空を生成する | E-11 (line 53-55) | ○ |
| C-134 | PipelineData::value()がValueを生成する | E-11 (line 57-59) | ○ |
| C-135 | is_nothing()が空でtrueを返す | E-11 (line 88-91) | ○ |
| C-136 | is_nothing()がNothing値でtrueを返す | E-11 (line 88-91) | ○ |
| C-137 | span()がValueのSpanを返す | E-11 (line 94-101) | ○ |
| C-138 | span()が空でNoneを返す | E-11 (line 94-101) | ○ |
| C-139 | get_type()がEmptyでNothingを返す | E-11 (line 131-138) | ○ |
| C-140 | get_type()がListStreamでlist<any>を返す | E-11 (line 131-138) | ○ |
| C-141 | into_value()がEmptyでNothingを返す | E-11 (line 181-194) | ○ |
| C-142 | into_value()がValueを返す | E-11 (line 181-194) | ○ |
| C-143 | is_subtype_of()がEmptyとNothingで成立する | E-11 (line 154-179) | ○ |
| C-144 | is_subtype_of()がAnyで常に成立する | E-11 (line 156) | ○ |
| C-145 | with_span()がSpanを更新する | E-11 (line 106-119) | ○ |
| C-146 | metadata()がメタデータを取得する | E-11 (line 69-76) | ○ |
| C-147 | set_metadata()がメタデータを設定する | E-11 (line 78-86) | ○ |

### EngineState（UT-NUP-148〜151）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-148 | EngineState::new()が新しい状態を生成する | E-12 (line 152-222) | ○ |
| C-149 | signals()がSignalsを取得する | E-12 (line 224-226) | ○ |
| C-150 | reset_signals()がシグナルをリセットする | E-12 (line 228-233) | △ |
| C-151 | IsDebugging::new()がデバッグ状態を生成する | E-12 (line 53-58) | ○ |

### Config（UT-NUP-152）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-152 | Config::default()がデフォルト設定を生成する | E-13 (line 89-143) | △ |

### Operator（UT-NUP-153〜156）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-153 | Comparison::as_str()が演算子を文字列化する | E-14 (line 44-63) | ○ |
| C-154 | Math::as_str()が数学演算子を文字列化する | E-14 (line 99-111) | ○ |
| C-155 | Boolean::as_str()が論理演算子を文字列化する | E-14 (line 136-142) | ○ |
| C-156 | Bits::as_str()がビット演算子を文字列化する | E-14 (line 178-186) | ○ |

### ShellError（UT-NUP-157〜160）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-157 | ShellError::OperatorUnsupportedTypeが生成される | E-15 (line 26-37) | ○ |
| C-158 | ShellError::TypeMismatchが生成される | E-15 (line 126-132) | ○ |
| C-159 | ShellError::MissingParameterが生成される | E-15 (line 218-225) | ○ |
| C-160 | ShellError::InvalidValueが生成される | E-15 (line 153-160) | ○ |

## 4) 不足情報（Unknown / Missing）
- **EngineStateの詳細動作**: reset_signals()の完全な動作検証には、signal_handlersの実装詳細が必要
  - 候補: crates/nu-protocol/src/pipeline/signals.rs / nu-systemクレートの関連実装
- **Configのデフォルト値**: 一部の設定値はランタイム環境に依存する可能性がある
  - 候補: 設定ファイル仕様書 / ユーザードキュメント
- **複雑なサブタイプ関係**: OneOf型やRecord型のサブタイプ判定には追加のエッジケース検証が必要
  - 候補: ty.rsの既存テスト / 型システム設計文書

## 5) リスクフラグ（レビュー観点）
- **0 (低リスク)**: Value型変換、Span操作、基本的なRecord操作 - ソースコードから直接確認可能
- **1 (中リスク)**: Range操作、Filesize演算、PipelineData - エッジケースの追加検証推奨
- **2 (高リスク)**: EngineState統合テスト、Config設定の環境依存テスト - 実行環境での検証必須

## 6) レビュアーチェックリスト（最小）
- [ ] Value型変換メソッド（UT-NUP-001〜020）のエラーケースが網羅されているか
- [ ] Span境界値テスト（UT-NUP-030, 031, 037）が正しい期待値を持っているか
- [ ] Type::is_subtype_of()のOneOf型処理（UT-NUP-051, 052）が仕様通りか
- [ ] Record::from_raw_cols_vals()のエラーケース（UT-NUP-086）がShellError型と一致するか
- [ ] IntRange/FloatRangeの無効入力ケース（UT-NUP-103, 112）がエラーを正しく返すか
- [ ] PipelineDataのサブタイプ判定（UT-NUP-143, 144）がドキュメントと整合するか
- [ ] EngineState::reset_signals()（UT-NUP-150）の実際の動作を確認
- [ ] Config::default()（UT-NUP-152）の各フィールドのデフォルト値を確認
