Example #1
0
 def setUp(self):
     self.size = 5
     self.validator = MoveValidator(self.size)
Example #2
0
class TestCheckMove(unittest.TestCase):

    def setUp(self):
        self.size = 5
        self.validator = MoveValidator(self.size)

    def _create_moves(self, positions, color=None):
        moves = []
        for i, pos in enumerate(positions):
            moves.append(dict(position=pos,
                              player=i % 2 if color is None else color))
        return moves

    def _create_moves_from_ascii(self, ascii):
        moves = []
        for row, line in enumerate(ascii.split()):
            for col, char in enumerate(line):
                if char != "+":
                    moves.append(dict(position=(col, row),
                                      player=["X", "O"].index(char)))
        return moves

    def _make_board(self, ascii="""+++++
                                   +OOO+
                                   OX+XO
                                   +OOXO
                                   +++O+"""):
        self.validator.build_board(self._create_moves_from_ascii(ascii))

    # Tests for helper functions

    def test_peek(self):
        self._make_board()
        self.assertEquals(self.validator.peek((0, 0)), FREE)
        self.assertEquals(self.validator.peek((2, 10)), OUTSIDE)
        self.assertEquals(self.validator.peek((2, 1)), WHITE)
        self.assertEquals(self.validator.peek((1, 2)), BLACK)

    def test_connected(self):
        self._make_board()
        self.assertEquals(set(self.validator.connected((0, 0))),
                          set([(1, 0), (0, 1)]))
        self.assertEquals(set(self.validator.connected((1, 1))),
                          set([(2, 1), (0, 1), (1, 0), (1, 2)]))

    def test_peek_neigbors(self):
        self._make_board()
        self.assertEquals(set(self.validator.peek_neighbors((0, 0))),
                          set([FREE, FREE]))
        self.assertEquals(set(self.validator.peek_neighbors((1, 1))),
                          set([FREE, FREE, WHITE, BLACK]))

    def test_get_group(self):
        self._make_board()
        self.assertEquals(self.validator.get_group((0, 0)), set())
        self.assertEquals(self.validator.get_group((1, 1)),
                          set([(1, 1), (2, 1), (3, 1)]))
        self.assertEquals(self.validator.get_group((1, 2)),
                          set([(1, 2)]))

    def test_freedoms(self):
        self._make_board()
        self.assertEquals(self.validator.freedoms((0, 0)), set())
        self.assertEquals(self.validator.freedoms((1, 1)),
                          set([(1, 0), (2, 0), (3, 0),
                               (0, 1), (4, 1), (2, 2)]))
        self.assertEquals(self.validator.freedoms((1, 2)), set([(2, 2)]))

    # Tests for 'check'

    def test_check_position_not_taken(self):
        previous_moves = self._create_moves([(1, 2), (3, 4)])
        move = {"player": 0, "position": (1, 3)}
        self.assertEquals(self.validator.check(move, previous_moves), [])

    def test_check_position_taken(self):
        previous_moves = self._create_moves([(1, 2), (3, 4)])
        move = {"player": 0, "position": (1, 2)}
        with self.assertRaises(IllegalMove):
            self.validator.check(move, previous_moves)

    def test_check_no_freedoms(self):
        previous_moves = self._create_moves([(1, 0),
                                         (0, 1), (2, 1),
                                             (1, 2)], color=1)
        move = {"player": 0, "position": (1, 1)}
        with self.assertRaises(IllegalMove):
            self.validator.check(move, previous_moves)

    def test_check_some_freedoms(self):
        previous_moves = self._create_moves([(1, 0),
                                         (0, 1), (2, 1),
                                             (1, 2)])
        move = {"player": 0, "position": (1, 1)}
        self.assertEquals(self.validator.check(move, previous_moves), [])

    def test_check_part_of_small_group_with_freedoms(self):
        previous_moves = self._create_moves_from_ascii("""+++++
                                                          ++O++
                                                          +O+X+
                                                          ++O++
                                                          +++++""")
        move = {"player": 0, "position": (2, 2)}
        self.assertEquals(self.validator.check(move, previous_moves), [])

    def test_check_part_of_small_group_without_freedoms(self):
        previous_moves = self._create_moves_from_ascii("""+++++
                                                          ++OO+
                                                          +O+XO
                                                          ++OO+
                                                          +++++""")
        move = {"player": 0, "position": (2, 2)}
        with self.assertRaises(IllegalMove):
            self.validator.check(move, previous_moves)

    def test_check_part_of_group_with_freedoms(self):
        previous_moves = self._create_moves_from_ascii("""+++++
                                                          +OOO+
                                                          OX+XO
                                                          +OOXO
                                                          +++++""")
        move = {"player": 0, "position": (2, 2)}
        self.assertEquals(self.validator.check(move, previous_moves), [])

    def test_check_part_of_group_taking_the_last_freedom(self):
        previous_moves = self._create_moves_from_ascii("""+++++
                                                          +OOO+
                                                          OX+XO
                                                          +OOXO
                                                          +++O+""")
        move = {"player": 0, "position": (2, 2)}
        with self.assertRaises(IllegalMove):
            self.validator.check(move, previous_moves)
        move = {"player": 1, "position": (2, 2)}
        self.assertEquals(self.validator.check(move, previous_moves),
                          [4, 5, 9])

    def test_check_part_of_edge_group_with_freedoms(self):
        previous_moves = self._create_moves_from_ascii("""+++++
                                                          +OOOO
                                                          OX+XX
                                                          +OOXX
                                                          ++++O""")
        move = {"player": 1, "position": (2, 2)}
        self.assertEquals(self.validator.check(move, previous_moves), [5])
        move = {"player": 0, "position": (2, 2)}
        self.assertEquals(self.validator.check(move, previous_moves), [])

    def test_check_capture_single_stone(self):
        previous_moves = self._create_moves_from_ascii("""+++++
                                                          ++X++
                                                          +XOX+
                                                          +++++
                                                          +++++""")
        move = {"player": 0, "position": (2, 3)}
        self.assertEquals(self.validator.check(move, previous_moves), [2])

    def test_check_capture_edge_group(self):
        previous_moves = self._create_moves_from_ascii("""+++++
                                                          +++XX
                                                          +++OO
                                                          +++XX
                                                          +++++""")
        move = {"player": 0, "position": (2, 2)}
        self.assertEquals(self.validator.check(move, previous_moves),
                          [2, 3])