205 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			205 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Python
		
	
	
	
#!/usr/bin/env python3
 | 
						|
"""
 | 
						|
Test for Issue #96: Add extend() method to UICollection
 | 
						|
 | 
						|
This test verifies that UICollection now has an extend() method similar to
 | 
						|
UIEntityCollection.extend().
 | 
						|
"""
 | 
						|
 | 
						|
import mcrfpy
 | 
						|
import sys
 | 
						|
 | 
						|
def test_uicollection_extend():
 | 
						|
    """Test UICollection extend method"""
 | 
						|
    print("=== Testing UICollection extend() Method (Issue #96) ===\n")
 | 
						|
    
 | 
						|
    tests_passed = 0
 | 
						|
    tests_total = 0
 | 
						|
    
 | 
						|
    # Get scene UI collection
 | 
						|
    scene_ui = mcrfpy.sceneUI("test")
 | 
						|
    
 | 
						|
    # Test 1: Basic extend with list
 | 
						|
    print("--- Test 1: Extend with list ---")
 | 
						|
    tests_total += 1
 | 
						|
    try:
 | 
						|
        # Create a list of UI elements
 | 
						|
        elements = [
 | 
						|
            mcrfpy.Frame(10, 10, 100, 100),
 | 
						|
            mcrfpy.Caption((150, 50), "Test1", mcrfpy.Font("assets/JetbrainsMono.ttf")),
 | 
						|
            mcrfpy.Sprite(200, 100)
 | 
						|
        ]
 | 
						|
        
 | 
						|
        # Extend the collection
 | 
						|
        scene_ui.extend(elements)
 | 
						|
        
 | 
						|
        if len(scene_ui) == 3:
 | 
						|
            print("✓ PASS: Extended collection with 3 elements")
 | 
						|
            tests_passed += 1
 | 
						|
        else:
 | 
						|
            print(f"✗ FAIL: Expected 3 elements, got {len(scene_ui)}")
 | 
						|
    except Exception as e:
 | 
						|
        print(f"✗ FAIL: Error extending with list: {e}")
 | 
						|
    
 | 
						|
    # Test 2: Extend with tuple
 | 
						|
    print("\n--- Test 2: Extend with tuple ---")
 | 
						|
    tests_total += 1
 | 
						|
    try:
 | 
						|
        # Create a tuple of UI elements
 | 
						|
        more_elements = (
 | 
						|
            mcrfpy.Grid(10, 10),
 | 
						|
            mcrfpy.Frame(300, 10, 100, 100)
 | 
						|
        )
 | 
						|
        
 | 
						|
        # Extend the collection
 | 
						|
        scene_ui.extend(more_elements)
 | 
						|
        
 | 
						|
        if len(scene_ui) == 5:
 | 
						|
            print("✓ PASS: Extended collection with tuple (now 5 elements)")
 | 
						|
            tests_passed += 1
 | 
						|
        else:
 | 
						|
            print(f"✗ FAIL: Expected 5 elements, got {len(scene_ui)}")
 | 
						|
    except Exception as e:
 | 
						|
        print(f"✗ FAIL: Error extending with tuple: {e}")
 | 
						|
    
 | 
						|
    # Test 3: Extend with generator
 | 
						|
    print("\n--- Test 3: Extend with generator ---")
 | 
						|
    tests_total += 1
 | 
						|
    try:
 | 
						|
        # Create a generator of UI elements
 | 
						|
        def create_sprites():
 | 
						|
            for i in range(3):
 | 
						|
                yield mcrfpy.Sprite(50 + i*50, 200)
 | 
						|
        
 | 
						|
        # Extend with generator
 | 
						|
        scene_ui.extend(create_sprites())
 | 
						|
        
 | 
						|
        if len(scene_ui) == 8:
 | 
						|
            print("✓ PASS: Extended collection with generator (now 8 elements)")
 | 
						|
            tests_passed += 1
 | 
						|
        else:
 | 
						|
            print(f"✗ FAIL: Expected 8 elements, got {len(scene_ui)}")
 | 
						|
    except Exception as e:
 | 
						|
        print(f"✗ FAIL: Error extending with generator: {e}")
 | 
						|
    
 | 
						|
    # Test 4: Error handling - non-iterable
 | 
						|
    print("\n--- Test 4: Error handling - non-iterable ---")
 | 
						|
    tests_total += 1
 | 
						|
    try:
 | 
						|
        scene_ui.extend(42)  # Not iterable
 | 
						|
        print("✗ FAIL: Should have raised TypeError for non-iterable")
 | 
						|
    except TypeError as e:
 | 
						|
        print(f"✓ PASS: Correctly raised TypeError: {e}")
 | 
						|
        tests_passed += 1
 | 
						|
    except Exception as e:
 | 
						|
        print(f"✗ FAIL: Wrong exception type: {e}")
 | 
						|
    
 | 
						|
    # Test 5: Error handling - wrong element type
 | 
						|
    print("\n--- Test 5: Error handling - wrong element type ---")
 | 
						|
    tests_total += 1
 | 
						|
    try:
 | 
						|
        scene_ui.extend([1, 2, 3])  # Wrong types
 | 
						|
        print("✗ FAIL: Should have raised TypeError for non-UIDrawable elements")
 | 
						|
    except TypeError as e:
 | 
						|
        print(f"✓ PASS: Correctly raised TypeError: {e}")
 | 
						|
        tests_passed += 1
 | 
						|
    except Exception as e:
 | 
						|
        print(f"✗ FAIL: Wrong exception type: {e}")
 | 
						|
    
 | 
						|
    # Test 6: Extend empty iterable
 | 
						|
    print("\n--- Test 6: Extend with empty list ---")
 | 
						|
    tests_total += 1
 | 
						|
    try:
 | 
						|
        initial_len = len(scene_ui)
 | 
						|
        scene_ui.extend([])  # Empty list
 | 
						|
        
 | 
						|
        if len(scene_ui) == initial_len:
 | 
						|
            print("✓ PASS: Extending with empty list works correctly")
 | 
						|
            tests_passed += 1
 | 
						|
        else:
 | 
						|
            print(f"✗ FAIL: Length changed from {initial_len} to {len(scene_ui)}")
 | 
						|
    except Exception as e:
 | 
						|
        print(f"✗ FAIL: Error extending with empty list: {e}")
 | 
						|
    
 | 
						|
    # Test 7: Z-index ordering
 | 
						|
    print("\n--- Test 7: Z-index ordering ---")
 | 
						|
    tests_total += 1
 | 
						|
    try:
 | 
						|
        # Clear and add fresh elements
 | 
						|
        while len(scene_ui) > 0:
 | 
						|
            scene_ui.remove(0)
 | 
						|
        
 | 
						|
        # Add some initial elements
 | 
						|
        frame1 = mcrfpy.Frame(0, 0, 50, 50)
 | 
						|
        scene_ui.append(frame1)
 | 
						|
        
 | 
						|
        # Extend with more elements
 | 
						|
        new_elements = [
 | 
						|
            mcrfpy.Frame(60, 0, 50, 50),
 | 
						|
            mcrfpy.Caption((120, 25), "Test", mcrfpy.Font("assets/JetbrainsMono.ttf"))
 | 
						|
        ]
 | 
						|
        scene_ui.extend(new_elements)
 | 
						|
        
 | 
						|
        # Check z-indices are properly assigned
 | 
						|
        z_indices = [scene_ui[i].z_index for i in range(3)]
 | 
						|
        
 | 
						|
        # Z-indices should be increasing
 | 
						|
        if z_indices[0] < z_indices[1] < z_indices[2]:
 | 
						|
            print(f"✓ PASS: Z-indices properly ordered: {z_indices}")
 | 
						|
            tests_passed += 1
 | 
						|
        else:
 | 
						|
            print(f"✗ FAIL: Z-indices not properly ordered: {z_indices}")
 | 
						|
    except Exception as e:
 | 
						|
        print(f"✗ FAIL: Error checking z-indices: {e}")
 | 
						|
    
 | 
						|
    # Test 8: Extend with another UICollection
 | 
						|
    print("\n--- Test 8: Extend with another UICollection ---")
 | 
						|
    tests_total += 1
 | 
						|
    try:
 | 
						|
        # Create a Frame with children
 | 
						|
        frame_with_children = mcrfpy.Frame(200, 200, 100, 100)
 | 
						|
        frame_with_children.children.append(mcrfpy.Sprite(10, 10))
 | 
						|
        frame_with_children.children.append(mcrfpy.Caption((10, 50), "Child", mcrfpy.Font("assets/JetbrainsMono.ttf")))
 | 
						|
        
 | 
						|
        # Try to extend scene_ui with the frame's children collection
 | 
						|
        initial_len = len(scene_ui)
 | 
						|
        scene_ui.extend(frame_with_children.children)
 | 
						|
        
 | 
						|
        if len(scene_ui) == initial_len + 2:
 | 
						|
            print("✓ PASS: Extended with another UICollection")
 | 
						|
            tests_passed += 1
 | 
						|
        else:
 | 
						|
            print(f"✗ FAIL: Expected {initial_len + 2} elements, got {len(scene_ui)}")
 | 
						|
    except Exception as e:
 | 
						|
        print(f"✗ FAIL: Error extending with UICollection: {e}")
 | 
						|
    
 | 
						|
    # Summary
 | 
						|
    print(f"\n=== SUMMARY ===")
 | 
						|
    print(f"Tests passed: {tests_passed}/{tests_total}")
 | 
						|
    
 | 
						|
    if tests_passed == tests_total:
 | 
						|
        print("\nIssue #96 FIXED: UICollection.extend() implemented successfully!")
 | 
						|
    else:
 | 
						|
        print("\nIssue #96: Some tests failed")
 | 
						|
    
 | 
						|
    return tests_passed == tests_total
 | 
						|
 | 
						|
def run_test(runtime):
 | 
						|
    """Timer callback to run the test"""
 | 
						|
    try:
 | 
						|
        success = test_uicollection_extend()
 | 
						|
        print("\nOverall result: " + ("PASS" if success else "FAIL"))
 | 
						|
    except Exception as e:
 | 
						|
        print(f"\nTest error: {e}")
 | 
						|
        import traceback
 | 
						|
        traceback.print_exc()
 | 
						|
        print("\nOverall result: FAIL")
 | 
						|
    
 | 
						|
    sys.exit(0)
 | 
						|
 | 
						|
# Set up the test scene
 | 
						|
mcrfpy.createScene("test")
 | 
						|
mcrfpy.setScene("test")
 | 
						|
 | 
						|
# Schedule test to run after game loop starts
 | 
						|
mcrfpy.setTimer("test", run_test, 100) |