File size: 1,497 Bytes
426093b
 
14842f9
 
 
93cd78f
 
14842f9
 
 
 
 
 
93cd78f
14842f9
 
 
 
 
 
93cd78f
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from proteus.game.engine.difficulty import Difficulty
from proteus.game.metrics.rollout import RolloutResult, optimal_rollout


def test_optimal_rollout_is_deterministic():
    a = optimal_rollout("template", seed=42, difficulty=Difficulty.EASY, n_turns=5)
    b = optimal_rollout("template", seed=42, difficulty=Difficulty.EASY, n_turns=5)
    assert isinstance(a, RolloutResult)
    assert a.focal_positions == b.focal_positions
    assert a.final_safety_distance == b.final_safety_distance


def test_optimal_rollout_length_capped_by_n_turns():
    r = optimal_rollout("template", seed=42, difficulty=Difficulty.EASY, n_turns=3)
    assert len(r.focal_positions) <= 3
    # Each recorded position is the PRE-move focal cell for that optimal turn.
    assert all(isinstance(p, tuple) and len(p) == 2 for p in r.focal_positions)


def test_optimal_rollout_first_position_is_handover():
    # The first optimal pre-move position equals the focal's spawn cell (template
    # has no Cut pre-roll, so the handover IS the spawn). Self-derived, not hardcoded.
    import random
    from proteus.game.engine.grid import MotiveGridGame
    from proteus.game.scenarios.base import get_scenario

    scenario = get_scenario("template")()
    game = MotiveGridGame(scenario, random.Random(42), Difficulty.EASY, max_steps=10)
    spawn = (game.focal_sprite.x, game.focal_sprite.y)

    r = optimal_rollout("template", seed=42, difficulty=Difficulty.EASY, n_turns=5)
    assert r.focal_positions[0] == spawn