McRogueFace/tests/unit/test_grid_constructor_bug.py

124 lines
3.6 KiB
Python

#!/usr/bin/env python3
"""Test Grid constructor to isolate the PyArg bug"""
import mcrfpy
import sys
print("Testing Grid constructor PyArg bug...")
print("=" * 50)
# Test 1: Check if exception is set after Grid creation
print("Test 1: Check exception state after Grid creation")
try:
# Clear any existing exception
sys.exc_clear() if hasattr(sys, 'exc_clear') else None
# Create grid with problematic dimensions
print(" Creating Grid(grid_x=25, grid_y=15)...")
grid = mcrfpy.Grid(grid_x=25, grid_y=15)
print(" Grid created successfully")
# Check if there's a pending exception
exc = sys.exc_info()
if exc[0] is not None:
print(f" ⚠️ Pending exception detected: {exc}")
# Try to trigger the error
print(" Calling range(1)...")
for i in range(1):
pass
print(" ✓ range(1) worked")
except Exception as e:
print(f" ✗ Exception: {type(e).__name__}: {e}")
print()
# Test 2: Try different Grid constructor patterns
print("Test 2: Different Grid constructor calls")
# Pattern 1: Positional arguments
try:
print(" Trying Grid(25, 15)...")
grid1 = mcrfpy.Grid(25, 15)
for i in range(1): pass
print(" ✓ Positional args worked")
except Exception as e:
print(f" ✗ Positional args failed: {e}")
# Pattern 2: Different size
try:
print(" Trying Grid(grid_x=24, grid_y=15)...")
grid2 = mcrfpy.Grid(grid_x=24, grid_y=15)
for i in range(1): pass
print(" ✓ Size 24x15 worked")
except Exception as e:
print(f" ✗ Size 24x15 failed: {e}")
# Pattern 3: Check if it's specifically 25
try:
print(" Trying Grid(grid_x=26, grid_y=15)...")
grid3 = mcrfpy.Grid(grid_x=26, grid_y=15)
for i in range(1): pass
print(" ✓ Size 26x15 worked")
except Exception as e:
print(f" ✗ Size 26x15 failed: {e}")
print()
# Test 3: Isolate the exact problem
print("Test 3: Isolating the problem")
def test_grid_creation(x, y):
"""Test creating a grid and immediately using range()"""
try:
grid = mcrfpy.Grid(grid_x=x, grid_y=y)
# Immediately test if exception is pending
list(range(1))
return True, "Success"
except Exception as e:
return False, f"{type(e).__name__}: {e}"
# Test various sizes
test_sizes = [(10, 10), (20, 20), (24, 15), (25, 14), (25, 15), (25, 16), (30, 30)]
for x, y in test_sizes:
success, msg = test_grid_creation(x, y)
if success:
print(f" Grid({x}, {y}): ✓")
else:
print(f" Grid({x}, {y}): ✗ {msg}")
print()
# Test 4: See if we can clear the exception
print("Test 4: Exception clearing")
try:
# Create the problematic grid
grid = mcrfpy.Grid(grid_x=25, grid_y=15)
print(" Created Grid(25, 15)")
# Try to clear any pending exception
try:
# This should fail if there's a pending exception
list(range(1))
print(" No pending exception!")
except:
print(" ⚠️ Pending exception detected")
# Clear it
sys.exc_clear() if hasattr(sys, 'exc_clear') else None
# Try again
try:
list(range(1))
print(" ✓ Exception cleared, range() works now")
except:
print(" ✗ Exception persists")
except Exception as e:
print(f" ✗ Failed: {e}")
print()
print("Conclusion: The Grid constructor is setting a Python exception")
print("but not properly returning NULL to propagate it. This leaves")
print("the exception on the stack, causing the next Python operation")
print("to fail with the cryptic 'new style getargs format' error.")