"""Tests for the Container class.""" from mudlib.container import Container from mudlib.object import Object from mudlib.thing import Thing from mudlib.zone import Zone # --- construction --- def test_container_creation_minimal(): """Container can be created with just a name.""" c = Container(name="chest") assert c.name == "chest" assert c.capacity == 10 assert c.closed is False assert c.locked is False def test_container_creation_with_custom_capacity(): """Container can have a custom capacity.""" c = Container(name="pouch", capacity=5) assert c.capacity == 5 def test_container_creation_closed(): """Container can be created in closed state.""" c = Container(name="chest", closed=True) assert c.closed is True def test_container_creation_locked(): """Container can be created in locked state.""" c = Container(name="chest", locked=True) assert c.locked is True def test_container_is_thing_subclass(): """Container is a Thing subclass.""" c = Container(name="chest") assert isinstance(c, Thing) assert isinstance(c, Object) def test_container_inherits_thing_properties(): """Container has all Thing properties.""" c = Container( name="ornate chest", description="a beautifully carved wooden chest", portable=False, aliases=["chest", "box"], ) assert c.description == "a beautifully carved wooden chest" assert c.portable is False assert c.aliases == ["chest", "box"] # --- can_accept --- def test_container_accepts_thing_when_open(): """Container accepts Things when open and has capacity.""" c = Container(name="chest") sword = Thing(name="sword") assert c.can_accept(sword) is True def test_container_rejects_when_closed(): """Container rejects Things when closed.""" c = Container(name="chest", closed=True) sword = Thing(name="sword") assert c.can_accept(sword) is False def test_container_rejects_when_at_capacity(): """Container rejects Things when at capacity.""" c = Container(name="pouch", capacity=2) # Add two items Thing(name="rock1", location=c) Thing(name="rock2", location=c) # Third should be rejected rock3 = Thing(name="rock3") assert c.can_accept(rock3) is False def test_container_accepts_when_below_capacity(): """Container accepts Things when below capacity.""" c = Container(name="pouch", capacity=2) Thing(name="rock1", location=c) # Second item should be accepted rock2 = Thing(name="rock2") assert c.can_accept(rock2) is True def test_container_rejects_non_thing(): """Container rejects objects that aren't Things.""" c = Container(name="chest") other = Object(name="abstract") assert c.can_accept(other) is False def test_container_locked_is_just_flag(): """Locked flag is stored but doesn't affect can_accept (used by commands).""" c = Container(name="chest", locked=True, closed=False) sword = Thing(name="sword") # can_accept doesn't check locked (commands will check it separately) # This test documents current behavior — locked is for command layer assert c.locked is True # can_accept only checks closed and capacity assert c.can_accept(sword) is True # --- integration with zones --- def test_container_in_zone(): """Container can be placed in a zone with coordinates.""" terrain = [["." for _ in range(10)] for _ in range(10)] zone = Zone(name="test", width=10, height=10, terrain=terrain) chest = Container(name="chest", location=zone, x=5, y=5) assert chest.location is zone assert chest.x == 5 assert chest.y == 5 assert chest in zone.contents def test_container_with_contents(): """Container can hold Things.""" chest = Container(name="chest") sword = Thing(name="sword", location=chest) gem = Thing(name="gem", location=chest) assert sword in chest.contents assert gem in chest.contents assert len(chest.contents) == 2