140 lines
3.8 KiB
Python
140 lines
3.8 KiB
Python
"""
|
|
Unit tests for WorldGraph
|
|
"""
|
|
|
|
from world_graph import (
|
|
WorldGraph, Room, Door, WorldObject, Direction,
|
|
AgentInfo, create_two_room_scenario, create_button_door_scenario
|
|
)
|
|
|
|
def test_room_contains():
|
|
"""Test room boundary checking."""
|
|
room = Room("test", "test room", bounds=(5, 5, 10, 10))
|
|
|
|
assert room.contains(5, 5) == True # Top-left corner
|
|
assert room.contains(14, 14) == True # Bottom-right (exclusive)
|
|
assert room.contains(15, 15) == False # Outside
|
|
assert room.contains(4, 5) == False # Just outside left
|
|
|
|
print("PASS: room_contains")
|
|
|
|
def test_room_at():
|
|
"""Test spatial room lookup."""
|
|
world = create_two_room_scenario()
|
|
|
|
# Guard room is at (1,1) with size (8,8)
|
|
room = world.room_at(3, 3)
|
|
assert room is not None
|
|
assert room.name == "guard_room"
|
|
|
|
# Armory is at (11,1) with size (8,8)
|
|
room = world.room_at(13, 3)
|
|
assert room is not None
|
|
assert room.name == "armory"
|
|
|
|
# Between rooms (the door area) - should return None
|
|
room = world.room_at(9, 4)
|
|
assert room is None
|
|
|
|
print("PASS: room_at")
|
|
|
|
def test_describe_room_basic():
|
|
"""Test basic room description."""
|
|
world = create_two_room_scenario()
|
|
|
|
desc = world.describe_room("guard_room")
|
|
|
|
assert "You are in the guard room" in desc
|
|
assert "brass key" in desc
|
|
assert "Exits:" in desc
|
|
assert "east" in desc
|
|
assert "armory" in desc
|
|
|
|
print("PASS: describe_room_basic")
|
|
print(f" Output: {desc}")
|
|
|
|
def test_describe_room_with_agents():
|
|
"""Test room description with visible agents."""
|
|
world = create_two_room_scenario()
|
|
|
|
agents = [
|
|
AgentInfo("Wizard", "a wizard", (3, 3)),
|
|
AgentInfo("Knight", "a knight", (4, 4)),
|
|
]
|
|
|
|
desc = world.describe_room("guard_room", visible_agents=agents, observer_name="Wizard")
|
|
|
|
assert "knight" in desc.lower()
|
|
assert "wizard" not in desc.lower() # Observer excluded
|
|
|
|
print("PASS: describe_room_with_agents")
|
|
print(f" Output: {desc}")
|
|
|
|
def test_describe_locked_door():
|
|
"""Test that locked doors are described correctly."""
|
|
world = create_button_door_scenario()
|
|
|
|
desc = world.describe_room("button_room")
|
|
|
|
assert "locked" in desc.lower()
|
|
|
|
print("PASS: describe_locked_door")
|
|
print(f" Output: {desc}")
|
|
|
|
def test_available_actions():
|
|
"""Test action enumeration."""
|
|
world = create_two_room_scenario()
|
|
|
|
actions = world.get_available_actions("guard_room")
|
|
|
|
assert "GO EAST" in actions
|
|
assert "TAKE brass_key" in actions
|
|
assert "LOOK" in actions
|
|
assert "WAIT" in actions
|
|
|
|
print("PASS: available_actions")
|
|
print(f" Actions: {actions}")
|
|
|
|
def test_determinism():
|
|
"""Test that descriptions are deterministic."""
|
|
world = create_two_room_scenario()
|
|
|
|
desc1 = world.describe_room("guard_room")
|
|
desc2 = world.describe_room("guard_room")
|
|
desc3 = world.describe_room("guard_room")
|
|
|
|
assert desc1 == desc2 == desc3, "Descriptions must be deterministic!"
|
|
|
|
print("PASS: determinism")
|
|
|
|
def test_direction_opposites():
|
|
"""Test direction opposite calculation."""
|
|
assert Direction.NORTH.opposite == Direction.SOUTH
|
|
assert Direction.SOUTH.opposite == Direction.NORTH
|
|
assert Direction.EAST.opposite == Direction.WEST
|
|
assert Direction.WEST.opposite == Direction.EAST
|
|
|
|
print("PASS: direction_opposites")
|
|
|
|
def run_all_tests():
|
|
"""Run all WorldGraph tests."""
|
|
print("=" * 50)
|
|
print("WorldGraph Unit Tests")
|
|
print("=" * 50)
|
|
|
|
test_room_contains()
|
|
test_room_at()
|
|
test_describe_room_basic()
|
|
test_describe_room_with_agents()
|
|
test_describe_locked_door()
|
|
test_available_actions()
|
|
test_determinism()
|
|
test_direction_opposites()
|
|
|
|
print("=" * 50)
|
|
print("All tests passed!")
|
|
print("=" * 50)
|
|
|
|
if __name__ == "__main__":
|
|
run_all_tests()
|