File size: 1,618 Bytes
26b05a6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# tests/runtime/test_memory_multiagent_model.py
"""Multi-agent memory fields round-trip and stay backward compatible."""
from proteus.game.runtime.memory import (
    AgentFrame, MemoryCheckpoint, MemoryTurn,
)


def test_agentframe_defaults():
    a = AgentFrame(id="a0", kind="agent", pos=(3, 4), size=2)
    assert a.alive is True and a.is_chosen is False and a.facing == "right"


def test_turn_multiagent_roundtrip():
    t = MemoryTurn(
        turn_idx=1, frame_ascii="", action="up",
        focal_pos=(0, 0), predator_pos=(0, 0),
        agents=[AgentFrame(id="a0", kind="agent", pos=(3, 4), size=2, is_chosen=True),
                AgentFrame(id="predator", kind="predator", pos=(9, 9), size=3, facing="left")],
        resources=[(5, 5)], events=["a1 eaten"],
    )
    back = MemoryTurn.model_validate_json(t.model_dump_json())
    assert back.agents[0].is_chosen is True
    assert back.agents[1].facing == "left"
    assert back.resources == [(5, 5)] and back.events == ["a1 eaten"]


def test_checkpoint_chosen_id_and_backcompat():
    ck = MemoryCheckpoint(
        model="m", scenario="s", difficulty="easy", created_at="x",
        outcome="survived", transparent_prompt="p", chosen_agent_id="a0",
    )
    back = MemoryCheckpoint.model_validate_json(ck.model_dump_json())
    assert back.chosen_agent_id == "a0"
    # Legacy single-agent turns still parse with empty multi-agent fields.
    legacy = MemoryTurn(turn_idx=1, frame_ascii="x", action="up",
                        focal_pos=(1, 1), predator_pos=(2, 2))
    assert legacy.agents == [] and legacy.resources == [] and legacy.events == []