def test_neighbor_flags(self): state = GameState(Field((4, 4), {(0, 0)})) for cell in ((0, 0), (2, 0), (1, 2)): state.set_flag(cell) for (cell, ans) in (((0, 0), 0), ((1, 1), 3), ((1, 0), 2)): self.assertEqual(ans, state.neighbor_flags(cell))
def test_handler_remove(self): state = GameState(Field.generate((2, 2), 2)) callargs = [] handler = lambda *args: callargs.append(args) state.add_cell_handler(handler) state.set_flag((0, 0)) self.assertEqual(1, len(callargs)) state.remove_cell_handler(handler) state.set_flag((1, 1)) self.assertEqual(1, len(callargs))
def test_handler_flag(self): state = GameState(Field.generate((5, 5), 8)) callargs = [] state.add_cell_handler(lambda *args: callargs.append(args)) state.set_flag((2, 4)) self.assertEqual(1, len(callargs)) self.assertEqual(((2, 4), CellState.FLAG), callargs[-1]) state.set_flag((2, 4)) self.assertEqual(1, len(callargs)) state.unset_flag((2, 4)) self.assertEqual(2, len(callargs)) self.assertEqual(((2, 4), CellState.UNKNOWN), callargs[-1])
def test_save_and_load(self): field = Field((4, 4), {(0, 2), (3, 1), (1, 1), (2, 3), (0, 1), (1, 0)}) state = GameState(field) state.open_cell((0, 0)) for cell in ((1, 0), (0, 1), (1, 1)): state.set_flag(cell) self.assertEqual(state, GameState.fromstr(str(state), field))
def test_handler_open(self): state = GameState(Field((3, 3), {(1, 0)})) callargs = [] state.add_cell_handler(lambda *args: callargs.append(args)) state.open_cell((0, 0)) self.assertEqual(1, len(callargs)) self.assertEqual(((0, 0), CellState.OPENED), callargs[-1]) state.open_cell((2, 2)) self.assertEqual(7, len(callargs)) self.assertSetEqual( {((x, y), CellState.OPENED) for x in (0, 1, 2) for y in (1, 2)}, set(callargs[1:]))
def test_init_state(self): field = Field((2, 2), {(0, 0), (1, 1)}) state = GameState(field) self.assertEqual(0, state.flags()) self.assertEqual(4, state.unmarked_cells()) for cell in ((0, 0), (1, 0), (0, 1), (1, 1)): self.assertEqual(CellState.UNKNOWN, state.get_state(cell)) self.assertFalse(state.check_win())
def test_handler_load(self): field = Field((3, 3), {(1, 0)}) state = GameState(field) state.set_flag((0, 0)) state.open_cell((2, 2)) callargs = [] loaded = GameState.fromstr(str(state), field, lambda *args: callargs.append(args)) self.assertEqual(7, len(callargs)) self.assertSetEqual( {((x, y), CellState.OPENED) for x in (0, 1, 2) for y in (1, 2)} | {((0, 0), CellState.FLAG)}, set(callargs))
def test_clone(self): calls = 0 def handler(*args): nonlocal calls calls += 1 state = GameState(Field.generate((10, 15), 21)) state.add_cell_handler(handler) state2 = copy.copy(state) self.assertEqual(state, state2) state2.set_flag((0, 0)) self.assertNotEqual(state, state2) self.assertEqual(1, calls) state2.remove_cell_handler(handler) state2.set_flag((1, 0)) self.assertEqual(1, calls) state.set_flag((5, 0)) self.assertEqual(2, calls)
def test_win(self): state = GameState(Field((4, 3), {(0, 0), (2, 0)})) self.assertFalse(state.check_win()) state.set_flag((0, 0)) state.set_flag((2, 0)) self.assertFalse(state.check_win()) state.unset_flag((0, 0)) state.unset_flag((2, 0)) state.open_cell((2, 2)) self.assertFalse(state.check_win()) state.set_flag((0, 0)) state.open_cell((1, 0)) state.open_cell((3, 0)) self.assertFalse(state.check_win()) state.set_flag((2, 0)) self.assertTrue(state.check_win())
def test_open_cell(self): field = Field((4, 3), {(0, 0), (2, 0)}) state1 = GameState(field) self.assertTrue(state1.open_cell((10, 10))) self.assertEqual(GameState(field), state1) self.assertTrue(state1.open_cell((3, 2))) self.assertEqual(4, state1.unmarked_cells()) self.assertSetEqual( {state1.get_state((x, y)) for x in (0, 1, 2, 3) for y in (1, 2)}, {CellState.OPENED}) self.assertFalse(state1.open_cell((0, 0))) self.assertEqual(4, state1.unmarked_cells()) state2 = GameState(field) state2.set_flag((2, 2)) self.assertTrue(state2.open_cell((3, 2))) self.assertEqual(8, state2.unmarked_cells()) self.assertSetEqual( {state2.get_state((x, y)) for x in (2, 3) for y in (1, 2)}, {CellState.OPENED, CellState.FLAG}) self.assertTrue(state2.open_cell((2, 2))) self.assertEqual(8, state2.unmarked_cells())
def test_handler_bad(self): state = GameState(Field.generate((2, 2), 1)) with self.assertRaises(TypeError): state.add_cell_handler([])
def test_flags(self): def check_state(state, flags, unmarked, cells=()): self.assertEqual(flags, state.flags()) self.assertEqual(unmarked, state.unmarked_cells()) for cell in cells: self.assertEqual(cell[1], state.get_state(cell[0])) state = GameState(Field((5, 4), {(1, 0), (1, 2), (3, 2)})) check_state(state, 0, 20, [((2, 2), CellState.UNKNOWN)]) self.assertFalse(state.unset_flag((2, 2))) check_state(state, 0, 20, [((2, 2), CellState.UNKNOWN)]) self.assertTrue(state.set_flag((2, 2))) check_state(state, 1, 19, [((2, 2), CellState.FLAG)]) self.assertFalse(state.set_flag((2, 2))) check_state(state, 1, 19, [((2, 2), CellState.FLAG)]) self.assertTrue(state.unset_flag((2, 2))) check_state(state, 0, 20, [((2, 2), CellState.UNKNOWN)]) self.assertFalse(state.set_flag((10, 10))) check_state(state, 0, 20) self.assertFalse(state.unset_flag((10, 10))) check_state(state, 0, 20) state.open_cell((4, 0)) check_state(state, 0, 14) self.assertFalse(state.set_flag((4, 1))) check_state(state, 0, 14)
def test_init_bad(self): with self.assertRaises(TypeError): GameState([])
def test_eq_operator(self): field = Field((3, 3), {(0, 1), (1, 0), (1, 1)}) state0 = GameState(field) state1 = GameState(field) self.assertEqual(state0, state1) state0.set_flag((1, 1)) self.assertNotEqual(state0, state1) state0.unset_flag((1, 1)) self.assertEqual(state0, state1) state2 = GameState(field) state2.open_cell((0, 0)) self.assertNotEqual(state1, state2) state3 = GameState(field) state3.open_cell((2, 2)) self.assertNotEqual(state1, state3) self.assertNotEqual(state0, []) self.assertNotEqual(GameState(Field.generate((2, 2), 1)), GameState(Field.generate((2, 2), 2)))
def test_load_bad(self): with self.assertRaises(ValueError): GameState.fromstr('1,1,0:2;0,0:1', Field((3, 3), {}))
def test_str(self): field = Field((4, 4), {(0, 0), (3, 3)}) state = GameState(field) self.assertEqual(state, GameState.fromstr(str(state), field))