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.
109 lines
2.9 KiB
Rust
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(())
|
|
}
|