use mirage_engine::prelude::*;
#[derive(Part, Clone, Debug, Eq, Hash, PartialEq)]
enum HullPart {
Plating,
#[part("Hull Metal")]
#[part("hull-metal")]
Trim,
}
#[derive(Part, Clone, Debug, Eq, Hash, PartialEq)]
struct Skin;
#[test]
fn a_variant_answers_to_its_identifier_until_it_declares_a_name() {
assert_eq!(HullPart::from_name("Plating"), Some(HullPart::Plating));
assert_eq!(HullPart::from_name("Hull Metal"), Some(HullPart::Trim));
assert_eq!(
HullPart::from_name("hull-metal"),
Some(HullPart::Trim),
"and stack"
);
assert_eq!(
HullPart::from_name("Trim"),
None,
"a declared name replaces it"
);
assert_eq!(HullPart::from_name("Wing"), None);
}
#[test]
fn a_unit_struct_answers_to_its_own_name() {
assert_eq!(Skin::from_name("Skin"), Some(Skin));
assert_eq!(Skin::from_name("skin"), None, "names are matched exactly");
}
#[test]
fn every_variant_is_counted_once_in_order_however_many_names_it_answers_to() {
assert_eq!(HullPart::all(), vec![HullPart::Plating, HullPart::Trim]);
assert_eq!(
HullPart::all()
.iter()
.map(HullPart::index)
.collect::<Vec<_>>(),
vec![0, 1]
);
assert_eq!(Skin::all(), vec![Skin]);
assert_eq!(Skin.index(), 0);
}
#[test]
fn a_mesh_with_no_parts_resolves_no_name() {
assert_eq!(NoParts::from_name("Hull Metal"), None);
assert!(NoParts::all().is_empty(), "so startup asks nothing of it");
}