@@ -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+
643741void tst_Board::results_data () const
644742{
645743 QTest::addColumn<QString>(" variant" );
0 commit comments