use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum GbHardware {
Dmg,
Cgb,
Gba,
}
impl GbHardware {
pub fn parse(value: &str) -> Option<Self> {
match value.trim().to_ascii_lowercase().as_str() {
"dmg" => Some(Self::Dmg),
"cgb" => Some(Self::Cgb),
"gba" => Some(Self::Gba),
_ => None,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
pub enum DmgModel {
DmgA,
#[default]
DmgB,
DmgC,
Dmg0,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DmgBootVariant {
Production,
Dmg0,
}
impl DmgModel {
pub fn boot_variant(self) -> DmgBootVariant {
match self {
Self::DmgA | Self::DmgB | Self::DmgC => DmgBootVariant::Production,
Self::Dmg0 => DmgBootVariant::Dmg0,
}
}
pub fn parse(value: &str) -> Option<Self> {
match value.trim().to_ascii_lowercase().as_str() {
"dmg-0" => Some(Self::Dmg0),
"dmg-a" => Some(Self::DmgA),
"dmg-b" => Some(Self::DmgB),
"dmg-c" => Some(Self::DmgC),
_ => None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_boot_variant_dmg_a_is_production() {
assert_eq!(DmgModel::DmgA.boot_variant(), DmgBootVariant::Production);
}
#[test]
fn test_boot_variant_dmg_b_is_production() {
assert_eq!(DmgModel::DmgB.boot_variant(), DmgBootVariant::Production);
}
#[test]
fn test_boot_variant_dmg_c_is_production() {
assert_eq!(DmgModel::DmgC.boot_variant(), DmgBootVariant::Production);
}
#[test]
fn test_boot_variant_dmg_0_is_dmg0() {
assert_eq!(DmgModel::Dmg0.boot_variant(), DmgBootVariant::Dmg0);
}
#[test]
fn test_default_is_dmg_b() {
assert_eq!(DmgModel::default(), DmgModel::DmgB);
}
#[test]
fn test_parse_dmg_0() {
assert_eq!(DmgModel::parse("dmg-0"), Some(DmgModel::Dmg0));
}
#[test]
fn test_parse_dmg_a() {
assert_eq!(DmgModel::parse("dmg-a"), Some(DmgModel::DmgA));
}
#[test]
fn test_parse_dmg_b() {
assert_eq!(DmgModel::parse("dmg-b"), Some(DmgModel::DmgB));
}
#[test]
fn test_parse_dmg_c() {
assert_eq!(DmgModel::parse("dmg-c"), Some(DmgModel::DmgC));
}
#[test]
fn test_parse_case_insensitive() {
assert_eq!(DmgModel::parse("DMG-B"), Some(DmgModel::DmgB));
assert_eq!(DmgModel::parse("Dmg-A"), Some(DmgModel::DmgA));
}
#[test]
fn test_parse_invalid_returns_none() {
assert_eq!(DmgModel::parse("dmg"), None);
assert_eq!(DmgModel::parse("invalid"), None);
assert_eq!(DmgModel::parse(""), None);
}
#[test]
fn test_gb_hardware_parse_dmg() {
assert_eq!(GbHardware::parse("dmg"), Some(GbHardware::Dmg));
}
#[test]
fn test_gb_hardware_parse_cgb() {
assert_eq!(GbHardware::parse("cgb"), Some(GbHardware::Cgb));
}
#[test]
fn test_gb_hardware_parse_gba() {
assert_eq!(GbHardware::parse("gba"), Some(GbHardware::Gba));
}
#[test]
fn test_gb_hardware_parse_case_insensitive() {
assert_eq!(GbHardware::parse("DMG"), Some(GbHardware::Dmg));
assert_eq!(GbHardware::parse("Cgb"), Some(GbHardware::Cgb));
assert_eq!(GbHardware::parse("GBA"), Some(GbHardware::Gba));
}
#[test]
fn test_gb_hardware_parse_invalid_returns_none() {
assert_eq!(GbHardware::parse("invalid"), None);
assert_eq!(GbHardware::parse(""), None);
assert_eq!(GbHardware::parse("gameboy"), None);
}
#[test]
fn test_gb_hardware_parse_handles_whitespace() {
assert_eq!(GbHardware::parse(" cgb "), Some(GbHardware::Cgb));
assert_eq!(GbHardware::parse("\tdmg\n"), Some(GbHardware::Dmg));
assert_eq!(GbHardware::parse(" gba "), Some(GbHardware::Gba));
}
#[test]
fn test_dmg_model_parse_handles_whitespace() {
assert_eq!(DmgModel::parse(" dmg-b "), Some(DmgModel::DmgB));
assert_eq!(DmgModel::parse("\tdmg-0\n"), Some(DmgModel::Dmg0));
}
}