Implements a module-level zone registry for looking up zones by name. Includes register_zone() and get_zone() functions with comprehensive tests covering single/multiple zones, unknown lookups, and overwrites.
152 lines
4.7 KiB
Python
152 lines
4.7 KiB
Python
"""Tests for container state display in look and inventory commands."""
|
|
|
|
from unittest.mock import AsyncMock, MagicMock
|
|
|
|
import pytest
|
|
|
|
from mudlib.container import Container
|
|
from mudlib.player import Player
|
|
from mudlib.thing import Thing
|
|
from mudlib.zone import Zone
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_writer():
|
|
writer = MagicMock()
|
|
writer.write = MagicMock()
|
|
writer.drain = AsyncMock()
|
|
return writer
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_reader():
|
|
return MagicMock()
|
|
|
|
|
|
@pytest.fixture
|
|
def test_zone():
|
|
terrain = [["." for _ in range(10)] for _ in range(10)]
|
|
return Zone(
|
|
name="testzone",
|
|
width=10,
|
|
height=10,
|
|
toroidal=True,
|
|
terrain=terrain,
|
|
)
|
|
|
|
|
|
@pytest.fixture
|
|
def player(mock_reader, mock_writer, test_zone):
|
|
p = Player(
|
|
name="TestPlayer",
|
|
x=5,
|
|
y=5,
|
|
reader=mock_reader,
|
|
writer=mock_writer,
|
|
location=test_zone,
|
|
)
|
|
return p
|
|
|
|
|
|
# --- look command container display ---
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_look_shows_closed_container(player, test_zone, mock_writer):
|
|
"""look shows closed containers with (closed) suffix."""
|
|
from mudlib.commands.look import cmd_look
|
|
|
|
Container(name="chest", location=test_zone, x=5, y=5, closed=True)
|
|
await cmd_look(player, "")
|
|
output = "".join(call[0][0] for call in mock_writer.write.call_args_list)
|
|
assert "chest (closed)" in output
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_look_shows_open_empty_container(player, test_zone, mock_writer):
|
|
"""look shows open empty containers with (open, empty) suffix."""
|
|
from mudlib.commands.look import cmd_look
|
|
|
|
Container(name="chest", location=test_zone, x=5, y=5, closed=False)
|
|
await cmd_look(player, "")
|
|
output = "".join(call[0][0] for call in mock_writer.write.call_args_list)
|
|
assert "chest (open, empty)" in output
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_look_shows_open_container_with_contents(
|
|
player, test_zone, mock_writer
|
|
):
|
|
"""look shows open containers with their contents."""
|
|
from mudlib.commands.look import cmd_look
|
|
|
|
chest = Container(name="chest", location=test_zone, x=5, y=5, closed=False)
|
|
Thing(name="rock", location=chest)
|
|
Thing(name="coin", location=chest)
|
|
await cmd_look(player, "")
|
|
output = "".join(call[0][0] for call in mock_writer.write.call_args_list)
|
|
assert "chest (open, containing: rock, coin)" in output
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_look_shows_regular_things_unchanged(player, test_zone, mock_writer):
|
|
"""look shows regular Things without container suffixes."""
|
|
from mudlib.commands.look import cmd_look
|
|
|
|
Thing(name="rock", location=test_zone, x=5, y=5)
|
|
await cmd_look(player, "")
|
|
output = "".join(call[0][0] for call in mock_writer.write.call_args_list)
|
|
assert "On the ground: rock" in output
|
|
assert "(closed)" not in output
|
|
assert "(open" not in output
|
|
|
|
|
|
# --- inventory command container display ---
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_inventory_shows_closed_container(player, mock_writer):
|
|
"""inventory shows closed containers with (closed) suffix."""
|
|
from mudlib.commands.things import cmd_inventory
|
|
|
|
Container(name="sack", location=player, closed=True)
|
|
await cmd_inventory(player, "")
|
|
output = "".join(call[0][0] for call in mock_writer.write.call_args_list)
|
|
assert "sack (closed)" in output
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_inventory_shows_open_empty_container(player, mock_writer):
|
|
"""inventory shows open empty containers with (open, empty) suffix."""
|
|
from mudlib.commands.things import cmd_inventory
|
|
|
|
Container(name="sack", location=player, closed=False)
|
|
await cmd_inventory(player, "")
|
|
output = "".join(call[0][0] for call in mock_writer.write.call_args_list)
|
|
assert "sack (open, empty)" in output
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_inventory_shows_container_with_contents(player, mock_writer):
|
|
"""inventory shows open containers with their contents."""
|
|
from mudlib.commands.things import cmd_inventory
|
|
|
|
sack = Container(name="sack", location=player, closed=False)
|
|
Thing(name="rock", location=sack)
|
|
Thing(name="gem", location=sack)
|
|
await cmd_inventory(player, "")
|
|
output = "".join(call[0][0] for call in mock_writer.write.call_args_list)
|
|
assert "sack (open, containing: rock, gem)" in output
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_inventory_shows_regular_things_unchanged(player, mock_writer):
|
|
"""inventory shows regular Things without container suffixes."""
|
|
from mudlib.commands.things import cmd_inventory
|
|
|
|
Thing(name="rock", location=player)
|
|
await cmd_inventory(player, "")
|
|
output = "".join(call[0][0] for call in mock_writer.write.call_args_list)
|
|
assert " rock\r\n" in output
|
|
assert "(closed)" not in output
|
|
assert "(open" not in output
|