Co-authored-by: Perplexity Computer <perplexity@tower.local> Co-committed-by: Perplexity Computer <perplexity@tower.local>
81 lines
2.9 KiB
Python
81 lines
2.9 KiB
Python
"""Tests for the MockWorldAdapter — full observe/act/speak cycle."""
|
|
|
|
from infrastructure.world.adapters.mock import MockWorldAdapter
|
|
from infrastructure.world.types import ActionStatus, CommandInput, PerceptionOutput
|
|
|
|
|
|
class TestMockWorldAdapter:
|
|
def test_observe_returns_perception(self):
|
|
adapter = MockWorldAdapter(location="Vivec")
|
|
perception = adapter.observe()
|
|
assert isinstance(perception, PerceptionOutput)
|
|
assert perception.location == "Vivec"
|
|
assert perception.raw == {"adapter": "mock"}
|
|
|
|
def test_observe_entities(self):
|
|
adapter = MockWorldAdapter(entities=["Jiub", "Silt Strider"])
|
|
perception = adapter.observe()
|
|
assert perception.entities == ["Jiub", "Silt Strider"]
|
|
|
|
def test_act_logs_command(self):
|
|
adapter = MockWorldAdapter()
|
|
cmd = CommandInput(action="move", target="north")
|
|
result = adapter.act(cmd)
|
|
assert result.status == ActionStatus.SUCCESS
|
|
assert "move" in result.message
|
|
assert len(adapter.action_log) == 1
|
|
assert adapter.action_log[0].command.action == "move"
|
|
|
|
def test_act_multiple_commands(self):
|
|
adapter = MockWorldAdapter()
|
|
adapter.act(CommandInput(action="attack"))
|
|
adapter.act(CommandInput(action="defend"))
|
|
adapter.act(CommandInput(action="retreat"))
|
|
assert len(adapter.action_log) == 3
|
|
|
|
def test_speak_logs_message(self):
|
|
adapter = MockWorldAdapter()
|
|
adapter.speak("Hello, traveler!")
|
|
assert len(adapter.speech_log) == 1
|
|
assert adapter.speech_log[0]["message"] == "Hello, traveler!"
|
|
assert adapter.speech_log[0]["target"] is None
|
|
|
|
def test_speak_with_target(self):
|
|
adapter = MockWorldAdapter()
|
|
adapter.speak("Die, scum!", target="Cliff Racer")
|
|
assert adapter.speech_log[0]["target"] == "Cliff Racer"
|
|
|
|
def test_lifecycle(self):
|
|
adapter = MockWorldAdapter()
|
|
assert adapter.is_connected is False
|
|
adapter.connect()
|
|
assert adapter.is_connected is True
|
|
adapter.disconnect()
|
|
assert adapter.is_connected is False
|
|
|
|
def test_full_observe_act_speak_cycle(self):
|
|
"""Acceptance criterion: full observe/act/speak cycle passes."""
|
|
adapter = MockWorldAdapter(
|
|
location="Seyda Neen",
|
|
entities=["Fargoth", "Hrisskar"],
|
|
events=["quest_started"],
|
|
)
|
|
adapter.connect()
|
|
|
|
# Observe
|
|
perception = adapter.observe()
|
|
assert perception.location == "Seyda Neen"
|
|
assert len(perception.entities) == 2
|
|
assert "quest_started" in perception.events
|
|
|
|
# Act
|
|
result = adapter.act(CommandInput(action="talk", target="Fargoth"))
|
|
assert result.status == ActionStatus.SUCCESS
|
|
|
|
# Speak
|
|
adapter.speak("Where is your ring, Fargoth?", target="Fargoth")
|
|
assert len(adapter.speech_log) == 1
|
|
|
|
adapter.disconnect()
|
|
assert adapter.is_connected is False
|