def test_all_cells_dead(): """ All the cells are dead, no change """ seed = Board(0, (3, 3), [['.', '.', '.'], ['.', '.', '.'], ['.', '.', '.']]) expected_generation_one = Board( 1, (3, 3), [['.', '.', '.'], ['.', '.', '.'], ['.', '.', '.']]) generation_one = seed.tick() assert generation_one == expected_generation_one
def test_three_live_neighbours_live_four_live_neighbours_die(): """ Only cells with two or three live neighbours survive a generation""" seed = Board(0, (3, 3), [['.', '*', '.'], ['*', '*', '*'], ['.', '*', '.']]) expected_generation_one = Board( 1, (3, 3), [['*', '*', '*'], ['*', '.', '*'], ['*', '*', '*']]) generation_one = seed.tick() assert generation_one == expected_generation_one
def test_cells_positioned_at_the_edge(): """ We consider neighbours outside the grid to be dead """ seed = Board(0, (3, 3), [['*', '*', '*'], ['*', '.', '*'], ['*', '*', '*']]) expected_generation_one = Board( 1, (3, 3), [['*', '.', '*'], ['.', '.', '.'], ['*', '.', '*']]) generation_one = seed.tick() assert generation_one == expected_generation_one
def test_an_adjacent_cell_with_sufficient_neighbours_lives(): """ Just one cell is live, and it has no neighbours, so must die""" seed = Board(0, (3, 3), [['.', '.', '*'], ['.', '*', '.'], ['*', '.', '.']]) expected_generation_one = Board( 1, (3, 3), [['.', '.', '.'], ['.', '*', '.'], ['.', '.', '.']]) generation_one = seed.tick() assert generation_one == expected_generation_one
def test_single_cell_with_no_neighbours_dies(): """ Just one cell is live, and it has no neighbours, so must die""" seed = Board(0, (3, 3), [['.', '.', '.'], ['.', '*', '.'], ['.', '.', '.']]) expected_generation_one = Board( 1, (3, 3), [['.', '.', '.'], ['.', '.', '.'], ['.', '.', '.']]) generation_one = seed.tick() assert generation_one == expected_generation_one
def tick(board: Board): new_board = Board(board.generation + 1, Size(board.rows, board.cols)) for r in range(board.rows): for c in range(board.cols): if board[r][c] == "*": live_count = board.get_live_neigbour_count(r, c) if live_count == 2 or live_count == 3: new_board[r][c] = "*" else: new_board[r][c] = "." else: live_count = board.get_live_neigbour_count(r, c) if live_count == 3: new_board[r][c] = "*" else: new_board[r][c] = "." return new_board
def test_render_a_board(): """We want to render a board, which is a good way to check it""" row = Mock(Row) row.__str__ = Mock() row.__str__.return_value = "...." board = Board(0, Size(3, 4), [row, row, row]) expected_board = ("Generation 0\n" "3 4\n" "....\n" "....\n" "....\n") assert expected_board == str(board)
def test_count_two_live_neighbours(): """We should be able to count our live neighbours""" row_one = Mock(Row) row_one.__getitem__ = Mock() row_one_cellstates = [".", "*", "."] def get_row_one_cell(key): return row_one_cellstates[key] row_one.__getitem__.side_effect = get_row_one_cell row_two = Mock(Row) row_two.__getitem__ = Mock() row_two_cellstates = [".", "*", "."] def get_row_two_cell(key): return row_two_cellstates[key] row_two.__getitem__.side_effect = get_row_two_cell row_three = Mock(Row) row_three.__getitem__ = Mock() row_three_cellstates = [".", "*", "."] def get_row_three_cell(key): return row_three_cellstates[key] row_three.__getitem__.side_effect = get_row_three_cell board = Board(0, Size(3, 3), [row_one, row_two, row_three]) assert board.get_live_neigbour_count(0, 1) == 1 assert board.get_live_neigbour_count(1, 1) == 2 assert board.get_live_neigbour_count(2, 1) == 1
def test_we_can_create_a_board(): """We want to create a simple 3 * 3 board that defaults to dead cells""" row = Mock(Row) cell = Mock(Cell) cell.__str__ = Mock() cell.__str__.return_value = "." def get_item(key): return cell row.__getitem__ = Mock() row.__getitem__.side_effect = get_item board = Board(0, Size(3, 3), [row, row, row]) for r in range(board.rows): for j in range(board.cols): assert str(board[r][j]) == "." assert cell.__str__.call_count == 9
def test_a_board_has_a_gen_identifier(): """A board has a generatio""" board = Board(0, Size(3, 3)) assert board.generation == 0