218 lines
6.4 KiB
Python
218 lines
6.4 KiB
Python
"""Integration tests for complete workflows."""
|
|
|
|
import pytest
|
|
import tempfile
|
|
import shutil
|
|
from pathlib import Path
|
|
|
|
from src.generators import RecursiveBacktrackingGenerator, KruskalGenerator
|
|
from src.solvers import BFSSolver, DFSSolver
|
|
from src.storage.file_handler import FileHandler
|
|
from src.visualization.image_renderer import ImageRenderer
|
|
from src.analysis.analyzer import MazeAnalyzer
|
|
|
|
|
|
class TestCompleteWorkflow:
|
|
"""Test complete end-to-end workflows."""
|
|
|
|
def test_generate_solve_analyze_workflow(self):
|
|
"""Test generating, solving, and analyzing a maze."""
|
|
# Generate maze
|
|
generator = RecursiveBacktrackingGenerator()
|
|
maze = generator.generate(15, 15, seed=42)
|
|
|
|
assert maze is not None
|
|
assert maze.rows == 15
|
|
assert maze.cols == 15
|
|
|
|
# Solve maze
|
|
solver = BFSSolver()
|
|
result = solver.solve(maze)
|
|
|
|
assert result['success']
|
|
assert result['path_length'] > 0
|
|
|
|
# Analyze maze
|
|
analysis = MazeAnalyzer.analyze(maze)
|
|
|
|
assert analysis['total_cells'] == 225
|
|
assert analysis['dead_ends'] > 0
|
|
|
|
def test_generate_save_load_workflow(self):
|
|
"""Test generating, saving, and loading a maze."""
|
|
# Create temp directory
|
|
temp_dir = tempfile.mkdtemp()
|
|
|
|
try:
|
|
# Generate maze
|
|
generator = KruskalGenerator()
|
|
maze = generator.generate(10, 10, seed=123)
|
|
|
|
# Save maze
|
|
filepath = FileHandler.save_maze(maze, 'test_maze', temp_dir)
|
|
assert Path(filepath).exists()
|
|
|
|
# Load maze
|
|
loaded_maze = FileHandler.load_maze('test_maze', temp_dir)
|
|
|
|
assert loaded_maze.rows == maze.rows
|
|
assert loaded_maze.cols == maze.cols
|
|
assert loaded_maze.seed == maze.seed
|
|
|
|
# Verify walls are preserved
|
|
for row in range(maze.rows):
|
|
for col in range(maze.cols):
|
|
original_cell = maze.get_cell(row, col)
|
|
loaded_cell = loaded_maze.get_cell(row, col)
|
|
assert original_cell.walls == loaded_cell.walls
|
|
|
|
finally:
|
|
shutil.rmtree(temp_dir)
|
|
|
|
def test_generate_render_workflow(self):
|
|
"""Test generating and rendering a maze."""
|
|
temp_dir = tempfile.mkdtemp()
|
|
|
|
try:
|
|
# Generate maze
|
|
generator = RecursiveBacktrackingGenerator()
|
|
maze = generator.generate(10, 10, seed=42)
|
|
|
|
# Render image
|
|
renderer = ImageRenderer(cell_size=20)
|
|
filepath = renderer.render(maze, 'test_render', temp_dir)
|
|
|
|
assert Path(filepath).exists()
|
|
|
|
# File should have content
|
|
file_size = Path(filepath).stat().st_size
|
|
assert file_size > 0
|
|
|
|
finally:
|
|
shutil.rmtree(temp_dir)
|
|
|
|
def test_generate_solve_render_workflow(self):
|
|
"""Test generating, solving, and rendering with solution."""
|
|
temp_dir = tempfile.mkdtemp()
|
|
|
|
try:
|
|
# Generate maze
|
|
generator = RecursiveBacktrackingGenerator()
|
|
maze = generator.generate(15, 15, seed=42)
|
|
|
|
# Solve maze
|
|
solver = DFSSolver()
|
|
result = solver.solve(maze)
|
|
|
|
# Render with solution
|
|
renderer = ImageRenderer(cell_size=20)
|
|
filepath = renderer.render(
|
|
maze,
|
|
'maze_with_solution',
|
|
temp_dir,
|
|
solution_path=result['path'],
|
|
visited_cells=result['visited']
|
|
)
|
|
|
|
assert Path(filepath).exists()
|
|
assert Path(filepath).stat().st_size > 0
|
|
|
|
finally:
|
|
shutil.rmtree(temp_dir)
|
|
|
|
def test_multiple_algorithms_workflow(self):
|
|
"""Test workflow with multiple algorithms."""
|
|
from src.generators import (
|
|
PrimGenerator,
|
|
SidewinderGenerator,
|
|
WilsonGenerator
|
|
)
|
|
|
|
generators = [
|
|
PrimGenerator(),
|
|
SidewinderGenerator(),
|
|
WilsonGenerator()
|
|
]
|
|
|
|
for generator in generators:
|
|
# Generate
|
|
maze = generator.generate(10, 10, seed=42)
|
|
assert maze is not None
|
|
|
|
# Solve with both solvers
|
|
for solver in [DFSSolver(), BFSSolver()]:
|
|
result = solver.solve(maze)
|
|
assert result['success']
|
|
|
|
# Analyze
|
|
analysis = MazeAnalyzer.analyze(maze)
|
|
assert analysis['total_cells'] == 100
|
|
|
|
|
|
class TestFileOperations:
|
|
"""Test file operation workflows."""
|
|
|
|
def test_save_list_delete_workflow(self):
|
|
"""Test saving, listing, and deleting mazes."""
|
|
temp_dir = tempfile.mkdtemp()
|
|
|
|
try:
|
|
generator = RecursiveBacktrackingGenerator()
|
|
|
|
# Save multiple mazes
|
|
maze1 = generator.generate(5, 5, seed=1)
|
|
maze2 = generator.generate(10, 10, seed=2)
|
|
|
|
FileHandler.save_maze(maze1, 'maze1', temp_dir)
|
|
FileHandler.save_maze(maze2, 'maze2', temp_dir)
|
|
|
|
# List mazes
|
|
files = FileHandler.list_saved_mazes(temp_dir)
|
|
assert len(files) == 2
|
|
assert 'maze1.json' in files
|
|
assert 'maze2.json' in files
|
|
|
|
# Delete one
|
|
deleted = FileHandler.delete_maze('maze1', temp_dir)
|
|
assert deleted
|
|
|
|
# List again
|
|
files = FileHandler.list_saved_mazes(temp_dir)
|
|
assert len(files) == 1
|
|
assert 'maze2.json' in files
|
|
|
|
finally:
|
|
shutil.rmtree(temp_dir)
|
|
|
|
def test_load_nonexistent_file(self):
|
|
"""Test loading a file that doesn't exist."""
|
|
temp_dir = tempfile.mkdtemp()
|
|
|
|
try:
|
|
with pytest.raises(FileNotFoundError):
|
|
FileHandler.load_maze('nonexistent', temp_dir)
|
|
|
|
finally:
|
|
shutil.rmtree(temp_dir)
|
|
|
|
|
|
class TestVisualization:
|
|
"""Test visualization workflows."""
|
|
|
|
def test_render_different_sizes(self):
|
|
"""Test rendering mazes of different sizes."""
|
|
temp_dir = tempfile.mkdtemp()
|
|
|
|
try:
|
|
generator = RecursiveBacktrackingGenerator()
|
|
renderer = ImageRenderer()
|
|
|
|
for size in [5, 10, 15]:
|
|
maze = generator.generate(size, size, seed=42)
|
|
filepath = renderer.render(maze, f'maze_{size}', temp_dir)
|
|
|
|
assert Path(filepath).exists()
|
|
|
|
finally:
|
|
shutil.rmtree(temp_dir)
|