"""Tests for the Object base class."""

from mudlib.object import Object


def test_object_creation_minimal():
    """Object can be created with just a name."""
    obj = Object(name="rock")
    assert obj.name == "rock"
    assert obj.location is None
    assert obj.x is None
    assert obj.y is None


def test_object_creation_with_position():
    """Object can have spatial coordinates."""
    obj = Object(name="tree", x=5, y=10)
    assert obj.x == 5
    assert obj.y == 10


def test_object_creation_with_location():
    """Object can be placed inside another object."""
    zone = Object(name="overworld")
    tree = Object(name="oak", location=zone, x=3, y=7)
    assert tree.location is zone


def test_contents_empty_by_default():
    """An object with nothing inside has empty contents."""
    obj = Object(name="empty")
    assert obj.contents == []


def test_contents_tracks_children():
    """Contents lists objects whose location is self."""
    zone = Object(name="overworld")
    tree = Object(name="oak", location=zone, x=3, y=7)
    rock = Object(name="rock", location=zone, x=1, y=1)
    assert tree in zone.contents
    assert rock in zone.contents
    assert len(zone.contents) == 2


def test_contents_nested():
    """Containment can nest: zone > player > backpack > item."""
    zone = Object(name="overworld")
    player = Object(name="jared", location=zone, x=5, y=5)
    backpack = Object(name="backpack", location=player)
    gem = Object(name="gem", location=backpack)

    assert player in zone.contents
    assert backpack in player.contents
    assert gem in backpack.contents
    # gem is NOT directly in zone or player
    assert gem not in zone.contents
    assert gem not in player.contents


def test_can_accept_default_false():
    """Object.can_accept() returns False by default."""
    obj = Object(name="rock")
    other = Object(name="sword")
    assert obj.can_accept(other) is False


def test_contents_returns_copy():
    """Contents returns a copy, not the internal list."""
    zone = Object(name="zone")
    Object(name="thing", location=zone)
    contents = zone.contents
    contents.append(Object(name="intruder"))
    assert len(zone.contents) == 1  # internal list unchanged
