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.engine import SpecGo,Engine from statebag import BoardState from .util import simpleLoadSgf,listStates _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) class TestTransitions(TestCase): def testBasic(self): s1=BoardState([ [_,_,_], [_,_,_], [_,_,_] ]) s2=BoardState([ [_,_,_], [_,B,_], [_,_,_] ]) g=SpecGo(3) eng=Engine(g) eng.load(s1) eng._moveList=eng._g.listRelevantMoves(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) eng._moveList=eng._g.listRelevantMoves(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) eng._moveList=eng._g.listRelevantMoves(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) eng._moveList=eng._g.listRelevantMoves(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) eng._moveList=eng._g.listRelevantMoves(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"] eng=Engine() 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 (i,(s1,s2)) in enumerate(zip(states,states[k:])): diff=s2-s1 eng.load(s1) colorIn=W if i&1 else B colorOut=colorIn if k&1 else -colorIn seq=eng.iterativelyDeepen(s2,diff,colorIn,colorOut) msg="\n>>> {0} ({1}, {2})\n>>> {3}\n".format(f,k,i,str(seq))+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