7 def initialize(game_name, name, sente)
9 @name = "%s_%s" % [game_name, name]
13 @turn_mark = sente ? "+" : "-"
19 @login_command = "LOGIN #{@name} dummy x1"
22 attr_accessor :login_command
26 @socket = TCPSocket.open("localhost", port)
33 @socket.close if @socket && !@socket.closed?
37 @thread = Thread.new do
41 break if @socket.closed?
42 if r = select([@socket], nil, nil, 10)
46 if %r!^[\+\-]\d{4}\w{2},T\d+$! =~ str
56 $stderr.puts "\nReader thread interrupted"
62 @thread.kill if @thread
68 return if reg =~ @message
77 return if @received_moves == n
85 $stderr.puts str if $DEBUG
91 str = "%%GAME #{@game_name}-1500-0 #{@turn_mark}"
92 $stderr.puts str if $DEBUG
97 str = "%%CHALLENGE #{@game_name}-1500-0 #{@turn_mark}"
98 $stderr.puts str if $DEBUG
103 wait %r!^END Game_Summary!
122 @socket.puts "%TORYO"
126 wait %r!^#(WIN|LOSE)!
130 @socket.puts "LOGOUT"
136 class SocketCSAPlayer < SocketPlayer
137 def initialize(game_name, name, sente)
139 @login_command = "LOGIN #{@name} dummy"
144 $stderr.puts str if $DEBUG
154 class BaseClient < Test::Unit::TestCase
155 attr_accessor :game_name, :p1_name, :p2_name
158 @game_name = self.class.name
164 @p1 = SocketPlayer.new @game_name, @p1_name, true
165 @p2 = SocketPlayer.new @game_name, @p2_name, false
173 attr_reader :src1, :src2
221 yield if block_given?
224 [@p1.message, @p2.message]
234 raise "do not reach!"
241 @p2.wait_nmoves @nmoves
247 @p1.wait_nmoves @nmoves
278 class ReadFileClient < BaseClient
279 def filepath(csa_file_name)
280 return File.join(File.dirname(__FILE__), "csa", csa_file_name)
287 csa_io = StringIO.new(csa)
288 while line = csa_io.gets do
290 when /^[\+\-]\d{4}\w{2}/
292 $stderr.puts s if $DEBUG
300 class CSABaseClient < BaseClient
302 # In CSA mode, the server decides sente or gote at random; and sockets are closed
303 # just after the game ends (i.e. %TORYO is sent)
306 @p1 = SocketCSAPlayer.new @game_name, @p1_name, true
307 @p2 = SocketCSAPlayer.new @game_name, @p2_name, false
323 if /Your_Turn:\+/ =~ @p1.message
330 yield if block_given?
332 [@p1.message, @p2.message]