test all possible castling positions - 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 4edab675e79782ae15324c3a890c87068521b999
 (DIR) parent 551d1075b050556fafd5ff8c86e0b3a92bbbda46
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Sat, 27 Jan 2024 21:02:21 +0100
       
       test all possible castling positions
       
       Castling is perfect now, except for illegal UCI moves.
       
       Diffstat:
         M TODO                                |       5 -----
         M tests.sh                            |     290 +++++++++++++++++--------------
       
       2 files changed, 158 insertions(+), 137 deletions(-)
       ---
 (DIR) diff --git a/TODO b/TODO
       @@ -1,8 +1,3 @@
       -- current castle tests are wrong,
       -        UCI move: for castling is kingpos, rookpos.
       -        test all possible chess960 and classical positions.
       -  - castling code can be simplified and end position for castling is the same
       -    as classical.
        - rename fen.c to be more unique so it can be installed in $PATH.
        - more tests.
                - test more long sequence and halfmove and movenumber counts.
 (DIR) diff --git a/tests.sh b/tests.sh
       @@ -181,6 +181,7 @@ testfen 'check halfmove counter on check, white checks black: should increase ha
                'rnbqkbnr/ppp1pp1p/6p1/3p4/3P4/4P3/PPP2PPP/RNBQKBNR w KQkq - 20 1'\
                'f1b5'
        
       +# TODO: this is incorrect (illegal move), fix it?
        # 960 white queenside castle
        testfen '960 white queenside castle'\
                'qrn1bk1n/ppb1pprp/2p3p1/3p4/1B1P4/3NPB2/PPP2PPP/Q1KR2RN b q - 5 6'\
       @@ -605,28 +606,26 @@ testpgn 'castles chess 960'\
        tests_fen
        tests_pgn
        
       -if test "$statuscode" = "1"; then
       -        echo "$failed tests failed"
       -else
       -        echo "All tests OK"
       -fi
       -
       -exit "$statuscode"
       -
        # Test all castle positions for both sides for chess960
        # this includes classical positions.
        
       -# TODO: also test PGN, should match O-O or O-O-O
       -(IFS="        "
       +IFS="        "
        while read -r kingside f kingpos r1pos r2pos; do
       +        # test last part of the side that is tested.
       +        # 5RK1 - kingside
       +        # 2KR4 - queenside
       +
       +        # lowercase for black
       +        fb="$(printf '%s' "$f" | tr '[:upper:]' '[:lower:]')"
       +
                # test white kingside or queenside castle.
                if test "$kingside" = "1"; then
       -                fullfen="$f w Kk - 0 1"
       -                expect="6kr/pppppppp/8/8/8/8/PPPPPPPP/5RK1 b k - 1 1"
       +                fullfen="${fb}/pppppppp/8/8/8/8/PPPPPPPP/${f} w Kk - 0 1"
       +                expect="${fb}/pppppppp/8/8/8/8/PPPPPPPP/5RK1 b k - 1 1"
                        move="${kingpos}1${r2pos}1"
                else
       -                fullfen="$f w Qq - 0 1"
       -                expect="1r1k4/pppppppp/8/8/8/8/PPPPPPPP/2KR4 b q - 1 1"
       +                fullfen="${fb}/pppppppp/8/8/8/8/PPPPPPPP/${f} w Qq - 0 1"
       +                expect="${fb}/pppppppp/8/8/8/8/PPPPPPPP/2KR4 b q - 1 1"
                        move="${kingpos}1${r1pos}1"
                fi
                testfen "Chess960 position, $fullfen (white), $move" \
       @@ -634,132 +633,159 @@ while read -r kingside f kingpos r1pos r2pos; do
                        "$fullfen" \
                        "$move"
        
       +        if test "$kingside" = "1"; then
       +                expect="1. O-O"
       +        else
       +                expect="1. O-O-O"
       +        fi
       +        testpgn "Chess960 position, $fullfen (white), $move" \
       +                "$expect" \
       +                "$fullfen" \
       +                "$move"
       +
                # test black kingside or queenside castle.
                if test "$kingside" = "1"; then
       -                fullfen="$f b Kk - 0 1"
       -                expect="5rk1/pppppppp/8/8/8/8/PPPPPPPP/6KR w K - 1 2"
       +                fullfen="${fb}/pppppppp/8/8/8/8/PPPPPPPP/${f} b Kk - 0 1"
       +                expect="5rk1/pppppppp/8/8/8/8/PPPPPPPP/${f} w K - 1 2"
                        move="${kingpos}8${r2pos}8"
                else
       -                fullfen="$f b Qq - 0 1"
       -                expect="2kr4/pppppppp/8/8/8/8/PPPPPPPP/1R1K4 w Q - 1 2"
       +                fullfen="${fb}/pppppppp/8/8/8/8/PPPPPPPP/${f} b Qq - 0 1"
       +                expect="2kr4/pppppppp/8/8/8/8/PPPPPPPP/${f} w Q - 1 2"
                        move="${kingpos}8${r1pos}8"
                fi
       -
                testfen "Chess960 position, $fullfen (black), $move" \
                        "$expect" \
                        "$fullfen" \
                        "$move"
       -done) <<!
       -0        1r1k4/pppppppp/8/8/8/8/PPPPPPPP/1R1K4        d        b        e
       -0        1r1k4/pppppppp/8/8/8/8/PPPPPPPP/1R1K4        d        b        f
       -0        1r1k4/pppppppp/8/8/8/8/PPPPPPPP/1R1K4        d        b        g
       -0        1r1k4/pppppppp/8/8/8/8/PPPPPPPP/1R1K4        d        b        h
       -0        1r2k3/pppppppp/8/8/8/8/PPPPPPPP/1R2K3        e        b        f
       -0        1r2k3/pppppppp/8/8/8/8/PPPPPPPP/1R2K3        e        b        g
       -0        1r2k3/pppppppp/8/8/8/8/PPPPPPPP/1R2K3        e        b        h
       -0        1r3k2/pppppppp/8/8/8/8/PPPPPPPP/1R3K2        f        b        g
       -0        1r3k2/pppppppp/8/8/8/8/PPPPPPPP/1R3K2        f        b        h
       -0        1r4k1/pppppppp/8/8/8/8/PPPPPPPP/1R4K1        g        b        h
       -0        1rk5/pppppppp/8/8/8/8/PPPPPPPP/1RK5        c        b        d
       -0        1rk5/pppppppp/8/8/8/8/PPPPPPPP/1RK5        c        b        e
       -0        1rk5/pppppppp/8/8/8/8/PPPPPPPP/1RK5        c        b        f
       -0        1rk5/pppppppp/8/8/8/8/PPPPPPPP/1RK5        c        b        g
       -0        1rk5/pppppppp/8/8/8/8/PPPPPPPP/1RK5        c        b        h
       -0        2r1k3/pppppppp/8/8/8/8/PPPPPPPP/2R1K3        e        c        f
       -0        2r1k3/pppppppp/8/8/8/8/PPPPPPPP/2R1K3        e        c        g
       -0        2r1k3/pppppppp/8/8/8/8/PPPPPPPP/2R1K3        e        c        h
       -0        2r2k2/pppppppp/8/8/8/8/PPPPPPPP/2R2K2        f        c        g
       -0        2r2k2/pppppppp/8/8/8/8/PPPPPPPP/2R2K2        f        c        h
       -0        2r3k1/pppppppp/8/8/8/8/PPPPPPPP/2R3K1        g        c        h
       -0        2rk4/pppppppp/8/8/8/8/PPPPPPPP/2RK4        d        c        e
       -0        2rk4/pppppppp/8/8/8/8/PPPPPPPP/2RK4        d        c        f
       -0        2rk4/pppppppp/8/8/8/8/PPPPPPPP/2RK4        d        c        g
       -0        2rk4/pppppppp/8/8/8/8/PPPPPPPP/2RK4        d        c        h
       -0        3r1k2/pppppppp/8/8/8/8/PPPPPPPP/3R1K2        f        d        g
       -0        3r1k2/pppppppp/8/8/8/8/PPPPPPPP/3R1K2        f        d        h
       -0        3r2k1/pppppppp/8/8/8/8/PPPPPPPP/3R2K1        g        d        h
       -0        3rk3/pppppppp/8/8/8/8/PPPPPPPP/3RK3        e        d        f
       -0        3rk3/pppppppp/8/8/8/8/PPPPPPPP/3RK3        e        d        g
       -0        3rk3/pppppppp/8/8/8/8/PPPPPPPP/3RK3        e        d        h
       -0        4r1k1/pppppppp/8/8/8/8/PPPPPPPP/4R1K1        g        e        h
       -0        4rk2/pppppppp/8/8/8/8/PPPPPPPP/4RK2        f        e        g
       -0        4rk2/pppppppp/8/8/8/8/PPPPPPPP/4RK2        f        e        h
       -0        5rk1/pppppppp/8/8/8/8/PPPPPPPP/5RK1        g        f        h
       -0        r1k5/pppppppp/8/8/8/8/PPPPPPPP/R1K5        c        a        d
       -0        r1k5/pppppppp/8/8/8/8/PPPPPPPP/R1K5        c        a        e
       -0        r1k5/pppppppp/8/8/8/8/PPPPPPPP/R1K5        c        a        f
       -0        r1k5/pppppppp/8/8/8/8/PPPPPPPP/R1K5        c        a        g
       -0        r1k5/pppppppp/8/8/8/8/PPPPPPPP/R1K5        c        a        h
       -0        r2k4/pppppppp/8/8/8/8/PPPPPPPP/R2K4        d        a        e
       -0        r2k4/pppppppp/8/8/8/8/PPPPPPPP/R2K4        d        a        f
       -0        r2k4/pppppppp/8/8/8/8/PPPPPPPP/R2K4        d        a        g
       -0        r2k4/pppppppp/8/8/8/8/PPPPPPPP/R2K4        d        a        h
       -0        r3k3/pppppppp/8/8/8/8/PPPPPPPP/R3K3        e        a        f
       -0        r3k3/pppppppp/8/8/8/8/PPPPPPPP/R3K3        e        a        g
       -0        r3k3/pppppppp/8/8/8/8/PPPPPPPP/R3K3        e        a        h
       -0        r4k2/pppppppp/8/8/8/8/PPPPPPPP/R4K2        f        a        g
       -0        r4k2/pppppppp/8/8/8/8/PPPPPPPP/R4K2        f        a        h
       -0        r5k1/pppppppp/8/8/8/8/PPPPPPPP/R5K1        g        a        h
       -0        rk6/pppppppp/8/8/8/8/PPPPPPPP/RK6        b        a        c
       -0        rk6/pppppppp/8/8/8/8/PPPPPPPP/RK6        b        a        d
       -0        rk6/pppppppp/8/8/8/8/PPPPPPPP/RK6        b        a        e
       -0        rk6/pppppppp/8/8/8/8/PPPPPPPP/RK6        b        a        f
       -0        rk6/pppppppp/8/8/8/8/PPPPPPPP/RK6        b        a        g
       -0        rk6/pppppppp/8/8/8/8/PPPPPPPP/RK6        b        a        h
       -1        1k1r4/pppppppp/8/8/8/8/PPPPPPPP/1K1R4        b        a        d
       -1        1k2r3/pppppppp/8/8/8/8/PPPPPPPP/1K2R3        b        a        e
       -1        1k3r2/pppppppp/8/8/8/8/PPPPPPPP/1K3R2        b        a        f
       -1        1k4r1/pppppppp/8/8/8/8/PPPPPPPP/1K4R1        b        a        g
       -1        1k5r/pppppppp/8/8/8/8/PPPPPPPP/1K5R        b        a        h
       -1        1kr5/pppppppp/8/8/8/8/PPPPPPPP/1KR5        b        a        c
       -1        2k1r3/pppppppp/8/8/8/8/PPPPPPPP/2K1R3        c        a        e
       -1        2k1r3/pppppppp/8/8/8/8/PPPPPPPP/2K1R3        c        b        e
       -1        2k2r2/pppppppp/8/8/8/8/PPPPPPPP/2K2R2        c        a        f
       -1        2k2r2/pppppppp/8/8/8/8/PPPPPPPP/2K2R2        c        b        f
       -1        2k3r1/pppppppp/8/8/8/8/PPPPPPPP/2K3R1        c        a        g
       -1        2k3r1/pppppppp/8/8/8/8/PPPPPPPP/2K3R1        c        b        g
       -1        2k4r/pppppppp/8/8/8/8/PPPPPPPP/2K4R        c        a        h
       -1        2k4r/pppppppp/8/8/8/8/PPPPPPPP/2K4R        c        b        h
       -1        2kr4/pppppppp/8/8/8/8/PPPPPPPP/2KR4        c        a        d
       -1        2kr4/pppppppp/8/8/8/8/PPPPPPPP/2KR4        c        b        d
       -1        3k1r2/pppppppp/8/8/8/8/PPPPPPPP/3K1R2        d        a        f
       -1        3k1r2/pppppppp/8/8/8/8/PPPPPPPP/3K1R2        d        b        f
       -1        3k1r2/pppppppp/8/8/8/8/PPPPPPPP/3K1R2        d        c        f
       -1        3k2r1/pppppppp/8/8/8/8/PPPPPPPP/3K2R1        d        a        g
       -1        3k2r1/pppppppp/8/8/8/8/PPPPPPPP/3K2R1        d        b        g
       -1        3k2r1/pppppppp/8/8/8/8/PPPPPPPP/3K2R1        d        c        g
       -1        3k3r/pppppppp/8/8/8/8/PPPPPPPP/3K3R        d        a        h
       -1        3k3r/pppppppp/8/8/8/8/PPPPPPPP/3K3R        d        b        h
       -1        3k3r/pppppppp/8/8/8/8/PPPPPPPP/3K3R        d        c        h
       -1        3kr3/pppppppp/8/8/8/8/PPPPPPPP/3KR3        d        a        e
       -1        3kr3/pppppppp/8/8/8/8/PPPPPPPP/3KR3        d        b        e
       -1        3kr3/pppppppp/8/8/8/8/PPPPPPPP/3KR3        d        c        e
       -1        4k1r1/pppppppp/8/8/8/8/PPPPPPPP/4K1R1        e        a        g
       -1        4k1r1/pppppppp/8/8/8/8/PPPPPPPP/4K1R1        e        b        g
       -1        4k1r1/pppppppp/8/8/8/8/PPPPPPPP/4K1R1        e        c        g
       -1        4k1r1/pppppppp/8/8/8/8/PPPPPPPP/4K1R1        e        d        g
       -1        4k2r/pppppppp/8/8/8/8/PPPPPPPP/4K2R        e        a        h
       -1        4k2r/pppppppp/8/8/8/8/PPPPPPPP/4K2R        e        b        h
       -1        4k2r/pppppppp/8/8/8/8/PPPPPPPP/4K2R        e        c        h
       -1        4k2r/pppppppp/8/8/8/8/PPPPPPPP/4K2R        e        d        h
       -1        4kr2/pppppppp/8/8/8/8/PPPPPPPP/4KR2        e        a        f
       -1        4kr2/pppppppp/8/8/8/8/PPPPPPPP/4KR2        e        b        f
       -1        4kr2/pppppppp/8/8/8/8/PPPPPPPP/4KR2        e        c        f
       -1        4kr2/pppppppp/8/8/8/8/PPPPPPPP/4KR2        e        d        f
       -1        5k1r/pppppppp/8/8/8/8/PPPPPPPP/5K1R        f        a        h
       -1        5k1r/pppppppp/8/8/8/8/PPPPPPPP/5K1R        f        b        h
       -1        5k1r/pppppppp/8/8/8/8/PPPPPPPP/5K1R        f        c        h
       -1        5k1r/pppppppp/8/8/8/8/PPPPPPPP/5K1R        f        d        h
       -1        5k1r/pppppppp/8/8/8/8/PPPPPPPP/5K1R        f        e        h
       -1        5kr1/pppppppp/8/8/8/8/PPPPPPPP/5KR1        f        a        g
       -1        5kr1/pppppppp/8/8/8/8/PPPPPPPP/5KR1        f        b        g
       -1        5kr1/pppppppp/8/8/8/8/PPPPPPPP/5KR1        f        c        g
       -1        5kr1/pppppppp/8/8/8/8/PPPPPPPP/5KR1        f        d        g
       -1        5kr1/pppppppp/8/8/8/8/PPPPPPPP/5KR1        f        e        g
       -1        6kr/pppppppp/8/8/8/8/PPPPPPPP/6KR        g        a        h
       -1        6kr/pppppppp/8/8/8/8/PPPPPPPP/6KR        g        b        h
       -1        6kr/pppppppp/8/8/8/8/PPPPPPPP/6KR        g        c        h
       -1        6kr/pppppppp/8/8/8/8/PPPPPPPP/6KR        g        d        h
       -1        6kr/pppppppp/8/8/8/8/PPPPPPPP/6KR        g        e        h
       -1        6kr/pppppppp/8/8/8/8/PPPPPPPP/6KR        g        f        h
       +
       +        if test "$kingside" = "1"; then
       +                expect="1. ... O-O"
       +        else
       +                expect="1. ... O-O-O"
       +        fi
       +        testpgn "Chess960 position, $fullfen (black), $move" \
       +                "$expect" \
       +                "$fullfen" \
       +                "$move"
       +done <<!
       +0        1R1K4        d        b        e
       +0        1R1K4        d        b        f
       +0        1R1K4        d        b        g
       +0        1R1K4        d        b        h
       +0        1R2K3        e        b        f
       +0        1R2K3        e        b        g
       +0        1R2K3        e        b        h
       +0        1R3K2        f        b        g
       +0        1R3K2        f        b        h
       +0        1R4K1        g        b        h
       +0        1RK5        c        b        d
       +0        1RK5        c        b        e
       +0        1RK5        c        b        f
       +0        1RK5        c        b        g
       +0        1RK5        c        b        h
       +0        2R1K3        e        c        f
       +0        2R1K3        e        c        g
       +0        2R1K3        e        c        h
       +0        2R2K2        f        c        g
       +0        2R2K2        f        c        h
       +0        2R3K1        g        c        h
       +0        2RK4        d        c        e
       +0        2RK4        d        c        f
       +0        2RK4        d        c        g
       +0        2RK4        d        c        h
       +0        3R1K2        f        d        g
       +0        3R1K2        f        d        h
       +0        3R2K1        g        d        h
       +0        3RK3        e        d        f
       +0        3RK3        e        d        g
       +0        3RK3        e        d        h
       +0        4R1K1        g        e        h
       +0        4RK2        f        e        g
       +0        4RK2        f        e        h
       +0        5RK1        g        f        h
       +0        R1K5        c        a        d
       +0        R1K5        c        a        e
       +0        R1K5        c        a        f
       +0        R1K5        c        a        g
       +0        R1K5        c        a        h
       +0        R2K4        d        a        e
       +0        R2K4        d        a        f
       +0        R2K4        d        a        g
       +0        R2K4        d        a        h
       +0        R3K3        e        a        f
       +0        R3K3        e        a        g
       +0        R3K3        e        a        h
       +0        R4K2        f        a        g
       +0        R4K2        f        a        h
       +0        R5K1        g        a        h
       +0        RK6        b        a        c
       +0        RK6        b        a        d
       +0        RK6        b        a        e
       +0        RK6        b        a        f
       +0        RK6        b        a        g
       +0        RK6        b        a        h
       +1        1K1R4        b        a        d
       +1        1K2R3        b        a        e
       +1        1K3R2        b        a        f
       +1        1K4R1        b        a        g
       +1        1K5R        b        a        h
       +1        1KR5        b        a        c
       +1        2K1R3        c        a        e
       +1        2K1R3        c        b        e
       +1        2K2R2        c        a        f
       +1        2K2R2        c        b        f
       +1        2K3R1        c        a        g
       +1        2K3R1        c        b        g
       +1        2K4R        c        a        h
       +1        2K4R        c        b        h
       +1        2KR4        c        a        d
       +1        2KR4        c        b        d
       +1        3K1R2        d        a        f
       +1        3K1R2        d        b        f
       +1        3K1R2        d        c        f
       +1        3K2R1        d        a        g
       +1        3K2R1        d        b        g
       +1        3K2R1        d        c        g
       +1        3K3R        d        a        h
       +1        3K3R        d        b        h
       +1        3K3R        d        c        h
       +1        3KR3        d        a        e
       +1        3KR3        d        b        e
       +1        3KR3        d        c        e
       +1        4K1R1        e        a        g
       +1        4K1R1        e        b        g
       +1        4K1R1        e        c        g
       +1        4K1R1        e        d        g
       +1        4K2R        e        a        h
       +1        4K2R        e        b        h
       +1        4K2R        e        c        h
       +1        4K2R        e        d        h
       +1        4KR2        e        a        f
       +1        4KR2        e        b        f
       +1        4KR2        e        c        f
       +1        4KR2        e        d        f
       +1        5K1R        f        a        h
       +1        5K1R        f        b        h
       +1        5K1R        f        c        h
       +1        5K1R        f        d        h
       +1        5K1R        f        e        h
       +1        5KR1        f        a        g
       +1        5KR1        f        b        g
       +1        5KR1        f        c        g
       +1        5KR1        f        d        g
       +1        5KR1        f        e        g
       +1        6KR        g        a        h
       +1        6KR        g        b        h
       +1        6KR        g        c        h
       +1        6KR        g        d        h
       +1        6KR        g        e        h
       +1        6KR        g        f        h
        !
       +
       +if test "$statuscode" = "1"; then
       +        echo "$failed tests failed"
       +else
       +        echo "All tests OK"
       +fi
       +
       +exit "$statuscode"