test: strengthen existing rule regression coverage (#8) - #21
Conversation
Issue #8 に対応し、既存 RT/LVP/FIF Analyzer の現在の挙動を v1.0 まで 壊さないための回帰テストを体系化する。テスト数 56 -> 101。 追加: DiagnosticContractTests.cs (33 tests) docs/DIAGNOSTICS.md の SSOT を機械的に固定する。 - 全 7 Diagnostic の ID / category / default severity / 既定有効を検証 - SupportedDiagnostics が公開契約と厳密に一致することを検証 (追加・削除の双方を検出する。新規 Diagnostic は SSOT とこのリストを 同時に更新しなければ通らない) - ID 命名規則 (PREFIX + 4桁) を検証 - category 方針 (Naming は既定 Error にしない) を検証 - 文書化済み category 以外を使っていないことを検証 - 各 descriptor の title / message / description が解決可能かつ非空で あることを検証 - title / description が Diagnostic 間で共有されていないことを検証 message 文言そのものは公開契約対象外のため値は固定していない。代わりに 「descriptor が自分自身の ID の resource key を参照していること」を 検証している。 追加: RegressionBoundaryTests.cs (11 tests) 既存テストが扱っていなかった境界を固定する。 - RT0001: instance field は対象外 - RT0001: 同一フィールドアクセスが重複報告されないことを件数で固定 - RT0002: string / Convert など既知純粋型の呼び出しは許可 - RT0002: user type の instance method 呼び出しは検出 - RT0002: [PureMethod] のないメソッドは解析対象外 - RT0003: 呼び出しではなく property 参照経路 (Console.Out) を固定 - LVP0001: var 宣言 / nested block / 二重アンダースコア - LVP0001: 読み取りのみは検出しない 追加: AnalyzerProbe.cs Analyzer を直接実行して報告 Diagnostic をそのまま取得するヘルパー。 Microsoft.CodeAnalysis.Testing の markup 形式では重複報告の有無を 表現しづらいため、件数と位置を直接検証したい境界テストで使用する。 Issue #8 スコープの「Analyzer Test 共通パターンの整理」に該当する。 実装調査で判明した現在の挙動 (テストで固定済み): [PureMethod] メソッド内のローカル関数について、本体は外側メソッドとして 解析されるため static mutable field アクセスに RT0001 が報告される。 一方でローカル関数自体は [PureMethod] を持たないため、その呼び出しは RT0002 (非純粋メソッド呼び出し) になる。この扱いが妥当かどうかは Issue #10 (pure method contract / interprocedural analysis) の検討対象で あり、本 Issue では挙動の変更を行わず現状を固定するに留めた。 Issue #7 への依存 (実測で確認): DiagnosticContractTests の Descriptor_DescriptionsAreNotSharedBetweenDiagnostics は、Issue #7 の LVP0003 descriptor 修正がない状態では "LVP0003, FIF0001" として失敗することを実測で確認した。 したがって本 PR は Issue #7 の後に merge する必要がある。 検証結果: - dotnet build: PASS (0 error) - dotnet test --no-build: PASS (101/101、baseline 56 から +45) - git diff --check: PASS Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XB2mDSE67ZDQS9mk5KfAdZ
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Team Run ID: 📒 Files selected for processing (3)
Included review availability: Your plan provides up to 8 included reviews per hour; 3 remain after this review. 📝 WalkthroughWalkthroughThe test project adds a Roslyn analyzer execution helper, a diagnostic contract suite, and regression tests for RT0001–RT0003 and LVP0001 boundary behavior. ChangesAnalyzer testing
Estimated code review effort: 3 (Moderate) | ~20 minutes Merge Risk: ⚪ Minimal · up to This adds analyzer contract and boundary regression coverage without changing analyzer production behavior. The expanded test suite is reported passing, with no current merge-blocking risk identified. 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Comment |
PR #20 (Issue #7) が main にマージされたため、PR #21 のスタック元 feature/issue-7-diagnostic-ssot は不要になった。PR #21 を main 直接の PR に付け替えるにあたり、ブランチ内容を現在の main 基準に更新する。 方式として rebase ではなく merge を選択した理由: - merge-skill SKILL.md の固定安全ポリシーが force push を禁じており、 rebase は履歴書き換えのため force push が必須になる - PR #22 が本ブランチを base にスタックしているため、force push は #22 の merge-base を破壊し diff ノイズを生む - merge であれば fast-forward push で済み、#22 の diff は #9 変更のみの ままクリーンに保たれる - 履歴とトレーサビリティが完全に保存される 取り込んだ main の変更: - 285f852 Merge pull request #20 (Issue #7 diagnostic SSOT) - 44bc400 docs: READMEのDiagnostic titleを実装の値に一致させる Issue #8 の変更範囲 (test-only) には影響しない。main...HEAD の 三点diff は Issue #8 のテスト3ファイルのみである。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HbycDX129cVZTorjE2s4W9
|
@coderabbitai review |
✅ Action performedReview finished.
|
Issue #8: Strengthen existing rule regression coverage
Refs #8
既存 RT/LVP/FIF Analyzer の現在の挙動を v1.0 まで壊さないための回帰テストを体系化します。テスト数 56 → 101。
Changes
DiagnosticContractTests.cs(33 tests)docs/DIAGNOSTICS.mdの SSOT を機械的に固定します。SupportedDiagnosticsが公開契約と厳密に一致することを検証(追加・削除の双方を検出。新規 Diagnostic は SSOT とこのリストを同時に更新しないと通りません)PREFIX+ 4桁)を検証Namingは既定 Error にしない)を検証message 文言そのものは公開契約対象外のため値は固定していません。代わりに「descriptor が自分自身の ID の resource key を参照していること」を検証します。
RegressionBoundaryTests.cs(11 tests)既存テストが扱っていなかった境界を固定します。
string・Convertなど既知純粋型は許可 / user type の instance method は検出 /[PureMethod]なしは解析対象外Console.Out)を固定var宣言 / nested block / 二重アンダースコア / 読み取りのみは検出しないAnalyzerProbe.csAnalyzer を直接実行して報告 Diagnostic をそのまま取得するヘルパー。
Microsoft.CodeAnalysis.Testingの markup 形式では重複報告の有無を表現しづらいため、件数と位置を直接検証したい境界テストで使用します。Issue #8 スコープの「Analyzer Test 共通パターンの整理」に該当します。実装調査で判明した現在の挙動(テストで固定済み)
[PureMethod]メソッド内のローカル関数について:[PureMethod]を持たないため、その呼び出しは RT0002(非純粋メソッド呼び出し)になるこの扱いが妥当かどうかは Issue #10(pure method contract / interprocedural analysis)の検討対象です。本 PR では挙動を変更せず、現状を固定するに留めています。
Issue #7 への依存(実測で確認)
Descriptor_DescriptionsAreNotSharedBetweenDiagnosticsは、Issue #7 の LVP0003 descriptor 修正がない状態で実行するととして実際に失敗することを実測で確認しました。推測ではなく CONFIRMED な依存です。
Merge order: PR #20(#7)→ この PR。
Verification
git diff --check: PASSIssue #8 完了条件
Merge boundary
技術検証を通過しても MERGE CANDIDATE にとどまります。merge には Merge Skill による検証と、この PR / HEAD に対する新しい明示的 human approval が必要です。
🤖 Generated with Claude Code
Summary by CodeRabbit