Implement a whole new move crate
This commit is contained in:
parent
0bedf2aa9f
commit
c55b7c4877
7 changed files with 512 additions and 148 deletions
104
moves/tests/flags.rs
Normal file
104
moves/tests/flags.rs
Normal file
|
@ -0,0 +1,104 @@
|
|||
// Eryn Wells <eryn@erynwells.me>
|
||||
|
||||
use chessfriend_core::{piece, Color, File, Shape, Square};
|
||||
use chessfriend_moves::{Builder, BuilderError, 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() -> Result<(), BuilderError> {
|
||||
let mv = Builder::push(&piece!(White Pawn on A4), Square::A5).build()?;
|
||||
assert_flags!(mv, true, false, false, false, false, false);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn move_flags_double_push() -> Result<(), BuilderError> {
|
||||
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() -> Result<(), BuilderError> {
|
||||
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() -> Result<(), BuilderError> {
|
||||
let mv = unsafe {
|
||||
Builder::new()
|
||||
.from(Square::A5)
|
||||
.capturing_en_passant_on(Square::B4)
|
||||
.build_unchecked()?
|
||||
};
|
||||
|
||||
assert_flags!(mv, false, false, true, true, false, false);
|
||||
assert_eq!(mv.origin_square(), Square::A5);
|
||||
assert_eq!(mv.target_square(), Square::B4);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn move_flags_promotion() -> Result<(), BuilderError> {
|
||||
let mv = Builder::push(&piece!(White Pawn on H7), 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() -> Result<(), BuilderError> {
|
||||
let mv = Builder::push(&piece!(White Pawn on H7), 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() -> Result<(), BuilderError> {
|
||||
let mv = Builder::castling(Castle::KingSide).build();
|
||||
|
||||
assert_flags!(mv, false, false, false, false, true, false);
|
||||
|
||||
Ok(())
|
||||
}
|
15
moves/tests/pushes.rs
Normal file
15
moves/tests/pushes.rs
Normal file
|
@ -0,0 +1,15 @@
|
|||
// Eryn Wells <eryn@erynwells.me>
|
||||
|
||||
use chessfriend_core::{piece, Square};
|
||||
use chessfriend_moves::{Builder, BuilderError};
|
||||
|
||||
#[test]
|
||||
fn pawn_push() -> Result<(), BuilderError> {
|
||||
let mv = Builder::push(&piece!(White Pawn on A3), Square::A4).build()?;
|
||||
|
||||
assert!(mv.is_quiet());
|
||||
assert_eq!(mv.origin_square(), Square::A3);
|
||||
assert_eq!(mv.target_square(), Square::A4);
|
||||
|
||||
Ok(())
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue