---
generated_at: 2026-02-20 01:00:00
metrics:
  claims_total: 187
  claims_with_evidence: 175
  claims_without_evidence: 12
confidence_derived: 0.94
---

# 根拠レポート：protocol モジュール単体テストケース一覧

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.94**
  - 根拠あり：175 / 187、根拠なし：12
- 優先レビュー（高）
  1. **C-103 (RequestToken.next 31ビットマスク)**: コード上のビットマスク操作は確認できるが、テストレベルでのオーバーフロー動作は実行環境依存
  2. **C-104 (RequestToken.randomLong)**: ランダム値の範囲は推論に基づく
  3. **C-162〜C-166 (uri関数のauthority/query/fragment)**: ソースコードで実装は確認できるがunitテストが不足

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

- E-01: `protocol/source/served/lsp/jsonops.d` (全622行) - JSON操作ユーティリティのソースコード
- E-02: `protocol/source/served/lsp/protocol.d` (全4255行) - LSPプロトコル型定義のソースコード
- E-03: `protocol/source/served/lsp/uri.d` (全300行) - URI操作ユーティリティのソースコード
- E-04: `jsonops.d` unittest (行51-67) - serializeJson/deserializeJson往復テスト
- E-05: `jsonops.d` unittest (行391-424) - parseKeySlices動作テスト
- E-06: `jsonops.d` unittest (行449-487) - visitJsonArray動作テスト
- E-07: `jsonops.d` unittest (行529-540) - isEmptyJsonObject動作テスト
- E-08: `jsonops.d` unittest (行575-621) - escapeJsonStringContent動作テスト
- E-09: `protocol.d` unittest (行259-321) - StructVariant(Named/Person/Place)テスト
- E-10: `protocol.d` unittest (行323-366) - StructVariant(Person/Place)テスト
- E-11: `protocol.d` unittest (行509-522) - orDefault動作テスト
- E-12: `protocol.d` unittest (行549-590) - Optional isNone/deref/expect テスト
- E-13: `protocol.d` unittest (行611-620) - ArrayOrSingle往復テスト
- E-14: `protocol.d` unittest (行710-737) - RequestTokenシリアライズ/ランダムテスト
- E-15: `protocol.d` unittest (行891-919) - ResponseMessage構築テスト
- E-16: `protocol.d` unittest (行1091-1100) - Position往復テスト
- E-17: `protocol.d` unittest (行1184-1202) - TextRange intersectsテスト
- E-18: `protocol.d` unittest (行1205-1216) - TextRange往復テスト
- E-19: `protocol.d` unittest (行1311-1317) - TextEdit往復テスト
- E-20: `protocol.d` unittest (行1476-1692) - InitializeParamsシリアライズ/デシリアライズテスト
- E-21: `protocol.d` unittest (行2082-2094) - ServerCapabilitiesシリアライズテスト
- E-22: `protocol.d` unittest (行2508-2534) - InsertReplaceEdit往復テスト
- E-23: `protocol.d` unittest (行2588-2661) - CompletionItemシリアライズ/デシリアライズテスト
- E-24: `protocol.d` unittest (行1734-1743) - WorkspaceEditClientCapabilitiesテスト
- E-25: `protocol.d` unittest (行4191-4197) - StringMapシリアライズテスト
- E-26: `uri.d` unittest (行31-47) - uriFromFile基本テスト
- E-27: `uri.d` unittest (行66-96) - uriFromFile/uriToFile往復テスト
- E-28: `uri.d` unittest (行168-172) - uri関数テスト
- E-29: `uri.d` unittest (行193-206) - uriDirNameテスト
- E-30: `uri.d` unittest (行232-241) - uriBuildNormalizedテスト
- E-31: `uri.d` unittest (行281-299) - uriNormalizeテスト

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-001 | RootJsonToken型のserializeJson | E-01 (行22-30) | ○ |
| C-002 | 一般型のserializeJson | E-01 (行22-30) | ○ |
| C-003 | RootJsonToken型のdeserializeJson | E-01 (行32-40) | ○ |
| C-004 | 一般型のdeserializeJson | E-01 (行32-40) | ○ |
| C-005 | 各種JSON往復変換 | E-04 | ○ |
| C-006 | jsonValueTo変換 | E-01 (行69-72) | ○ |
| C-007 | toJsonValue object型変換 | E-01 (行74-105) | ○ |
| C-008 | toJsonValue array型変換 | E-01 (行74-105) | ○ |
| C-009 | toJsonValue 各プリミティブ型変換 | E-01 (行74-105) | ○ |
| C-010 | toStdJSONValue object型変換 | E-01 (行107-134) | ○ |
| C-011 | toStdJSONValue 各プリミティブ型変換 | E-01 (行107-134) | ○ |
| C-012 | toJsonValue テンプレート版 | E-01 (行136-139) | ○ |
| C-013 | skipString正常系 | E-01 (行141-170) | ○ |
| C-014 | skipStringエスケープ | E-01 (行141-170) | ○ |
| C-015 | skipString Unicodeエスケープ | E-01 (行141-170) | ○ |
| C-016 | skipString異常系 | E-01 (行166-167) | ○ |
| C-017 | skipNumber整数 | E-01 (行172-216) | ○ |
| C-018 | skipNumber負の数 | E-01 (行172-216) | ○ |
| C-019 | skipNumber小数 | E-01 (行172-216) | ○ |
| C-020 | skipNumber指数表記 | E-01 (行172-216) | ○ |
| C-021 | skipNumber異常系 | E-01 (行180-183) | ○ |
| C-022 | skipLiteral正常系 | E-01 (行218-228) | ○ |
| C-023 | skipLiteral異常系 | E-01 (行220-223) | ○ |
| C-024 | skipValue各種型 | E-01 (行271-295) | ○ |
| C-025 | skipValue空入力 | E-01 (行273-274) | ○ |
| C-026 | skipValue不正文字 | E-01 (行292-294) | ○ |
| C-027 | parseKeySlices正常系 | E-05 | ○ |
| C-028 | parseKeySlices存在しないキー | E-05 (行417) | ○ |
| C-029 | parseKeySlices不正キー | E-01 (行340-341) | ○ |
| C-030 | parseKeySlicesコロン不在 | E-01 (行343-344) | ○ |
| C-031 | parseKeySlicesエスケープキー | E-01 (行366-381) | ○ |
| C-032 | visitJsonArray正常系 | E-06 | ○ |
| C-033 | visitJsonArray異常系 | E-01 (行440-442) | ○ |
| C-034 | visitJsonArray空配列 | E-01 (行426-447) | ○ |
| C-035 | looksLikeJsonObject正常系 | E-01 (行489-494) | ○ |
| C-036 | looksLikeJsonObject異常系 | E-01 (行489-494) | ○ |
| C-037 | looksLikeJsonObject境界値 | E-01 (行489-494) | ○ |
| C-038 | looksLikeJsonArray正常系 | E-01 (行496-501) | ○ |
| C-039 | looksLikeJsonArray異常系 | E-01 (行496-501) | ○ |
| C-040 | looksLikeJsonArray境界値 | E-01 (行496-501) | ○ |
| C-041 | isValidJsonStringContent正常系 | E-01 (行503-509) | ○ |
| C-042 | isValidJsonStringContentダブルクォート | E-01 (行503-509) | ○ |
| C-043 | isValidJsonStringContentバックスラッシュ | E-01 (行503-509) | ○ |
| C-044 | isValidJsonStringContent制御文字 | E-01 (行503-509) | ○ |
| C-045 | isValidJsonStringContent空文字列 | E-01 (行503-509) | ○ |
| C-046 | isEmptyJsonObject "{}" | E-07 | ○ |
| C-047 | isEmptyJsonObject空白含む | E-07 | ○ |
| C-048 | isEmptyJsonObject空文字列 | E-07 | ○ |
| C-049 | isEmptyJsonObject不正ブレース | E-07 | ○ |
| C-050 | isEmptyJsonObject不完全 | E-07 | ○ |
| C-051 | escapeJsonStringContentそのまま返却 | E-08 (行577-578) | ○ |
| C-052 | escapeJsonStringContentダブルクォート | E-08 (行579-580) | ○ |
| C-053 | escapeJsonStringContentバックスラッシュ | E-01 (行554-555) | ○ |
| C-054 | escapeJsonStringContent制御文字 | E-08 (行582-620) | ○ |
| C-055 | StructVariant初期化 | E-09 (行281) | ○ |
| C-056 | StructVariant tryExtract成功 | E-09 (行289) | ○ |
| C-057 | StructVariant tryExtract包含型 | E-09 (行288) | ○ |
| C-058 | StructVariant tryExtract失敗 | E-09 (行290) | ○ |
| C-059 | StructVariant extract成功 | E-09 (行303) | ○ |
| C-060 | StructVariant extract異常系 | E-09 (行292-301) | ○ |
| C-061 | StructVariant serializeJson | E-09 (行283) | ○ |
| C-062 | StructVariant deserialize成功 | E-09 (行307-308) | ○ |
| C-063 | StructVariant deserialize必須キー不足 | E-09 (行313-315) | ○ |
| C-064 | StructVariant非struct JSON | E-09 (行318-320) | ○ |
| C-065 | NullableOptional値初期化 | E-02 (行396-399) | ○ |
| C-066 | NullableOptional null初期化 | E-02 (行402-406) | ○ |
| C-067 | NullableOptional unset | E-02 (行408-411) | ○ |
| C-068 | NullableOptional get正常 | E-02 (行432-436) | ○ |
| C-069 | NullableOptional get異常 | E-02 (行434) | ○ |
| C-070 | NullableOptional serdeIgnoreOut false時 | E-02 (行427-430) | ○ |
| C-071 | NullableOptional serdeIgnoreOut true時 | E-02 (行427-430) | ○ |
| C-072 | isNone void状態でtrue | E-12 (行555-557) | ○ |
| C-073 | isNone 値設定でfalse | E-12 (行563-565) | ○ |
| C-074 | deref値取得 | E-12 (行567) | ○ |
| C-075 | deref void状態で例外 | E-12 (行586) | ○ |
| C-076 | deref OptionalJsonValue正常 | E-02 (行489-494) | ○ |
| C-077 | deref OptionalJsonValue例外 | E-02 (行491-492) | ○ |
| C-078 | orDefault値あり | E-11 (行515) | ○ |
| C-079 | orDefault void状態 | E-11 (行513) | ○ |
| C-080 | orDefault OptionalJsonValue | E-11 (行512-513) | ○ |
| C-081 | expect型一致 | E-12 (行571) | ○ |
| C-082 | expect型不一致 | E-12 (行575) | ○ |
| C-083 | expect void状態 | E-12 (行587) | ○ |
| C-084 | opt関数 | E-02 (行544-547) | ○ |
| C-085 | Position opCmp行小 | E-02 (行1077-1088) | ○ |
| C-086 | Position opCmp行大 | E-02 (行1077-1088) | ○ |
| C-087 | Position opCmp文字位置 | E-02 (行1077-1088) | ○ |
| C-088 | Position opCmp同一 | E-02 (行1077-1088) | ○ |
| C-089 | Position往復変換 | E-16 | ○ |
| C-090 | TextRange contains範囲内 | E-02 (行1164-1174) | ○ |
| C-091 | TextRange contains開始 | E-02 (行1164-1174) | ○ |
| C-092 | TextRange contains終了 | E-02 (行1164-1174) | ○ |
| C-093 | TextRange contains範囲外 | E-02 (行1164-1174) | ○ |
| C-094 | TextRange contains開始行境界外 | E-02 (行1164-1174) | ○ |
| C-095 | TextRange intersects重なり | E-17 (行1194) | ○ |
| C-096 | TextRange intersects可換性 | E-17 (行1189-1191) | ○ |
| C-097 | TextRange intersects隣接 | E-17 (行1195) | ○ |
| C-098 | TextRange intersects包含 | E-17 (行1196) | ○ |
| C-099 | TextRange intersects同一 | E-17 (行1199) | ○ |
| C-100 | TextRange往復変換 | E-18 | ○ |
| C-101 | EolType toString | E-02 (行1058-1069) | ○ |
| C-102 | RequestToken next | E-02 (行645-661) | ○ |
| C-103 | RequestToken next 31ビット | E-02 (行656-657) | △ |
| C-104 | RequestToken randomLong | E-02 (行664-673) | △ |
| C-105 | RequestToken randomString | E-14 (行720-724) | ○ |
| C-106 | RequestToken randomString異なる値 | E-14 (行721, 724) | ○ |
| C-107 | RequestToken randomSerializedString | E-14 (行726-729) | ○ |
| C-108 | RequestToken randomAndSerializedString | E-14 (行727-730) | ○ |
| C-109 | RequestTokenシリアライズ | E-14 (行712-718) | ○ |
| C-110 | RequestToken opAssign文字列 | E-14 (行732-733) | ○ |
| C-111 | RequestToken opAssign整数 | E-14 (行735-736) | ○ |
| C-112 | ResponseError Throwableコンストラクタ | E-02 (行825-830) | ○ |
| C-113 | ResponseError ErrorCodeコンストラクタ | E-02 (行832-836) | ○ |
| C-114 | ResponseError ErrorCode+msgコンストラクタ | E-02 (行838-842) | ○ |
| C-115 | ResponseMessage構築テスト | E-15 | ○ |
| C-116 | ResponseMessageRaw toStringエラーなし | E-02 (行932-938) | ○ |
| C-117 | ResponseMessageRaw toStringエラーあり | E-02 (行932-938) | ○ |
| C-118 | ResponseMessageRaw deserialize | E-02 (行940-955) | ○ |
| C-119 | RequestMessageRaw toString | E-02 (行768-770) | ○ |
| C-120 | RequestMessageRaw fiberName通知 | E-02 (行774-779) | ○ |
| C-121 | RequestMessageRaw fiberNameリクエスト | E-02 (行774-779) | ○ |
| C-122 | getWorkspaceFolders設定あり | E-02 (行1458-1473) | ○ |
| C-123 | getWorkspaceFolders rootUri | E-02 (行1467-1468) | ○ |
| C-124 | getWorkspaceFolders rootPath | E-02 (行1469-1470) | ○ |
| C-125 | getWorkspaceFolders全未設定 | E-02 (行1471-1472) | ○ |
| C-126 | InitializeParams往復変換 | E-20 | ○ |
| C-127 | effectiveInsertText設定あり | E-02 (行2582-2585) | ○ |
| C-128 | effectiveInsertText未設定 | E-02 (行2582-2585) | ○ |
| C-129 | CompletionItem往復変換 | E-23 | ○ |
| C-130 | MarkupContent文字列コンストラクタ | E-02 (行2803-2807) | ○ |
| C-131 | MarkupContent MarkupKindコンストラクタ | E-02 (行2797-2801) | ○ |
| C-132 | MarkupContent MarkedStringコンストラクタ | E-02 (行2809-2824) | ○ |
| C-133 | CodeAction Commandコンストラクタ | E-02 (行3352-3356) | ○ |
| C-134 | CodeAction Command+Kindコンストラクタ | E-02 (行3358-3363) | ○ |
| C-135 | CodeAction id取得 | E-02 (行3392-3395) | ○ |
| C-136 | CodeAction idデータなし | E-02 (行3403-3421) | ○ |
| C-137 | CodeAction uri取得 | E-02 (行3398-3401) | ○ |
| C-138 | CodeAction readData正常 | E-02 (行3403-3421) | ○ |
| C-139 | CodeAction readDataキー不在 | E-02 (行3403-3421) | ○ |
| C-140 | InsertReplaceEdit往復変換 | E-22 | ○ |
| C-141 | InsertReplaceEdit Variant往復 | E-22 (行2518-2519) | ○ |
| C-142 | InsertReplaceEdit StructVariant往復 | E-22 (行2521-2533) | ○ |
| C-143 | MarkedString serialize language有 | E-02 (行2745-2756) | ○ |
| C-144 | MarkedString serialize language無 | E-02 (行2745-2756) | ○ |
| C-145 | MarkedString deserialize文字列 | E-02 (行2762-2781) | ○ |
| C-146 | MarkedString deserializeオブジェクト | E-02 (行2762-2781) | ○ |
| C-147 | ArrayOrSingle往復変換 | E-13 | ○ |
| C-148 | MethodExceptionコンストラクタ | E-02 (行845-854) | ○ |
| C-149 | allowedMethods関数 | E-02 (行368-376) | ○ |
| C-150 | uriFromFile正常系 | E-26 (行41) | ○ |
| C-151 | uriFromFile正規化 | E-26 (行44) | ○ |
| C-152 | uriFromFileスペース | E-27 (行88) | ○ |
| C-153 | uriFromFile相対パス例外 | E-26 (行42) | ○ |
| C-154 | uriFromFile空文字列例外 | E-26 (行43) | ○ |
| C-155 | uriToFile正常系 | E-27 (行87) | ○ |
| C-156 | uriToFile Windowsパス | E-27 (行91) | ○ |
| C-157 | uriToFile共有パス | E-27 (行92) | ○ |
| C-158 | uriToFile非fileスキーム | E-27 (行94-95) | ○ |
| C-159 | uriFromFile/uriToFile往復 | E-27 (行72) | ○ |
| C-160 | uri関数file | E-28 (行170) | ○ |
| C-161 | uri関数スペース | E-28 (行171) | ○ |
| C-162 | uri関数authority | E-03 (行114-129) | △ |
| C-163 | uri関数password | E-03 (行119-128) | △ |
| C-164 | uri関数port | E-03 (行131-138) | △ |
| C-165 | uri関数ドライブレター | E-03 (行142-152) | △ |
| C-166 | uri関数query/fragment | E-03 (行156-163) | △ |
| C-167 | uriDirName基本 | E-29 (行203) | ○ |
| C-168 | uriDirName末尾スラッシュ | E-29 (行202) | ○ |
| C-169 | uriDirNameルート | E-29 (行195) | ○ |
| C-170 | uriDirName file:/// | E-29 (行199) | ○ |
| C-171 | uriDirNameスラッシュなし | E-29 (行197) | ○ |
| C-172 | uriDirName連続呼出 | E-29 (行204-205) | ○ |
| C-173 | uriBuildNormalized相対パス | E-30 (行234) | ○ |
| C-174 | uriBuildNormalized親ディレクトリ | E-30 (行235) | ○ |
| C-175 | uriBuildNormalized絶対パス | E-30 (行236-239) | ○ |
| C-176 | uriBuildNormalizedスラッシュ始まり | E-03 (行217-224) | ○ |
| C-177 | uriBuildNormalizedルート超え | E-30 (行240) | ○ |
| C-178 | uriNormalize ./除去 | E-31 (行288) | ○ |
| C-179 | uriNormalize ../解決 | E-31 (行289) | ○ |
| C-180 | uriNormalize混在 | E-31 (行290) | ○ |
| C-181 | uriNormalize先頭../保持 | E-31 (行291) | ○ |
| C-182 | uriNormalize先頭./除去 | E-31 (行293) | ○ |
| C-183 | uriNormalize a.ファイル名保持 | E-31 (行294) | ○ |
| C-184 | uriNormalize .aファイル名保持 | E-31 (行295) | ○ |
| C-185 | uriNormalize多重../ | E-31 (行284) | ○ |
| C-186 | uriNormalize深いネスト | E-31 (行292) | ○ |
| C-187 | uriNormalize各種プレフィックス | E-31 (行286) | ○ |

## 4) 不足情報（Unknown / Missing）
- **C-103 (RequestToken.next 31ビットマスク)**: コード上は `& 0x7FFF_FFFFu` が確認できるが、uint のオーバーフロー時の実際の動作は実行環境でのテストでしか確認できない
  - 候補：実行時テスト / D言語仕様書のuintオーバーフロー規定
- **C-104 (RequestToken.randomLong)**: `uniform(0L, maxSafeInt)` の範囲は推論に基づく。実際のランダム分布は統計テストが必要
  - 候補：std.randomのuniform仕様 / 統計的テスト
- **C-162〜C-166 (uri関数のauthority/query/fragment)**: ソースコード実装は確認できるが、これらの分岐に対応するunittestがソースコード内に存在しない
  - 候補：LSP仕様書(URI) / vscode-uri実装のテスト / 手動テスト追加
- **C-034 (visitJsonArray空配列)**: 空配列`[]`に対するunittestがソースコードに明示的に存在しない。コードのwhile条件からの推論
  - 候補：空配列テストの追加
- **C-045 (isValidJsonStringContent空文字列)**: 空文字列に対するunittestがソースコードに明示的に存在しない。foreach文の特性からの推論
  - 候補：空文字列テストの追加

## 5) リスクフラグ（レビュー観点）
- **0 (低リスク)**: jsonops.dの大部分 - 既存unittestが豊富で根拠が明確
- **0 (低リスク)**: uri.dの大部分 - 既存unittestが豊富で根拠が明確
- **0 (低リスク)**: protocol.dの型定義・シリアライズ - 既存unittestが豊富
- **1 (中リスク)**: uri関数のauthority/query/fragment処理 (C-162〜C-166) - 実装は確認できるがunittestが不足
- **1 (中リスク)**: RequestTokenのランダム生成系 (C-103〜C-104) - 非決定的な動作のテスト困難性
- **0 (低リスク)**: protocol.dの構造体定義部分 - データ構造のみでロジックなし（テスト対象外とした部分）

## 6) レビュアーチェックリスト（最小）
- [ ] jsonops.d: skipString/skipNumber/skipLiteral のprivate関数に対するテストケースが適切か（テスト可能性の観点）
- [ ] protocol.d: StructVariantのdeserializeFromIon関連テストケースが、IonException型の戻り値を正しく検証しているか
- [ ] protocol.d: NullableOptionalのserialize/deserializeのテストケースが十分か（C-065〜C-071）
- [ ] uri.d: Windows固有パス(C-156, C-157)のテストが実行環境に依存しないか
- [ ] uri.d: uri関数のauthority/query/fragment処理(C-162〜C-166)に対するunittestが不足しているため追加検討が必要か
- [ ] 全体: テストケースの「前提条件」列にcontract条件(in句)の反映が十分か
- [ ] 全体: deprecatedな関数(toJSON/fromJSON)を意図的にテスト対象外としたことが妥当か
