kills, deaths, mob_kills dict, play_time_seconds, unlocked_moves set on Player. New player_stats SQLite table with save/load functions.
86 lines
2.7 KiB
Python
86 lines
2.7 KiB
Python
"""Tests for stats loading on login and session_start initialization."""
|
|
|
|
import time
|
|
|
|
import pytest
|
|
|
|
from mudlib.player import Player, accumulate_play_time
|
|
from mudlib.store import init_db, load_player_stats, save_player
|
|
|
|
|
|
@pytest.fixture
|
|
def db(tmp_path):
|
|
"""Create a temporary test database."""
|
|
db_path = tmp_path / "test.db"
|
|
init_db(db_path)
|
|
return db_path
|
|
|
|
|
|
def test_stats_load_and_apply_round_trip(db, mock_reader, mock_writer, test_zone):
|
|
"""Stats can be saved, loaded, and applied to a new player instance."""
|
|
# Create player with known stats
|
|
p1 = Player(name="Ken", x=0, y=0, reader=mock_reader, writer=mock_writer)
|
|
p1.location = test_zone
|
|
p1.kills = 5
|
|
p1.deaths = 2
|
|
p1.mob_kills = {"goblin": 3}
|
|
p1.play_time_seconds = 1000.0
|
|
p1.unlocked_moves = {"roundhouse"}
|
|
|
|
# Save the player (which saves stats internally)
|
|
save_player(p1)
|
|
|
|
# Load stats from database
|
|
stats = load_player_stats("Ken", db)
|
|
|
|
# Create a new player instance and apply loaded stats
|
|
p2 = Player(name="Ken", x=0, y=0, reader=mock_reader, writer=mock_writer)
|
|
p2.location = test_zone
|
|
p2.kills = stats["kills"]
|
|
p2.deaths = stats["deaths"]
|
|
p2.mob_kills = stats["mob_kills"]
|
|
p2.play_time_seconds = stats["play_time_seconds"]
|
|
p2.unlocked_moves = stats["unlocked_moves"]
|
|
|
|
# Verify all stats match
|
|
assert p2.kills == 5
|
|
assert p2.deaths == 2
|
|
assert p2.mob_kills == {"goblin": 3}
|
|
assert p2.play_time_seconds == 1000.0
|
|
assert p2.unlocked_moves == {"roundhouse"}
|
|
|
|
|
|
def test_session_start_set_after_login_setup(mock_reader, mock_writer, test_zone):
|
|
"""session_start is set to non-zero after login setup."""
|
|
# Simulate login setup
|
|
p = Player(name="Ryu", x=0, y=0, reader=mock_reader, writer=mock_writer)
|
|
p.location = test_zone
|
|
|
|
# Set session_start (this is what server.py does)
|
|
p.session_start = time.monotonic()
|
|
|
|
# Verify it's non-zero
|
|
assert p.session_start > 0
|
|
|
|
|
|
def test_accumulate_play_time_with_real_session_start(
|
|
mock_reader, mock_writer, test_zone
|
|
):
|
|
"""accumulate_play_time works correctly with real session_start."""
|
|
p = Player(name="Chun", x=0, y=0, reader=mock_reader, writer=mock_writer)
|
|
p.location = test_zone
|
|
p.play_time_seconds = 100.0
|
|
|
|
# Set session_start to 60 seconds ago (simulating 60 seconds of play)
|
|
p.session_start = time.monotonic() - 60.0
|
|
|
|
# Accumulate play time
|
|
accumulate_play_time(p)
|
|
|
|
# Play time should have increased by approximately 60 seconds
|
|
assert p.play_time_seconds >= 159.0
|
|
assert p.play_time_seconds <= 161.0
|
|
|
|
# session_start should be reset to current time
|
|
assert p.session_start > 0
|
|
assert time.monotonic() - p.session_start < 1.0
|