Fix bug in silver and gold validation.
[kaya.git] / test / games / shogi / test_shogi_validation.rb
blob5b9da7c23039b4626168b23962984f75caa85505
1 require 'test/unit'
2 require 'games/all'
3 require 'helpers/validation_helper'
5 class TestShogiValidation < Test::Unit::TestCase
6   include ValidationHelper
7   
8   def setup
9     @game = Game.get(:shogi)
10     @state = @game.state.new
11     @state.setup
12     
13     @validate = @game.validator.new(@state)
14     @board = @state.board
15   end
16   
17   def test_invalid_move
18     assert_not_valid 32, 3, 3, 1
19     assert_not_valid 3, 1, 32, 3
20     assert_not_valid 4, 7, 4, 7
21   end
22   
23   def test_black_pawn_push
24     assert_valid 4, 6, 4, 5
25   end
27   def test_white_pawn_push
28     @state.turn = :white
29     assert_valid 4, 2, 4, 3
30   end
32   def test_invalid_black_push
33     assert_not_valid 4, 6, 4, 4
34     assert_not_valid 4, 6, 4, 3
35   end
36   
37   
38   def test_pawn_capture
39     @board[Point.new(3, 5)] = @board[Point.new(3, 2)]
40     assert_valid 3, 6, 3, 5
41   end
42   
43   def test_invalid_chesslike_capture
44     @board[Point.new(3, 5)] = @board[Point.new(3, 2)]
45     assert_not_valid 4, 6, 3, 5
46   end
47   
48   def test_lance_move
49     @board[Point.new(0, 6)] = nil
50     @board[Point.new(1, 7)] = nil
51     @board[Point.new(1, 8)] = nil
52     
53     assert_valid 0, 8, 0, 4
54     assert_valid 0, 8, 0, 2
55     assert_not_valid 0, 8, 0, 1
56     assert_not_valid 0, 8, 0, 0
57     
58     assert_not_valid 0, 8, 1, 8
59     assert_not_valid 0, 8, 1, 7
60   end
61   
62   def test_horse_move
63     @board[Point.new(0, 6)] = nil
64     
65     assert_valid 1, 8, 0, 6
66     assert_not_valid 1, 8, 2, 6
67     assert_not_valid 1, 8, 3, 7
68     
69     @board[Point.new(0, 6)] = Chess::Piece.new(:white, :bishop)
70     
71     assert_valid 1, 8, 0, 6
72   end
73   
74   def test_white_silver_move
75     @board[Point.new(4, 4)] = Chess::Piece.new(:white, :silver)
76     @state.turn = :white
77     
78     assert_valid 4, 4, 5, 3
79     assert_valid 4, 4, 3, 3
80     assert_valid 4, 4, 3, 5
81     assert_valid 4, 4, 4, 5
82     assert_valid 4, 4, 5, 5
83     
84     assert_not_valid 4, 4, 4, 3
85     assert_not_valid 4, 4, 3, 4
86     assert_not_valid 4, 4, 5, 4
87     
88     @board[Point.new(5, 3)] = Chess::Piece.new(:black, :rook)
89     assert_valid 4, 4, 5, 3
90   end
91   
92   def test_silver_move
93     @board[Point.new(4, 4)] = Chess::Piece.new(:black, :silver)
94     assert_valid 4, 4, 5, 5
95     assert_valid 4, 4, 3, 5
96     assert_valid 4, 4, 3, 3
97     assert_valid 4, 4, 4, 3
98     assert_valid 4, 4, 5, 3
99     
100     assert_not_valid 4, 4, 4, 5
101     assert_not_valid 4, 4, 3, 4
102     assert_not_valid 4, 4, 5, 4
103     assert_not_valid 4, 4, 2, 3
104     
105     @board[Point.new(3, 5)] = Chess::Piece.new(:white, :rook)
106     assert_valid 4, 4, 3, 5
107   end
108   
109   def test_gold_move
110     @board[Point.new(4, 4)] = Chess::Piece.new(:black, :gold)
111     
112     assert_valid 4, 4, 4, 5
113     assert_valid 4, 4, 3, 4
114     assert_valid 4, 4, 5, 4
115     assert_valid 4, 4, 3, 3
116     assert_valid 4, 4, 4, 3
117     assert_valid 4, 4, 5, 3
118     
119     assert_not_valid 4, 4, 5, 5
120     assert_not_valid 4, 4, 3, 5
121     assert_not_valid 4, 4, 2, 3
122     
123     @board[Point.new(4, 5)] = Chess::Piece.new(:white, :rook)
124     assert_valid 4, 4, 4, 5
125   end
126   
127   def test_white_gold_move
128     @board[Point.new(4, 4)] = Chess::Piece.new(:white, :gold)
129     @state.turn = :white
130     
131     assert_valid 4, 4, 4, 3
132     assert_valid 4, 4, 3, 4
133     assert_valid 4, 4, 5, 4
134     assert_valid 4, 4, 3, 5
135     assert_valid 4, 4, 4, 5
136     assert_valid 4, 4, 5, 5
137     
138     assert_not_valid 4, 4, 5, 3
139     assert_not_valid 4, 4, 3, 3
140     
141     @board[Point.new(4, 3)] = Chess::Piece.new(:black, :rook)
142     assert_valid 4, 4, 4, 3
143   end
144   
145   def test_king_move
146     @board[Point.new(4, 4)] = Chess::Piece.new(:black, :king)
147     
148     assert_valid 4, 4, 5, 4
149     assert_valid 4, 4, 5, 5
150     assert_valid 4, 4, 4, 5
151     assert_valid 4, 4, 3, 5
152     
153     assert_not_valid 4, 4, 3, 6
154     assert_not_valid 4, 4, 2, 2
155     assert_not_valid 4, 4, 4, 4
156   end
157   
158   def test_bishop_move
159     execute 2, 6, 2, 5
160     execute 6, 2, 6, 3
161     execute 1, 7, 7, 1
162     execute 6, 3, 6, 4
163     
164     assert_not_valid 7, 1, 8, 1
165     assert_valid 7, 1, 8, 0
166   end
167   
168   def test_rook_move
169     assert_valid 7, 7, 3, 7
170     
171     execute 6, 6, 6, 5
172     execute 6, 2, 6, 3
173     
174     assert_not_valid 7, 7, 6, 6
175   end
176   
177   def test_illegal_move
178     @board[Point.new(4, 6)] = Chess::Piece.new(:white, :pawn)
179     assert_valid 4, 8, 5, 7
180     assert_valid 4, 8, 3, 7
181     assert_not_valid 4, 8, 4, 7
182   end
183   
184   def test_drop_with_empty_pool
185     assert_not_valid @state.move_factory.drop(
186       @state.piece_factory.new(:black, :rook),
187       Point.new(4, 4))
188   end
189   
190   def test_simple_drop
191     piece = @state.piece_factory.new(:black, :rook)
192     @state.pool(:black).add(@state.piece_factory.new(:black, :rook))
193     assert_valid @state.move_factory.drop(piece, Point.new(4, 4))
194       
195     @state.board[Point.new(4, 4)] = @state.piece_factory.new(:white, :gold)
196     assert_not_valid @state.move_factory.drop(piece, Point.new(4, 4))
198     @state.board[Point.new(4, 4)] = @state.piece_factory.new(:black, :silver)
199     assert_not_valid @state.move_factory.drop(piece, Point.new(4, 4))
200   end
201   
202   def test_double_pawn_drop
203     piece = @state.piece_factory.new(:black, :pawn)
204     @state.pool(:black).add(piece)
205     assert_not_valid @state.move_factory.drop(piece, Point.new(4, 4))
206     @state.board[Point.new(4, 6)] = nil
207     assert_valid @state.move_factory.drop(piece, Point.new(4, 4))
208   end
209   
210   def test_last_row_pawn_drop
211     piece1 = @state.piece_factory.new(:black, :pawn)
212     piece2 = @state.piece_factory.new(:black, :horse)
213     @state.pool(:black).add(piece1)
214     @state.pool(:black).add(piece2)
215     
216     @state.board[Point.new(2, 6)] = nil
217     @state.board[Point.new(2, 0)] = nil
218     @state.board[Point.new(2, 1)] = nil
219     @state.board[Point.new(2, 2)] = nil
220     
221     assert_not_valid @state.move_factory.drop(piece1, Point.new(2, 0))
222     assert_valid @state.move_factory.drop(piece1, Point.new(2, 1))
223     assert_not_valid @state.move_factory.drop(piece2, Point.new(2, 0))
224     assert_not_valid @state.move_factory.drop(piece2, Point.new(2, 1))
225     assert_valid @state.move_factory.drop(piece2, Point.new(2, 2))
226   end
228   def test_promotion_on_enter
229     @state.board[Point.new(2, 6)] = nil
230     @state.board[Point.new(2, 3)] = Chess::Piece.new(:black, :pawn)
231     
232     assert_valid 2, 3, 2, 2, :promote => true
233     assert_valid 2, 3, 2, 2, :promote => false
234     
235     @state.board[Point.new(2, 3)] = nil
236     @state.board[Point.new(2, 4)] = Chess::Piece.new(:black, :pawn)
237     
238     assert_valid 2, 4, 2, 3
239     assert_valid 2, 4, 2, 3, :promote => false
240     assert_not_valid 2, 4, 2, 3, :promote => true
241   end
242   
243   def test_promotion_on_exit
244     @state.board[Point.new(0, 2)] = Chess::Piece.new(:black, :rook)
245     
246     assert_valid 0, 2, 0, 4, :promote => true
247     assert_valid 0, 2, 0, 4, :promote => false
248   end
249   
250   def test_promotion_on_move_inside
251     @state.board[Point.new(0, 2)] = Chess::Piece.new(:black, :rook)
252     
253     assert_valid 0, 2, 1, 2, :promote => true
254     assert_valid 0, 2, 1, 2, :promote => false
255   end
256   
257   def test_mandatory_promotion
258     @state.board[Point.new(0, 6)] = nil
259     @state.board[Point.new(0, 1)] = Chess::Piece.new(:black, :pawn)
260     
261     assert_valid 0, 1, 0, 0, :promote => true
262     assert_not_valid 0, 1, 0, 0, :promote => false
263     
264     
265     @state.board[Point.new(0, 2)] = Chess::Piece.new(:black, :horse)
266     
267     assert_valid 0, 2, 1, 0, :promote => true
268     assert_not_valid 0, 2, 1, 0, :promote => false
269     
270     @state.board[Point.new(0, 2)] = nil
271     @state.board[Point.new(0, 3)] = Chess::Piece.new(:black, :horse)
272     
273     assert_valid 0, 3, 1, 1, :promote => true
274     assert_not_valid 0, 3, 1, 1, :promote => false
275   end
276   
277   def test_promote_twice
278     @state.board[Point.new(2, 3)] = Chess::Piece.new(:black, :promoted_lance)
279     
280 #     assert_not_valid 2, 3, 2, 2, :promote => true
281     assert_valid 2, 3, 2, 2, :promote => false
282   end