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([ [_,_,_], [_,_,_], [_,_,_] ]) s2=BoardState([ [_,_,_], [_,B,_], [_,_,_] ]) g=SpecGo(3) eng=Engine(g) eng.load(s1,s2-s1) self.assertEqual(eng.dfs(s2,1),[(1,1,1)]) def testCapture(self): s1=BoardState([ [_,W,_], [W,B,_], [_,W,_] ]) s2=BoardState([ [_,W,_], [W,_,W], [_,W,_] ]) g=SpecGo(3) g.toMove=W eng=Engine(g) eng.load(s1,s2-s1) self.assertEqual(eng.dfs(s2,1),[(W,1,2)]) def testMulti(self): s1=BoardState([ [_,_,_], [_,_,_], [_,_,_] ]) s2=BoardState([ [_,_,_], [_,B,W], [_,_,_] ]) g=SpecGo(3) eng=Engine(g) eng.load(s1,s2-s1) 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