OSDN Git Service

Changed the directory name
[shogi-server/shogi-server.git] / test / test_board.rb
1 ## $Id$
2
3 $:.unshift File.join(File.dirname(__FILE__), "..", "shogi-server")
4 load    'shogi-server'
5 require 'test/unit'
6
7 module ShogiServer
8 class Board
9   def set_from_str(strs)
10     strs.split(/\n/).each do |str|
11       if (str =~ /^P\d/)
12         str.sub!(/^P(.)/, '')
13         y = $1.to_i
14         x = 9
15         while (str.length > 2)
16           str.sub!(/^(...?)/, '')
17           one = $1
18           if (one =~ /^([\+\-])(..)/)
19             sg = $1
20             name = $2
21             if (sg == "+")
22               sente = true
23             else
24               sente = false
25             end
26             if ((x < 1) || (9 < x) || (y < 1) || (9 < y))
27               raise "bad position #{x} #{y}"
28             end
29             case (name)
30             when "FU"
31               PieceFU::new(self, x, y, sente)
32             when "KY"
33               PieceKY::new(self, x, y, sente)
34             when "KE"
35               PieceKE::new(self, x, y, sente)
36             when "GI"
37               PieceGI::new(self, x, y, sente)
38             when "KI"
39               PieceKI::new(self, x, y, sente)
40             when "OU"
41               PieceOU::new(self, x, y, sente)
42             when "KA"
43               PieceKA::new(self, x, y, sente)
44             when "HI"
45               PieceHI::new(self, x, y, sente)
46             when "TO"
47               PieceFU::new(self, x, y, sente, true)
48             when "NY"
49               PieceKY::new(self, x, y, sente, true)
50             when "NK"
51               PieceKE::new(self, x, y, sente, true)
52             when "NG"
53               PieceGI::new(self, x, y, sente, true)
54             when "UM"
55               PieceKA::new(self, x, y, sente, true)
56             when "RY"
57               PieceHI::new(self, x, y, sente, true)
58             else
59               raise "unkown piece #{name}"
60             end
61           end
62           x = x - 1
63         end
64       elsif (str =~ /^P([\+\-])/)
65         sg = $1
66         if (sg == "+")
67           sente = true
68         else
69           sente = false
70         end
71         str.sub!(/^../, '')
72         while (str.length > 3)
73           str.sub!(/^..(..)/, '')
74           name = $1
75           case (name)
76           when "FU"
77             PieceFU::new(self, 0, 0, sente)
78           when "KY"
79             PieceKY::new(self, 0, 0, sente)
80           when "KE"
81             PieceKE::new(self, 0, 0, sente)
82           when "GI"
83             PieceGI::new(self, 0, 0, sente)
84           when "KI"
85             PieceKI::new(self, 0, 0, sente)
86           when "KA"
87             PieceKA::new(self, 0, 0, sente)
88           when "HI"
89             PieceHI::new(self, 0, 0, sente)
90           else
91             raise "unkown piece #{name}"
92           end
93         end
94       end
95     end
96   end
97 end
98 end
99
100 class Test_kachi < Test::Unit::TestCase
101   def test_kachi_good
102     b = ShogiServer::Board.new
103     b.set_from_str(<<EOM)
104 P1+HI+HI+KA+KA+OU *  *  *  * 
105 P2+FU+FU+FU+FU+FU+FU *  *  * 
106 P+00FU00FU
107 EOM
108     assert_equal(true, b.good_kachi?(true))
109
110     b = ShogiServer::Board.new
111     b.set_from_str(<<EOM)
112 P8-HI-HI-KA-KA-OU *  *  *  * 
113 P9-FU-FU-FU-FU-FU-FU *  *  * 
114 P-00FU
115 EOM
116     assert_equal(true, b.good_kachi?(false))
117   end
118
119   def test_kachi_good
120     b = ShogiServer::Board.new
121     b.set_from_str(<<EOM)
122 P1+HI+HI+KA+KA+OU *  *  *  * 
123 P2+FU+FU+FU+FU+FU+FU *  *  * 
124 P+00FU00FU
125 EOM
126     assert_equal(true, b.good_kachi?(true))
127
128     b = ShogiServer::Board.new
129     b.set_from_str(<<EOM)
130 P8-HI-HI-KA-KA-OU *  *  *  * 
131 P9-FU-FU-FU-FU-FU-FU *  *  * 
132 P-00FU
133 EOM
134     assert_equal(true, b.good_kachi?(false))
135   end
136
137   def test_kachi_bad
138     b = ShogiServer::Board.new
139     b.set_from_str(<<EOM)
140 P1+HI+HI+KA+KA+OU *  *  *  * 
141 P2+FU+FU+FU+FU+FU+FU *  *  * 
142 P+00FU
143 EOM
144     assert_equal(false, b.good_kachi?(true)) # point is not enough
145
146     b = ShogiServer::Board.new
147     b.set_from_str(<<EOM)
148 P8-HI-HI-KA-KA-OU *  *  *  * 
149 P9-FU-FU-FU-FU-FU-FU *  *  * 
150 EOM
151     assert_equal(false, b.good_kachi?(false)) # point is not enough
152
153     b = ShogiServer::Board.new
154     b.set_from_str(<<EOM)
155 P1+HI+HI+KA+KA+OU *  *  *  * 
156 P2+FU+FU+FU+FU+FU *  *  *  *
157 P+00FU00FU00FU
158 EOM
159     assert_equal(false, b.good_kachi?(true)) # number on board is not enough
160
161     b = ShogiServer::Board.new
162     b.set_from_str(<<EOM)
163 P8-HI-HI-KA-KA-OU *  *  *  * 
164 P9-FU-FU-FU-FU-FU *  *  *  * 
165 P-00FU00FU
166 EOM
167     assert_equal(false, b.good_kachi?(false)) # number on board is not enough
168
169     b = ShogiServer::Board.new
170     b.set_from_str(<<EOM)
171 P1+HI+HI+KA+KA+OU *  *  * -HI
172 P2+FU+FU+FU+FU+FU+FU *  *  * 
173 P+00FU00FU
174 EOM
175     assert_equal(false, b.good_kachi?(true)) # checkmate
176
177     b = ShogiServer::Board.new
178     b.set_from_str(<<EOM)
179 P8-HI-HI-KA-KA-OU *  *  * +HI
180 P9-FU-FU-FU-FU-FU-FU *  *  * 
181 P-00FU
182 EOM
183     assert_equal(false, b.good_kachi?(false)) # checkmate
184
185     b = ShogiServer::Board.new
186     b.set_from_str(<<EOM)
187 P1+TO+TO * +TO+TO+OU * +TO * 
188 P2 *  *  *  *  *  *  *  * +KI
189 P3 *  *  * +TO+NG+TO+TO+TO+NY
190 P4 *  *  *  *  *  *  *  *  * 
191 P5 *  *  *  *  *  *  *  * +UM
192 P6 *  *  * -KI-NG-RY *  *  * 
193 P7-TO * -TO-NG * -TO-TO-TO * 
194 P8-RY *  * -NK-TO-OU-TO-TO * 
195 P9 * -TO *  *  *  *  *  *  * 
196 P+00KI00KI00KE
197 P-00KA00GI00KE00KE00KY00KY00KY
198 -
199 EOM
200     assert_equal(true, b.good_kachi?(false))
201   end
202 end
203
204 class Test_gps < Test::Unit::TestCase
205   def test_gote_promote
206     b = ShogiServer::Board.new
207     b.set_from_str(<<EOM)
208 P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
209 P2 * -HI *  *  *  *  *  *  * 
210 P3-FU * -FU-FU-FU-FU-KA-FU-FU
211 P4 *  *  *  *  *  *  *  *  * 
212 P5 * -FU+FU *  *  *  *  *  * 
213 P6 *  *  *  *  *  *  *  *  * 
214 P7+FU+FU+KE+FU+FU+FU+FU+FU+FU
215 P8 *  *  *  *  *  *  * +HI * 
216 P9+KY * +GI+KI+OU+KI+GI+KE+KY
217 P+00FU
218 P-00KA
219 EOM
220     assert_equal(:normal, b.handle_one_move("-3377UM"))
221   end
222
223   def test_capture_promoted_and_put
224     b = ShogiServer::Board.new
225     b.set_from_str(<<EOM)
226 P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
227 P2 * -HI *  *  *  *  * -KA * 
228 P3-FU-FU-FU-FU-FU-FU-FU-FU-FU
229 P4 *  *  *  *  *  *  *  *  * 
230 P5 *  *  *  *  *  *  *  *  * 
231 P6 *  *  *  *  *  *  *  *  * 
232 P7+FU+FU+FU+FU+FU+FU+FU+FU+FU
233 P8 * +KA *  *  *  *  * +HI * 
234 P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
235 EOM
236
237     assert_equal(:normal, b.handle_one_move("+7776FU"))
238     assert_equal(:normal, b.handle_one_move("-3334FU"))
239     assert_equal(:normal, b.handle_one_move("+2726FU"))
240     assert_equal(:normal, b.handle_one_move("-4344FU"))
241     assert_equal(:normal, b.handle_one_move("+3948GI"))
242     assert_equal(:normal, b.handle_one_move("-8242HI"))
243     assert_equal(:normal, b.handle_one_move("+5756FU"))
244     assert_equal(:normal, b.handle_one_move("-3132GI"))
245     assert_equal(:normal, b.handle_one_move("+5968OU"))
246     assert_equal(:normal, b.handle_one_move("-5162OU"))
247     assert_equal(:normal, b.handle_one_move("+6878OU"))
248     assert_equal(:normal, b.handle_one_move("-6272OU"))
249     assert_equal(:normal, b.handle_one_move("+4958KI"))
250     assert_equal(:normal, b.handle_one_move("-7282OU"))
251     assert_equal(:normal, b.handle_one_move("+9796FU"))
252     assert_equal(:normal, b.handle_one_move("-9394FU"))
253     assert_equal(:normal, b.handle_one_move("+2625FU"))
254     assert_equal(:normal, b.handle_one_move("-2233KA"))
255     assert_equal(:normal, b.handle_one_move("+3736FU"))
256     assert_equal(:normal, b.handle_one_move("-7172GI"))
257     assert_equal(:normal, b.handle_one_move("+7968GI"))
258     assert_equal(:normal, b.handle_one_move("-4152KI"))
259     assert_equal(:normal, b.handle_one_move("+6857GI"))
260     assert_equal(:normal, b.handle_one_move("-3243GI"))
261     assert_equal(:normal, b.handle_one_move("+6968KI"))
262     assert_equal(:normal, b.handle_one_move("-5354FU"))
263     assert_equal(:normal, b.handle_one_move("+1716FU"))
264     assert_equal(:normal, b.handle_one_move("-1314FU"))
265     assert_equal(:normal, b.handle_one_move("+4746FU"))
266     assert_equal(:normal, b.handle_one_move("-6364FU"))
267     assert_equal(:normal, b.handle_one_move("+4645FU"))
268     assert_equal(:normal, b.handle_one_move("-5263KI"))
269     assert_equal(:normal, b.handle_one_move("+2937KE"))
270     assert_equal(:normal, b.handle_one_move("-7374FU"))
271     assert_equal(:normal, b.handle_one_move("+2524FU"))
272     assert_equal(:normal, b.handle_one_move("-2324FU"))
273     assert_equal(:normal, b.handle_one_move("+4544FU"))
274     assert_equal(:normal, b.handle_one_move("-4344GI"))
275     assert_equal(:normal, b.handle_one_move("+0045FU"))
276     assert_equal(:normal, b.handle_one_move("-4445GI"))
277     assert_equal(:normal, b.handle_one_move("+8833UM"))
278     assert_equal(:normal, b.handle_one_move("-2133KE"))
279     assert_equal(:normal, b.handle_one_move("+0088KA"))
280     assert_equal(:normal, b.handle_one_move("-5455FU"))
281     assert_equal(:normal, b.handle_one_move("+8855KA"))
282     assert_equal(:normal, b.handle_one_move("-4243HI"))
283     assert_equal(:normal, b.handle_one_move("+2824HI"))
284     assert_equal(:normal, b.handle_one_move("-4554GI"))
285     assert_equal(:normal, b.handle_one_move("+0044FU"))
286     assert_equal(:normal, b.handle_one_move("-4353HI"))
287     assert_equal(:normal, b.handle_one_move("+2422RY"))
288     assert_equal(:normal, b.handle_one_move("-5455GI"))
289     assert_equal(:normal, b.handle_one_move("+5655FU"))
290     assert_equal(:normal, b.handle_one_move("-0056FU"))
291     assert_equal(:normal, b.handle_one_move("+5756GI"))
292     assert_equal(:normal, b.handle_one_move("-0057FU"))
293     assert_equal(:normal, b.handle_one_move("+4857GI"))
294     assert_equal(:normal, b.handle_one_move("-9495FU"))
295     assert_equal(:normal, b.handle_one_move("+9695FU"))
296     assert_equal(:normal, b.handle_one_move("-0096FU"))
297     assert_equal(:normal, b.handle_one_move("+9996KY"))
298     assert_equal(:normal, b.handle_one_move("-0085KA"))
299   end
300 end
301
302
303 class Test_promote < Test::Unit::TestCase
304   def test_fu
305     b = ShogiServer::Board.new
306     b.set_from_str(<<EOM)
307 P1-OU * +OU *
308 P2 *  *  *  *
309 P3+FU *  * +HI
310 P4 * +FU *  *
311 P5 *  * +FU *
312 EOM
313     assert_equal(:normal, b.handle_one_move("+9392TO"))
314     assert_equal(:normal, b.handle_one_move("+8483TO"))
315     assert_equal(:illegal, b.handle_one_move("+7574TO"))
316     assert_equal(:normal, b.handle_one_move("+6364RY"))
317   end
318 end
319
320 class Test_move < Test::Unit::TestCase
321   def test_fu
322     b = ShogiServer::Board.new
323     b.set_from_str(<<EOM)
324 P1-OU * +OU
325 P2 * +FU *
326 EOM
327     assert_equal(:illegal, b.handle_one_move("+8281FU"))
328   end
329   def test_hi
330     b = ShogiServer::Board.new
331     b.set_from_str(<<EOM)
332 P1-OU * +OU
333 P2 * +HI *
334 EOM
335     assert_equal(:normal, b.handle_one_move("+8212HI"))
336     assert_equal(:illegal, b.handle_one_move("+1223HI"))
337   end
338   def test_ry
339     b = ShogiServer::Board.new
340     b.set_from_str(<<EOM)
341 P1-OU * +OU
342 P2 * +RY *
343 EOM
344     assert_equal(:normal, b.handle_one_move("+8212RY"))
345     assert_equal(:normal, b.handle_one_move("+1223RY"))
346   end
347 end
348
349 class Test_put < Test::Unit::TestCase
350   def test_fu
351     b = ShogiServer::Board.new
352     b.set_from_str(<<EOM)
353 P1-OU * +OU
354 P+00FU00FU
355 EOM
356     assert_equal(:illegal, b.handle_one_move("+0011FU"))
357     assert_equal(:normal, b.handle_one_move("+0022FU"))
358   end
359   def test_ky
360      b = ShogiServer::Board.new
361      b.set_from_str(<<EOM)
362 P1-OU * +OU
363 P+00KY00KY
364 EOM
365     assert_equal(:illegal, b.handle_one_move("+0011KY"))
366     assert_equal(:normal, b.handle_one_move("+0022KY"))
367   end
368
369   def test_ke
370     b = ShogiServer::Board.new
371     b.set_from_str(<<EOM)
372 P1-OU * +OU
373 P+00KE00KE00KE
374 EOM
375     assert_equal(:illegal, b.handle_one_move("+0011KE"))
376     assert_equal(:illegal, b.handle_one_move("+0022KE"))
377     assert_equal(:normal, b.handle_one_move("+0033KE"))
378   end
379 end
380
381
382 class Test_2fu < Test::Unit::TestCase
383   def test_2fu
384     b = ShogiServer::Board.new
385     b.set_from_str(<<EOM)
386 P1-OU * +OU
387 P+00FU00FU
388 EOM
389     assert_equal(:normal, b.handle_one_move("+0022FU"))
390     assert_equal(:illegal, b.handle_one_move("+0023FU"))
391
392     b = ShogiServer::Board.new
393     b.set_from_str(<<EOM)
394 P1-OU * +OU
395 P+00FU00FU
396 EOM
397     assert_equal(:normal, b.handle_one_move("+0022FU"))
398     assert_equal(:normal, b.handle_one_move("+0032FU"))
399   end
400 end
401
402 class Test_sennichite < Test::Unit::TestCase
403   def test_oute_sennichite0
404     b = ShogiServer::Board.new
405     b.set_from_str(<<EOM)
406 P1-OU *  * +OU
407 P2 *  * +HI *
408 EOM
409 ##    b.history[b.to_s] = 1
410     assert_equal(:normal, b.handle_one_move("+7271HI")) #1
411     assert_equal(:normal, b.handle_one_move("-9192OU"))
412     assert_equal(:normal, b.handle_one_move("+7172HI"))
413     assert_equal(:normal, b.handle_one_move("-9291OU"))
414
415     assert_equal(:normal, b.handle_one_move("+7271HI")) # 2
416     assert_equal(:normal, b.handle_one_move("-9192OU"))
417     assert_equal(:normal, b.handle_one_move("+7172HI"))
418     assert_equal(:normal, b.handle_one_move("-9291OU"))
419
420     assert_equal(:normal, b.handle_one_move("+7271HI")) # 3
421     assert_equal(:normal, b.handle_one_move("-9192OU"))
422     assert_equal(:normal, b.handle_one_move("+7172HI"))
423     assert_equal(:normal, b.handle_one_move("-9291OU"))
424
425     assert_equal(:oute_sennichite_sente_lose, b.handle_one_move("+7271HI")) # 4
426   end
427
428   def test_oute_sennichite1 #330
429     b = ShogiServer::Board.new
430     b.set_from_str(<<EOM)
431 P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
432 P2 * -HI *  *  *  *  * -KA * 
433 P3-FU-FU-FU-FU-FU-FU-FU-FU-FU
434 P4 *  *  *  *  *  *  *  *  * 
435 P5 *  *  *  *  *  *  *  *  * 
436 P6 *  *  *  *  *  *  *  *  * 
437 P7+FU+FU+FU+FU+FU+FU+FU+FU+FU
438 P8 * +KA *  *  *  *  * +HI * 
439 P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
440 EOM
441 b.history[b.to_s] = 1
442
443     assert_equal(:normal, b.handle_one_move("+2726FU"))
444     assert_equal(:normal, b.handle_one_move("-8384FU"))
445     assert_equal(:normal, b.handle_one_move("+2625FU"))
446     assert_equal(:normal, b.handle_one_move("-8485FU"))
447     assert_equal(:normal, b.handle_one_move("+6978KI"))
448     assert_equal(:normal, b.handle_one_move("-4132KI"))
449     assert_equal(:normal, b.handle_one_move("+2524FU"))
450     assert_equal(:normal, b.handle_one_move("-2324FU"))
451     assert_equal(:normal, b.handle_one_move("+2824HI"))
452     assert_equal(:normal, b.handle_one_move("-0023FU"))
453     assert_equal(:normal, b.handle_one_move("+2484HI"))
454     assert_equal(:normal, b.handle_one_move("-8284HI"))
455     assert_equal(:normal, b.handle_one_move("+4938KI"))
456     assert_equal(:normal, b.handle_one_move("-9394FU"))
457     assert_equal(:normal, b.handle_one_move("+5969OU"))
458     assert_equal(:normal, b.handle_one_move("-0049HI"))
459
460     assert_equal(:normal, b.handle_one_move("+6968OU"))
461     assert_equal(:normal, b.handle_one_move("-4948RY"))
462     assert_equal(:normal, b.handle_one_move("+6869OU"))
463     assert_equal(:normal, b.handle_one_move("-4849RY"))
464
465     assert_equal(:normal, b.handle_one_move("+6968OU"))
466     assert_equal(:normal, b.handle_one_move("-4948RY"))
467     assert_equal(:normal, b.handle_one_move("+6869OU"))
468     assert_equal(:normal, b.handle_one_move("-4849RY"))
469
470     assert_equal(:normal, b.handle_one_move("+6968OU"))
471     assert_equal(:normal, b.handle_one_move("-4948RY"))
472     assert_equal(:normal, b.handle_one_move("+6869OU"))
473     assert_equal(:normal, b.handle_one_move("-4849RY"))
474
475     assert_equal(:normal, b.handle_one_move("+6968OU")) # added
476     assert_equal(:oute_sennichite_gote_lose, b.handle_one_move("-4948RY"))
477   end
478
479   def test_not_oute_sennichite
480     b = ShogiServer::Board.new
481     b.set_from_str(<<EOM)
482 P1-OU *  * +OU
483 P2 *  * +HI *
484 EOM
485 ##    b.history[b.to_s] = 1
486     assert_equal(:normal, b.handle_one_move("+7271HI")) #1
487     assert_equal(:normal, b.handle_one_move("-9192OU"))
488     assert_equal(:normal, b.handle_one_move("+7172HI"))
489     assert_equal(:normal, b.handle_one_move("-9291OU"))
490
491     assert_equal(:normal, b.handle_one_move("+7271HI")) # 2
492     assert_equal(:normal, b.handle_one_move("-9192OU"))
493     assert_equal(:normal, b.handle_one_move("+7174HI")) # stop oute here
494     assert_equal(:normal, b.handle_one_move("-9291OU"))
495
496     assert_equal(:normal, b.handle_one_move("+7471HI")) # 3
497     assert_equal(:normal, b.handle_one_move("-9192OU"))
498     assert_equal(:normal, b.handle_one_move("+7172HI"))
499     assert_equal(:normal, b.handle_one_move("-9291OU"))
500
501     assert_equal(:sennichite, b.handle_one_move("+7271HI")) # 4
502   end
503
504   def test_sennichite0
505     b = ShogiServer::Board.new
506     b.set_from_str(<<EOM)
507 P1-OU * +OU
508 EOM
509     b.history[b.to_s] = 1
510     assert_equal(:normal, b.handle_one_move("+7172OU"))
511     assert_equal(:normal, b.handle_one_move("-9192OU"))
512     assert_equal(:normal, b.handle_one_move("+7271OU"))
513     assert_equal(:normal, b.handle_one_move("-9291OU")) # 2
514
515     assert_equal(:normal, b.handle_one_move("+7172OU"))
516     assert_equal(:normal, b.handle_one_move("-9192OU"))
517     assert_equal(:normal, b.handle_one_move("+7271OU"))
518     assert_equal(:normal, b.handle_one_move("-9291OU")) # 3
519
520     assert_equal(:normal, b.handle_one_move("+7172OU"))
521     assert_equal(:normal, b.handle_one_move("-9192OU"))
522     assert_equal(:normal, b.handle_one_move("+7271OU"))
523     assert_equal(:sennichite, b.handle_one_move("-9291OU")) # 4
524   end
525
526   def test_sennichite1          # 329
527     b = ShogiServer::Board.new
528     b.set_from_str(<<EOM)
529 P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
530 P2 * -HI *  *  *  *  * -KA * 
531 P3-FU-FU-FU-FU-FU-FU-FU-FU-FU
532 P4 *  *  *  *  *  *  *  *  * 
533 P5 *  *  *  *  *  *  *  *  * 
534 P6 *  *  *  *  *  *  *  *  * 
535 P7+FU+FU+FU+FU+FU+FU+FU+FU+FU
536 P8 * +KA *  *  *  *  * +HI * 
537 P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
538 EOM
539     b.history[b.to_s] = 1
540
541     assert_equal(:normal, b.handle_one_move("+2858HI"))
542     assert_equal(:normal, b.handle_one_move("-8252HI"))
543     assert_equal(:normal, b.handle_one_move("+5828HI"))
544     assert_equal(:normal, b.handle_one_move("-5282HI"))
545     assert_equal(:normal, b.handle_one_move("+2858HI"))
546     assert_equal(:normal, b.handle_one_move("-8252HI"))
547     assert_equal(:normal, b.handle_one_move("+5828HI"))
548     assert_equal(:normal, b.handle_one_move("-5282HI"))
549     assert_equal(:normal, b.handle_one_move("+2858HI"))
550     assert_equal(:normal, b.handle_one_move("-8252HI"))
551     assert_equal(:normal, b.handle_one_move("+5828HI"))
552     assert_equal(:sennichite, b.handle_one_move("-5282HI"))
553   end
554 end
555
556 class Test_checkmate < Test::Unit::TestCase
557   def test_ki
558     b = ShogiServer::Board.new
559     b.set_from_str(<<EOM)
560 P1-OU * +OU
561 P2 * +KI
562 EOM
563     assert_equal(true, b.checkmated?(false)) # gote is loosing
564     assert_equal(false, b.checkmated?(true))
565   end
566
567   def test_hi
568     b = ShogiServer::Board.new
569     b.set_from_str(<<EOM)
570 P1-OU * +HI+OU
571 EOM
572     assert_equal(true, b.checkmated?(false)) # gote is loosing
573     assert_equal(false, b.checkmated?(true))
574
575     b = ShogiServer::Board.new
576     b.set_from_str(<<EOM)
577 P1-OU * 
578 P2 * +HI+OU
579 EOM
580     assert_equal(false, b.checkmated?(false)) # hisha can't capture
581     assert_equal(false, b.checkmated?(true))
582
583     b = ShogiServer::Board.new
584     b.set_from_str(<<EOM)
585 P1-OU * 
586 P2 * +RY+OU
587 EOM
588     assert_equal(true, b.checkmated?(false)) # ryu can capture
589     assert_equal(false, b.checkmated?(true))
590   end
591
592   def test_KE
593     b = ShogiServer::Board.new
594     b.set_from_str(<<EOM)
595 P1-OU * +OU
596 P2 *  *  *
597 P3 * +KE *
598 EOM
599     assert_equal(true, b.checkmated?(false))
600     assert_equal(false, b.checkmated?(true))
601   end
602 end
603
604 class Test_uchifuzume < Test::Unit::TestCase
605   def test_uchifuzume1          # 331
606     b = ShogiServer::Board.new
607     b.set_from_str(<<EOM)
608 P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
609 P2 * -HI *  *  *  *  * -KA * 
610 P3-FU-FU-FU-FU-FU-FU-FU-FU-FU
611 P4 *  *  *  *  *  *  *  *  * 
612 P5 *  *  *  *  *  *  *  *  * 
613 P6 *  *  *  *  *  *  *  *  * 
614 P7+FU+FU+FU+FU+FU+FU+FU+FU+FU
615 P8 * +KA *  *  *  *  * +HI * 
616 P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
617 EOM
618
619     assert_equal(:normal, b.handle_one_move("+2726FU"))
620     assert_equal(:normal, b.handle_one_move("-8384FU"))
621     assert_equal(:normal, b.handle_one_move("+2625FU"))
622     assert_equal(:normal, b.handle_one_move("-8485FU"))
623     assert_equal(:normal, b.handle_one_move("+2524FU"))
624     assert_equal(:normal, b.handle_one_move("-2324FU"))
625     assert_equal(:normal, b.handle_one_move("+2824HI"))
626     assert_equal(:normal, b.handle_one_move("-8586FU"))
627     assert_equal(:normal, b.handle_one_move("+8786FU"))
628     assert_equal(:normal, b.handle_one_move("-0087FU"))
629     assert_equal(:normal, b.handle_one_move("+0023FU"))
630     assert_equal(:normal, b.handle_one_move("-8788TO"))
631     assert_equal(:normal, b.handle_one_move("+2322TO"))
632     assert_equal(:normal, b.handle_one_move("-8879TO"))
633     assert_equal(:normal, b.handle_one_move("+2231TO"))
634     assert_equal(:normal, b.handle_one_move("-7969TO"))
635     assert_equal(:normal, b.handle_one_move("+5969OU"))
636     assert_equal(:normal, b.handle_one_move("-8286HI"))
637     assert_equal(:normal, b.handle_one_move("+3141TO"))
638     assert_equal(:normal, b.handle_one_move("-5141OU"))
639     assert_equal(:normal, b.handle_one_move("+2484HI"))
640     assert_equal(:normal, b.handle_one_move("-8684HI"))
641     assert_equal(:normal, b.handle_one_move("+6978OU"))
642     assert_equal(:normal, b.handle_one_move("-8424HI"))
643     assert_equal(:normal, b.handle_one_move("+7776FU"))
644     assert_equal(:normal, b.handle_one_move("-7374FU"))
645     assert_equal(:normal, b.handle_one_move("+7675FU"))
646     assert_equal(:normal, b.handle_one_move("-7475FU"))
647     assert_equal(:normal, b.handle_one_move("+0079KI"))
648     assert_equal(:normal, b.handle_one_move("-7576FU"))
649     assert_equal(:normal, b.handle_one_move("+7888OU"))
650     assert_equal(:normal, b.handle_one_move("-7677TO"))
651     assert_equal(:normal, b.handle_one_move("+8877OU"))
652     assert_equal(:normal, b.handle_one_move("-2474HI"))
653     assert_equal(:normal, b.handle_one_move("+7788OU"))
654     assert_equal(:normal, b.handle_one_move("-0086KI"))
655     assert_equal(:normal, b.handle_one_move("+9998KY"))
656     assert_equal(:normal, b.handle_one_move("-7424HI"))
657     assert_equal(:normal, b.handle_one_move("+0099GI"))
658     assert_equal(:normal, b.handle_one_move("-0028HI"))
659     assert_equal(:normal, b.handle_one_move("+0078FU"))
660     assert_equal(:uchifuzume, b.handle_one_move("-0087FU"))
661   end
662
663   def test_uchifuzume2
664     # http://wdoor.c.u-tokyo.ac.jp/shogi/tools/view/index.cgi?go_last=on&csa=http%3A%2F%2Fwdoor.c.u-tokyo.ac.jp%2Fshogi%2Flogs%2FLATEST%2Fwdoor%2Bfloodgate-900-0%2Busapyon-on-note%2BKShogi900%2B20080217020012.csa
665     b = ShogiServer::Board.new
666     b.set_from_str(<<EOM)
667 P1-KY-KE * -KI * -OU * -KE-KY
668 P2 *  * +TO *  *  *  *  *  *
669 P3 *  *  *  * -KI-KI * -FU *
670 P4 *  * -FU * -FU-FU-FU *  *
671 P5 * -RY+GI+OU *  *  * +FU+FU
672 P6-FU * +FU+KI+GI+FU+FU * +KY
673 P7 *  *  * -RY *  *  *  *  *
674 P8 *  *  *  *  *  *  *  *  *
675 P9+KY+KE *  *  *  *  *  *  *
676 P+00FU00FU00FU00FU00FU00GI00GI00KA00KE
677 P-00FU00KA
678 -
679 EOM
680     assert_equal(:uchifuzume, b.handle_one_move("-0064FU"))
681   end
682
683   def test_uchifuzume3
684     # http://wdoor.c.u-tokyo.ac.jp/shogi/tools/view/index.cgi?go_last=on&csa=http%3A%2F%2Fwdoor.c.u-tokyo.ac.jp%2Fshogi%2Flogs%2FLATEST%2Fwdoor%2Bfloodgate-900-0%2Busapyon-on-note%2Bgps_normal%2B20080215133008.csa
685     b = ShogiServer::Board.new
686     b.set_from_str(<<EOM)
687 P1 * -GI * -KI-OU * -GI * -KY
688 P2 *  *  *  * -FU *  *  *  *
689 P3+OU * -FU-FU * -FU-KI-FU *
690 P4+KI+KE-RY * -GI *  *  * -FU
691 P5 *  *  *  *  *  *  *  *  *
692 P6+FU *  *  * +KY *  *  * +FU
693 P7 * +FU *  * +FU *  *  *  *
694 P8 * +GI *  *  *  *  *  *  *
695 P9+KY+KE *  *  *  *  *  * -UM
696 P+00KA00KI00KE00KY00FU00FU00FU
697 P-00HI00KE00FU00FU00FU00FU00FU
698 -
699 EOM
700     assert_equal(:normal, b.handle_one_move("-0092FU"))
701   end
702
703   def test_ou
704     b = ShogiServer::Board.new
705     b.set_from_str(<<EOM)
706 P1-OU * +OU
707 P2+FU *  *
708 P3 * +HI *
709 EOM
710     assert_equal(false, b.uchifuzume?(true))
711
712     b = ShogiServer::Board.new
713     b.set_from_str(<<EOM)
714 P1-OU * +OU
715 P2+FU *  *
716 P3 * +RY *
717 EOM
718     assert_equal(true, b.uchifuzume?(true))
719
720     b = ShogiServer::Board.new
721     b.set_from_str(<<EOM)
722 P2-OU * +OU
723 P3+FU *  *
724 P4 * +RY *
725 EOM
726     assert_equal(false, b.uchifuzume?(true)) # ou can move backward
727
728     b = ShogiServer::Board.new
729     b.set_from_str(<<EOM)
730 P2-OU * +OU
731 P3+FU * +KA
732 P4 * +RY *
733 EOM
734     assert_equal(true, b.uchifuzume?(true)) # ou can move backward and kaku can capture it
735  end                   
736
737
738   def test_friend
739     b = ShogiServer::Board.new
740     b.set_from_str(<<EOM)
741 P1-OU * +OU
742 P2+FU * -HI
743 P3 * +RY *
744 EOM
745     assert_equal(false, b.uchifuzume?(true))
746
747     b = ShogiServer::Board.new
748     b.set_from_str(<<EOM)
749 P1-OU * +OU
750 P2+FU * +FU-HI
751 P3 * +RY *
752 EOM
753     assert_equal(true, b.uchifuzume?(true)) # hisha blocked by fu
754
755     b = ShogiServer::Board.new
756     b.set_from_str(<<EOM)
757 P1-OU * +OU
758 P2+FU *  *
759 P3-GI+RY *
760 EOM
761     assert_equal(true, b.uchifuzume?(true))
762
763     b = ShogiServer::Board.new
764     b.set_from_str(<<EOM)
765 P1-OU * +OU
766 P2+FU *  *
767 P3-KI+RY *
768 EOM
769     assert_equal(false, b.uchifuzume?(true))
770
771     b = ShogiServer::Board.new
772     b.set_from_str(<<EOM)
773 P1-OU * +OU
774 P2+FU *  *
775 P3-NG+RY *
776 EOM
777     assert_equal(false, b.uchifuzume?(true))
778  end
779 end