use std::fmt;
use super::Team;
#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum GameStatus {
InProgress,
Draw,
Won(Team),
}
impl GameStatus {
#[inline]
#[must_use]
pub const fn is_over(&self) -> bool {
!matches!(self, Self::InProgress)
}
}
impl Default for GameStatus {
#[inline]
fn default() -> Self {
Self::InProgress
}
}
impl fmt::Display for GameStatus {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Self::InProgress => write!(f, "In Progress"),
Self::Draw => write!(f, "Draw"),
Self::Won(team) => write!(f, "Won by {team}"),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn is_over_returns_false_for_in_progress() {
assert!(!GameStatus::InProgress.is_over());
}
#[test]
fn is_over_returns_true_for_draw() {
assert!(GameStatus::Draw.is_over());
}
#[test]
fn is_over_returns_true_for_won() {
assert!(GameStatus::Won(Team::White).is_over());
assert!(GameStatus::Won(Team::Black).is_over());
}
#[test]
fn display_in_progress() {
assert_eq!(format!("{}", GameStatus::InProgress), "In Progress");
}
#[test]
fn display_draw() {
assert_eq!(format!("{}", GameStatus::Draw), "Draw");
}
#[test]
fn display_won() {
assert_eq!(format!("{}", GameStatus::Won(Team::White)), "Won by White");
assert_eq!(format!("{}", GameStatus::Won(Team::Black)), "Won by Black");
}
#[test]
fn default_is_in_progress() {
assert_eq!(GameStatus::default(), GameStatus::InProgress);
}
}