19 Commits

Author SHA1 Message Date
da7e a79d4e5c3b algorithm edited but nothing better 2026-03-24 15:33:50 +01:00
da7e 8dc00e238a Merge branch 'main' of github.com:maoakeEnterprise/amazing 2026-03-24 13:37:30 +01:00
da7e 0f19d24736 base but not working astar solver 2026-03-24 13:30:32 +01:00
Maoake Teriierooiterai 22c44333c1 Merge branch 'main' into parsing 2026-03-19 18:21:30 +01:00
Maoake Teriierooiterai b00ddc7d29 finish the unit testing on the parsing 2026-03-19 18:20:30 +01:00
Maoake Teriierooiterai e4e8ebfc13 adding the unit testing and modify some function for my unit testing its pretty good i learn how to get a good struct for my classes 2026-03-19 18:11:30 +01:00
da7e 0c20d2d063 pytest test_MazeGenerator 2026-03-19 17:45:00 +01:00
da7e 96b39fbeea Maze tester 2026-03-19 17:30:18 +01:00
da7e 97b35fe3eb add Cell tester + FIX: west setter for Cell class 2026-03-19 16:42:45 +01:00
da7e ac13df160f Merge branch 'config_class' 2026-03-19 16:14:04 +01:00
da7e d2d477d1b5 config class added 2026-03-19 16:13:13 +01:00
Maoake Teriierooiterai 721a7d00b9 change the name folder test into tests 2026-03-19 16:07:03 +01:00
Maoake Teriierooiterai 6d849a8121 Merge branch 'main' into parsing 2026-03-19 16:02:58 +01:00
Maoake Teriierooiterai a4d55d5692 finish the parsing need to be test 2026-03-19 16:00:19 +01:00
da7e c6c7e6e47e Generator class rework 2026-03-19 14:59:18 +01:00
da7e 84c4b63a6c ascii print + fix maze generator kruskal 2026-03-19 13:54:27 +01:00
da7e c14c043575 Rework and some fixes 2026-03-18 14:10:05 +01:00
Maoake Teriierooiterai 6b90e5fce5 adding in the parsing class DataMaze the funciton transform_data 2026-03-16 15:37:49 +01:00
Maoake Teriierooiterai 2f5d200c0a training on pytest for the unitesting and doing the parsing with a init in a package need to validate this with my teammate 2026-03-16 15:19:11 +01:00
28 changed files with 762 additions and 157 deletions
+1 -1
View File
@@ -98,7 +98,7 @@ ipython_config.py
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more # This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries. # commonly ignored for libraries.
# uv.lock uv.lock
# poetry # poetry
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
+5 -2
View File
@@ -8,12 +8,15 @@ debug:
uv pdb python3 a_maze_ing.py config.txt uv pdb python3 a_maze_ing.py config.txt
clean: clean:
rm -rf __pycache__ .mypy_cache rm -rf __pycache__ .mypy_cache .venv
lint: lint:
uv run flake8 . 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 mypy . --warn-return-any --warn-unused-ignores --ignore-missing-imports --disallow-untyped-defs --check-untyped-defs
lint-strict: lint-strict:
uv run flake8 . uv run flake8 .
uv run mypy . --strict uv run mypy . --strict
run_test:
uv run pytest
+13 -6
View File
@@ -1,16 +1,23 @@
import os
from numpy import ma from numpy import ma
from src.amaz_lib import kruskal from src.amaz_lib import MazeGenerator, Kruskal, AStar
from src.amaz_lib import Maze from src.amaz_lib import Maze
def main() -> None: def main() -> None:
try: # try:
maze = Maze(maze=None) maze = Maze(maze=None)
for alg in kruskal(10, 10): generator = Kruskal()
for alg in generator.generator(20, 20):
maze.set_maze(alg) maze.set_maze(alg)
maze.export_maze("test.txt") # os.system("clear")
except Exception as err: maze.ascii_print()
print(err) # solver = AStar((1, 1), (14, 18))
# print(solver.solve(maze))
# except Exception as err:
# print(err)
if __name__ == "__main__": if __name__ == "__main__":
+6
View File
@@ -0,0 +1,6 @@
WIDTH=200
HEIGHT=100
ENTRY=0,0
EXIT=19,14
OUTPUT_FILE=maze.txt
PERFECT=True
+4 -4
View File
@@ -14,12 +14,12 @@ dependencies = [
dev = [ dev = [
"mypy>=1.19.1", "mypy>=1.19.1",
"flake8>=7.3.0", "flake8>=7.3.0",
"pytest>=9.0.2",
] ]
[tool.mypy] [tool.mypy]
python_version = "3.10" python_version = "3.10"
exclude = [
".venv", [tool.pytest.ini_options]
"venv", pythonpath = ["src"]
]
+46
View File
@@ -0,0 +1,46 @@
from dataclasses import field
from os import eventfd_read
from typing import Generator
import numpy
from typing_extensions import Self
from pydantic import AfterValidator, BaseModel, Field, model_validator
from amaz_lib import Maze, MazeGenerator, MazeSolver
from amaz_lib.Cell import Cell
class AMazeIng(BaseModel):
width: int = Field(ge=3)
height: int = Field(ge=3)
entry: tuple[int, int]
exit: tuple[int, int]
output_file: str = Field(min_length=3)
perfect: bool = Field(default=True)
maze: Maze = Field(default=Maze(maze=numpy.array([])))
generator: MazeGenerator
solver: MazeSolver
@model_validator(mode="after")
def check_entry_exit(self) -> Self:
if self.entry[0] >= self.width or self.entry[1] >= self.height:
raise ValueError("Entry coordinates exceed the maze size")
if self.exit[0] >= self.width or self.exit[1] >= self.height:
raise ValueError("Exit coordinates exceed the maze size")
return self
def generate(self) -> Generator[Maze, None, None]:
for array in self.generator.generator(self.height, self.width):
self.maze.set_maze(array)
yield self.maze
def solve_path(self) -> str:
return self.solver.solve(self.maze)
def __str__(self) -> str:
res = self.maze.__str__()
res += "\n"
res += f"{self.entry[0]},{self.entry[1]}\n"
res += f"{self.exit[0]},{self.exit[1]}\n"
res += self.solve_path()
res += "\n"
return res
@@ -5,7 +5,7 @@ class Cell(BaseModel):
value: int = Field(ge=0, le=15) value: int = Field(ge=0, le=15)
def __str__(self) -> str: def __str__(self) -> str:
return hex(self.value).removeprefix("0x") return hex(self.value).removeprefix("0x").upper()
def set_value(self, value: int) -> None: def set_value(self, value: int) -> None:
self.value = value self.value = value
@@ -41,25 +41,10 @@ class Cell(BaseModel):
return self.value & 4 == 4 return self.value & 4 == 4
def set_west(self, is_wall: bool) -> None: def set_west(self, is_wall: bool) -> None:
if (not is_wall and self.value | 8 == 15) or ( if (not is_wall and self.value | 7 == 15) or (
is_wall and self.value | 8 != 15 is_wall and self.value | 7 != 15
): ):
self.value = self.value ^ (8) self.value = self.value ^ (8)
def get_west(self) -> bool: def get_west(self) -> bool:
return self.value & 8 == 8 return self.value & 8 == 8
def main() -> None:
c = Cell(value=1)
print(c.get_north())
c.set_north(True)
print(c.get_north())
c.set_north(True)
print(c.get_north())
c.set_north(False)
print(c.get_north())
if __name__ == "__main__":
main()
+48
View File
@@ -0,0 +1,48 @@
from dataclasses import dataclass
import numpy
from .Cell import Cell
from .MazeGenerator import MazeGenerator
@dataclass
class Maze:
maze: numpy.ndarray
def get_maze(self) -> numpy.ndarray | None:
return self.maze
def set_maze(self, new_maze: numpy.ndarray) -> None:
self.maze = new_maze
def __str__(self) -> str:
if self.maze is None:
return "None"
res = ""
for line in self.maze:
for cell in line:
res += cell.__str__()
res += "\n"
return res
def ascii_print(self) -> None:
for cell in self.maze[0]:
print("_", end="")
if cell.get_north():
print("__", end="")
else:
print(" ", end="")
print("_")
for line in self.maze:
for cell in line:
if cell is line[0] and cell.get_west():
print("|", end="")
if cell.get_south() is True:
print("__", end="")
else:
print(" ", end="")
if cell.get_est() is True:
print("|", end="")
else:
print("_", end="")
print()
+93
View File
@@ -0,0 +1,93 @@
from abc import ABC, abstractmethod
from dataclasses import dataclass
from typing import Generator, Set
import numpy as np
from .Cell import Cell
import math
class MazeGenerator(ABC):
@abstractmethod
def generator(
self, height: int, width: int
) -> Generator[np.ndarray, None, np.ndarray]: ...
class Kruskal(MazeGenerator):
class Set:
def __init__(self, cells: list[int]) -> None:
self.cells: list[int] = cells
@staticmethod
def walls_to_maze(
walls: np.ndarray, height: int, width: int
) -> np.ndarray:
maze: np.ndarray = np.array(
[[Cell(value=0) for _ in range(width)] for _ in range(height)]
)
for wall in walls:
x, y = wall
match y - x:
case 1:
maze[math.trunc((x / width))][x % width].set_est(True)
maze[math.trunc((y / width))][y % width].set_west(True)
case width:
maze[math.trunc((x / width))][x % width].set_south(True)
maze[math.trunc((y / width))][y % width].set_north(True)
for x in range(height):
for y in range(width):
if x == 0:
maze[x][y].set_north(True)
if x == height - 1:
maze[x][y].set_south(True)
if y == 0:
maze[x][y].set_west(True)
if y == width - 1:
maze[x][y].set_est(True)
return maze
@staticmethod
def is_in_same_set(sets: np.ndarray, wall: tuple[int, int]) -> bool:
a, b = wall
for set in sets:
if a in set.cells and b in set.cells:
return True
elif a in set.cells or b in set.cells:
return False
return False
@staticmethod
def merge_sets(sets: np.ndarray, wall: tuple[int, int]) -> None:
a, b = wall
base_set = None
for i in range(len(sets)):
if base_set is None and (a in sets[i].cells or b in sets[i].cells):
base_set = sets[i]
elif base_set and (a in sets[i].cells or b in sets[i].cells):
base_set.cells += sets[i].cells
np.delete(sets, i)
return
raise Exception("two sets not found")
def generator(
self, height: int, width: int
) -> Generator[np.ndarray, None, np.ndarray]:
sets = np.array([self.Set([i]) for i in range(height * width)])
walls = []
for h in range(height):
for w in range(width - 1):
walls += [(w + (width * h), w + (width * h) + 1)]
for h in range(height - 1):
for w in range(width):
walls += [(w + (width * h), w + (width * (h + 1)))]
print(walls)
np.random.shuffle(walls)
yield self.walls_to_maze(walls, height, width)
for wall in walls:
if not self.is_in_same_set(sets, wall):
self.merge_sets(sets, wall)
walls.remove(wall)
yield self.walls_to_maze(walls, height, width)
print(f"nb sets: {len(sets)}")
return self.walls_to_maze(walls, height, width)
+134
View File
@@ -0,0 +1,134 @@
from abc import ABC, abstractmethod
from .Maze import Maze
import numpy as np
class MazeSolver(ABC):
def __init__(self, start: tuple[int, int], end: tuple[int, int]) -> None:
self.start = (start[0] - 1, start[1] - 1)
self.end = (end[0] - 1, end[1] - 1)
@abstractmethod
def solve(self, maze: Maze) -> str: ...
class AStar(MazeSolver):
def __init__(self, start: tuple[int, int], end: tuple[int, int]) -> None:
super().__init__(start, end)
def f(self, n):
def g(n: tuple[int, int]) -> int:
res = 0
if n[0] < self.start[0]:
res += self.start[0] - n[0]
else:
res += n[0] - self.start[0]
if n[1] < self.start[1]:
res += self.start[1] - n[1]
else:
res += n[1] - self.start[1]
return res
def h(n: tuple[int, int]) -> int:
res = 0
if n[0] < self.end[0]:
res += self.end[0] - n[0]
else:
res += n[0] - self.end[0]
if n[1] < self.end[1]:
res += self.end[1] - n[1]
else:
res += n[1] - self.end[1]
return res
try:
return g(n) + h(n)
except Exception:
return 1000
def best_path(
self, maze: np.ndarray, actual: tuple[int, int]
) -> dict[str, int | None]:
print(actual)
path = {
"N": (
self.f((actual[0], actual[1] - 1))
if not maze[actual[0]][actual[1]].get_north() and actual[1] > 0
else None
),
"E": (
self.f((actual[0] + 1, actual[1]))
if not maze[actual[0]][actual[1]].get_est()
and actual[0] < len(maze) - 1
else None
),
"S": (
self.f((actual[0], actual[1] + 1))
if not maze[actual[0]][actual[1]].get_south()
and actual[1] < len(maze[0]) - 1
else None
),
"W": (
self.f((actual[0] - 1, actual[1]))
if not maze[actual[0]][actual[1]].get_west() and actual[0] > 0
else None
),
}
return {
k: v for k, v in sorted(path.items(), key=lambda item: item[0])
}
def get_opposit(self, dir: str) -> str:
match dir:
case "N":
return "S"
case "E":
return "W"
case "S":
return "N"
case "W":
return "E"
case _:
return ""
def get_next_pos(
self, dir: str, actual: tuple[int, int]
) -> tuple[int, int]:
match dir:
case "N":
return (actual[0], actual[1] - 1)
case "E":
return (actual[0] + 1, actual[1])
case "S":
return (actual[0], actual[1] + 1)
case "W":
return (actual[0] - 1, actual[1])
case _:
return actual
def get_path(
self, actual: tuple[int, int], maze: np.ndarray, pre: str | None
) -> str | None:
if actual == self.end:
return ""
paths = self.best_path(maze, actual)
for path in paths:
if paths[path] is None:
continue
if path != pre:
temp = self.get_path(
self.get_next_pos(path, actual),
maze,
self.get_opposit(path),
)
if not temp is None:
return path + temp
return None
def solve(self, maze: Maze) -> str:
print(maze)
res = self.get_path(self.start, maze.get_maze(), None)
if res is None:
raise Exception("Path not found")
return res
+5 -4
View File
@@ -1,7 +1,8 @@
from .classes.Cell import Cell from .Cell import Cell
from .classes.Maze import Maze from .Maze import Maze
from .generators.kruskal import kruskal from .MazeGenerator import MazeGenerator, Kruskal
from .MazeSolver import MazeSolver, AStar
__version__ = "1.0.0" __version__ = "1.0.0"
__author__ = "us" __author__ = "us"
__all__ = ["Cell", "Maze", "kruskal"] __all__ = ["Cell", "Maze", "MazeGenerator", "MazeSolver", "AStar", "Kruskal"]
-27
View File
@@ -1,27 +0,0 @@
from dataclasses import dataclass
from .Cell import Cell
@dataclass
class Maze:
maze: list[list[Cell]]
def get_maze(self) -> list[list[Cell]] | None:
return self.maze
def set_maze(self, new_maze: list[list[Cell]]) -> None:
self.maze = new_maze
def __str__(self) -> str:
if self.maze is None:
return "None"
res = ""
for line in self.maze:
for cell in line:
res += cell.__str__()
res += "\n"
return res
def export_maze(self, file_name: str):
with open(file_name, "w") as file:
file.write(self.__str__())
-83
View File
@@ -1,83 +0,0 @@
from typing import Generator
import numpy as np
from ..classes.Cell import Cell
import math
def walls_to_maze(
walls: list[tuple[int, int]],
height: int,
width: int,
) -> np.ndarray:
maze: np.ndarray = np.array(
[[Cell(value=0) for _ in range(width)] for _ in range(height)]
)
for wall in walls:
x, y = wall
match y - x:
case 1:
maze[math.trunc((x / width))][x % width].set_est(True)
maze[math.trunc((y / width))][y % width].set_west(True)
case 5:
maze[math.trunc((x / width))][x % width].set_south(True)
maze[math.trunc((y / width))][y % width].set_north(True)
return maze
def is_in_same_set(sets: list[list[int]], wall: tuple[int, int]) -> bool:
a, b = wall
for set in sets:
if a in set and b in set:
return True
if a in set or b in set:
return False
return False
def merge_sets(sets: list[list[int]], wall: tuple[int, int]) -> None:
a, b = wall
base_set = None
for set in sets:
if base_set is None and (a in set or b in set):
base_set = set
elif base_set and (a in set or b in set):
base_set += set
sets.remove(set)
def kruskal(
height: int, width: int
) -> Generator[np.ndarray, None, np.ndarray]:
sets = [[i] for i in range(height * width)]
walls = []
for h in range(height):
for w in range(width - 1):
walls += [(w + (width * h), w + (width * h) + 1)]
for w in range(width):
for h in range(height - 1):
walls += [(w + (width * h), w + (width * h) + width)]
np.random.shuffle(walls)
yield walls_to_maze(walls, height, width)
for wall in walls:
if not is_in_same_set(sets, wall):
merge_sets(sets, wall)
walls.remove(wall)
yield walls_to_maze(walls, height, width)
return walls_to_maze(walls, height, width)
def main():
try:
for alg in kruskal(10, 10):
maze = alg
# print(maze)
# print()
print(maze)
except GeneratorExit as maze:
print(maze)
if __name__ == "__main__":
main()
+97
View File
@@ -0,0 +1,97 @@
class DataMaze:
@staticmethod
def get_file_data(name_file: str) -> str:
with open(name_file, "r") as file:
data = file.read()
if data == "":
raise ValueError("The file is empty")
return data
@staticmethod
def transform_data(data: str) -> dict:
tmp = data.split("\n")
tmp2 = [
value.split("=", 1) for value in tmp
]
data_t = {
value[0]: value[1] for value in tmp2
}
return data_t
@staticmethod
def verif_key_data(data: dict) -> None:
key_test = {
"WIDTH", "HEIGHT", "ENTRY", "EXIT", "OUTPUT_FILE", "PERFECT"
}
set_key = {
key for key in data.keys()
}
if len(set_key) != len(key_test):
raise KeyError("Missing some data the len do not correspond")
res_key = {key for key in set_key if key not in key_test}
if len(res_key) != 0:
raise KeyError("Some Key "
f"do not correspond the keys: {res_key}")
@staticmethod
def convert_values(data: dict):
key_int = {"WIDTH", "HEIGHT"}
key_tuple = {"ENTRY", "EXIT"}
key_bool = {"PERFECT"}
res: dict = {}
for key in key_int:
res.update({key: int(data[key])})
for key in key_tuple:
res.update({key: DataMaze.convert_tuple(data[key])})
for key in key_bool:
res.update({key: DataMaze.convert_bool(data[key])})
res.update({"OUTPUT_FILE": data["OUTPUT_FILE"]})
return res
@staticmethod
def get_data_maze(name_file: str) -> dict:
try:
data_str = DataMaze.get_file_data(name_file)
data_dict = DataMaze.transform_data(data_str)
DataMaze.verif_key_data(data_dict)
data_maze = DataMaze.convert_values(data_dict)
return data_maze
except FileNotFoundError:
print("The file do not exist")
exit()
except PermissionError:
print("We dont have the Permission")
exit()
except ValueError as e:
print(f"Error during the convert or the file is empty: {e}")
exit()
except KeyError as e:
print(f"Error on the key in the file: {e}")
exit()
except IndexError as e:
print("In the function transform Data some data cannot "
f"be splited by '=' because '=' was not present: {e}")
exit()
except AttributeError as e:
print("Error on the "
f"funciton get_data_maze : {e}")
exit()
@staticmethod
def convert_tuple(data: str) -> tuple:
data_t = data.split(",")
if len(data_t) != 2:
raise ValueError("There is too much "
"argument in the coordinate given")
x, y = data_t
tup = (int(x), int(y))
return tup
@staticmethod
def convert_bool(data: str) -> bool:
if data != "True" and data != "False":
raise ValueError("This is not True or False")
if data == "True":
return True
return False
+6
View File
@@ -0,0 +1,6 @@
__version__ = "1.0.0"
__author__ = "mteriier, dgaillet"
from .Parsing import DataMaze
__all__ = ["DataMaze"]
+23 -10
View File
@@ -1,10 +1,23 @@
2a80002a80 7D53BFD3D57951517D1D
2a80282800 3D12C3903BD03AD4178D
282aaaa800 2BAEBEEEAA92EED547C9
2a82a802a8 2287ED17AAAC5393FFF0
2802800280 6C6951292A87D2AEBD30
002aaaaa80 37D43E8686E93AABAB8C
2a80280280 21516D2D47FEE8284049
00282aa828 6C7857C3FB9116C696D8
002a82aaa8 751453D6D2AAC57BE970
2aa8000028 3BA952D17EA83BD05470
22AAD2907BAE86967B74
2AA83C2EFC69696FBC35
686EE96FD7D4783FAD21
7ED17ED3D57D3EC52FA0
7B943D16FB7BABD3AFC8
7407C5297EB82EB84174
392D53C6912EE9447E9D
62A952BBAAC13EFD7B89
3AAC3EC6EABAAD557824
66C7C7D7D6C6C7D556CD
1,1
16,15
+31
View File
@@ -0,0 +1,31 @@
import pytest
from amaz_lib.Cell import Cell
def test_cell_setter_getter() -> None:
cell = Cell(value=0)
cell.set_north(True)
assert cell.get_north() is True
cell.set_north(False)
assert cell.get_north() is False
cell.set_est(True)
assert cell.get_est() is True
cell.set_est(False)
assert cell.get_est() is False
cell.set_south(True)
assert cell.get_south() is True
cell.set_south(False)
assert cell.get_south() is False
cell.set_west(True)
assert cell.get_west() is True
cell.set_west(False)
assert cell.get_west() is False
cell.set_value(8)
assert cell.get_value() == 8
cell.set_value(0)
assert cell.get_value() == 0
+31
View File
@@ -0,0 +1,31 @@
import numpy
from amaz_lib.Cell import Cell
from amaz_lib.Maze import Maze
def test_maze_setter_getter() -> None:
maze = Maze(numpy.array([]))
test = numpy.array(
[
[Cell(value=6), Cell(value=8), Cell(value=11)],
[Cell(value=6), Cell(value=8), Cell(value=11)],
[Cell(value=6), Cell(value=8), Cell(value=11)],
]
)
maze.set_maze(test)
assert numpy.array_equal(maze.get_maze(), test) == True
def test_maze_str() -> None:
test = numpy.array(
[
[Cell(value=6), Cell(value=8), Cell(value=11)],
[Cell(value=6), Cell(value=8), Cell(value=11)],
[Cell(value=6), Cell(value=8), Cell(value=11)],
]
)
maze = Maze(test)
assert maze.__str__() == "68B\n68B\n68B\n"
+11
View File
@@ -0,0 +1,11 @@
import numpy
from amaz_lib.MazeGenerator import Kruskal
def test_kruskal_output_shape() -> None:
generator = Kruskal()
maze = numpy.array([])
for output in generator.generator(10, 10):
maze = output
assert maze.shape == (10, 10)
+19
View File
@@ -0,0 +1,19 @@
from amaz_lib.Cell import Cell
import numpy as np
from amaz_lib import AStar, Maze, MazeSolver
def test_solver() -> None:
maze = Maze(
np.array(
[
[Cell(value=13), Cell(value=3), Cell(value=11)],
[Cell(value=9), Cell(value=4), Cell(value=6)],
[Cell(value=12), Cell(value=5), Cell(value=7)],
]
)
)
print(maze)
solver = AStar((1, 1), (3, 3))
res = solver.solve(maze)
assert res == "ESWSEE"
+78
View File
@@ -0,0 +1,78 @@
from parsing.Parsing import DataMaze
import pytest
class TestParsing:
def test_get_data_valid(self):
data = DataMaze.get_file_data("tests/test_txt/config_1.txt")
assert isinstance(data, str) is True
def test_file_error(self):
with pytest.raises(FileNotFoundError):
DataMaze.get_file_data("tete")
# def test_permission_error(self):
# with pytest.raises(PermissionError):
# DataMaze.get_file_data("tests/test_txt/error_1.txt")
def test_empty_file_error(self):
with pytest.raises(ValueError):
DataMaze.get_file_data("tests/test_txt/error_6.txt")
def test_transform_data_valid(self):
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):
with pytest.raises(IndexError):
DataMaze.transform_data("asdasdasdasdasdasda\nasdasdas=asdasd")
def test_key_data_error(self):
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):
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):
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):
with pytest.raises(ValueError):
DataMaze.convert_tuple("0,3,5,5")
def test_tuple_error1(self):
with pytest.raises(AttributeError):
DataMaze.convert_tuple(None)
def test_bool_error(self):
with pytest.raises(ValueError):
DataMaze.convert_bool("Trueeee")
def test_valid_tuple(self):
assert DataMaze.convert_tuple("7534564654, 78") == (7534564654, 78)
def test_valid_bool(self):
assert DataMaze.convert_bool("False") is False
def test_valid_bool1(self):
assert DataMaze.convert_bool("True") is True
def test_data_maze(self):
data = DataMaze.get_data_maze("tests/test_txt/config_1.txt")
assert data["WIDTH"] == 200
assert data["HEIGHT"] == 100
assert data["ENTRY"] == (0, 0)
assert data["EXIT"] == (19, 14)
assert data["OUTPUT_FILE"] == "maze.txt"
assert data["PERFECT"] is True
+6
View File
@@ -0,0 +1,6 @@
WIDTH=200
HEIGHT=100
ENTRY=0,0
EXIT=19,14
OUTPUT_FILE=maze.txt
PERFECT=True
+6
View File
@@ -0,0 +1,6 @@
WIDTH=200
HEIGHT=100
ENTRY=0,0
EXIT=19,14
OUTPUT_FILE=maze.txt
PERFECT=True
+6
View File
@@ -0,0 +1,6 @@
WIDTH=caca
HEIGHT=100
ENTRY=0,0
EXIT=19,14
OUTPUT_FILE=maze.txt
PERFECT=True
View File
+4
View File
@@ -0,0 +1,4 @@
WIDTH=200
HEIGHT=100
ENTRY=0,0
EXIT=19,14
+7
View File
@@ -0,0 +1,7 @@
WIDTH=200
HEIGHT=100
ENTRY=0,0
EXIT=19,14
OUTPUT_FILE=maze.txt
PERFECT=True
PIPI=tut
Generated
+77
View File
@@ -20,6 +20,7 @@ dependencies = [
dev = [ dev = [
{ name = "flake8" }, { name = "flake8" },
{ name = "mypy" }, { name = "mypy" },
{ name = "pytest" },
] ]
[package.metadata] [package.metadata]
@@ -32,6 +33,7 @@ requires-dist = [
dev = [ dev = [
{ name = "flake8", specifier = ">=7.3.0" }, { name = "flake8", specifier = ">=7.3.0" },
{ name = "mypy", specifier = ">=1.19.1" }, { name = "mypy", specifier = ">=1.19.1" },
{ name = "pytest", specifier = ">=9.0.2" },
] ]
[[package]] [[package]]
@@ -43,6 +45,27 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" },
] ]
[[package]]
name = "colorama"
version = "0.4.6"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
]
[[package]]
name = "exceptiongroup"
version = "1.3.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "typing-extensions", marker = "python_full_version < '3.11'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" },
]
[[package]] [[package]]
name = "flake8" name = "flake8"
version = "7.3.0" version = "7.3.0"
@@ -57,6 +80,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/9f/56/13ab06b4f93ca7cac71078fbe37fcea175d3216f31f85c3168a6bbd0bb9a/flake8-7.3.0-py2.py3-none-any.whl", hash = "sha256:b9696257b9ce8beb888cdbe31cf885c90d31928fe202be0889a7cdafad32f01e", size = 57922, upload-time = "2025-06-20T19:31:34.425Z" }, { url = "https://files.pythonhosted.org/packages/9f/56/13ab06b4f93ca7cac71078fbe37fcea175d3216f31f85c3168a6bbd0bb9a/flake8-7.3.0-py2.py3-none-any.whl", hash = "sha256:b9696257b9ce8beb888cdbe31cf885c90d31928fe202be0889a7cdafad32f01e", size = 57922, upload-time = "2025-06-20T19:31:34.425Z" },
] ]
[[package]]
name = "iniconfig"
version = "2.3.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
]
[[package]] [[package]]
name = "librt" name = "librt"
version = "0.8.1" version = "0.8.1"
@@ -353,6 +385,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/57/a7/b35835e278c18b85206834b3aa3abe68e77a98769c59233d1f6300284781/numpy-2.4.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4b42639cdde6d24e732ff823a3fa5b701d8acad89c4142bc1d0bd6dc85200ba5", size = 12504685, upload-time = "2026-03-09T07:58:50.525Z" }, { url = "https://files.pythonhosted.org/packages/57/a7/b35835e278c18b85206834b3aa3abe68e77a98769c59233d1f6300284781/numpy-2.4.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4b42639cdde6d24e732ff823a3fa5b701d8acad89c4142bc1d0bd6dc85200ba5", size = 12504685, upload-time = "2026-03-09T07:58:50.525Z" },
] ]
[[package]]
name = "packaging"
version = "26.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" },
]
[[package]] [[package]]
name = "pathspec" name = "pathspec"
version = "1.0.4" version = "1.0.4"
@@ -362,6 +403,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", size = 55206, upload-time = "2026-01-27T03:59:45.137Z" }, { url = "https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", size = 55206, upload-time = "2026-01-27T03:59:45.137Z" },
] ]
[[package]]
name = "pluggy"
version = "1.6.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
]
[[package]] [[package]]
name = "pycodestyle" name = "pycodestyle"
version = "2.14.0" version = "2.14.0"
@@ -513,6 +563,33 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl", hash = "sha256:f742a7dbd0d9cb9ea41e9a24a918996e8170c799fa528688d40dd582c8265f4f", size = 63551, upload-time = "2025-06-20T18:45:26.937Z" }, { url = "https://files.pythonhosted.org/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl", hash = "sha256:f742a7dbd0d9cb9ea41e9a24a918996e8170c799fa528688d40dd582c8265f4f", size = 63551, upload-time = "2025-06-20T18:45:26.937Z" },
] ]
[[package]]
name = "pygments"
version = "2.19.2"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" },
]
[[package]]
name = "pytest"
version = "9.0.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "colorama", marker = "sys_platform == 'win32'" },
{ name = "exceptiongroup", marker = "python_full_version < '3.11'" },
{ name = "iniconfig" },
{ name = "packaging" },
{ name = "pluggy" },
{ name = "pygments" },
{ name = "tomli", marker = "python_full_version < '3.11'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" },
]
[[package]] [[package]]
name = "tomli" name = "tomli"
version = "2.4.0" version = "2.4.0"