Range#sole に無限末端範囲のテストを追加

rails/rails

Range#sole が無限範囲で例外を投げることを保証するテストが、末端が nil のケース (1..) でも網羅されました。これにより、実装の guard が両方向の無限範囲を正しく検知することが CI で確認できるようになります。

背景

Range#sole は無限範囲に対して Enumerable::SoleItemExpectedError を raise する設計です。既存テストは begin が nil のケース ((..1).sole) のみを検証しており、guard が self.begin.nil? || self.end.nil? の両方を網羅しているか確認できていませんでした。したがって、end が nil の endless range (1..) に対しても同様の例外が発生することを明示的にテストする必要がありました。

今回の PR はテストコードに無限末端ケースを追加するだけで、実装本体には一切変更を加えていません。既存の guard が期待通り機能することを検証し、将来的な実装変更が guard のロジックを破壊しないことを CI が保証できるようにしました。

技術的な変更

activesupport/test/core_ext/range_ext_test.rbtest_sole メソッドに 4 行の追加が行われました。新たに assert_raises(1..).sole を呼び出し、メッセージ "infinite range '1..' cannot represent a sole item" を期待する形で記述されています。これにより、begin が nil だけでなく end が nil の無限範囲でも SoleItemExpectedError が発生することが自動テストで確認できるようになりました。

@@ -298,5 +298,9 @@ def test_sole
     assert_raises(Enumerable::SoleItemExpectedError, match: "infinite range '..1' cannot represent a sole item") do
       (..1).sole
     end
+
+    assert_raises(Enumerable::SoleItemExpectedError, match: "infinite range '1..' cannot represent a sole item") do
+      (1..).sole
+    end
   end
 end

設計判断

Range#sole の実装は self.begin.nil? || self.end.nil? という単一の guard で無限範囲を検知し、Enumerable::SoleItemExpectedError を raise しています。テストが beginless のみだったことは、guard の網羅性を十分に検証できないリスクを残していました。今回のテスト追加は実装を変更せず guard の全パスを確認するだけの最小限の改修であり、後方互換性に影響を与えない設計判断と評価できます。

まとめ

無限範囲の両端ケースに対するテストが揃ったことで、Range#sole の例外挙動が完全に保証されます。テストだけの変更であるため、プロダクションコードへの影響はなく、既存利用者へのリスクはゼロです。今後の変更が guard ロジックを破壊しないか CI が自動的に検出できるようになりました。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
af818849

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文、背景、技術的変更、設計判断(任意)、まとめが明確に配置され、総論→各論→結論の構成が保たれています。

カスタムMarkdown構文 ⚠ WARNING

シンタックスハイライト・GitHubリンク記法の正確性

コードブロックのファイル名付きシンタックスハイライトは正しい形式ですが、PRリンクの記法が `[PR #57548](URL)` となっており、仕様では `[ #57548 ](URL)` が推奨されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

対象はRuby/Railsエンジニア向けで、専門的な用語以外の余計な説明はありません。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションは総論・各論・結論の段落構成になり、トピックセンテンスが先頭にあり、1段落1トピックで長さも適切です。空行で区切られています。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事中のコードブロックは提供されたDiffと完全に一致し、ファイル名・行内容とも合致しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

使用されている技術用語(guard、Enumerable::SoleItemExpectedError、endless range など)はPRで用いられている表現と一致しています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

記事の技術的主張はPRの説明とDiffの内容に基づいており、誤りや根拠のない記述はありません。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

全ての事実はPRタイトル、Description、Diffで裏付けられ、ハルシネーションは見られません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号 #57548 が正しく記載されており、他の数値や固有名詞の誤りはありません。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事タイトルはPRタイトル "Test Range#sole with an endless range" の意味を日本語で正確に表現しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

Railsのバージョンやリリース情報など、PRに記載されていない外部知識は含まれていません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

時間表現の歪曲はなく、PRの記述と一致しています。