Chess-Plisco
view release on metacpan or search on metacpan
t/04move-generator.t view on Meta::CPAN
#! /usr/bin/env perl
# Copyright (C) 2021-2025 Guido Flohr <guido.flohr@cantanea.com>,
# all rights reserved.
# This program is free software. It comes without any warranty, to
# the extent permitted by applicable law. You can redistribute it
# and/or modify it under the terms of the Do What the Fuck You Want
# to Public License, Version 2, as published by Sam Hocevar. See
# http://www.wtfpl.net/ for more details.
use strict;
use integer;
use Test::More;
use Data::Dumper;
use Chess::Plisco qw(:all);
# Macros from Chess::Plisco::Macro are already expanded here!
my ($pos, @moves, @expect);
my @tests = (
# Castlings.
{
name => 'white castlings',
fen => 'r3k2r/p6p/p6p/8/8/P6P/P6P/R3K2R w KQkq - 0 1',
moves => [qw(e1g1 e1c1 e1d1 e1d2 e1e2 e1f2 e1f1
a3a4 h3h4 a1b1 a1c1 a1d1 h1g1 h1f1)],
},
{
name => 'black castlings',
fen => 'r3k2r/p6p/p6p/8/8/P6P/P6P/R3K2R b KQkq - 0 1',
moves => [qw(e8g8 e8c8 e8d8 e8d7 e8e7 e8f7 e8f8
a6a5 h6h5 a8b8 a8c8 a8d8 h8g8 h8f8)],
},
{
name => 'lost white king-side castling',
fen => 'r3k2r/p6p/p6p/8/8/P6P/P6P/R3K2R w Qkq - 0 1',
moves => [qw(e1c1 e1d1 e1d2 e1e2 e1f2 e1f1
a3a4 h3h4 a1b1 a1c1 a1d1 h1g1 h1f1)],
},
{
name => 'lost black king-side castling',
fen => 'r3k2r/p6p/p6p/8/8/P6P/P6P/R3K2R b KQq - 0 1',
moves => [qw(e8c8 e8d8 e8d7 e8e7 e8f7 e8f8
a6a5 h6h5 a8b8 a8c8 a8d8 h8g8 h8f8)],
},
{
name => 'lost white queen-side castling',
fen => 'r3k2r/p6p/p6p/8/8/P6P/P6P/R3K2R w Kkq - 0 1',
moves => [qw(e1g1 e1d1 e1d2 e1e2 e1f2 e1f1
a3a4 h3h4 a1b1 a1c1 a1d1 h1g1 h1f1)],
},
{
name => 'lost black queen-side castling',
fen => 'r3k2r/p6p/p6p/8/8/P6P/P6P/R3K2R b KQk - 0 1',
moves => [qw(e8g8 e8d8 e8d7 e8e7 e8f7 e8f8
a6a5 h6h5 a8b8 a8c8 a8d8 h8g8 h8f8)],
},
{
name => 'white king blocked for king-side castling',
fen => 'r3kn1r/p6p/p6p/8/8/P6P/P6P/R3KN1R w KQkq - 0 1',
moves => [qw(e1c1 e1d1 e1d2 e1e2 e1f2
a3a4 h3h4 a1b1 a1c1 a1d1 h1g1
f1d2 f1e3 f1g3)],
},
{
name => 'black king blocked for king-side castling',
fen => 'r3kn1r/p6p/p6p/8/8/P6P/P6P/R3KN1R b KQkq - 0 1',
moves => [qw(e8c8 e8d8 e8d7 e8e7 e8f7
a6a5 h6h5 a8b8 a8c8 a8d8 h8g8
f8d7 f8e6 f8g6)],
},
{
name => 'white king blocked for queen-side castling',
fen => 'r2nk2r/p6p/p6p/8/8/P6P/P6P/R2NK2R w KQkq - 0 1',
moves => [qw(e1g1 e1d2 e1e2 e1f2 e1f1
a3a4 h3h4 a1b1 a1c1 h1g1 h1f1
d1b2 d1c3 d1e3 d1f2)],
},
{
name => 'black king blocked for queen-side castling',
fen => 'r2nk2r/p6p/p6p/8/8/P6P/P6P/R2NK2R b KQkq - 0 1',
moves => [qw(e8g8 e8d7 e8e7 e8f7 e8f8
a6a5 h6h5 a8b8 a8c8 h8g8 h8f8
d8b7 d8c6 d8e6 d8f7)],
},
{
name => 'white king target blocked for king-side castling',
fen => 'r3k1nr/p6p/p6p/8/8/P6P/P6P/R3K1NR w KQkq - 0 1',
moves => [qw(e1c1 e1d1 e1d2 e1e2 e1f2 e1f1
a3a4 h3h4 a1b1 a1c1 a1d1
g1e2 g1f3)],
},
{
name => 'black king target blocked for king-side castling',
fen => 'r3k1nr/p6p/p6p/8/8/P6P/P6P/R3K1NR b KQkq - 0 1',
moves => [qw(e8c8 e8d8 e8d7 e8e7 e8f7 e8f8
a6a5 h6h5 a8b8 a8c8 a8d8
g8e7 g8f6)],
},
{
name => 'white king target blocked for queen-side castling',
fen => 'r1b1k2r/p6p/p6p/8/8/P6P/P6P/R1B1K2R w KQkq - 0 1',
moves => [qw(e1d1 e1d2 e1e2 e1f2 e1f1 e1g1
a3a4 h3h4 a1b1 h1g1 h1f1
c1b2 c1d2 c1e3 c1f4 c1g5 c1h6)],
},
{
name => 'black king target blocked for queen-side castling',
fen => 'r1b1k2r/p6p/p6p/8/8/P6P/P6P/R1B1K2R b KQkq - 0 1',
moves => [qw(e8d8 e8d7 e8e7 e8f7 e8f8 e8g8
a6a5 h6h5 a8b8 h8g8 h8f8
c8b7 c8d7 c8e6 c8f5 c8g4 c8h3)],
},
{
name => 'white rook blocked for queen-side castling',
fen => 'rn2k2r/p6p/p6p/8/8/P6P/P6P/RN2K2R w KQkq - 0 1',
moves => [qw(e1g1 e1d1 e1d2 e1e2 e1f2 e1f1
a3a4 h3h4 h1g1 h1f1
b1c3 b1d2)],
},
{
name => 'black rook blocked for queen-side castling',
fen => 'rn2k2r/p6p/p6p/8/8/P6P/P6P/RN2K2R b KQkq - 0 1',
moves => [qw(e8g8 e8d8 e8d7 e8e7 e8f7 e8f8
a6a5 h6h5 h8g8 h8f8
b8c6 b8d7)],
},
# King moves.
{
name => 'lone white king on e2',
fen => '8/3k4/8/8/8/8/4K3/8 w - - 0 1',
moves => [qw(e2f2 e2f1 e2e1 e2d1 e2d2 e2d3 e2e3 e2f3)],
},
{
name => 'lone black king on d7',
fen => '8/3k4/8/8/8/8/4K3/8 b - - 0 1',
moves => [qw(d7e7 d7e6 d7d6 d7c6 d7c7 d7c8 d7d8 d7e8)],
},
{
name => 'lone white king on h1',
fen => '8/3k4/8/8/8/8/8/7K w - - 0 1',
moves => [qw(h1g1 h1g2 h1h2)],
},
{
name => 'lone black king on a8',
fen => 'k7/8/8/8/8/8/3K4/8 b - - 0 1',
moves => [qw(a8b8 a8b7 a8a7)],
},
{
name => 'lone white king on 1st rank',
fen => '3k4/8/8/8/8/8/8/4K3 w - - 0 1',
moves => [qw(e1d1 e1d2 e1e2 e1f2 e1f1)],
},
{
name => 'lone black king on 8th rank',
fen => '3k4/8/8/8/8/8/8/4K3 b - - 0 1',
moves => [qw(d8e8 d8e7 d8d7 d8c7 d8c8)],
},
{
name => 'lone white king on h file',
fen => '8/8/k7/8/8/7K/8/8 w - - 0 1',
moves => [qw(h3h2 h3g2 h3g3 h3g4 h3h4)],
},
{
name => 'lone black king on a file',
fen => '8/8/k7/8/8/7K/8/8 b - - 0 1',
moves => [qw(a6b6 a6b5 a6a5 a6a7 a6b7)],
},
# Knight moves.
{
name => 'knight on d5',
fen => '6nK/6PP/8/3N4/8/8/8/k7 w - - 0 1',
moves => [qw(h8g8 d5e7 d5f6 d5f4 d5e3 d5c3 d5b4 d5b6 d5c7
h7g8q h7g8r h7g8b h7g8n)],
},
{
name => 'knight on g4',
fen => '6nK/6PP/8/8/6N1/8/8/k7 w - - 0 1',
moves => [qw(h8g8 g4h6 g4h2 g4f2 g4e3 g4e5 g4f6
h7g8q h7g8r h7g8b h7g8n)],
},
{
( run in 0.616 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )