| """Tests for the queued player-move turn hook. No GPU/Gradio. |
| |
| Run: python -m pytest tests/ -q |
| """ |
|
|
| import sys |
| from pathlib import Path |
|
|
| sys.path.insert(0, str(Path(__file__).resolve().parents[1])) |
|
|
| from ttw.dummy import make_random_policy |
| from ttw.game import Game |
|
|
|
|
| def _game(): |
| return Game(make_random_policy(seed=3), deck_seed=1) |
|
|
|
|
| def _total_pebbles(world): |
| return sum(c.pebbles for c in world.alive()) |
|
|
|
|
| def _player_moves(world): |
| return [e for e in world.log if e["type"] == "player_move"] |
|
|
|
|
| def test_queued_move_emits_event_and_clears_queue(): |
| g = _game() |
| g.queue_player_move("noop") |
| assert g.world.pending_moves |
| g.step() |
| moves = _player_moves(g.world) |
| assert len(moves) == 1 |
| assert moves[0]["move"] == "noop" |
| assert moves[0]["turn"] == 1 |
| assert g.world.pending_moves == [] |
|
|
|
|
| def test_step_without_queued_move_emits_no_player_move(): |
| """v1 regression guard: an empty queue must not produce a player_move event.""" |
| g = _game() |
| g.step() |
| assert _player_moves(g.world) == [] |
|
|
|
|
| def test_queued_noop_preserves_pebble_conservation(): |
| g = _game() |
| before = _total_pebbles(g.world) |
| g.queue_player_move("noop") |
| g.step() |
| assert _total_pebbles(g.world) == before |
|
|