File size: 2,669 Bytes
6a4d305
 
 
426093b
6a4d305
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6c48e8f
 
 
 
 
6a4d305
 
09f65bb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
426093b
09f65bb
d4716c0
09f65bb
 
 
 
 
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
"""Pure reconstruction of per-turn color grids from a MemoryCheckpoint."""
from __future__ import annotations

from proteus.game.runtime.memory import MemoryCheckpoint, MemoryTurn, memory_frames

_GRID_LEGEND = {5: ".", 1: "A", 2: "B", 3: "#"}


def _ck(turns, scenario="x", wall_rects=None):
    return MemoryCheckpoint(
        model="m", scenario=scenario, difficulty="easy", seed=1,
        created_at="t", outcome="survived", transparent_prompt="p",
        memory_turns=turns, wall_rects=wall_rects or [],
    )


def test_grid_frame_inverts_ascii_via_legend():
    ck = _ck([MemoryTurn(turn_idx=1, frame_ascii="A.\n.#", action="right",
                         focal_pos=(0, 0), predator_pos=(1, 1))])
    frames = memory_frames(ck, legend=_GRID_LEGEND, grid_size=(2, 2))
    assert frames[0]["action"] == "right"
    assert frames[0]["grid"] == [[1, 5], [5, 3]]  # A . / . #


def test_prose_frame_paints_positions_and_walls():
    ck = _ck(
        [MemoryTurn(turn_idx=1, frame_ascii="Open field 8x8. You are A ...",
                    action="up", focal_pos=(0, 0), predator_pos=(5, 5))],
        wall_rects=[(2, 2, 3, 3)],
    )
    g = memory_frames(ck, legend=_GRID_LEGEND, grid_size=(8, 8))[0]["grid"]
    # focal is 2x2 at (0,0): cells (0,0),(1,0),(0,1),(1,1) => g[y][x]
    assert g[0][0] == 1 and g[0][1] == 1 and g[1][0] == 1 and g[1][1] == 1
    assert g[2][2] != 1                   # outside focal 2x2
    # predator is 3x3 at (5,5): cells (5..7, 5..7)
    assert g[5][5] == 2 and g[7][7] == 2
    assert g[3][3] == 3                   # wall cell visible
    assert g[0][4] == 5                   # background elsewhere


def test_prose_frame_paints_food_cells():
    ck = _ck(
        [MemoryTurn(turn_idx=1, frame_ascii="Open field 8x8. You are A ...",
                    action="up", focal_pos=(0, 0), predator_pos=(6, 6))],
        wall_rects=[(5, 1, 5, 1)],   # a clear cell (not under focal/predator/food)
    )
    ck.food_cells = [(4, 1), (1, 4)]
    g = memory_frames(ck, legend=_GRID_LEGEND, grid_size=(8, 8))[0]["grid"]
    assert g[1][4] == 14 and g[4][1] == 14   # food (idx 14) painted
    assert g[1][5] == 3                       # wall still there
    assert g[0][0] == 1                       # focal still on top


def test_checkpoint_food_cells_roundtrips():
    from proteus.game.runtime.memory import MemoryCheckpoint
    ck = MemoryCheckpoint(
        model="m", scenario="template", difficulty="easy", seed=1,
        created_at="t", outcome="survived", transparent_prompt="x",
        food_cells=[(3, 4)],
    )
    ck2 = MemoryCheckpoint.model_validate_json(ck.model_dump_json())
    assert ck2.food_cells == [(3, 4)]