use std::fmt;
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum GameStatus {
InProgress,
Draw(DrawReason),
WhiteWins(WinReason),
BlackWins(WinReason),
}
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum DrawReason {
Stalemate,
InsufficientMaterial,
ThreefoldRepetition,
FiftyMoveRule,
Agreement,
}
impl fmt::Display for DrawReason {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
DrawReason::Stalemate => write!(f, "Stalemate"),
DrawReason::InsufficientMaterial => write!(f, "Insufficient material"),
DrawReason::ThreefoldRepetition => write!(f, "Threefold repetition"),
DrawReason::FiftyMoveRule => write!(f, "Fifty move rule"),
DrawReason::Agreement => write!(f, "Agreement"),
}
}
}
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum WinReason {
Checkmate,
Resignation,
Time,
}
impl fmt::Display for WinReason {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
WinReason::Checkmate => write!(f, "Checkmate"),
WinReason::Resignation => write!(f, "Resignation"),
WinReason::Time => write!(f, "Time"),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_game_status_display() {
let mut draw_reason = DrawReason::Stalemate;
assert_eq!(draw_reason.to_string(), "Stalemate");
draw_reason = DrawReason::InsufficientMaterial;
assert_eq!(draw_reason.to_string(), "Insufficient material");
draw_reason = DrawReason::ThreefoldRepetition;
assert_eq!(draw_reason.to_string(), "Threefold repetition");
draw_reason = DrawReason::FiftyMoveRule;
assert_eq!(draw_reason.to_string(), "Fifty move rule");
draw_reason = DrawReason::Agreement;
assert_eq!(draw_reason.to_string(), "Agreement");
let mut win_reason = WinReason::Checkmate;
assert_eq!(win_reason.to_string(), "Checkmate");
win_reason = WinReason::Resignation;
assert_eq!(win_reason.to_string(), "Resignation");
win_reason = WinReason::Time;
assert_eq!(win_reason.to_string(), "Time");
}
}