chessfriend/moves/tests/flags.rs
Eryn Wells 5f1fce6cc2 Fix the remaining tests
Well… all the tests except the Peter Ellis Jones tests.

Pass around whole EnPassant types instead of pulling out just the e.p. square.
Make sure that Castling moves have their target and origin squares populated.
Add a color field to the Castle move style to make this possible.
2024-02-25 12:38:55 -08:00

109 lines
2.9 KiB
Rust

// Eryn Wells <eryn@erynwells.me>
use chessfriend_core::{piece, Color, File, Shape, Square};
use chessfriend_moves::{testing::*, Builder, Castle, PromotionShape};
macro_rules! assert_flag {
($move:expr, $left:expr, $right:expr, $desc:expr) => {
assert_eq!($left, $right, "{:?} -> {}", $move, stringify!($desc))
};
}
macro_rules! assert_flags {
($move:expr, $quiet:expr, $double_push:expr, $en_passant:expr, $capture:expr, $castle:expr, $promotion:expr) => {
assert_flag!($move, $move.is_quiet(), $quiet, "is_quiet");
assert_flag!(
$move,
$move.is_double_push(),
$double_push,
"is_double_push"
);
assert_flag!($move, $move.is_en_passant(), $en_passant, "is_en_passant");
assert_flag!($move, $move.is_capture(), $capture, "is_capture");
assert_flag!($move, $move.is_castle(), $castle, "is_castle");
assert_flag!($move, $move.is_promotion(), $promotion, "is_promotion");
};
}
#[test]
fn move_flags_quiet() -> TestResult {
let mv = Builder::push(&piece!(White Pawn on A4))
.to(Square::A5)
.build()?;
assert_flags!(mv, true, false, false, false, false, false);
Ok(())
}
#[test]
fn move_flags_double_push() -> TestResult {
let mv = Builder::double_push(File::C, Color::White).build()?;
assert_flags!(mv, false, true, false, false, false, false);
Ok(())
}
#[test]
fn move_flags_capture() -> TestResult {
let mv = Builder::new()
.from(Square::A4)
.capturing_on(Square::B5)
.build()?;
assert_flags!(mv, false, false, false, true, false, false);
Ok(())
}
#[test]
fn move_flags_en_passant_capture() -> TestResult {
let mv = unsafe {
Builder::new()
.from(Square::A4)
.capturing_en_passant_on(Square::B3)
.build_unchecked()
};
assert_flags!(mv, false, false, true, true, false, false);
assert_eq!(mv.origin_square(), Square::A4);
assert_eq!(mv.target_square(), Square::B3);
assert_eq!(mv.capture_square(), Some(Square::B4));
Ok(())
}
#[test]
fn move_flags_promotion() -> TestResult {
let mv = Builder::push(&piece!(White Pawn on H7))
.to(Square::H8)
.promoting_to(PromotionShape::Queen)
.build()?;
assert_flags!(mv, false, false, false, false, false, true);
assert_eq!(mv.promotion(), Some(Shape::Queen));
Ok(())
}
#[test]
fn move_flags_capture_promotion() -> TestResult {
let mv = Builder::push(&piece!(White Pawn on H7))
.to(Square::H8)
.capturing_piece(&piece!(Black Knight on G8))
.promoting_to(PromotionShape::Queen)
.build()?;
assert_flags!(mv, false, false, false, true, false, true);
assert_eq!(mv.promotion(), Some(Shape::Queen));
Ok(())
}
#[test]
fn move_flags_castle() -> TestResult {
let mv = Builder::castling(Color::White, Castle::KingSide).build()?;
assert_flags!(mv, false, false, false, false, true, false);
Ok(())
}