mud/tests/test_score_command.py
Jared Miller 085a19a564
Add score command with stats display
Shows PL, stamina, K/D ratio, time played, and unlocked moves.
Registered as score/stats/profile, available in all modes.
2026-02-14 11:40:45 -05:00

99 lines
3.1 KiB
Python

"""Tests for the score/stats/profile command."""
import pytest
from mudlib.commands.score import cmd_score
@pytest.mark.asyncio
async def test_score_shows_player_name(player, mock_writer):
"""Score command displays the player's name."""
player.name = "Goku"
await cmd_score(player, "")
messages = [call[0][0] for call in player.writer.write.call_args_list]
output = "".join(messages)
assert "Goku" in output
@pytest.mark.asyncio
async def test_score_shows_pl_and_stamina(player, mock_writer):
"""Score command displays PL and stamina gauges."""
player.pl = 75
player.max_pl = 100
player.stamina = 80
player.max_stamina = 100
await cmd_score(player, "")
messages = [call[0][0] for call in player.writer.write.call_args_list]
output = "".join(messages)
assert "75" in output
assert "100" in output
assert "80" in output
@pytest.mark.asyncio
async def test_score_shows_kill_death_stats(player, mock_writer):
"""Score command displays kills, deaths, and K/D ratio."""
player.kills = 10
player.deaths = 2
await cmd_score(player, "")
messages = [call[0][0] for call in player.writer.write.call_args_list]
output = "".join(messages)
assert "10" in output # kills
assert "2" in output # deaths
assert "5.0" in output # K/D ratio
@pytest.mark.asyncio
async def test_score_shows_kd_ratio_na_with_zero_deaths(player, mock_writer):
"""Score command shows N/A for K/D ratio when deaths is zero."""
player.kills = 5
player.deaths = 0
await cmd_score(player, "")
messages = [call[0][0] for call in player.writer.write.call_args_list]
output = "".join(messages)
assert "N/A" in output
@pytest.mark.asyncio
async def test_score_shows_time_played(player, mock_writer):
"""Score command formats and displays play time."""
player.play_time_seconds = 3661 # 1h 1m 1s
player.session_start = 0 # No active session
await cmd_score(player, "")
messages = [call[0][0] for call in player.writer.write.call_args_list]
output = "".join(messages)
assert "1h" in output
assert "1m" in output
assert "1s" in output
@pytest.mark.asyncio
async def test_score_shows_unlocked_moves(player, mock_writer):
"""Score command displays unlocked moves."""
player.unlocked_moves = {"roundhouse", "sweep"}
await cmd_score(player, "")
messages = [call[0][0] for call in player.writer.write.call_args_list]
output = "".join(messages)
assert "roundhouse" in output
assert "sweep" in output
@pytest.mark.asyncio
async def test_command_registered_with_aliases(player, mock_writer):
"""Score command is accessible via score, stats, and profile."""
from mudlib.commands import CommandDefinition, resolve_prefix
score_cmd = resolve_prefix("score")
stats_cmd = resolve_prefix("stats")
profile_cmd = resolve_prefix("profile")
assert isinstance(score_cmd, CommandDefinition)
assert isinstance(stats_cmd, CommandDefinition)
assert isinstance(profile_cmd, CommandDefinition)
assert score_cmd.handler == stats_cmd.handler == profile_cmd.handler