def test_griddlers_board_clear(): board = GriddlersBoard(rows=2, columns=3) board[0, 0] = CellMark.FILLED board[0, 1] = CellMark.FILLED board[1, 0] = CellMark.CROSSED board[1, 2] = CellMark.FILLED board.clear() assert str(board) == "___\n___"
def test_griddlers_board_get_rows_and_columns(): board = GriddlersBoard(rows=2, columns=3) board[0, 0] = CellMark.FILLED board[0, 1] = CellMark.FILLED board[1, 0] = CellMark.CROSSED board[1, 2] = CellMark.FILLED assert str(board) == "OO_\nX_O" assert board.get_row(0) == CellsLine.parse_line("OO_") assert board.get_row(1) == CellsLine.parse_line("X_O") assert board.get_column(0) == CellsLine.parse_line("OX") assert board.get_column(1) == CellsLine.parse_line("O_") assert board.get_column(2) == CellsLine.parse_line("_O")
def test_set_invalid_value(): board = GriddlersBoard(rows=2, columns=3) with pytest.raises(ValueError, match="^Can only set marks on board. Got 4$"): board[1, 2] = 4
def test_set_too_big_column(): board = GriddlersBoard(rows=2, columns=3) with pytest.raises( ValueError, match="^Column number should be between 0 and 2. Got 3$"): board[1, 3] = CellMark.FILLED
def test_griddlers_board_init(): board = GriddlersBoard(rows=2, columns=3) assert str(board) == "___\n___"
def test_set_too_big_row(): board = GriddlersBoard(rows=2, columns=3) with pytest.raises(ValueError, match="^Row number should be between 0 and 1. Got 3$"): board[3, 1] = CellMark.FILLED
def test_griddlers_board_set_column(): board = GriddlersBoard(rows=2, columns=3) board.set_column(0, CellsLine.parse_line("OX")) assert str(board) == "O__\nX__"
def test_griddlers_board_set_cell(): board = GriddlersBoard(rows=2, columns=3) board[0, 1] = CellMark.FILLED assert str(board) == "_O_\n___"
def __init__(self, rows_instructions: List[List[int]], columns_instructions: List[List[int]]): self.rows_instructions = rows_instructions self.columns_instructions = columns_instructions self.board = GriddlersBoard(rows=len(self.rows_instructions), columns=len(self.columns_instructions))
class GriddlersGame: def __init__(self, rows_instructions: List[List[int]], columns_instructions: List[List[int]]): self.rows_instructions = rows_instructions self.columns_instructions = columns_instructions self.board = GriddlersBoard(rows=len(self.rows_instructions), columns=len(self.columns_instructions)) @property def rows(self): return self.board.rows @property def columns(self): return self.board.columns @property def is_complete(self): return self.board.is_completed @property def is_won(self): for row, row_instructions in self.iterate_rows(): if [section.length for section in row.filled_sections] != row_instructions: return False for column, column_instructions in self.iterate_columns(): if [section.length for section in column.filled_sections ] != column_instructions: return False return True def get_row_and_instructions(self, row_index: int): return self.board.get_row(row_index), self.rows_instructions[row_index] def get_column_and_instructions(self, column_index: int): return (self.board.get_column(column_index), self.columns_instructions[column_index]) def iterate_rows(self): for i in range(self.rows): yield self.get_row_and_instructions(i) def iterate_columns(self): for i in range(self.rows): yield self.get_row_and_instructions(i) def set_row(self, row_index: int, row: CellsLine): self.board.set_row(row_index=row_index, row=row) def set_column(self, column_index: int, column: CellsLine): self.board.set_column(column_index=column_index, column=column) def clear(self): self.board.clear() @classmethod def load_from_file(cls, path: Union[str, Path]) -> "GriddlersGame": with open(path, mode="r") as pd: data = json.load(pd) return GriddlersGame(**data) def board_string(self): return str(self.board)