class TestBoardWriter(TestCase): def setUp(self): self.board = Board(4, 3, [[1, 2], [1, 1], []], [[1, 1], [], [2], [2]]) self.board.set_position(0, 0, Board.Cross) self.board.set_position(2, 1, Board.Empty) @patch('builtins.open', new_callable=mock_open, create=True) def test_write_board_success(self, mock_file): BoardWriter(self.board).export('open/path/file.json') mock_file.assert_called_once_with('open/path/file.json', 'w') mock_file().write.assert_called_with( '{"width": 4, "height": 3, "constraints": {"rows": [[1, 2], [1, 1], []], ' '"columns": [[1, 1], [], [2], [2]]}, ' '"values": [{"x": 0, "y": 0, "value": true}, {"x": 1, "y": 2, "value": false}]}' )
def apply_strategy(self, values, constraints): """ Applies the simple spaces strategy. :param values: The array of values. :param constraints: the constraints put on the values. :return: The new values after the application of the algorithm. """ scores = Board.get_score(values) new_vals = list(values) if Utilities.all_blocks_present( values, constraints): # only apply when all blocks are present taken_spots = [v != Board.Unknown for v in values ] # array to keep track of which spots are taken diffs = [c - s for s, c in zip(scores, constraints) ] # array to see how far each score still has to go score_positions = Utilities.get_positions_of_scores(values) for diff, (s_s, s_e) in zip(diffs, score_positions): for p in range(max(0, s_s - diff), min(len(values), s_e + 1 + diff)): taken_spots[ p] = True # set each possible spot where a cross could go to True for idx, t in enumerate(taken_spots): # calculate the result if not t: new_vals[idx] = Board.Empty return new_vals
class TestBaseStrategy(TestCase): def setUp(self): self.board = Board(3, 4, [[], [], [], []], [[], [], []]) def test_apply(self): bs = BaseStrategy(self.board) bs.apply_strategy = MagicMock() bs.apply() self.assertEqual(bs.apply_strategy.call_count, self.board.get_height() + self.board.get_width()) def test_apply_change_board(self): bs = BaseStrategy(self.board) bs.apply_strategy = lambda values, _: [Board.Cross] * len(values) bs.apply() self.assertListEqual(self.board._board, [[Board.Cross] * 3 for _ in range(4)])
class TestPrintBoard(TestCase): def setUp(self): self.board1 = Board(2, 2, [[], [1]], [[1], []]) self.board2 = Board(5, 6, [[1, 2, 3], [4, 5], [], [7], [4, 2], []], [[1, 1, 1, 1, 1, 6], [], [1, 2, 3], [], [1]]) self.board3 = Board(1, 1, [[]], [[]]) def test_print1(self): board1_str = PrintBoard(self.board1)._print() self.assertEqual(board1_str, ' 1 \n ====\n ǁ ? ?\n1 ǁ ? ?\n') self.board1.set_position(0, 1, Board.Cross) board1_str = PrintBoard(self.board1)._print() self.assertEqual(board1_str, ' 1 \n ====\n ǁ ? ?\n1 ǁ X ?\n') self.board1.set_position(0, 0, Board.Empty) self.board1.set_position(1, 0, Board.Empty) self.board1.set_position(1, 1, Board.Empty) board1_str = PrintBoard(self.board1)._print() self.assertEqual(board1_str, ' 1 \n ====\n ǁ \n1 ǁ X \n') def test_print2(self): board2_str = PrintBoard(self.board2)._print() self.assertEqual( board2_str, ' 1 \n 1 \n 1 \n 1 1 \n' ' 1 2 \n 6 3 1 \n ==========\n1 2 3 ǁ ? ? ? ? ?\n' ' 4 5 ǁ ? ? ? ? ?\n ǁ ? ? ? ? ?\n 7 ǁ ? ? ? ? ?\n 4 2 ǁ ? ? ? ? ?\n' ' ǁ ? ? ? ? ?\n') def test_print3(self): board3_str = PrintBoard(self.board3)._print() self.assertEqual(board3_str, ' ==\nǁ ?\n')
def all_blocks_present(values, constraints): """ Check if we definitely know that all the separate blocks are there already. :param values: The array of values. :param constraints: The constraints put on the array of values. :return: True if all the blocks of scores are present, False if not or if we cannot know. """ scores = Board.get_score(values) if scores == constraints: # simplest case where the scores are all done already return True if len(scores) == len(constraints): return not Utilities._blocks_may_join(values, scores, constraints) return False
def test_get_score(self): self.assertListEqual(Board.get_score([]), []) self.assertListEqual(Board.get_score([Board.Unknown]), []) self.assertListEqual(Board.get_score([Board.Empty]), []) self.assertListEqual(Board.get_score([Board.Cross]), [1]) self.assertListEqual( Board.get_score([ Board.Cross, Board.Empty, Board.Cross, Board.Cross, Board.Unknown ]), [1, 2]) self.assertListEqual( Board.get_score( [Board.Cross, Board.Cross, Board.Cross, Board.Cross]), [4])
def test_check_correct(self): simple_board = Board(1, 1, [[]], [[]]) self.assertTrue(simple_board.check_correct()) simple_board.set_position(0, 0, Board.Empty) self.assertTrue(simple_board.check_correct()) simple_board.set_position(0, 0, Board.Cross) self.assertFalse(simple_board.check_correct()) self.assertFalse(self.board.check_correct()) board = Board(4, 2, [[1, 2], [3]], [[1], [1], [2], [2]]) self.assertFalse(board.check_correct()) board.set_position(0, 0, Board.Cross) board.set_position(2, 0, Board.Cross) board.set_position(3, 0, Board.Cross) board.set_position(1, 1, Board.Cross) board.set_position(2, 1, Board.Cross) board.set_position(3, 1, Board.Cross) self.assertTrue(board.check_correct())
class TestBoard(TestCase): def test_static_values(self): self.assertEqual(Board.Unknown, 0) self.assertEqual(Board.Cross, 1) self.assertEqual(Board.Empty, 2) def setUp(self): self.row_constaints = [[1, 2, 3], [], [3, 2, 1], []] self.col_constraints = [[4, 2], [], [2, 4]] self.board = Board(3, 4, self.row_constaints, self.col_constraints) def test_width_height(self): self.assertEqual(self.board.get_width(), 3) self.assertEqual(self.board.get_height(), 4) def test_constraints(self): self.assertListEqual(self.row_constaints, self.board.get_row_constraints()) self.assertListEqual(self.col_constraints, self.board.get_col_constraints()) def test_set_value(self): self.board.set_position(0, 0, Board.Empty) self.assertEqual(self.board._board[0][0], Board.Empty) with self.assertRaises(InvalidValueError): self.board.set_position(1, 1, 3) self.board.set_position(2, 3, Board.Cross) self.assertEqual(self.board._board[3][2], Board.Cross) self.board.set_position(2, 3, Board.Unknown) self.assertEqual(self.board._board[3][2], Board.Unknown) def test_get_value(self): self.board._board[0][0] = Board.Empty self.assertEqual(self.board.get_value(0, 0), Board.Empty) self.board._board[3][2] = Board.Cross self.assertEqual(self.board.get_value(2, 3), Board.Cross) self.board._board[3][2] = Board.Unknown self.assertEqual(self.board.get_value(2, 3), Board.Unknown) def test_default_unknown(self): self.assertListEqual(self.board._board, [[Board.Unknown] * 3 for _ in range(4)]) def test_get_row_col(self): self.board.set_position(1, 1, Board.Cross) self.board.set_position(1, 0, Board.Cross) self.assertListEqual(self.board.get_row(0), [Board.Unknown, Board.Cross, Board.Unknown]) self.assertListEqual(self.board.get_row(1), [Board.Unknown, Board.Cross, Board.Unknown]) self.assertListEqual(self.board.get_row(2), [Board.Unknown, Board.Unknown, Board.Unknown]) self.assertListEqual(self.board.get_row(3), [Board.Unknown, Board.Unknown, Board.Unknown]) self.assertListEqual( self.board.get_column(0), [Board.Unknown, Board.Unknown, Board.Unknown, Board.Unknown]) self.assertListEqual( self.board.get_column(1), [Board.Cross, Board.Cross, Board.Unknown, Board.Unknown]) self.assertListEqual( self.board.get_column(2), [Board.Unknown, Board.Unknown, Board.Unknown, Board.Unknown]) def test_get_score(self): self.assertListEqual(Board.get_score([]), []) self.assertListEqual(Board.get_score([Board.Unknown]), []) self.assertListEqual(Board.get_score([Board.Empty]), []) self.assertListEqual(Board.get_score([Board.Cross]), [1]) self.assertListEqual( Board.get_score([ Board.Cross, Board.Empty, Board.Cross, Board.Cross, Board.Unknown ]), [1, 2]) self.assertListEqual( Board.get_score( [Board.Cross, Board.Cross, Board.Cross, Board.Cross]), [4]) def test_check_correct(self): simple_board = Board(1, 1, [[]], [[]]) self.assertTrue(simple_board.check_correct()) simple_board.set_position(0, 0, Board.Empty) self.assertTrue(simple_board.check_correct()) simple_board.set_position(0, 0, Board.Cross) self.assertFalse(simple_board.check_correct()) self.assertFalse(self.board.check_correct()) board = Board(4, 2, [[1, 2], [3]], [[1], [1], [2], [2]]) self.assertFalse(board.check_correct()) board.set_position(0, 0, Board.Cross) board.set_position(2, 0, Board.Cross) board.set_position(3, 0, Board.Cross) board.set_position(1, 1, Board.Cross) board.set_position(2, 1, Board.Cross) board.set_position(3, 1, Board.Cross) self.assertTrue(board.check_correct())
def setUp(self): self.row_constaints = [[1, 2, 3], [], [3, 2, 1], []] self.col_constraints = [[4, 2], [], [2, 4]] self.board = Board(3, 4, self.row_constaints, self.col_constraints)
def setUp(self): self.board = Board(3, 4, [[], [], [], []], [[], [], []])
def setUp(self): self.board = Board(4, 3, [[1, 2], [1, 1], []], [[1, 1], [], [2], [2]]) self.board.set_position(0, 0, Board.Cross) self.board.set_position(2, 1, Board.Empty)
def setUp(self): self.board1 = Board(2, 2, [[], [1]], [[1], []]) self.board2 = Board(5, 6, [[1, 2, 3], [4, 5], [], [7], [4, 2], []], [[1, 1, 1, 1, 1, 6], [], [1, 2, 3], [], [1]]) self.board3 = Board(1, 1, [[]], [[]])