#![cfg(feature = "versioned")]
use rubo4e::current::{Geraetetyp, Sparte, Zaehlertyp};
use rubo4e::Bo4eEnum;
#[test]
fn variants_and_count_are_consistent() {
assert_eq!(Zaehlertyp::COUNT, Zaehlertyp::VARIANTS.len());
assert_eq!(Zaehlertyp::COUNT, 13);
assert!(!Zaehlertyp::VARIANTS.contains(&Zaehlertyp::Unknown));
}
#[test]
fn iter_known_matches_variants_and_excludes_unknown() {
let iterated: Vec<Zaehlertyp> = Zaehlertyp::iter_known().collect();
assert_eq!(iterated.as_slice(), Zaehlertyp::VARIANTS);
assert!(!iterated.contains(&Zaehlertyp::Unknown));
}
#[test]
fn trait_and_inherent_agree() {
assert_eq!(<Zaehlertyp as Bo4eEnum>::COUNT, Zaehlertyp::VARIANTS.len());
assert_eq!(<Zaehlertyp as Bo4eEnum>::VARIANTS, Zaehlertyp::VARIANTS);
}
fn wire_values<T: Bo4eEnum>() -> Vec<&'static str> {
T::VARIANTS.iter().map(|v| v.as_wire()).collect()
}
#[test]
fn generic_over_bo4e_enum() {
let sparten = wire_values::<Sparte>();
assert!(sparten.contains(&"STROM"));
assert!(sparten.contains(&"GAS"));
assert!(!sparten.contains(&"UNKNOWN"));
}
#[test]
fn from_wire_accepts_known_values() {
assert_eq!(
Zaehlertyp::from_wire("WASSERZAEHLER"),
Ok(Zaehlertyp::Wasserzaehler)
);
assert_eq!(
Zaehlertyp::from_wire("INTELLIGENTES_MESSSYSTEM"),
Ok(Zaehlertyp::IntelligentesMesssystem)
);
}
#[test]
fn from_wire_rejects_unknown_and_literal_unknown() {
let err = Zaehlertyp::from_wire("LFG").unwrap_err();
assert_eq!(err.value, "LFG");
assert!(Zaehlertyp::from_wire("UNKNOWN").is_err());
}
#[test]
fn round_trip_as_wire_from_wire() {
for &variant in Zaehlertyp::VARIANTS {
let wire = variant.as_wire();
assert_eq!(Zaehlertyp::from_wire(wire), Ok(variant));
}
assert_eq!(Zaehlertyp::Unknown.as_wire(), "UNKNOWN");
assert!(Zaehlertyp::from_wire(Zaehlertyp::Unknown.as_wire()).is_err());
}
#[test]
fn is_known_is_unknown() {
assert!(Zaehlertyp::Wasserzaehler.is_known());
assert!(!Zaehlertyp::Wasserzaehler.is_unknown());
assert!(Zaehlertyp::Unknown.is_unknown());
assert!(!Zaehlertyp::Unknown.is_known());
}
#[cfg(feature = "json")]
#[test]
fn lenient_decode_falls_through_but_is_detectable() {
let z: Zaehlertyp = serde_json::from_value(serde_json::json!("NOT_REAL")).unwrap();
assert_eq!(z, Zaehlertyp::Unknown);
assert!(z.is_unknown());
assert!(Zaehlertyp::from_wire("NOT_REAL").is_err());
}
#[test]
fn imsys_spelling_differs_across_bos() {
assert_eq!(
Zaehlertyp::IntelligentesMesssystem.as_wire(),
"INTELLIGENTES_MESSSYSTEM"
);
assert_eq!(
Geraetetyp::IntelligentesMessystem.as_wire(),
"INTELLIGENTES_MESSYSTEM"
);
assert!(Zaehlertyp::from_wire("INTELLIGENTES_MESSYSTEM").is_err());
assert!(Geraetetyp::from_wire("INTELLIGENTES_MESSSYSTEM").is_err());
}