| | import os |
| | from unittest.mock import MagicMock |
| |
|
| | from katrain.core.base_katrain import KaTrainBase |
| | from katrain.core.game import Game, KaTrainSGF |
| | from katrain.core.sgf_parser import SGF, SGFNode |
| |
|
| |
|
| | def test_simple(): |
| | input_sgf = "(;GM[1]FF[4]SZ[19]DT[2020-04-12]AB[dd][dj];B[dp];W[pp];B[pj])" |
| | root = SGF.parse_sgf(input_sgf) |
| | assert "4" == root.get_property("FF") |
| | assert root.get_property("XYZ") is None |
| | assert "dp" == root.children[0].get_property("B") |
| | assert input_sgf == root.sgf() |
| |
|
| |
|
| | def test_branch(): |
| | input_sgf = "(;GM[1]FF[4]CA[UTF-8]AP[Sabaki:0.43.3]KM[6.5]SZ[19]DT[2020-04-12]AB[dd][dj](;B[dp];W[pp](;B[pj])(;PL[B]AW[jp]C[sdfdsfdsf]))(;B[pd]))" |
| | root = SGF.parse_sgf(input_sgf) |
| | assert input_sgf == root.sgf() |
| |
|
| |
|
| | def test_dragon_weirdness(): |
| | input_sgf = "\n(\n\n;\nGM[1]\nFF[4]\nCA[UTF-8]AP[Sabaki:0.43.3]KM[6.5]SZ[19]DT[2020-04-12]AB[dd]\n[dj]\n(\n;\nB[dp]\n;\nW[pp]\n(\n;\nB[pj]\n)\n(\n;\nPL[B]\nAW[jp]\nC[sdfdsfdsf]\n)\n)\n(\n;\nB[pd]\n)\n)\n" |
| | root = SGF.parse_sgf(input_sgf) |
| | assert input_sgf.replace("\n", "") == root.sgf() |
| |
|
| |
|
| | def test_weird_escape(): |
| | input_sgf = """(;GM[1]FF[4]CA[UTF-8]AP[Sabaki:0.43.3]KM[6.5]SZ[19]DT[2020-04-12]C[how does it escape |
| | [ |
| | or \\] |
| | ])""" |
| | root = SGF.parse_sgf(input_sgf) |
| | assert input_sgf == root.sgf() |
| |
|
| |
|
| | def test_backslash_escape(): |
| | nasty_string = "[]]\\" |
| | nasty_strings = ["[\\]\\]\\\\", "[", "]", "\\", "\\[", "\\]", "\\\\[", "\\\\]", "]]]\\]]\\]]["] |
| | assert "[\\]\\]\\\\" == SGFNode._escape_value(nasty_string) |
| | for x in nasty_strings: |
| | assert x == SGFNode._unescape_value(SGFNode._escape_value(x)) |
| |
|
| | c2 = ["]", "\\"] |
| | node = SGFNode(properties={"C1": nasty_string}) |
| | node.set_property("C2", c2) |
| | assert "(;C1[[\\]\\]\\\\]C2[\\]][\\\\])" == node.sgf() |
| | assert {"C1": [nasty_string], "C2": c2} == SGF.parse_sgf(node.sgf()).properties |
| |
|
| |
|
| | def test_alphago(): |
| | file = os.path.join(os.path.dirname(__file__), "data/LS vs AG - G4 - English.sgf") |
| | SGF.parse_file(file) |
| |
|
| |
|
| | def test_pandanet(): |
| | file = os.path.join(os.path.dirname(__file__), "data/panda1.sgf") |
| | root = SGF.parse_file(file) |
| | root_props = { |
| | "GM", |
| | "EV", |
| | "US", |
| | "CP", |
| | "GN", |
| | "RE", |
| | "PW", |
| | "WR", |
| | "NW", |
| | "PB", |
| | "BR", |
| | "NB", |
| | "PC", |
| | "DT", |
| | "SZ", |
| | "TM", |
| | "KM", |
| | "LT", |
| | "RR", |
| | "HA", |
| | "AB", |
| | "C", |
| | } |
| | assert root_props == root.properties.keys() |
| |
|
| | move = root |
| | while move.children: |
| | move = move.children[0] |
| | assert 94 == len(move.get_list_property("TW")) |
| | assert "Trilan" == move.get_property("OS") |
| | while move.parent: |
| | move = move.parent |
| | assert move is root |
| |
|
| |
|
| | def test_old_long_properties(): |
| | file = os.path.join(os.path.dirname(__file__), "data/xmgt97.sgf") |
| | SGF.parse_file(file) |
| |
|
| |
|
| | def test_old_server_style(): |
| | input_sgf = "... 01:23:45 +0900 (JST) ... (;SZ[19];B[aa];W[ba];)" |
| | SGF.parse_sgf(input_sgf) |
| |
|
| |
|
| | def test_old_server_style_again(): |
| | input_sgf = """(; |
| | SZ[19]TM[600]KM[0.500000]LT[] |
| | |
| | ;B[fp]BL[500]; |
| | |
| | )""" |
| | tree = SGF.parse_sgf(input_sgf) |
| | assert 2 == len(tree.nodes_in_tree) |
| |
|
| |
|
| | def test_ogs(): |
| | file = os.path.join(os.path.dirname(__file__), "data/ogs.sgf") |
| | SGF.parse_file(file) |
| |
|
| |
|
| | def test_gibo(): |
| | file = os.path.join(os.path.dirname(__file__), "data/test.gib") |
| | root = SGF.parse_file(file) |
| | assert { |
| | "PW": ["wildsim1"], |
| | "WR": ["2D"], |
| | "PB": ["kim"], |
| | "BR": ["2D"], |
| | "RE": ["W+T"], |
| | "KM": [6.5], |
| | "DT": ["2020-06-14"], |
| | } == root.properties |
| | assert "pd" == root.children[0].get_property("B") |
| |
|
| |
|
| | def test_ngf(): |
| | file = os.path.join(os.path.dirname(__file__), "data/handicap2.ngf") |
| | root = SGF.parse_file(file) |
| | root.properties["AB"].sort() |
| | assert { |
| | "AB": ["dp", "pd"], |
| | "DT": ["2017-03-16"], |
| | "HA": [2], |
| | "PB": ["p81587"], |
| | "PW": ["ace550"], |
| | "RE": ["W+"], |
| | "SZ": [19], |
| | } == root.properties |
| | assert "pq" == root.children[0].get_property("W") |
| |
|
| |
|
| | def test_foxwq(): |
| | for sgf in ["data/fox sgf error.sgf", "data/fox sgf works.sgf"]: |
| | file = os.path.join(os.path.dirname(__file__), sgf) |
| | move_tree = KaTrainSGF.parse_file(file) |
| | katrain = KaTrainBase(force_package_config=True, debug_level=0) |
| | game = Game(katrain, MagicMock(), move_tree) |
| |
|
| | assert [] == move_tree.placements |
| | assert [] == game.root.placements |
| | while game.current_node.children: |
| | assert 1 == len(game.current_node.children) |
| | game.redo(1) |
| |
|
| |
|
| | def test_next_player(): |
| | input_sgf = "(;GM[1]FF[4]AB[aa]AW[bb])" |
| | assert "B" == SGF.parse_sgf(input_sgf).next_player |
| | assert "B" == SGF.parse_sgf(input_sgf).initial_player |
| | input_sgf = "(;GM[1]FF[4]AB[aa]AW[bb]PL[B])" |
| | assert "B" == SGF.parse_sgf(input_sgf).next_player |
| | assert "B" == SGF.parse_sgf(input_sgf).initial_player |
| | input_sgf = "(;GM[1]FF[4]AB[aa]AW[bb]PL[W])" |
| | assert "W" == SGF.parse_sgf(input_sgf).next_player |
| | assert "W" == SGF.parse_sgf(input_sgf).initial_player |
| | input_sgf = "(;GM[1]FF[4]AB[aa])" |
| | assert "W" == SGF.parse_sgf(input_sgf).next_player |
| | assert "W" == SGF.parse_sgf(input_sgf).initial_player |
| | input_sgf = "(;GM[1]FF[4]AB[aa]PL[B])" |
| | assert "B" == SGF.parse_sgf(input_sgf).next_player |
| | assert "B" == SGF.parse_sgf(input_sgf).initial_player |
| | input_sgf = "(;GM[1]FF[4]AB[aa];B[dd])" |
| | assert "B" == SGF.parse_sgf(input_sgf).next_player |
| | assert "B" == SGF.parse_sgf(input_sgf).initial_player |
| | input_sgf = "(;GM[1]FF[4]AB[aa];W[dd])" |
| | assert "W" == SGF.parse_sgf(input_sgf).next_player |
| | assert "W" == SGF.parse_sgf(input_sgf).initial_player |
| |
|
| |
|
| | def test_placements(): |
| | input_sgf = "(;GM[1]FF[4]SZ[19]DT[2020-04-12]AB[dd][aa:ee]AW[ff:zz]AE[aa][bb][cc:dd])" |
| | root = SGF.parse_sgf(input_sgf) |
| | print(root.properties) |
| | assert 6 == len(root.clear_placements) |
| | assert 25 + 14 * 14 == len(root.placements) |
| |
|