diff --git a/src/tests/testEngine.py b/src/tests/testEngine.py --- a/src/tests/testEngine.py +++ b/src/tests/testEngine.py @@ -1,20 +1,51 @@ +import re +import os.path +import logging as log from unittest import TestCase +import config as cfg +from util import BLACK as B,WHITE as W,EMPTY as _ +from go.core import Go from go.engine import SpecGo,Engine from statebag import BoardState +_log=log.getLogger(__name__) +_log.setLevel(log.INFO) +_log.propagate=False +formatter=log.Formatter("%(asctime)s %(levelname)s: %(message)s",datefmt="%Y-%m-%d %H:%M:%S") +handler=log.FileHandler("/tmp/oneeye.log",mode="w") +handler.setFormatter(formatter) +_log.addHandler(handler) + + +def simpleLoadSgf(filename): + with open(filename) as f: + contents=f.read() + g=lambda m: tuple(ord(c)-ord('a') for c in reversed(m.group(1))) + return [g(m) for m in re.finditer(r"\b[BW]\[([a-z]{2})\]",contents)] + + +def listStates(moves): + g=Go() + res=[BoardState(g.board)] + for m in moves: + g.doMove(g.toMove,*m) + res.append(BoardState(g.board)) + return res + + class TestTransitions(TestCase): def testBasic(self): s1=BoardState([ - [0,0,0], - [0,0,0], - [0,0,0] + [_,_,_], + [_,_,_], + [_,_,_] ]) s2=BoardState([ - [0,0,0], - [0,1,0], - [0,0,0] + [_,_,_], + [_,B,_], + [_,_,_] ]) g=SpecGo(3) eng=Engine(g) @@ -23,33 +54,83 @@ class TestTransitions(TestCase): def testCapture(self): s1=BoardState([ - [0,-1,0], - [-1,1,0], - [0,-1,0] + [_,W,_], + [W,B,_], + [_,W,_] ]) s2=BoardState([ - [0,-1,0], - [-1,0,-1], - [0,-1,0] + [_,W,_], + [W,_,W], + [_,W,_] ]) g=SpecGo(3) - g.toMove=-1 + g.toMove=W eng=Engine(g) eng.load(s1,s2-s1) - self.assertEqual(eng.dfs(s2,1),[(-1,1,2)]) + self.assertEqual(eng.dfs(s2,1),[(W,1,2)]) def testMulti(self): s1=BoardState([ - [0,0,0], - [0,0,0], - [0,0,0] + [_,_,_], + [_,_,_], + [_,_,_] ]) s2=BoardState([ - [0,0,0], - [0,1,-1], - [0,0,0] + [_,_,_], + [_,B,W], + [_,_,_] ]) g=SpecGo(3) eng=Engine(g) eng.load(s1,s2-s1) - self.assertEqual(eng.dfs(s2,2),[(-1,1,2),(1,1,1)]) + self.assertEqual(eng.dfs(s2,2),[(W,1,2),(B,1,1)]) + + def testSnapback(self): + s1=BoardState([ + [B,B,B], + [B,_,B], + [B,W,B] + ]) + s2=BoardState([ + [_,_,_], + [_,_,_], + [_,W,_] + ]) + g=SpecGo(3) + eng=Engine(g) + eng.load(s1,s2-s1) + self.assertEqual(eng.dfs(s2,2),[(W,2,1),(B,1,1)]) + + s1=BoardState([ + [_,_,_], + [W,B,B], + [_,W,W] + ]) + s2=BoardState([ + [_,_,_], + [W,B,B], + [_,W,_] + ]) + eng.load(s1,s2-s1) + self.assertEqual(eng.dfs(s2,2),[(W,2,1),(B,2,0)]) + + def testReal(self): + files=["O-Takao-20110106.sgf","Sakai-Iyama-20110110.sgf"] + g=SpecGo() + eng=Engine(g) + + for f in files: + moves=simpleLoadSgf(os.path.join(cfg.srcDir,"tests/data",f)) + states=listStates(moves) + + for k in range(1,4): + toMove=B + for (s1,s2) in zip(states,states[k:]): + diff=s2-s1 + eng.load(s1,diff) + seq=eng.iterativelyDeepen(s2,toMove) + msg="\n"+s1.exportDiff(s2) + self.assertIsNotNone(seq,msg) + self.assertLessEqual(len(seq),k,msg) + if len(seq)!=k: _log.warning("shorter than expected transition sequence:" + msg + "\n" + str(seq)) + toMove*=-1