use crate::codegen::naming::wire_variant_value;
use crate::core::ir::{EnumDef, EnumVariant};
use super::args::match_unit_enum_atom;
fn unit_enum(variant_name: &str, rename_all: Option<&str>) -> EnumDef {
EnumDef {
name: "ElementKind".to_string(),
variants: vec![EnumVariant {
name: variant_name.to_string(),
..EnumVariant::default()
}],
serde_rename_all: rename_all.map(str::to_string),
..EnumDef::default()
}
}
const STRATEGIES: &[Option<&str>] = &[
None,
Some("UPPERCASE"),
Some("SCREAMING_SNAKE_CASE"),
Some("not_a_real_strategy"),
Some("snake_case"),
Some("kebab-case"),
];
#[test]
fn match_unit_enum_atom_agrees_with_wire_variant_value_for_every_strategy() {
let variant_name = "ElementBased";
for rename_all in STRATEGIES {
let enum_def = unit_enum(variant_name, *rename_all);
let expected_wire = wire_variant_value(variant_name, None, *rename_all);
let value = serde_json::Value::String(expected_wire.clone());
let matched = match_unit_enum_atom(&value, &enum_def);
assert_eq!(
matched,
Some(":element_based".to_string()),
"rename_all={rename_all:?}: expected the wire value {expected_wire:?} produced by \
wire_variant_value to match variant `{variant_name}`, got {matched:?}"
);
}
}
#[test]
fn match_unit_enum_atom_rejects_a_value_that_does_not_match_wire_variant_value() {
let enum_def = unit_enum("ElementBased", None);
let value = serde_json::Value::String("element_based".to_string());
assert_eq!(match_unit_enum_atom(&value, &enum_def), None);
}