improve tests and label them - chess-puzzles - chess puzzle book generator
(HTM) git clone git://git.codemadness.org/chess-puzzles
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit aa7a4692fb14c40930fde876585a70a88b76b3e2
(DIR) parent 35cfce88175a31ca9b1db67e70575f66182d8ab2
(HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
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(-)
---
(DIR) 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' 'e1g1'
-# 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' 'e8g8'
+# 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 castling state.
-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' 'e6d5'
+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 side.
-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' 'h8g8'
+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 side.
-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 side.
-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 castling state'\
+ '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 halfmove counter
+testfen '960, castle with rook right next to the king, doesnt reset halfmove counter'\
+ '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 reset halfmove counter'\
+ '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