improve tests and label them - chess-puzzles - chess puzzle book generator | |
git clone git://git.codemadness.org/chess-puzzles | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit aa7a4692fb14c40930fde876585a70a88b76b3e2 | |
parent 35cfce88175a31ca9b1db67e70575f66182d8ab2 | |
Author: Hiltjo Posthuma <[email protected]> | |
Date: Thu, 21 Dec 2023 22:20:34 +0100 | |
improve tests and label them | |
Diffstat: | |
M tests.sh | 157 ++++++++++++++++++++++-------… | |
1 file changed, 115 insertions(+), 42 deletions(-) | |
--- | |
diff --git a/tests.sh b/tests.sh | |
@@ -1,126 +1,199 @@ | |
#!/bin/sh | |
-# testfen(expect, fen, moves) | |
+# testfen(name, expect, fen, moves) | |
testfen() { | |
- expect="$1" | |
- fen="$2" | |
- moves="$3" | |
+ name="$1" | |
+ expect="$2" | |
+ fen="$3" | |
+ moves="$4" | |
output=$(./fen -o fen "$fen" "$moves") | |
if test "$output" = "$expect"; then | |
- echo "OK" | |
+ printf 'OK: %s\n' "$name" | |
else | |
- printf 'Fail: expected %s, got: %s\n' "$expect" "$output" | |
+ printf 'Fail: %s\n' "$name" | |
+ printf '\texpected: %s\n' "$expect" | |
+ printf '\tgot: %s\n' "$output" | |
+ printf '\tInput FEN, moves: "%s" "%s"\n' "$fen" "$moves" | |
fi | |
} | |
-testfen 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1' \ | |
- "startpos" "" | |
+testfen 'startpos'\ | |
+ 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1' \ | |
+ "startpos"\ | |
+"" | |
-# white castling | |
-testfen 'rnbqkb1r/p4ppp/1pp1pn2/3p4/3P1B2/3BPN2/PPP2PPP/RN1Q1RK1 b kq - 1 6' \ | |
- 'rnbqkb1r/p4ppp/1pp1pn2/3p4/3P1B2/3BPN2/PPP2PPP/RN1QK2R w KQkq - 0 6' … | |
-# black castling | |
-testfen 'rnbq1rk1/p3bppp/1pp1pn2/3p4/3P1B2/3BPN2/PPPN1PPP/R2Q1RK1 w - - 4 8' \ | |
- 'rnbqk2r/p3bppp/1pp1pn2/3p4/3P1B2/3BPN2/PPPN1PPP/R2Q1RK1 b kq - 3 7' '… | |
+# white castles kingside | |
+testfen 'white castles kingside'\ | |
+ 'rnbqkb1r/p4ppp/1pp1pn2/3p4/3P1B2/3BPN2/PPP2PPP/RN1Q1RK1 b kq - 1 6'\ | |
+ 'rnbqkb1r/p4ppp/1pp1pn2/3p4/3P1B2/3BPN2/PPP2PPP/RN1QK2R w KQkq - 0 6'\ | |
+ 'e1g1' | |
+testfen 'white castles kingside'\ | |
+ 'r3k2r/p2bqpp1/nppbpn1p/3p4/3P1B2/2NBPN2/PPPQ1PPP/R4RK1 b kq - 9 11'\ | |
+ 'r3k2r/p2bqpp1/nppbpn1p/3p4/3P1B2/2NBPN2/PPPQ1PPP/R3K2R w KQkq - 8 11'\ | |
+ 'e1g1' | |
+testfen 'white castles queenside'\ | |
+ 'r3k2r/p2bqpp1/nppbpn1p/3p4/3P1B2/2NBPN2/PPPQ1PPP/2KR3R b kq - 9 11'\ | |
+ 'r3k2r/p2bqpp1/nppbpn1p/3p4/3P1B2/2NBPN2/PPPQ1PPP/R3K2R w KQkq - 8 11'\ | |
+ 'e1c1' | |
+ | |
+# black castles kingside | |
+testfen 'black castles kingside'\ | |
+ 'rnbq1rk1/p3bppp/1pp1pn2/3p4/3P1B2/3BPN2/PPPN1PPP/R2Q1RK1 w - - 4 8'\ | |
+ 'rnbqk2r/p3bppp/1pp1pn2/3p4/3P1B2/3BPN2/PPPN1PPP/R2Q1RK1 b kq - 3 7'\ | |
+ 'e8g8' | |
+testfen 'black castles kingside'\ | |
+ 'r4rk1/p2bqpp1/nppbpn1p/3p4/3P1B2/2NBPN2/PPPQ1PPP/R4RK1 w - - 10 12'\ | |
+ 'r3k2r/p2bqpp1/nppbpn1p/3p4/3P1B2/2NBPN2/PPPQ1PPP/R4RK1 b kq - 9 11'\ | |
+ 'e8g8' | |
+testfen 'black castles queenside'\ | |
+ '2kr3r/p2bqpp1/nppbpn1p/3p4/3P1B2/2NBPN2/PPPQ1PPP/R4RK1 w - - 10 12'\ | |
+ 'r3k2r/p2bqpp1/nppbpn1p/3p4/3P1B2/2NBPN2/PPPQ1PPP/R4RK1 b kq - 9 11'\ | |
+ 'e8c8' | |
# check castling: the white queen is in check, but this doesn't change the cas… | |
-testfen 'rnb1kb1r/pp2qppp/2p2n2/3p4/3P1B2/3B1N2/PPP2PPP/RN1QK2R w KQkq - 0 8' \ | |
- 'rnb1kb1r/pp2qppp/2p1pn2/3P4/3P1B2/3B1N2/PPP2PPP/RN1QK2R b KQkq - 0 7'… | |
+testfen 'white queen is in check, shouldnt change castling state'\ | |
+ 'rnb1kb1r/pp2qppp/2p2n2/3p4/3P1B2/3B1N2/PPP2PPP/RN1QK2R w KQkq - 0 8'\ | |
+ 'rnb1kb1r/pp2qppp/2p1pn2/3P4/3P1B2/3B1N2/PPP2PPP/RN1QK2R b KQkq - 0 7'\ | |
+ 'e6d5' | |
+ | |
# check castling: black moves kingside rook: this removes castling on this sid… | |
-testfen 'rnb1kbr1/pp2qppp/2p2n2/3p4/3P1B2/3B1N2/PPP1QPPP/RN2K2R w KQq - 2 9' \ | |
- 'rnb1kb1r/pp2qppp/2p2n2/3p4/3P1B2/3B1N2/PPP1QPPP/RN2K2R b KQkq - 1 8' … | |
+testfen 'black moves kingside rook: this removes castling on this side'\ | |
+ 'rnb1kbr1/pp2qppp/2p2n2/3p4/3P1B2/3B1N2/PPP1QPPP/RN2K2R w KQq - 2 9'\ | |
+ 'rnb1kb1r/pp2qppp/2p2n2/3p4/3P1B2/3B1N2/PPP1QPPP/RN2K2R b KQkq - 1 8'\ | |
+ 'h8g8' | |
+ | |
# check castling: white moves kingside rook: this removes castling on this sid… | |
-testfen 'rnb1kb2/pp2qppr/2p2n2/3p4/3P1B2/3B1N2/PPP1QPPP/RN2K1R1 b Qq - 3 9'\ | |
+testfen 'white moves kingside rook: this removes castling on this side'\ | |
+ 'rnb1kb2/pp2qppr/2p2n2/3p4/3P1B2/3B1N2/PPP1QPPP/RN2K1R1 b Qq - 3 9'\ | |
'rnb1kb2/pp2qppr/2p2n2/3p4/3P1B2/3B1N2/PPP1QPPP/RN2K2R w KQq - 2 9'\ | |
'h1g1' | |
# check castling: white moves queenside rook: this removes castling on this si… | |
-testfen 'rnb1kb2/1p2qpp1/p1p2n2/3p4/3P1B2/3B1N2/PPPNQPPr/1R2K1R1 b q - 1 11'\ | |
+testfen 'white moves queenside rook: this removes castling on this side'\ | |
+ 'rnb1kb2/1p2qpp1/p1p2n2/3p4/3P1B2/3B1N2/PPPNQPPr/1R2K1R1 b q - 1 11'\ | |
'rnb1kb2/1p2qpp1/p1p2n2/3p4/3P1B2/3B1N2/PPPNQPPr/R3K1R1 w Qq - 0 11'\ | |
'a1b1' | |
# white king move, remove castling availability | |
-testfen 'rnb1kb2/1p2qpp1/p1p2n2/3p4/3P1B2/3B1N2/PPPNQPPr/R2K2R1 b q - 1 11'\ | |
+testfen 'white king move, remove castling availability'\ | |
+ 'rnb1kb2/1p2qpp1/p1p2n2/3p4/3P1B2/3B1N2/PPPNQPPr/R2K2R1 b q - 1 11'\ | |
'rnb1kb2/1p2qpp1/p1p2n2/3p4/3P1B2/3B1N2/PPPNQPPr/R3K1R1 w Qq - 0 11'\ | |
'e1d1' | |
# white king move, remove castling availability | |
-testfen 'r3k2r/pppppppp/8/8/8/8/PPPPPPPP/R2K3R b kq - 1 1'\ | |
+testfen 'white king move, remove castling availability'\ | |
+ 'r3k2r/pppppppp/8/8/8/8/PPPPPPPP/R2K3R b kq - 1 1'\ | |
'r3k2r/pppppppp/8/8/8/8/PPPPPPPP/R3K2R w KQkq - 0 1'\ | |
'e1d1' | |
# black king move, remove castling availability | |
-testfen 'r4k1r/pppppppp/8/8/8/8/PPPPPPPP/R2K3R w - - 2 2'\ | |
+testfen 'black king move, remove castling availability'\ | |
+ 'r4k1r/pppppppp/8/8/8/8/PPPPPPPP/R2K3R w - - 2 2'\ | |
'r3k2r/pppppppp/8/8/8/8/PPPPPPPP/R2K3R b kq - 1 1'\ | |
'e8f8' | |
- | |
# black is laz0rbeamed by white bishop on the queenside on b8, but not on the | |
# castling square it is allowed to castle. | |
-testfen '2kr1br1/pp2qppp/n1p1bn2/3p4/3P1B2/3BQN2/PPP2PPP/RN2K2R w KQ - 8 12'\ | |
+testfen 'black is laz0rbeamed by white bishop'\ | |
+ '2kr1br1/pp2qppp/n1p1bn2/3p4/3P1B2/3BQN2/PPP2PPP/RN2K2R w KQ - 8 12'\ | |
'r3kbr1/pp2qppp/n1p1bn2/3p4/3P1B2/3BQN2/PPP2PPP/RN2K2R b KQq - 7 11'\ | |
'e8c8' | |
# white moves bishop and blocks castling for black, but this doesn't change the | |
# castle state itself. | |
-testfen 'r3kbr1/pp2qppp/n1p2n2/3p1B2/3P1B2/4QN1b/PPP2PPP/RN2K2R b KQq - 9 12'\ | |
+testfen 'white moves bishop and blocks castling for black, shouldnt change cas… | |
+ 'r3kbr1/pp2qppp/n1p2n2/3p1B2/3P1B2/4QN1b/PPP2PPP/RN2K2R b KQq - 9 12'\ | |
'r3kbr1/pp2qppp/n1p2n2/3p4/3P1B2/3BQN1b/PPP2PPP/RN2K2R w KQq - 8 12'\ | |
'd3f5' | |
# test en passant: move white pawn g2 to g4, enpassant square becomes g3. | |
-testfen 'r4k1r/ppppp1pp/8/8/5pP1/4P3/PPPP1P1P/R3K2R b - g3 0 4'\ | |
+testfen 'move white pawn g2 to g4, enpassant square becomes g3'\ | |
+ 'r4k1r/ppppp1pp/8/8/5pP1/4P3/PPPP1P1P/R3K2R b - g3 0 4'\ | |
'r4k1r/ppppp1pp/8/8/5p2/4P3/PPPP1PPP/R3K2R w - - 0 4'\ | |
'g2g4' | |
+ | |
# moving 2 squares near a pawn, but not en passant. | |
-testfen 'r4k1r/ppppp1p1/8/5p2/6P1/4P2p/PPPP1P1P/R3K2R b - - 0 6'\ | |
+testfen 'moving 2 squares near a pawn, but not en passant'\ | |
+ 'r4k1r/ppppp1p1/8/5p2/6P1/4P2p/PPPP1P1P/R3K2R b - - 0 6'\ | |
'r4k1r/ppppp1p1/8/5p2/8/4P2p/PPPP1PPP/R3K2R w - - 0 6'\ | |
'g2g4' | |
# test en passant for black. | |
-testfen 'r4k1r/ppp1p1p1/8/2Pp1p2/6P1/4P2p/PP1P1P1P/R3K2R w - d6 0 9'\ | |
+testfen 'en passant for black'\ | |
+ 'r4k1r/ppp1p1p1/8/2Pp1p2/6P1/4P2p/PP1P1P1P/R3K2R w - d6 0 9'\ | |
'r4k1r/ppppp1p1/8/2P2p2/6P1/4P2p/PP1P1P1P/R3K2R b - - 0 8'\ | |
'd7d5' | |
-testfen 'r4k1r/p1ppp1p1/8/1pP2p2/6P1/4P2p/PP1P1P1P/R3K2R w - b6 0 9'\ | |
+testfen 'en passant move for black'\ | |
+ 'r4k1r/p1ppp1p1/8/1pP2p2/6P1/4P2p/PP1P1P1P/R3K2R w - b6 0 9'\ | |
'r4k1r/ppppp1p1/8/2P2p2/6P1/4P2p/PP1P1P1P/R3K2R b - - 0 8'\ | |
'b7b5' | |
# white takes en passant | |
-testfen 'rnbqkbnr/pppp1pp1/4P3/7p/8/8/PPP1PPPP/RNBQKBNR b KQkq - 0 3'\ | |
+testfen 'white takes en passant'\ | |
+ 'rnbqkbnr/pppp1pp1/4P3/7p/8/8/PPP1PPPP/RNBQKBNR b KQkq - 0 3'\ | |
'rnbqkbnr/pppp1pp1/8/3Pp2p/8/8/PPP1PPPP/RNBQKBNR w KQkq e6 0 3'\ | |
'd5e6' | |
# black takes en passant | |
-testfen 'rnbqkbnr/ppppppp1/8/8/3P4/4P1p1/PPP2P1P/RNBQKBNR w KQkq - 0 4'\ | |
+testfen 'black takes en passant'\ | |
+ 'rnbqkbnr/ppppppp1/8/8/3P4/4P1p1/PPP2P1P/RNBQKBNR w KQkq - 0 4'\ | |
'rnbqkbnr/ppppppp1/8/8/3P2Pp/4P3/PPP2P1P/RNBQKBNR b KQkq g3 0 3'\ | |
'h4g3' | |
# white takes en passant: should reset halfmove counter | |
-testfen 'rnbqkbnr/pppp1pp1/4P3/7p/8/8/PPP1PPPP/RNBQKBNR b KQkq - 0 3'\ | |
+testfen 'white takes en passant: should reset halfmove counter'\ | |
+ 'rnbqkbnr/pppp1pp1/4P3/7p/8/8/PPP1PPPP/RNBQKBNR b KQkq - 0 3'\ | |
'rnbqkbnr/pppp1pp1/8/3Pp2p/8/8/PPP1PPPP/RNBQKBNR w KQkq e6 1 3'\ | |
'd5e6' | |
# 960 white queenside castle | |
-testfen 'qrn1bk1n/ppb1pprp/2p3p1/3p4/1B1P4/3NPB2/PPP2PPP/Q1KR2RN b q - 5 6'\ | |
+testfen '960 white queenside castle'\ | |
+ 'qrn1bk1n/ppb1pprp/2p3p1/3p4/1B1P4/3NPB2/PPP2PPP/Q1KR2RN b q - 5 6'\ | |
'qrn1bk1n/ppb1pprp/2p3p1/3p4/1B1P4/3NPB2/PPP2PPP/QR3KRN w KQq - 4 6'\ | |
'f1c1' | |
-# 960, rook moved: remove ability for black to castle. | |
-testfen 'q1r1bk1n/ppb1pprp/2pn2p1/3p4/1B1P4/3NPB2/PPP2PPP/Q1KRR2N w - - 8 8'\ | |
+# 960, rook moved: remove ability for black to castle | |
+testfen '960, rook moved: remove ability for black to castle'\ | |
+ 'q1r1bk1n/ppb1pprp/2pn2p1/3p4/1B1P4/3NPB2/PPP2PPP/Q1KRR2N w - - 8 8'\ | |
'qr2bk1n/ppb1pprp/2pn2p1/3p4/1B1P4/3NPB2/PPP2PPP/Q1KRR2N b q - 7 7'\ | |
'b8c8' | |
# 960, rook moved | |
-testfen 'bbnrkrnq/ppp1p1pp/8/3p1p2/3P1P2/3R4/PPP1P1PP/BBN1KRNQ b Kkq - 1 3'\ | |
+testfen '960, rook moved, castling ability'\ | |
+ 'bbnrkrnq/ppp1p1pp/8/3p1p2/3P1P2/3R4/PPP1P1PP/BBN1KRNQ b Kkq - 1 3'\ | |
'bbnrkrnq/ppp1p1pp/8/3p1p2/3P1P2/8/PPP1P1PP/BBNRKRNQ w KQkq - 0 3'\ | |
'd1d3' | |
# 960, rook moved | |
-testfen 'bbnrkrnq/ppp1p1pp/8/3p1p2/3P1P2/5R2/PPP1P1PP/BBNRK1NQ b Qkq - 1 3'\ | |
+testfen '960, rook moved, castling ability'\ | |
+ 'bbnrkrnq/ppp1p1pp/8/3p1p2/3P1P2/5R2/PPP1P1PP/BBNRK1NQ b Qkq - 1 3'\ | |
'bbnrkrnq/ppp1p1pp/8/3p1p2/3P1P2/8/PPP1P1PP/BBNRKRNQ w KQkq - 0 3'\ | |
'f1f3' | |
# 960, rook moved | |
-testfen 'bbn1krnq/ppp1p1pp/3r4/3p1p2/P2P1P2/8/1PP1P1PP/BBNRKRNQ w KQk - 1 4'\ | |
+testfen '960, rook moved, castling ability'\ | |
+ 'bbn1krnq/ppp1p1pp/3r4/3p1p2/P2P1P2/8/1PP1P1PP/BBNRKRNQ w KQk - 1 4'\ | |
'bbnrkrnq/ppp1p1pp/8/3p1p2/P2P1P2/8/1PP1P1PP/BBNRKRNQ b KQkq - 0 3'\ | |
'd8d6' | |
# 960, rook moved | |
-testfen 'bbnrk1nq/ppp1p1pp/5r2/3p1p2/P2P1P2/8/1PP1P1PP/BBNRKRNQ w KQq - 1 4'\ | |
+testfen '960, rook moved, castling ability'\ | |
+ 'bbnrk1nq/ppp1p1pp/5r2/3p1p2/P2P1P2/8/1PP1P1PP/BBNRKRNQ w KQq - 1 4'\ | |
'bbnrkrnq/ppp1p1pp/8/3p1p2/P2P1P2/8/1PP1P1PP/BBNRKRNQ b KQkq - 0 3'\ | |
'f8f6' | |
# 960, en passant move | |
-testfen 'bbnrk1nq/ppp1p2p/3r4/3p1ppP/P2P1P2/8/1PP1P1P1/BBNRKRNQ w KQq g6 0 6'\ | |
+testfen '960, en passant move'\ | |
+ 'bbnrk1nq/ppp1p2p/3r4/3p1ppP/P2P1P2/8/1PP1P1P1/BBNRKRNQ w KQq g6 0 6'\ | |
'bbnrk1nq/ppp1p1pp/3r4/3p1p1P/P2P1P2/8/1PP1P1P1/BBNRKRNQ b KQq - 0 5'\ | |
'g7g5' | |
# 960, en passant take | |
-testfen 'bbnrk1nq/ppp1p2p/3r2P1/3p1p2/P2P1P2/8/1PP1P1P1/BBNRKRNQ b KQq - 0 6'\ | |
+testfen '960, en passant take'\ | |
+ 'bbnrk1nq/ppp1p2p/3r2P1/3p1p2/P2P1P2/8/1PP1P1P1/BBNRKRNQ b KQq - 0 6'\ | |
'bbnrk1nq/ppp1p2p/3r4/3p1ppP/P2P1P2/8/1PP1P1P1/BBNRKRNQ w KQq g6 0 6'\ | |
'h5g6' | |
+ | |
+# 960, white castle kingside with rook right next to the king, doesnt reset ha… | |
+testfen '960, castle with rook right next to the king, doesnt reset halfmove c… | |
+ 'nnbrqkrb/ppp1pp1p/8/3p2p1/1Q1P4/8/PPP1PPPP/NNBR1RKB b kq - 1 3'\ | |
+ 'nnbrqkrb/ppp1pp1p/8/3p2p1/1Q1P4/8/PPP1PPPP/NNBR1KRB w KQkq - 0 3'\ | |
+ 'f1g1' | |
+testfen '960, black castle kingside with rook right next to the king, doesnt r… | |
+ 'nnbrqrkb/ppp1pp1p/8/3p2p1/3P4/2Q5/PPP1PPPP/NNBR1KRB w KQ - 2 4'\ | |
+ 'nnbrqkrb/ppp1pp1p/8/3p2p1/3P4/2Q5/PPP1PPPP/NNBR1KRB b KQkq - 1 3'\ | |
+ 'f8g8' | |
+ | |
+testfen '960, castle king on queenside with many empty squares between them'\ | |
+ '1rb1krq1/pp2ppb1/3p2p1/1Np4p/2P1P3/1P2N3/P4PPP/2KR1RQB b kq - 1 11'\ | |
+ '1rb1krq1/pp2ppb1/3p2p1/1Np4p/2P1P3/1P2N3/P4PPP/1R2KRQB w KQkq - 0 11'\ | |
+ 'e1c1' | |
+ | |
+# TODO: test more chess960 black kingside and queenside castling | |
+# TODO: test more long sequence and halfmove and movenumber counts |