McRogueFace/tests/unit/alignment_test.py

216 lines
7.2 KiB
Python
Raw Normal View History

"""Test the alignment system for UIDrawable elements."""
import mcrfpy
import sys
# Test 1: Check Alignment enum exists and has expected values
print("Test 1: Checking Alignment enum...")
try:
assert hasattr(mcrfpy, 'Alignment'), "Alignment enum not found"
# Check all alignment values exist
expected_alignments = [
'TOP_LEFT', 'TOP_CENTER', 'TOP_RIGHT',
'CENTER_LEFT', 'CENTER', 'CENTER_RIGHT',
'BOTTOM_LEFT', 'BOTTOM_CENTER', 'BOTTOM_RIGHT'
]
for name in expected_alignments:
assert hasattr(mcrfpy.Alignment, name), f"Alignment.{name} not found"
print(" PASS: Alignment enum has all expected values")
except Exception as e:
print(f" FAIL: {e}")
sys.exit(1)
# Test 2: Check that align property exists on Frame
print("Test 2: Checking align property on Frame...")
try:
frame = mcrfpy.Frame(pos=(100, 100), size=(200, 200))
# Default alignment should be None
assert frame.align is None, f"Expected align=None, got {frame.align}"
# Set alignment
frame.align = mcrfpy.Alignment.CENTER
assert frame.align == mcrfpy.Alignment.CENTER, f"Expected CENTER, got {frame.align}"
# Set back to None
frame.align = None
assert frame.align is None, f"Expected None, got {frame.align}"
print(" PASS: align property works on Frame")
except Exception as e:
print(f" FAIL: {e}")
sys.exit(1)
# Test 3: Check margin properties exist
print("Test 3: Checking margin properties...")
try:
frame = mcrfpy.Frame(pos=(0, 0), size=(100, 100))
# Check default margins:
# - margin returns 0 when both horiz/vert are unset (effective default)
# - horiz_margin/vert_margin return -1 (sentinel for "not set")
assert frame.margin == 0.0, f"Expected margin=0 (effective default), got {frame.margin}"
assert frame.horiz_margin == -1.0, f"Expected horiz_margin=-1 (unset), got {frame.horiz_margin}"
assert frame.vert_margin == -1.0, f"Expected vert_margin=-1 (unset), got {frame.vert_margin}"
# Set margins when no alignment
frame.margin = 10.0
assert frame.margin == 10.0, f"Expected margin=10, got {frame.margin}"
print(" PASS: margin properties exist and can be set")
except Exception as e:
print(f" FAIL: {e}")
sys.exit(1)
# Test 4: Check alignment auto-positioning
print("Test 4: Checking alignment auto-positioning...")
try:
# Create parent frame
parent = mcrfpy.Frame(pos=(0, 0), size=(200, 200))
# Create child with CENTER alignment
child = mcrfpy.Frame(pos=(0, 0), size=(50, 50))
child.align = mcrfpy.Alignment.CENTER
# Add to parent - should trigger alignment
parent.children.append(child)
# Child should be centered: (200-50)/2 = 75
expected_x = 75.0
expected_y = 75.0
assert abs(child.x - expected_x) < 0.1, f"Expected x={expected_x}, got {child.x}"
assert abs(child.y - expected_y) < 0.1, f"Expected y={expected_y}, got {child.y}"
print(" PASS: CENTER alignment positions child correctly")
except Exception as e:
print(f" FAIL: {e}")
sys.exit(1)
# Test 5: Check TOP_LEFT with margin
print("Test 5: Checking TOP_LEFT alignment with margin...")
try:
parent = mcrfpy.Frame(pos=(0, 0), size=(200, 200))
child = mcrfpy.Frame(pos=(999, 999), size=(50, 50)) # Start at wrong position
child.align = mcrfpy.Alignment.TOP_LEFT
child.margin = 10.0
parent.children.append(child)
# Child should be at (10, 10)
assert abs(child.x - 10.0) < 0.1, f"Expected x=10, got {child.x}"
assert abs(child.y - 10.0) < 0.1, f"Expected y=10, got {child.y}"
print(" PASS: TOP_LEFT with margin positions correctly")
except Exception as e:
print(f" FAIL: {e}")
sys.exit(1)
# Test 6: Check BOTTOM_RIGHT alignment
print("Test 6: Checking BOTTOM_RIGHT alignment...")
try:
parent = mcrfpy.Frame(pos=(0, 0), size=(200, 200))
child = mcrfpy.Frame(pos=(0, 0), size=(50, 50))
child.align = mcrfpy.Alignment.BOTTOM_RIGHT
child.margin = 5.0
parent.children.append(child)
# Child should be at (200-50-5, 200-50-5) = (145, 145)
expected_x = 145.0
expected_y = 145.0
assert abs(child.x - expected_x) < 0.1, f"Expected x={expected_x}, got {child.x}"
assert abs(child.y - expected_y) < 0.1, f"Expected y={expected_y}, got {child.y}"
print(" PASS: BOTTOM_RIGHT with margin positions correctly")
except Exception as e:
print(f" FAIL: {e}")
sys.exit(1)
# Test 7: Check resize propagation
print("Test 7: Checking resize propagation to children...")
try:
parent = mcrfpy.Frame(pos=(0, 0), size=(200, 200))
child = mcrfpy.Frame(pos=(0, 0), size=(50, 50))
child.align = mcrfpy.Alignment.CENTER
parent.children.append(child)
# Initial position check
assert abs(child.x - 75.0) < 0.1, f"Initial x should be 75, got {child.x}"
# Resize parent
parent.w = 300
parent.h = 300
# Child should be re-centered: (300-50)/2 = 125
expected_x = 125.0
expected_y = 125.0
assert abs(child.x - expected_x) < 0.1, f"After resize, expected x={expected_x}, got {child.x}"
assert abs(child.y - expected_y) < 0.1, f"After resize, expected y={expected_y}, got {child.y}"
print(" PASS: Resize propagates to aligned children")
except Exception as e:
print(f" FAIL: {e}")
sys.exit(1)
# Test 8: Check that align=None freezes position
print("Test 8: Checking that align=None freezes position...")
try:
parent = mcrfpy.Frame(pos=(0, 0), size=(200, 200))
child = mcrfpy.Frame(pos=(0, 0), size=(50, 50))
child.align = mcrfpy.Alignment.CENTER
parent.children.append(child)
centered_x = child.x
centered_y = child.y
# Disable alignment
child.align = None
# Resize parent
parent.w = 400
parent.h = 400
# Position should NOT change
assert abs(child.x - centered_x) < 0.1, f"Position should be frozen at {centered_x}, got {child.x}"
assert abs(child.y - centered_y) < 0.1, f"Position should be frozen at {centered_y}, got {child.y}"
print(" PASS: align=None freezes position")
except Exception as e:
print(f" FAIL: {e}")
sys.exit(1)
# Test 9: Check CENTER alignment rejects margins
print("Test 9: Checking CENTER alignment rejects margins...")
try:
frame = mcrfpy.Frame(pos=(0, 0), size=(50, 50))
frame.align = mcrfpy.Alignment.CENTER
# Setting margin on CENTER should raise ValueError
try:
frame.margin = 10.0
print(" FAIL: Expected ValueError for margin with CENTER alignment")
sys.exit(1)
except ValueError as e:
pass # Expected
print(" PASS: CENTER alignment correctly rejects margin")
except Exception as e:
print(f" FAIL: {e}")
sys.exit(1)
# Test 10: Check alignment on other drawable types
print("Test 10: Checking alignment on Caption...")
try:
parent = mcrfpy.Frame(pos=(0, 0), size=(200, 100))
caption = mcrfpy.Caption(text="Test", pos=(0, 0))
caption.align = mcrfpy.Alignment.CENTER
parent.children.append(caption)
# Caption should be roughly centered (exact position depends on text size)
# Just verify it was moved from (0,0)
assert caption.x > 0 or caption.y > 0, "Caption should have been repositioned"
print(" PASS: Caption supports alignment")
except Exception as e:
print(f" FAIL: {e}")
sys.exit(1)
print("\n" + "=" * 40)
print("All alignment tests PASSED!")
print("=" * 40)
sys.exit(0)