from itertools import chain
import unittest
from unittest import TestCase
import os
from sgfParser import strRowCol
from sgfParser.collection import Collection
from sgfParser.property import Property
from sgfParser.propValues import text,compose
dataDir=os.path.join(os.path.dirname(__file__), "data")
class TestUtils(TestCase):
def testTextPos(self):
s="abc\ndef\rgh\r\nij\n\rklmn"
rc=[
[1,2,3,4],
[1,2,3,4],
[1,2,3,4],
[1,2,3], [1], # don't care about LFCR, we unicode now
[1,2,3,4]
]
res=chain((r+1,c) for (r,row) in enumerate(rc) for c in row)
for (i,(r,c)) in zip(range(len(s)+1), res):
self.assertEqual(strRowCol(s, i), (r, c))
class TestProperty(TestCase):
def testName(self):
with self.assertRaises(AssertionError):
Property.create("[99]",0)
with self.assertRaises(AssertionError):
Property.create("99[99]",0)
i,prop=Property.create("MN[99]",0)
self.assertNotEqual((i,prop), (0,None))
self.assertEqual((i,prop.name), (6,"MN"))
def testText(self):
s=r"""[abc\
def
ghi]"""
self.assertEqual(text()(s,1)[1], "abcdef ghi")
self.assertEqual(text(False)(s,1)[1], "abcdef\nghi")
s="""[m\\no\\\tpqr\\]\\\\]"""
self.assertEqual(text()(s,1)[1], "mno pqr]\\")
self.assertEqual(text(False)(s,1)[1], "mno pqr]\\")
s="""[abc:def]"""
parsed=compose(text(composed=True),text(composed=True))(s,1)
self.assertEqual(str(parsed[1]), "abc:def")
class TestCollection(TestCase):
def testSubtrees(self):
c=Collection("""
(;B[aa]
(;W[ab]PB[Some Black]PW[Some White];B[ac])
(;W[bb]PB[Other Black]PW[Other White])
)""")
games=list(c.listGames())
self.assertEqual(len(games),2)
self.assertRegex(games[0].export(), r"^\(;B\[aa];(PB\[Some Black]|PW\[Some White]|W\[ab]){3};B\[ac]\)$")
self.assertRegex(games[1].export(), r"^\(;B\[aa];(PB\[Other Black]|PW\[Other White]|W\[bb]){3}\)$")
def testEmptySgf(self):
Collection("(;)")
def testSimpleSgf(self):
with open(os.path.join(dataDir, "simple.sgf")) as f:
Collection(f.read())
def testComplexSgf(self):
with open(os.path.join(dataDir, "kogos.sgf")) as f:
Collection(f.read())
if __name__ == '__main__':
unittest.main()