// GtpSynchronizerTest.java package net.sf.gogui.gtp; import java.io.IOException; import net.sf.gogui.game.TimeSettings; import net.sf.gogui.go.Board; import net.sf.gogui.go.ConstPointList; import net.sf.gogui.go.GoColor; import static net.sf.gogui.go.GoColor.BLACK; import static net.sf.gogui.go.GoColor.WHITE; import net.sf.gogui.go.GoPoint; import net.sf.gogui.go.PointList; public final class GtpSynchronizerTest extends junit.framework.TestCase { public static void main(String args[]) { junit.textui.TestRunner.run(suite()); } public static junit.framework.Test suite() { return new junit.framework.TestSuite(GtpSynchronizerTest.class); } public void setUp() throws IOException, GtpError { m_expect = new GtpExpectEngine(null); m_gtp = new GtpEngineClient(m_expect); m_board = new Board(19); } public void testBasic() throws GtpError { createSynchronizer(); expect("list_commands", "undo"); m_gtp.querySupportedCommands(); assertExpectQueueEmpty(); expect("boardsize 19", ""); expect("clear_board", ""); synchronize(); assertExpectQueueEmpty(); play(BLACK, 3, 4); expect("play B D5", ""); synchronize(); assertExpectQueueEmpty(); play(BLACK, 4, 4); play(WHITE, 5, 5); play(BLACK, null); expect("play B E5", ""); expect("play W F6", ""); expect("play B PASS", ""); synchronize(); assertExpectQueueEmpty(); undo(); expect("undo", ""); synchronize(); assertExpectQueueEmpty(); undo(2); play(WHITE, 5, 5); play(BLACK, 4, 4); expect("undo", ""); expect("undo", ""); expect("play W F6", ""); expect("play B E5", ""); synchronize(); assertExpectQueueEmpty(); } public void testBasicFillPasses() throws GtpError { createSynchronizer(true); expect("list_commands", "undo"); m_gtp.querySupportedCommands(); assertExpectQueueEmpty(); expect("boardsize 19", ""); expect("clear_board", ""); synchronize(); assertExpectQueueEmpty(); play(BLACK, 3, 4); expect("play B D5", ""); synchronize(); assertExpectQueueEmpty(); play(BLACK, 4, 4); play(WHITE, 5, 5); play(BLACK, null); expect("play W PASS", ""); expect("play B E5", ""); expect("play W F6", ""); expect("play B PASS", ""); synchronize(); assertExpectQueueEmpty(); undo(); expect("undo", ""); synchronize(); assertExpectQueueEmpty(); undo(2); play(WHITE, 5, 5); play(BLACK, 4, 4); expect("undo", ""); expect("undo", ""); expect("undo", ""); expect("play W F6", ""); expect("play B E5", ""); synchronize(); assertExpectQueueEmpty(); } /** Test that set_free_handicap command is used if supported by the engine. */ public void testSetupHandicap() throws GtpError { createSynchronizer(); expect("list_commands", "set_free_handicap"); m_gtp.querySupportedCommands(); assertExpectQueueEmpty(); expect("boardsize 19", ""); expect("clear_board", ""); synchronize(); assertExpectQueueEmpty(); PointList black = new PointList(); black.add(GoPoint.get(3, 4)); black.add(GoPoint.get(4, 4)); setupHandicap(black); expect("boardsize 19", ""); expect("clear_board", ""); expect("set_free_handicap D5 E5", ""); synchronize(); assertExpectQueueEmpty(); // Playing a move should not trigger a re-transmission play(WHITE, 5, 5); expect("play W F6", ""); synchronize(); assertExpectQueueEmpty(); } /** Test that handicap stones are transmitted as moves if neither set_free_handicap nor gogui-setup is supported. */ public void testSetupHandicapAsMoves() throws GtpError { createSynchronizer(); expect("list_commands", ""); m_gtp.querySupportedCommands(); assertExpectQueueEmpty(); expect("boardsize 19", ""); expect("clear_board", ""); synchronize(); assertExpectQueueEmpty(); PointList black = new PointList(); black.add(GoPoint.get(3, 4)); black.add(GoPoint.get(4, 4)); setupHandicap(black); expect("play B D5", ""); expect("play B E5", ""); synchronize(); assertExpectQueueEmpty(); // Playing a move should not trigger a re-transmission play(WHITE, 5, 5); expect("play W F6", ""); synchronize(); assertExpectQueueEmpty(); } /** Test that handicap stones are transmitted using gogui-setup if set_free_handicap is not supported, but gogui-setup is supported. */ public void testSetupHandicapAsSetup() throws GtpError { createSynchronizer(); expect("list_commands", "gogui-setup"); m_gtp.querySupportedCommands(); assertExpectQueueEmpty(); expect("boardsize 19", ""); expect("clear_board", ""); synchronize(); assertExpectQueueEmpty(); PointList black = new PointList(); black.add(GoPoint.get(3, 4)); black.add(GoPoint.get(4, 4)); setupHandicap(black); expect("boardsize 19", ""); expect("clear_board", ""); expect("gogui-setup B D5 B E5", ""); synchronize(); assertExpectQueueEmpty(); // Playing a move should not trigger a re-transmission play(WHITE, 5, 5); expect("play W F6", ""); synchronize(); assertExpectQueueEmpty(); } /** Test that gogui-setup command is used if supported by the engine. */ public void testSetup() throws GtpError { createSynchronizer(); expect("list_commands", "gogui-setup\n"); m_gtp.querySupportedCommands(); assertExpectQueueEmpty(); expect("boardsize 19", ""); expect("clear_board", ""); synchronize(); assertExpectQueueEmpty(); PointList black = new PointList(); black.add(GoPoint.get(3, 4)); black.add(GoPoint.get(4, 4)); PointList white = new PointList(); white.add(GoPoint.get(5, 5)); setup(black, white, BLACK); expect("boardsize 19", ""); expect("clear_board", ""); expect("gogui-setup B D5 B E5 W F6", ""); synchronize(); assertExpectQueueEmpty(); } public void testSetupWithMoves1() throws GtpError { createSynchronizer(); assertExpectQueueEmpty(); expect("boardsize 19", ""); expect("clear_board", ""); synchronize(); assertExpectQueueEmpty(); PointList black = new PointList(); black.add(GoPoint.get(3, 4)); black.add(GoPoint.get(4, 4)); setup(black, null, BLACK); expect("play B D5", ""); expect("play B E5", ""); synchronize(); assertExpectQueueEmpty(); } public void testSetupWithMoves2() throws GtpError { createSynchronizer(); assertExpectQueueEmpty(); // synchronizer should send moves of color to move first, such // that the right color is to move after the moves (works only // if there are setup stones by both colors) PointList black = new PointList(); black.add(GoPoint.get(4, 4)); PointList white = new PointList(); white.add(GoPoint.get(5, 5)); setup(black, white, BLACK); expect("boardsize 19", ""); expect("clear_board", ""); expect("play B E5", ""); expect("play W F6", ""); synchronize(); assertExpectQueueEmpty(); } public void testSetupWithMoves3() throws GtpError { createSynchronizer(); assertExpectQueueEmpty(); // synchronizer should send moves of color to move first, such // that the right color is to move after the moves (works only // if there are setup stones by both colors) PointList black = new PointList(); black.add(GoPoint.get(4, 4)); PointList white = new PointList(); white.add(GoPoint.get(5, 5)); setup(black, white, WHITE); expect("boardsize 19", ""); expect("clear_board", ""); expect("play W F6", ""); expect("play B E5", ""); synchronize(); assertExpectQueueEmpty(); } public void testSetupPlayer() throws GtpError { createSynchronizer(); expect("list_commands", "gogui-setup\n" + "gogui-setup_player\n"); m_gtp.querySupportedCommands(); assertExpectQueueEmpty(); expect("boardsize 19", ""); expect("clear_board", ""); synchronize(); assertExpectQueueEmpty(); setup(new PointList(GoPoint.get(1, 1)), null, WHITE); expect("boardsize 19", ""); expect("clear_board", ""); expect("gogui-setup B B2", ""); expect("gogui-setup_player W", ""); synchronize(); assertExpectQueueEmpty(); } public void testTimeSettings() throws GtpError { createSynchronizer(); expect("list_commands", "time_settings\n"); m_gtp.querySupportedCommands(); assertExpectQueueEmpty(); expect("boardsize 19", ""); expect("clear_board", ""); synchronize(); assertExpectQueueEmpty(); expect("time_settings 1800 0 0", ""); m_synchronizer.synchronize(m_board, null, new TimeSettings(1800000)); assertExpectQueueEmpty(); expect("time_settings 800 0 0", ""); m_synchronizer.synchronize(m_board, null, new TimeSettings(800000)); assertExpectQueueEmpty(); expect("time_settings 0 1 0", ""); m_synchronizer.synchronize(m_board, null, null); assertExpectQueueEmpty(); } private Board m_board; private GtpExpectEngine m_expect; private GtpClientBase m_gtp; private GtpSynchronizer m_synchronizer; private void assertExpectQueueEmpty() { assertTrue("Command not sent: " + m_expect.getNextExpectedCommand(), m_expect.isExpectQueueEmpty()); } private void createSynchronizer() { createSynchronizer(false); } private void createSynchronizer(boolean fillPasses) { m_synchronizer = new GtpSynchronizer(m_gtp, null, fillPasses); } private void expect(String command, String response) { m_expect.expect(command, response); } private void play(GoColor c, GoPoint p) { m_board.play(c, p); } private void play(GoColor c, int x, int y) { m_board.play(c, GoPoint.get(x, y)); } private void setup(ConstPointList black, ConstPointList white, GoColor player) { m_board.setup(black, white, player); } private void setupHandicap(ConstPointList black) { m_board.setupHandicap(black); } private void synchronize() throws GtpError { m_synchronizer.synchronize(m_board, null, null); } private void undo() { m_board.undo(); } private void undo(int n) { m_board.undo(n); } }