diff --git a/tests/test_prompt.py b/tests/test_prompt.py index 6094cf7..aeacdc6 100644 --- a/tests/test_prompt.py +++ b/tests/test_prompt.py @@ -474,3 +474,330 @@ def test_combat_state_shows_state_when_in_combat(): result = render_prompt(player) assert result == "[telegraph] > " + + +def test_terrain_variable_grass(): + """Terrain variable shows 'grass' for '.' tile.""" + from mudlib.zone import Zone + + terrain = [["." for _ in range(5)] for _ in range(5)] + zone = Zone( + name="testzone", + width=5, + height=5, + toroidal=True, + terrain=terrain, + impassable=set(), + ) + + player = Player( + name="Test", + stamina=50.0, + max_stamina=100.0, + pl=200.0, + mode_stack=["normal"], + x=2, + y=2, + location=zone, + prompt_template="{terrain} > ", + caps=ClientCaps(ansi=False), + ) + result = render_prompt(player) + assert result == "grass > " + + +def test_terrain_variable_forest(): + """Terrain variable shows 'forest' for 'T' tile.""" + from mudlib.zone import Zone + + terrain = [["." for _ in range(5)] for _ in range(5)] + terrain[2][2] = "T" # Forest at player position + zone = Zone( + name="testzone", + width=5, + height=5, + toroidal=True, + terrain=terrain, + impassable=set(), + ) + + player = Player( + name="Test", + stamina=50.0, + max_stamina=100.0, + pl=200.0, + mode_stack=["normal"], + x=2, + y=2, + location=zone, + prompt_template="{terrain} > ", + caps=ClientCaps(ansi=False), + ) + result = render_prompt(player) + assert result == "forest > " + + +def test_terrain_variable_mountain(): + """Terrain variable shows 'mountain' for '^' tile.""" + from mudlib.zone import Zone + + terrain = [["." for _ in range(5)] for _ in range(5)] + terrain[2][2] = "^" # Mountain at player position + zone = Zone( + name="testzone", + width=5, + height=5, + toroidal=True, + terrain=terrain, + impassable={"^"}, + ) + + player = Player( + name="Test", + stamina=50.0, + max_stamina=100.0, + pl=200.0, + mode_stack=["normal"], + x=2, + y=2, + location=zone, + prompt_template="{terrain} > ", + caps=ClientCaps(ansi=False), + ) + result = render_prompt(player) + assert result == "mountain > " + + +def test_terrain_variable_unknown_char(): + """Terrain variable shows raw char for unknown tile.""" + from mudlib.zone import Zone + + terrain = [["." for _ in range(5)] for _ in range(5)] + terrain[2][2] = "," # Custom unknown tile + zone = Zone( + name="testzone", + width=5, + height=5, + toroidal=True, + terrain=terrain, + impassable=set(), + ) + + player = Player( + name="Test", + stamina=50.0, + max_stamina=100.0, + pl=200.0, + mode_stack=["normal"], + x=2, + y=2, + location=zone, + prompt_template="{terrain} > ", + caps=ClientCaps(ansi=False), + ) + result = render_prompt(player) + assert result == ", > " + + +def test_terrain_variable_no_location(): + """Terrain variable shows 'unknown' when player has no location.""" + player = Player( + name="Test", + stamina=50.0, + max_stamina=100.0, + pl=200.0, + mode_stack=["normal"], + x=2, + y=2, + location=None, + prompt_template="{terrain} > ", + caps=ClientCaps(ansi=False), + ) + result = render_prompt(player) + assert result == "unknown > " + + +def test_paint_mode_prompt(): + """Paint mode uses paint template showing brush and SURVEYING.""" + player = Player( + name="Test", + stamina=50.0, + max_stamina=100.0, + pl=200.0, + mode_stack=["normal"], + paint_mode=True, + painting=False, + paint_brush=".", + x=10, + y=5, + caps=ClientCaps(ansi=False), + ) + result = render_prompt(player) + # Expected: <50%> <200/100> (10,5) [brush: .] SURVEYING + assert "<50%> <200/100> (10,5) [brush: .] SURVEYING " in result + + +def test_paint_mode_painting(): + """Paint mode shows PAINTING when painting is True.""" + player = Player( + name="Test", + stamina=50.0, + max_stamina=100.0, + pl=200.0, + mode_stack=["normal"], + paint_mode=True, + painting=True, + paint_brush=".", + x=10, + y=5, + caps=ClientCaps(ansi=False), + ) + result = render_prompt(player) + # Expected: <50%> <200/100> (10,5) [brush: .] PAINTING + assert "<50%> <200/100> (10,5) [brush: .] PAINTING " in result + + +def test_paint_mode_custom_brush(): + """Paint mode shows custom brush character.""" + player = Player( + name="Test", + stamina=50.0, + max_stamina=100.0, + pl=200.0, + mode_stack=["normal"], + paint_mode=True, + painting=False, + paint_brush="#", + x=10, + y=5, + caps=ClientCaps(ansi=False), + ) + result = render_prompt(player) + # Expected: <50%> <200/100> (10,5) [brush: #] SURVEYING + assert "[brush: #]" in result + + +def test_admin_normal_prompt(): + """Admin in normal mode shows coordinates and terrain.""" + from mudlib.zone import Zone + + terrain = [["." for _ in range(5)] for _ in range(5)] + zone = Zone( + name="testzone", + width=5, + height=5, + toroidal=True, + terrain=terrain, + impassable=set(), + ) + + player = Player( + name="Test", + stamina=50.0, + max_stamina=100.0, + pl=200.0, + mode_stack=["normal"], + is_admin=True, + x=12, + y=7, + location=zone, + caps=ClientCaps(ansi=False), + ) + result = render_prompt(player) + # Expected: <50%> <200/100> (12,7) grass + assert "<50%> <200/100> (12,7) grass " in result + + +def test_admin_combat_prompt(): + """Admin in combat shows coords after opponent.""" + player = Player( + name="Test", + stamina=50.0, + max_stamina=100.0, + pl=200.0, + mode_stack=["normal", "combat"], + is_admin=True, + x=12, + y=7, + caps=ClientCaps(ansi=False), + ) + opponent = Entity(name="Enemy", pl=150.0) + + encounter = CombatEncounter(attacker=player, defender=opponent) + active_encounters.append(encounter) + + result = render_prompt(player) + # Expected: <50%> <200/100> vs Enemy > (12,7) + assert "<50%> <200/100> vs Enemy > (12,7) " in result + + +def test_admin_with_custom_template(): + """Admin with custom template uses custom template over admin default.""" + player = Player( + name="Test", + stamina=50.0, + max_stamina=100.0, + pl=200.0, + mode_stack=["normal"], + is_admin=True, + x=12, + y=7, + prompt_template="[custom] > ", + caps=ClientCaps(ansi=False), + ) + result = render_prompt(player) + assert result == "[custom] > " + + +def test_paint_mode_overrides_admin(): + """Paint mode template takes precedence over admin template.""" + player = Player( + name="Test", + stamina=50.0, + max_stamina=100.0, + pl=200.0, + mode_stack=["normal"], + is_admin=True, + paint_mode=True, + painting=False, + paint_brush=".", + x=10, + y=5, + caps=ClientCaps(ansi=False), + ) + result = render_prompt(player) + # Should use paint template, not admin template + assert "[brush: .]" in result + assert "SURVEYING" in result + + +def test_paint_brush_variable_in_custom_template(): + """Paint brush variable works in custom template.""" + player = Player( + name="Test", + stamina=50.0, + max_stamina=100.0, + pl=200.0, + mode_stack=["normal"], + paint_brush="#", + prompt_template="brush={paint_brush} > ", + caps=ClientCaps(ansi=False), + ) + result = render_prompt(player) + assert result == "brush=# > " + + +def test_paint_state_variable_in_custom_template(): + """Paint state variable works in custom template.""" + player = Player( + name="Test", + stamina=50.0, + max_stamina=100.0, + pl=200.0, + mode_stack=["normal"], + painting=False, + prompt_template="state={paint_state} > ", + caps=ClientCaps(ansi=False), + ) + result = render_prompt(player) + assert result == "state=SURVEYING > "