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 )