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