pygo/gomill/gomill_tests/gtp_state_test_support.py

107 lines
3.5 KiB
Python
Raw Permalink Normal View History

"""Support code for testing gtp_states."""
from gomill import gtp_states
from gomill.common import *
class Player(object):
"""Player (stateful move generator) for testing gtp_states.
Public attributes:
last_game_state -- the Game_state from the last genmove-like command
"""
def __init__(self):
self.next_move = None
self.next_comment = None
self.next_cookie = None
self.last_game_state = None
self.resign_next_move = False
def set_next_move(self, vertex, comment=None, cookie=None):
"""Specify what to return from the next genmove-like command."""
self.next_move = move_from_vertex(vertex, 19)
self.next_comment = comment
self.next_cookie = cookie
def set_next_move_resign(self):
self.resign_next_move = True
def genmove(self, game_state, player):
"""Move generator returns points from the move list.
game_state -- gtp_states.Game_state
player -- 'b' or 'w'
"""
self.last_game_state = game_state
# Freeze the move_history as we saw it
self.last_game_state.move_history = self.last_game_state.move_history[:]
result = gtp_states.Move_generator_result()
if self.resign_next_move:
result.resign = True
elif self.next_move is not None:
result.move = self.next_move
else:
result.pass_move = True
if self.next_comment is not None:
result.comments = self.next_comment
if self.next_cookie is not None:
result.cookie = self.next_cookie
self.next_move = None
self.next_comment = None
self.next_cookie = None
self.resign_next_move = False
return result
class Testing_gtp_state(gtp_states.Gtp_state):
"""Variant of Gtp_state suitable for use in tests.
This doesn't read from or write to the filesystem.
"""
def __init__(self, *args, **kwargs):
super(Testing_gtp_state, self).__init__(*args, **kwargs)
self._file_contents = {}
def _register_file(self, pathname, contents):
self._file_contents[pathname] = contents
def _load_file(self, pathname):
try:
return self._file_contents[pathname]
except KeyError:
raise EnvironmentError("unknown file: %s" % pathname)
def _save_file(self, pathname, contents):
if pathname == "force_fail":
open("/nonexistent_directory/foo.sgf", "w")
self._file_contents[pathname] = contents
def _choose_free_handicap_moves(self, number_of_stones):
"""Implementation of place_free_handicap.
Returns for a given number of stones:
2 -- A1 A2 A3 (too many stones)
4 -- A1 A2 A3 pass (pass isn't permitted)
5 -- A1 A2 A3 A4 A5 (which is ok)
6 -- A1 A2 A3 A4 A5 A1 (repeated point)
8 -- not even the right result type
otherwise Gtp_state default (which is to use the fixed handicap points)
"""
if number_of_stones == 2:
return ((0, 0), (1, 0), (2, 0))
elif number_of_stones == 4:
return ((0, 0), (1, 0), (2, 0), None)
elif number_of_stones == 5:
return ((0, 0), (1, 0), (2, 0), (3, 0), (4, 0))
elif number_of_stones == 6:
return ((0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (0, 0))
elif number_of_stones == 8:
return "nonsense"
else:
return super(Testing_gtp_state, self).\
_choose_free_handicap_moves(number_of_stones)