From 1e77bc5ebb53e23c1e6e188ea30b256b4a1573bc Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Sun, 28 Jan 2024 09:45:13 -0800 Subject: [PATCH] [board] Test to verify the king can't move into or stay in check Write a test on the king move generator to verify the king can't move to a square where it would still be in check. --- board/src/move_generator/king.rs | 38 +++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/board/src/move_generator/king.rs b/board/src/move_generator/king.rs index 1d0dda2..1f35af5 100644 --- a/board/src/move_generator/king.rs +++ b/board/src/move_generator/king.rs @@ -74,7 +74,7 @@ impl MoveGeneratorInternal for KingMoveGenerator { #[cfg(test)] mod tests { use super::*; - use crate::position; + use crate::{position, r#move::AlgebraicMoveFormatter, PositionBuilder}; use chessfriend_bitboard::bitboard; use chessfriend_core::{piece, Square}; use std::collections::HashSet; @@ -154,4 +154,40 @@ mod tests { generated_moves ); } + + #[test] + fn black_king_in_check_by_rook() { + let pos = PositionBuilder::new() + .place_piece(piece!(White King on E1)) + .place_piece(piece!(White Rook on E4)) + .place_piece(piece!(Black King on E7)) + .to_move(Color::Black) + .build(); + + assert!(pos.is_king_in_check()); + + let generator = KingMoveGenerator::new(&pos, Color::Black); + let generated_moves: HashSet = generator.iter().cloned().collect(); + + let king = piece!(Black King); + let from_square = Square::E7; + let expected_moves = HashSet::from_iter([ + MoveBuilder::new(king, from_square, Square::D6).build(), + MoveBuilder::new(king, from_square, Square::D7).build(), + MoveBuilder::new(king, from_square, Square::D8).build(), + MoveBuilder::new(king, from_square, Square::F6).build(), + MoveBuilder::new(king, from_square, Square::F7).build(), + MoveBuilder::new(king, from_square, Square::F8).build(), + ]); + + assert_eq!( + generated_moves, + expected_moves, + "Difference: {:?}", + generated_moves + .symmetric_difference(&expected_moves) + .map(|mv| format!("{}", AlgebraicMoveFormatter::new(mv, &pos))) + .collect::>() + ); + } }