extends RefCounted ## Tests for GimmickGauges — all four class gimmicks. var _test_failures := 0 func test_aegis_build_and_spend() -> void: var g := GimmickGauges.new() assert_true(g.add_aegis(), "Should add first charge") assert_true(g.add_aegis(), "Should add second charge") assert_true(g.add_aegis(), "Should add third charge (max)") assert_false(g.add_aegis(), "Should not exceed max") assert_true(g.is_aegis_full(), "Should be at full aegis") var spent := g.spend_aegis() assert_eq(spent, 3, "Should spend all 3 charges") assert_eq(g.aegis_charges, 0, "Should be at 0 after spend") func test_lumen_charges_and_nova_multiplier() -> void: var g := GimmickGauges.new() assert_almost(g.get_nova_multiplier(), 1.0, "Uncharged = 1.0x") g.add_lumen() assert_almost(g.get_nova_multiplier(), 1.5, "1 charge = 1.5x") g.add_lumen() assert_almost(g.get_nova_multiplier(), 2.0, "2 charges = 2.0x") g.add_lumen() assert_almost(g.get_nova_multiplier(), 3.0, "3 charges = 3.0x") var spent := g.spend_lumen() assert_eq(spent, 3, "Should spend 3 lumens") assert_almost(g.get_nova_multiplier(), 1.0, "Back to 1.0x after spend") func test_momentum_build_reset_spend() -> void: var g := GimmickGauges.new() for i in 5: g.add_momentum() assert_true(g.is_momentum_full(), "Should be at max momentum") assert_false(g.add_momentum(), "Should not exceed max") # Taking damage resets it g.reset_momentum() assert_eq(g.momentum, 0, "Should be 0 after reset") # Rebuild and spend for i in 5: g.add_momentum() assert_true(g.spend_momentum(), "Should spend at max") assert_eq(g.momentum, 0, "Should be 0 after spend") func test_flux_build_and_piercing_bolt() -> void: var g := GimmickGauges.new() g.add_flux() g.add_flux() assert_false(g.try_piercing_bolt(), "Should not pierce at 2/3 flux") g.add_flux() assert_true(g.is_flux_full(), "Should be at max flux") assert_true(g.try_piercing_bolt(), "Should pierce at 3/3 flux") assert_eq(g.flux, 0, "Flux consumed after piercing bolt") # Damage resets flux g.add_flux() g.add_flux() g.reset_flux() assert_eq(g.flux, 0, "Flux reset to 0 on damage") func test_reset_all() -> void: var g := GimmickGauges.new() g.add_aegis() g.add_lumen() g.add_momentum() g.add_flux() g.reset_all() assert_eq(g.aegis_charges, 0, "Aegis reset") assert_eq(g.lumen_charges, 0, "Lumen reset") assert_eq(g.momentum, 0, "Momentum reset") assert_eq(g.flux, 0, "Flux reset") # --- Assertions --- func assert_true(condition: bool, msg: String = "") -> void: if not condition: _test_failures += 1 push_error("ASSERT FAILED [true]: " + msg) func assert_false(condition: bool, msg: String = "") -> void: if condition: _test_failures += 1 push_error("ASSERT FAILED [false]: " + 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]) func assert_almost(value: float, expected: float, msg: String = "", tolerance: float = 0.01) -> void: if abs(value - expected) > tolerance: _test_failures += 1 push_error("ASSERT FAILED [%f != %f]: %s" % [value, expected, msg])