use super::*;
use crate::core::ir::*;
#[test]
fn sanitized_struct_variant_field_binding_to_core_warns_and_defaults_on_bad_json() {
let mut enum_def = tests::simple_enum();
enum_def.variants = vec![EnumVariant {
name: "Remote".into(),
fields: vec![FieldDef {
name: "settings".into(),
ty: TypeRef::Named("RemoteSettings".into()),
sanitized: true,
..FieldDef::default()
}],
..EnumVariant::default()
}];
let result = gen_enum_from_binding_to_core_cfg(
&enum_def,
"my_crate",
&ConversionConfig {
binding_enums_have_data: true,
..ConversionConfig::default()
},
);
assert!(
result.contains("settings: match serde_json::from_str(&settings) {"),
"{result}"
);
assert!(result.contains("Ok(v) => v,"), "{result}");
assert!(
result.contains(
"tracing::warn!(variant = \"Remote\", field = \"settings\", value = %settings, error = %e, \
\"binding provided unparseable JSON for enum variant field; substituting default\");"
),
"{result}"
);
assert!(result.contains("Default::default()"), "{result}");
assert!(!result.contains("unwrap_or_default()"), "{result}");
}
#[test]
fn sanitized_tuple_variant_field_binding_to_core_warns_and_defaults_on_bad_json() {
let mut enum_def = tests::simple_enum();
enum_def.variants = vec![EnumVariant {
name: "Remote".into(),
is_tuple: true,
fields: vec![FieldDef {
name: "_0".into(),
ty: TypeRef::Named("RemoteSettings".into()),
sanitized: true,
..FieldDef::default()
}],
..EnumVariant::default()
}];
let result = gen_enum_from_binding_to_core_cfg(
&enum_def,
"my_crate",
&ConversionConfig {
binding_enums_have_data: true,
binding_tuple_form_for_variants: true,
..ConversionConfig::default()
},
);
assert!(result.contains("match serde_json::from_str(&_0) {"), "{result}");
assert!(result.contains("Ok(v) => v,"), "{result}");
assert!(
result.contains(
"tracing::warn!(variant = \"Remote\", field = \"_0\", value = %_0, error = %e, \
\"binding provided unparseable JSON for enum variant field; substituting default\");"
),
"{result}"
);
assert!(result.contains("Default::default()"), "{result}");
assert!(!result.contains("unwrap_or_default()"), "{result}");
}
#[test]
fn excluded_type_tuple_variant_field_binding_to_core_warns_and_defaults_on_bad_json() {
let mut enum_def = tests::simple_enum();
enum_def.variants = vec![EnumVariant {
name: "Remote".into(),
is_tuple: true,
fields: vec![FieldDef {
name: "_0".into(),
ty: TypeRef::Named("RemoteSettings".into()),
..FieldDef::default()
}],
..EnumVariant::default()
}];
let result = gen_enum_from_binding_to_core_cfg(
&enum_def,
"my_crate",
&ConversionConfig {
binding_enums_have_data: true,
binding_tuple_form_for_variants: true,
exclude_types: &["RemoteSettings".to_string()],
..ConversionConfig::default()
},
);
assert!(result.contains("match serde_json::from_str(&_0) {"), "{result}");
assert!(
result.contains(
"tracing::warn!(variant = \"Remote\", field = \"_0\", value = %_0, error = %e, \
\"binding provided unparseable JSON for enum variant field; substituting default\");"
),
"{result}"
);
assert!(result.contains("Default::default()"), "{result}");
assert!(!result.contains("unwrap_or_default()"), "{result}");
}