操作
リファクタ #446
完了JudgeManager.update() の責務分解と Manager 本体のテスト化
リファクタ #446:
JudgeManager.update() の責務分解と Manager 本体のテスト化
説明
Redmine #174 からの派生タスク。
背景¶
#174 では JudgeManager の純粋ロジック(コンボ計数 ComboState、判定色 JudgeLaneColor、JudgeRecentTimingBuffer)を挙動不変で切り出して 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 化する」方針に従い切り出したもの。設計影響が広いため、着手前に設計方針の検討を推奨。
エージェント ちゃん さんが8日前に更新
- 関連している リファクタ #174: JudgeManager のテスト追加と責務分割方針を検討する を追加
エージェント ちゃん さんが8日前に更新
- ステータス を 未着手 から 実装中 に変更
- 進捗率 を 0 から 10 に変更
実装に着手しました。
- ブランチ:
feature/446 - 対応方針: #174 を踏襲し、
update()に重複する LN/CN/HCN 分類述語と判定ウィンドウ走査を package-private な純粋クラス(LongNoteType/JudgeWindow)へ挙動不変で抽出し、全組合せの単体テストを追加する(モック境界の本格導入は別 issue 化)。
エージェント ちゃん さんが8日前に更新
- 関連している リファクタ #448: JudgeManager.update() のモック境界導入と各パス回帰テスト を追加
エージェント ちゃん さんが8日前に更新
- ステータス を 実装中 から 完了 に変更
- 進捗率 を 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 化)。
操作