use crate::prelude::*;
enumeration! {
pub Piece, [
Pawn, Knight, Bishop, Rook, Queen, King,
]
}
impl Piece {
pub const STEPS: [&'static [Direction]; Self::COUNT] = [
&[],
&[ Direction::NNW, Direction::NNE, Direction::ENE, Direction::ESE,
Direction::SSE, Direction::SSW, Direction::WSW, Direction::WNW ],
&[ Direction::NW, Direction::NE, Direction::SE, Direction::SW ],
&[ Direction::N, Direction::E, Direction::S, Direction::W ],
&[ Direction::NW, Direction::N, Direction::NE, Direction::E,
Direction::SE, Direction::S, Direction::SW, Direction::W ],
&[ Direction::NW, Direction::N, Direction::NE, Direction::E,
Direction::SE, Direction::S, Direction::SW, Direction::W ],
];
#[inline]
#[must_use]
pub const fn is_jumping(self) -> bool {
self == Self::Knight
}
#[inline]
#[must_use]
pub const fn is_sliding(self) -> bool {
self == Self::Bishop || self == Self::Rook || self == Self::Queen
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn is_jumping() {
refute!(Piece::Pawn .is_jumping());
assert!(Piece::Knight.is_jumping());
refute!(Piece::Bishop.is_jumping());
refute!(Piece::Rook .is_jumping());
refute!(Piece::Queen .is_jumping());
refute!(Piece::King .is_jumping());
}
#[test]
fn is_sliding() {
refute!(Piece::Pawn .is_sliding());
refute!(Piece::Knight.is_sliding());
assert!(Piece::Bishop.is_sliding());
assert!(Piece::Rook .is_sliding());
assert!(Piece::Queen .is_sliding());
refute!(Piece::King .is_sliding());
}
}