Removed identical local copies from 45 test files. These fixtures are already defined in conftest.py.
366 lines
11 KiB
Python
366 lines
11 KiB
Python
"""Tests for put and take-from commands."""
|
|
|
|
import pytest
|
|
|
|
from mudlib.commands import _registry
|
|
from mudlib.container import Container
|
|
from mudlib.player import Player
|
|
from mudlib.thing import Thing
|
|
from mudlib.zone import Zone
|
|
|
|
|
|
@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
|
|
|
|
|
|
# --- cmd_put ---
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_put_thing_in_container(player, test_zone, mock_writer):
|
|
"""put moves thing from inventory to container."""
|
|
from mudlib.commands.containers import cmd_put
|
|
|
|
chest = Container(
|
|
name="chest", location=test_zone, x=5, y=5, closed=False, capacity=10
|
|
)
|
|
rock = Thing(name="rock", location=player)
|
|
|
|
await cmd_put(player, "rock in chest")
|
|
|
|
assert rock.location == chest
|
|
assert rock in chest.contents
|
|
assert rock not in player.contents
|
|
output = mock_writer.write.call_args_list[-1][0][0]
|
|
assert "put" in output.lower() and "rock" in output.lower()
|
|
assert "chest" in output.lower()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_put_no_args(player, mock_writer):
|
|
"""put with no args gives usage message."""
|
|
from mudlib.commands.containers import cmd_put
|
|
|
|
await cmd_put(player, "")
|
|
output = mock_writer.write.call_args_list[-1][0][0]
|
|
assert "put" in output.lower() and "container" in output.lower()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_put_missing_container_arg(player, mock_writer):
|
|
"""put with missing container argument gives error."""
|
|
from mudlib.commands.containers import cmd_put
|
|
|
|
_rock = Thing(name="rock", location=player)
|
|
await cmd_put(player, "rock in")
|
|
output = mock_writer.write.call_args_list[-1][0][0]
|
|
assert "put" in output.lower() and "container" in output.lower()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_put_thing_not_in_inventory(player, test_zone, mock_writer):
|
|
"""put on thing not carried gives error."""
|
|
from mudlib.commands.containers import cmd_put
|
|
|
|
_chest = Container(
|
|
name="chest", location=test_zone, x=5, y=5, closed=False, capacity=10
|
|
)
|
|
_rock = Thing(name="rock", location=test_zone, x=5, y=5)
|
|
|
|
await cmd_put(player, "rock in chest")
|
|
output = mock_writer.write.call_args_list[-1][0][0]
|
|
assert "not carrying" in output.lower() or "aren't carrying" in output.lower()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_put_container_not_found(player, mock_writer):
|
|
"""put into non-existent container gives error."""
|
|
from mudlib.commands.containers import cmd_put
|
|
|
|
_rock = Thing(name="rock", location=player)
|
|
|
|
await cmd_put(player, "rock in chest")
|
|
output = mock_writer.write.call_args_list[-1][0][0]
|
|
assert "don't see" in output.lower()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_put_container_closed(player, test_zone, mock_writer):
|
|
"""put into closed container gives error."""
|
|
from mudlib.commands.containers import cmd_put
|
|
|
|
_chest = Container(
|
|
name="chest", location=test_zone, x=5, y=5, closed=True, capacity=10
|
|
)
|
|
rock = Thing(name="rock", location=player)
|
|
|
|
await cmd_put(player, "rock in chest")
|
|
assert rock.location == player # Should not have moved
|
|
output = mock_writer.write.call_args_list[-1][0][0]
|
|
assert "closed" in output.lower()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_put_container_full(player, test_zone, mock_writer):
|
|
"""put into full container gives error."""
|
|
from mudlib.commands.containers import cmd_put
|
|
|
|
chest = Container(
|
|
name="chest", location=test_zone, x=5, y=5, closed=False, capacity=1
|
|
)
|
|
# Fill the container
|
|
_other = Thing(name="other", location=chest)
|
|
rock = Thing(name="rock", location=player)
|
|
|
|
await cmd_put(player, "rock in chest")
|
|
assert rock.location == player # Should not have moved
|
|
output = mock_writer.write.call_args_list[-1][0][0]
|
|
assert "full" in output.lower()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_put_target_not_container(player, test_zone, mock_writer):
|
|
"""put into non-container thing gives error."""
|
|
from mudlib.commands.containers import cmd_put
|
|
|
|
_stick = Thing(name="stick", location=test_zone, x=5, y=5)
|
|
rock = Thing(name="rock", location=player)
|
|
|
|
await cmd_put(player, "rock in stick")
|
|
assert rock.location == player # Should not have moved
|
|
output = mock_writer.write.call_args_list[-1][0][0]
|
|
assert "not a container" in output.lower() or "can't" in output.lower()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_put_matches_thing_alias(player, test_zone):
|
|
"""put matches thing by alias."""
|
|
from mudlib.commands.containers import cmd_put
|
|
|
|
chest = Container(
|
|
name="chest", location=test_zone, x=5, y=5, closed=False, capacity=10
|
|
)
|
|
rock = Thing(name="small rock", aliases=["rock", "pebble"], location=player)
|
|
|
|
await cmd_put(player, "pebble in chest")
|
|
assert rock.location == chest
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_put_matches_container_alias(player, test_zone):
|
|
"""put matches container by alias."""
|
|
from mudlib.commands.containers import cmd_put
|
|
|
|
chest = Container(
|
|
name="wooden chest",
|
|
aliases=["chest", "box"],
|
|
location=test_zone,
|
|
x=5,
|
|
y=5,
|
|
closed=False,
|
|
capacity=10,
|
|
)
|
|
rock = Thing(name="rock", location=player)
|
|
|
|
await cmd_put(player, "rock in box")
|
|
assert rock.location == chest
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_put_container_in_inventory(player, test_zone):
|
|
"""put works with container in player inventory."""
|
|
from mudlib.commands.containers import cmd_put
|
|
|
|
box = Container(name="box", location=player, closed=False, capacity=10)
|
|
rock = Thing(name="rock", location=player)
|
|
|
|
await cmd_put(player, "rock in box")
|
|
assert rock.location == box
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_put_container_in_itself(player, test_zone, mock_writer):
|
|
"""put container in itself gives error."""
|
|
from mudlib.commands.containers import cmd_put
|
|
|
|
box = Container(name="box", location=player, closed=False, capacity=10)
|
|
|
|
await cmd_put(player, "box in box")
|
|
assert box.location == player # Should not have moved
|
|
output = mock_writer.write.call_args_list[-1][0][0]
|
|
assert "can't put" in output.lower() and "itself" in output.lower()
|
|
|
|
|
|
# --- cmd_get with "from" (take-from) ---
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_take_from_container(player, test_zone, mock_writer):
|
|
"""take from container moves thing to inventory."""
|
|
from mudlib.commands.things import cmd_get
|
|
|
|
chest = Container(
|
|
name="chest", location=test_zone, x=5, y=5, closed=False, capacity=10
|
|
)
|
|
rock = Thing(name="rock", location=chest)
|
|
|
|
await cmd_get(player, "rock from chest")
|
|
|
|
assert rock.location == player
|
|
assert rock in player.contents
|
|
assert rock not in chest.contents
|
|
output = mock_writer.write.call_args_list[-1][0][0]
|
|
assert "take" in output.lower() and "rock" in output.lower()
|
|
assert "chest" in output.lower()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_take_from_no_args(player, mock_writer):
|
|
"""take from with missing args gives usage message."""
|
|
from mudlib.commands.things import cmd_get
|
|
|
|
await cmd_get(player, "from")
|
|
output = mock_writer.write.call_args_list[-1][0][0]
|
|
assert "take" in output.lower() and "container" in output.lower()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_take_from_missing_container(player, test_zone, mock_writer):
|
|
"""take from with missing container gives error."""
|
|
from mudlib.commands.things import cmd_get
|
|
|
|
_chest = Container(
|
|
name="chest", location=test_zone, x=5, y=5, closed=False, capacity=10
|
|
)
|
|
|
|
await cmd_get(player, "rock from")
|
|
output = mock_writer.write.call_args_list[-1][0][0]
|
|
assert "take" in output.lower() and "container" in output.lower()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_take_from_container_not_found(player, test_zone, mock_writer):
|
|
"""take from non-existent container gives error."""
|
|
from mudlib.commands.things import cmd_get
|
|
|
|
await cmd_get(player, "rock from chest")
|
|
output = mock_writer.write.call_args_list[-1][0][0]
|
|
assert "don't see" in output.lower()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_take_from_closed_container(player, test_zone, mock_writer):
|
|
"""take from closed container gives error."""
|
|
from mudlib.commands.things import cmd_get
|
|
|
|
chest = Container(
|
|
name="chest", location=test_zone, x=5, y=5, closed=True, capacity=10
|
|
)
|
|
_rock = Thing(name="rock", location=chest)
|
|
|
|
await cmd_get(player, "rock from chest")
|
|
output = mock_writer.write.call_args_list[-1][0][0]
|
|
assert "closed" in output.lower()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_take_from_thing_not_in_container(player, test_zone, mock_writer):
|
|
"""take from container when thing not inside gives error."""
|
|
from mudlib.commands.things import cmd_get
|
|
|
|
_chest = Container(
|
|
name="chest", location=test_zone, x=5, y=5, closed=False, capacity=10
|
|
)
|
|
|
|
await cmd_get(player, "rock from chest")
|
|
output = mock_writer.write.call_args_list[-1][0][0]
|
|
assert "doesn't contain" in output.lower() or "not in" in output.lower()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_take_from_non_container(player, test_zone, mock_writer):
|
|
"""take from non-container thing gives error."""
|
|
from mudlib.commands.things import cmd_get
|
|
|
|
_stick = Thing(name="stick", location=test_zone, x=5, y=5)
|
|
|
|
await cmd_get(player, "rock from stick")
|
|
output = mock_writer.write.call_args_list[-1][0][0]
|
|
assert "not a container" in output.lower() or "can't" in output.lower()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_take_from_matches_thing_alias(player, test_zone):
|
|
"""take from matches thing by alias."""
|
|
from mudlib.commands.things import cmd_get
|
|
|
|
chest = Container(
|
|
name="chest", location=test_zone, x=5, y=5, closed=False, capacity=10
|
|
)
|
|
rock = Thing(name="small rock", aliases=["rock", "pebble"], location=chest)
|
|
|
|
await cmd_get(player, "pebble from chest")
|
|
assert rock.location == player
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_take_from_matches_container_alias(player, test_zone):
|
|
"""take from matches container by alias."""
|
|
from mudlib.commands.things import cmd_get
|
|
|
|
chest = Container(
|
|
name="wooden chest",
|
|
aliases=["chest", "box"],
|
|
location=test_zone,
|
|
x=5,
|
|
y=5,
|
|
closed=False,
|
|
capacity=10,
|
|
)
|
|
rock = Thing(name="rock", location=chest)
|
|
|
|
await cmd_get(player, "rock from box")
|
|
assert rock.location == player
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_take_from_container_in_inventory(player, test_zone):
|
|
"""take from works with container in player inventory."""
|
|
from mudlib.commands.things import cmd_get
|
|
|
|
box = Container(name="box", location=player, closed=False, capacity=10)
|
|
rock = Thing(name="rock", location=box)
|
|
|
|
await cmd_get(player, "rock from box")
|
|
assert rock.location == player
|
|
|
|
|
|
# --- command registration ---
|
|
|
|
|
|
def test_put_command_registered():
|
|
"""put command is registered."""
|
|
import mudlib.commands.containers # noqa: F401
|
|
|
|
assert "put" in _registry
|