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,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
pub enum CgbModel {
Cgb0,
CgbA,
CgbB,
CgbC,
CgbD,
#[default]
CgbE,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CgbBootVariant {
Cgb0,
Production,
}
impl CgbModel {
pub fn boot_variant(self) -> CgbBootVariant {
match self {
Self::Cgb0 => CgbBootVariant::Cgb0,
Self::CgbA | Self::CgbB | Self::CgbC | Self::CgbD | Self::CgbE => {
CgbBootVariant::Production
}
}
}
pub fn parse(value: &str) -> Option<Self> {
match value.trim().to_ascii_lowercase().as_str() {
"cgb-0" => Some(Self::Cgb0),
"cgb-a" => Some(Self::CgbA),
"cgb-b" => Some(Self::CgbB),
"cgb-c" => Some(Self::CgbC),
"cgb-d" => Some(Self::CgbD),
"cgb-e" => Some(Self::CgbE),
_ => 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));
}
#[test]
fn test_cgb_boot_variant_cgb0_is_cgb0() {
assert_eq!(CgbModel::Cgb0.boot_variant(), CgbBootVariant::Cgb0);
}
#[test]
fn test_cgb_boot_variant_cgb_a_is_production() {
assert_eq!(CgbModel::CgbA.boot_variant(), CgbBootVariant::Production);
}
#[test]
fn test_cgb_boot_variant_cgb_b_is_production() {
assert_eq!(CgbModel::CgbB.boot_variant(), CgbBootVariant::Production);
}
#[test]
fn test_cgb_boot_variant_cgb_c_is_production() {
assert_eq!(CgbModel::CgbC.boot_variant(), CgbBootVariant::Production);
}
#[test]
fn test_cgb_boot_variant_cgb_d_is_production() {
assert_eq!(CgbModel::CgbD.boot_variant(), CgbBootVariant::Production);
}
#[test]
fn test_cgb_boot_variant_cgb_e_is_production() {
assert_eq!(CgbModel::CgbE.boot_variant(), CgbBootVariant::Production);
}
#[test]
fn test_default_cgb_is_cgb_e() {
assert_eq!(CgbModel::default(), CgbModel::CgbE);
}
#[test]
fn test_cgb_parse_cgb_0() {
assert_eq!(CgbModel::parse("cgb-0"), Some(CgbModel::Cgb0));
}
#[test]
fn test_cgb_parse_cgb_a() {
assert_eq!(CgbModel::parse("cgb-a"), Some(CgbModel::CgbA));
}
#[test]
fn test_cgb_parse_cgb_b() {
assert_eq!(CgbModel::parse("cgb-b"), Some(CgbModel::CgbB));
}
#[test]
fn test_cgb_parse_cgb_c() {
assert_eq!(CgbModel::parse("cgb-c"), Some(CgbModel::CgbC));
}
#[test]
fn test_cgb_parse_cgb_d() {
assert_eq!(CgbModel::parse("cgb-d"), Some(CgbModel::CgbD));
}
#[test]
fn test_cgb_parse_cgb_e() {
assert_eq!(CgbModel::parse("cgb-e"), Some(CgbModel::CgbE));
}
#[test]
fn test_cgb_parse_case_insensitive() {
assert_eq!(CgbModel::parse("CGB-0"), Some(CgbModel::Cgb0));
assert_eq!(CgbModel::parse("Cgb-A"), Some(CgbModel::CgbA));
assert_eq!(CgbModel::parse("CGB-E"), Some(CgbModel::CgbE));
}
#[test]
fn test_cgb_parse_handles_whitespace() {
assert_eq!(CgbModel::parse(" cgb-b "), Some(CgbModel::CgbB));
assert_eq!(CgbModel::parse("\tcgb-0\n"), Some(CgbModel::Cgb0));
}
#[test]
fn test_cgb_parse_invalid_returns_none() {
assert_eq!(CgbModel::parse("cgb"), None);
assert_eq!(CgbModel::parse("cgb-f"), None);
assert_eq!(CgbModel::parse("invalid"), None);
assert_eq!(CgbModel::parse(""), None);
}
}