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:
parent
bb78de2b84
commit
cf7cc23f45
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user