OSDN Git Service

- shogi_server/player.rb:
[shogi-server/shogi-server.git] / test / TC_functional.rb
1 require "baseclient"
2 require "kconv"
3
4 class TestClientAtmark < BaseClient
5   # login with trip
6   def login
7     cmd "LOGIN testsente@p1 dummy x1"
8     cmd "%%GAME testClientAtmark-1500-0 +"
9     
10     cmd2 "LOGIN testgote@p2 dummy2 x1"
11     cmd2 "%%CHALLENGE testClientAtmark-1500-0 -"
12   end
13
14   def test_toryo
15     result, result2 = handshake do
16       cmd  "%TORYO"
17     end
18     assert(/#LOSE/ =~ result)
19     assert(/#WIN/  =~ result2)
20
21     now = Time.now
22     year  = now.strftime("%Y")
23     month = now.strftime("%m")
24     day   = now.strftime("%d")
25     path = File.join( File.dirname(__FILE__), "..", year, month, day, "*testClientAtmark-1500-0*")
26     log_files = Dir.glob(path)
27     assert(!log_files.empty?) 
28     log_content = File.open(log_files.sort.last).read
29
30     # "$EVENT", "$START_TIME" and "'$END_TIME" are removed since they vary dinamically.
31     should_be = <<-EOF
32 V2
33 N+testsente@p1
34 N-testgote@p2
35 P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
36 P2 * -HI *  *  *  *  * -KA * 
37 P3-FU-FU-FU-FU-FU-FU-FU-FU-FU
38 P4 *  *  *  *  *  *  *  *  * 
39 P5 *  *  *  *  *  *  *  *  * 
40 P6 *  *  *  *  *  *  *  *  * 
41 P7+FU+FU+FU+FU+FU+FU+FU+FU+FU
42 P8 * +KA *  *  *  *  * +HI * 
43 P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
44 +
45 'rating:testsente@p1+275876e34cf609db118f3d84b799a790:testgote@p2+c0c40e7a94eea7e2c238b75273087710
46 +2726FU
47 T1
48 -3334FU
49 T1
50 %TORYO
51 'P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
52 'P2 * -HI *  *  *  *  * -KA * 
53 'P3-FU-FU-FU-FU-FU-FU * -FU-FU
54 'P4 *  *  *  *  *  * -FU *  * 
55 'P5 *  *  *  *  *  *  *  *  * 
56 'P6 *  *  *  *  *  *  * +FU * 
57 'P7+FU+FU+FU+FU+FU+FU+FU * +FU
58 'P8 * +KA *  *  *  *  * +HI * 
59 'P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
60 '+
61 'summary:toryo:testsente@p1 lose:testgote@p2 win
62 EOF
63
64     log_content.gsub!(/^\$.*?\n/m, "")
65     log_content.gsub!(/^'\$.*?\n/m, "")
66     assert_equal(should_be, log_content)
67   end
68 end
69
70
71 class TestComment < BaseClient
72   def test_toryo
73     result, result2 = handshake do
74       cmd  "%TORYO"
75     end
76     assert(/#LOSE/ =~ result)
77     assert(/#WIN/  =~ result2)
78   end
79
80   def test_inline_comment
81     result, result2 = handshake do
82       cmd "+2625FU,'comment"
83       cmd2 "-2233KA"
84       cmd  "%TORYO"
85     end
86     assert(/#LOSE/ =~ result)
87     assert(/#WIN/  =~ result2)
88   end
89
90   def test_inline_comment_ja_euc
91     result, result2 = handshake do
92       cmd "+2625FU,'\93ú\96{\8cêEUC"
93       cmd2 "-2233KA"
94       cmd  "%TORYO"
95     end
96     assert(/#LOSE/ =~ result)
97     assert(/#WIN/  =~ result2)
98   end
99
100   def test_inline_comment_ja_utf8
101     result, result2 = handshake do
102       cmd "+2625FU,'\93ú\96{\8cêUTF8".toutf8
103       cmd2 "-2233KA"
104       cmd  "%TORYO"
105     end
106     assert(/#LOSE/ =~ result)
107     assert(/#WIN/  =~ result2)
108   end
109 end
110
111
112 class TestWhiteMovesBlack < BaseClient
113   def test_white_moves_black
114     result, result2 = handshake do
115       cmd  "+9796FU"
116       cmd2 "+1716FU"
117       sleep 0.5
118     end
119     assert(/#ILLEGAL_MOVE/ =~ result)
120     assert(/#WIN/  =~ result)
121     assert(/#ILLEGAL_MOVE/ =~ result2)
122     assert(/#LOSE/ =~ result2)
123   end
124 end
125
126
127 class CSABaseClient < BaseClient
128   ##
129   # In CSA mode, the server decides sente or gote at random; and sockets are closed
130   # just after the game ends (i.e. %TORYO is sent)
131   # 
132   def handshake
133     login
134
135     sleep 0.5 # wait for game matching
136
137     str  = cmd  "AGREE"
138     str2 = cmd2 "AGREE"
139
140     if /Your_Turn:\+/ =~ str
141       @sente = "cmd"
142       @sente_socket = @socket1
143       @gote  = "cmd2"
144       @gote_socket  = @socket2
145     else
146       @sente = "cmd2"
147       @sente_socket = @socket2
148       @gote  = "cmd"
149       @gote_socket  = @socket1
150     end
151
152     yield if block_given?
153     
154     result  = read_nonblock(@sente_socket)
155     result2 = read_nonblock(@gote_socket)
156     [result, result2]
157   end
158
159   def sente_cmd(str)
160     eval "#{@sente} \"#{str}\""
161   end
162
163   def gote_cmd(str)
164     eval "#{@gote} \"#{str}\""
165   end
166 end
167
168 class TestLoginCSAWithoutTripGoodGamename < CSABaseClient
169   def login
170     cmd  "LOGIN wo_trip_p1 testcase-1500-0"
171     cmd2 "LOGIN wo_trip_p2 testcase-1500-0"
172   end
173
174   def test_toryo
175     result, result2 = handshake do
176       sente_cmd("%TORYO")
177     end
178     assert(/#LOSE/ =~ result)
179     assert(/#WIN/  =~ result2)
180   end
181 end
182
183 class TestLoginCSAWithTripGoodGamename < CSABaseClient
184   def login
185     cmd  "LOGIN w_trip_p1 testcase-1500-0,atrip"
186     cmd2 "LOGIN w_trip_p2 testcase-1500-0,anothertrip"
187   end
188
189   def test_toryo
190     result, result2 = handshake do
191       sente_cmd "%TORYO"
192       sleep 0.5
193     end
194     assert(/#LOSE/ =~ result)
195     assert(/#WIN/  =~ result2)
196   end
197 end
198
199 class TestChallenge < CSABaseClient
200   def login
201     cmd  "LOGIN w_trip_p1 testcase-1500-0,atrip"
202     cmd2 "LOGIN w_trip_p2 testcase-1500-0,anothertrip"
203   end
204
205   def test_toryo
206     result, result2 = handshake do
207       sente_cmd "CHALLENGE"
208       gote_cmd  "CHALLENGE"
209     end
210     assert_match(/CHALLENGE ACCEPTED/, result)
211     assert_match(/CHALLENGE ACCEPTED/, result2)
212   end
213 end
214
215 class TestFloodgateGame < BaseClient
216   def login
217     classname = self.class.name
218     gamename  = "floodgate-900-0"
219     cmd "LOGIN sente#{classname} dummy x1"
220     cmd "%%GAME #{gamename} *"
221     
222     cmd2 "LOGIN gote#{classname} dummy2 x1"
223     cmd2 "%%GAME #{gamename} *"
224   end
225
226   def test_game_wait
227     login
228     assert(true)
229   end
230 end
231
232 class TestFloodgateGameWrongTebam < BaseClient
233   def login
234     classname = self.class.name
235     gamename  = "floodgate-900-0"
236     cmd "LOGIN sente#{classname} dummy x1"
237     cmd("%%GAME #{gamename} +")
238   end
239
240   def test_game_wait
241     login
242     sleep 1
243     reply = read_nonblock(@socket1)
244     assert_match(/##\[ERROR\] You are not allowed/m, reply)
245   end
246 end
247
248 class TestDuplicatedMoves < BaseClient
249   def test_defer
250     result, result2 = handshake do
251       cmd  "+7776FU"
252       cmd  "+8786FU" # defer
253       cmd  "+9796FU" # defer
254       cmd2 "-7374FU"
255       cmd2 "-8384FU"
256       cmd2 "%TORYO" # defer
257       sleep 1
258     end
259     assert(/#WIN/  =~ result)
260     assert(/#LOSE/ =~ result2)
261   end
262
263   def test_defer2
264     result, result2 = handshake do
265       cmd  "+7776FU"
266       cmd  "+8786FU" # defer
267       cmd  "%TORYO" # defer
268       cmd2 "-7374FU"
269       cmd2 "-8384FU"
270       sleep 1
271     end
272     assert(/#LOSE/  =~ result)
273     assert(/#WIN/ =~ result2)
274   end
275
276   def test_defer3
277     result, result2 = handshake do
278       cmd  "+7776FU"
279       cmd  "+8786FU" # defer
280       cmd2 "-7374FU"
281       cmd2 "-8384FU"
282       cmd  "%TORYO" # defer
283       sleep 1
284     end
285     assert(/#LOSE/  =~ result)
286     assert(/#WIN/ =~ result2)
287   end
288 end
289
290 class TestFunctionalChatCommand < BaseClient
291   def test_chat
292     cmd "%%CHAT Hello"
293     sleep 1
294     str = read_nonblock(@socket2)
295     puts str   
296     assert("", str)
297   end
298 end
299
300 class TestTwoSameMoves < CSABaseClient
301   def test_two_same_moves
302     result, result2 = handshake do
303       cmd  "+7776FU"
304       cmd2 "-3334FU"
305       cmd2 "-3334FU"
306       cmd  "+2726FU"
307       sleep 1
308     end
309     assert(/#ILLEGAL_MOVE/ !~ result)
310     assert(/#ILLEGAL_MOVE/ !~ result2)
311   end
312 end