use super::super::types::{
gen_enum_free, gen_enum_from_i32_rs_helper, gen_enum_from_json, gen_enum_to_json, gen_enum_to_string,
};
use crate::core::ir::*;
const HOST_CRATE: &str = "sample_lib";
const PREFIX: &str = "sample_lib";
fn gated_enum() -> EnumDef {
EnumDef {
name: "ThumbnailKind".to_string(),
rust_path: format!("{HOST_CRATE}::thumbnails::ThumbnailKind"),
cfg: Some("feature = \"thumbnails\"".to_string()),
has_serde: true,
variants: vec![
EnumVariant {
name: "Small".to_string(),
..EnumVariant::default()
},
EnumVariant {
name: "Large".to_string(),
..EnumVariant::default()
},
],
..EnumDef::default()
}
}
fn ungated_enum() -> EnumDef {
EnumDef {
name: "PdfRenderMode".to_string(),
rust_path: format!("{HOST_CRATE}::PdfRenderMode"),
cfg: None,
has_serde: true,
variants: vec![
EnumVariant {
name: "Small".to_string(),
..EnumVariant::default()
},
EnumVariant {
name: "Large".to_string(),
..EnumVariant::default()
},
],
..EnumDef::default()
}
}
#[test]
fn enum_free_carries_the_enum_items_own_cfg() {
let rendered = gen_enum_free(&gated_enum(), PREFIX, HOST_CRATE);
assert!(
rendered.contains("#[cfg(feature = \"thumbnails\")]"),
"a handle accessor for a cfg-gated enum must carry that enum's #[cfg], got:\n{rendered}"
);
assert_eq!(
rendered.matches("#[cfg(").count(),
1,
"exactly one gate, got:\n{rendered}"
);
let cfg_line = rendered.lines().position(|l| l.contains("#[cfg(")).expect("cfg line");
let fn_line = rendered
.lines()
.position(|l| l.contains("pub unsafe extern \"C\" fn"))
.expect("fn line");
assert!(cfg_line < fn_line, "#[cfg] must precede the function, got:\n{rendered}");
}
#[test]
fn enum_to_json_carries_the_enum_items_own_cfg() {
let rendered = gen_enum_to_json(&gated_enum(), PREFIX, HOST_CRATE);
assert!(
rendered.contains("#[cfg(feature = \"thumbnails\")]"),
"got:\n{rendered}"
);
}
#[test]
fn enum_to_string_carries_the_enum_items_own_cfg() {
let rendered = gen_enum_to_string(&gated_enum(), PREFIX, HOST_CRATE);
assert!(
rendered.contains("#[cfg(feature = \"thumbnails\")]"),
"got:\n{rendered}"
);
}
#[test]
fn enum_from_json_carries_the_enum_items_own_cfg() {
let rendered = gen_enum_from_json(&gated_enum(), PREFIX, HOST_CRATE);
assert!(
rendered.contains("#[cfg(feature = \"thumbnails\")]"),
"got:\n{rendered}"
);
}
#[test]
fn from_i32_rs_helper_carries_the_enum_items_own_cfg() {
let rendered = gen_enum_from_i32_rs_helper(&gated_enum(), HOST_CRATE, HOST_CRATE);
assert!(
rendered.contains("#[cfg(feature = \"thumbnails\")]"),
"the from_i32_rs helper for a cfg-gated enum must carry that enum's #[cfg], got:\n{rendered}"
);
let cfg_line = rendered.lines().position(|l| l.contains("#[cfg(")).expect("cfg line");
let fn_line = rendered.lines().position(|l| l.contains("fn ")).expect("fn line");
assert!(
cfg_line < fn_line,
"#[cfg] must precede the fn declaration, got:\n{rendered}"
);
}
#[test]
fn ungated_enum_emits_no_cfg_attribute_anywhere() {
let enum_def = ungated_enum();
for rendered in [
gen_enum_free(&enum_def, PREFIX, HOST_CRATE),
gen_enum_to_json(&enum_def, PREFIX, HOST_CRATE),
gen_enum_to_string(&enum_def, PREFIX, HOST_CRATE),
gen_enum_from_json(&enum_def, PREFIX, HOST_CRATE),
gen_enum_from_i32_rs_helper(&enum_def, HOST_CRATE, HOST_CRATE),
] {
assert!(
!rendered.contains("#[cfg("),
"an enum with no item-level cfg must not emit a #[cfg] attribute, got:\n{rendered}"
);
}
}