Ejemplo n.º 1
0
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}]}'
        )
Ejemplo n.º 2
0
 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
Ejemplo n.º 3
0
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)])
Ejemplo n.º 4
0
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')
Ejemplo n.º 5
0
 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
Ejemplo n.º 6
0
 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])
Ejemplo n.º 7
0
 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())
Ejemplo n.º 8
0
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())
Ejemplo n.º 9
0
 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)
Ejemplo n.º 10
0
 def setUp(self):
     self.board = Board(3, 4, [[], [], [], []], [[], [], []])
Ejemplo n.º 11
0
 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)
Ejemplo n.º 12
0
 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, [[]], [[]])