111 lines
4 KiB
Rust
111 lines
4 KiB
Rust
use chess_engine::board::Board;
|
|
use chess_engine::movegen::sliders::generate_rook_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]
|
|
<<<<<<< HEAD
|
|
fn test_rook_moves_single_rook() {
|
|
=======
|
|
fn test_rook_moves_1() {
|
|
>>>>>>> origin/master
|
|
let fen_standard = "8/8/8/2b5/2Rb4/2b5/8/8 w - - 0 1";
|
|
let board = Board::from_fen(fen_standard);
|
|
let mut list = MoveList::new();
|
|
generate_rook_moves(&board, &mut list);
|
|
<<<<<<< HEAD
|
|
// This FEN has a White Rook at c4, and Black Bishops at c5, d4, and c3.
|
|
// It should be able to capture all three and move left to a4/b4.
|
|
assert_moves_equal(&list.to_string(), "c4a4 c4b4 c4c3 c4c5 c4d4");
|
|
}
|
|
|
|
#[test]
|
|
fn test_rook_moves_empty_board() {
|
|
let fen = "8/8/8/8/3R4/8/8/8 w - - 0 1";
|
|
let board = Board::from_fen(fen);
|
|
let mut list = MoveList::new();
|
|
generate_rook_moves(&board, &mut list);
|
|
let expected = "d4d1 d4d2 d4d3 d4d5 d4d6 d4d7 d4d8 d4a4 d4b4 d4c4 d4e4 d4f4 d4g4 d4h4";
|
|
assert_moves_equal(&list.to_string(), expected);
|
|
}
|
|
|
|
#[test]
|
|
fn test_rook_moves_corner_blocked_black() {
|
|
let fen = "r6k/1p6/8/8/8/8/8/K7 b - - 0 1";
|
|
let board = Board::from_fen(fen);
|
|
let mut list = MoveList::new();
|
|
generate_rook_moves(&board, &mut list);
|
|
// Black rook at a8. Friendly king at h8, friendly pawn at b7.
|
|
// Rook can move down the a-file and right along the 8th rank, stopping before h8.
|
|
let expected = "a8a7 a8a6 a8a5 a8a4 a8a3 a8a2 a8a1 a8b8 a8c8 a8d8 a8e8 a8f8 a8g8";
|
|
assert_moves_equal(&list.to_string(), expected);
|
|
}
|
|
|
|
#[test]
|
|
fn test_rook_moves_double_rooks_friendly_block() {
|
|
let fen = "8/8/8/8/R3R3/8/8/8 w - - 0 1";
|
|
let board = Board::from_fen(fen);
|
|
let mut list = MoveList::new();
|
|
generate_rook_moves(&board, &mut list);
|
|
// Rooks at a4 and e4. They block each other horizontally.
|
|
// Rook a4 moves a1-a8 and b4, c4, d4.
|
|
// Rook e4 moves e1-e8, f4, g4, h4 AND d4, c4, b4.
|
|
let expected = "a4a1 a4a2 a4a3 a4a5 a4a6 a4a7 a4a8 a4b4 a4c4 a4d4 \
|
|
e4e1 e4e2 e4e3 e4e5 e4e6 e4e7 e4e8 e4f4 e4g4 e4h4 \
|
|
e4d4 e4c4 e4b4";
|
|
assert_moves_equal(&list.to_string(), expected);
|
|
}
|
|
|
|
#[test]
|
|
fn test_rook_moves_capture_stops_movegen() {
|
|
let fen = "r7/P7/8/8/8/8/8/8 b - - 0 1";
|
|
let board = Board::from_fen(fen);
|
|
let mut list = MoveList::new();
|
|
generate_rook_moves(&board, &mut list);
|
|
// Black rook at a8, White pawn at a7.
|
|
// The rook can capture at a7, but cannot move past it.
|
|
// It can still move horizontally.
|
|
let expected = "a8a7 a8b8 a8c8 a8d8 a8e8 a8f8 a8g8 a8h8";
|
|
assert_moves_equal(&list.to_string(), expected);
|
|
}
|
|
|
|
#[test]
|
|
fn test_rook_moves_completely_blocked_friendly() {
|
|
let fen = "8/8/8/1P6/PRP5/1P6/8/8 w - - 0 1";
|
|
let board = Board::from_fen(fen);
|
|
let mut list = MoveList::new();
|
|
generate_rook_moves(&board, &mut list);
|
|
// White rook at b4.
|
|
// Blocked by P(b5), P(b3), P(a4), P(c4).
|
|
// Should have 0 moves.
|
|
assert_moves_equal(&list.to_string(), "");
|
|
}
|
|
|
|
#[test]
|
|
fn test_rook_moves_ignores_absolute_pin() {
|
|
let fen = "r3k3/8/8/8/R3K3/8/8/8 w - - 0 1";
|
|
let board = Board::from_fen(fen);
|
|
let mut list = MoveList::new();
|
|
generate_rook_moves(&board, &mut list);
|
|
// White rook at a4 is absolutely pinned to King at e4 by Black rook at a8.
|
|
// A pseudo-legal generator should *ignore* the pin.
|
|
// It should generate vertical moves (including capture at a8)
|
|
// and horizontal moves (stopping before the friendly King at e4).
|
|
let expected = "a4a1 a4a2 a4a3 a4a5 a4a6 a4a7 a4a8 a4b4 a4c4 a4d4";
|
|
assert_moves_equal(&list.to_string(), expected);
|
|
}
|
|
=======
|
|
// King is completely blocked in the start position
|
|
assert_moves_equal(&list.to_string(), "");
|
|
}
|
|
>>>>>>> origin/master
|