McRogueFace/tests/run_issue_tests.py

174 lines
5.6 KiB
Python
Executable File

#!/usr/bin/env python3
"""
Test runner for high-priority McRogueFace issues
This script runs comprehensive tests for the highest priority bugs that can be fixed rapidly.
Each test is designed to fail initially (demonstrating the bug) and pass after the fix.
"""
import os
import sys
import subprocess
import time
# Test configurations
TESTS = [
{
"issue": "37",
"name": "Windows scripts subdirectory bug",
"script": "issue_37_windows_scripts_comprehensive_test.py",
"needs_game_loop": False,
"description": "Tests script loading from different working directories"
},
{
"issue": "76",
"name": "UIEntityCollection returns wrong type",
"script": "issue_76_uientitycollection_type_test.py",
"needs_game_loop": True,
"description": "Tests type preservation for derived Entity classes in collections"
},
{
"issue": "9",
"name": "RenderTexture resize bug",
"script": "issue_9_rendertexture_resize_test.py",
"needs_game_loop": True,
"description": "Tests UIGrid rendering with sizes beyond 1920x1080"
},
{
"issue": "26/28",
"name": "Iterator implementation for collections",
"script": "issue_26_28_iterator_comprehensive_test.py",
"needs_game_loop": True,
"description": "Tests Python sequence protocol for UI collections"
}
]
def run_test(test_config, mcrogueface_path):
"""Run a single test and return the result"""
script_path = os.path.join(os.path.dirname(__file__), test_config["script"])
if not os.path.exists(script_path):
return f"SKIP - Test script not found: {script_path}"
print(f"\n{'='*60}")
print(f"Running test for Issue #{test_config['issue']}: {test_config['name']}")
print(f"Description: {test_config['description']}")
print(f"Script: {test_config['script']}")
print(f"{'='*60}\n")
if test_config["needs_game_loop"]:
# Run with game loop using --exec
cmd = [mcrogueface_path, "--headless", "--exec", script_path]
else:
# Run directly as Python script
cmd = [sys.executable, script_path]
try:
start_time = time.time()
result = subprocess.run(
cmd,
capture_output=True,
text=True,
timeout=30 # 30 second timeout
)
elapsed = time.time() - start_time
# Check for pass/fail in output
output = result.stdout + result.stderr
if "PASS" in output and "FAIL" not in output:
status = "PASS"
elif "FAIL" in output:
status = "FAIL"
else:
status = "UNKNOWN"
# Look for specific bug indicators
bug_found = False
if test_config["issue"] == "37" and "Script not loaded from different directory" in output:
bug_found = True
elif test_config["issue"] == "76" and "type lost!" in output:
bug_found = True
elif test_config["issue"] == "9" and "clipped at 1920x1080" in output:
bug_found = True
elif test_config["issue"] == "26/28" and "not implemented" in output:
bug_found = True
return {
"status": status,
"bug_found": bug_found,
"elapsed": elapsed,
"output": output if len(output) < 1000 else output[:1000] + "\n... (truncated)"
}
except subprocess.TimeoutExpired:
return {
"status": "TIMEOUT",
"bug_found": False,
"elapsed": 30,
"output": "Test timed out after 30 seconds"
}
except Exception as e:
return {
"status": "ERROR",
"bug_found": False,
"elapsed": 0,
"output": str(e)
}
def main():
"""Run all tests and provide summary"""
# Find mcrogueface executable
build_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), "build")
mcrogueface_path = os.path.join(build_dir, "mcrogueface")
if not os.path.exists(mcrogueface_path):
print(f"ERROR: mcrogueface executable not found at {mcrogueface_path}")
print("Please build the project first with 'make'")
return 1
print("McRogueFace Issue Test Suite")
print(f"Executable: {mcrogueface_path}")
print(f"Running {len(TESTS)} tests...\n")
results = []
for test in TESTS:
result = run_test(test, mcrogueface_path)
results.append((test, result))
# Summary
print(f"\n{'='*60}")
print("TEST SUMMARY")
print(f"{'='*60}\n")
bugs_found = 0
tests_passed = 0
for test, result in results:
if isinstance(result, str):
print(f"Issue #{test['issue']}: {result}")
else:
status_str = result['status']
if result['bug_found']:
status_str += " (BUG CONFIRMED)"
bugs_found += 1
elif result['status'] == 'PASS':
tests_passed += 1
print(f"Issue #{test['issue']}: {status_str} ({result['elapsed']:.2f}s)")
if result['status'] not in ['PASS', 'UNKNOWN']:
print(f" Details: {result['output'].splitlines()[0] if result['output'] else 'No output'}")
print(f"\nBugs confirmed: {bugs_found}/{len(TESTS)}")
print(f"Tests passed: {tests_passed}/{len(TESTS)}")
if bugs_found > 0:
print("\nThese tests demonstrate bugs that need fixing.")
print("After fixing, the tests should pass instead of confirming bugs.")
return 0
if __name__ == "__main__":
sys.exit(main())