---
generated_at: 2026-03-01 12:00:00
metrics:
  claims_total: 82
  claims_with_evidence: 78
  claims_without_evidence: 4
confidence_derived: 0.95
---

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

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.95**
  - 根拠あり：78 / 82、根拠なし：4
- 優先レビュー（高）
  1. **C-80, C-81**: Source/SourceLocationインターフェースは型定義のみであり、ランタイムテストの必要性は要確認
  2. **C-82**: SourceLocation型エイリアスのランタイムテストの妥当性
  3. **C-79**: クロージャによるlineTable保持の検証方法が実装内部に依存

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

- E-01: `packages/tailwindcss/src/source-maps/line-table.ts` - createLineTable関数（行50-100）
- E-02: `packages/tailwindcss/src/source-maps/line-table.ts` - LINE_BREAK定数 `0x0a`（行7）
- E-03: `packages/tailwindcss/src/source-maps/line-table.ts` - Positionインターフェース: line(1ベース), column(0ベース)（行14-20）
- E-04: `packages/tailwindcss/src/source-maps/line-table.ts` - find関数の二分探索ロジック（行60-84）
- E-05: `packages/tailwindcss/src/source-maps/line-table.ts` - findOffset関数のクランプロジック: Math.min/Math.max/??（行86-94）
- E-06: `packages/tailwindcss/src/source-maps/source-map.ts` - createSourceMap関数（行76-163）
- E-07: `packages/tailwindcss/src/source-maps/source-map.ts` - DefaultMapによるlineTablesとsourceTable（行79-84）
- E-08: `packages/tailwindcss/src/source-maps/source-map.ts` - walk関数によるAST走査とsrc/dstチェック（行94-95）
- E-09: `packages/tailwindcss/src/source-maps/source-map.ts` - originalSource.contentチェック（行98）
- E-10: `packages/tailwindcss/src/source-maps/source-map.ts` - 複数行スキャン: split('\n') + trim() による空行スキップ（行115-132）
- E-11: `packages/tailwindcss/src/source-maps/source-map.ts` - 終了位置マッピング生成（行134-144）
- E-12: `packages/tailwindcss/src/source-maps/source-map.ts` - sources配列へのpush（行148-150）
- E-13: `packages/tailwindcss/src/source-maps/source-map.ts` - マッピングのソートロジック: line→column→originalLine→originalColumn（行153-160）
- E-14: `packages/tailwindcss/src/source-maps/source-map.ts` - DecodedSourceの構造: url, content, ignore=false（行80-84）
- E-15: `packages/tailwindcss/src/source-maps/source-map.ts` - map.file=null初期値（行88）
- E-16: `packages/tailwindcss/src/source-maps/source-map.ts` - name: null固定値（行121, 138）
- E-17: `packages/tailwindcss/src/source-maps/source-map.ts` - createTranslationMap関数（行165-198）
- E-18: `packages/tailwindcss/src/source-maps/source-map.ts` - node.srcがない場合のearly return `if (!node.src) return []`（行185）
- E-19: `packages/tailwindcss/src/source-maps/source-map.ts` - dstがない場合のnullフォールバック: `node.dst ? ... : null`（行192-193）
- E-20: `packages/tailwindcss/src/source-maps/source.ts` - Sourceインターフェース: file(string|null), code(string)（行6-18）
- E-21: `packages/tailwindcss/src/source-maps/source.ts` - SourceLocation型エイリアス: [Source, start, end]（行27）
- E-22: `packages/tailwindcss/src/source-maps/line-table.test.ts` - 既存テスト: find/findOffsetの全文字位置検証（行1-87）
- E-23: `packages/tailwindcss/src/source-maps/source-map.test.ts` - 既存テスト: @import, ユーティリティ, @apply, ライセンスコメント, addBase（行1-476）
- E-24: `packages/tailwindcss/src/source-maps/translation-map.test.ts` - 既存テスト: コメント, 宣言, at-rule, スタイルルールの位置変換（行1-280）
- E-25: `packages/tailwindcss/src/source-maps/source-map.ts` - originalPosition?.line/column ?? 0 によるnull安全なソート（行157-158）

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | 単一行のソースでオフセット0の位置を取得できる | E-01, E-04, E-22 | ○ |
| C-02 | 単一行のソースで任意のオフセットの位置を取得できる | E-01, E-04, E-22 | ○ |
| C-03 | 複数行のソースで2行目の先頭位置を正しく取得できる | E-01, E-02, E-04, E-22 | ○ |
| C-04 | 複数行のソースで2行目の途中位置を取得できる | E-01, E-02, E-04, E-22 | ○ |
| C-05 | 3行以上のソースで3行目の先頭位置を取得できる | E-01, E-04, E-22 | ○ |
| C-06 | 末尾改行の後のオフセットが次の行として返る | E-01, E-02, E-04, E-22 | ○ |
| C-07 | 改行文字(0x0A)自体のオフセットがその行の末尾列として返る | E-01, E-02, E-04 | ○ |
| C-08 | 1行目の各文字のline/columnが全て正しく返る | E-04, E-22 | ○ |
| C-09 | 2行目の各文字のline/columnが全て正しく返る | E-04, E-22 | ○ |
| C-10 | lineが1ベースで返却される | E-03, E-04 | ○ |
| C-11 | columnが0ベースで返却される | E-03, E-04 | ○ |
| C-12 | 空文字列のソースでオフセット0の位置を取得できる | E-01, E-04 | ○ |
| C-13 | 1文字のソースでオフセット0の位置を取得できる | E-01, E-04 | ○ |
| C-14 | ソースの末尾オフセットで正しい位置を返す | E-01, E-04 | ○ |
| C-15 | 改行のみのソースでオフセット0の位置を返す | E-01, E-02, E-04 | ○ |
| C-16 | 改行のみのソースでオフセット1の位置を返す | E-01, E-02, E-04 | ○ |
| C-17 | 連続する改行のみのソースで正しい位置を返す | E-01, E-02, E-04 | ○ |
| C-18 | CRLF(\r\n)を含むソースでLFのみで行分割される | E-02 | ○ |
| C-19 | CR(0x0D)のみでは行分割されない | E-02 | ○ |
| C-20 | 多数の行を持つソースで二分探索が正確に動作する | E-04 | ○ |
| C-21 | findOffsetで1行目の先頭位置からオフセット0が返る | E-01, E-05, E-22 | ○ |
| C-22 | findOffsetで1行目の任意の位置からオフセットが正しく返る | E-01, E-05, E-22 | ○ |
| C-23 | findOffsetで2行目の先頭位置からオフセットが正しく返る | E-01, E-05, E-22 | ○ |
| C-24 | findOffsetで2行目の途中位置からオフセットが正しく返る | E-01, E-05, E-22 | ○ |
| C-25 | findOffsetで3行目の先頭位置からオフセットが正しく返る | E-01, E-05, E-22 | ○ |
| C-26 | findOffsetで4行目(末尾改行後)の先頭からオフセットが正しく返る | E-01, E-05, E-22 | ○ |
| C-27 | line=0(範囲外)が渡された場合にクランプされる | E-05 | ○ |
| C-28 | 存在しない大きなline番号が渡された場合にクランプされる | E-05 | ○ |
| C-29 | columnが行の長さを超える場合に次の行の先頭にクランプされる | E-05 | ○ |
| C-30 | 最終行でcolumnが行の長さを超える場合のクランプ処理 | E-05 | ○ |
| C-31 | 負のcolumnが渡された場合に0にクランプされる | E-05 | ○ |
| C-32 | 空文字列のソースでfindOffsetが動作する | E-01, E-05 | ○ |
| C-33 | 末尾改行なしの最終行でtable[line+1]がundefinedの場合の処理 | E-05 | ○ |
| C-34 | findとfindOffsetが逆変換として整合する | E-04, E-05, E-22 | ○ |
| C-35 | 改行コード0x0A(LF)の位置が正しくテーブルに記録される | E-01, E-02 | ○ |
| C-36 | 空のAST配列でソースマップが生成される | E-06, E-15 | ○ |
| C-37 | srcとdstを持つノードからマッピングが生成される | E-06, E-08 | ○ |
| C-38 | 複数行にまたがるオリジナルテキストで各行にマッピングが生成される | E-10 | ○ |
| C-39 | 空白のみの行はマッピング対象外となる | E-10 | ○ |
| C-40 | 各ノードの末尾位置のマッピングが常に生成される | E-11 | ○ |
| C-41 | sourcesにすべてのユニークなソースが含まれる | E-07, E-12 | ○ |
| C-42 | 同じSourceを参照する複数ノードでsourcesに重複なく追加される | E-07, E-12 | ○ |
| C-43 | mappingsが生成位置のline→columnの昇順でソートされる | E-13 | ○ |
| C-44 | 同じ生成位置のマッピングがオリジナル位置で二次ソートされる | E-13 | ○ |
| C-45 | originalPositionがnullの場合のソート比較で0が使われる | E-25 | ○ |
| C-46 | DecodedSourceにurl, content, ignoreが正しく設定される | E-14 | ○ |
| C-47 | Source.fileがnullの場合にDecodedSource.urlがnullとなる | E-14 | ○ |
| C-48 | 全てのマッピングのnameがnullである | E-16 | ○ |
| C-49 | 返却されるDecodedSourceMapのfileがnullである | E-15 | ○ |
| C-50 | lineTablesがDefaultMapにより遅延生成・再利用される | E-07 | ○ |
| C-51 | srcがないノードはスキップされる | E-08 | ○ |
| C-52 | dstがないノードはスキップされる | E-08 | ○ |
| C-53 | originalSource.contentがnull(空文字列)の場合はスキップされる | E-09 | ○ |
| C-54 | @importで取り込んだ外部ファイルのソースマッピングが正しく生成される | E-06, E-23 | ○ |
| C-55 | ユーティリティクラスのマッピングが@tailwind utilitiesのソース位置を指す | E-06, E-23 | ○ |
| C-56 | @applyで展開されたプロパティのマッピングが@apply行を指す | E-06, E-23 | ○ |
| C-57 | 複数の@applyが正しくそれぞれの位置にマッピングされる | E-06, E-23 | ○ |
| C-58 | ライセンスコメント(/*!)のマッピングがソース位置を保持する | E-06, E-23 | ○ |
| C-59 | 改行を含むライセンスコメントで行ごとのマッピングが生成される | E-06, E-10, E-23 | ○ |
| C-60 | @pluginのaddBase由来のノードが@plugin宣言の位置を指す | E-06, E-23 | ○ |
| C-61 | @config経由のaddBase由来のノードが@config宣言の位置を指す | E-06, E-23 | ○ |
| C-62 | @utilityで定義したカスタムユーティリティのマッピングが正しく生成される | E-06, E-23 | ○ |
| C-63 | プラグインで追加されたユーティリティのsourcesが正しい | E-06, E-23 | ○ |
| C-64 | srcを持つノードからTranslation配列が返却される | E-17 | ○ |
| C-65 | 単一行コメントの位置が正しく変換される | E-17, E-24 | ○ |
| C-66 | 複数行コメントの位置が正しく変換される | E-17, E-24 | ○ |
| C-67 | 宣言ノード(通常プロパティ)の位置が正しく変換される | E-17, E-24 | ○ |
| C-68 | 複数行プロパティ値の宣言の位置が正しく変換される | E-17, E-24 | ○ |
| C-69 | カスタムプロパティ(単一行)の位置が正しく変換される | E-17, E-24 | ○ |
| C-70 | カスタムプロパティ(複数行)の位置が正しく変換される | E-17, E-24 | ○ |
| C-71 | ボディなしat-rule(単一行)の位置が正しく変換される | E-17, E-24 | ○ |
| C-72 | ボディなしat-rule(複数行)の位置が正しく変換される | E-17, E-24 | ○ |
| C-73 | ボディ付きat-rule(単一行)の位置が正しく変換される | E-17, E-24 | ○ |
| C-74 | ボディ付きat-rule(複数行)の位置が正しく変換される | E-17, E-24 | ○ |
| C-75 | スタイルルール(単一行)の位置が正しく変換される | E-17, E-24 | ○ |
| C-76 | スタイルルール(複数行セレクタ)の位置が正しく変換される | E-17, E-24 | ○ |
| C-77 | srcがないノードで空配列が返却される | E-18 | ○ |
| C-78 | dstがないノードでgenerated位置がnullとなる | E-19 | ○ |
| C-79 | 返却される関数がクロージャとしてlineTableを保持し再利用する | E-17 | △ |
| C-80 | Sourceインターフェースがfile(string|null)とcode(string)を持つ | **根拠なし** | △ |
| C-81 | Source.fileにnullを設定できる(出力ソースの場合) | **根拠なし** | △ |
| C-82 | SourceLocationがタプル[Source, start: number, end: number]である | **根拠なし** | △ |

## 4) 不足情報（Unknown / Missing）
- C-80, C-81, C-82：TypeScriptインターフェース/型エイリアスは実行時に消去されるため、ランタイムでの単体テストとしての妥当性が疑問。これらはコンパイル時の型チェックで保証されるべき内容であり、単体テストとしてはTypeScriptコンパイラの型チェック（`tsc --noEmit`）で代替するのが適切な可能性がある。
  - 候補：TypeScriptコンパイラによる型チェック / dtslint / tsd などの型テストツール
- C-79：クロージャによる内部状態保持の検証は、実装の内部詳細に依存するテストになりうる。外部から観測可能な動作（複数回呼び出しで同じ結果が得られること）でテストするのが望ましい。
  - 候補：パフォーマンステスト / 複数回呼び出しの一貫性テスト

## 5) リスクフラグ（レビュー観点）
- 0: 低リスク - line-table.tsのfind/findOffsetは純粋関数であり、テストケースが明確に定義可能。既存テスト(E-22)との整合性も高い
- 0: 低リスク - createTranslationMapのテストケースは入出力が明確。既存テスト(E-24)が10パターン以上の具体例を提供
- 1: 中リスク - createSourceMapはAST構造とwalk関数への依存があり、テストにはcompile関数経由の実際のAST構築が必要。既存テスト(E-23)がこのアプローチを採用
- 0: 低リスク - DefaultMapの遅延初期化動作は既存コードで広く使われており、単体での動作は確認済み
- 0: 低リスク - source.tsは型定義のみであり、ランタイムテストの対象として含めるかはプロジェクト方針次第。優先度は「低」に設定済み

## 6) レビュアーチェックリスト（最小）
- [ ] line-table.tsのfind関数の二分探索ロジックに対するテストケース(C-01~C-20)が十分な入力パターンを網羅しているか
- [ ] findOffset関数のクランプ処理（Math.min/Math.max/??）の境界値テスト(C-27~C-33)が適切か
- [ ] Positionのlineが1ベース、columnが0ベースであるという仕様がソースコードのコメント（"one-based"）と整合しているか確認
- [ ] createSourceMapのテストケース(C-36~C-63)において、AST構築方法（compile関数経由 vs モック）の方針を確認
- [ ] 複数行テキストの改行スキャン処理（split('\n') + trim）のエッジケース(C-38, C-39)が十分にカバーされているか
- [ ] createTranslationMapのテストケース(C-64~C-79)が既存テスト(E-24)のパターンと整合しているか
- [ ] C-80, C-81, C-82の型定義のみのインターフェース/型エイリアスに対するテストの必要性を判断
- [ ] createSourceMapのマッピングソート順序(C-43~C-45)がソースマップ仕様（ECMA-426）と整合しているか確認
