プロジェクト

全般

プロフィール

リファクタ #448

完了

JudgeManager.update() のモック境界導入と各パス回帰テスト

リファクタ #448: JudgeManager.update() のモック境界導入と各パス回帰テスト

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

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

100%

予定工数:

説明

Redmine #446 からの派生タスク(#446 で先送りした重い部分)。

背景

#174#446 と段階的に JudgeManager の純粋ロジックを挙動不変で切り出し、Manager 層のテストを拡充してきた。

  • #174: ComboState / JudgeLaneColor / JudgeRecentTimingBuffer を抽出。
  • #446: update() に重複していた LN/CN/HCN 分類述語を LongNoteType に、判定ウィンドウ線形走査を JudgeWindow に集約し、全組合せの単体テストを追加。

しかし update()(約430行)本体は依然 BMSPlayer / MainController / TimerManager / BMSPlayerInputProcessor / AudioDriver / GrooveGauge に深く結合しており、入力処理・LN/CN/HCN 状態機械・autoplay・見逃しPOOR の各パスを直接回帰テストできていない。

対応内容

  • 上記コラボレータにモック境界(seam)を導入する(インターフェース抽出、もしくは Mockito 等のモック機構の導入)。
  • update() の以下の各パスについて、挙動を変えずに回帰テストを追加する:
    • LN 押し / 離し
    • CN / HCN(HCN ゲージ増減・通過判定含む)
    • BSS(スクラッチ複合)
    • オートプレイ
    • 見逃しPOOR
  • 判定タイミング、ゲージ/スコア連携、タイマー連携に回帰がないことを担保する。

補足

本件はゲームプレイ中核(判定タイミングの厳密一致が必須)への改変であり、設計影響が広い。着手前にモック方式(インターフェース抽出 vs モックライブラリ導入)の設計方針を検討すること。#446 までで純粋ロジックの抽出と単体テスト化は完了済み。


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

関連している beatoraja - リファクタ #446: JudgeManager.update() の責務分解と Manager 本体のテスト化完了いづ さん2026/06/28

操作

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

  • 関連している リファクタ #446: JudgeManager.update() の責務分解と Manager 本体のテスト化 を追加

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

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

実装に着手しました。

  • ブランチ: feature/448
  • 対応方針: JudgeManager のコラボレータ(BMSPlayer/MainController/TimerManager/Input/AudioDriver/GrooveGauge 等)を JudgeContext シーム interface として抽出し、本番は BMSPlayer 委譲アダプタ・テストは fake を注入。update() の挙動を変えず LN押し/離し・CN/HCN・BSS・オートプレイ・見逃しPOOR の各パスへ直接回帰テストを追加する。

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

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

対応が完了しました。

概要

JudgeManager.update() が深く結合していたコラボレータ(BMSPlayer/MainController/TimerManager/Input/AudioDriver/GrooveGauge 等)を JudgeContext シーム interface として抽出し、update() の各パスを実 BMSPlayer 無しで直接回帰テストできるようにした。挙動は完全不変。

変更点

  • JudgeContext interface を新設し、init()/update()/updateMicro() のコラボレータ参照を集約。本番は BMSPlayerJudgeContext(BMSPlayer への1対1委譲)、テストは fake を注入。
  • JudgeManagermain.x/timer.x/input.x 等を context.x へ機械的に置換(参照経路の差し替えのみ・ロジック/順序/条件は不変)。テスト用 package-private コンストラクタ JudgeManager(JudgeContext) を追加。
  • fake コンテキスト(FakeJudgeContext/RecordingAudioDriver)と実 BMSModel/TimeLine/Note フィクスチャによる回帰テスト6本を追加(通常+見逃しPOOR / LN押し離し / CN / HCN(ゲージ増減・通過判定) / BSS / オートプレイ)。
  • 変更ファイル: src/bms/player/beatoraja/play/JudgeContext.java(新規) / BMSPlayerJudgeContext.java(新規) / JudgeManager.java(変更) / src/test/java/bms/player/beatoraja/play/{FakeJudgeContext,RecordingAudioDriver,JudgeManagerUpdateTest}.java(新規) 計6件。

テスト

  • .\gradlew.bat test : 成功(全件グリーン)。JudgeManagerUpdateTest は tests=6 / skipped=0 / failures=0 / errors=0。既存テストも回帰なし。

関連 MR

  • !126 (feature/448 → develop)

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