#[test]
fn test_php_wrapper_param_optionality_logic() {
use crate::core::ir::{ParamDef, TypeRef};
let is_optional_default_constructible_param = |p: &ParamDef| -> bool {
if let TypeRef::Named(name) = &p.ty {
matches!(name.as_str(), "CrawlConfig" | "InteractionActions")
} else {
false
}
};
let req_param = ParamDef {
name: "url".to_string(),
ty: TypeRef::String,
optional: false,
..ParamDef::default()
};
let should_be_optional = req_param.optional || is_optional_default_constructible_param(&req_param);
assert!(
!should_be_optional,
"required param should not become optional in wrapper"
);
let opt_param = ParamDef {
name: "config".to_string(),
ty: TypeRef::Named("CrawlConfig".to_string()),
optional: true,
..ParamDef::default()
};
let should_be_optional = opt_param.optional || is_optional_default_constructible_param(&opt_param);
assert!(should_be_optional, "explicitly optional param should be optional");
let default_constructible_param = ParamDef {
name: "config".to_string(),
ty: TypeRef::Named("CrawlConfig".to_string()),
optional: false,
..ParamDef::default()
};
let should_be_optional =
default_constructible_param.optional || is_optional_default_constructible_param(&default_constructible_param);
assert!(should_be_optional, "default-constructible param should become optional");
}