mud/tests/test_container_templates.py
Jared Miller 68161fd025
Add container support to thing template loader
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
2026-02-11 20:58:55 -05:00

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