プロジェクト

全般

プロフィール

リファクタ #455

完了

skin property: 分割前の先行互換テストを整備する(Phase 0)

リファクタ #455: skin property: 分割前の先行互換テストを整備する(Phase 0)

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

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

100%

予定工数:

説明

#176 の整理方針に基づく Phase 0。責務分割・共通化の前に、現状の振る舞いをロックする互換テストを先に追加する。後続リファクタ(Phase 1〜3)の安全網となる。

背景

既存の SkinPropertyFactoryRegistryTest は enum 登録(ValueType / FloatType / RateType / StringType / IndexType / BooleanType / EventType)の id・name 解決を網羅しているが、以下は未カバーの seam:

  • IntegerPropertyFactory#getIntegerProperty0 / BooleanPropertyFactory#getBooleanProperty0 の巨大 switch フォールバックの各 case。
  • 算術範囲ハンドラ(judge / key / player offset、NUMBER_PERFECT2〜、NUMBER_RELEASE_SPEED_KEY* 等の if (optionid >= X && optionid <= Y) ブロック)の解決と値。
  • SkinPropertyMapper の id 算術ヘルパ。

対応内容

  • switch 経路の網羅: getIntegerProperty0 / getBooleanProperty0(および String / Float のフォールバック)の全 case が id から non-null 解決されることを検証するテストを追加。
  • 算術範囲の検証: judge/key/player offset 系の代表的な id が解決され、期待値を返すことを検証。
  • SkinPropertyMapper の round-trip テスト: keyJudgeValueIdgetKeyJudgeValuePlayer / getKeyJudgeValueOffsetbombTimerId / holdTimerId の境界、isCustomTimerId / isCustomEventId の範囲、getSkinSelectTypeskinSelectTypeId の round-trip。
  • ゴールデン契約テスト: 同梱の skin/default 配下の JSON スキン(追跡済 27 ファイル)を読み、参照される全 property name / id が non-null 解決されることを assert。誤削除・誤リネームを検出できる。

確認観点

  • このチケットはテスト追加のみで本体コードは変えない(現状振る舞いのロックが目的)。
  • JSON / LR2 / Lua の互換を崩さないことをテストで表現する。

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

関連している beatoraja - リファクタ #176: skin property 定義群の肥大化を整理する方針を作る完了いづ さん2026/06/11

操作
次のチケットに先行 beatoraja - リファクタ #454: skin property: id→property の二重経路(switch vs enum)を単一化する(Phase 1)完了いづ さん2026/06/292026/06/29

操作

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

  • 関連している リファクタ #176: skin property 定義群の肥大化を整理する方針を作る を追加

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

  • 次のチケットに先行 リファクタ #454: skin property: id→property の二重経路(switch vs enum)を単一化する(Phase 1) を追加

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

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

実装に着手しました。

  • ブランチ: feature/455
  • 対応方針: Phase 0 の互換テストを追加。getIntegerProperty0/getBooleanProperty0 の switch 全 case の id 解決、judge/key/release-speed 等の算術範囲の解決と期待値、SkinPropertyMapper の id 算術 round-trip、同梱 skin/default JSON スキンのプロパティ参照が全て non-null 解決されるゴールデン契約テストを整備する(本体コードは変更しない)。

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

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

対応が完了しました。

概要

skin property 定義群の責務分割リファクタ(#176 Phase 1〜3)の前に、現状の振る舞いをロックする互換テストを整備した Phase 0。誤削除・誤リネームを検出する安全網を追加。テスト追加のみで本体コード(production)は無改変。

変更点

  • SkinPropertyFallbackResolutionTest: getIntegerProperty0 / getBooleanProperty0 の全 switch case(および OPTION_COURSE_STAGE 範囲)が id から non-null 解決されることを検証(負 id 反転含む)。
  • SkinPropertyArithmeticRangeTest: judge / rival / release-speed 等7つの算術範囲の全 id 解決+ ScoreData ベースの MainState による期待値検証。
  • SkinPropertyMapperTest: keyJudgeValueId / timer-id 6種 / skinSelectType の round-trip、isCustomTimerId / isCustomEventId の境界。
  • DefaultSkinPropertyContractTest: 追跡済み13個の skin/default JSON スキンのゴールデン契約テスト。value / floatvalue / text の ref と destination の op が全て factory 経由で non-null 解決されることを検証。ローダーの解決経路(JsonSkinSerializer 再利用・lua 非依存)に忠実。STRING_SEARCHWORD sentinel と未宣言カスタムオプション(900-999)は設計上 null が正しいため除外。
  • 追加ファイル: src/test/java/bms/player/beatoraja/skin/property/ 配下の上記4クラス(計508行、227テスト)。

テスト

  • .\gradlew.bat test : 成功(全スイート green)。新規4クラス計227テスト、failures=0。

関連 MR

  • !128 (feature/455 → develop)

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