Introduction
Introduction Statistics Contact Development Disclaimer Help
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
You are viewing proxied material from codemadness.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.