2026-rff_mp/skorohodovsa/task_2/test/map/test_maze.py

111 lines
4.6 KiB
Python
Raw Normal View History

import pytest
import random
random.seed("РФ СЛФ!")
from source.models.base import Cell, Maze
from source.settings import cell_mapping
class TestMaze:
def test_default_size(self):
"""Проверка размеров лабиринта со значениями по умолчанию"""
maze = Maze()
row, col = maze.shape
assert row == 10
assert col == 10
def test_custom_size(self):
"""Проверка размеров лабиринта с заданными размерами"""
maze = Maze(size=(7, 3))
assert maze._width == 7
assert maze._height == 3
def test_all_cells_empty_on_init(self):
"""Проверка создания пустого лабиринта с заданными размерами"""
maze = Maze(size=(3, 3))
for y in range(3):
for x in range(3):
cell = maze.get_cell(x, y)
assert not cell.is_wall
assert not cell.is_start
assert not cell.is_exit
def test_get_cell_valid(self):
"""Проверка получения объекта Cell из лабиринта функцией `get_cell()`"""
maze = Maze(size=(5, 5))
assert isinstance(maze.get_cell(2, 3), Cell)
def test_get_cell_out_of_bounds(self):
"""Проверка неправильных указанных индексов лабиринта"""
maze = Maze(size=(5, 5))
assert maze.get_cell(-1, 0) is None
assert maze.get_cell(0, -1) is None
assert maze.get_cell(5, 0) is None
assert maze.get_cell(0, 5) is None
def test_center_has_four_neighbors(self):
"""Проверка нахождения соседей"""
maze = Maze(size=(5, 5))
assert len(maze.get_neighbors(2, 2)) == 4
def test_corner_has_two_neighbors(self):
"""Проверка нахождения соседей, когда указанное поле в углу лабиринта"""
maze = Maze(size=(5, 5))
assert len(maze.get_neighbors(0, 0)) == 2
def test_wall_excluded_from_neighbors(self):
"""Проверка что стена не попадает в список соседей"""
maze = Maze(size=(5, 5))
maze[1, 2] = cell_mapping['wall']
assert all(not n.is_wall for n in maze.get_neighbors(2, 2))
def test_setitem_wall(self):
"""Проверка установки стены через оператор []"""
maze = Maze(size=(5, 5))
maze[0, 0] = cell_mapping['wall']
assert maze[0, 0].is_wall is True
def test_setitem_start(self):
"""Проверка установки старта через оператор []"""
maze = Maze(size=(5, 5))
maze[0, 0] = cell_mapping['start']
assert maze[0, 0].is_start is True
def test_setitem_exit(self):
"""Проверка установки выхода через оператор []"""
maze = Maze(size=(5, 5))
maze[0, 0] = cell_mapping['exit']
assert maze[0, 0].is_exit is True
def test_setitem_empty_clears_flags(self):
"""Проверка сброса флагов клетки при установке пустого типа"""
maze = Maze(size=(5, 5))
maze[0, 0] = cell_mapping['wall']
maze[0, 0] = cell_mapping['empty']
assert not maze[0, 0].is_wall
def test_getitem_out_of_bounds_raises(self):
"""Проверка выброса IndexError при обращении к клетке вне границ лабиринта"""
maze = Maze(size=(5, 5))
with pytest.raises(IndexError):
_ = maze[10, 10]
def test_setitem_invalid_symbol_raises(self):
"""Проверка выброса ValueError при установке неизвестного символа"""
maze = Maze(size=(5, 5))
with pytest.raises(ValueError):
maze[0, 0] = "?"
def test_str_lines_match_height(self):
"""Проверка что количество строк в строковом представлении совпадает с высотой"""
maze = Maze(size=(4, 6))
print(str(maze).splitlines())
assert len(str(maze).splitlines()) == 6
def test_str_line_length_matches_width(self):
"""Проверка что длина каждой строки в строковом представлении совпадает с шириной"""
maze = Maze(size=(5, 3))
for line in str(maze).strip().splitlines():
assert len(line) == 5