#![allow(clippy::expect_used, clippy::unwrap_used, clippy::panic, missing_docs)]
use std::fs;
use zerodds_ast_layout::{AxisFlag, Dialect};
use zerodds_build::{Config, Error};
const SOURCE: &str = "struct Sample { long id; double reading; };";
fn generate(configure: impl FnOnce(&mut Config) -> &mut Config) -> Result<String, Error> {
let dir = tempfile::tempdir().expect("tempdir");
let idl = dir.path().join("Sample.idl");
fs::write(&idl, SOURCE).expect("write idl");
let out_dir = dir.path().join("out");
fs::create_dir_all(&out_dir).expect("out dir");
let mut config = Config::new();
config.out_dir(&out_dir).emit_cargo_directives(false);
configure(&mut config);
config.compile(&[&idl])?;
Ok(fs::read_to_string(out_dir.join("Sample.rs")).expect("read generated"))
}
#[test]
fn no_dialect_call_is_the_specifications_default() {
let generated = generate(|config| config).expect("compile");
assert!(
generated.contains("write_dheader") && generated.contains("finish_dheader"),
"the default is @appendable, which is a DHEADER: {generated}"
);
}
#[test]
fn dialect_reaches_default_extensibility() {
let generated =
generate(|config| config.dialect(Dialect::Cyclone)).expect("compile under Cyclone");
assert!(
!generated.contains("write_dheader") && !generated.contains("finish_dheader"),
"Cyclone's default is @final, which has no DHEADER: {generated}"
);
assert!(
!generated.contains("r.remaining() == 0"),
"an @final decode must read unconditionally, not default a member the \
way an @appendable evolution reader may: {generated}"
);
}
#[test]
fn the_axis_flag_reaches_the_same_setting_as_the_dedicated_method() {
let via_axis = generate(|config| config.axis(AxisFlag::DefaultExtensibility, "final"))
.expect("compile with the axis override");
let via_method =
generate(|config| config.default_extensibility(zerodds_build::DefaultExt::Final))
.expect("compile with the dedicated method");
assert_eq!(via_axis, via_method);
assert!(!via_axis.contains("write_dheader"), "{via_axis}");
}
#[test]
fn the_axis_flag_overrides_the_dialect_in_declaration_order() {
let generated = generate(|config| {
config
.dialect(Dialect::OpenDds)
.axis(AxisFlag::DefaultExtensibility, "final")
})
.expect("compile under OpenDDS, overridden to final");
assert!(
!generated.contains("write_dheader"),
"the axis flag must win over the dialect's own appendable: {generated}"
);
}
#[test]
fn an_unknown_axis_value_is_refused_by_name() {
let error = generate(|config| config.axis(AxisFlag::DefaultExtensibility, "not-a-real-value"))
.expect_err("an unknown axis value must not compile");
let Error::Axis {
flag,
value,
detail,
} = error
else {
panic!("expected Error::Axis, got {error:?}");
};
assert_eq!(flag, "--default-extensibility");
assert_eq!(value, "not-a-real-value");
assert!(detail.contains("not-a-real-value"), "{detail}");
}