145 lines
4.6 KiB
Python
145 lines
4.6 KiB
Python
"""Tests for room rendering functions."""
|
|
|
|
from mudlib.render.room import (
|
|
render_atmosphere,
|
|
render_entity_lines,
|
|
render_exits,
|
|
render_location,
|
|
render_nearby,
|
|
render_where,
|
|
)
|
|
|
|
|
|
class MockZone:
|
|
"""Mock zone for testing."""
|
|
|
|
def __init__(self, width=100, height=100, passable_tiles=None):
|
|
self.width = width
|
|
self.height = height
|
|
self.description = "Test Zone"
|
|
self._passable = passable_tiles or set()
|
|
|
|
def is_passable(self, x, y):
|
|
return (x, y) in self._passable
|
|
|
|
|
|
class MockEntity:
|
|
"""Mock entity for testing."""
|
|
|
|
def __init__(self, name, posture="standing"):
|
|
self.name = name
|
|
self.posture = posture
|
|
|
|
|
|
def test_render_where():
|
|
"""render_where should format zone description."""
|
|
assert render_where("The Overworld") == "Where: The Overworld"
|
|
|
|
|
|
def test_render_location_center():
|
|
"""render_location should show center quadrant."""
|
|
zone = MockZone(width=90, height=90)
|
|
assert render_location(zone, 45, 45) == "Location: center 45, 45"
|
|
|
|
|
|
def test_render_location_northeast():
|
|
"""render_location should show northeast quadrant."""
|
|
zone = MockZone(width=90, height=90)
|
|
assert render_location(zone, 70, 10) == "Location: northeast 70, 10"
|
|
|
|
|
|
def test_render_location_southwest():
|
|
"""render_location should show southwest quadrant."""
|
|
zone = MockZone(width=90, height=90)
|
|
assert render_location(zone, 10, 70) == "Location: southwest 10, 70"
|
|
|
|
|
|
def test_render_nearby_empty():
|
|
"""render_nearby should return empty string when no entities."""
|
|
assert render_nearby([], None) == ""
|
|
|
|
|
|
def test_render_nearby_with_entities():
|
|
"""render_nearby should show count and names."""
|
|
entities = [MockEntity("Goku"), MockEntity("Vegeta")]
|
|
result = render_nearby(entities, None)
|
|
assert result == "Nearby: (2) Goku / Vegeta"
|
|
|
|
|
|
def test_render_exits_all_directions():
|
|
"""render_exits should list all passable directions."""
|
|
zone = MockZone(passable_tiles={(5, 4), (5, 6), (6, 5), (4, 5)})
|
|
assert render_exits(zone, 5, 5) == "Exits: north south east west"
|
|
|
|
|
|
def test_render_exits_partial():
|
|
"""render_exits should list only passable directions."""
|
|
zone = MockZone(passable_tiles={(5, 4), (6, 5)})
|
|
assert render_exits(zone, 5, 5) == "Exits: north east"
|
|
|
|
|
|
def test_render_exits_none():
|
|
"""render_exits should show 'Exits:' with no directions if trapped."""
|
|
zone = MockZone(passable_tiles=set())
|
|
assert render_exits(zone, 5, 5) == "Exits:"
|
|
|
|
|
|
def test_render_entity_lines_empty():
|
|
"""render_entity_lines should return empty string when no entities."""
|
|
assert render_entity_lines([], None) == ""
|
|
|
|
|
|
def test_render_entity_lines_with_postures():
|
|
"""render_entity_lines should show entity names with postures."""
|
|
entities = [
|
|
MockEntity("Krillin", "resting"),
|
|
MockEntity("Piccolo", "standing"),
|
|
]
|
|
result = render_entity_lines(entities, None)
|
|
assert "Krillin is resting here." in result
|
|
assert "Piccolo is standing here." in result
|
|
|
|
|
|
def test_render_atmosphere_clear_weather():
|
|
"""render_atmosphere should omit weather desc when clear."""
|
|
result = render_atmosphere(12, "", "summer")
|
|
assert "[day, summer]" in result
|
|
# Should have sky description but no weather text
|
|
assert result.count(". [") == 1 # only one period before bracket
|
|
# Should not have double period before bracket
|
|
assert ". . [" not in result
|
|
|
|
|
|
def test_render_atmosphere_with_rain():
|
|
"""render_atmosphere should include weather desc when not clear."""
|
|
result = render_atmosphere(12, "rain patters steadily", "spring")
|
|
assert "rain patters steadily" in result
|
|
assert "[day, spring]" in result
|
|
|
|
|
|
def test_render_atmosphere_dawn():
|
|
"""render_atmosphere should show dawn period."""
|
|
result = render_atmosphere(5, "", "autumn")
|
|
assert "[dawn, autumn]" in result
|
|
|
|
|
|
def test_render_atmosphere_dusk():
|
|
"""render_atmosphere should show dusk period."""
|
|
result = render_atmosphere(18, "", "winter")
|
|
assert "[dusk, winter]" in result
|
|
|
|
|
|
def test_render_atmosphere_night():
|
|
"""render_atmosphere should show night period."""
|
|
result = render_atmosphere(22, "", "spring")
|
|
assert "[night, spring]" in result
|
|
|
|
|
|
def test_render_atmosphere_with_heavy_snow():
|
|
"""render_atmosphere should include heavy weather descriptions."""
|
|
result = render_atmosphere(22, "heavy snow blankets everything", "winter")
|
|
assert "heavy snow blankets everything" in result
|
|
assert "[night, winter]" in result
|
|
# Should have format: sky. weather. [period, season]
|
|
parts = result.split(". ")
|
|
assert len(parts) == 3 # sky, weather, [period, season]
|