Containers now display their state when viewed: - Closed containers show "(closed)" - Open empty containers show "(open, empty)" - Open containers with items show "(open, containing: item1, item2)" This applies to both ground items in the look command and inventory items. Added _format_thing_name helper to both look.py and things.py to handle the display formatting consistently.
150 lines
4.7 KiB
Python
150 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
|