use crate::core::resolver::resolve_template;
use proptest::prelude::*;
use std::collections::HashMap;
proptest! {
#[test]
fn template_resolution_determinism(
key in "[a-z_]{1,10}",
value in "[a-zA-Z0-9]{1,20}",
) {
let template = format!("{{{{params.{key}}}}}");
let mut params = HashMap::new();
params.insert(key, serde_yaml_ng::Value::String(value.clone()));
let machines = indexmap::IndexMap::new();
let r1 = resolve_template(&template, ¶ms, &machines);
let r2 = resolve_template(&template, ¶ms, &machines);
prop_assert_eq!(r1.as_ref(), r2.as_ref(),
"template resolution must be deterministic");
prop_assert_eq!(r1.unwrap(), value,
"template must resolve to the parameter value");
}
#[test]
fn missing_param_consistent_error(
key in "[a-z_]{1,10}",
) {
let template = format!("{{{{params.{key}}}}}");
let params = HashMap::new();
let machines = indexmap::IndexMap::new();
let r1 = resolve_template(&template, ¶ms, &machines);
let r2 = resolve_template(&template, ¶ms, &machines);
prop_assert_eq!(
r1.is_err(), r2.is_err(),
"missing param must consistently succeed or fail"
);
}
#[test]
fn literal_passthrough(value in "[a-zA-Z0-9 _-]{0,50}") {
prop_assume!(!value.contains("{{"));
let params = HashMap::new();
let machines = indexmap::IndexMap::new();
let result = resolve_template(&value, ¶ms, &machines);
prop_assert!(result.is_ok());
prop_assert_eq!(result.unwrap(), value);
}
}