extends RefCounted ## Tests for XPSystem — level curves, tier caps, XP awarding. var _test_failures := 0 func _make_test_tiers() -> Array[Dictionary]: return [ {"id": 1, "min_level": 1, "max_level": 5, "xp_per_encounter": [100, 150, 200, 300]}, {"id": 2, "min_level": 6, "max_level": 10, "xp_per_encounter": [200, 300, 400, 500]}, {"id": 3, "min_level": 11, "max_level": 15, "xp_per_encounter": [400, 500, 600, 800]} ] func test_starts_at_level_1() -> void: var xp := XPSystem.new() xp.load_tiers(_make_test_tiers()) assert_eq(xp.current_level, 1, "Should start at level 1") func test_xp_award_and_level_up() -> void: var xp := XPSystem.new() xp.load_tiers(_make_test_tiers()) # Enc 4 of Tier 1 gives 300 XP. Level 1→2 costs 80+0+0 = 80 XP. var result := xp.award_xp(1, 3) # encounter_index 3 = Enc 4 assert_eq(result["xp_gained"], 300, "Should gain 300 XP") assert_true(result["leveled_up"], "Should level up from 300 XP") assert_true(xp.current_level > 1, "Level should be > 1") func test_tier_cap_stops_xp() -> void: var xp := XPSystem.new() xp.load_tiers(_make_test_tiers()) # Grind until we hit the Tier 1 cap (level 5) for i in 50: xp.award_xp(1, 3) assert_true(xp.current_level <= 5, "Should not exceed tier cap of 5") # Further XP from Tier 1 should give 0 var result := xp.award_xp(1, 3) assert_eq(result["xp_gained"], 0, "No XP at tier cap") assert_true(result["tier_capped"], "Should report tier capped") func test_later_encounters_give_more_xp() -> void: var tiers := _make_test_tiers() var enc1_xp: int = tiers[0]["xp_per_encounter"][0] var enc4_xp: int = tiers[0]["xp_per_encounter"][3] assert_true(enc4_xp > enc1_xp, "Enc 4 should give more XP than Enc 1") func test_effective_level_capped_for_old_tier() -> void: var xp := XPSystem.new() xp.load_tiers(_make_test_tiers()) # Grind to level 10 (Tier 2 cap) for i in 100: xp.award_xp(2, 3) # Visiting Tier 1 should cap at level 5 var eff := xp.get_effective_level_for_tier(1) assert_eq(eff, 5, "Effective level for Tier 1 should be capped at 5") func test_xp_curve_increases() -> void: var xp_l1 := XPSystem.xp_for_level(1) var xp_l5 := XPSystem.xp_for_level(5) var xp_l10 := XPSystem.xp_for_level(10) assert_true(xp_l5 > xp_l1, "Level 5 should cost more XP than level 1") assert_true(xp_l10 > xp_l5, "Level 10 should cost more XP than level 5") # --- Assertions --- func assert_true(condition: bool, msg: String = "") -> void: if not condition: _test_failures += 1 push_error("ASSERT FAILED [true]: " + msg) func assert_eq(value: int, expected: int, msg: String = "") -> void: if value != expected: _test_failures += 1 push_error("ASSERT FAILED [%d != %d]: %s" % [value, expected, msg])