From 9f481a2e4a24e11aa43473d0d63e246365065f98 Mon Sep 17 00:00:00 2001 From: John McCardle Date: Mon, 29 Dec 2025 19:47:48 -0500 Subject: [PATCH] fix: Update test files to use current API patterns MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Migrates test suite to current API: - Frame(x, y, w, h) → Frame(pos=(x, y), size=(w, h)) - Caption("text", x, y) → Caption(pos=(x, y), text="text") - caption.size → caption.font_size - Entity(x, y, ...) → Entity((x, y), ...) - Grid(w, h, ...) → Grid(grid_size=(w, h), ...) - cell.color → ColorLayer system Tests now serve as valid API usage examples. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- tests/benchmarks/benchmark_moving_entities.py | 15 ++-- tests/benchmarks/benchmark_suite.py | 14 +-- tests/benchmarks/layer_performance_test.py | 31 +++---- tests/integration/astar_vs_dijkstra.py | 86 ++++++++++--------- tests/integration/debug_visibility.py | 3 +- tests/integration/dijkstra_all_paths.py | 71 +++++++-------- tests/integration/dijkstra_cycle_paths.py | 65 +++++++------- tests/integration/dijkstra_debug.py | 49 ++++++----- tests/integration/dijkstra_interactive.py | 66 +++++++------- .../dijkstra_interactive_enhanced.py | 76 ++++++++-------- tests/integration/dijkstra_test.py | 4 +- tests/integration/interactive_visibility.py | 31 ++++--- .../simple_interactive_visibility.py | 7 +- tests/integration/simple_visibility_test.py | 4 +- .../regression/issue_123_chunk_system_test.py | 65 +++++++------- tests/regression/issue_76_test.py | 14 +-- tests/unit/WORKING_automation_test_example.py | 6 +- tests/unit/check_entity_attrs.py | 2 +- tests/unit/debug_render_test.py | 2 +- tests/unit/generate_grid_screenshot.py | 44 +++------- tests/unit/generate_sprite_screenshot.py | 28 +++--- .../unit/screenshot_transparency_fix_test.py | 22 ++--- tests/unit/simple_screenshot_test.py | 4 +- tests/unit/simple_timer_screenshot_test.py | 2 +- tests/unit/test_animation_chaining.py | 17 ++-- tests/unit/test_animation_debug.py | 13 +-- tests/unit/test_animation_immediate.py | 2 +- tests/unit/test_animation_raii.py | 16 ++-- tests/unit/test_animation_removal.py | 6 +- tests/unit/test_dijkstra_pathfinding.py | 27 +++--- tests/unit/test_entity_animation.py | 20 +++-- tests/unit/test_entity_fix.py | 15 ++-- tests/unit/test_entity_path_to.py | 3 +- tests/unit/test_entity_path_to_edge_cases.py | 5 +- tests/unit/test_grid_background.py | 24 +++--- tests/unit/test_headless_detection.py | 4 +- tests/unit/test_headless_modes.py | 10 +-- tests/unit/test_metrics.py | 10 +-- tests/unit/test_path_colors.py | 32 ++++--- tests/unit/test_pathfinding_integration.py | 6 +- tests/unit/test_properties_quick.py | 2 +- tests/unit/test_scene_transitions.py | 50 +++++------ tests/unit/test_scene_transitions_headless.py | 8 +- tests/unit/test_simple_drawable.py | 2 +- tests/unit/test_text_input.py | 14 +-- tests/unit/test_uicaption_visual.py | 12 +-- tests/unit/test_visibility.py | 19 ++-- tests/unit/test_visual_path.py | 58 ++++++------- tests/unit/ui_Frame_test_detailed.py | 30 +++---- tests/unit/ui_Grid_none_texture_test.py | 38 ++++---- tests/unit/ui_UICollection_issue69_test.py | 8 +- tests/unit/validate_screenshot_test.py | 32 +++---- tests/unit/working_timer_test.py | 6 +- 53 files changed, 614 insertions(+), 586 deletions(-) diff --git a/tests/benchmarks/benchmark_moving_entities.py b/tests/benchmarks/benchmark_moving_entities.py index 6c0fb76..23d79d6 100644 --- a/tests/benchmarks/benchmark_moving_entities.py +++ b/tests/benchmarks/benchmark_moving_entities.py @@ -34,12 +34,15 @@ grid = mcrfpy.Grid( size=(1024, 768) ) +# Add color layer for floor pattern +color_layer = grid.add_layer("color", z_index=-1) + # Simple floor pattern for x in range(100): for y in range(100): - cell = grid.at((x, y)) + cell = grid.at(x, y) cell.tilesprite = 0 - cell.color = (40, 40, 40, 255) + color_layer.set(x, y, mcrfpy.Color(40, 40, 40, 255)) # Create 50 entities with random positions and velocities entities = [] @@ -47,15 +50,15 @@ ENTITY_COUNT = 50 for i in range(ENTITY_COUNT): entity = mcrfpy.Entity( - grid_pos=(random.randint(0, 99), random.randint(0, 99)), - sprite_index=random.randint(10, 20) # Use varied sprites + (random.randint(0, 99), random.randint(0, 99)), + sprite_index=random.randint(10, 20), # Use varied sprites + grid=grid ) - # Give each entity a random velocity + # Give each entity a random velocity (stored as Python attributes) entity.velocity_x = random.uniform(-0.5, 0.5) entity.velocity_y = random.uniform(-0.5, 0.5) - grid.entities.append(entity) entities.append(entity) ui.append(grid) diff --git a/tests/benchmarks/benchmark_suite.py b/tests/benchmarks/benchmark_suite.py index 18806d4..72c24c7 100644 --- a/tests/benchmarks/benchmark_suite.py +++ b/tests/benchmarks/benchmark_suite.py @@ -282,23 +282,23 @@ def setup_grid_stress(): grid.center = (400, 400) # Center view ui.append(grid) - # Fill with alternating colors + # Add color layer and fill with alternating colors + color_layer = grid.add_layer("color", z_index=-1) for y in range(50): for x in range(50): - cell = grid.at(x, y) if (x + y) % 2 == 0: - cell.color = mcrfpy.Color(60, 60, 80) + color_layer.set(x, y, mcrfpy.Color(60, 60, 80)) else: - cell.color = mcrfpy.Color(40, 40, 60) + color_layer.set(x, y, mcrfpy.Color(40, 40, 60)) # Add 50 entities try: texture = mcrfpy.Texture("assets/kenney_tinydungeon.png", 16, 16) for i in range(50): - # Entity takes positional args: (position, texture, sprite_index, grid) - pos = mcrfpy.Vector(random.randint(5, 45), random.randint(5, 45)) - entity = mcrfpy.Entity(pos, texture, random.randint(0, 100), grid) + # Entity takes tuple position and keyword args + pos = (random.randint(5, 45), random.randint(5, 45)) + entity = mcrfpy.Entity(pos, texture=texture, sprite_index=random.randint(0, 100), grid=grid) grid.entities.append(entity) except Exception as e: print(f" Note: Could not create entities: {e}") diff --git a/tests/benchmarks/layer_performance_test.py b/tests/benchmarks/layer_performance_test.py index a81b441..6649a6b 100644 --- a/tests/benchmarks/layer_performance_test.py +++ b/tests/benchmarks/layer_performance_test.py @@ -6,10 +6,14 @@ Uses C++ benchmark logger (start_benchmark/end_benchmark) for accurate timing. Results written to JSON files for analysis. Compares rendering performance between: -1. Traditional grid.at(x,y).color API (no caching) -2. New layer system with dirty flag caching +1. ColorLayer with per-cell modifications (no caching benefit) +2. ColorLayer with dirty flag caching (static after fill) 3. Various layer configurations +NOTE: The old grid.at(x,y).color API no longer exists. All color operations +now go through the ColorLayer system. This benchmark compares different +layer usage patterns to measure caching effectiveness. + Usage: ./mcrogueface --exec tests/benchmarks/layer_performance_test.py # Results in benchmark_*.json files @@ -94,7 +98,7 @@ def run_next_test(): # ============================================================================ def setup_base_layer_static(): - """Traditional grid.at(x,y).color API - no modifications during render.""" + """ColorLayer with per-cell set() calls - static after initial fill.""" mcrfpy.createScene("test_base_static") ui = mcrfpy.sceneUI("test_base_static") @@ -102,17 +106,17 @@ def setup_base_layer_static(): pos=(10, 10), size=(600, 600)) ui.append(grid) - # Fill base layer using traditional API + # Fill using ColorLayer with per-cell set() calls (baseline) + layer = grid.add_layer("color", z_index=-1) for y in range(GRID_SIZE): for x in range(GRID_SIZE): - cell = grid.at(x, y) - cell.color = mcrfpy.Color((x * 2) % 256, (y * 2) % 256, 128, 255) + layer.set(x, y, mcrfpy.Color((x * 2) % 256, (y * 2) % 256, 128, 255)) mcrfpy.setScene("test_base_static") def setup_base_layer_modified(): - """Traditional API with single cell modified each frame.""" + """ColorLayer with single cell modified each frame - tests dirty flag.""" mcrfpy.createScene("test_base_mod") ui = mcrfpy.sceneUI("test_base_mod") @@ -120,19 +124,16 @@ def setup_base_layer_modified(): pos=(10, 10), size=(600, 600)) ui.append(grid) - # Fill base layer - for y in range(GRID_SIZE): - for x in range(GRID_SIZE): - cell = grid.at(x, y) - cell.color = mcrfpy.Color(100, 100, 100, 255) + # Fill using ColorLayer + layer = grid.add_layer("color", z_index=-1) + layer.fill(mcrfpy.Color(100, 100, 100, 255)) - # Timer to modify one cell per frame + # Timer to modify one cell per frame (triggers dirty flag each frame) mod_counter = [0] def modify_cell(runtime): x = mod_counter[0] % GRID_SIZE y = (mod_counter[0] // GRID_SIZE) % GRID_SIZE - cell = grid.at(x, y) - cell.color = mcrfpy.Color(255, 0, 0, 255) + layer.set(x, y, mcrfpy.Color(255, 0, 0, 255)) mod_counter[0] += 1 mcrfpy.setScene("test_base_mod") diff --git a/tests/integration/astar_vs_dijkstra.py b/tests/integration/astar_vs_dijkstra.py index 5b93c99..be75ea2 100644 --- a/tests/integration/astar_vs_dijkstra.py +++ b/tests/integration/astar_vs_dijkstra.py @@ -19,26 +19,30 @@ END_COLOR = mcrfpy.Color(255, 255, 100) # Yellow for end # Global state grid = None +color_layer = None mode = "ASTAR" start_pos = (5, 10) end_pos = (27, 10) # Changed from 25 to 27 to avoid the wall def create_map(): """Create a map with obstacles to show pathfinding differences""" - global grid - + global grid, color_layer + mcrfpy.createScene("pathfinding_comparison") - + # Create grid grid = mcrfpy.Grid(grid_x=30, grid_y=20) grid.fill_color = mcrfpy.Color(0, 0, 0) - + + # Add color layer for cell coloring + color_layer = grid.add_layer("color", z_index=-1) + # Initialize all as floor for y in range(20): for x in range(30): grid.at(x, y).walkable = True - grid.at(x, y).color = FLOOR_COLOR - + color_layer.set(x, y, FLOOR_COLOR) + # Create obstacles that make A* and Dijkstra differ obstacles = [ # Vertical wall with gaps @@ -50,15 +54,15 @@ def create_map(): [(x, 10) for x in range(20, 25)], [(25, y) for y in range(5, 15)], ] - + for obstacle_group in obstacles: for x, y in obstacle_group: grid.at(x, y).walkable = False - grid.at(x, y).color = WALL_COLOR - + color_layer.set(x, y, WALL_COLOR) + # Mark start and end - grid.at(start_pos[0], start_pos[1]).color = START_COLOR - grid.at(end_pos[0], end_pos[1]).color = END_COLOR + color_layer.set(start_pos[0], start_pos[1], START_COLOR) + color_layer.set(end_pos[0], end_pos[1], END_COLOR) def clear_paths(): """Clear path highlighting""" @@ -66,34 +70,34 @@ def clear_paths(): for x in range(30): cell = grid.at(x, y) if cell.walkable: - cell.color = FLOOR_COLOR - + color_layer.set(x, y, FLOOR_COLOR) + # Restore start and end colors - grid.at(start_pos[0], start_pos[1]).color = START_COLOR - grid.at(end_pos[0], end_pos[1]).color = END_COLOR + color_layer.set(start_pos[0], start_pos[1], START_COLOR) + color_layer.set(end_pos[0], end_pos[1], END_COLOR) def show_astar(): """Show A* path""" clear_paths() - + # Compute A* path path = grid.compute_astar_path(start_pos[0], start_pos[1], end_pos[0], end_pos[1]) - + # Color the path for i, (x, y) in enumerate(path): if (x, y) != start_pos and (x, y) != end_pos: - grid.at(x, y).color = ASTAR_COLOR - + color_layer.set(x, y, ASTAR_COLOR) + status_text.text = f"A* Path: {len(path)} steps (optimized for single target)" status_text.fill_color = ASTAR_COLOR def show_dijkstra(): """Show Dijkstra exploration""" clear_paths() - + # Compute Dijkstra from start grid.compute_dijkstra(start_pos[0], start_pos[1]) - + # Color cells by distance (showing exploration) max_dist = 40.0 for y in range(20): @@ -103,50 +107,50 @@ def show_dijkstra(): if dist is not None and dist < max_dist: # Color based on distance intensity = int(255 * (1 - dist / max_dist)) - grid.at(x, y).color = mcrfpy.Color(0, intensity // 2, intensity) - + color_layer.set(x, y, mcrfpy.Color(0, intensity // 2, intensity)) + # Get the actual path path = grid.get_dijkstra_path(end_pos[0], end_pos[1]) - + # Highlight the actual path more brightly for x, y in path: if (x, y) != start_pos and (x, y) != end_pos: - grid.at(x, y).color = DIJKSTRA_COLOR - + color_layer.set(x, y, DIJKSTRA_COLOR) + # Restore start and end - grid.at(start_pos[0], start_pos[1]).color = START_COLOR - grid.at(end_pos[0], end_pos[1]).color = END_COLOR - + color_layer.set(start_pos[0], start_pos[1], START_COLOR) + color_layer.set(end_pos[0], end_pos[1], END_COLOR) + status_text.text = f"Dijkstra: {len(path)} steps (explores all directions)" status_text.fill_color = DIJKSTRA_COLOR def show_both(): """Show both paths overlaid""" clear_paths() - + # Get both paths astar_path = grid.compute_astar_path(start_pos[0], start_pos[1], end_pos[0], end_pos[1]) grid.compute_dijkstra(start_pos[0], start_pos[1]) dijkstra_path = grid.get_dijkstra_path(end_pos[0], end_pos[1]) - + print(astar_path, dijkstra_path) # Color Dijkstra path first (blue) for x, y in dijkstra_path: if (x, y) != start_pos and (x, y) != end_pos: - grid.at(x, y).color = DIJKSTRA_COLOR - + color_layer.set(x, y, DIJKSTRA_COLOR) + # Then A* path (green) - will overwrite shared cells for x, y in astar_path: if (x, y) != start_pos and (x, y) != end_pos: - grid.at(x, y).color = ASTAR_COLOR - + color_layer.set(x, y, ASTAR_COLOR) + # Mark differences different_cells = [] for cell in dijkstra_path: if cell not in astar_path: different_cells.append(cell) - + status_text.text = f"Both paths: A*={len(astar_path)} steps, Dijkstra={len(dijkstra_path)} steps" if different_cells: info_text.text = f"Paths differ at {len(different_cells)} cells" @@ -202,26 +206,26 @@ grid.size = (600, 400) # 30*20, 20*20 grid.position = (100, 100) # Add title -title = mcrfpy.Caption("A* vs Dijkstra Pathfinding", 250, 20) +title = mcrfpy.Caption(pos=(250, 20), text="A* vs Dijkstra Pathfinding") title.fill_color = mcrfpy.Color(255, 255, 255) ui.append(title) # Add status -status_text = mcrfpy.Caption("Press A for A*, D for Dijkstra, B for Both", 100, 60) +status_text = mcrfpy.Caption(pos=(100, 60), text="Press A for A*, D for Dijkstra, B for Both") status_text.fill_color = mcrfpy.Color(200, 200, 200) ui.append(status_text) # Add info -info_text = mcrfpy.Caption("", 100, 520) +info_text = mcrfpy.Caption(pos=(100, 520), text="") info_text.fill_color = mcrfpy.Color(200, 200, 200) ui.append(info_text) # Add legend -legend1 = mcrfpy.Caption("Red=Start, Yellow=End, Green=A*, Blue=Dijkstra", 100, 540) +legend1 = mcrfpy.Caption(pos=(100, 540), text="Red=Start, Yellow=End, Green=A*, Blue=Dijkstra") legend1.fill_color = mcrfpy.Color(150, 150, 150) ui.append(legend1) -legend2 = mcrfpy.Caption("Dark=Walls, Light=Floor", 100, 560) +legend2 = mcrfpy.Caption(pos=(100, 560), text="Dark=Walls, Light=Floor") legend2.fill_color = mcrfpy.Color(150, 150, 150) ui.append(legend2) diff --git a/tests/integration/debug_visibility.py b/tests/integration/debug_visibility.py index da0bd60..89a4ab7 100644 --- a/tests/integration/debug_visibility.py +++ b/tests/integration/debug_visibility.py @@ -20,9 +20,8 @@ for y in range(5): # Create entity print("Creating entity...") -entity = mcrfpy.Entity(2, 2) +entity = mcrfpy.Entity((2, 2), grid=grid) entity.sprite_index = 64 -grid.entities.append(entity) print(f"Entity at ({entity.x}, {entity.y})") # Check gridstate diff --git a/tests/integration/dijkstra_all_paths.py b/tests/integration/dijkstra_all_paths.py index e205f08..79ce919 100644 --- a/tests/integration/dijkstra_all_paths.py +++ b/tests/integration/dijkstra_all_paths.py @@ -20,6 +20,7 @@ NO_PATH_COLOR = mcrfpy.Color(255, 0, 0) # Pure red for unreachable # Global state grid = None +color_layer = None entities = [] current_combo_index = 0 all_combinations = [] # All possible pairs @@ -27,14 +28,17 @@ current_path = [] def create_map(): """Create the map with entities""" - global grid, entities, all_combinations - + global grid, color_layer, entities, all_combinations + mcrfpy.createScene("dijkstra_all") - + # Create grid grid = mcrfpy.Grid(grid_x=14, grid_y=10) grid.fill_color = mcrfpy.Color(0, 0, 0) - + + # Add color layer for cell coloring + color_layer = grid.add_layer("color", z_index=-1) + # Map layout - Entity 1 is intentionally trapped! map_layout = [ "..............", # Row 0 @@ -48,29 +52,28 @@ def create_map(): "..W.WWW.......", # Row 8 "..............", # Row 9 ] - + # Create the map entity_positions = [] for y, row in enumerate(map_layout): for x, char in enumerate(row): cell = grid.at(x, y) - + if char == 'W': cell.walkable = False - cell.color = WALL_COLOR + color_layer.set(x, y, WALL_COLOR) else: cell.walkable = True - cell.color = FLOOR_COLOR - + color_layer.set(x, y, FLOOR_COLOR) + if char == 'E': entity_positions.append((x, y)) - + # Create entities entities = [] for i, (x, y) in enumerate(entity_positions): - entity = mcrfpy.Entity(x, y) + entity = mcrfpy.Entity((x, y), grid=grid) entity.sprite_index = 49 + i # '1', '2', '3' - grid.entities.append(entity) entities.append(entity) print("Map Analysis:") @@ -90,47 +93,47 @@ def create_map(): def clear_path_colors(): """Reset all floor tiles to original color""" global current_path - + for y in range(grid.grid_y): for x in range(grid.grid_x): cell = grid.at(x, y) if cell.walkable: - cell.color = FLOOR_COLOR - + color_layer.set(x, y, FLOOR_COLOR) + current_path = [] def show_combination(index): """Show a specific path combination (valid or invalid)""" global current_combo_index, current_path - + current_combo_index = index % len(all_combinations) from_idx, to_idx = all_combinations[current_combo_index] - + # Clear previous path clear_path_colors() - + # Get entities e_from = entities[from_idx] e_to = entities[to_idx] - + # Calculate path path = e_from.path_to(int(e_to.x), int(e_to.y)) current_path = path if path else [] - + # Always color start and end positions - grid.at(int(e_from.x), int(e_from.y)).color = START_COLOR - grid.at(int(e_to.x), int(e_to.y)).color = NO_PATH_COLOR if not path else END_COLOR - + color_layer.set(int(e_from.x), int(e_from.y), START_COLOR) + color_layer.set(int(e_to.x), int(e_to.y), NO_PATH_COLOR if not path else END_COLOR) + # Color the path if it exists if path: # Color intermediate steps for i, (x, y) in enumerate(path): if i > 0 and i < len(path) - 1: - grid.at(x, y).color = PATH_COLOR - + color_layer.set(x, y, PATH_COLOR) + status_text.text = f"Path {current_combo_index + 1}/{len(all_combinations)}: Entity {from_idx+1} → Entity {to_idx+1} = {len(path)} steps" status_text.fill_color = mcrfpy.Color(100, 255, 100) # Green for valid - + # Show path steps path_display = [] for i, (x, y) in enumerate(path[:5]): @@ -142,7 +145,7 @@ def show_combination(index): status_text.text = f"Path {current_combo_index + 1}/{len(all_combinations)}: Entity {from_idx+1} → Entity {to_idx+1} = NO PATH!" status_text.fill_color = mcrfpy.Color(255, 100, 100) # Red for invalid path_text.text = "Path: [] (No valid path exists)" - + # Update info info_text.text = f"From: Entity {from_idx+1} at ({int(e_from.x)}, {int(e_from.y)}) | To: Entity {to_idx+1} at ({int(e_to.x)}, {int(e_to.y)})" @@ -183,37 +186,37 @@ grid.size = (560, 400) grid.position = (120, 100) # Add title -title = mcrfpy.Caption("Dijkstra - All Paths (Valid & Invalid)", 200, 20) +title = mcrfpy.Caption(pos=(200, 20), text="Dijkstra - All Paths (Valid & Invalid)") title.fill_color = mcrfpy.Color(255, 255, 255) ui.append(title) # Add status (will change color based on validity) -status_text = mcrfpy.Caption("Ready", 120, 60) +status_text = mcrfpy.Caption(pos=(120, 60), text="Ready") status_text.fill_color = mcrfpy.Color(255, 255, 100) ui.append(status_text) # Add info -info_text = mcrfpy.Caption("", 120, 80) +info_text = mcrfpy.Caption(pos=(120, 80), text="") info_text.fill_color = mcrfpy.Color(200, 200, 200) ui.append(info_text) # Add path display -path_text = mcrfpy.Caption("Path: None", 120, 520) +path_text = mcrfpy.Caption(pos=(120, 520), text="Path: None") path_text.fill_color = mcrfpy.Color(200, 200, 200) ui.append(path_text) # Add controls -controls = mcrfpy.Caption("SPACE/N=Next, P=Previous, 1-6=Jump to path, Q=Quit", 120, 540) +controls = mcrfpy.Caption(pos=(120, 540), text="SPACE/N=Next, P=Previous, 1-6=Jump to path, Q=Quit") controls.fill_color = mcrfpy.Color(150, 150, 150) ui.append(controls) # Add legend -legend = mcrfpy.Caption("Red Start→Blue End (valid) | Red Start→Red End (invalid)", 120, 560) +legend = mcrfpy.Caption(pos=(120, 560), text="Red Start→Blue End (valid) | Red Start→Red End (invalid)") legend.fill_color = mcrfpy.Color(150, 150, 150) ui.append(legend) # Expected results info -expected = mcrfpy.Caption("Entity 1 is trapped: paths 1→2, 1→3, 2→1, 3→1 will fail", 120, 580) +expected = mcrfpy.Caption(pos=(120, 580), text="Entity 1 is trapped: paths 1→2, 1→3, 2→1, 3→1 will fail") expected.fill_color = mcrfpy.Color(255, 150, 150) ui.append(expected) diff --git a/tests/integration/dijkstra_cycle_paths.py b/tests/integration/dijkstra_cycle_paths.py index 201219c..2f71862 100644 --- a/tests/integration/dijkstra_cycle_paths.py +++ b/tests/integration/dijkstra_cycle_paths.py @@ -18,6 +18,7 @@ END_COLOR = mcrfpy.Color(100, 100, 255) # Light blue # Global state grid = None +color_layer = None entities = [] current_path_index = 0 path_combinations = [] @@ -25,14 +26,17 @@ current_path = [] def create_map(): """Create the map with entities""" - global grid, entities - + global grid, color_layer, entities + mcrfpy.createScene("dijkstra_cycle") - + # Create grid grid = mcrfpy.Grid(grid_x=14, grid_y=10) grid.fill_color = mcrfpy.Color(0, 0, 0) - + + # Add color layer for cell coloring + color_layer = grid.add_layer("color", z_index=-1) + # Map layout map_layout = [ "..............", # Row 0 @@ -46,29 +50,28 @@ def create_map(): "..W.WWW.......", # Row 8 "..............", # Row 9 ] - + # Create the map entity_positions = [] for y, row in enumerate(map_layout): for x, char in enumerate(row): cell = grid.at(x, y) - + if char == 'W': cell.walkable = False - cell.color = WALL_COLOR + color_layer.set(x, y, WALL_COLOR) else: cell.walkable = True - cell.color = FLOOR_COLOR - + color_layer.set(x, y, FLOOR_COLOR) + if char == 'E': entity_positions.append((x, y)) - + # Create entities entities = [] for i, (x, y) in enumerate(entity_positions): - entity = mcrfpy.Entity(x, y) + entity = mcrfpy.Entity((x, y), grid=grid) entity.sprite_index = 49 + i # '1', '2', '3' - grid.entities.append(entity) entities.append(entity) print("Entities created:") @@ -113,48 +116,48 @@ def create_map(): def clear_path_colors(): """Reset all floor tiles to original color""" global current_path - + for y in range(grid.grid_y): for x in range(grid.grid_x): cell = grid.at(x, y) if cell.walkable: - cell.color = FLOOR_COLOR - + color_layer.set(x, y, FLOOR_COLOR) + current_path = [] def show_path(index): """Show a specific path combination""" global current_path_index, current_path - + if not path_combinations: status_text.text = "No valid paths available (Entity 1 is trapped!)" return - + current_path_index = index % len(path_combinations) from_idx, to_idx, path = path_combinations[current_path_index] - + # Clear previous path clear_path_colors() - + # Get entities e_from = entities[from_idx] e_to = entities[to_idx] - + # Color the path current_path = path if path: # Color start and end - grid.at(int(e_from.x), int(e_from.y)).color = START_COLOR - grid.at(int(e_to.x), int(e_to.y)).color = END_COLOR - + color_layer.set(int(e_from.x), int(e_from.y), START_COLOR) + color_layer.set(int(e_to.x), int(e_to.y), END_COLOR) + # Color intermediate steps for i, (x, y) in enumerate(path): if i > 0 and i < len(path) - 1: - grid.at(x, y).color = PATH_COLOR - + color_layer.set(x, y, PATH_COLOR) + # Update status status_text.text = f"Path {current_path_index + 1}/{len(path_combinations)}: Entity {from_idx+1} → Entity {to_idx+1} ({len(path)} steps)" - + # Update path display path_display = [] for i, (x, y) in enumerate(path[:5]): # Show first 5 steps @@ -194,27 +197,27 @@ grid.size = (560, 400) grid.position = (120, 100) # Add title -title = mcrfpy.Caption("Dijkstra Pathfinding - Cycle Paths", 200, 20) +title = mcrfpy.Caption(pos=(200, 20), text="Dijkstra Pathfinding - Cycle Paths") title.fill_color = mcrfpy.Color(255, 255, 255) ui.append(title) # Add status -status_text = mcrfpy.Caption("Press SPACE to cycle paths", 120, 60) +status_text = mcrfpy.Caption(pos=(120, 60), text="Press SPACE to cycle paths") status_text.fill_color = mcrfpy.Color(255, 255, 100) ui.append(status_text) # Add path display -path_text = mcrfpy.Caption("Path: None", 120, 520) +path_text = mcrfpy.Caption(pos=(120, 520), text="Path: None") path_text.fill_color = mcrfpy.Color(200, 200, 200) ui.append(path_text) # Add controls -controls = mcrfpy.Caption("SPACE/N=Next, P=Previous, R=Refresh, Q=Quit", 120, 540) +controls = mcrfpy.Caption(pos=(120, 540), text="SPACE/N=Next, P=Previous, R=Refresh, Q=Quit") controls.fill_color = mcrfpy.Color(150, 150, 150) ui.append(controls) # Add legend -legend = mcrfpy.Caption("Red=Start, Blue=End, Green=Path, Dark=Wall", 120, 560) +legend = mcrfpy.Caption(pos=(120, 560), text="Red=Start, Blue=End, Green=Path, Dark=Wall") legend.fill_color = mcrfpy.Color(150, 150, 150) ui.append(legend) diff --git a/tests/integration/dijkstra_debug.py b/tests/integration/dijkstra_debug.py index fd182b8..6538fae 100644 --- a/tests/integration/dijkstra_debug.py +++ b/tests/integration/dijkstra_debug.py @@ -18,49 +18,52 @@ ENTITY_COLORS = [ # Global state grid = None +color_layer = None entities = [] first_point = None second_point = None def create_simple_map(): """Create a simple test map""" - global grid, entities - + global grid, color_layer, entities + mcrfpy.createScene("dijkstra_debug") - + # Small grid for easy debugging grid = mcrfpy.Grid(grid_x=10, grid_y=10) grid.fill_color = mcrfpy.Color(0, 0, 0) - + + # Add color layer for cell coloring + color_layer = grid.add_layer("color", z_index=-1) + print("Initializing 10x10 grid...") - + # Initialize all as floor for y in range(10): for x in range(10): grid.at(x, y).walkable = True grid.at(x, y).transparent = True - grid.at(x, y).color = FLOOR_COLOR - + color_layer.set(x, y, FLOOR_COLOR) + # Add a simple wall print("Adding walls at:") walls = [(5, 2), (5, 3), (5, 4), (5, 5), (5, 6)] for x, y in walls: print(f" Wall at ({x}, {y})") grid.at(x, y).walkable = False - grid.at(x, y).color = WALL_COLOR - + color_layer.set(x, y, WALL_COLOR) + # Create 3 entities entity_positions = [(2, 5), (8, 5), (5, 8)] entities = [] - + print("\nCreating entities at:") for i, (x, y) in enumerate(entity_positions): print(f" Entity {i+1} at ({x}, {y})") - entity = mcrfpy.Entity(x, y) + entity = mcrfpy.Entity((x, y), grid=grid) entity.sprite_index = 49 + i # '1', '2', '3' - grid.entities.append(entity) entities.append(entity) - + return grid def test_path_highlighting(): @@ -88,12 +91,14 @@ def test_path_highlighting(): print(f" Step {i}: ({x}, {y})") # Get current color for debugging cell = grid.at(x, y) - old_color = (cell.color.r, cell.color.g, cell.color.b) - + old_c = color_layer.at(x, y) + old_color = (old_c.r, old_c.g, old_c.b) + # Set new color - cell.color = PATH_COLOR - new_color = (cell.color.r, cell.color.g, cell.color.b) - + color_layer.set(x, y, PATH_COLOR) + new_c = color_layer.at(x, y) + new_color = (new_c.r, new_c.g, new_c.b) + print(f" Color changed from {old_color} to {new_color}") print(f" Walkable: {cell.walkable}") @@ -111,8 +116,8 @@ def test_path_highlighting(): # Verify colors were set print("\nVerifying cell colors after highlighting:") for x, y in path[:3]: # Check first 3 cells - cell = grid.at(x, y) - color = (cell.color.r, cell.color.g, cell.color.b) + c = color_layer.at(x, y) + color = (c.r, c.g, c.b) expected = (PATH_COLOR.r, PATH_COLOR.g, PATH_COLOR.b) match = color == expected print(f" Cell ({x}, {y}): color={color}, expected={expected}, match={match}") @@ -143,12 +148,12 @@ grid.position = (50, 50) grid.size = (400, 400) # 10*40 # Add title -title = mcrfpy.Caption("Dijkstra Debug - Press SPACE to retest, Q to quit", 50, 10) +title = mcrfpy.Caption(pos=(50, 10), text="Dijkstra Debug - Press SPACE to retest, Q to quit") title.fill_color = mcrfpy.Color(255, 255, 255) ui.append(title) # Add debug info -info = mcrfpy.Caption("Check console for debug output", 50, 470) +info = mcrfpy.Caption(pos=(50, 470), text="Check console for debug output") info.fill_color = mcrfpy.Color(200, 200, 200) ui.append(info) diff --git a/tests/integration/dijkstra_interactive.py b/tests/integration/dijkstra_interactive.py index fdf2176..c9deeae 100644 --- a/tests/integration/dijkstra_interactive.py +++ b/tests/integration/dijkstra_interactive.py @@ -29,20 +29,24 @@ ENTITY_COLORS = [ # Global state grid = None +color_layer = None entities = [] first_point = None second_point = None def create_map(): """Create the interactive map with the layout specified by the user""" - global grid, entities - + global grid, color_layer, entities + mcrfpy.createScene("dijkstra_interactive") - + # Create grid - 14x10 as specified grid = mcrfpy.Grid(grid_x=14, grid_y=10) grid.fill_color = mcrfpy.Color(0, 0, 0) - + + # Add color layer for cell coloring + color_layer = grid.add_layer("color", z_index=-1) + # Define the map layout from user's specification # . = floor, W = wall, E = entity position map_layout = [ @@ -57,36 +61,35 @@ def create_map(): "..W.WWW.......", # Row 8 "..............", # Row 9 ] - + # Create the map entity_positions = [] for y, row in enumerate(map_layout): for x, char in enumerate(row): cell = grid.at(x, y) - + if char == 'W': # Wall cell.walkable = False cell.transparent = False - cell.color = WALL_COLOR + color_layer.set(x, y, WALL_COLOR) else: # Floor cell.walkable = True cell.transparent = True - cell.color = FLOOR_COLOR - + color_layer.set(x, y, FLOOR_COLOR) + if char == 'E': # Entity position entity_positions.append((x, y)) - + # Create entities at marked positions entities = [] for i, (x, y) in enumerate(entity_positions): - entity = mcrfpy.Entity(x, y) + entity = mcrfpy.Entity((x, y), grid=grid) entity.sprite_index = 49 + i # '1', '2', '3' - grid.entities.append(entity) entities.append(entity) - + return grid def clear_path_highlight(): @@ -96,37 +99,37 @@ def clear_path_highlight(): for x in range(grid.grid_x): cell = grid.at(x, y) if cell.walkable: - cell.color = FLOOR_COLOR + color_layer.set(x, y, FLOOR_COLOR) def highlight_path(): """Highlight the path between selected entities""" if first_point is None or second_point is None: return - + # Clear previous highlighting clear_path_highlight() - + # Get entities entity1 = entities[first_point] entity2 = entities[second_point] - + # Compute Dijkstra from first entity grid.compute_dijkstra(int(entity1.x), int(entity1.y)) - + # Get path to second entity path = grid.get_dijkstra_path(int(entity2.x), int(entity2.y)) - + if path: # Highlight the path for x, y in path: cell = grid.at(x, y) if cell.walkable: - cell.color = PATH_COLOR - + color_layer.set(x, y, PATH_COLOR) + # Also highlight start and end with entity colors - grid.at(int(entity1.x), int(entity1.y)).color = ENTITY_COLORS[first_point] - grid.at(int(entity2.x), int(entity2.y)).color = ENTITY_COLORS[second_point] - + color_layer.set(int(entity1.x), int(entity1.y), ENTITY_COLORS[first_point]) + color_layer.set(int(entity2.x), int(entity2.y), ENTITY_COLORS[second_point]) + # Update info distance = grid.get_dijkstra_distance(int(entity2.x), int(entity2.y)) info_text.text = f"Path: Entity {first_point+1} to Entity {second_point+1} - {len(path)} steps, {distance:.1f} units" @@ -199,34 +202,33 @@ grid.size = (560, 400) # 14*40, 10*40 grid.position = (120, 60) # Add title -title = mcrfpy.Caption("Dijkstra Pathfinding Interactive", 250, 10) +title = mcrfpy.Caption(pos=(250, 10), text="Dijkstra Pathfinding Interactive") title.fill_color = mcrfpy.Color(255, 255, 255) ui.append(title) # Add status text -status_text = mcrfpy.Caption("Press 1/2/3 for first entity, A/B/C for second", 120, 480) +status_text = mcrfpy.Caption(pos=(120, 480), text="Press 1/2/3 for first entity, A/B/C for second") status_text.fill_color = mcrfpy.Color(255, 255, 255) ui.append(status_text) # Add info text -info_text = mcrfpy.Caption("Space to clear, Q to quit", 120, 500) +info_text = mcrfpy.Caption(pos=(120, 500), text="Space to clear, Q to quit") info_text.fill_color = mcrfpy.Color(200, 200, 200) ui.append(info_text) # Add legend -legend1 = mcrfpy.Caption("Entities: 1=Red 2=Green 3=Blue", 120, 540) +legend1 = mcrfpy.Caption(pos=(120, 540), text="Entities: 1=Red 2=Green 3=Blue") legend1.fill_color = mcrfpy.Color(150, 150, 150) ui.append(legend1) -legend2 = mcrfpy.Caption("Colors: Dark=Wall Light=Floor Cyan=Path", 120, 560) +legend2 = mcrfpy.Caption(pos=(120, 560), text="Colors: Dark=Wall Light=Floor Cyan=Path") legend2.fill_color = mcrfpy.Color(150, 150, 150) ui.append(legend2) # Mark entity positions with colored indicators for i, entity in enumerate(entities): - marker = mcrfpy.Caption(str(i+1), - 120 + int(entity.x) * 40 + 15, - 60 + int(entity.y) * 40 + 10) + marker = mcrfpy.Caption(pos=(120 + int(entity.x) * 40 + 15, 60 + int(entity.y) * 40 + 10), + text=str(i+1)) marker.fill_color = ENTITY_COLORS[i] marker.outline = 1 marker.outline_color = mcrfpy.Color(0, 0, 0) diff --git a/tests/integration/dijkstra_interactive_enhanced.py b/tests/integration/dijkstra_interactive_enhanced.py index 34da805..35c8655 100644 --- a/tests/integration/dijkstra_interactive_enhanced.py +++ b/tests/integration/dijkstra_interactive_enhanced.py @@ -32,6 +32,7 @@ ENTITY_COLORS = [ # Global state grid = None +color_layer = None entities = [] first_point = None second_point = None @@ -43,14 +44,17 @@ original_positions = [] # Store original entity positions def create_map(): """Create the interactive map with the layout specified by the user""" - global grid, entities, original_positions - + global grid, color_layer, entities, original_positions + mcrfpy.createScene("dijkstra_enhanced") - + # Create grid - 14x10 as specified grid = mcrfpy.Grid(grid_x=14, grid_y=10) grid.fill_color = mcrfpy.Color(0, 0, 0) - + + # Add color layer for cell coloring + color_layer = grid.add_layer("color", z_index=-1) + # Define the map layout from user's specification # . = floor, W = wall, E = entity position map_layout = [ @@ -65,87 +69,86 @@ def create_map(): "..W.WWW.......", # Row 8 "..............", # Row 9 ] - + # Create the map entity_positions = [] for y, row in enumerate(map_layout): for x, char in enumerate(row): cell = grid.at(x, y) - + if char == 'W': # Wall cell.walkable = False cell.transparent = False - cell.color = WALL_COLOR + color_layer.set(x, y, WALL_COLOR) else: # Floor cell.walkable = True cell.transparent = True - cell.color = FLOOR_COLOR - + color_layer.set(x, y, FLOOR_COLOR) + if char == 'E': # Entity position entity_positions.append((x, y)) - + # Create entities at marked positions entities = [] original_positions = [] for i, (x, y) in enumerate(entity_positions): - entity = mcrfpy.Entity(x, y) + entity = mcrfpy.Entity((x, y), grid=grid) entity.sprite_index = 49 + i # '1', '2', '3' - grid.entities.append(entity) entities.append(entity) original_positions.append((x, y)) - + return grid def clear_path_highlight(): """Clear any existing path highlighting""" global current_path - + # Reset all floor tiles to original color for y in range(grid.grid_y): for x in range(grid.grid_x): cell = grid.at(x, y) if cell.walkable: - cell.color = FLOOR_COLOR - + color_layer.set(x, y, FLOOR_COLOR) + current_path = [] def highlight_path(): """Highlight the path between selected entities using entity.path_to()""" global current_path - + if first_point is None or second_point is None: return - + # Clear previous highlighting clear_path_highlight() - + # Get entities entity1 = entities[first_point] entity2 = entities[second_point] - + # Use the new path_to method! path = entity1.path_to(int(entity2.x), int(entity2.y)) - + if path: current_path = path - + # Highlight the path for i, (x, y) in enumerate(path): cell = grid.at(x, y) if cell.walkable: # Use gradient for path visualization if i < len(path) - 1: - cell.color = PATH_COLOR + color_layer.set(x, y, PATH_COLOR) else: - cell.color = VISITED_COLOR - + color_layer.set(x, y, VISITED_COLOR) + # Highlight start and end with entity colors - grid.at(int(entity1.x), int(entity1.y)).color = ENTITY_COLORS[first_point] - grid.at(int(entity2.x), int(entity2.y)).color = ENTITY_COLORS[second_point] - + color_layer.set(int(entity1.x), int(entity1.y), ENTITY_COLORS[first_point]) + color_layer.set(int(entity2.x), int(entity2.y), ENTITY_COLORS[second_point]) + # Update info info_text.text = f"Path: Entity {first_point+1} to Entity {second_point+1} - {len(path)} steps" else: @@ -291,39 +294,38 @@ grid.size = (560, 400) # 14*40, 10*40 grid.position = (120, 60) # Add title -title = mcrfpy.Caption("Enhanced Dijkstra Pathfinding", 250, 10) +title = mcrfpy.Caption(pos=(250, 10), text="Enhanced Dijkstra Pathfinding") title.fill_color = mcrfpy.Color(255, 255, 255) ui.append(title) # Add status text -status_text = mcrfpy.Caption("Press 1/2/3 for first entity, A/B/C for second", 120, 480) +status_text = mcrfpy.Caption(pos=(120, 480), text="Press 1/2/3 for first entity, A/B/C for second") status_text.fill_color = mcrfpy.Color(255, 255, 255) ui.append(status_text) # Add info text -info_text = mcrfpy.Caption("Space to clear, Q to quit", 120, 500) +info_text = mcrfpy.Caption(pos=(120, 500), text="Space to clear, Q to quit") info_text.fill_color = mcrfpy.Color(200, 200, 200) ui.append(info_text) # Add control text -control_text = mcrfpy.Caption("Press M to move, P to pause, R to reset", 120, 520) +control_text = mcrfpy.Caption(pos=(120, 520), text="Press M to move, P to pause, R to reset") control_text.fill_color = mcrfpy.Color(150, 200, 150) ui.append(control_text) # Add legend -legend1 = mcrfpy.Caption("Entities: 1=Red 2=Green 3=Blue", 120, 560) +legend1 = mcrfpy.Caption(pos=(120, 560), text="Entities: 1=Red 2=Green 3=Blue") legend1.fill_color = mcrfpy.Color(150, 150, 150) ui.append(legend1) -legend2 = mcrfpy.Caption("Colors: Dark=Wall Light=Floor Cyan=Path", 120, 580) +legend2 = mcrfpy.Caption(pos=(120, 580), text="Colors: Dark=Wall Light=Floor Cyan=Path") legend2.fill_color = mcrfpy.Color(150, 150, 150) ui.append(legend2) # Mark entity positions with colored indicators for i, entity in enumerate(entities): - marker = mcrfpy.Caption(str(i+1), - 120 + int(entity.x) * 40 + 15, - 60 + int(entity.y) * 40 + 10) + marker = mcrfpy.Caption(pos=(120 + int(entity.x) * 40 + 15, 60 + int(entity.y) * 40 + 10), + text=str(i+1)) marker.fill_color = ENTITY_COLORS[i] marker.outline = 1 marker.outline_color = mcrfpy.Color(0, 0, 0) diff --git a/tests/integration/dijkstra_test.py b/tests/integration/dijkstra_test.py index 9f99eeb..928a56e 100644 --- a/tests/integration/dijkstra_test.py +++ b/tests/integration/dijkstra_test.py @@ -128,12 +128,12 @@ grid.position = (50, 50) grid.size = (500, 300) # Add title -title = mcrfpy.Caption("Dijkstra Pathfinding Test", 200, 10) +title = mcrfpy.Caption(pos=(200, 10), text="Dijkstra Pathfinding Test") title.fill_color = mcrfpy.Color(255, 255, 255) ui.append(title) # Add legend -legend = mcrfpy.Caption("Red=Entity1 Green=Entity2 Blue=Entity3 Cyan=Path 1→3", 50, 360) +legend = mcrfpy.Caption(pos=(50, 360), text="Red=Entity1 Green=Entity2 Blue=Entity3 Cyan=Path 1→3") legend.fill_color = mcrfpy.Color(180, 180, 180) ui.append(legend) diff --git a/tests/integration/interactive_visibility.py b/tests/integration/interactive_visibility.py index 3d7aef8..dcb386d 100644 --- a/tests/integration/interactive_visibility.py +++ b/tests/integration/interactive_visibility.py @@ -19,33 +19,36 @@ mcrfpy.createScene("visibility_demo") grid = mcrfpy.Grid(grid_x=30, grid_y=20) grid.fill_color = mcrfpy.Color(20, 20, 30) # Dark background +# Add color layer for cell coloring +color_layer = grid.add_layer("color", z_index=-1) + # Initialize grid - all walkable and transparent for y in range(20): for x in range(30): cell = grid.at(x, y) cell.walkable = True cell.transparent = True - cell.color = mcrfpy.Color(100, 100, 120) # Floor color + color_layer.set(x, y, mcrfpy.Color(100, 100, 120)) # Floor color # Create walls walls = [ # Central cross [(15, y) for y in range(8, 12)], [(x, 10) for x in range(13, 18)], - + # Rooms # Top-left room [(x, 5) for x in range(2, 8)] + [(8, y) for y in range(2, 6)], [(2, y) for y in range(2, 6)] + [(x, 2) for x in range(2, 8)], - - # Top-right room + + # Top-right room [(x, 5) for x in range(22, 28)] + [(22, y) for y in range(2, 6)], [(28, y) for y in range(2, 6)] + [(x, 2) for x in range(22, 28)], - + # Bottom-left room [(x, 15) for x in range(2, 8)] + [(8, y) for y in range(15, 18)], [(2, y) for y in range(15, 18)] + [(x, 18) for x in range(2, 8)], - + # Bottom-right room [(x, 15) for x in range(22, 28)] + [(22, y) for y in range(15, 18)], [(28, y) for y in range(15, 18)] + [(x, 18) for x in range(22, 28)], @@ -57,12 +60,12 @@ for wall_group in walls: cell = grid.at(x, y) cell.walkable = False cell.transparent = False - cell.color = mcrfpy.Color(40, 20, 20) # Wall color + color_layer.set(x, y, mcrfpy.Color(40, 20, 20)) # Wall color # Create entities -player = mcrfpy.Entity(5, 10, grid=grid) +player = mcrfpy.Entity((5, 10), grid=grid) player.sprite_index = 64 # @ -enemy = mcrfpy.Entity(25, 10, grid=grid) +enemy = mcrfpy.Entity((25, 10), grid=grid) enemy.sprite_index = 69 # E # Update initial visibility @@ -80,24 +83,24 @@ grid.position = (50, 100) grid.size = (900, 600) # 30*30, 20*30 # Title -title = mcrfpy.Caption("Interactive Visibility Demo", 350, 20) +title = mcrfpy.Caption(pos=(350, 20), text="Interactive Visibility Demo") title.fill_color = mcrfpy.Color(255, 255, 255) ui.append(title) # Info displays -perspective_label = mcrfpy.Caption("Perspective: Omniscient", 50, 50) +perspective_label = mcrfpy.Caption(pos=(50, 50), text="Perspective: Omniscient") perspective_label.fill_color = mcrfpy.Color(200, 200, 200) ui.append(perspective_label) -controls = mcrfpy.Caption("WASD: Move player | Arrows: Move enemy | Tab: Cycle perspective | Space: Update visibility | R: Reset", 50, 730) +controls = mcrfpy.Caption(pos=(50, 730), text="WASD: Move player | Arrows: Move enemy | Tab: Cycle perspective | Space: Update visibility | R: Reset") controls.fill_color = mcrfpy.Color(150, 150, 150) ui.append(controls) -player_info = mcrfpy.Caption("Player: (5, 10)", 700, 50) +player_info = mcrfpy.Caption(pos=(700, 50), text="Player: (5, 10)") player_info.fill_color = mcrfpy.Color(100, 255, 100) ui.append(player_info) -enemy_info = mcrfpy.Caption("Enemy: (25, 10)", 700, 70) +enemy_info = mcrfpy.Caption(pos=(700, 70), text="Enemy: (25, 10)") enemy_info.fill_color = mcrfpy.Color(255, 100, 100) ui.append(enemy_info) diff --git a/tests/integration/simple_interactive_visibility.py b/tests/integration/simple_interactive_visibility.py index fd95d5a..6243ecb 100644 --- a/tests/integration/simple_interactive_visibility.py +++ b/tests/integration/simple_interactive_visibility.py @@ -11,6 +11,9 @@ mcrfpy.createScene("vis_test") print("Creating grid...") grid = mcrfpy.Grid(grid_x=10, grid_y=10) +# Add color layer for cell coloring +color_layer = grid.add_layer("color", z_index=-1) + # Initialize grid print("Initializing grid...") for y in range(10): @@ -18,11 +21,11 @@ for y in range(10): cell = grid.at(x, y) cell.walkable = True cell.transparent = True - cell.color = mcrfpy.Color(100, 100, 120) + color_layer.set(x, y, mcrfpy.Color(100, 100, 120)) # Create entity print("Creating entity...") -entity = mcrfpy.Entity(5, 5, grid=grid) +entity = mcrfpy.Entity((5, 5), grid=grid) entity.sprite_index = 64 print("Updating visibility...") diff --git a/tests/integration/simple_visibility_test.py b/tests/integration/simple_visibility_test.py index 5c20758..1e00b73 100644 --- a/tests/integration/simple_visibility_test.py +++ b/tests/integration/simple_visibility_test.py @@ -13,8 +13,8 @@ print("Scene created") grid = mcrfpy.Grid(grid_x=5, grid_y=5) print("Grid created") -# Create entity without appending -entity = mcrfpy.Entity(2, 2, grid=grid) +# Create entity with grid association +entity = mcrfpy.Entity((2, 2), grid=grid) print(f"Entity created at ({entity.x}, {entity.y})") # Check if gridstate is initialized diff --git a/tests/regression/issue_123_chunk_system_test.py b/tests/regression/issue_123_chunk_system_test.py index 0437494..f8be052 100644 --- a/tests/regression/issue_123_chunk_system_test.py +++ b/tests/regression/issue_123_chunk_system_test.py @@ -8,6 +8,10 @@ while small grids use the original flat storage. Verifies that: 2. Large grids work correctly with chunks 3. Cell access (read/write) works for both modes 4. Rendering displays correctly for both modes + +NOTE: This test uses ColorLayer for color operations since cell.color +is no longer supported. The chunk system affects internal storage, which +ColorLayer also uses. """ import mcrfpy @@ -19,22 +23,21 @@ def test_small_grid(): # Small grid should use flat storage grid = mcrfpy.Grid(grid_size=(50, 50), pos=(10, 10), size=(400, 400)) + color_layer = grid.add_layer("color", z_index=-1) # Set some cells for y in range(50): for x in range(50): cell = grid.at(x, y) - cell.color = mcrfpy.Color((x * 5) % 256, (y * 5) % 256, 128, 255) + color_layer.set(x, y, mcrfpy.Color((x * 5) % 256, (y * 5) % 256, 128, 255)) cell.tilesprite = -1 # Verify cells - cell = grid.at(25, 25) expected_r = (25 * 5) % 256 expected_g = (25 * 5) % 256 - color = cell.color - r, g = color[0], color[1] - if r != expected_r or g != expected_g: - print(f"FAIL: Small grid cell color mismatch. Expected ({expected_r}, {expected_g}), got ({r}, {g})") + color = color_layer.at(25, 25) + if color.r != expected_r or color.g != expected_g: + print(f"FAIL: Small grid cell color mismatch. Expected ({expected_r}, {expected_g}), got ({color.r}, {color.g})") return False print(" Small grid: PASS") @@ -46,6 +49,7 @@ def test_large_grid(): # Large grid should use chunk storage (100 > 64) grid = mcrfpy.Grid(grid_size=(100, 100), pos=(10, 10), size=(400, 400)) + color_layer = grid.add_layer("color", z_index=-1) # Set cells across multiple chunks # Chunks are 64x64, so a 100x100 grid has 2x2 = 4 chunks @@ -61,15 +65,14 @@ def test_large_grid(): for x, y in test_points: cell = grid.at(x, y) - cell.color = mcrfpy.Color(x, y, 100, 255) + color_layer.set(x, y, mcrfpy.Color(x, y, 100, 255)) cell.tilesprite = -1 # Verify cells for x, y in test_points: - cell = grid.at(x, y) - color = cell.color - if color[0] != x or color[1] != y: - print(f"FAIL: Large grid cell ({x},{y}) color mismatch. Expected ({x}, {y}), got ({color[0]}, {color[1]})") + color = color_layer.at(x, y) + if color.r != x or color.g != y: + print(f"FAIL: Large grid cell ({x},{y}) color mismatch. Expected ({x}, {y}), got ({color.r}, {color.g})") return False print(" Large grid cell access: PASS") @@ -81,6 +84,7 @@ def test_very_large_grid(): # 500x500 = 250,000 cells, should use ~64 chunks (8x8) grid = mcrfpy.Grid(grid_size=(500, 500), pos=(10, 10), size=(400, 400)) + color_layer = grid.add_layer("color", z_index=-1) # Set some cells at various positions test_points = [ @@ -94,14 +98,12 @@ def test_very_large_grid(): ] for x, y in test_points: - cell = grid.at(x, y) - cell.color = mcrfpy.Color(x % 256, y % 256, 200, 255) + color_layer.set(x, y, mcrfpy.Color(x % 256, y % 256, 200, 255)) # Verify for x, y in test_points: - cell = grid.at(x, y) - color = cell.color - if color[0] != (x % 256) or color[1] != (y % 256): + color = color_layer.at(x, y) + if color.r != (x % 256) or color.g != (y % 256): print(f"FAIL: Very large grid cell ({x},{y}) color mismatch") return False @@ -114,20 +116,20 @@ def test_boundary_case(): # 64x64 should use flat storage (not exceeding threshold) grid_64 = mcrfpy.Grid(grid_size=(64, 64), pos=(10, 10), size=(400, 400)) - cell = grid_64.at(63, 63) - cell.color = mcrfpy.Color(255, 0, 0, 255) - color = grid_64.at(63, 63).color - if color[0] != 255: - print(f"FAIL: 64x64 grid boundary cell not set correctly, got r={color[0]}") + color_layer_64 = grid_64.add_layer("color", z_index=-1) + color_layer_64.set(63, 63, mcrfpy.Color(255, 0, 0, 255)) + color = color_layer_64.at(63, 63) + if color.r != 255: + print(f"FAIL: 64x64 grid boundary cell not set correctly, got r={color.r}") return False # 65x65 should use chunk storage (exceeding threshold) grid_65 = mcrfpy.Grid(grid_size=(65, 65), pos=(10, 10), size=(400, 400)) - cell = grid_65.at(64, 64) - cell.color = mcrfpy.Color(0, 255, 0, 255) - color = grid_65.at(64, 64).color - if color[1] != 255: - print(f"FAIL: 65x65 grid cell not set correctly, got g={color[1]}") + color_layer_65 = grid_65.add_layer("color", z_index=-1) + color_layer_65.set(64, 64, mcrfpy.Color(0, 255, 0, 255)) + color = color_layer_65.at(64, 64) + if color.g != 255: + print(f"FAIL: 65x65 grid cell not set correctly, got g={color.g}") return False print(" Boundary cases: PASS") @@ -139,19 +141,18 @@ def test_edge_cases(): # Create 100x100 grid grid = mcrfpy.Grid(grid_size=(100, 100), pos=(10, 10), size=(400, 400)) + color_layer = grid.add_layer("color", z_index=-1) # Test all corners corners = [(0, 0), (99, 0), (0, 99), (99, 99)] for i, (x, y) in enumerate(corners): - cell = grid.at(x, y) - cell.color = mcrfpy.Color(i * 60, i * 60, i * 60, 255) + color_layer.set(x, y, mcrfpy.Color(i * 60, i * 60, i * 60, 255)) for i, (x, y) in enumerate(corners): - cell = grid.at(x, y) expected = i * 60 - color = cell.color - if color[0] != expected: - print(f"FAIL: Corner ({x},{y}) color mismatch, expected {expected}, got {color[0]}") + color = color_layer.at(x, y) + if color.r != expected: + print(f"FAIL: Corner ({x},{y}) color mismatch, expected {expected}, got {color.r}") return False print(" Edge cases: PASS") diff --git a/tests/regression/issue_76_test.py b/tests/regression/issue_76_test.py index 96dd723..ecd985d 100644 --- a/tests/regression/issue_76_test.py +++ b/tests/regression/issue_76_test.py @@ -10,10 +10,10 @@ import sys # Create a derived Entity class class CustomEntity(mcrfpy.Entity): - def __init__(self, x, y): - super().__init__(x, y) + def __init__(self, pos): + super().__init__(pos) self.custom_attribute = "I am custom!" - + def custom_method(self): return "Custom method called" @@ -21,11 +21,11 @@ def run_test(runtime): """Test that derived entity classes maintain their type in collections""" try: # Create a grid - grid = mcrfpy.Grid(10, 10) - + grid = mcrfpy.Grid(grid_size=(10, 10)) + # Create instances of base and derived entities - base_entity = mcrfpy.Entity(1, 1) - custom_entity = CustomEntity(2, 2) + base_entity = mcrfpy.Entity((1, 1)) + custom_entity = CustomEntity((2, 2)) # Add them to the grid's entity collection grid.entities.append(base_entity) diff --git a/tests/unit/WORKING_automation_test_example.py b/tests/unit/WORKING_automation_test_example.py index bb22673..91daaef 100644 --- a/tests/unit/WORKING_automation_test_example.py +++ b/tests/unit/WORKING_automation_test_example.py @@ -51,17 +51,17 @@ mcrfpy.setScene("timer_test_scene") ui = mcrfpy.sceneUI("timer_test_scene") # Add a bright red frame that should be visible -frame = mcrfpy.Frame(100, 100, 400, 300, +frame = mcrfpy.Frame(pos=(100, 100), size=(400, 300), fill_color=mcrfpy.Color(255, 0, 0), # Bright red outline_color=mcrfpy.Color(255, 255, 255), # White outline outline=5.0) ui.append(frame) # Add text -caption = mcrfpy.Caption(mcrfpy.Vector(150, 150), +caption = mcrfpy.Caption(pos=(150, 150), text="TIMER TEST - SHOULD BE VISIBLE", fill_color=mcrfpy.Color(255, 255, 255)) -caption.size = 24 +caption.font_size = 24 frame.children.append(caption) # Add click handler to demonstrate interaction diff --git a/tests/unit/check_entity_attrs.py b/tests/unit/check_entity_attrs.py index d0a44b8..564ea62 100644 --- a/tests/unit/check_entity_attrs.py +++ b/tests/unit/check_entity_attrs.py @@ -1,4 +1,4 @@ import mcrfpy -e = mcrfpy.Entity(0, 0) +e = mcrfpy.Entity((0, 0)) print("Entity attributes:", dir(e)) print("\nEntity repr:", repr(e)) \ No newline at end of file diff --git a/tests/unit/debug_render_test.py b/tests/unit/debug_render_test.py index d7c7f6c..1442f09 100644 --- a/tests/unit/debug_render_test.py +++ b/tests/unit/debug_render_test.py @@ -22,7 +22,7 @@ print(f"UI collection type: {type(ui)}") print(f"Initial UI elements: {len(ui)}") # Add a simple frame -frame = mcrfpy.Frame(0, 0, 100, 100, +frame = mcrfpy.Frame(pos=(0, 0), size=(100, 100), fill_color=mcrfpy.Color(255, 255, 255)) ui.append(frame) print(f"After adding frame: {len(ui)} elements") diff --git a/tests/unit/generate_grid_screenshot.py b/tests/unit/generate_grid_screenshot.py index 706b704..8c4500d 100644 --- a/tests/unit/generate_grid_screenshot.py +++ b/tests/unit/generate_grid_screenshot.py @@ -22,14 +22,13 @@ mcrfpy.createScene("grid") texture = mcrfpy.Texture("assets/kenney_TD_MR_IP.png", 16, 16) # Title -title = mcrfpy.Caption(400, 30, "Grid Example - Dungeon View") +title = mcrfpy.Caption(pos=(400, 30), text="Grid Example - Dungeon View") title.font = mcrfpy.default_font title.font_size = 24 -title.font_color = (255, 255, 255) +title.fill_color = mcrfpy.Color(255, 255, 255) # Create main grid (20x15 tiles, each 32x32 pixels) -grid = mcrfpy.Grid(100, 100, 20, 15, texture, 32, 32) -grid.texture = texture +grid = mcrfpy.Grid(pos=(100, 100), grid_size=(20, 15), texture=texture, size=(640, 480)) # Define tile types from Crypt of Sokoban FLOOR = 58 # Stone floor @@ -63,36 +62,21 @@ grid.set_tile(12, 8, BOULDER) # Create some entities on the grid # Player entity -player = mcrfpy.Entity(5, 7) -player.texture = texture -player.sprite_index = 84 # Player sprite +player = mcrfpy.Entity((5, 7), texture=texture, sprite_index=84, grid=grid) # Player sprite # Enemy entities -rat1 = mcrfpy.Entity(12, 5) -rat1.texture = texture -rat1.sprite_index = 123 # Rat +rat1 = mcrfpy.Entity((12, 5), texture=texture, sprite_index=123, grid=grid) # Rat -rat2 = mcrfpy.Entity(14, 9) -rat2.texture = texture -rat2.sprite_index = 123 # Rat +rat2 = mcrfpy.Entity((14, 9), texture=texture, sprite_index=123, grid=grid) # Rat -cyclops = mcrfpy.Entity(10, 10) -cyclops.texture = texture -cyclops.sprite_index = 109 # Cyclops - -# Add entities to grid -grid.entities.append(player) -grid.entities.append(rat1) -grid.entities.append(rat2) -grid.entities.append(cyclops) +cyclops = mcrfpy.Entity((10, 10), texture=texture, sprite_index=109, grid=grid) # Cyclops # Create a smaller grid showing tile palette -palette_label = mcrfpy.Caption(100, 600, "Tile Types:") +palette_label = mcrfpy.Caption(pos=(100, 600), text="Tile Types:") palette_label.font = mcrfpy.default_font -palette_label.font_color = (255, 255, 255) +palette_label.fill_color = mcrfpy.Color(255, 255, 255) -palette = mcrfpy.Grid(250, 580, 7, 1, texture, 32, 32) -palette.texture = texture +palette = mcrfpy.Grid(pos=(250, 580), grid_size=(7, 1), texture=texture, size=(224, 32)) palette.set_tile(0, 0, FLOOR) palette.set_tile(1, 0, WALL) palette.set_tile(2, 0, DOOR) @@ -104,17 +88,17 @@ palette.set_tile(6, 0, BOULDER) # Labels for palette labels = ["Floor", "Wall", "Door", "Chest", "Button", "Exit", "Boulder"] for i, label in enumerate(labels): - l = mcrfpy.Caption(250 + i * 32, 615, label) + l = mcrfpy.Caption(pos=(250 + i * 32, 615), text=label) l.font = mcrfpy.default_font l.font_size = 10 - l.font_color = (255, 255, 255) + l.fill_color = mcrfpy.Color(255, 255, 255) mcrfpy.sceneUI("grid").append(l) # Add info caption -info = mcrfpy.Caption(100, 680, "Grid supports tiles and entities. Entities can move independently of the tile grid.") +info = mcrfpy.Caption(pos=(100, 680), text="Grid supports tiles and entities. Entities can move independently of the tile grid.") info.font = mcrfpy.default_font info.font_size = 14 -info.font_color = (200, 200, 200) +info.fill_color = mcrfpy.Color(200, 200, 200) # Add all elements to scene ui = mcrfpy.sceneUI("grid") diff --git a/tests/unit/generate_sprite_screenshot.py b/tests/unit/generate_sprite_screenshot.py index 3a314bb..ff6114c 100644 --- a/tests/unit/generate_sprite_screenshot.py +++ b/tests/unit/generate_sprite_screenshot.py @@ -22,20 +22,20 @@ mcrfpy.createScene("sprites") texture = mcrfpy.Texture("assets/kenney_TD_MR_IP.png", 16, 16) # Title -title = mcrfpy.Caption(400, 30, "Sprite Examples") +title = mcrfpy.Caption(pos=(400, 30), text="Sprite Examples") title.font = mcrfpy.default_font title.font_size = 24 -title.font_color = (255, 255, 255) +title.fill_color = mcrfpy.Color(255, 255, 255) # Create a frame background -frame = mcrfpy.Frame(50, 80, 700, 500) -frame.bgcolor = (64, 64, 128) +frame = mcrfpy.Frame(pos=(50, 80), size=(700, 500)) +frame.fill_color = mcrfpy.Color(64, 64, 128) frame.outline = 2 # Player sprite -player_label = mcrfpy.Caption(100, 120, "Player") +player_label = mcrfpy.Caption(pos=(100, 120), text="Player") player_label.font = mcrfpy.default_font -player_label.font_color = (255, 255, 255) +player_label.fill_color = mcrfpy.Color(255, 255, 255) player = mcrfpy.Sprite(120, 150) player.texture = texture @@ -43,9 +43,9 @@ player.sprite_index = 84 # Player sprite player.scale = (3.0, 3.0) # Enemy sprites -enemy_label = mcrfpy.Caption(250, 120, "Enemies") +enemy_label = mcrfpy.Caption(pos=(250, 120), text="Enemies") enemy_label.font = mcrfpy.default_font -enemy_label.font_color = (255, 255, 255) +enemy_label.fill_color = mcrfpy.Color(255, 255, 255) rat = mcrfpy.Sprite(250, 150) rat.texture = texture @@ -63,9 +63,9 @@ cyclops.sprite_index = 109 # Cyclops cyclops.scale = (3.0, 3.0) # Items row -items_label = mcrfpy.Caption(100, 250, "Items") +items_label = mcrfpy.Caption(pos=(100, 250), text="Items") items_label.font = mcrfpy.default_font -items_label.font_color = (255, 255, 255) +items_label.fill_color = mcrfpy.Color(255, 255, 255) # Boulder boulder = mcrfpy.Sprite(100, 280) @@ -92,9 +92,9 @@ button.sprite_index = 250 # Button button.scale = (3.0, 3.0) # UI elements row -ui_label = mcrfpy.Caption(100, 380, "UI Elements") +ui_label = mcrfpy.Caption(pos=(100, 380), text="UI Elements") ui_label.font = mcrfpy.default_font -ui_label.font_color = (255, 255, 255) +ui_label.fill_color = mcrfpy.Color(255, 255, 255) # Hearts heart_full = mcrfpy.Sprite(100, 410) @@ -119,9 +119,9 @@ armor.sprite_index = 211 # Armor armor.scale = (3.0, 3.0) # Scale demonstration -scale_label = mcrfpy.Caption(500, 120, "Scale Demo") +scale_label = mcrfpy.Caption(pos=(500, 120), text="Scale Demo") scale_label.font = mcrfpy.default_font -scale_label.font_color = (255, 255, 255) +scale_label.fill_color = mcrfpy.Color(255, 255, 255) # Same sprite at different scales for i, scale in enumerate([1.0, 2.0, 3.0, 4.0]): diff --git a/tests/unit/screenshot_transparency_fix_test.py b/tests/unit/screenshot_transparency_fix_test.py index 7da8878..5d5e333 100644 --- a/tests/unit/screenshot_transparency_fix_test.py +++ b/tests/unit/screenshot_transparency_fix_test.py @@ -17,42 +17,42 @@ def test_transparency_workaround(): # WORKAROUND: Create a full-window opaque frame as the first element # This acts as an opaque background since the scene clears with transparent print("Creating full-window opaque background...") - background = mcrfpy.Frame(0, 0, 1024, 768, + background = mcrfpy.Frame(pos=(0, 0), size=(1024, 768), fill_color=mcrfpy.Color(50, 50, 50), # Dark gray outline_color=None, outline=0.0) ui.append(background) print("✓ Added opaque background frame") - + # Now add normal content on top print("\nAdding test content...") - + # Red frame - frame1 = mcrfpy.Frame(100, 100, 200, 150, + frame1 = mcrfpy.Frame(pos=(100, 100), size=(200, 150), fill_color=mcrfpy.Color(255, 0, 0), outline_color=mcrfpy.Color(255, 255, 255), outline=3.0) ui.append(frame1) - + # Green frame - frame2 = mcrfpy.Frame(350, 100, 200, 150, + frame2 = mcrfpy.Frame(pos=(350, 100), size=(200, 150), fill_color=mcrfpy.Color(0, 255, 0), outline_color=mcrfpy.Color(0, 0, 0), outline=3.0) ui.append(frame2) - + # Blue frame - frame3 = mcrfpy.Frame(100, 300, 200, 150, + frame3 = mcrfpy.Frame(pos=(100, 300), size=(200, 150), fill_color=mcrfpy.Color(0, 0, 255), outline_color=mcrfpy.Color(255, 255, 0), outline=3.0) ui.append(frame3) - + # Add text - caption = mcrfpy.Caption(mcrfpy.Vector(250, 50), + caption = mcrfpy.Caption(pos=(250, 50), text="OPAQUE BACKGROUND TEST", fill_color=mcrfpy.Color(255, 255, 255)) - caption.size = 32 + caption.font_size = 32 ui.append(caption) # Take screenshot diff --git a/tests/unit/simple_screenshot_test.py b/tests/unit/simple_screenshot_test.py index 42815a4..3117a81 100644 --- a/tests/unit/simple_screenshot_test.py +++ b/tests/unit/simple_screenshot_test.py @@ -31,9 +31,9 @@ def take_screenshot(runtime): mcrfpy.createScene("test") # Add a visible element -caption = mcrfpy.Caption(100, 100, "Screenshot Test") +caption = mcrfpy.Caption(pos=(100, 100), text="Screenshot Test") caption.font = mcrfpy.default_font -caption.font_color = (255, 255, 255) +caption.fill_color = mcrfpy.Color(255, 255, 255) caption.font_size = 24 mcrfpy.sceneUI("test").append(caption) diff --git a/tests/unit/simple_timer_screenshot_test.py b/tests/unit/simple_timer_screenshot_test.py index 5a5c9ac..d4aa001 100644 --- a/tests/unit/simple_timer_screenshot_test.py +++ b/tests/unit/simple_timer_screenshot_test.py @@ -30,7 +30,7 @@ mcrfpy.setScene("test") ui = mcrfpy.sceneUI("test") # Add visible content - a white frame on default background -frame = mcrfpy.Frame(100, 100, 200, 200, +frame = mcrfpy.Frame(pos=(100, 100), size=(200, 200), fill_color=mcrfpy.Color(255, 255, 255)) ui.append(frame) diff --git a/tests/unit/test_animation_chaining.py b/tests/unit/test_animation_chaining.py index b8402fd..7b3700a 100644 --- a/tests/unit/test_animation_chaining.py +++ b/tests/unit/test_animation_chaining.py @@ -73,6 +73,9 @@ mcrfpy.createScene("chain_test") grid = mcrfpy.Grid(grid_x=20, grid_y=15) grid.fill_color = mcrfpy.Color(20, 20, 30) +# Add a color layer for cell coloring +color_layer = grid.add_layer("color", z_index=-1) + # Simple map for y in range(15): for x in range(20): @@ -80,17 +83,17 @@ for y in range(15): if x == 0 or x == 19 or y == 0 or y == 14: cell.walkable = False cell.transparent = False - cell.color = mcrfpy.Color(60, 40, 40) + color_layer.set(x, y, mcrfpy.Color(60, 40, 40)) else: cell.walkable = True cell.transparent = True - cell.color = mcrfpy.Color(100, 100, 120) + color_layer.set(x, y, mcrfpy.Color(100, 100, 120)) # Create entities -player = mcrfpy.Entity(2, 2, grid=grid) +player = mcrfpy.Entity((2, 2), grid=grid) player.sprite_index = 64 # @ -enemy = mcrfpy.Entity(17, 12, grid=grid) +enemy = mcrfpy.Entity((17, 12), grid=grid) enemy.sprite_index = 69 # E # UI setup @@ -99,15 +102,15 @@ ui.append(grid) grid.position = (100, 100) grid.size = (600, 450) -title = mcrfpy.Caption("Animation Chaining Test", 300, 20) +title = mcrfpy.Caption(pos=(300, 20), text="Animation Chaining Test") title.fill_color = mcrfpy.Color(255, 255, 255) ui.append(title) -status = mcrfpy.Caption("Press 1: Animate Player | 2: Animate Enemy | 3: Both | Q: Quit", 100, 50) +status = mcrfpy.Caption(pos=(100, 50), text="Press 1: Animate Player | 2: Animate Enemy | 3: Both | Q: Quit") status.fill_color = mcrfpy.Color(200, 200, 200) ui.append(status) -info = mcrfpy.Caption("Status: Ready", 100, 70) +info = mcrfpy.Caption(pos=(100, 70), text="Status: Ready") info.fill_color = mcrfpy.Color(100, 255, 100) ui.append(info) diff --git a/tests/unit/test_animation_debug.py b/tests/unit/test_animation_debug.py index 0b7ab7c..16c21a7 100644 --- a/tests/unit/test_animation_debug.py +++ b/tests/unit/test_animation_debug.py @@ -63,14 +63,15 @@ mcrfpy.createScene("anim_debug") # Simple grid grid = mcrfpy.Grid(grid_x=15, grid_y=10) +color_layer = grid.add_layer("color", z_index=-1) for y in range(10): for x in range(15): cell = grid.at(x, y) cell.walkable = True - cell.color = mcrfpy.Color(100, 100, 120) + color_layer.set(x, y, mcrfpy.Color(100, 100, 120)) # Test entity -entity = mcrfpy.Entity(5, 5, grid=grid) +entity = mcrfpy.Entity((5, 5), grid=grid) entity.sprite_index = 64 # UI @@ -79,19 +80,19 @@ ui.append(grid) grid.position = (100, 150) grid.size = (450, 300) -title = mcrfpy.Caption("Animation Debug Tool", 250, 20) +title = mcrfpy.Caption(pos=(250, 20), text="Animation Debug Tool") title.fill_color = mcrfpy.Color(255, 255, 255) ui.append(title) -status = mcrfpy.Caption("Press keys to test animations", 100, 50) +status = mcrfpy.Caption(pos=(100, 50), text="Press keys to test animations") status.fill_color = mcrfpy.Color(200, 200, 200) ui.append(status) -pos_display = mcrfpy.Caption("", 100, 70) +pos_display = mcrfpy.Caption(pos=(100, 70), text="") pos_display.fill_color = mcrfpy.Color(255, 255, 100) ui.append(pos_display) -active_display = mcrfpy.Caption("Active animations: 0", 100, 90) +active_display = mcrfpy.Caption(pos=(100, 90), text="Active animations: 0") active_display.fill_color = mcrfpy.Color(100, 255, 255) ui.append(active_display) diff --git a/tests/unit/test_animation_immediate.py b/tests/unit/test_animation_immediate.py index d24f713..e78c63c 100644 --- a/tests/unit/test_animation_immediate.py +++ b/tests/unit/test_animation_immediate.py @@ -13,7 +13,7 @@ print("2. Getting UI...") ui = mcrfpy.sceneUI("test") print("3. Creating frame...") -frame = mcrfpy.Frame(100, 100, 200, 200) +frame = mcrfpy.Frame(pos=(100, 100), size=(200, 200)) ui.append(frame) print("4. Creating Animation object...") diff --git a/tests/unit/test_animation_raii.py b/tests/unit/test_animation_raii.py index 86ce225..53de59b 100644 --- a/tests/unit/test_animation_raii.py +++ b/tests/unit/test_animation_raii.py @@ -30,7 +30,7 @@ def test_1_basic_animation(): """Test that basic animations still work""" try: ui = mcrfpy.sceneUI("test") - frame = mcrfpy.Frame(100, 100, 100, 100) + frame = mcrfpy.Frame(pos=(100, 100), size=(100, 100)) ui.append(frame) anim = mcrfpy.Animation("x", 200.0, 1000, "linear") @@ -49,7 +49,7 @@ def test_2_remove_animated_object(): """Test removing object with active animation""" try: ui = mcrfpy.sceneUI("test") - frame = mcrfpy.Frame(100, 100, 100, 100) + frame = mcrfpy.Frame(pos=(100, 100), size=(100, 100)) ui.append(frame) # Start animation @@ -73,7 +73,7 @@ def test_3_complete_animation(): """Test completing animation immediately""" try: ui = mcrfpy.sceneUI("test") - frame = mcrfpy.Frame(100, 100, 100, 100) + frame = mcrfpy.Frame(pos=(100, 100), size=(100, 100)) ui.append(frame) # Start animation @@ -98,7 +98,7 @@ def test_4_multiple_animations_timer(): nonlocal success try: ui = mcrfpy.sceneUI("test") - frame = mcrfpy.Frame(200, 200, 100, 100) + frame = mcrfpy.Frame(pos=(200, 200), size=(100, 100)) ui.append(frame) # Create multiple animations rapidly (this used to crash) @@ -129,7 +129,7 @@ def test_5_scene_cleanup(): # Add animated objects to first scene ui = mcrfpy.sceneUI("test") for i in range(5): - frame = mcrfpy.Frame(50 * i, 100, 40, 40) + frame = mcrfpy.Frame(pos=(50 * i, 100), size=(40, 40)) ui.append(frame) anim = mcrfpy.Animation("y", 300.0, 2000, "easeOutBounce") anim.start(frame) @@ -148,9 +148,9 @@ def test_6_animation_after_clear(): """Test animations after clearing UI""" try: ui = mcrfpy.sceneUI("test") - + # Create and animate - frame = mcrfpy.Frame(100, 100, 100, 100) + frame = mcrfpy.Frame(pos=(100, 100), size=(100, 100)) ui.append(frame) anim = mcrfpy.Animation("w", 200.0, 1500, "easeInOutCubic") anim.start(frame) @@ -207,7 +207,7 @@ mcrfpy.setScene("test") # Add a background ui = mcrfpy.sceneUI("test") -bg = mcrfpy.Frame(0, 0, 1024, 768) +bg = mcrfpy.Frame(pos=(0, 0), size=(1024, 768)) bg.fill_color = mcrfpy.Color(20, 20, 30) ui.append(bg) diff --git a/tests/unit/test_animation_removal.py b/tests/unit/test_animation_removal.py index a626d91..3aac09d 100644 --- a/tests/unit/test_animation_removal.py +++ b/tests/unit/test_animation_removal.py @@ -42,14 +42,14 @@ mcrfpy.setScene("test") ui = mcrfpy.sceneUI("test") # Add title and subtitle (to preserve during clearing) -title = mcrfpy.Caption("Test Title", 400, 20) -subtitle = mcrfpy.Caption("Test Subtitle", 400, 50) +title = mcrfpy.Caption(pos=(400, 20), text="Test Title") +subtitle = mcrfpy.Caption(pos=(400, 50), text="Test Subtitle") ui.extend([title, subtitle]) # Create initial animated objects print("Creating initial animated objects...") for i in range(10): - f = mcrfpy.Frame(50 + i*30, 100, 25, 25) + f = mcrfpy.Frame(pos=(50 + i*30, 100), size=(25, 25)) f.fill_color = mcrfpy.Color(255, 100, 100) ui.append(f) diff --git a/tests/unit/test_dijkstra_pathfinding.py b/tests/unit/test_dijkstra_pathfinding.py index 65ee1e6..a28b103 100644 --- a/tests/unit/test_dijkstra_pathfinding.py +++ b/tests/unit/test_dijkstra_pathfinding.py @@ -17,10 +17,15 @@ import sys def create_test_grid(): """Create a test grid with obstacles""" mcrfpy.createScene("dijkstra_test") - + # Create grid grid = mcrfpy.Grid(grid_x=20, grid_y=20) - + + # Add color layer for cell coloring + color_layer = grid.add_layer("color", z_index=-1) + # Store color_layer on grid for access elsewhere + grid._color_layer = color_layer + # Initialize all cells as walkable for y in range(grid.grid_y): for x in range(grid.grid_x): @@ -28,8 +33,8 @@ def create_test_grid(): cell.walkable = True cell.transparent = True cell.tilesprite = 46 # . period - cell.color = mcrfpy.Color(50, 50, 50) - + color_layer.set(x, y, mcrfpy.Color(50, 50, 50)) + # Create some walls to make pathfinding interesting # Vertical wall for y in range(5, 15): @@ -37,8 +42,8 @@ def create_test_grid(): cell.walkable = False cell.transparent = False cell.tilesprite = 219 # Block - cell.color = mcrfpy.Color(100, 100, 100) - + color_layer.set(10, y, mcrfpy.Color(100, 100, 100)) + # Horizontal wall for x in range(5, 15): if x != 10: # Leave a gap @@ -46,8 +51,8 @@ def create_test_grid(): cell.walkable = False cell.transparent = False cell.tilesprite = 219 - cell.color = mcrfpy.Color(100, 100, 100) - + color_layer.set(x, 10, mcrfpy.Color(100, 100, 100)) + return grid def test_basic_dijkstra(): @@ -133,7 +138,7 @@ def test_multi_target_scenario(): # Mark threat position cell = grid.at(tx, ty) cell.tilesprite = 84 # T for threat - cell.color = mcrfpy.Color(255, 0, 0) + grid._color_layer.set(tx, ty, mcrfpy.Color(255, 0, 0)) # Compute Dijkstra from this threat grid.compute_dijkstra(tx, ty) @@ -176,7 +181,7 @@ def test_multi_target_scenario(): # Mark safe position cell = grid.at(best_pos[0], best_pos[1]) cell.tilesprite = 83 # S for safe - cell.color = mcrfpy.Color(0, 255, 0) + grid._color_layer.set(best_pos[0], best_pos[1], mcrfpy.Color(0, 255, 0)) def run_test(runtime): """Timer callback to run tests after scene loads""" @@ -211,7 +216,7 @@ ui = mcrfpy.sceneUI("dijkstra_test") ui.append(grid) # Add title -title = mcrfpy.Caption("Dijkstra Pathfinding Test", 10, 10) +title = mcrfpy.Caption(pos=(10, 10), text="Dijkstra Pathfinding Test") title.fill_color = mcrfpy.Color(255, 255, 255) ui.append(title) diff --git a/tests/unit/test_entity_animation.py b/tests/unit/test_entity_animation.py index 342f340..2cf539e 100644 --- a/tests/unit/test_entity_animation.py +++ b/tests/unit/test_entity_animation.py @@ -17,13 +17,16 @@ mcrfpy.createScene("test_anim") grid = mcrfpy.Grid(grid_x=15, grid_y=15) grid.fill_color = mcrfpy.Color(20, 20, 30) +# Add a color layer for cell coloring +color_layer = grid.add_layer("color", z_index=-1) + # Initialize all cells as walkable floors for y in range(15): for x in range(15): cell = grid.at(x, y) cell.walkable = True cell.transparent = True - cell.color = mcrfpy.Color(100, 100, 120) + color_layer.set(x, y, mcrfpy.Color(100, 100, 120)) # Mark the path we'll follow with different color path_cells = [(5,5), (6,5), (7,5), (8,5), (9,5), (10,5), @@ -32,11 +35,10 @@ path_cells = [(5,5), (6,5), (7,5), (8,5), (9,5), (10,5), (5,9), (5,8), (5,7), (5,6)] for x, y in path_cells: - cell = grid.at(x, y) - cell.color = mcrfpy.Color(120, 120, 150) + color_layer.set(x, y, mcrfpy.Color(120, 120, 150)) # Create entity at start position -entity = mcrfpy.Entity(5, 5, grid=grid) +entity = mcrfpy.Entity((5, 5), grid=grid) entity.sprite_index = 64 # @ # UI setup @@ -46,27 +48,27 @@ grid.position = (100, 100) grid.size = (450, 450) # 15 * 30 pixels per cell # Title -title = mcrfpy.Caption("Entity Animation Test - Square Path", 200, 20) +title = mcrfpy.Caption(pos=(200, 20), text="Entity Animation Test - Square Path") title.fill_color = mcrfpy.Color(255, 255, 255) ui.append(title) # Status display -status = mcrfpy.Caption("Press SPACE to start animation | Q to quit", 100, 50) +status = mcrfpy.Caption(pos=(100, 50), text="Press SPACE to start animation | Q to quit") status.fill_color = mcrfpy.Color(200, 200, 200) ui.append(status) # Position display -pos_display = mcrfpy.Caption(f"Entity Position: ({entity.x:.2f}, {entity.y:.2f})", 100, 70) +pos_display = mcrfpy.Caption(pos=(100, 70), text=f"Entity Position: ({entity.x:.2f}, {entity.y:.2f})") pos_display.fill_color = mcrfpy.Color(255, 255, 100) ui.append(pos_display) # Animation info -anim_info = mcrfpy.Caption("Animation: Not started", 400, 70) +anim_info = mcrfpy.Caption(pos=(400, 70), text="Animation: Not started") anim_info.fill_color = mcrfpy.Color(100, 255, 255) ui.append(anim_info) # Debug info -debug_info = mcrfpy.Caption("Debug: Waiting...", 100, 570) +debug_info = mcrfpy.Caption(pos=(100, 570), text="Debug: Waiting...") debug_info.fill_color = mcrfpy.Color(150, 150, 150) ui.append(debug_info) diff --git a/tests/unit/test_entity_fix.py b/tests/unit/test_entity_fix.py index 90a660d..eef131b 100644 --- a/tests/unit/test_entity_fix.py +++ b/tests/unit/test_entity_fix.py @@ -33,16 +33,19 @@ mcrfpy.createScene("fix_demo") grid = mcrfpy.Grid(grid_x=15, grid_y=10) grid.fill_color = mcrfpy.Color(20, 20, 30) +# Add color layer for cell coloring +color_layer = grid.add_layer("color", z_index=-1) + # Make floor for y in range(10): for x in range(15): cell = grid.at(x, y) cell.walkable = True cell.transparent = True - cell.color = mcrfpy.Color(100, 100, 120) + color_layer.set(x, y, mcrfpy.Color(100, 100, 120)) # Create entity -entity = mcrfpy.Entity(2, 2, grid=grid) +entity = mcrfpy.Entity((2, 2), grid=grid) entity.sprite_index = 64 # @ # UI @@ -52,19 +55,19 @@ grid.position = (100, 150) grid.size = (450, 300) # Info displays -title = mcrfpy.Caption("Entity Animation Issue Demo", 250, 20) +title = mcrfpy.Caption(pos=(250, 20), text="Entity Animation Issue Demo") title.fill_color = mcrfpy.Color(255, 255, 255) ui.append(title) -pos_info = mcrfpy.Caption("", 100, 50) +pos_info = mcrfpy.Caption(pos=(100, 50), text="") pos_info.fill_color = mcrfpy.Color(255, 255, 100) ui.append(pos_info) -sprite_info = mcrfpy.Caption("", 100, 70) +sprite_info = mcrfpy.Caption(pos=(100, 70), text="") sprite_info.fill_color = mcrfpy.Color(255, 100, 100) ui.append(sprite_info) -status = mcrfpy.Caption("Press SPACE to animate entity", 100, 100) +status = mcrfpy.Caption(pos=(100, 100), text="Press SPACE to animate entity") status.fill_color = mcrfpy.Color(200, 200, 200) ui.append(status) diff --git a/tests/unit/test_entity_path_to.py b/tests/unit/test_entity_path_to.py index eab54d4..caeb4c1 100644 --- a/tests/unit/test_entity_path_to.py +++ b/tests/unit/test_entity_path_to.py @@ -22,8 +22,7 @@ for x, y in walls: grid.at(x, y).walkable = False # Create entity -entity = mcrfpy.Entity(2, 2) -grid.entities.append(entity) +entity = mcrfpy.Entity((2, 2), grid=grid) print(f"Entity at: ({entity.x}, {entity.y})") diff --git a/tests/unit/test_entity_path_to_edge_cases.py b/tests/unit/test_entity_path_to_edge_cases.py index f255aca..ef67d8f 100644 --- a/tests/unit/test_entity_path_to_edge_cases.py +++ b/tests/unit/test_entity_path_to_edge_cases.py @@ -9,7 +9,7 @@ print("=" * 50) # Test 1: Entity without grid print("Test 1: Entity not in grid") try: - entity = mcrfpy.Entity(5, 5) + entity = mcrfpy.Entity((5, 5)) path = entity.path_to(8, 8) print(" ✗ Should have failed for entity not in grid") except ValueError as e: @@ -31,8 +31,7 @@ for y in range(5): for x in range(5): grid.at(x, 2).walkable = False -entity = mcrfpy.Entity(1, 1) -grid.entities.append(entity) +entity = mcrfpy.Entity((1, 1), grid=grid) try: path = entity.path_to(1, 4) diff --git a/tests/unit/test_grid_background.py b/tests/unit/test_grid_background.py index c79cf8e..b74daf4 100644 --- a/tests/unit/test_grid_background.py +++ b/tests/unit/test_grid_background.py @@ -13,32 +13,28 @@ def test_grid_background(): ui = mcrfpy.sceneUI("test") # Create a grid with default background - grid = mcrfpy.Grid(20, 15, grid_size=(20, 15)) - grid.x = 50 - grid.y = 50 - grid.w = 400 - grid.h = 300 + grid = mcrfpy.Grid(pos=(50, 50), size=(400, 300), grid_size=(20, 15)) ui.append(grid) - - # Add some tiles to see the background better + + # Add color layer for some tiles to see the background better + color_layer = grid.add_layer("color", z_index=-1) for x in range(5, 15): for y in range(5, 10): - point = grid.at(x, y) - point.color = mcrfpy.Color(100, 150, 100) + color_layer.set(x, y, mcrfpy.Color(100, 150, 100)) # Add UI to show current background color - info_frame = mcrfpy.Frame(500, 50, 200, 150, + info_frame = mcrfpy.Frame(pos=(500, 50), size=(200, 150), fill_color=mcrfpy.Color(40, 40, 40), outline_color=mcrfpy.Color(200, 200, 200), outline=2) ui.append(info_frame) - - color_caption = mcrfpy.Caption(510, 60, "Background Color:") + + color_caption = mcrfpy.Caption(pos=(510, 60), text="Background Color:") color_caption.font_size = 14 color_caption.fill_color = mcrfpy.Color(255, 255, 255) info_frame.children.append(color_caption) - - color_display = mcrfpy.Caption(510, 80, "") + + color_display = mcrfpy.Caption(pos=(510, 80), text="") color_display.font_size = 12 color_display.fill_color = mcrfpy.Color(200, 200, 200) info_frame.children.append(color_display) diff --git a/tests/unit/test_headless_detection.py b/tests/unit/test_headless_detection.py index bfc284e..babe65d 100644 --- a/tests/unit/test_headless_detection.py +++ b/tests/unit/test_headless_detection.py @@ -11,8 +11,8 @@ ui = mcrfpy.sceneUI("detect_test") mcrfpy.setScene("detect_test") # Create a frame -frame = mcrfpy.Frame(100, 100, 200, 200) -frame.fill_color = (255, 100, 100, 255) +frame = mcrfpy.Frame(pos=(100, 100), size=(200, 200)) +frame.fill_color = mcrfpy.Color(255, 100, 100, 255) ui.append(frame) def test_mode(runtime): diff --git a/tests/unit/test_headless_modes.py b/tests/unit/test_headless_modes.py index 124e9f9..3e36658 100644 --- a/tests/unit/test_headless_modes.py +++ b/tests/unit/test_headless_modes.py @@ -10,13 +10,13 @@ ui = mcrfpy.sceneUI("headless_test") mcrfpy.setScene("headless_test") # Create a visible indicator -frame = mcrfpy.Frame(200, 200, 400, 200) -frame.fill_color = (100, 200, 100, 255) +frame = mcrfpy.Frame(pos=(200, 200), size=(400, 200)) +frame.fill_color = mcrfpy.Color(100, 200, 100, 255) ui.append(frame) -caption = mcrfpy.Caption((400, 300), "If you see this, windowed mode is working!", mcrfpy.default_font) -caption.size = 24 -caption.fill_color = (255, 255, 255) +caption = mcrfpy.Caption(pos=(400, 300), text="If you see this, windowed mode is working!") +caption.font_size = 24 +caption.fill_color = mcrfpy.Color(255, 255, 255) ui.append(caption) print("Script started. Window should appear unless --headless was specified.") diff --git a/tests/unit/test_metrics.py b/tests/unit/test_metrics.py index e760b2b..885e2c5 100644 --- a/tests/unit/test_metrics.py +++ b/tests/unit/test_metrics.py @@ -115,18 +115,18 @@ mcrfpy.setScene("metrics_test") ui = mcrfpy.sceneUI("metrics_test") # Create various UI elements -frame1 = mcrfpy.Frame(10, 10, 200, 150) -frame1.fill_color = (100, 100, 100, 128) +frame1 = mcrfpy.Frame(pos=(10, 10), size=(200, 150)) +frame1.fill_color = mcrfpy.Color(100, 100, 100, 128) ui.append(frame1) -caption1 = mcrfpy.Caption("Test Caption", 50, 50) +caption1 = mcrfpy.Caption(pos=(50, 50), text="Test Caption") ui.append(caption1) -sprite1 = mcrfpy.Sprite(100, 100) +sprite1 = mcrfpy.Sprite(pos=(100, 100)) ui.append(sprite1) # Invisible element (should not count as visible) -frame2 = mcrfpy.Frame(300, 10, 100, 100) +frame2 = mcrfpy.Frame(pos=(300, 10), size=(100, 100)) frame2.visible = False ui.append(frame2) diff --git a/tests/unit/test_path_colors.py b/tests/unit/test_path_colors.py index 779ff9e..1bcd9cd 100644 --- a/tests/unit/test_path_colors.py +++ b/tests/unit/test_path_colors.py @@ -11,17 +11,20 @@ print("=" * 50) mcrfpy.createScene("test") grid = mcrfpy.Grid(grid_x=5, grid_y=5) +# Add color layer for cell coloring +color_layer = grid.add_layer("color", z_index=-1) + # Initialize for y in range(5): for x in range(5): grid.at(x, y).walkable = True - grid.at(x, y).color = mcrfpy.Color(200, 200, 200) # Light gray + color_layer.set(x, y, mcrfpy.Color(200, 200, 200)) # Light gray # Add entities -e1 = mcrfpy.Entity(0, 0) -e2 = mcrfpy.Entity(4, 4) -grid.entities.append(e1) -grid.entities.append(e2) +e1 = mcrfpy.Entity((0, 0), grid=grid) +e2 = mcrfpy.Entity((4, 4), grid=grid) +e1.sprite_index = 64 +e2.sprite_index = 69 print(f"Entity 1 at ({e1.x}, {e1.y})") print(f"Entity 2 at ({e2.x}, {e2.y})") @@ -35,24 +38,25 @@ PATH_COLOR = mcrfpy.Color(100, 255, 100) # Green print(f"\nSetting path cells to green ({PATH_COLOR.r}, {PATH_COLOR.g}, {PATH_COLOR.b})...") for x, y in path: - cell = grid.at(x, y) # Check before - before = cell.color[:3] # Get RGB from tuple - + before_c = color_layer.at(x, y) + before = (before_c.r, before_c.g, before_c.b) + # Set color - cell.color = PATH_COLOR - + color_layer.set(x, y, PATH_COLOR) + # Check after - after = cell.color[:3] # Get RGB from tuple - + after_c = color_layer.at(x, y) + after = (after_c.r, after_c.g, after_c.b) + print(f" Cell ({x},{y}): {before} -> {after}") # Verify all path cells print("\nVerifying all cells in grid:") for y in range(5): for x in range(5): - cell = grid.at(x, y) - color = cell.color[:3] # Get RGB from tuple + c = color_layer.at(x, y) + color = (c.r, c.g, c.b) is_path = (x, y) in path print(f" ({x},{y}): color={color}, in_path={is_path}") diff --git a/tests/unit/test_pathfinding_integration.py b/tests/unit/test_pathfinding_integration.py index 8f779f6..a27f6a5 100644 --- a/tests/unit/test_pathfinding_integration.py +++ b/tests/unit/test_pathfinding_integration.py @@ -21,10 +21,8 @@ for i in range(5): grid.at(5, i + 2).walkable = False # Create entities -e1 = mcrfpy.Entity(2, 5) -e2 = mcrfpy.Entity(8, 5) -grid.entities.append(e1) -grid.entities.append(e2) +e1 = mcrfpy.Entity((2, 5), grid=grid) +e2 = mcrfpy.Entity((8, 5), grid=grid) # Test pathfinding between entities print(f"Entity 1 at ({e1.x}, {e1.y})") diff --git a/tests/unit/test_properties_quick.py b/tests/unit/test_properties_quick.py index 31822c2..e16774a 100644 --- a/tests/unit/test_properties_quick.py +++ b/tests/unit/test_properties_quick.py @@ -10,7 +10,7 @@ def test_properties(runtime): # Test Frame try: - frame = mcrfpy.Frame(10, 10, 100, 100) + frame = mcrfpy.Frame(pos=(10, 10), size=(100, 100)) print(f"Frame visible: {frame.visible}") frame.visible = False print(f"Frame visible after setting to False: {frame.visible}") diff --git a/tests/unit/test_scene_transitions.py b/tests/unit/test_scene_transitions.py index 603db6a..ea541b6 100644 --- a/tests/unit/test_scene_transitions.py +++ b/tests/unit/test_scene_transitions.py @@ -11,51 +11,51 @@ def create_test_scenes(): # Scene 1: Red background mcrfpy.createScene("red_scene") ui1 = mcrfpy.sceneUI("red_scene") - bg1 = mcrfpy.Frame(0, 0, 1024, 768, fill_color=mcrfpy.Color(255, 0, 0, 255)) - label1 = mcrfpy.Caption(512, 384, "RED SCENE", font=mcrfpy.Font.font_ui) - label1.color = mcrfpy.Color(255, 255, 255, 255) + bg1 = mcrfpy.Frame(pos=(0, 0), size=(1024, 768), fill_color=mcrfpy.Color(255, 0, 0, 255)) + label1 = mcrfpy.Caption(pos=(512, 384), text="RED SCENE", font=mcrfpy.Font.font_ui) + label1.fill_color = mcrfpy.Color(255, 255, 255, 255) ui1.append(bg1) ui1.append(label1) - + # Scene 2: Blue background mcrfpy.createScene("blue_scene") ui2 = mcrfpy.sceneUI("blue_scene") - bg2 = mcrfpy.Frame(0, 0, 1024, 768, fill_color=mcrfpy.Color(0, 0, 255, 255)) - label2 = mcrfpy.Caption(512, 384, "BLUE SCENE", font=mcrfpy.Font.font_ui) - label2.color = mcrfpy.Color(255, 255, 255, 255) + bg2 = mcrfpy.Frame(pos=(0, 0), size=(1024, 768), fill_color=mcrfpy.Color(0, 0, 255, 255)) + label2 = mcrfpy.Caption(pos=(512, 384), text="BLUE SCENE", font=mcrfpy.Font.font_ui) + label2.fill_color = mcrfpy.Color(255, 255, 255, 255) ui2.append(bg2) ui2.append(label2) - + # Scene 3: Green background mcrfpy.createScene("green_scene") ui3 = mcrfpy.sceneUI("green_scene") - bg3 = mcrfpy.Frame(0, 0, 1024, 768, fill_color=mcrfpy.Color(0, 255, 0, 255)) - label3 = mcrfpy.Caption(512, 384, "GREEN SCENE", font=mcrfpy.Font.font_ui) - label3.color = mcrfpy.Color(0, 0, 0, 255) # Black text on green + bg3 = mcrfpy.Frame(pos=(0, 0), size=(1024, 768), fill_color=mcrfpy.Color(0, 255, 0, 255)) + label3 = mcrfpy.Caption(pos=(512, 384), text="GREEN SCENE", font=mcrfpy.Font.font_ui) + label3.fill_color = mcrfpy.Color(0, 0, 0, 255) # Black text on green ui3.append(bg3) ui3.append(label3) - + # Scene 4: Menu scene with buttons mcrfpy.createScene("menu_scene") ui4 = mcrfpy.sceneUI("menu_scene") - bg4 = mcrfpy.Frame(0, 0, 1024, 768, fill_color=mcrfpy.Color(50, 50, 50, 255)) - - title = mcrfpy.Caption(512, 100, "SCENE TRANSITION DEMO", font=mcrfpy.Font.font_ui) - title.color = mcrfpy.Color(255, 255, 255, 255) + bg4 = mcrfpy.Frame(pos=(0, 0), size=(1024, 768), fill_color=mcrfpy.Color(50, 50, 50, 255)) + + title = mcrfpy.Caption(pos=(512, 100), text="SCENE TRANSITION DEMO", font=mcrfpy.Font.font_ui) + title.fill_color = mcrfpy.Color(255, 255, 255, 255) ui4.append(bg4) ui4.append(title) - + # Add instruction text - instructions = mcrfpy.Caption(512, 200, "Press keys 1-6 for different transitions", font=mcrfpy.Font.font_ui) - instructions.color = mcrfpy.Color(200, 200, 200, 255) + instructions = mcrfpy.Caption(pos=(512, 200), text="Press keys 1-6 for different transitions", font=mcrfpy.Font.font_ui) + instructions.fill_color = mcrfpy.Color(200, 200, 200, 255) ui4.append(instructions) - - controls = mcrfpy.Caption(512, 250, "1: Fade | 2: Slide Left | 3: Slide Right | 4: Slide Up | 5: Slide Down | 6: Instant", font=mcrfpy.Font.font_ui) - controls.color = mcrfpy.Color(150, 150, 150, 255) + + controls = mcrfpy.Caption(pos=(512, 250), text="1: Fade | 2: Slide Left | 3: Slide Right | 4: Slide Up | 5: Slide Down | 6: Instant", font=mcrfpy.Font.font_ui) + controls.fill_color = mcrfpy.Color(150, 150, 150, 255) ui4.append(controls) - - scene_info = mcrfpy.Caption(512, 300, "R: Red Scene | B: Blue Scene | G: Green Scene | M: Menu", font=mcrfpy.Font.font_ui) - scene_info.color = mcrfpy.Color(150, 150, 150, 255) + + scene_info = mcrfpy.Caption(pos=(512, 300), text="R: Red Scene | B: Blue Scene | G: Green Scene | M: Menu", font=mcrfpy.Font.font_ui) + scene_info.fill_color = mcrfpy.Color(150, 150, 150, 255) ui4.append(scene_info) print("Created test scenes: red_scene, blue_scene, green_scene, menu_scene") diff --git a/tests/unit/test_scene_transitions_headless.py b/tests/unit/test_scene_transitions_headless.py index 3dd791a..1e9b571 100644 --- a/tests/unit/test_scene_transitions_headless.py +++ b/tests/unit/test_scene_transitions_headless.py @@ -13,13 +13,13 @@ def test_scene_transitions(): # Scene 1 mcrfpy.createScene("scene1") ui1 = mcrfpy.sceneUI("scene1") - frame1 = mcrfpy.Frame(0, 0, 100, 100, fill_color=mcrfpy.Color(255, 0, 0)) + frame1 = mcrfpy.Frame(pos=(0, 0), size=(100, 100), fill_color=mcrfpy.Color(255, 0, 0)) ui1.append(frame1) - - # Scene 2 + + # Scene 2 mcrfpy.createScene("scene2") ui2 = mcrfpy.sceneUI("scene2") - frame2 = mcrfpy.Frame(0, 0, 100, 100, fill_color=mcrfpy.Color(0, 0, 255)) + frame2 = mcrfpy.Frame(pos=(0, 0), size=(100, 100), fill_color=mcrfpy.Color(0, 0, 255)) ui2.append(frame2) # Test each transition type diff --git a/tests/unit/test_simple_drawable.py b/tests/unit/test_simple_drawable.py index a42fdcb..8a03baf 100644 --- a/tests/unit/test_simple_drawable.py +++ b/tests/unit/test_simple_drawable.py @@ -8,7 +8,7 @@ def simple_test(runtime): try: # Test basic functionality - frame = mcrfpy.Frame(10, 10, 100, 100) + frame = mcrfpy.Frame(pos=(10, 10), size=(100, 100)) print(f"Frame created: visible={frame.visible}, opacity={frame.opacity}") bounds = frame.get_bounds() diff --git a/tests/unit/test_text_input.py b/tests/unit/test_text_input.py index 69464df..bc39a7f 100644 --- a/tests/unit/test_text_input.py +++ b/tests/unit/test_text_input.py @@ -18,13 +18,13 @@ def create_demo(): scene = mcrfpy.sceneUI("text_demo") # Background - bg = mcrfpy.Frame(0, 0, 800, 600) - bg.fill_color = (40, 40, 40, 255) + bg = mcrfpy.Frame(pos=(0, 0), size=(800, 600)) + bg.fill_color = mcrfpy.Color(40, 40, 40, 255) scene.append(bg) - + # Title - title = mcrfpy.Caption("Text Input Widget Demo", 20, 20) - title.fill_color = (255, 255, 255, 255) + title = mcrfpy.Caption(pos=(20, 20), text="Text Input Widget Demo") + title.fill_color = mcrfpy.Color(255, 255, 255, 255) scene.append(title) # Focus manager @@ -62,8 +62,8 @@ def create_demo(): inputs.append(comment_input) # Status display - status = mcrfpy.Caption("Ready for input...", 50, 360) - status.fill_color = (150, 255, 150, 255) + status = mcrfpy.Caption(pos=(50, 360), text="Ready for input...") + status.fill_color = mcrfpy.Color(150, 255, 150, 255) scene.append(status) # Update handler diff --git a/tests/unit/test_uicaption_visual.py b/tests/unit/test_uicaption_visual.py index 7d578f2..a4e3fc5 100644 --- a/tests/unit/test_uicaption_visual.py +++ b/tests/unit/test_uicaption_visual.py @@ -69,11 +69,11 @@ def main(): mcrfpy.setScene("test") # Create multiple captions for testing - caption1 = mcrfpy.Caption(50, 50, "Caption 1: Normal", fill_color=(255, 255, 255)) - caption2 = mcrfpy.Caption(50, 100, "Caption 2: Will be invisible", fill_color=(255, 200, 200)) - caption3 = mcrfpy.Caption(50, 150, "Caption 3: 50% opacity", fill_color=(200, 255, 200)) - caption4 = mcrfpy.Caption(50, 200, "Caption 4: 25% opacity", fill_color=(200, 200, 255)) - caption5 = mcrfpy.Caption(50, 250, "Caption 5: 0% opacity", fill_color=(255, 255, 200)) + caption1 = mcrfpy.Caption(pos=(50, 50), text="Caption 1: Normal", fill_color=mcrfpy.Color(255, 255, 255)) + caption2 = mcrfpy.Caption(pos=(50, 100), text="Caption 2: Will be invisible", fill_color=mcrfpy.Color(255, 200, 200)) + caption3 = mcrfpy.Caption(pos=(50, 150), text="Caption 3: 50% opacity", fill_color=mcrfpy.Color(200, 255, 200)) + caption4 = mcrfpy.Caption(pos=(50, 200), text="Caption 4: 25% opacity", fill_color=mcrfpy.Color(200, 200, 255)) + caption5 = mcrfpy.Caption(pos=(50, 250), text="Caption 5: 0% opacity", fill_color=mcrfpy.Color(255, 255, 200)) # Add captions to scene ui = mcrfpy.sceneUI("test") @@ -84,7 +84,7 @@ def main(): ui.append(caption5) # Also add a frame as background to see transparency better - frame = mcrfpy.Frame(40, 40, 400, 250, fill_color=(50, 50, 50)) + frame = mcrfpy.Frame(pos=(40, 40), size=(400, 250), fill_color=mcrfpy.Color(50, 50, 50)) frame.z_index = -1 # Put it behind the captions ui.append(frame) diff --git a/tests/unit/test_visibility.py b/tests/unit/test_visibility.py index 23ea9fc..b866078 100644 --- a/tests/unit/test_visibility.py +++ b/tests/unit/test_visibility.py @@ -18,6 +18,9 @@ mcrfpy.createScene("visibility_test") grid = mcrfpy.Grid(grid_x=20, grid_y=15) grid.fill_color = mcrfpy.Color(20, 20, 30) # Dark background +# Add a color layer for cell coloring +color_layer = grid.add_layer("color", z_index=-1) + # Initialize grid - all walkable and transparent print("\nInitializing 20x15 grid...") for y in range(15): @@ -25,7 +28,7 @@ for y in range(15): cell = grid.at(x, y) cell.walkable = True cell.transparent = True - cell.color = mcrfpy.Color(100, 100, 120) # Floor color + color_layer.set(x, y, mcrfpy.Color(100, 100, 120)) # Floor color # Create some walls to block vision print("Adding walls...") @@ -47,14 +50,14 @@ for wall_group in walls: cell = grid.at(x, y) cell.walkable = False cell.transparent = False - cell.color = mcrfpy.Color(40, 20, 20) # Wall color + color_layer.set(x, y, mcrfpy.Color(40, 20, 20)) # Wall color # Create entities print("\nCreating entities...") entities = [ - mcrfpy.Entity(2, 7), # Left side - mcrfpy.Entity(18, 7), # Right side - mcrfpy.Entity(10, 1), # Top center (above wall) + mcrfpy.Entity((2, 7)), # Left side + mcrfpy.Entity((18, 7)), # Right side + mcrfpy.Entity((10, 1)), # Top center (above wall) ] for i, entity in enumerate(entities): @@ -138,17 +141,17 @@ grid.position = (50, 50) grid.size = (600, 450) # 20*30, 15*30 # Add title -title = mcrfpy.Caption("Knowledge Stubs 1 - Visibility Test", 200, 10) +title = mcrfpy.Caption(pos=(200, 10), text="Knowledge Stubs 1 - Visibility Test") title.fill_color = mcrfpy.Color(255, 255, 255) ui.append(title) # Add info -info = mcrfpy.Caption("Perspective: -1 (omniscient)", 50, 520) +info = mcrfpy.Caption(pos=(50, 520), text="Perspective: -1 (omniscient)") info.fill_color = mcrfpy.Color(200, 200, 200) ui.append(info) # Add legend -legend = mcrfpy.Caption("Black=Never seen, Dark gray=Discovered, Normal=Visible", 50, 540) +legend = mcrfpy.Caption(pos=(50, 540), text="Black=Never seen, Dark gray=Discovered, Normal=Visible") legend.fill_color = mcrfpy.Color(150, 150, 150) ui.append(legend) diff --git a/tests/unit/test_visual_path.py b/tests/unit/test_visual_path.py index 31b385f..11a8c71 100644 --- a/tests/unit/test_visual_path.py +++ b/tests/unit/test_visual_path.py @@ -4,28 +4,10 @@ import mcrfpy import sys -# Colors as tuples (r, g, b, a) -WALL_COLOR = (60, 30, 30, 255) -FLOOR_COLOR = (200, 200, 220, 255) -PATH_COLOR = (100, 255, 100, 255) - -def check_render(dt): - """Timer callback to verify rendering""" - print(f"\nTimer fired after {dt}ms") - - # Take screenshot - from mcrfpy import automation - automation.screenshot("visual_path_test.png") - print("Screenshot saved as visual_path_test.png") - - # Sample some path cells to verify colors - print("\nSampling path cell colors from grid:") - for x, y in [(1, 1), (2, 2), (3, 3)]: - cell = grid.at(x, y) - color = cell.color - print(f" Cell ({x},{y}): color={color[:3]}") - - sys.exit(0) +# Colors +WALL_COLOR = mcrfpy.Color(60, 30, 30) +FLOOR_COLOR = mcrfpy.Color(200, 200, 220) +PATH_COLOR = mcrfpy.Color(100, 255, 100) # Create scene mcrfpy.createScene("visual_test") @@ -34,20 +16,38 @@ mcrfpy.createScene("visual_test") grid = mcrfpy.Grid(grid_x=5, grid_y=5) grid.fill_color = mcrfpy.Color(0, 0, 0) +# Add color layer for cell coloring +color_layer = grid.add_layer("color", z_index=-1) + +def check_render(dt): + """Timer callback to verify rendering""" + print(f"\nTimer fired after {dt}ms") + + # Take screenshot + from mcrfpy import automation + automation.screenshot("visual_path_test.png") + print("Screenshot saved as visual_path_test.png") + + # Sample some path cells to verify colors + print("\nSampling path cell colors from grid:") + for x, y in [(1, 1), (2, 2), (3, 3)]: + color = color_layer.at(x, y) + print(f" Cell ({x},{y}): color=({color.r}, {color.g}, {color.b})") + + sys.exit(0) + # Initialize all cells as floor print("Initializing grid...") for y in range(5): for x in range(5): grid.at(x, y).walkable = True - grid.at(x, y).color = FLOOR_COLOR + color_layer.set(x, y, FLOOR_COLOR) # Create entities -e1 = mcrfpy.Entity(0, 0) -e2 = mcrfpy.Entity(4, 4) +e1 = mcrfpy.Entity((0, 0), grid=grid) +e2 = mcrfpy.Entity((4, 4), grid=grid) e1.sprite_index = 64 # @ e2.sprite_index = 69 # E -grid.entities.append(e1) -grid.entities.append(e2) print(f"Entity 1 at ({e1.x}, {e1.y})") print(f"Entity 2 at ({e2.x}, {e2.y})") @@ -60,7 +60,7 @@ print(f"\nPath from E1 to E2: {path}") if path: print("\nColoring path cells green...") for x, y in path: - grid.at(x, y).color = PATH_COLOR + color_layer.set(x, y, PATH_COLOR) print(f" Set ({x},{y}) to green") # Set up UI @@ -70,7 +70,7 @@ grid.position = (50, 50) grid.size = (250, 250) # Add title -title = mcrfpy.Caption("Path Visualization Test", 50, 10) +title = mcrfpy.Caption(pos=(50, 10), text="Path Visualization Test") title.fill_color = mcrfpy.Color(255, 255, 255) ui.append(title) diff --git a/tests/unit/ui_Frame_test_detailed.py b/tests/unit/ui_Frame_test_detailed.py index 3058d70..938a5a4 100644 --- a/tests/unit/ui_Frame_test_detailed.py +++ b/tests/unit/ui_Frame_test_detailed.py @@ -16,11 +16,11 @@ def test_issue_38_children(): print("\nTest 1: Passing children argument to Frame constructor") try: # Create some child elements - child1 = mcrfpy.Caption(mcrfpy.Vector(10, 10), text="Child 1") - child2 = mcrfpy.Sprite(mcrfpy.Vector(10, 30)) - + child1 = mcrfpy.Caption(pos=(10, 10), text="Child 1") + child2 = mcrfpy.Sprite(pos=(10, 30)) + # Try to create frame with children argument - frame = mcrfpy.Frame(10, 10, 200, 150, children=[child1, child2]) + frame = mcrfpy.Frame(pos=(10, 10), size=(200, 150), children=[child1, child2]) print("✗ UNEXPECTED: Frame accepted children argument (should fail per issue #38)") except TypeError as e: print(f"✓ EXPECTED: Frame constructor rejected children argument: {e}") @@ -30,12 +30,12 @@ def test_issue_38_children(): # Test 2: Verify children can be added after creation print("\nTest 2: Adding children after Frame creation") try: - frame = mcrfpy.Frame(10, 10, 200, 150) + frame = mcrfpy.Frame(pos=(10, 10), size=(200, 150)) ui.append(frame) - + # Add children via the children collection - child1 = mcrfpy.Caption(mcrfpy.Vector(10, 10), text="Added Child 1") - child2 = mcrfpy.Caption(mcrfpy.Vector(10, 30), text="Added Child 2") + child1 = mcrfpy.Caption(pos=(10, 10), text="Added Child 1") + child2 = mcrfpy.Caption(pos=(10, 30), text="Added Child 2") frame.children.append(child1) frame.children.append(child2) @@ -65,33 +65,33 @@ def test_issue_42_click_callback(): return True try: - frame1 = mcrfpy.Frame(10, 10, 200, 150) + frame1 = mcrfpy.Frame(pos=(10, 10), size=(200, 150)) ui.append(frame1) frame1.on_click = correct_callback print("✓ Click callback with correct signature assigned successfully") except Exception as e: print(f"✗ Failed to assign correct callback: {type(e).__name__}: {e}") - + # Test 2: Callback with wrong signature (no args) print("\nTest 2: Click callback with no arguments") def wrong_callback_no_args(): print(" Wrong callback called") - + try: - frame2 = mcrfpy.Frame(220, 10, 200, 150) + frame2 = mcrfpy.Frame(pos=(220, 10), size=(200, 150)) ui.append(frame2) frame2.on_click = wrong_callback_no_args print("✓ Click callback with no args assigned (will fail at runtime per issue #42)") except Exception as e: print(f"✗ Failed to assign callback: {type(e).__name__}: {e}") - + # Test 3: Callback with wrong signature (too few args) print("\nTest 3: Click callback with too few arguments") def wrong_callback_few_args(x, y): print(f" Wrong callback called: x={x}, y={y}") - + try: - frame3 = mcrfpy.Frame(10, 170, 200, 150) + frame3 = mcrfpy.Frame(pos=(10, 170), size=(200, 150)) ui.append(frame3) frame3.on_click = wrong_callback_few_args print("✓ Click callback with 2 args assigned (will fail at runtime per issue #42)") diff --git a/tests/unit/ui_Grid_none_texture_test.py b/tests/unit/ui_Grid_none_texture_test.py index 38150ef..a283cee 100644 --- a/tests/unit/ui_Grid_none_texture_test.py +++ b/tests/unit/ui_Grid_none_texture_test.py @@ -7,24 +7,24 @@ import sys def test_grid_none_texture(runtime): """Test Grid functionality without texture""" print("\n=== Testing Grid with None texture ===") - + # Test 1: Create Grid with None texture try: - grid = mcrfpy.Grid(10, 10, None, mcrfpy.Vector(50, 50), mcrfpy.Vector(400, 400)) + grid = mcrfpy.Grid(grid_size=(10, 10), pos=(50, 50), size=(400, 400)) print("✓ Grid created successfully with None texture") except Exception as e: print(f"✗ Failed to create Grid with None texture: {e}") sys.exit(1) - + # Add to UI ui = mcrfpy.sceneUI("grid_none_test") ui.append(grid) - + # Test 2: Verify grid properties try: grid_size = grid.grid_size print(f"✓ Grid size: {grid_size}") - + # Check texture property texture = grid.texture if texture is None: @@ -33,39 +33,41 @@ def test_grid_none_texture(runtime): print(f"✗ Grid texture should be None, got: {texture}") except Exception as e: print(f"✗ Property access failed: {e}") - - # Test 3: Access grid points and set colors + + # Test 3: Access grid points using ColorLayer (new API) + # Note: GridPoint no longer has .color - must use ColorLayer system try: + # Add a color layer to the grid + color_layer = grid.add_layer("color", z_index=-1) # Create a checkerboard pattern with colors for x in range(10): for y in range(10): - point = grid.at(x, y) if (x + y) % 2 == 0: - point.color = mcrfpy.Color(255, 0, 0, 255) # Red + color_layer.set(x, y, mcrfpy.Color(255, 0, 0, 255)) # Red else: - point.color = mcrfpy.Color(0, 0, 255, 255) # Blue - print("✓ Successfully set grid point colors") + color_layer.set(x, y, mcrfpy.Color(0, 0, 255, 255)) # Blue + print("✓ Successfully set grid colors via ColorLayer") except Exception as e: print(f"✗ Failed to set grid colors: {e}") - + # Test 4: Add entities to the grid try: # Create an entity with its own texture entity_texture = mcrfpy.Texture("assets/kenney_tinydungeon.png", 16, 16) - entity = mcrfpy.Entity(mcrfpy.Vector(5, 5), entity_texture, 1, grid) + entity = mcrfpy.Entity((5, 5), texture=entity_texture, sprite_index=1, grid=grid) grid.entities.append(entity) print(f"✓ Added entity to grid, total entities: {len(grid.entities)}") except Exception as e: print(f"✗ Failed to add entity: {e}") - + # Test 5: Test grid interaction properties try: # Test zoom grid.zoom = 2.0 print(f"✓ Set zoom to: {grid.zoom}") - - # Test center - grid.center = mcrfpy.Vector(5, 5) + + # Test center (uses pixel coordinates) + grid.center = (200, 200) print(f"✓ Set center to: {grid.center}") except Exception as e: print(f"✗ Grid properties failed: {e}") @@ -86,7 +88,7 @@ mcrfpy.setScene("grid_none_test") # Add a background frame so we can see the grid ui = mcrfpy.sceneUI("grid_none_test") -background = mcrfpy.Frame(0, 0, 800, 600, +background = mcrfpy.Frame(pos=(0, 0), size=(800, 600), fill_color=mcrfpy.Color(200, 200, 200), outline_color=mcrfpy.Color(0, 0, 0), outline=2.0) diff --git a/tests/unit/ui_UICollection_issue69_test.py b/tests/unit/ui_UICollection_issue69_test.py index 3299bcd..44af8d2 100644 --- a/tests/unit/ui_UICollection_issue69_test.py +++ b/tests/unit/ui_UICollection_issue69_test.py @@ -11,8 +11,8 @@ def test_UICollection(): ui = mcrfpy.sceneUI("collection_test") # Add various UI elements - frame = mcrfpy.Frame(10, 10, 100, 100) - caption = mcrfpy.Caption(mcrfpy.Vector(120, 10), text="Test") + frame = mcrfpy.Frame(pos=(10, 10), size=(100, 100)) + caption = mcrfpy.Caption(pos=(120, 10), text="Test") # Skip sprite for now since it requires a texture ui.append(frame) @@ -74,9 +74,9 @@ def test_UICollection(): # Test type preservation (Issue #76) try: # Add a frame with children to test nested collections - parent_frame = mcrfpy.Frame(250, 10, 200, 200, + parent_frame = mcrfpy.Frame(pos=(250, 10), size=(200, 200), fill_color=mcrfpy.Color(200, 200, 200)) - child_caption = mcrfpy.Caption(mcrfpy.Vector(10, 10), text="Child") + child_caption = mcrfpy.Caption(pos=(10, 10), text="Child") parent_frame.children.append(child_caption) ui.append(parent_frame) diff --git a/tests/unit/validate_screenshot_test.py b/tests/unit/validate_screenshot_test.py index e949eda..7e1a068 100644 --- a/tests/unit/validate_screenshot_test.py +++ b/tests/unit/validate_screenshot_test.py @@ -18,50 +18,50 @@ def test_screenshot_validation(): print("Creating UI elements...") # Bright red frame with white outline - frame1 = mcrfpy.Frame(50, 50, 300, 200, + frame1 = mcrfpy.Frame(pos=(50, 50), size=(300, 200), fill_color=mcrfpy.Color(255, 0, 0), # Bright red outline_color=mcrfpy.Color(255, 255, 255), # White outline=5.0) ui.append(frame1) print("Added red frame at (50, 50)") - + # Bright green frame - frame2 = mcrfpy.Frame(400, 50, 300, 200, + frame2 = mcrfpy.Frame(pos=(400, 50), size=(300, 200), fill_color=mcrfpy.Color(0, 255, 0), # Bright green outline_color=mcrfpy.Color(0, 0, 0), # Black outline=3.0) ui.append(frame2) print("Added green frame at (400, 50)") - + # Blue frame - frame3 = mcrfpy.Frame(50, 300, 300, 200, + frame3 = mcrfpy.Frame(pos=(50, 300), size=(300, 200), fill_color=mcrfpy.Color(0, 0, 255), # Bright blue outline_color=mcrfpy.Color(255, 255, 0), # Yellow outline=4.0) ui.append(frame3) print("Added blue frame at (50, 300)") - + # Add text captions - caption1 = mcrfpy.Caption(mcrfpy.Vector(60, 60), + caption1 = mcrfpy.Caption(pos=(60, 60), text="RED FRAME TEST", fill_color=mcrfpy.Color(255, 255, 255)) - caption1.size = 24 + caption1.font_size = 24 frame1.children.append(caption1) - - caption2 = mcrfpy.Caption(mcrfpy.Vector(410, 60), + + caption2 = mcrfpy.Caption(pos=(410, 60), text="GREEN FRAME TEST", fill_color=mcrfpy.Color(0, 0, 0)) - caption2.size = 24 + caption2.font_size = 24 ui.append(caption2) - - caption3 = mcrfpy.Caption(mcrfpy.Vector(60, 310), + + caption3 = mcrfpy.Caption(pos=(60, 310), text="BLUE FRAME TEST", fill_color=mcrfpy.Color(255, 255, 0)) - caption3.size = 24 + caption3.font_size = 24 ui.append(caption3) - + # White background frame to ensure non-transparent background - background = mcrfpy.Frame(0, 0, 1024, 768, + background = mcrfpy.Frame(pos=(0, 0), size=(1024, 768), fill_color=mcrfpy.Color(200, 200, 200)) # Light gray # Insert at beginning so it's behind everything ui.remove(len(ui) - 1) # Remove to re-add at start diff --git a/tests/unit/working_timer_test.py b/tests/unit/working_timer_test.py index 4435014..a9d96c5 100644 --- a/tests/unit/working_timer_test.py +++ b/tests/unit/working_timer_test.py @@ -11,16 +11,16 @@ mcrfpy.setScene("timer_works") ui = mcrfpy.sceneUI("timer_works") # Add visible content -frame = mcrfpy.Frame(100, 100, 300, 200, +frame = mcrfpy.Frame(pos=(100, 100), size=(300, 200), fill_color=mcrfpy.Color(255, 0, 0), outline_color=mcrfpy.Color(255, 255, 255), outline=3.0) ui.append(frame) -caption = mcrfpy.Caption(mcrfpy.Vector(150, 150), +caption = mcrfpy.Caption(pos=(150, 150), text="TIMER TEST SUCCESS", fill_color=mcrfpy.Color(255, 255, 255)) -caption.size = 24 +caption.font_size = 24 ui.append(caption) # Timer callback with correct signature