1 #include "chesslegalitytest.h"
2 #include "hlvariant/chess/legalitycheck.h"
5 CPPUNIT_TEST_SUITE_REGISTRATION(ChessLegalityTest
);
7 void ChessLegalityTest::setUp() {
8 m_state
= new ChessGameState
;
10 m_legality_check
= new ChessLegalityCheck(*m_state
);
13 void ChessLegalityTest::tearDown() {
15 delete m_legality_check
;
18 void ChessLegalityTest::test_movements() {
19 ChessMove
e4(Point(4, 6), Point(4, 4));
20 CPPUNIT_ASSERT_EQUAL(ChessMove::EN_PASSANT_TRIGGER
,
21 m_legality_check
->getMoveType(
22 m_state
->board().get(Point(4, 6)), e4
));
24 ChessMove
crazy(Point(0, 0), Point(7, 4));
25 CPPUNIT_ASSERT_EQUAL(ChessMove::INVALID
,
26 m_legality_check
->getMoveType(
27 m_state
->board().get(Point(0, 0)), crazy
));
30 void ChessLegalityTest::test_pseudolegal() {
31 ChessMove
e4(Point(4, 6), Point(4, 4));
32 CPPUNIT_ASSERT(m_legality_check
->pseudolegal(e4
));
34 ChessMove
e5(Point(4, 6), Point(4, 3));
35 CPPUNIT_ASSERT(!m_legality_check
->pseudolegal(e5
));
37 ChessMove
Nf3(Point(6, 7), Point(5, 5));
38 CPPUNIT_ASSERT(m_legality_check
->pseudolegal(Nf3
));
40 ChessMove
Bc4(Point(5, 7), Point(2, 4));
41 CPPUNIT_ASSERT(!m_legality_check
->pseudolegal(Bc4
));
44 m_state
->switchTurn();
46 ChessMove
crazy(Point(0, 0), Point(4, 7));
47 CPPUNIT_ASSERT(!m_legality_check
->pseudolegal(crazy
));
49 ChessMove
e5_(Point(4, 1), Point(4, 3));
50 CPPUNIT_ASSERT(m_legality_check
->pseudolegal(e5_
));
53 void ChessLegalityTest::test_simple_move() {
54 ChessMove
e4(Point(4, 6), Point(4, 4));
55 CPPUNIT_ASSERT(m_legality_check
->legal(e4
));
57 ChessMove
e5(Point(4, 6), Point(4, 3));
58 CPPUNIT_ASSERT(!m_legality_check
->pseudolegal(e5
));
60 ChessMove
Nf3(Point(6, 7), Point(5, 5));
61 CPPUNIT_ASSERT(m_legality_check
->legal(Nf3
));
63 ChessMove
Bc4(Point(5, 7), Point(2, 4));
64 CPPUNIT_ASSERT(!m_legality_check
->pseudolegal(Bc4
));
67 ChessMove
tmp(Point(5, 7), Point(2, 4));
68 m_state
->board().set(Point(4, 6), ChessPiece());
69 CPPUNIT_ASSERT(m_legality_check
->legal(tmp
));
72 ChessMove
e6(Point(4, 1), Point(4, 2));
73 CPPUNIT_ASSERT(!m_legality_check
->pseudolegal(e6
));
76 ChessMove
tmp(Point(4, 1), Point(4, 2));
77 m_state
->switchTurn();
78 CPPUNIT_ASSERT(m_legality_check
->legal(tmp
));
82 void ChessLegalityTest::test_promotion() {
83 m_state
->board().set(Point(7, 1), ChessPiece(ChessPiece::WHITE
, ChessPiece::PAWN
));
84 ChessMove
h8Q(Point(7, 1), Point(7, 0), ChessPiece::QUEEN
);
85 CPPUNIT_ASSERT(!m_legality_check
->pseudolegal(h8Q
));
87 ChessMove
hxg8R(Point(7, 1), Point(6, 0), ChessPiece::ROOK
);
88 CPPUNIT_ASSERT(m_legality_check
->pseudolegal(hxg8R
));
89 CPPUNIT_ASSERT(m_legality_check
->legal(hxg8R
));
90 CPPUNIT_ASSERT_EQUAL((int)ChessPiece::ROOK
, hxg8R
.promoteTo());
93 void ChessLegalityTest::test_en_passant() {
94 m_state
->move(ChessMove(Point(4, 6), Point(4, 4)));
95 m_state
->move(ChessMove(Point(7, 1), Point(7, 2)));
96 m_state
->move(ChessMove(Point(4, 4), Point(4, 3)));
98 ChessMove
d5(Point(3, 1), Point(3, 3));
99 CPPUNIT_ASSERT(m_legality_check
->legal(d5
));
100 CPPUNIT_ASSERT(d5
.enPassantTrigger() == Point(3, 2));
103 ChessMove
exd6(Point(4, 3), Point(3, 2));
104 CPPUNIT_ASSERT(m_legality_check
->legal(exd6
));
105 CPPUNIT_ASSERT(exd6
.captureSquare() == Point(3, 3));
107 m_state
->move(ChessMove(Point(7, 6), Point(7, 5)));
108 m_state
->move(ChessMove(Point(7, 2), Point(7, 3)));
110 ChessMove
tmp(Point(4, 3), Point(3, 2));
111 CPPUNIT_ASSERT(!m_legality_check
->pseudolegal(tmp
));
114 void ChessLegalityTest::test_castling() {
115 ChessMove
oo(Point(4, 7), Point(6, 7));
117 m_state
->board().set(Point(6, 7), ChessPiece());
120 CPPUNIT_ASSERT(!m_legality_check
->pseudolegal(tmp
));
123 m_state
->board().set(Point(5, 7), ChessPiece());
126 CPPUNIT_ASSERT(m_legality_check
->legal(tmp
));
129 m_state
->board().set(Point(3, 6), ChessPiece(ChessPiece::BLACK
, ChessPiece::PAWN
));
132 CPPUNIT_ASSERT(!m_legality_check
->pseudolegal(tmp
));
135 m_state
->board().set(Point(3, 6), ChessPiece());
136 m_state
->board().set(Point(4, 6), ChessPiece(ChessPiece::BLACK
, ChessPiece::PAWN
));
139 CPPUNIT_ASSERT(!m_legality_check
->pseudolegal(tmp
));
143 void ChessLegalityTest::test_attack1() {
144 m_state
->board().set(Point(5, 5), ChessPiece(ChessPiece::BLACK
, ChessPiece::ROOK
));
145 CPPUNIT_ASSERT(m_legality_check
->attacks(ChessPiece::WHITE
, Point(5, 5)));
148 void ChessLegalityTest::test_attack2() {
149 m_state
->board().set(Point(4, 4), ChessPiece(ChessPiece::BLACK
, ChessPiece::QUEEN
));
150 CPPUNIT_ASSERT(!m_legality_check
->attacks(ChessPiece::WHITE
, Point(4, 4)));
153 void ChessLegalityTest::test_attack3() {
154 m_state
->board().set(Point(0, 5), ChessPiece(ChessPiece::BLACK
, ChessPiece::KING
));
155 m_state
->board().set(Point(1, 6), ChessPiece(ChessPiece::WHITE
, ChessPiece::ROOK
)); // b2: pawn -> rook
156 CPPUNIT_ASSERT(m_legality_check
->attacks(ChessPiece::WHITE
, Point(0, 5)));
158 m_state
->board().set(Point(1, 7), ChessPiece()); // remove knight on b1
159 CPPUNIT_ASSERT(!m_legality_check
->attacks(ChessPiece::WHITE
, Point(0, 5)));
161 m_state
->board().set(Point(0, 6), ChessPiece()); // remove pawn on a2
162 CPPUNIT_ASSERT(m_legality_check
->attacks(ChessPiece::WHITE
, Point(0, 5)));
164 m_state
->board().set(Point(0, 7), ChessPiece()); // remove rook on a1
165 CPPUNIT_ASSERT(!m_legality_check
->attacks(ChessPiece::WHITE
, Point(0, 5)));
168 void ChessLegalityTest::test_attack4() {
169 CPPUNIT_ASSERT(!m_legality_check
->attacks(ChessPiece::BLACK
, Point(4, 7)));