Skip to content

test: フィクスチャの断片化を解消し、ファイル分割の単位を規約化する - #17

Merged
k163377 merged 9 commits into
mainfrom
refactor/fixture-consolidation
Aug 1, 2026
Merged

test: フィクスチャの断片化を解消し、ファイル分割の単位を規約化する#17
k163377 merged 9 commits into
mainfrom
refactor/fixture-consolidation

Conversation

@k163377

@k163377 k163377 commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

目的

テストフィクスチャが 1 宣言 1 ファイルで細かく分割され、package 行と import を除くと実質 2〜4 行のファイルが大半になっていた。原因は「クラスは 1 ファイルにつき 1 つまで」の規約であるため、規約を緩和したうえでフィクスチャを再編する。

規約変更

同一の sealed 階層を構成するクラス群は 1 ファイルへまとめてよいものとする(CLAUDE.md)。末端・中間の他、末端の吸収サブタイプや kind の親クラスも同階層の構成要素として扱う。

成果

対象 before after
producer-jvm src/main fixtures 103 41
mpp-producer *Main 34 20
gradle-integration TestKit resources 370 180
 うち diag-fail 148 35
 うち diag-ok 86 25
合計 512 246

maven-integration は既に 1 階層 1 ファイルで断片化しておらず対象外とした。

分割の単位

  • 階層フィクスチャ: 1 ファイル = 1 階層。ファイル名は基底名
  • 診断フィクスチャ: 1 ファイル = 1 診断ケース。ファイル名は診断名

宣言のネスト位置は変更していない。entries の整列キーは末端の FQN であり、ネストを動かすと期待値が変わるためである。

分離を維持した箇所

統合すると検証が成立しなくなる配置は分離を保ち、理由をファイル先頭コメントに明記した。

条件
private トップレベル=ファイルスコープの壁 VisRootFarLeaves / KaWalledLeaves / ScopePrivUse / Lc4Priv
K7「別ファイル配置」自体が次元値 order.flatFlatRootLeaves
import 別名 / star import の解決文脈 scope.target の競合 3 形・NmAlImported / NmStarNoc / NmFarNoc
typealias の解決順(ファイル名順) TypealiasAliasesTypealiasMatch より前
ファイル単位の非発火アサート diag-mpp 全体・Mc1Si(ES 非発火)
IC のファイル粒度編集 ic-* / determinism / abi-propagation
runMainmainClass がファイル名由来 各 probe フィクスチャの Main.kt

テスト側の変更

DiagSingleFailTest / DiagSingleOkTest / ProbeGateTest / TypealiasGateTestfile:line 照合を再編後の実測値へ書き換えた。同一ファイルへ複数宣言が同居するケースでは、言語診断も宣言単位の分解能を保つためファイル内断片照合から行照合へ変更している。

途中で踏んだ既知の制限

NmThSi : NmThAlias(生成型への頭別名)は別名が基底より先に解決される配置が成立条件であり、その順序はファイル名順である。統合時に TypealiasMatchAliases.kt と命名したところ TypealiasMatch.kt が先に処理され、修正方針案 #17 のバックエンド ICE(Exception during IR fake override builder)が再現した。TypealiasAliases.kt へ改名して解消し、順序が成立条件であることをファイル先頭コメントへ明記した。

検証

  • integration-test:build(全モジュール・ktfmtCheck 含む): BUILD SUCCESSFUL
  • TestKit: 18 クラス / 142 テスト / 失敗 0 / skip 1(既存の @Disabled
  • maven-integration: 5 テスト PASSED

資料

docs/test/フィクスチャ構成.md §5 の「1 ファイル 1 クラス規約の適用外」という記述を、分割単位と分離が検証の成立条件となる条件の表へ差し替えた。

🤖 Generated with Claude Code

k163377 and others added 9 commits August 2, 2026 00:21
1ファイル1クラス規約により、階層の基底・末端・その周辺宣言が
数行のファイルへ細かく分割されていた。同一 sealed 階層を構成する
クラス群に限り1ファイルへまとめてよいものとする。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
基底・末端・吸収サブタイプ・kind の親クラスを基底名のファイルへ集約する
(103 -> 41 ファイル)。宣言のネスト位置は変えない。entries の整列キーは
末端の FQN であり、ネストを動かすと期待値が変わるためである。

分離を保つのは検証の成立条件となる配置のみとする。
- private トップレベルの壁: vis.pub の VisRootFarLeaves
- K7 の別ファイル配置: order.flat の FlatRootLeaves
- import 集合が解決文脈となる: scope.target の競合 3 形

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
kindaccessor / order / tostring / wider を基底名のファイルへ集約する
(34 -> 20 ファイル)。

参照不能 kind のうちトップレベル壁を作る 2 形(private トップレベル末端・
private 外側クラスの末端)は基底と別ファイルであることが壁の成立条件のため、
KaWalledLeaves へ分離して理由を明記する。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
sweep-* / probe-* / binary-swap の基底と末端・利用点を 1 ファイルへ集約し、
参照するテストのファイル名・行番号を実測値へ合わせる。

ファイル粒度が検証対象となる箇所は分離を保つ。
- runMain の mainClass はファイル名由来のため Main.kt は分離する
- probe-annotation-alias はテストが別名ファイルを削除するため分離する
- ic-* / determinism / abi-propagation はテストがファイル単位で編集するため対象外

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 宣言 1 ファイルだった構成を 1 ファイル = 1 診断ケースへ集約する
(148 -> 35 ファイル)。ファイル名は診断名とし、DiagSingleFailTest の
file:line 照合は再編後の実測値へ書き換える。

同一ファイルへ複数宣言が同居するケースでは、言語診断も宣言単位の
分解能を保つためファイル内断片照合から行照合へ変更する。

分離を保つのは検証の成立条件となる配置のみとする。
- ScopePriv / ScopePrivUse: private トップレベルはファイルスコープ
- Lc4Priv: 参照不能末端であることが別ファイル配置に依る
- Mc1Si: ES 非発火をファイル単位で観測する

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 宣言 1 ファイルだった構成を 1 ファイル = 1 診断ケースへ集約する
(86 -> 25 ファイル)。DiagSingleOkTest の参照ファイル名と ES 警告の
行照合は再編後の実測値へ書き換える。

生成型への頭別名(NmThSi : NmThAlias)は別名が基底より先に解決される
配置が成立条件であり、その順序はファイル名順である。別名ファイルは
TypealiasAliases として基底の TypealiasMatch より前へ置く。

分離を保つのは検証の成立条件となる配置のみとする。
- NmVis3Mid: private トップレベル中間は基底と別ファイル
- NmAlImported / NmStarNoc / NmFarNoc: import 集合が解決文脈
- NmTlSame: 同一ファイル別名の raw 追跡

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Cross2 が両末端を実装する 2 階層は同一ケースの構成要素のため XfamSi へ集約する。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
「1 ファイル 1 クラス規約の適用外」という記述を、分割単位(階層フィクスチャ =
1 階層・診断フィクスチャ = 1 診断ケース)と、分離が検証の成立条件となる条件の
表へ差し替える。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 ケースが複数ファイルになる箇所をパッケージで括り、ルートパッケージには
1 ファイル = 1 ケースのものだけを残す。sealed 階層は同一パッケージを要求するため
階層ごと丸ごと移す。

- diag-fail: visibilityscope(DIA-28)・labelclash(DIA-34/35)・memberconflict(DIA-40〜43)
- diag-ok: rawtracking(DIA-31/32)・typealiasmatch(DIA-52)・visibility(DIA-26)

「別パッケージであること」自体が次元値の far はケースのパッケージ配下へ入れ子にする。
ファイル名は変えないため診断の file:line 照合に変更はない。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@k163377
k163377 merged commit 272ac0d into main Aug 1, 2026
9 checks passed
@k163377
k163377 deleted the refactor/fixture-consolidation branch August 1, 2026 16:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant