Remove debugging traces, now that PGN load/save works.
[tagua/yd.git] / tests / hlvariants / chesslegalitytest.cpp
blob9573914d27c0b415f03344e2dd948152f04a1543
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;
9 m_state->setup();
10 m_legality_check = new ChessLegalityCheck(*m_state);
13 void ChessLegalityTest::tearDown() {
14 delete m_state;
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));
43 // black moves
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));
101 m_state->move(d5);
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());
119 ChessMove tmp(oo);
120 CPPUNIT_ASSERT(!m_legality_check->pseudolegal(tmp));
123 m_state->board().set(Point(5, 7), ChessPiece());
125 ChessMove tmp(oo);
126 CPPUNIT_ASSERT(m_legality_check->legal(tmp));
129 m_state->board().set(Point(3, 6), ChessPiece(ChessPiece::BLACK, ChessPiece::PAWN));
131 ChessMove tmp(oo);
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));
138 ChessMove tmp(oo);
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)));