CLAUDE: Fix runner_advancement for new GameState structure

Updated runner_advancement.py and its tests to use the new GameState
structure where current_batter is a LineupPlayerState object instead of
an integer ID.

Changes:
- runner_advancement.py: Replaced all 17 references to
  state.current_batter_lineup_id with state.current_batter.lineup_id

- tests/unit/core/test_runner_advancement.py: Updated test fixtures
  - Mock fixture: Added mock_batter object with lineup_id attribute
  - GameState constructor calls: Create LineupPlayerState objects instead
    of using current_batter_lineup_id parameter (9 tests fixed)

All 34 runner advancement tests now passing. This fixes the AttributeError
that was preventing X-Check resolution from completing in the terminal
client ("'GameState' object has no attribute 'current_batter_lineup_id'").

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Cal Corum 2025-11-04 16:03:46 -06:00
parent bb78de2b84
commit cf7cc23f45
2 changed files with 84 additions and 27 deletions

View File

@ -493,7 +493,7 @@ class RunnerAdvancement:
# Batter is out
movements.append(RunnerMovement(
lineup_id=state.current_batter_lineup_id,
lineup_id=state.current_batter.lineup_id,
from_base=0,
to_base=0,
is_out=True
@ -564,7 +564,7 @@ class RunnerAdvancement:
# Batter out at first
movements.append(RunnerMovement(
lineup_id=state.current_batter_lineup_id,
lineup_id=state.current_batter.lineup_id,
from_base=0,
to_base=0,
is_out=True
@ -575,7 +575,7 @@ class RunnerAdvancement:
else:
# Can't turn DP, just batter out
movements.append(RunnerMovement(
lineup_id=state.current_batter_lineup_id,
lineup_id=state.current_batter.lineup_id,
from_base=0,
to_base=0,
is_out=True
@ -622,7 +622,7 @@ class RunnerAdvancement:
# Batter is out
movements.append(RunnerMovement(
lineup_id=state.current_batter_lineup_id,
lineup_id=state.current_batter.lineup_id,
from_base=0,
to_base=0,
is_out=True
@ -682,7 +682,7 @@ class RunnerAdvancement:
# Batter safe at first
movements.append(RunnerMovement(
lineup_id=state.current_batter_lineup_id,
lineup_id=state.current_batter.lineup_id,
from_base=0,
to_base=1,
is_out=False
@ -752,7 +752,7 @@ class RunnerAdvancement:
# Batter is out
movements.append(RunnerMovement(
lineup_id=state.current_batter_lineup_id,
lineup_id=state.current_batter.lineup_id,
from_base=0,
to_base=0,
is_out=True
@ -826,7 +826,7 @@ class RunnerAdvancement:
# Batter is out
movements.append(RunnerMovement(
lineup_id=state.current_batter_lineup_id,
lineup_id=state.current_batter.lineup_id,
from_base=0,
to_base=0,
is_out=True
@ -891,7 +891,7 @@ class RunnerAdvancement:
# Batter out at first
movements.append(RunnerMovement(
lineup_id=state.current_batter_lineup_id,
lineup_id=state.current_batter.lineup_id,
from_base=0,
to_base=0,
is_out=True
@ -902,7 +902,7 @@ class RunnerAdvancement:
else:
# Can't turn DP, just batter out
movements.append(RunnerMovement(
lineup_id=state.current_batter_lineup_id,
lineup_id=state.current_batter.lineup_id,
from_base=0,
to_base=0,
is_out=True
@ -974,7 +974,7 @@ class RunnerAdvancement:
# Batter safe at first
movements.append(RunnerMovement(
lineup_id=state.current_batter_lineup_id,
lineup_id=state.current_batter.lineup_id,
from_base=0,
to_base=1,
is_out=False
@ -1037,7 +1037,7 @@ class RunnerAdvancement:
# TODO: This needs to be interactive in the game engine
movements.append(RunnerMovement(
lineup_id=state.current_batter_lineup_id,
lineup_id=state.current_batter.lineup_id,
from_base=0,
to_base=0,
is_out=True
@ -1120,7 +1120,7 @@ class RunnerAdvancement:
# Batter safe at first
movements.append(RunnerMovement(
lineup_id=state.current_batter_lineup_id,
lineup_id=state.current_batter.lineup_id,
from_base=0,
to_base=1,
is_out=False
@ -1130,7 +1130,7 @@ class RunnerAdvancement:
else:
# Can't turn DP
movements.append(RunnerMovement(
lineup_id=state.current_batter_lineup_id,
lineup_id=state.current_batter.lineup_id,
from_base=0,
to_base=0,
is_out=True
@ -1213,7 +1213,7 @@ class RunnerAdvancement:
# Batter is out
movements.append(RunnerMovement(
lineup_id=state.current_batter_lineup_id,
lineup_id=state.current_batter.lineup_id,
from_base=0,
to_base=0,
is_out=True
@ -1274,7 +1274,7 @@ class RunnerAdvancement:
# Batter is out
movements.append(RunnerMovement(
lineup_id=state.current_batter_lineup_id,
lineup_id=state.current_batter.lineup_id,
from_base=0,
to_base=0,
is_out=True
@ -1337,7 +1337,7 @@ class RunnerAdvancement:
# Batter is out
movements.append(RunnerMovement(
lineup_id=state.current_batter_lineup_id,
lineup_id=state.current_batter.lineup_id,
from_base=0,
to_base=0,
is_out=True
@ -1393,7 +1393,7 @@ class RunnerAdvancement:
# Batter is out
movements.append(RunnerMovement(
lineup_id=state.current_batter_lineup_id,
lineup_id=state.current_batter.lineup_id,
from_base=0,
to_base=0,
is_out=True

View File

@ -48,7 +48,10 @@ def base_state():
state = Mock(spec=GameState)
state.outs = 0
state.current_on_base_code = 0
state.current_batter_lineup_id = 1
# Mock current_batter with lineup_id
mock_batter = Mock()
mock_batter.lineup_id = 1
state.current_batter = mock_batter
state.on_first = None
state.on_second = None
state.on_third = None
@ -649,12 +652,18 @@ class TestXCheckPlaceholders:
from uuid import uuid4
# Create GameState (bases empty, 0 outs)
from app.models.game_models import LineupPlayerState
mock_batter = LineupPlayerState(lineup_id=1, card_id=100, position='CF', batting_order=1)
state = GameState(
game_id=uuid4(),
league_id='sba',
home_team_id=1,
away_team_id=2,
current_batter_lineup_id=1
current_batter=mock_batter
)
state.outs = 0
@ -685,12 +694,18 @@ class TestXCheckPlaceholders:
from uuid import uuid4
# Create GameState (not used for error case, but required by signature)
from app.models.game_models import LineupPlayerState
mock_batter = LineupPlayerState(lineup_id=1, card_id=100, position='CF', batting_order=1)
state = GameState(
game_id=uuid4(),
league_id='sba',
home_team_id=1,
away_team_id=2,
current_batter_lineup_id=1
current_batter=mock_batter
)
defensive_decision = DefensiveDecision(
@ -721,12 +736,18 @@ class TestXCheckPlaceholders:
from uuid import uuid4
# Create GameState (not used for error case, but required by signature)
from app.models.game_models import LineupPlayerState
mock_batter = LineupPlayerState(lineup_id=1, card_id=100, position='CF', batting_order=1)
state = GameState(
game_id=uuid4(),
league_id='sba',
home_team_id=1,
away_team_id=2,
current_batter_lineup_id=1
current_batter=mock_batter
)
defensive_decision = DefensiveDecision(
@ -757,12 +778,18 @@ class TestXCheckPlaceholders:
from uuid import uuid4
# Create GameState (bases empty, 0 outs)
from app.models.game_models import LineupPlayerState
mock_batter = LineupPlayerState(lineup_id=1, card_id=100, position='CF', batting_order=1)
state = GameState(
game_id=uuid4(),
league_id='sba',
home_team_id=1,
away_team_id=2,
current_batter_lineup_id=1
current_batter=mock_batter
)
state.outs = 0
@ -785,12 +812,18 @@ class TestXCheckPlaceholders:
from uuid import uuid4
# Create GameState (not used for error case, but required by signature)
from app.models.game_models import LineupPlayerState
mock_batter = LineupPlayerState(lineup_id=1, card_id=100, position='CF', batting_order=1)
state = GameState(
game_id=uuid4(),
league_id='sba',
home_team_id=1,
away_team_id=2,
current_batter_lineup_id=1
current_batter=mock_batter
)
result = x_check_f2(
@ -812,12 +845,18 @@ class TestXCheckPlaceholders:
from uuid import uuid4
# Create GameState (not used for error case, but required by signature)
from app.models.game_models import LineupPlayerState
mock_batter = LineupPlayerState(lineup_id=1, card_id=100, position='CF', batting_order=1)
state = GameState(
game_id=uuid4(),
league_id='sba',
home_team_id=1,
away_team_id=2,
current_batter_lineup_id=1
current_batter=mock_batter
)
result = x_check_f3(
@ -839,12 +878,18 @@ class TestXCheckPlaceholders:
from uuid import uuid4
# Create GameState
from app.models.game_models import LineupPlayerState
mock_batter = LineupPlayerState(lineup_id=1, card_id=100, position='CF', batting_order=1)
state = GameState(
game_id=uuid4(),
league_id='sba',
home_team_id=1,
away_team_id=2,
current_batter_lineup_id=1
current_batter=mock_batter
)
state.outs = 0
@ -883,12 +928,18 @@ class TestXCheckPlaceholders:
from uuid import uuid4
# Create GameState
from app.models.game_models import LineupPlayerState
mock_batter = LineupPlayerState(lineup_id=1, card_id=100, position='CF', batting_order=1)
state = GameState(
game_id=uuid4(),
league_id='sba',
home_team_id=1,
away_team_id=2,
current_batter_lineup_id=1
current_batter=mock_batter
)
state.outs = 0
@ -915,12 +966,18 @@ class TestXCheckPlaceholders:
from uuid import uuid4
# Create GameState
from app.models.game_models import LineupPlayerState
mock_batter = LineupPlayerState(lineup_id=1, card_id=100, position='CF', batting_order=1)
state = GameState(
game_id=uuid4(),
league_id='sba',
home_team_id=1,
away_team_id=2,
current_batter_lineup_id=1
current_batter=mock_batter
)
state.outs = 0