Fixed parsing of queen-side castling.
[kaya.git] / test / games / chess / test_chess_serializer.rb
blob67fff373e31b0172ef057238d5c514a676020954
1 require 'test/unit'
2 require 'games/all'
3 require 'helpers/validation_helper'
5 class TestChessSerializer < Test::Unit::TestCase
6   include ValidationHelper
8   def setup
9     @game = Game.get(:chess)
10     @simple = @game.serializer.new(:simple)
11     @san = @game.serializer.new(:compact)
12     @dec = @game.serializer.new(:decorated)
13     @state = @game.state.new
14     @validate = @game.validator.new(@state)
15   end
17   def test_simple_serialization
18     @state.setup
19     assert_equal 'e2e4', serialize(@simple, 4, 6, 4, 4)
20     @state.board[Point.new(6, 1)] = @game.piece.new(:white, :pawn)
21     assert_equal 'g7h8=R', serialize(@simple,
22       @game.move.new(Point.new(6, 1), Point.new(7, 0), :promotion => :rook))
23   end
24   
25   def test_san_serialization_pawn
26     @state.setup
27     assert_equal 'e4', serialize(@san, 4, 6, 4, 4)
28     
29     execute 4, 6, 4, 4
30     assert_equal 'e5', serialize(@san, 4, 1, 4, 3)
31     
32     @state.setup
33     @state.board[Point.new(3, 5)] = @game.piece.new(:black, :rook)
34     assert_equal 'exd3', serialize(@san, 4, 6, 3, 5)
35   end
36   
37   def test_san_serialization_rook
38     @state.setup
39     @state.board[Point.new(7, 6)] = nil
40     assert_equal 'Rh5', serialize(@san, 7, 7, 7, 3)
41     assert_equal 'Rxh7', serialize(@san, 7, 7, 7, 1)
42   end
43   
44   def test_san_serialization_ambiguous
45     @state.board[Point.new(0, 0)] = @game.piece.new(:white, :rook)
46     @state.board[Point.new(7, 0)] = @game.piece.new(:white, :rook)
47     @state.board[Point.new(0, 7)] = @game.piece.new(:white, :rook)
48     @state.board[Point.new(7, 7)] = @game.piece.new(:white, :king)
49     @state.board[Point.new(5, 5)] = @game.piece.new(:black, :king)
50     
51     assert_equal 'Rab8', serialize(@san, 0, 0, 1, 0)
52     assert_equal 'R8a7', serialize(@san, 0, 0, 0, 1)
53     
54     @state.board[Point.new(1, 0)] = @game.piece.new(:black, :bishop)
55     
56     assert_equal 'Raxb8', serialize(@san, 0, 0, 1, 0)
57   end
58   
59   def test_deserialize
60     @state.setup
61     assert_deserialize('e4', 4, 6, 4, 4)
62     
63     execute 4, 6, 4, 4
64     assert_deserialize('e5', 4, 1, 4, 3)
65   end
66   
67   def test_deserialize_promotion
68     @state.setup
69     @state.board[Point.new(6, 1)] = @game.piece.new(:white, :pawn)
70     
71     assert_deserialize('gxh8=B', 6, 1, 7, 0, :promotion => :bishop)
72   end
73   
74   def test_deserialize_castling_king
75     @state.setup
76     @state.board[Point.new(5, 7)] = nil
77     @state.board[Point.new(6, 7)] = nil
78     
79     assert_deserialize('0-0', 4, 7, 6, 7)
80   end
81   
82   def test_deserialize_castling_queen
83     @state.setup
84     @state.board[Point.new(3, 7)] = nil
85     @state.board[Point.new(2, 7)] = nil
86     @state.board[Point.new(1, 7)] = nil
87     
88     assert_deserialize('0-0-0', 4, 7, 2, 7)
89   end
90   
91   private
92   
93   def serialize(serializer, *args)
94     move = unpack_move(*args)
95     serializer.serialize(move, @state)
96   end
97   
98   def assert_deserialize(san, a, b, c, d, opts = {})
99     move = unpack_move(a, b, c, d)
100     move.promotion = opts[:promotion]
101     @game.validator.new(@state)[move]
102     move2 = @san.deserialize(san, @state)
103     assert_equal move, move2
104   end