McRogueFace/tests/regression/issue_180_timer_stopped_test.py
John McCardle 165db91b8d Organize test suite: add README, move loose tests to proper directories
- Add tests/README.md documenting test structure and usage
- Move issue_*_test.py files to tests/regression/ (9 files)
- Move loose test_*.py files to tests/unit/ (18 files)
- tests/ root now contains only pytest infrastructure

Addresses #166

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 21:34:22 -05:00

83 lines
2.3 KiB
Python

"""Test for issue #180: Stopped timers with user reference should stay alive.
This test verifies that:
1. A stopped timer with a user reference remains accessible
2. A stopped timer can be restarted
3. A stopped timer without references is properly cleaned up
"""
import mcrfpy
import gc
import sys
fire_count = 0
def on_timer(timer, runtime):
"""Timer callback."""
global fire_count
fire_count += 1
print(f"Timer fired! count={fire_count}")
# Set up test scene
scene = mcrfpy.Scene("test")
mcrfpy.current_scene = scene
print("=== Test 1: Stopped timer with reference stays alive ===")
# Create timer and keep reference
my_timer = mcrfpy.Timer("kept_timer", on_timer, 50)
print(f"Created timer: {my_timer.name}, active={my_timer.active}")
# Advance time to fire once
mcrfpy.step(60)
print(f"After step: fire_count={fire_count}")
# Stop the timer
my_timer.stop()
print(f"Stopped timer: active={my_timer.active}, stopped={my_timer.stopped}")
# Timer should NOT be in mcrfpy.timers (it's stopped)
timers = mcrfpy.timers
timer_names = [t.name for t in timers]
print(f"Timers after stop: {timer_names}")
if "kept_timer" in timer_names:
print("Note: Stopped timer still in mcrfpy.timers (expected - it was accessed)")
# But we should still have our reference and can restart
print(f"Our reference still valid: {my_timer.name}")
my_timer.restart()
print(f"Restarted timer: active={my_timer.active}")
# Advance time and verify it fires again
old_count = fire_count
mcrfpy.step(60)
print(f"After restart step: fire_count={fire_count}")
if fire_count <= old_count:
print("FAIL: Restarted timer didn't fire")
sys.exit(1)
print("\n=== Test 2: Stopped timer without reference is cleaned up ===")
# Create another timer, stop it, and lose the reference
temp_timer = mcrfpy.Timer("temp_timer", on_timer, 50)
temp_timer.stop()
print(f"Created and stopped temp_timer")
# Clear reference and GC
del temp_timer
gc.collect()
# The timer should be gone (stopped + no reference = GC'd)
timers = mcrfpy.timers
timer_names = [t.name for t in timers]
print(f"Timers after del+GC: {timer_names}")
# Note: temp_timer might still be there if it was retrieved before - that's OK
# The key test is that it WON'T fire since it's stopped
# Clean up
my_timer.stop()
print("\nPASS: Timer lifecycle works correctly")
sys.exit(0)