OSDN Git Service

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