chess-engine/ChessEngine/tests/queen_move_generation.rs
2025-11-12 18:09:51 +01:00

93 lines
3.5 KiB
Rust

use chess_engine::board::Board;
use chess_engine::movegen::sliders::generate_queen_moves;
use chess_engine::r#move::MoveList;
/// Compares two move list strings ignoring the order of moves.
fn assert_moves_equal(actual_str: &str, expected_str: &str) {
let mut actual_moves: Vec<&str> = actual_str.split_whitespace().collect();
let mut expected_moves: Vec<&str> = expected_str.split_whitespace().collect();
actual_moves.sort();
expected_moves.sort();
assert_eq!(actual_moves, expected_moves);
}
#[test]
fn test_queen_moves_single_rook() {
let fen_standard = "8/1Q2p3/8/8/8/8/6p1/8 w - - 0 1";
let board = Board::from_fen(fen_standard);
let mut list = MoveList::new();
generate_queen_moves(&board, &mut list);
assert_moves_equal(&list.to_string(), "b7a8 b7a7 b7a6 b7b8 b7b6 b7b5 b7b4 b7b3 b7b2 b7b1 b7c8 b7c7 b7c6 b7d7 b7e7 b7d5 b7e4 b7f3 b7g2");
}
#[test]
fn test_queen_center_open() {
// Queen in the center, open board, should generate 27 moves
let fen = "4k3/8/8/8/3Q4/8/8/4K3 w - - 0 1";
let board = Board::from_fen(fen);
let mut list = MoveList::new();
generate_queen_moves(&board, &mut list);
let expected = "d4a1 d4b2 d4c3 d4e5 d4f6 d4g7 d4h8 \
d4a4 d4b4 d4c4 d4e4 d4f4 d4g4 d4h4 \
d4d1 d4d2 d4d3 d4d5 d4d6 d4d7 d4d8 \
d4a7 d4b6 d4c5 d4e3 d4f2 d4g1";
assert_moves_equal(&list.to_string(), expected);
}
#[test]
fn test_queen_corner_blocked_friendly() {
// Queen in corner, completely blocked by friendly pieces
let fen = "rnbqkbnr/pppppppp/8/8/8/8/PP1PP1PP/QNBQKBNR w Kkq - 0 1";
let board = Board::from_fen(fen);
let mut list = MoveList::new();
generate_queen_moves(&board, &mut list);
assert_moves_equal(&list.to_string(), "d1a4 d1b3 d1c2");
}
#[test]
fn test_queen_multiple_captures_black() {
// Black queen on h8, with multiple white pieces to capture
let fen = "q3k3/P1P1P1P1/8/8/8/P1P1P1P1/8/4K3 b - - 0 1";
let board = Board::from_fen(fen);
let mut list = MoveList::new();
generate_queen_moves(&board, &mut list);
let expected = "a8b8 a8c8 a8d8 a8a7 a8b7 a8c6 a8d5 a8e4 a8f3 a8g2 a8h1";
assert_moves_equal(&list.to_string(), expected);
}
#[test]
fn test_multiple_queens() {
let fen = "4k3/8/8/8/8/8/8/Q3K2Q w - - 0 1";
let board = Board::from_fen(fen);
let mut list = MoveList::new();
generate_queen_moves(&board, &mut list);
let expected = "a1a2 a1a3 a1a4 a1a5 a1a6 a1a7 a1a8 a1b1 a1c1 a1d1 a1b2 a1c3 a1d4 a1e5 a1f6 a1g7 a1h8 \
h1h2 h1h3 h1h4 h1h5 h1h6 h1h7 h1h8 h1g1 h1f1 h1g2 h1f3 h1e4 h1d5 h1c6 h1b7 h1a8";
assert_moves_equal(&list.to_string(), expected);
}
#[test]
fn test_queen_rook_only() {
// Queen on d4, bishop moves blocked by friendly pawns
let fen = "4k3/8/8/2P1P3/3Q4/2P1P3/8/4K3 w - - 0 1";
let board = Board::from_fen(fen);
let mut list = MoveList::new();
generate_queen_moves(&board, &mut list);
let expected = "d4a4 d4b4 d4c4 d4e4 d4f4 d4g4 d4h4 \
d4d1 d4d2 d4d3 d4d5 d4d6 d4d7 d4d8";
assert_moves_equal(&list.to_string(), expected);
}
#[test]
fn test_queen_bishop_only() {
// Queen on d4, rook moves blocked by friendly pawns
let fen = "4k3/8/8/3P4/2PQP3/3P4/8/4K3 w - - 0 1";
let board = Board::from_fen(fen);
let mut list = MoveList::new();
generate_queen_moves(&board, &mut list);
let expected = "d4a1 d4b2 d4c3 d4e5 d4f6 d4g7 d4h8 \
d4a7 d4b6 d4c5 d4e3 d4f2 d4g1";
assert_moves_equal(&list.to_string(), expected);
}