60 lines
1.6 KiB
Python
60 lines
1.6 KiB
Python
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)
|