Skip to content

Commit 4b33169

Browse files
committed
tests for SAN move parsing and serialization
1 parent 7c7ca05 commit 4b33169

File tree

1 file changed

+99
-1
lines changed

1 file changed

+99
-1
lines changed

projects/lib/tests/chessboard/tst_board.cpp

Lines changed: 99 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ class tst_Board: public QObject
1717

1818
void moveStrings_data() const;
1919
void moveStrings();
20-
20+
21+
void sanStrings_data() const;
22+
void sanStrings();
23+
2124
void results_data() const;
2225
void results();
2326

@@ -640,6 +643,101 @@ void tst_Board::moveStrings()
640643
QCOMPARE(m_board->fenString(), endfen);
641644
}
642645

646+
void tst_Board::sanStrings_data() const
647+
{
648+
QTest::addColumn<QString>("variant");
649+
QTest::addColumn<QString>("fen");
650+
QTest::addColumn<QString>("lanmove");
651+
QTest::addColumn<QString>("sanmove");
652+
653+
QTest::newRow("standard e4 opening")
654+
<< "standard"
655+
<< "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"
656+
<< "e2e4"
657+
<< "e4";
658+
QTest::newRow("standard Nf3 opening")
659+
<< "standard"
660+
<< "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"
661+
<< "g1f3"
662+
<< "Nf3";
663+
QTest::newRow("standard file disambigiation")
664+
<< "standard"
665+
<< "3r3r/2k5/8/R7/4Q2Q/8/1K6/R6Q b - - 0 1"
666+
<< "d8f8"
667+
<< "Rdf8";
668+
QTest::newRow("standard rank disambiguation")
669+
<< "standard"
670+
<< "3r3r/2k5/8/R7/4Q2Q/8/1K6/R6Q w - - 0 1"
671+
<< "a1a3"
672+
<< "R1a3";
673+
QTest::newRow("standard file and rank disambiguation")
674+
<< "standard"
675+
<< "3r3r/2k5/8/R7/4Q2Q/8/1K6/R6Q w - - 0 1"
676+
<< "h4e1"
677+
<< "Qh4e1";
678+
QTest::newRow("standard mate")
679+
<< "standard"
680+
<< "8/8/8/5R2/8/5K1k/8/8 w - - 0 1"
681+
<< "f5h5"
682+
<< "Rh5#";
683+
QTest::newRow("standard pawn capture with check")
684+
<< "standard"
685+
<< "r1bqkb1r/ppp1pppp/2n1Pn2/3p4/8/8/PPPP1PPP/RNBQKBNR w KQkq - 0 1"
686+
<< "e6f7"
687+
<< "exf7+";
688+
QTest::newRow("standard bishop capture")
689+
<< "standard"
690+
<< "r1bqkb1r/ppp1pppp/2n1Pn2/3p4/8/8/PPPP1PPP/RNBQKBNR b KQkq - 0 1"
691+
<< "c8e6"
692+
<< "Bxe6";
693+
QTest::newRow("standard short castle")
694+
<< "standard"
695+
<< "rnbqk2r/ppppbppp/5n2/4p3/4P3/5N2/PPPPBPPP/RNBQK2R w KQkq - 4 4"
696+
<< "e1g1"
697+
<< "O-O";
698+
QTest::newRow("standard long castle")
699+
<< "standard"
700+
<< "r2q1rk1/ppp1bpp1/2n2n1p/3pp3/4P1b1/1PNP1N2/PBPQBPPP/R3K2R w KQ - 0 9"
701+
<< "e1c1"
702+
<< "O-O-O";
703+
QTest::newRow("standard pawn promotion with check")
704+
<< "standard"
705+
<< "4k3/1P6/8/8/8/8/8/4K3 w - - 0 1"
706+
<< "b7b8r"
707+
<< "b8=R+";
708+
// PR #823: Qb5d3+ -> Q5d3+
709+
QTest::newRow("standard rank disambiguation 2")
710+
<< "standard"
711+
<< "8/1k5p/4P3/1q3b2/6PP/7K/5QR1/1q1q4 b - - 0 53"
712+
<< "b5d3"
713+
<< "Q5d3+";
714+
}
715+
716+
void tst_Board::sanStrings()
717+
{
718+
QFETCH(QString, variant);
719+
QFETCH(QString, fen);
720+
QFETCH(QString, lanmove);
721+
QFETCH(QString, sanmove);
722+
723+
setVariant(variant);
724+
QVERIFY(m_board->setFenString(fen));
725+
726+
// Test that Board generates expected SAN string for lanmove
727+
Chess::Move mLan = m_board->moveFromString(lanmove);
728+
QVERIFY(m_board->isLegalMove(mLan));
729+
QString tSan = m_board->moveString(mLan, Chess::Board::StandardAlgebraic);
730+
QCOMPARE(tSan, sanmove);
731+
732+
// Test that expected SAN string can be parsed into a move
733+
// that's understood by Board, and if it's converted back to LAN
734+
// format, the string matches lanmove.
735+
Chess::Move mSan = m_board->moveFromString(sanmove);
736+
QVERIFY(m_board->isLegalMove(mSan));
737+
QString tLan = m_board->moveString(mSan, Chess::Board::LongAlgebraic);
738+
QCOMPARE(tLan, lanmove);
739+
}
740+
643741
void tst_Board::results_data() const
644742
{
645743
QTest::addColumn<QString>("variant");

0 commit comments

Comments
 (0)