from itertools import chain from datetime import date import unittest from unittest import TestCase import os from ..sgfParser import str_row_col from ..sgfParser.collection import Collection from ..sgfParser.property import Property, DateProperty, DateException 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(str_row_col(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 TestDateProperty(TestCase): def testSingle(self): self.assertEqual(DateProperty.parse_single("2019", "Y")[1], date(2019, 1, 1)) self.assertEqual(DateProperty.parse_single("2019-06", "YM")[1], date(2019, 6, 1)) self.assertEqual(DateProperty.parse_single("2019-06-22", "YMD")[1], date(2019, 6, 22)) d = date(2019, 6, 21) self.assertEqual(DateProperty.parse_single("22", "D", d)[1], date(2019, 6, 22)) self.assertEqual(DateProperty.parse_single("07-22", "MD", d)[1], date(2019, 7, 22)) self.assertEqual(DateProperty.parse_single("2020-07-22", "YMD", d)[1], date(2020, 7, 22)) with self.assertRaises(ValueError): DateProperty.parse_single("2019-31", "YMD") def testParse(self): self.assertEqual(DateProperty("1996-05,06").value, [date(1996, 5, 1), date(1996, 6, 1)]) self.assertEqual(DateProperty("1996-05-06,07,08").value, [date(1996, 5, 6), date(1996, 5, 7), date(1996, 5, 8)]) self.assertEqual(DateProperty("1996,1997").value, [date(1996, 1, 1), date(1997, 1, 1)]) self.assertEqual(DateProperty("1996-12-27,28,1997-01-03,04").value, [date(1996, 12, 27), date(1996, 12, 28), date(1997, 1, 3), date(1997, 1, 4)]) self.assertEqual(DateProperty("1997-05-05,1997-05-06").value, [date(1997, 5, 5), date(1997, 5, 6)]) self.assertEqual(DateProperty("Published on 1997-05-06").value, [date(1997, 5, 6)]) with self.assertRaises(DateException): DateProperty("unknown") 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.list_games()) self.assertEqual(len(games), 2) self.assertRegex(games[0].export(), r"^\(;B\[aa]\n;(PB\[Some Black]|PW\[Some White]|W\[ab]){3}\n;B\[ac]\n\)\n$") self.assertRegex(games[1].export(), r"^\(;B\[aa]\n;(PB\[Other Black]|PW\[Other White]|W\[bb]){3}\n\)\n$") 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()