Extended ThingTemplate with optional container fields (capacity, closed, locked). When a template includes capacity, spawn_thing now creates a Container instead of a regular Thing. Added two example container templates: - chest.toml: non-portable, capacity 5, starts closed - sack.toml: portable, capacity 3, starts open
149 lines
4.4 KiB
Python
149 lines
4.4 KiB
Python
"""Tests for container template loading and spawning."""
|
|
|
|
from pathlib import Path
|
|
from tempfile import TemporaryDirectory
|
|
|
|
from mudlib.container import Container
|
|
from mudlib.thing import Thing
|
|
from mudlib.things import load_thing_template, spawn_thing
|
|
from mudlib.zone import Zone
|
|
|
|
|
|
def test_load_container_template_with_capacity():
|
|
"""load_thing_template recognizes container templates (has capacity field)."""
|
|
with TemporaryDirectory() as tmpdir:
|
|
toml_path = Path(tmpdir) / "chest.toml"
|
|
toml_path.write_text(
|
|
"""
|
|
name = "chest"
|
|
description = "a wooden chest"
|
|
capacity = 5
|
|
"""
|
|
)
|
|
template = load_thing_template(toml_path)
|
|
assert template.name == "chest"
|
|
assert template.description == "a wooden chest"
|
|
assert hasattr(template, "capacity")
|
|
assert template.capacity == 5
|
|
|
|
|
|
def test_load_container_template_with_closed():
|
|
"""load_thing_template handles closed field."""
|
|
with TemporaryDirectory() as tmpdir:
|
|
toml_path = Path(tmpdir) / "chest.toml"
|
|
toml_path.write_text(
|
|
"""
|
|
name = "chest"
|
|
description = "a wooden chest"
|
|
capacity = 5
|
|
closed = true
|
|
"""
|
|
)
|
|
template = load_thing_template(toml_path)
|
|
assert template.closed is True
|
|
|
|
|
|
def test_load_container_template_with_locked():
|
|
"""load_thing_template handles locked field."""
|
|
with TemporaryDirectory() as tmpdir:
|
|
toml_path = Path(tmpdir) / "chest.toml"
|
|
toml_path.write_text(
|
|
"""
|
|
name = "chest"
|
|
description = "a wooden chest"
|
|
capacity = 5
|
|
closed = true
|
|
locked = true
|
|
"""
|
|
)
|
|
template = load_thing_template(toml_path)
|
|
assert template.locked is True
|
|
|
|
|
|
def test_load_container_template_defaults():
|
|
"""Container template fields have sensible defaults."""
|
|
with TemporaryDirectory() as tmpdir:
|
|
toml_path = Path(tmpdir) / "sack.toml"
|
|
toml_path.write_text(
|
|
"""
|
|
name = "sack"
|
|
description = "a cloth sack"
|
|
capacity = 3
|
|
"""
|
|
)
|
|
template = load_thing_template(toml_path)
|
|
assert template.capacity == 3
|
|
assert template.closed is False # default: open
|
|
assert template.locked is False # default: unlocked
|
|
|
|
|
|
def test_spawn_container_from_template():
|
|
"""spawn_thing creates a Container when template has capacity."""
|
|
with TemporaryDirectory() as tmpdir:
|
|
toml_path = Path(tmpdir) / "chest.toml"
|
|
toml_path.write_text(
|
|
"""
|
|
name = "chest"
|
|
description = "a wooden chest"
|
|
capacity = 5
|
|
closed = true
|
|
"""
|
|
)
|
|
template = load_thing_template(toml_path)
|
|
terrain = [["." for _ in range(10)] for _ in range(10)]
|
|
zone = Zone(name="test", width=10, height=10, terrain=terrain)
|
|
|
|
thing = spawn_thing(template, zone, x=5, y=5)
|
|
|
|
assert isinstance(thing, Container)
|
|
assert thing.name == "chest"
|
|
assert thing.description == "a wooden chest"
|
|
assert thing.capacity == 5
|
|
assert thing.closed is True
|
|
assert thing.location is zone
|
|
|
|
|
|
def test_spawn_regular_thing_from_template_without_capacity():
|
|
"""spawn_thing creates a regular Thing when template lacks capacity."""
|
|
with TemporaryDirectory() as tmpdir:
|
|
toml_path = Path(tmpdir) / "rock.toml"
|
|
toml_path.write_text(
|
|
"""
|
|
name = "rock"
|
|
description = "a smooth grey rock"
|
|
portable = true
|
|
"""
|
|
)
|
|
template = load_thing_template(toml_path)
|
|
terrain = [["." for _ in range(10)] for _ in range(10)]
|
|
zone = Zone(name="test", width=10, height=10, terrain=terrain)
|
|
|
|
thing = spawn_thing(template, zone, x=5, y=5)
|
|
|
|
assert isinstance(thing, Thing)
|
|
assert not isinstance(thing, Container)
|
|
assert thing.name == "rock"
|
|
assert thing.portable is True
|
|
|
|
|
|
def test_spawn_portable_container():
|
|
"""spawn_thing creates a portable Container (like a sack)."""
|
|
with TemporaryDirectory() as tmpdir:
|
|
toml_path = Path(tmpdir) / "sack.toml"
|
|
toml_path.write_text(
|
|
"""
|
|
name = "sack"
|
|
description = "a cloth sack"
|
|
capacity = 3
|
|
portable = true
|
|
"""
|
|
)
|
|
template = load_thing_template(toml_path)
|
|
terrain = [["." for _ in range(10)] for _ in range(10)]
|
|
zone = Zone(name="test", width=10, height=10, terrain=terrain)
|
|
|
|
thing = spawn_thing(template, zone, x=5, y=5)
|
|
|
|
assert isinstance(thing, Container)
|
|
assert thing.portable is True
|
|
assert thing.capacity == 3
|