プロジェクト

全般

プロフィール

リファクタ #446

完了

JudgeManager.update() の責務分解と Manager 本体のテスト化

リファクタ #446: JudgeManager.update() の責務分解と Manager 本体のテスト化

エージェント ちゃん さんが8日前に追加. 8日前に更新.

ステータス:
完了
優先度:
通常
担当者:
対象バージョン:
開始日:
2026/06/28
期日:
進捗率:

100%

予定工数:

説明

Redmine #174 からの派生タスク。

背景

#174 では JudgeManager の純粋ロジック(コンボ計数 ComboState、判定色 JudgeLaneColorJudgeRecentTimingBuffer)を挙動不変で切り出して Manager 層の回帰テストを追加したが、中核の JudgeManager.update() 本体(約 430 行)は BMSPlayer / MainController / TimerManager / BMSPlayerInputProcessor / AudioDriver / GrooveGauge に深く結合しており、本体を直接テストできていない。

対応内容

  • update() の入力処理・LN/CN/HCN 状態機械・autoplay 処理・見逃しPOOR判定を、挙動を変えずにテスト可能な単位へ分解する。
  • BMSPlayer / MainController / TimerManager / AudioDriver / GrooveGauge にモック境界(seam)を導入し、LN 押し・離し、CN/HCN、BSS、オートプレイ、見逃しPOOR の各パスの回帰テストを追加する。
  • 判定タイミング、ゲージ/スコア連携、タイマー連携に回帰がないことを担保する。

補足

本件は #174 で「大規模な設計変更が必要な場合は別 issue 化する」方針に従い切り出したもの。設計影響が広いため、着手前に設計方針の検討を推奨。


関連するチケット 2 (0件未完了2件完了)

関連している beatoraja - リファクタ #174: JudgeManager のテスト追加と責務分割方針を検討する完了いづ さん2026/06/11

操作
関連している beatoraja - リファクタ #448: JudgeManager.update() のモック境界導入と各パス回帰テスト完了いづ さん2026/06/28

操作

エージェント ちゃん さんが8日前に更新 操作 #1

  • 関連している リファクタ #174: JudgeManager のテスト追加と責務分割方針を検討する を追加

いづ さん さんが8日前に更新 操作 #2

  • 対象バージョン1.3.1 にセット

エージェント ちゃん さんが8日前に更新 操作 #3

  • ステータス未着手 から 実装中 に変更
  • 進捗率0 から 10 に変更

実装に着手しました。

  • ブランチ: feature/446
  • 対応方針: #174 を踏襲し、update() に重複する LN/CN/HCN 分類述語と判定ウィンドウ走査を package-private な純粋クラス(LongNoteType / JudgeWindow)へ挙動不変で抽出し、全組合せの単体テストを追加する(モック境界の本格導入は別 issue 化)。

エージェント ちゃん さんが8日前に更新 操作 #4

  • 関連している リファクタ #448: JudgeManager.update() のモック境界導入と各パス回帰テスト を追加

エージェント ちゃん さんが8日前に更新 操作 #5

  • ステータス実装中 から 完了 に変更
  • 進捗率10 から 100 に変更

対応が完了しました。

概要

#174 に続く挙動不変リファクタ。JudgeManager.update()(約430行)に重複していた純粋ロジックを package-private クラスへ集約し、全組合せの単体テストを追加。中核の判定タイミングは厳密一致を保持。

変更点

  • LongNoteType を新設:LN/CN/HCN 分類述語を isLongNote / isChargeNote / isHellChargeNote(int 引数の純粋 static メソッド)に集約。
  • JudgeWindow を新設:判定ウィンドウ線形走査を indexOf(mjudge, dmtime)(無一致時 length)に抽出。
  • JudgeManager.update()11箇所(HCN×1・LN×4・CN×5・indexOf×2)をヘルパー呼び出しに置換。付随条件と複雑なノーツ選定走査は無変更。挙動変化なし。
  • 変更ファイル: LongNoteType.java / JudgeWindow.java(新規)、JudgeManager.java(置換)、LongNoteTypeTest.java / JudgeWindowTest.java(新規テスト)の計 5 件。

テスト

  • .\gradlew.bat test(LongNoteTypeTest / JudgeWindowTest): 成功(10件=4+6、スキップ0・失敗0)
  • .\gradlew.bat compileTestJava: 成功

関連 MR

  • !125 (feature/446 → develop)

フォロー

  • #448 を作成(update() コラボレータへのモック境界導入⊕各パス直接回帰テストは重いため別 issue 化)。

他の形式にエクスポート: PDF Atom