Пример #1
0
    def test_capture_multiple_groups(self):
        board = test_utils.load_board('''
            .OX......
            OXX......
            XX.......
        ''' + EMPTY_ROW * 6)
        lib_tracker = LibertyTracker.from_board(board)
        captured = lib_tracker.add_stone(BLACK, parse_kgs_coords('A9'))
        self.assertEqual(len(lib_tracker.groups), 2)
        self.assertEqual(captured, parse_kgs_coords_set('B9 A8'))

        corner_stone = lib_tracker.groups[lib_tracker.group_index[parse_kgs_coords(
            'A9')]]
        self.assertEqual(corner_stone.stones, parse_kgs_coords_set('A9'))
        self.assertEqual(corner_stone.liberties, parse_kgs_coords_set('B9 A8'))

        surrounding_stones = lib_tracker.groups[lib_tracker.group_index[parse_kgs_coords(
            'C9')]]
        self.assertEqual(surrounding_stones.stones,
                         parse_kgs_coords_set('C9 B8 C8 A7 B7'))
        self.assertEqual(surrounding_stones.liberties,
                         parse_kgs_coords_set('B9 D9 A8 D8 C7 A6 B6'))

        liberty_cache = lib_tracker.liberty_cache
        for stone in corner_stone.stones:
            self.assertEqual(liberty_cache[stone], 2, str(stone))
        for stone in surrounding_stones.stones:
            self.assertEqual(liberty_cache[stone], 7, str(stone))
Пример #2
0
 def test_move_with_capture(self):
     start_board = test_utils.load_board(EMPTY_ROW * 5 + '''
         XXXX.....
         XOOX.....
         O.OX.....
         OOXX.....
     ''')
     start_position = Position(
         board=start_board,
         n=0,
         komi=6.5,
         caps=(1, 2),
         ko=None,
         recent=tuple(),
         to_play=BLACK,
     )
     expected_board = test_utils.load_board(EMPTY_ROW * 5 + '''
         XXXX.....
         X..X.....
         .X.X.....
         ..XX.....
     ''')
     expected_position = Position(
         board=expected_board,
         n=1,
         komi=6.5,
         caps=(7, 2),
         ko=None,
         recent=(PlayerMove(BLACK, parse_kgs_coords('B2')),),
         to_play=WHITE,
     )
     actual_position = start_position.play_move(parse_kgs_coords('B2'))
     self.assertEqualPositions(actual_position, expected_position)
Пример #3
0
    def test_capture_multiple_groups(self):
        board = test_utils.load_board('''
            .OX......
            OXX......
            XX.......
        ''' + EMPTY_ROW * 6)
        lib_tracker = LibertyTracker.from_board(board)
        captured = lib_tracker.add_stone(BLACK, parse_kgs_coords('A9'))
        self.assertEqual(len(lib_tracker.groups), 2)
        self.assertEqual(captured, parse_kgs_coords_set('B9 A8'))

        corner_stone = lib_tracker.groups[lib_tracker.group_index[
            parse_kgs_coords('A9')]]
        self.assertEqual(corner_stone.stones, parse_kgs_coords_set('A9'))
        self.assertEqual(corner_stone.liberties, parse_kgs_coords_set('B9 A8'))

        surrounding_stones = lib_tracker.groups[lib_tracker.group_index[
            parse_kgs_coords('C9')]]
        self.assertEqual(surrounding_stones.stones,
                         parse_kgs_coords_set('C9 B8 C8 A7 B7'))
        self.assertEqual(surrounding_stones.liberties,
                         parse_kgs_coords_set('B9 D9 A8 D8 C7 A6 B6'))

        liberty_cache = lib_tracker.liberty_cache
        for stone in corner_stone.stones:
            self.assertEqual(liberty_cache[stone], 2, str(stone))
        for stone in surrounding_stones.stones:
            self.assertEqual(liberty_cache[stone], 7, str(stone))
Пример #4
0
 def test_move_with_capture(self):
     start_board = test_utils.load_board(EMPTY_ROW * 5 + '''
         XXXX.....
         XOOX.....
         O.OX.....
         OOXX.....
     ''')
     start_position = Position(
         board=start_board,
         n=0,
         komi=6.5,
         caps=(1, 2),
         ko=None,
         recent=tuple(),
         to_play=BLACK,
     )
     expected_board = test_utils.load_board(EMPTY_ROW * 5 + '''
         XXXX.....
         X..X.....
         .X.X.....
         ..XX.....
     ''')
     expected_position = Position(
         board=expected_board,
         n=1,
         komi=6.5,
         caps=(7, 2),
         ko=None,
         recent=(PlayerMove(BLACK, parse_kgs_coords('B2')), ),
         to_play=WHITE,
     )
     actual_position = start_position.play_move(parse_kgs_coords('B2'))
     self.assertEqualPositions(actual_position, expected_position)
Пример #5
0
    def test_parsing_9x9(self):
        self.assertEqual(coords.parse_sgf_coords('aa'), (0, 0))
        self.assertEqual(coords.parse_sgf_coords('ac'), (2, 0))
        self.assertEqual(coords.parse_sgf_coords('ca'), (0, 2))
        self.assertEqual(coords.parse_sgf_coords(''), None)
        self.assertEqual(coords.unparse_sgf_coords(None), '')
        self.assertEqual(
            'aa', coords.unparse_sgf_coords(coords.parse_sgf_coords('aa')))
        self.assertEqual(
            'sa', coords.unparse_sgf_coords(coords.parse_sgf_coords('sa')))
        self.assertEqual(
            (1, 17), coords.parse_sgf_coords(coords.unparse_sgf_coords(
                (1, 17))))
        self.assertEqual(coords.parse_kgs_coords('A1'), (8, 0))
        self.assertEqual(coords.parse_kgs_coords('A9'), (0, 0))
        self.assertEqual(coords.parse_kgs_coords('C2'), (7, 2))
        self.assertEqual(coords.parse_kgs_coords('J2'), (7, 8))
        self.assertEqual(coords.parse_pygtp_coords((1, 1)), (8, 0))
        self.assertEqual(coords.parse_pygtp_coords((1, 9)), (0, 0))
        self.assertEqual(coords.parse_pygtp_coords((3, 2)), (7, 2))
        self.assertEqual(coords.unparse_pygtp_coords((8, 0)), (1, 1))
        self.assertEqual(coords.unparse_pygtp_coords((0, 0)), (1, 9))
        self.assertEqual(coords.unparse_pygtp_coords((7, 2)), (3, 2))

        self.assertEqual(coords.to_human_coord((0, 8)), 'J9')
        self.assertEqual(coords.to_human_coord((8, 0)), 'A1')
Пример #6
0
    def test_neighbors(self):
        corner = parse_kgs_coords('A1')
        neighbors = [go.EMPTY_BOARD[c] for c in go.NEIGHBORS[corner]]
        self.assertEqual(len(neighbors), 2)

        side = parse_kgs_coords('A2')
        side_neighbors = [go.EMPTY_BOARD[c] for c in go.NEIGHBORS[side]]
        self.assertEqual(len(side_neighbors), 3)
Пример #7
0
    def test_neighbors(self):
        corner = parse_kgs_coords('A1')
        neighbors = [go.EMPTY_BOARD[c] for c in go.NEIGHBORS[corner]]
        self.assertEqual(len(neighbors), 2)

        side = parse_kgs_coords('A2')
        side_neighbors = [go.EMPTY_BOARD[c] for c in go.NEIGHBORS[side]]
        self.assertEqual(len(side_neighbors), 3)
Пример #8
0
 def test_capture_stone(self):
     board = test_utils.load_board('''
         .X.......
         XO.......
         .X.......
     ''' + EMPTY_ROW * 6)
     lib_tracker = LibertyTracker.from_board(board)
     captured = lib_tracker.add_stone(BLACK, parse_kgs_coords('C8'))
     self.assertEqual(len(lib_tracker.groups), 4)
     self.assertEqual(lib_tracker.group_index[parse_kgs_coords('B8')],
                      go.MISSING_GROUP_ID)
     self.assertEqual(captured, parse_kgs_coords_set('B8'))
Пример #9
0
 def test_capture_stone(self):
     board = test_utils.load_board('''
         .X.......
         XO.......
         .X.......
     ''' + EMPTY_ROW * 6)
     lib_tracker = LibertyTracker.from_board(board)
     captured = lib_tracker.add_stone(BLACK, parse_kgs_coords('C8'))
     self.assertEqual(len(lib_tracker.groups), 4)
     self.assertEqual(
         lib_tracker.group_index[parse_kgs_coords('B8')], go.MISSING_GROUP_ID)
     self.assertEqual(captured, parse_kgs_coords_set('B8'))
Пример #10
0
    def test_lib_tracker_init(self):
        board = test_utils.load_board('X........' + EMPTY_ROW * 8)

        lib_tracker = LibertyTracker.from_board(board)
        self.assertEqual(len(lib_tracker.groups), 1)
        self.assertNotEqual(lib_tracker.group_index[parse_kgs_coords('A9')],
                            go.MISSING_GROUP_ID)
        self.assertEqual(lib_tracker.liberty_cache[parse_kgs_coords('A9')], 2)
        sole_group = lib_tracker.groups[lib_tracker.group_index[
            parse_kgs_coords('A9')]]
        self.assertEqual(sole_group.stones, parse_kgs_coords_set('A9'))
        self.assertEqual(sole_group.liberties, parse_kgs_coords_set('B9 A8'))
        self.assertEqual(sole_group.color, BLACK)
Пример #11
0
    def test_lib_tracker_init(self):
        board = test_utils.load_board('X........' + EMPTY_ROW * 8)

        lib_tracker = LibertyTracker.from_board(board)
        self.assertEqual(len(lib_tracker.groups), 1)
        self.assertNotEqual(
            lib_tracker.group_index[parse_kgs_coords('A9')], go.MISSING_GROUP_ID)
        self.assertEqual(lib_tracker.liberty_cache[parse_kgs_coords('A9')], 2)
        sole_group = lib_tracker.groups[lib_tracker.group_index[parse_kgs_coords(
            'A9')]]
        self.assertEqual(sole_group.stones, parse_kgs_coords_set('A9'))
        self.assertEqual(sole_group.liberties, parse_kgs_coords_set('B9 A8'))
        self.assertEqual(sole_group.color, BLACK)
Пример #12
0
 def test_chinese_handicap_handling(self):
     intermediate_board = test_utils.load_board('''
         .........
         .........
         ......X..
         .........
         .........
         .........
         .........
         .........
         .........
     ''')
     intermediate_position = go.Position(
         intermediate_board,
         n=1,
         komi=5.5,
         caps=(0, 0),
         recent=(go.PlayerMove(go.BLACK, parse_kgs_coords('G7')), ),
         to_play=go.BLACK,
     )
     final_board = test_utils.load_board('''
         ....OX...
         .O.OOX...
         O.O.X.X..
         .OXXX....
         OX...XX..
         .X.XXO...
         X.XOOXXX.
         XXXO.OOX.
         .XOOX.O..
     ''')
     final_position = go.Position(final_board,
                                  n=50,
                                  komi=5.5,
                                  caps=(7, 2),
                                  ko=None,
                                  recent=(
                                      go.PlayerMove(go.WHITE,
                                                    parse_kgs_coords('E9')),
                                      go.PlayerMove(go.BLACK,
                                                    parse_kgs_coords('F9')),
                                  ),
                                  to_play=go.WHITE)
     positions_w_context = list(replay_sgf(CHINESE_HANDICAP_SGF))
     self.assertEqualPositions(intermediate_position,
                               positions_w_context[1].position)
     self.assertEqual(positions_w_context[1].next_move,
                      parse_kgs_coords('C3'))
     final_replayed_position = positions_w_context[-1].position.play_move(
         positions_w_context[-1].next_move)
     self.assertEqualPositions(final_position, final_replayed_position)
Пример #13
0
 def test_chinese_handicap_handling(self):
     intermediate_board = test_utils.load_board('''
         .........
         .........
         ......X..
         .........
         .........
         .........
         .........
         .........
         .........
     ''')
     intermediate_position = go.Position(
         intermediate_board,
         n=1,
         komi=5.5,
         caps=(0, 0),
         recent=(go.PlayerMove(go.BLACK, parse_kgs_coords('G7')),),
         to_play=go.BLACK,
     )
     final_board = test_utils.load_board('''
         ....OX...
         .O.OOX...
         O.O.X.X..
         .OXXX....
         OX...XX..
         .X.XXO...
         X.XOOXXX.
         XXXO.OOX.
         .XOOX.O..
     ''')
     final_position = go.Position(
         final_board,
         n=50,
         komi=5.5,
         caps=(7, 2),
         ko=None,
         recent=(go.PlayerMove(go.WHITE, parse_kgs_coords('E9')),
                 go.PlayerMove(go.BLACK, parse_kgs_coords('F9')),),
         to_play=go.WHITE
     )
     positions_w_context = list(replay_sgf(CHINESE_HANDICAP_SGF))
     self.assertEqualPositions(
         intermediate_position, positions_w_context[1].position)
     self.assertEqual(
         positions_w_context[1].next_move, parse_kgs_coords('C3'))
     final_replayed_position = positions_w_context[-1].position.play_move(
         positions_w_context[-1].next_move)
     self.assertEqualPositions(final_position, final_replayed_position)
Пример #14
0
 def test_japanese_handicap_handling(self):
     intermediate_board = test_utils.load_board('''
         .........
         .........
         ......X..
         .........
         ....O....
         .........
         ..X......
         .........
         .........
     ''')
     intermediate_position = go.Position(
         intermediate_board,
         n=1,
         komi=5.5,
         caps=(0, 0),
         recent=(go.PlayerMove(go.WHITE, coords.parse_kgs_coords('E5')), ),
         to_play=go.BLACK,
     )
     final_board = test_utils.load_board('''
         .........
         .........
         ......X..
         .........
         ....O....
         .........
         ..XX.....
         .........
         .........
     ''')
     final_position = go.Position(
         final_board,
         n=2,
         komi=5.5,
         caps=(0, 0),
         recent=(
             go.PlayerMove(go.WHITE, parse_kgs_coords('E5')),
             go.PlayerMove(go.BLACK, parse_kgs_coords('D3')),
         ),
         to_play=go.WHITE,
     )
     positions_w_context = list(replay_sgf(JAPANESE_HANDICAP_SGF))
     self.assertEqualPositions(intermediate_position,
                               positions_w_context[1].position)
     final_replayed_position = positions_w_context[-1].position.play_move(
         positions_w_context[-1].next_move)
     self.assertEqualPositions(final_position, final_replayed_position)
Пример #15
0
    def test_same_friendly_group_neighboring_twice(self):
        board = test_utils.load_board('''
            XX.......
            X........
        ''' + EMPTY_ROW * 7)

        lib_tracker = LibertyTracker.from_board(board)
        captured = lib_tracker.add_stone(BLACK, parse_kgs_coords('B8'))
        self.assertEqual(len(lib_tracker.groups), 1)
        sole_group_id = lib_tracker.group_index[parse_kgs_coords('A9')]
        sole_group = lib_tracker.groups[sole_group_id]
        self.assertEqual(sole_group.stones,
                         parse_kgs_coords_set('A9 B9 A8 B8'))
        self.assertEqual(sole_group.liberties,
                         parse_kgs_coords_set('C9 C8 A7 B7'))
        self.assertEqual(captured, set())
Пример #16
0
    def test_same_friendly_group_neighboring_twice(self):
        board = test_utils.load_board('''
            XX.......
            X........
        ''' + EMPTY_ROW * 7)

        lib_tracker = LibertyTracker.from_board(board)
        captured = lib_tracker.add_stone(BLACK, parse_kgs_coords('B8'))
        self.assertEqual(len(lib_tracker.groups), 1)
        sole_group_id = lib_tracker.group_index[parse_kgs_coords('A9')]
        sole_group = lib_tracker.groups[sole_group_id]
        self.assertEqual(sole_group.stones,
                         parse_kgs_coords_set('A9 B9 A8 B8'))
        self.assertEqual(sole_group.liberties,
                         parse_kgs_coords_set('C9 C8 A7 B7'))
        self.assertEqual(captured, set())
Пример #17
0
 def test_japanese_handicap_handling(self):
     intermediate_board = test_utils.load_board('''
         .........
         .........
         ......X..
         .........
         ....O....
         .........
         ..X......
         .........
         .........
     ''')
     intermediate_position = go.Position(
         intermediate_board,
         n=1,
         komi=5.5,
         caps=(0, 0),
         recent=(go.PlayerMove(go.WHITE, coords.parse_kgs_coords('E5')),),
         to_play=go.BLACK,
     )
     final_board = test_utils.load_board('''
         .........
         .........
         ......X..
         .........
         ....O....
         .........
         ..XX.....
         .........
         .........
     ''')
     final_position = go.Position(
         final_board,
         n=2,
         komi=5.5,
         caps=(0, 0),
         recent=(go.PlayerMove(go.WHITE, parse_kgs_coords('E5')),
                 go.PlayerMove(go.BLACK, parse_kgs_coords('D3')),),
         to_play=go.WHITE,
     )
     positions_w_context = list(replay_sgf(JAPANESE_HANDICAP_SGF))
     self.assertEqualPositions(
         intermediate_position, positions_w_context[1].position)
     final_replayed_position = positions_w_context[-1].position.play_move(
         positions_w_context[-1].next_move)
     self.assertEqualPositions(final_position, final_replayed_position)
Пример #18
0
    def test_upperleft(self):
        self.assertEqual(coords.parse_sgf_coords('aa'), (0, 0))
        self.assertEqual(coords.unflatten_coords(0), (0, 0))
        self.assertEqual(coords.parse_kgs_coords('A9'), (0, 0))
        self.assertEqual(coords.parse_pygtp_coords((1, 9)), (0, 0))

        self.assertEqual(coords.unparse_sgf_coords((0, 0)), 'aa')
        self.assertEqual(coords.flatten_coords((0, 0)), 0)
        self.assertEqual(coords.to_human_coord((0, 0)), 'A9')
        self.assertEqual(coords.unparse_pygtp_coords((0, 0)), (1, 9))
Пример #19
0
    def test_pass(self):
        self.assertEqual(coords.parse_sgf_coords(''), None)
        self.assertEqual(coords.unflatten_coords(81), None)
        self.assertEqual(coords.parse_kgs_coords('pass'), None)
        self.assertEqual(coords.parse_pygtp_coords((0, 0)), None)

        self.assertEqual(coords.unparse_sgf_coords(None), '')
        self.assertEqual(coords.flatten_coords(None), 81)
        self.assertEqual(coords.to_human_coord(None), 'pass')
        self.assertEqual(coords.unparse_pygtp_coords(None), (0, 0))
Пример #20
0
    def test_topleft(self):
        self.assertEqual(coords.parse_sgf_coords('ia'), (0, 8))
        self.assertEqual(coords.unflatten_coords(8), (0, 8))
        self.assertEqual(coords.parse_kgs_coords('J9'), (0, 8))
        self.assertEqual(coords.parse_pygtp_coords((9, 9)), (0, 8))

        self.assertEqual(coords.unparse_sgf_coords((0, 8)), 'ia')
        self.assertEqual(coords.flatten_coords((0, 8)), 8)
        self.assertEqual(coords.to_human_coord((0, 8)), 'J9')
        self.assertEqual(coords.unparse_pygtp_coords((0, 8)), (9, 9))
Пример #21
0
    def test_move(self):
        start_position = Position(
            board=TEST_BOARD,
            n=0,
            komi=6.5,
            caps=(1, 2),
            ko=None,
            recent=tuple(),
            to_play=BLACK,
        )
        expected_board = test_utils.load_board('''
            .XX....OO
            X........
        ''' + EMPTY_ROW * 7)
        expected_position = Position(
            board=expected_board,
            n=1,
            komi=6.5,
            caps=(1, 2),
            ko=None,
            recent=(PlayerMove(BLACK, parse_kgs_coords('C9')),),
            to_play=WHITE,
        )
        actual_position = start_position.play_move(parse_kgs_coords('C9'))
        self.assertEqualPositions(actual_position, expected_position)

        expected_board2 = test_utils.load_board('''
            .XX....OO
            X.......O
        ''' + EMPTY_ROW * 7)
        expected_position2 = Position(
            board=expected_board2,
            n=2,
            komi=6.5,
            caps=(1, 2),
            ko=None,
            recent=(PlayerMove(BLACK, parse_kgs_coords('C9')),
                    PlayerMove(WHITE, parse_kgs_coords('J8'))),
            to_play=BLACK,
        )
        actual_position2 = actual_position.play_move(parse_kgs_coords('J8'))
        self.assertEqualPositions(actual_position2, expected_position2)
Пример #22
0
    def test_move(self):
        start_position = Position(
            board=TEST_BOARD,
            n=0,
            komi=6.5,
            caps=(1, 2),
            ko=None,
            recent=tuple(),
            to_play=BLACK,
        )
        expected_board = test_utils.load_board('''
            .XX....OO
            X........
        ''' + EMPTY_ROW * 7)
        expected_position = Position(
            board=expected_board,
            n=1,
            komi=6.5,
            caps=(1, 2),
            ko=None,
            recent=(PlayerMove(BLACK, parse_kgs_coords('C9')), ),
            to_play=WHITE,
        )
        actual_position = start_position.play_move(parse_kgs_coords('C9'))
        self.assertEqualPositions(actual_position, expected_position)

        expected_board2 = test_utils.load_board('''
            .XX....OO
            X.......O
        ''' + EMPTY_ROW * 7)
        expected_position2 = Position(
            board=expected_board2,
            n=2,
            komi=6.5,
            caps=(1, 2),
            ko=None,
            recent=(PlayerMove(BLACK, parse_kgs_coords('C9')),
                    PlayerMove(WHITE, parse_kgs_coords('J8'))),
            to_play=BLACK,
        )
        actual_position2 = actual_position.play_move(parse_kgs_coords('J8'))
        self.assertEqualPositions(actual_position2, expected_position2)
Пример #23
0
    def test_same_opponent_group_neighboring_twice(self):
        board = test_utils.load_board('''
            XX.......
            X........
        ''' + EMPTY_ROW * 7)

        lib_tracker = LibertyTracker.from_board(board)
        captured = lib_tracker.add_stone(WHITE, parse_kgs_coords('B8'))
        self.assertEqual(len(lib_tracker.groups), 2)
        black_group = lib_tracker.groups[lib_tracker.group_index[
            parse_kgs_coords('A9')]]
        self.assertEqual(black_group.stones, parse_kgs_coords_set('A9 B9 A8'))
        self.assertEqual(black_group.liberties, parse_kgs_coords_set('C9 A7'))

        white_group = lib_tracker.groups[lib_tracker.group_index[
            parse_kgs_coords('B8')]]
        self.assertEqual(white_group.stones, parse_kgs_coords_set('B8'))
        self.assertEqual(white_group.liberties, parse_kgs_coords_set('C8 B7'))

        self.assertEqual(captured, set())
Пример #24
0
    def test_same_opponent_group_neighboring_twice(self):
        board = test_utils.load_board('''
            XX.......
            X........
        ''' + EMPTY_ROW * 7)

        lib_tracker = LibertyTracker.from_board(board)
        captured = lib_tracker.add_stone(WHITE, parse_kgs_coords('B8'))
        self.assertEqual(len(lib_tracker.groups), 2)
        black_group = lib_tracker.groups[lib_tracker.group_index[parse_kgs_coords(
            'A9')]]
        self.assertEqual(black_group.stones, parse_kgs_coords_set('A9 B9 A8'))
        self.assertEqual(black_group.liberties, parse_kgs_coords_set('C9 A7'))

        white_group = lib_tracker.groups[lib_tracker.group_index[parse_kgs_coords(
            'B8')]]
        self.assertEqual(white_group.stones, parse_kgs_coords_set('B8'))
        self.assertEqual(white_group.liberties, parse_kgs_coords_set('C8 B7'))

        self.assertEqual(captured, set())
Пример #25
0
    def test_ko_move(self):
        start_board = test_utils.load_board('''
            .OX......
            OX.......
        ''' + EMPTY_ROW * 7)
        start_position = Position(
            board=start_board,
            n=0,
            komi=6.5,
            caps=(1, 2),
            ko=None,
            recent=tuple(),
            to_play=BLACK,
        )
        expected_board = test_utils.load_board('''
            X.X......
            OX.......
        ''' + EMPTY_ROW * 7)
        expected_position = Position(
            board=expected_board,
            n=1,
            komi=6.5,
            caps=(2, 2),
            ko=parse_kgs_coords('B9'),
            recent=(PlayerMove(BLACK, parse_kgs_coords('A9')),),
            to_play=WHITE,
        )
        actual_position = start_position.play_move(parse_kgs_coords('A9'))

        self.assertEqualPositions(actual_position, expected_position)

        # Check that retaking ko is illegal until two intervening moves
        with self.assertRaises(go.IllegalMove):
            actual_position.play_move(parse_kgs_coords('B9'))
        pass_twice = actual_position.pass_move().pass_move()
        ko_delayed_retake = pass_twice.play_move(parse_kgs_coords('B9'))
        expected_position = Position(
            board=start_board,
            n=4,
            komi=6.5,
            caps=(2, 3),
            ko=parse_kgs_coords('A9'),
            recent=(
                PlayerMove(BLACK, parse_kgs_coords('A9')),
                PlayerMove(WHITE, None),
                PlayerMove(BLACK, None),
                PlayerMove(WHITE, parse_kgs_coords('B9'))),
            to_play=BLACK,
        )
        self.assertEqualPositions(ko_delayed_retake, expected_position)
Пример #26
0
    def test_merge_multiple_groups(self):
        board = test_utils.load_board('''
            .X.......
            X.X......
            .X.......
        ''' + EMPTY_ROW * 6)
        lib_tracker = LibertyTracker.from_board(board)
        lib_tracker.add_stone(BLACK, parse_kgs_coords('B8'))
        self.assertEqual(len(lib_tracker.groups), 1)
        self.assertNotEqual(
            lib_tracker.group_index[parse_kgs_coords('B8')], go.MISSING_GROUP_ID)
        sole_group = lib_tracker.groups[lib_tracker.group_index[parse_kgs_coords(
            'B8')]]
        self.assertEqual(sole_group.stones,
                         parse_kgs_coords_set('B9 A8 B8 C8 B7'))
        self.assertEqual(sole_group.liberties,
                         parse_kgs_coords_set('A9 C9 D8 A7 C7 B6'))
        self.assertEqual(sole_group.color, BLACK)

        liberty_cache = lib_tracker.liberty_cache
        for stone in sole_group.stones:
            self.assertEqual(liberty_cache[stone], 6, str(stone))
Пример #27
0
    def test_merge_multiple_groups(self):
        board = test_utils.load_board('''
            .X.......
            X.X......
            .X.......
        ''' + EMPTY_ROW * 6)
        lib_tracker = LibertyTracker.from_board(board)
        lib_tracker.add_stone(BLACK, parse_kgs_coords('B8'))
        self.assertEqual(len(lib_tracker.groups), 1)
        self.assertNotEqual(lib_tracker.group_index[parse_kgs_coords('B8')],
                            go.MISSING_GROUP_ID)
        sole_group = lib_tracker.groups[lib_tracker.group_index[
            parse_kgs_coords('B8')]]
        self.assertEqual(sole_group.stones,
                         parse_kgs_coords_set('B9 A8 B8 C8 B7'))
        self.assertEqual(sole_group.liberties,
                         parse_kgs_coords_set('A9 C9 D8 A7 C7 B6'))
        self.assertEqual(sole_group.color, BLACK)

        liberty_cache = lib_tracker.liberty_cache
        for stone in sole_group.stones:
            self.assertEqual(liberty_cache[stone], 6, str(stone))
Пример #28
0
    def test_ko_move(self):
        start_board = test_utils.load_board('''
            .OX......
            OX.......
        ''' + EMPTY_ROW * 7)
        start_position = Position(
            board=start_board,
            n=0,
            komi=6.5,
            caps=(1, 2),
            ko=None,
            recent=tuple(),
            to_play=BLACK,
        )
        expected_board = test_utils.load_board('''
            X.X......
            OX.......
        ''' + EMPTY_ROW * 7)
        expected_position = Position(
            board=expected_board,
            n=1,
            komi=6.5,
            caps=(2, 2),
            ko=parse_kgs_coords('B9'),
            recent=(PlayerMove(BLACK, parse_kgs_coords('A9')), ),
            to_play=WHITE,
        )
        actual_position = start_position.play_move(parse_kgs_coords('A9'))

        self.assertEqualPositions(actual_position, expected_position)

        # Check that retaking ko is illegal until two intervening moves
        with self.assertRaises(go.IllegalMove):
            actual_position.play_move(parse_kgs_coords('B9'))
        pass_twice = actual_position.pass_move().pass_move()
        ko_delayed_retake = pass_twice.play_move(parse_kgs_coords('B9'))
        expected_position = Position(
            board=start_board,
            n=4,
            komi=6.5,
            caps=(2, 3),
            ko=parse_kgs_coords('A9'),
            recent=(PlayerMove(BLACK, parse_kgs_coords('A9')),
                    PlayerMove(WHITE, None), PlayerMove(BLACK, None),
                    PlayerMove(WHITE, parse_kgs_coords('B9'))),
            to_play=BLACK,
        )
        self.assertEqualPositions(ko_delayed_retake, expected_position)
Пример #29
0
    def test_capture_many(self):
        board = test_utils.load_board('''
            .XX......
            XOO......
            .XX......
        ''' + EMPTY_ROW * 6)
        lib_tracker = LibertyTracker.from_board(board)
        captured = lib_tracker.add_stone(BLACK, parse_kgs_coords('D8'))
        self.assertEqual(len(lib_tracker.groups), 4)
        self.assertEqual(lib_tracker.group_index[parse_kgs_coords('B8')],
                         go.MISSING_GROUP_ID)
        self.assertEqual(captured, parse_kgs_coords_set('B8 C8'))

        left_group = lib_tracker.groups[lib_tracker.group_index[
            parse_kgs_coords('A8')]]
        self.assertEqual(left_group.stones, parse_kgs_coords_set('A8'))
        self.assertEqual(left_group.liberties,
                         parse_kgs_coords_set('A9 B8 A7'))

        right_group = lib_tracker.groups[lib_tracker.group_index[
            parse_kgs_coords('D8')]]
        self.assertEqual(right_group.stones, parse_kgs_coords_set('D8'))
        self.assertEqual(right_group.liberties,
                         parse_kgs_coords_set('D9 C8 E8 D7'))

        top_group = lib_tracker.groups[lib_tracker.group_index[
            parse_kgs_coords('B9')]]
        self.assertEqual(top_group.stones, parse_kgs_coords_set('B9 C9'))
        self.assertEqual(top_group.liberties,
                         parse_kgs_coords_set('A9 D9 B8 C8'))

        bottom_group = lib_tracker.groups[lib_tracker.group_index[
            parse_kgs_coords('B7')]]
        self.assertEqual(bottom_group.stones, parse_kgs_coords_set('B7 C7'))
        self.assertEqual(bottom_group.liberties,
                         parse_kgs_coords_set('B8 C8 A7 D7 B6 C6'))

        liberty_cache = lib_tracker.liberty_cache
        for stone in top_group.stones:
            self.assertEqual(liberty_cache[stone], 4, str(stone))
        for stone in left_group.stones:
            self.assertEqual(liberty_cache[stone], 3, str(stone))
        for stone in right_group.stones:
            self.assertEqual(liberty_cache[stone], 4, str(stone))
        for stone in bottom_group.stones:
            self.assertEqual(liberty_cache[stone], 6, str(stone))
        for stone in captured:
            self.assertEqual(liberty_cache[stone], 0, str(stone))
Пример #30
0
    def test_capture_many(self):
        board = test_utils.load_board('''
            .XX......
            XOO......
            .XX......
        ''' + EMPTY_ROW * 6)
        lib_tracker = LibertyTracker.from_board(board)
        captured = lib_tracker.add_stone(BLACK, parse_kgs_coords('D8'))
        self.assertEqual(len(lib_tracker.groups), 4)
        self.assertEqual(
            lib_tracker.group_index[parse_kgs_coords('B8')], go.MISSING_GROUP_ID)
        self.assertEqual(captured, parse_kgs_coords_set('B8 C8'))

        left_group = lib_tracker.groups[lib_tracker.group_index[parse_kgs_coords(
            'A8')]]
        self.assertEqual(left_group.stones, parse_kgs_coords_set('A8'))
        self.assertEqual(left_group.liberties,
                         parse_kgs_coords_set('A9 B8 A7'))

        right_group = lib_tracker.groups[lib_tracker.group_index[parse_kgs_coords(
            'D8')]]
        self.assertEqual(right_group.stones, parse_kgs_coords_set('D8'))
        self.assertEqual(right_group.liberties,
                         parse_kgs_coords_set('D9 C8 E8 D7'))

        top_group = lib_tracker.groups[lib_tracker.group_index[parse_kgs_coords(
            'B9')]]
        self.assertEqual(top_group.stones, parse_kgs_coords_set('B9 C9'))
        self.assertEqual(top_group.liberties,
                         parse_kgs_coords_set('A9 D9 B8 C8'))

        bottom_group = lib_tracker.groups[lib_tracker.group_index[parse_kgs_coords(
            'B7')]]
        self.assertEqual(bottom_group.stones, parse_kgs_coords_set('B7 C7'))
        self.assertEqual(bottom_group.liberties,
                         parse_kgs_coords_set('B8 C8 A7 D7 B6 C6'))

        liberty_cache = lib_tracker.liberty_cache
        for stone in top_group.stones:
            self.assertEqual(liberty_cache[stone], 4, str(stone))
        for stone in left_group.stones:
            self.assertEqual(liberty_cache[stone], 3, str(stone))
        for stone in right_group.stones:
            self.assertEqual(liberty_cache[stone], 4, str(stone))
        for stone in bottom_group.stones:
            self.assertEqual(liberty_cache[stone], 6, str(stone))
        for stone in captured:
            self.assertEqual(liberty_cache[stone], 0, str(stone))
Пример #31
0
 def test_flipturn(self):
     start_position = Position(
         board=TEST_BOARD,
         n=0,
         komi=6.5,
         caps=(1, 2),
         ko=parse_kgs_coords('A1'),
         recent=tuple(),
         to_play=BLACK,
     )
     expected_position = Position(
         board=TEST_BOARD,
         n=0,
         komi=6.5,
         caps=(1, 2),
         ko=None,
         recent=tuple(),
         to_play=WHITE,
     )
     flip_position = start_position.flip_playerturn()
     self.assertEqualPositions(flip_position, expected_position)
Пример #32
0
 def test_passing(self):
     start_position = Position(
         board=TEST_BOARD,
         n=0,
         komi=6.5,
         caps=(1, 2),
         ko=parse_kgs_coords('A1'),
         recent=tuple(),
         to_play=BLACK,
     )
     expected_position = Position(
         board=TEST_BOARD,
         n=1,
         komi=6.5,
         caps=(1, 2),
         ko=None,
         recent=(PlayerMove(BLACK, None), ),
         to_play=WHITE,
     )
     pass_position = start_position.pass_move()
     self.assertEqualPositions(pass_position, expected_position)
Пример #33
0
 def test_flipturn(self):
     start_position = Position(
         board=TEST_BOARD,
         n=0,
         komi=6.5,
         caps=(1, 2),
         ko=parse_kgs_coords('A1'),
         recent=tuple(),
         to_play=BLACK,
     )
     expected_position = Position(
         board=TEST_BOARD,
         n=0,
         komi=6.5,
         caps=(1, 2),
         ko=None,
         recent=tuple(),
         to_play=WHITE,
     )
     flip_position = start_position.flip_playerturn()
     self.assertEqualPositions(flip_position, expected_position)
Пример #34
0
 def test_passing(self):
     start_position = Position(
         board=TEST_BOARD,
         n=0,
         komi=6.5,
         caps=(1, 2),
         ko=parse_kgs_coords('A1'),
         recent=tuple(),
         to_play=BLACK,
     )
     expected_position = Position(
         board=TEST_BOARD,
         n=1,
         komi=6.5,
         caps=(1, 2),
         ko=None,
         recent=(PlayerMove(BLACK, None),),
         to_play=WHITE,
     )
     pass_position = start_position.pass_move()
     self.assertEqualPositions(pass_position, expected_position)
Пример #35
0
 def test_place_stone_opposite_color(self):
     board = test_utils.load_board('X........' + EMPTY_ROW * 8)
     lib_tracker = LibertyTracker.from_board(board)
     lib_tracker.add_stone(WHITE, parse_kgs_coords('B9'))
     self.assertEqual(len(lib_tracker.groups), 2)
     self.assertNotEqual(lib_tracker.group_index[parse_kgs_coords('A9')],
                         go.MISSING_GROUP_ID)
     self.assertNotEqual(lib_tracker.group_index[parse_kgs_coords('B9')],
                         go.MISSING_GROUP_ID)
     self.assertEqual(lib_tracker.liberty_cache[parse_kgs_coords('A9')], 1)
     self.assertEqual(lib_tracker.liberty_cache[parse_kgs_coords('B9')], 2)
     black_group = lib_tracker.groups[lib_tracker.group_index[
         parse_kgs_coords('A9')]]
     white_group = lib_tracker.groups[lib_tracker.group_index[
         parse_kgs_coords('B9')]]
     self.assertEqual(black_group.stones, parse_kgs_coords_set('A9'))
     self.assertEqual(black_group.liberties, parse_kgs_coords_set('A8'))
     self.assertEqual(black_group.color, BLACK)
     self.assertEqual(white_group.stones, parse_kgs_coords_set('B9'))
     self.assertEqual(white_group.liberties, parse_kgs_coords_set('C9 B8'))
     self.assertEqual(white_group.color, WHITE)
Пример #36
0
 def test_place_stone_opposite_color(self):
     board = test_utils.load_board('X........' + EMPTY_ROW * 8)
     lib_tracker = LibertyTracker.from_board(board)
     lib_tracker.add_stone(WHITE, parse_kgs_coords('B9'))
     self.assertEqual(len(lib_tracker.groups), 2)
     self.assertNotEqual(
         lib_tracker.group_index[parse_kgs_coords('A9')], go.MISSING_GROUP_ID)
     self.assertNotEqual(
         lib_tracker.group_index[parse_kgs_coords('B9')], go.MISSING_GROUP_ID)
     self.assertEqual(lib_tracker.liberty_cache[parse_kgs_coords('A9')], 1)
     self.assertEqual(lib_tracker.liberty_cache[parse_kgs_coords('B9')], 2)
     black_group = lib_tracker.groups[lib_tracker.group_index[parse_kgs_coords(
         'A9')]]
     white_group = lib_tracker.groups[lib_tracker.group_index[parse_kgs_coords(
         'B9')]]
     self.assertEqual(black_group.stones, parse_kgs_coords_set('A9'))
     self.assertEqual(black_group.liberties, parse_kgs_coords_set('A8'))
     self.assertEqual(black_group.color, BLACK)
     self.assertEqual(white_group.stones, parse_kgs_coords_set('B9'))
     self.assertEqual(white_group.liberties, parse_kgs_coords_set('C9 B8'))
     self.assertEqual(white_group.color, WHITE)
Пример #37
0
 def test_is_koish(self):
     self.assertEqual(go.is_koish(
         TEST_BOARD, parse_kgs_coords('A9')), BLACK)
     self.assertEqual(go.is_koish(TEST_BOARD, parse_kgs_coords('B8')), None)
     self.assertEqual(go.is_koish(TEST_BOARD, parse_kgs_coords('B9')), None)
     self.assertEqual(go.is_koish(TEST_BOARD, parse_kgs_coords('E5')), None)
Пример #38
0
 def test_is_koish(self):
     self.assertEqual(go.is_koish(TEST_BOARD, parse_kgs_coords('A9')),
                      BLACK)
     self.assertEqual(go.is_koish(TEST_BOARD, parse_kgs_coords('B8')), None)
     self.assertEqual(go.is_koish(TEST_BOARD, parse_kgs_coords('B9')), None)
     self.assertEqual(go.is_koish(TEST_BOARD, parse_kgs_coords('E5')), None)