extends RefCounted ## Tests for GCDTimer. Run headless via tests/run_all.gd var _test_failures := 0 func test_gcd_starts_ready() -> void: var gcd := GCDTimer.new(2.5) assert_true(gcd.is_ready(), "GCD should start ready") func test_gcd_blocks_immediate_reuse() -> void: var gcd := GCDTimer.new(2.5) assert_true(gcd.consume(), "First consume should succeed") assert_false(gcd.is_ready(), "GCD should not be ready after consume") assert_false(gcd.consume(), "Second consume should be blocked") func test_gcd_recovers_after_full_duration() -> void: var gcd := GCDTimer.new(2.5) gcd.consume() gcd.tick(1.0) assert_false(gcd.is_ready(), "Should not be ready at 1.0s") gcd.tick(1.5) assert_true(gcd.is_ready(), "Should be ready at 2.5s total") assert_true(gcd.consume(), "Should be able to consume after recovery") func test_gcd_queue_window() -> void: var gcd := GCDTimer.new(2.5) gcd.consume() gcd.tick(2.0) assert_false(gcd.is_in_queue_window(), "Not in queue window at 0.5s remaining") gcd.tick(0.3) assert_true(gcd.is_in_queue_window(), "Should be in queue window at 0.2s remaining") gcd.tick(0.3) assert_true(gcd.is_ready(), "Should be ready after full duration elapses") func test_gcd_progress() -> void: var gcd := GCDTimer.new(2.5) assert_almost(gcd.get_progress(), 1.0, "Progress should be 1.0 when ready") gcd.consume() assert_almost(gcd.get_progress(), 0.0, "Progress should be ~0.0 just after consume") gcd.tick(1.25) assert_almost(gcd.get_progress(), 0.5, "Progress should be 0.5 at half duration") func test_gcd_duration_modification() -> void: var gcd := GCDTimer.new(2.5) gcd.set_duration(2.0) assert_almost(gcd.get_total(), 2.0, "Duration should be updated") gcd.consume() gcd.tick(2.0) assert_true(gcd.is_ready(), "Should recover in new duration") func test_gcd_reset() -> void: var gcd := GCDTimer.new(2.5) gcd.consume() gcd.reset() assert_true(gcd.is_ready(), "Should be ready after reset") # --- Helper assertion methods (lightweight, no GUT dependency) --- 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_almost(value: float, expected: float, msg: String = "", tolerance: float = 0.01) -> void: if abs(value - expected) > tolerance: _test_failures += 1 push_error("ASSERT FAILED [almost %f != %f]: %s" % [value, expected, msg])