fixing leveling xp reporting

This commit is contained in:
2025-11-30 18:20:40 -06:00
parent 805d04cf4e
commit 70b2b0f124
6 changed files with 131 additions and 12 deletions

View File

@@ -324,6 +324,7 @@ def test_add_experience_no_level_up(basic_character):
assert leveled_up == False
assert basic_character.level == 1
assert basic_character.experience == 50
assert basic_character.total_xp == 50 # Cumulative XP tracked
def test_add_experience_with_level_up(basic_character):
@@ -333,7 +334,8 @@ def test_add_experience_with_level_up(basic_character):
assert leveled_up == True
assert basic_character.level == 2
assert basic_character.experience == 0 # Reset
assert basic_character.experience == 0 # Current level progress resets
assert basic_character.total_xp == 100 # Cumulative XP preserved
def test_add_experience_with_overflow(basic_character):
@@ -343,7 +345,48 @@ def test_add_experience_with_overflow(basic_character):
assert leveled_up == True
assert basic_character.level == 2
assert basic_character.experience == 50 # Overflow
assert basic_character.experience == 50 # Overflow preserved
assert basic_character.total_xp == 150 # All XP tracked cumulatively
def test_xp_to_next_level_property(basic_character):
"""Test xp_to_next_level property calculation."""
# At level 1 with 0 XP, need 100 to level up
assert basic_character.xp_to_next_level == 100
# Add 30 XP
basic_character.add_experience(30)
assert basic_character.xp_to_next_level == 70 # 100 - 30
# Add 70 more to level up
basic_character.add_experience(70)
assert basic_character.level == 2
assert basic_character.experience == 0
# At level 2, need 282 XP to level up
assert basic_character.xp_to_next_level == 282
def test_total_xp_never_decreases(basic_character):
"""Test that total_xp is cumulative and never decreases."""
# Start at 0
assert basic_character.total_xp == 0
# Add XP multiple times
basic_character.add_experience(50)
assert basic_character.total_xp == 50
basic_character.add_experience(50)
assert basic_character.total_xp == 100
# Should have leveled up to level 2
assert basic_character.level == 2
assert basic_character.experience == 0 # Current progress reset
# Add more XP
basic_character.add_experience(100)
assert basic_character.total_xp == 200 # Still cumulative
# Even though experience resets on level-up, total_xp keeps growing
assert basic_character.total_xp >= basic_character.experience
def test_xp_calculation(basic_origin):
@@ -386,6 +429,7 @@ def test_character_serialization(basic_character):
basic_character.gold = 500
basic_character.level = 3
basic_character.experience = 100
basic_character.total_xp = 500 # Manually set for test
data = basic_character.to_dict()
@@ -394,7 +438,13 @@ def test_character_serialization(basic_character):
assert data["name"] == "Test Hero"
assert data["level"] == 3
assert data["experience"] == 100
assert data["total_xp"] == 500
assert data["gold"] == 500
# Check computed fields
assert "xp_to_next_level" in data
assert "xp_required_for_next_level" in data
assert data["xp_required_for_next_level"] == 519 # Level 3 requires 519 XP
assert data["xp_to_next_level"] == 419 # 519 - 100
def test_character_deserialization(basic_player_class, basic_origin):

View File

@@ -636,7 +636,15 @@ class TestRewardsCalculation:
# Mock loot service to return mock items
mock_item = Mock()
mock_item.to_dict.return_value = {"item_id": "sword", "quantity": 1}
mock_item.to_dict.return_value = {
"item_id": "test_sword",
"name": "Test Sword",
"item_type": "weapon",
"rarity": "common",
"description": "A test sword",
"value": 10,
"damage": 5,
}
service.loot_service.generate_loot_from_enemy.return_value = [mock_item]
mock_session = Mock()
@@ -647,6 +655,7 @@ class TestRewardsCalculation:
mock_char.level = 1
mock_char.experience = 0
mock_char.gold = 0
mock_char.add_item = Mock() # Mock the add_item method
service.character_service.get_character.return_value = mock_char
service.character_service.update_character = Mock()
@@ -655,3 +664,6 @@ class TestRewardsCalculation:
assert rewards.experience == 50
assert rewards.gold == 25
assert len(rewards.items) == 1
# Verify items were added to character inventory
assert mock_char.add_item.called, "Items should be added to character inventory"
assert mock_char.add_item.call_count == 1, "Should add 1 item to inventory"