#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum RepetitionState {
#[default]
None,
Win,
Lose,
Draw,
Superior,
Inferior,
}
pub(crate) const REPETITION_COUNT: usize = 6;
impl RepetitionState {
pub const COUNT: usize = REPETITION_COUNT;
#[must_use]
pub const fn to_usi(self) -> &'static str {
match self {
Self::None => "rep_none",
Self::Win => "rep_win",
Self::Lose => "rep_lose",
Self::Draw => "rep_draw",
Self::Superior => "rep_sup",
Self::Inferior => "rep_inf",
}
}
}
impl std::fmt::Display for RepetitionState {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.to_usi())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_repetition_state_derives() {
let state = RepetitionState::Win;
let cloned = state;
assert_eq!(state, cloned);
let state2 = RepetitionState::Lose;
let copied = state2;
assert_eq!(state2, copied);
assert_eq!(RepetitionState::None, RepetitionState::None);
assert_ne!(RepetitionState::Win, RepetitionState::Lose);
let debug_str = format!("{:?}", RepetitionState::Draw);
assert_eq!(debug_str, "Draw");
}
#[test]
fn test_all_states_are_unique() {
let states = [
RepetitionState::None,
RepetitionState::Win,
RepetitionState::Lose,
RepetitionState::Draw,
RepetitionState::Superior,
RepetitionState::Inferior,
];
for (i, state1) in states.iter().enumerate() {
for (j, state2) in states.iter().enumerate() {
if i == j {
assert_eq!(state1, state2);
} else {
assert_ne!(state1, state2);
}
}
}
}
#[test]
fn test_default_is_none() {
let state = RepetitionState::default();
assert_eq!(state, RepetitionState::None);
}
#[test]
fn test_repetition_state_usi_string() {
assert_eq!(RepetitionState::None.to_usi(), "rep_none");
assert_eq!(RepetitionState::Win.to_usi(), "rep_win");
assert_eq!(RepetitionState::Lose.to_usi(), "rep_lose");
assert_eq!(RepetitionState::Draw.to_usi(), "rep_draw");
assert_eq!(RepetitionState::Superior.to_usi(), "rep_sup");
assert_eq!(RepetitionState::Inferior.to_usi(), "rep_inf");
}
}