import pytest from dojo.grid import GridFormatError, parse_grid, render_grid SMALL = """\ +---+---+ | S | . | + +---+ | 1 + +---+---+ """ def test_parse_small_grid() -> None: grid = parse_grid(SMALL) assert (grid.height, grid.width) == (2, 2) assert grid.cells == (("S", "."), ("1", "+")) assert grid.h_walls == ((True, True), (False, True), (True, True)) assert grid.v_walls == ((True, True, True), (True, False, False)) def test_render_round_trips() -> None: grid = parse_grid(SMALL) assert parse_grid(render_grid(grid)) == grid def test_stripped_trailing_space_is_an_open_right_border() -> None: grid = parse_grid(SMALL) assert grid.v_walls[1][2] is False def test_comments_and_blank_lines_are_ignored() -> None: commented = "# header\n\n" + SMALL.replace("+ +---+\n", "+ +---+\n# note\n") assert parse_grid(commented) == parse_grid(SMALL) @pytest.mark.parametrize( ("text", "message"), [ ("", "no grid lines"), ("+---+--+\n", "4*width+1"), ("+---+\n| . |\n", "odd number of lines"), ("+---+\n| . |\n----+\n", "expected '+'"), ("+---+\n| . |\n+-- +\n", "expected '---' or blanks"), ("+---+\n| . !\n+---+\n", "expected '|' or blank"), ("+---+\n| . |\n+---+\n", "longer than the top border"), ("+---+\n|. |\n+---+\n", "' X '"), ("+---+\n| |\n+---+\n", "' X '"), ], ) def test_format_errors(text: str, message: str) -> None: with pytest.raises(GridFormatError) as raised: parse_grid(text, source="t.txt") assert any(message in problem for problem in raised.value.problems)