7 Commits

Author SHA1 Message Date
Maoake Teriierooiterai d2f38468a4 need to be merge to the main and add some line for the makefile 2026-04-01 17:17:20 +02:00
Maoake Teriierooiterai b659871902 finish the mypy 2026-04-01 16:09:42 +02:00
Maoake Teriierooiterai c9e0cf0610 fix some mypy need to fix for the others 2026-04-01 15:25:38 +02:00
Maoake Teriierooiterai aadccfba53 finish the mypy strict 2026-04-01 15:19:46 +02:00
Maoake Teriierooiterai c7c7213fb9 fix some mypy strict on file a_maze_ing.py 2026-04-01 15:03:22 +02:00
Maoake Teriierooiterai 03b5f9e6fd fix mypy strict on MazeSolver and Maze Generator 2026-04-01 14:12:39 +02:00
maoake ed16566677 finish to fix parsing mypy 2026-03-31 22:43:03 +02:00
18 changed files with 154 additions and 166 deletions
-1
View File
@@ -216,4 +216,3 @@ __marimo__/
.streamlit/secrets.toml
test.txt
mazegen-1.0.0-py3-none-any.whl
+8 -13
View File
@@ -1,7 +1,3 @@
build:
uv build --clear --wheel
cp dist/*.whl mazegen-1.0.0-py3-none-any.whl
install:
uv sync
uv pip install mlx-2.2-py3-none-any.whl
@@ -16,18 +12,19 @@ debug:
uv pdb python3 a_maze_ing.py config.txt
clean:
rm -rf */**__pycache__ __pycache__ .mypy_cache .venv dist build */**/*.egg-info *.egg-info
fclean: clean
rm mazegen-1.0.0-py3-none-any.whl
rm -rf __pycache__ .mypy_cache .venv
lint:
uv run flake8 . --exclude=.venv
uv run mypy . --warn-return-any --warn-unused-ignores --ignore-missing-imports --disallow-untyped-defs --check-untyped-defs
uv run env PYTHONPATH=src python3 -m mypy --warn-return-any --warn-unused-ignores --ignore-missing-imports --disallow-untyped-defs --check-untyped-defs src
uv run env PYTHONPATH=src python3 -m mypy --warn-return-any --warn-unused-ignores --ignore-missing-imports --disallow-untyped-defs --check-untyped-defs tests
uv run env PYTHONPATH=src python3 -m mypy --warn-return-any --warn-unused-ignores --ignore-missing-imports --disallow-untyped-defs --check-untyped-defs a_maze_ing.py
lint-strict:
uv run flake8 .
uv run mypy . --strict
uv run flake8 . --exclude=.venv
uv run env PYTHONPATH=src python3 -m mypy --strict src
uv run env PYTHONPATH=src python3 -m mypy --strict tests
uv run env PYTHONPATH=src python3 -m mypy --strict a_maze_ing.py
run_test_parsing:
PYTHONPATH=src uv run pytest tests/test_parsing.py
@@ -41,5 +38,3 @@ run_test:
uv run pytest
mlx:
uv run python3 test.py
.PHONY: build install run debug clean fclean lint lint-strict run_test
View File
+29 -25
View File
@@ -1,8 +1,8 @@
from typing import Any
from numpy.typing import NDArray
from src.AMazeIng import AMazeIng
from src.parsing.Parsing import DataMaze as Parsing
from src.parsing import Parsing
from mlx import Mlx
import numpy as np
import time
@@ -21,13 +21,11 @@ class MazeMLX:
self.buf, self.bpp, self.size_line, self.format = (
self.mlx.mlx_get_data_addr(self.img_ptr)
)
self.path_printer = None
self.generator = None
def close(self) -> None:
self.mlx.mlx_destroy_image(self.mlx_ptr, self.img_ptr)
def close_loop(self, _: Any):
def close_loop(self, _: Any) -> None:
self.mlx.mlx_loop_exit(self.mlx_ptr)
def clear_image(self) -> None:
@@ -47,7 +45,8 @@ class MazeMLX:
"1: regen; 2: path; 3: color; 4: quit;",
)
def put_pixel(self, x, y, color: list | None = None) -> None:
def put_pixel(self, x: int, y: int, color: list[Any] | None = None
) -> None:
if x < 0 or y < 0 or x >= self.width or y >= self.height:
return
offset = y * self.size_line + x * (self.bpp // 8)
@@ -69,7 +68,7 @@ class MazeMLX:
self,
start: tuple[int, int],
end: tuple[int, int],
color: list | None = None,
color: list[Any] | None = None,
) -> None:
sx, sy = start
ex, ey = end
@@ -84,7 +83,7 @@ class MazeMLX:
self,
ul: tuple[int, int],
dr: tuple[int, int],
color: list | None = None,
color: list[Any] | None = None,
) -> None:
for y in range(min(ul[1], dr[1]), max(dr[1], ul[1])):
self.put_line(
@@ -117,7 +116,7 @@ class MazeMLX:
for color in colors:
yield color
def get_margin_line_len(self, maze: np.ndarray) -> tuple[int, int, int]:
def get_margin_line_len(self, maze: NDArray[Any]) -> tuple[int, int, int]:
rows = len(maze)
cols = len(maze[0])
@@ -131,7 +130,7 @@ class MazeMLX:
return (line_len, margin_x, margin_y)
def update_maze(self, maze: np.ndarray) -> None:
def update_maze(self, maze: NDArray[Any]) -> None:
self.clear_image()
line_len, margin_x, margin_y = self.get_margin_line_len(maze)
@@ -201,7 +200,7 @@ class MazeMLX:
self.put_block(ul, dr)
return
def put_start_end(self, amazing: AMazeIng):
def put_start_end(self, amazing: AMazeIng) -> None:
entry = amazing.entry
exit = amazing.exit
maze = amazing.maze.get_maze()
@@ -230,7 +229,8 @@ class MazeMLX:
)
self.put_block(ul, dr, [0x00, 0xFF, 0x40, 0x9F])
def draw_ft(self, maze: np.ndarray, color: list | None = None):
def draw_ft(self, maze: NDArray[Any], color: list[Any] | None = None
) -> None:
line_len, margin_x, margin_y = self.get_margin_line_len(maze)
for y in range(len(maze)):
@@ -243,26 +243,29 @@ class MazeMLX:
self.put_block((x0, y0), (x1, y1), color)
def draw_image(self, amazing: AMazeIng) -> None:
maze = amazing.maze.get_maze()
if self.render_maze(amazing):
if self.path_printer and self.print_path:
if self.print_path:
if self.render_path():
color = next(self.color_gen_ft)
self.draw_ft(amazing.maze.get_maze(), color)
if maze is not None:
self.draw_ft(maze, color)
next(self.timer_gen)
else:
self.time_gen()
self.update_maze(amazing.maze.get_maze())
self.draw_ft(amazing.maze.get_maze())
if maze is not None:
self.update_maze(maze)
self.draw_ft(maze)
self.put_start_end(amazing)
self.redraw_image()
def shift_color(self):
def shift_color(self) -> None:
self.color_gen = self.random_color()
def shift_color_ft(self):
def shift_color_ft(self) -> None:
self.color_gen_ft = self.random_color_ft()
def time_gen(self):
def time_gen(self) -> None:
self.timer_gen = self.time_generator()
def restart_maze(self, amazing: AMazeIng) -> None:
@@ -288,8 +291,10 @@ class MazeMLX:
def render_maze(self, amazing: AMazeIng) -> bool:
try:
maze = amazing.maze.get_maze()
next(self.generator)
self.update_maze(amazing.maze.get_maze())
if maze is not None:
self.update_maze(maze)
return False
except StopIteration:
pass
@@ -308,9 +313,8 @@ class MazeMLX:
if keycode == 52:
self.close_loop(None)
def handle_key_press_mteriier(
self, keycode: int, amazing: AMazeIng
) -> None:
def handle_key_press_mteriier(self, keycode: int,
amazing: AMazeIng) -> None:
if keycode == 38:
self.restart_maze(amazing)
self.print_path = False
@@ -331,7 +335,7 @@ class MazeMLX:
self.mlx.mlx_loop_hook(self.mlx_ptr, self.draw_image, amazing)
self.mlx.mlx_hook(self.win_ptr, 33, 0, self.close_loop, None)
self.mlx.mlx_hook(
self.win_ptr, 2, 1 << 0, self.handle_key_press_mteriier, amazing
self.win_ptr, 2, 1 << 0, self.handle_key_press, amazing
)
self.mlx.mlx_loop(self.mlx_ptr)
@@ -340,7 +344,7 @@ def main() -> None:
mlx = None
try:
mlx = MazeMLX(1000, 1000)
config = Parsing.get_data_maze("config.txt")
config = Parsing.DataMaze.get_data_maze("config.txt")
amazing = AMazeIng(**config)
mlx.start(amazing)
with open("test.txt", "w") as output:
+4 -4
View File
@@ -1,8 +1,8 @@
WIDTH=13
HEIGHT=13
WIDTH=10
HEIGHT=10
ENTRY=1,1
EXIT=5,5
OUTPUT_FILE=maze.txt
PERFECT=False
GENERATOR=Kruskal
SOLVER=AStar
GENERATOR=DFS
SOLVER=DFS
-25
View File
@@ -1,25 +0,0 @@
# This script does not check for errors or malformed files.
# It only validates that neighbooring cells sharing a wall have
# both the correct encoding.
# Usage: python3 output_validator.py output_maze.txt
import sys
if len(sys.argv) != 2:
print(f"Usage: python3 {sys.argv[0]} <output_file>")
sys.exit(1)
g = []
for line in open(sys.argv[1]):
if line.strip() == '':
break
g.append([int(c, 16) for c in line.strip(' \t\n\r')])
for r in range(len(g)):
for c in range(len(g[0])):
v = g[r][c]
if not all([(r < 1 or v & 1 == (g[r-1][c] >> 2) & 1),
(c >= len(g[0])-1 or (v >> 1) & 1 == (g[r][c+1] >> 3) & 1),
(r >= len(g)-1 or (v >> 2) & 1 == g[r+1][c] & 1),
(c < 1 or (v >> 3) & 1 == (g[r][c-1] >> 1) & 1)]):
print(f'Wrong encoding for ({c},{r})')
+1 -8
View File
@@ -20,14 +20,7 @@ dev = [
[tool.mypy]
python_version = "3.10"
explicit_package_bases = true
[tool.pytest.ini_options]
pythonpath = ["src"]
[build-system]
requires = ["setuptools>=78.1.0", "wheel>=0.45.1"]
build-backend = "setuptools.build_meta"
[tool.setuptools]
package-dir = {"" = "src/amaz_lib"}
+1 -1
View File
@@ -2,7 +2,7 @@ from typing import Generator
from typing_extensions import Self
from pydantic import BaseModel, Field, model_validator, ConfigDict
from src.amaz_lib import Maze, MazeGenerator, MazeSolver
from .amaz_lib import Maze, MazeGenerator, MazeSolver
class AMazeIng(BaseModel):
+37 -29
View File
@@ -1,12 +1,15 @@
from abc import ABC, abstractmethod
from typing import Generator, Set
from typing import Generator, Any
import numpy as np
from numpy.typing import NDArray
from .Cell import Cell
import math
import random
class MazeGenerator(ABC):
def __init__(self, start: tuple, end: tuple, perfect: bool) -> None:
def __init__(self, start: tuple[int, int], end: tuple[int, int],
perfect: bool) -> None:
self.start = (start[0] - 1, start[1] - 1)
self.end = (end[0] - 1, end[1] - 1)
self.perfect = perfect
@@ -14,10 +17,10 @@ class MazeGenerator(ABC):
@abstractmethod
def generator(
self, height: int, width: int, seed: int | None = None
) -> Generator[np.ndarray, None, np.ndarray]: ...
) -> Generator[NDArray[Any], None, NDArray[Any]]: ...
@staticmethod
def get_cell_ft(width: int, height: int) -> set:
def get_cell_ft(width: int, height: int) -> set[tuple[int, int]]:
forty_two = set()
y, x = (int(height / 2), int(width / 2))
forty_two.add((y, x - 1))
@@ -42,9 +45,10 @@ class MazeGenerator(ABC):
@staticmethod
def unperfect_maze(width: int, height: int,
maze: np.ndarray, forty_two: set | None,
maze: NDArray[Any],
forty_two: set[tuple[int, int]] | None,
prob: float = 0.1
) -> Generator[np.ndarray, None, np.ndarray]:
) -> Generator[NDArray[Any], None, NDArray[Any]]:
directions = {
"N": (0, -1),
"S": (0, 1),
@@ -94,19 +98,19 @@ class MazeGenerator(ABC):
class Kruskal(MazeGenerator):
class Set:
class KruskalSet:
def __init__(self, cells: list[int]) -> None:
self.cells: list[int] = cells
class Sets:
def __init__(self, sets: list[Set]) -> None:
def __init__(self, sets: list['Kruskal.KruskalSet']) -> None:
self.sets = sets
@staticmethod
def walls_to_maze(
walls: np.ndarray, height: int, width: int
) -> np.ndarray:
maze: np.ndarray = np.array(
walls: list[tuple[int, int]], height: int, width: int
) -> NDArray[Any]:
maze: NDArray[Any] = np.array(
[[Cell(value=0) for _ in range(width)] for _ in range(height)]
)
for wall in walls:
@@ -171,7 +175,7 @@ class Kruskal(MazeGenerator):
def generator(
self, height: int, width: int, seed: int | None = None
) -> Generator[np.ndarray, None, np.ndarray]:
) -> Generator[NDArray[Any], None, NDArray[Any]]:
cells_ft = None
if height > 10 and width > 10:
cells_ft = self.get_cell_ft(width, height)
@@ -180,7 +184,7 @@ class Kruskal(MazeGenerator):
if seed is not None:
np.random.seed(seed)
sets = self.Sets([self.Set([i]) for i in range(height * width)])
sets = self.Sets([self.KruskalSet([i]) for i in range(height * width)])
walls = []
for h in range(height):
for w in range(width - 1):
@@ -217,28 +221,29 @@ class Kruskal(MazeGenerator):
class DepthFirstSearch(MazeGenerator):
def __init__(self, start: bool, end: bool, perfect: bool) -> None:
def __init__(self, start: tuple[int, int], end: tuple[int, int],
perfect: bool) -> None:
self.start = (start[0] - 1, start[1] - 1)
self.end = (end[0] - 1, end[1] - 1)
self.perfect = perfect
self.forty_two: set | None = None
self.forty_two: set[tuple[int, int]] | None = None
def generator(
self, height: int, width: int, seed: int = None
) -> Generator[np.ndarray, None, np.ndarray]:
self, height: int, width: int, seed: int | None = None
) -> Generator[NDArray[Any], None, NDArray[Any]]:
if seed is not None:
np.random.seed(seed)
maze = self.init_maze(width, height)
if width > 9 and height > 9:
self.forty_two = self.get_cell_ft(width, height)
visited = np.zeros((height, width), dtype=bool)
visited: NDArray[np.object_] = np.zeros((height, width), dtype=bool)
if (
self.forty_two
and self.start not in self.forty_two
and self.end not in self.forty_two
):
visited = self.lock_cell_ft(visited, self.forty_two)
path = list()
path: list[tuple[int, int]] = list()
w_h = (width, height)
coord = (0, 0)
x, y = coord
@@ -277,20 +282,22 @@ class DepthFirstSearch(MazeGenerator):
return maze
@staticmethod
def init_maze(width: int, height: int) -> np.ndarray:
def init_maze(width: int, height: int) -> NDArray[Any]:
maze = np.array(
[[Cell(value=15) for _ in range(width)] for _ in range(height)]
)
return maze
@staticmethod
def add_cell_visited(coord: tuple, path: set) -> list:
def add_cell_visited(coord: tuple[int, int], path: list[tuple[int, int]]
) -> list[tuple[int, int]]:
path.append(coord)
return path
@staticmethod
def random_cells(visited: np.array, coord: tuple, w_h: tuple) -> list:
rand_cell = []
def random_cells(visited: NDArray[Any], coord: tuple[int, int],
w_h: tuple[int, int]) -> list[str]:
rand_cell: list[str] = []
x, y = coord
width, height = w_h
@@ -308,8 +315,8 @@ class DepthFirstSearch(MazeGenerator):
return rand_cell
@staticmethod
def next_step(rand_cell: list) -> str:
return np.random.choice(rand_cell)
def next_step(rand_cell: list[str]) -> str:
return random.choice(rand_cell)
@staticmethod
def broken_wall(cell: Cell, wall: str) -> Cell:
@@ -324,7 +331,7 @@ class DepthFirstSearch(MazeGenerator):
return cell
@staticmethod
def next_cell(x: int, y: int, next: str) -> tuple:
def next_cell(x: int, y: int, next: str) -> tuple[int, int]:
next_step = {"N": (0, -1), "S": (0, 1), "W": (-1, 0), "E": (1, 0)}
add_x, add_y = next_step[next]
return (x + add_x, y + add_y)
@@ -334,7 +341,8 @@ class DepthFirstSearch(MazeGenerator):
return {"N": "S", "S": "N", "W": "E", "E": "W"}[direction]
@staticmethod
def back_on_step(path: list, w_h: tuple, visited: np.ndarray) -> list:
def back_on_step(path: list[tuple[int, int]], w_h: tuple[int, int],
visited: NDArray[Any]) -> list[tuple[int, int]]:
while path:
last = path[-1]
if DepthFirstSearch.random_cells(visited, last, w_h):
@@ -344,8 +352,8 @@ class DepthFirstSearch(MazeGenerator):
@staticmethod
def lock_cell_ft(
visited: np.ndarray, forty_two: set[tuple[int]]
) -> np.ndarray:
visited: NDArray[Any], forty_two: set[tuple[int, int]]
) -> NDArray[Any]:
tab = [cell for cell in forty_two]
for cell in tab:
visited[cell] = True
+32 -24
View File
@@ -2,6 +2,8 @@ from abc import ABC, abstractmethod
from .Maze import Maze
from typing import Any
import numpy as np
from numpy.typing import NDArray
import random
class MazeSolver(ABC):
@@ -36,7 +38,6 @@ class AStar(MazeSolver):
def __init__(self, start: tuple[int, int], end: tuple[int, int]) -> None:
super().__init__(start, end)
self.path = []
def h(self, n: tuple[int, int]) -> int:
return (
@@ -48,9 +49,9 @@ class AStar(MazeSolver):
def get_paths(
self,
maze: np.ndarray,
maze: NDArray[Any],
actual: tuple[int, int],
close: list,
close: list['Node'],
) -> list[tuple[int, int]]:
path = [
(
@@ -88,7 +89,7 @@ class AStar(MazeSolver):
]
return [p for p in path if p is not None]
def get_path(self, maze: np.ndarray) -> list:
def get_path(self, maze: NDArray[Any]) -> list['Node']:
open: list[AStar.Node] = []
close: list[AStar.Node] = []
@@ -145,7 +146,7 @@ class AStar(MazeSolver):
else:
raise Exception("Translate error: AStar path not found")
def translate(self, close: list) -> str:
def translate(self, close: list['Node']) -> str:
current = close[-1]
res = ""
while True:
@@ -158,28 +159,35 @@ class AStar(MazeSolver):
def solve(
self, maze: Maze, height: int | None = None, width: int | None = None
) -> str:
path = self.get_path(maze.get_maze())
maze_arr = maze.get_maze()
if maze_arr is None:
raise Exception("Maze is not initialized")
path: list[AStar.Node] = self.get_path(maze_arr)
return self.translate(path)
class DepthFirstSearchSolver(MazeSolver):
def __init__(self, start, end):
def __init__(self, start: tuple[int, int], end: tuple[int, int]):
super().__init__(start, end)
def solve(
self, maze: Maze, height: int | None = None, width: int | None = None
) -> str:
path_str = ""
visited = np.zeros((height, width), dtype=bool)
path = list()
move = list()
if height is None or width is None:
raise Exception("We need Height and Width in the arg")
visited: NDArray[Any] = np.zeros((height, width), dtype=bool)
path: list[tuple[int, int]] = list()
move: list[str] = list()
maze_s = maze.get_maze()
if maze_s is None:
raise Exception("Maze is not initializef")
coord = self.start
h_w = (height, width)
h_w: tuple[int, int] = (height, width)
while coord != self.end:
visited[coord] = True
path.append(coord)
rand_p = self.random_path(visited, coord, maze_s, h_w)
rand_p: list[str] = self.random_path(visited, coord, maze_s, h_w)
if not rand_p:
path, move = self.back_on_step(
@@ -199,9 +207,9 @@ class DepthFirstSearchSolver(MazeSolver):
return path_str
@staticmethod
def random_path(
visited: np.ndarray, coord: tuple, maze: np.ndarray, h_w: tuple
) -> list:
def random_path(visited: NDArray[Any], coord: tuple[int, int],
maze: NDArray[Any], h_w: tuple[int, int]
) -> list[str]:
random_p = []
h, w = h_w
y, x = coord
@@ -220,17 +228,17 @@ class DepthFirstSearchSolver(MazeSolver):
return random_p
@staticmethod
def next_path(rand_path: list) -> str:
return np.random.choice(rand_path)
def next_path(rand_path: list[str]) -> str:
return random.choice(rand_path)
@staticmethod
def back_on_step(
path: list,
visited: np.ndarray,
maze: np.ndarray,
h_w: tuple,
move: list,
) -> list:
path: list[tuple[int, int]],
visited: NDArray[Any],
maze: NDArray[Any],
h_w: tuple[int, int],
move: list[str],
) -> tuple[list[Any], list[Any]]:
while path:
last = path[-1]
if DepthFirstSearchSolver.random_path(visited, last, maze, h_w):
@@ -240,7 +248,7 @@ class DepthFirstSearchSolver(MazeSolver):
return path, move
@staticmethod
def next_cell(coord: tuple, next: str) -> tuple:
def next_cell(coord: tuple[int, int], next: str) -> tuple[int, int]:
y, x = coord
next_step = {"N": (-1, 0), "S": (1, 0), "W": (0, -1), "E": (0, 1)}
add_y, add_x = next_step[next]
View File
+14 -12
View File
@@ -1,5 +1,6 @@
from src.amaz_lib.MazeGenerator import DepthFirstSearch, Kruskal
from src.amaz_lib.MazeSolver import AStar, DepthFirstSearchSolver
from ..amaz_lib import DepthFirstSearch, Kruskal
from ..amaz_lib import AStar, DepthFirstSearchSolver
from typing import Any
class DataMaze:
@@ -13,14 +14,14 @@ class DataMaze:
return data
@staticmethod
def transform_data(data: str) -> dict:
def transform_data(data: str) -> dict[str, str]:
tmp = data.split("\n")
tmp2 = [value.split("=", 1) for value in tmp if "=" in value]
data_t = {value[0]: value[1] for value in tmp2}
return data_t
@staticmethod
def verif_key_data(data: dict) -> None:
def verif_key_data(data: dict[str, str]) -> None:
key_test = {
"WIDTH",
"HEIGHT",
@@ -41,11 +42,11 @@ class DataMaze:
)
@staticmethod
def convert_values(data: dict):
def convert_values(data: dict[str, str]) -> dict[str, Any]:
key_int = {"WIDTH", "HEIGHT"}
key_tuple = {"ENTRY", "EXIT"}
key_bool = {"PERFECT"}
res: dict = {}
res: dict[str, Any] = {}
for key in key_int:
res.update({key: int(data[key])})
for key in key_tuple:
@@ -60,13 +61,14 @@ class DataMaze:
return res
@staticmethod
def get_solver_generator(data: dict, entry: tuple, exit: tuple,
perfect: bool) -> dict:
available_generator = {
def get_solver_generator(data: dict[str, str], entry: tuple[int, int],
exit: tuple[int, int],
perfect: bool) -> dict[str, Any]:
available_generator: dict[str, Any] = {
"Kruskal": Kruskal,
"DFS": DepthFirstSearch,
}
available_solver = {
available_solver: dict[str, Any] = {
"AStar": AStar,
"DFS": DepthFirstSearchSolver
}
@@ -77,7 +79,7 @@ class DataMaze:
return res
@staticmethod
def convert_tuple(data: str) -> tuple:
def convert_tuple(data: str) -> tuple[int, int]:
data_t = data.split(",")
if len(data_t) != 2:
raise ValueError(
@@ -96,7 +98,7 @@ class DataMaze:
return False
@staticmethod
def get_data_maze(name_file: str) -> dict:
def get_data_maze(name_file: str) -> dict[str, Any]:
try:
data_str = DataMaze.get_file_data(name_file)
data_dict = DataMaze.transform_data(data_str)
+6
View File
@@ -0,0 +1,6 @@
__version__ = "1.0.0"
__author__ = "mteriier, dgaillet"
from .Parsing import DataMaze
__all__ = ["DataMaze"]
View File
+3 -1
View File
@@ -15,7 +15,9 @@ def test_maze_setter_getter() -> None:
)
maze.set_maze(test)
assert numpy.array_equal(maze.get_maze(), test) is True
m = maze.get_maze()
assert m is not None
assert numpy.array_equal(m, test) is True
def test_maze_str() -> None:
+1 -5
View File
@@ -1,5 +1,5 @@
import numpy
from amaz_lib.MazeGenerator import DepthFirstSearch, MazeGenerator
from amaz_lib.MazeGenerator import DepthFirstSearch
class TestMazeGenerator:
@@ -12,7 +12,3 @@ class TestMazeGenerator:
maze = output
assert maze.shape == w_h
def test_gen_broken(self) -> None:
test = MazeGenerator.gen_broken_set(50, 50)
assert len(test) > 0
+17 -17
View File
@@ -4,71 +4,71 @@ import pytest
class TestParsing:
def test_get_data_valid(self):
def test_get_data_valid(self) -> None:
data = DataMaze.get_file_data("tests/test_txt/config_1.txt")
assert isinstance(data, str) is True
def test_file_error(self):
def test_file_error(self) -> None:
with pytest.raises(FileNotFoundError):
DataMaze.get_file_data("tete")
# def test_permission_error(self):
# def test_permission_error(self) -> None:
# with pytest.raises(PermissionError):
# DataMaze.get_file_data("tests/test_txt/error_1.txt")
def test_empty_file_error(self):
def test_empty_file_error(self) -> None:
with pytest.raises(ValueError):
DataMaze.get_file_data("tests/test_txt/error_6.txt")
def test_transform_data_valid(self):
def test_transform_data_valid(self) -> None:
data = DataMaze.get_file_data("tests/test_txt/config_1.txt")
data_2 = DataMaze.transform_data(data)
assert isinstance(data_2, dict)
def test_transform__index_error(self):
def test_transform__index_error(self) -> None:
with pytest.raises(IndexError):
DataMaze.transform_data("asdasdasdasdasdasda\nasdasdas=asdasd")
def test_key_data_error(self):
def test_key_data_error(self) -> None:
with pytest.raises(KeyError):
data = DataMaze.get_file_data("tests/test_txt/error_8.txt")
data2 = DataMaze.transform_data(data)
DataMaze.verif_key_data(data2)
def test_key_data_error_2(self):
def test_key_data_error_2(self) -> None:
with pytest.raises(KeyError):
data = DataMaze.get_file_data("tests/test_txt/error_9.txt")
data2 = DataMaze.transform_data(data)
DataMaze.verif_key_data(data2)
def test_convert_int(self):
def test_convert_int(self) -> None:
with pytest.raises(ValueError):
data = DataMaze.get_file_data("tests/test_txt/error_2.txt")
data2 = DataMaze.transform_data(data)
DataMaze.convert_values(data2)
def test_tuple_error(self):
def test_tuple_error(self) -> None:
with pytest.raises(ValueError):
DataMaze.convert_tuple("0,3,5,5")
def test_tuple_error1(self):
def test_tuple_error1(self) -> None:
with pytest.raises(AttributeError):
DataMaze.convert_tuple(None)
DataMaze.convert_tuple("None")
def test_bool_error(self):
def test_bool_error(self) -> None:
with pytest.raises(ValueError):
DataMaze.convert_bool("Trueeee")
def test_valid_tuple(self):
def test_valid_tuple(self) -> None:
assert DataMaze.convert_tuple("7534564654, 78") == (7534564654, 78)
def test_valid_bool(self):
def test_valid_bool(self) -> None:
assert DataMaze.convert_bool("False") is False
def test_valid_bool1(self):
def test_valid_bool1(self) -> None:
assert DataMaze.convert_bool("True") is True
def test_data_maze(self):
def test_data_maze(self) -> None:
data = DataMaze.get_data_maze("tests/test_txt/config_1.txt")
assert data["WIDTH"] == 200
assert data["HEIGHT"] == 100
Generated
+1 -1
View File
@@ -9,7 +9,7 @@ resolution-markers = [
[[package]]
name = "a-maze-ing"
version = "0.1.0"
source = { editable = "." }
source = { virtual = "." }
dependencies = [
{ name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
{ name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },