use std::collections::{BTreeMap, HashMap, HashSet};
use super::assertions::render_assertion;
use super::enum_variant_access::PhpVariantAccess;
use crate::e2e::field_access::{FieldResolver, PhpGetterMap};
use crate::e2e::fixture::Assertion;
const ROOT_TYPE: &str = "ProcessResult";
const ELEMENT_TYPE: &str = "StructureItem";
fn getter_map() -> PhpGetterMap {
let mut getters: HashMap<String, HashSet<String>> = HashMap::new();
getters.insert(ROOT_TYPE.to_string(), HashSet::new());
getters.insert(ELEMENT_TYPE.to_string(), ["kind".to_string()].into_iter().collect());
let mut all_fields: HashMap<String, HashSet<String>> = HashMap::new();
all_fields.insert(ELEMENT_TYPE.to_string(), ["kind".to_string()].into_iter().collect());
all_fields.insert(
ROOT_TYPE.to_string(),
["structure".to_string(), "kind".to_string()].into_iter().collect(),
);
let mut field_types: HashMap<String, HashMap<String, String>> = HashMap::new();
field_types.insert(
ROOT_TYPE.to_string(),
[("structure".to_string(), ELEMENT_TYPE.to_string())]
.into_iter()
.collect(),
);
PhpGetterMap {
getters,
field_types,
root_type: Some(ROOT_TYPE.to_string()),
all_fields,
}
}
fn resolver() -> FieldResolver {
FieldResolver::new_with_error_aliases(
&HashMap::new(),
&HashSet::new(),
&HashSet::new(),
&HashSet::new(),
&HashSet::new(),
&HashMap::new(),
)
.with_php_getter_map(getter_map())
}
fn render(resolver: &FieldResolver) -> String {
let assertion = Assertion {
assertion_type: "contains".to_string(),
field: Some("structure[].kind".to_string()),
value: Some(serde_json::json!("Function")),
..Default::default()
};
let mut out = String::new();
render_assertion(
&mut out,
&assertion,
"result",
resolver,
false,
false,
&BTreeMap::new(),
false,
&PhpVariantAccess::none(),
);
out
}
#[test]
fn wildcard_element_getter_is_resolved_against_the_element_type_not_the_result_type() {
let rendered = render(&resolver());
assert_eq!(
rendered,
" $this->assertTrue((bool)array_filter($result->structure, fn($e) => str_contains((string)$e->getKind(), \"Function\")));\n"
);
}
#[test]
fn wildcard_element_stays_a_property_when_the_element_type_has_no_getter_for_it() {
let mut map = getter_map();
map.getters.insert(ELEMENT_TYPE.to_string(), HashSet::new());
let resolver = FieldResolver::new_with_error_aliases(
&HashMap::new(),
&HashSet::new(),
&HashSet::new(),
&HashSet::new(),
&HashSet::new(),
&HashMap::new(),
)
.with_php_getter_map(map);
let rendered = render(&resolver);
assert_eq!(
rendered,
" $this->assertTrue((bool)array_filter($result->structure, fn($e) => str_contains((string)$e->kind, \"Function\")));\n"
);
}