use std::collections::{HashMap, HashSet};
use super::assertion_helpers::render_equals_assertion;
use crate::core::ir::{EnumDef, EnumVariant, FieldDef, TypeDef, TypeRef};
use crate::e2e::field_access::FieldResolver;
use crate::e2e::fixture::Assertion;
fn renamed_enum_resolver() -> FieldResolver {
let type_defs = vec![TypeDef {
name: "Result".to_string(),
fields: vec![FieldDef {
name: "kind".to_string(),
ty: TypeRef::Named("NodeKind".to_string()),
..FieldDef::default()
}],
..TypeDef::default()
}];
let enums = vec![EnumDef {
name: "NodeKind".to_string(),
variants: vec![
EnumVariant {
name: "KeyValue".to_string(),
serde_rename: Some("key-value".to_string()),
..EnumVariant::default()
},
EnumVariant {
name: "Plain".to_string(),
..EnumVariant::default()
},
],
..EnumDef::default()
}];
let ir_enum_map = FieldResolver::ir_enum_fields(&type_defs, &enums);
FieldResolver::new(
&HashMap::new(),
&HashSet::new(),
&HashSet::new(),
&HashSet::new(),
&HashSet::new(),
)
.with_ir_enum_map(ir_enum_map, Some("Result".to_string()))
}
fn render_kind_equals(resolver: &FieldResolver, fixture_value: &str) -> String {
let assertion = Assertion {
assertion_type: "equals".to_string(),
field: Some("kind".to_string()),
value: Some(serde_json::Value::String(fixture_value.to_string())),
..Assertion::default()
};
let mut out = String::new();
render_equals_assertion(&mut out, &assertion, "result.kind", false, resolver);
out
}
#[test]
fn render_equals_assertion_renamed_enum_variant_compares_wire_value() {
let resolver = renamed_enum_resolver();
let renamed = render_kind_equals(&resolver, "key-value");
assert_eq!(
renamed, " assert_eq!(format!(\"{:?}\", result.kind), r#\"KeyValue\"#, \"equals assertion failed\");\n",
"the renamed variant's wire value must be reconciled to its Rust identifier, got: {renamed}"
);
let unrenamed = render_kind_equals(&resolver, "Plain");
assert_eq!(
unrenamed, " assert_eq!(format!(\"{:?}\", result.kind), r#\"Plain\"#, \"equals assertion failed\");\n",
"an unrenamed variant must keep its fixture literal verbatim, got: {unrenamed}"
);
let unknown = render_kind_equals(&resolver, "not-a-variant");
assert_eq!(
unknown, " assert_eq!(format!(\"{:?}\", result.kind), r#\"not-a-variant\"#, \"equals assertion failed\");\n",
"an unrecognized fixture value must not be rewritten, got: {unknown}"
);
assert_ne!(renamed, unrenamed);
assert_ne!(renamed, unknown);
}
#[test]
fn config_only_enum_classification_leaves_the_fixture_literal_untranslated() {
let resolver = FieldResolver::new(
&HashMap::new(),
&HashSet::new(),
&HashSet::new(),
&HashSet::new(),
&HashSet::new(),
)
.with_enum_fields(HashSet::from(["kind".to_string()]));
let out = render_kind_equals(&resolver, "key-value");
assert_eq!(
out, " assert_eq!(format!(\"{:?}\", result.kind), r#\"key-value\"#, \"equals assertion failed\");\n",
"no IR means no rename knowledge; the literal must be emitted verbatim, got: {out}"
);
}