use std::collections::HashMap;
use super::assertions::render_assertion;
use crate::e2e::codegen::wildcard_element_fixture::{
WILDCARD_FIELD, WILDCARD_NAME_FIELD, assert_container_accessor_appears_once, assert_element_relative,
contains_assertion, envelope_resolver, not_empty_assertion, report_resolver,
};
use crate::e2e::field_access::FieldResolver;
use crate::e2e::fixture::Assertion;
const CONTAINER_ACCESSOR: &str = ".records()";
fn render(resolver: &FieldResolver, assertion: &Assertion) -> String {
let mut out = String::new();
render_assertion(
&mut out,
assertion,
"result",
resolver,
false,
false,
false,
false,
&HashMap::new(),
false,
false,
);
out
}
#[test]
fn wildcard_contains_closure_body_is_relative_to_the_element_binding() {
let rendered = render(&report_resolver("swift"), &contains_assertion(WILDCARD_FIELD));
assert_element_relative(&rendered, "$0.kind().toString()", "$0.records()[0].kind()");
assert_container_accessor_appears_once(&rendered, CONTAINER_ACCESSOR);
}
#[test]
fn wildcard_not_empty_closure_body_is_also_element_relative() {
let rendered = render(&report_resolver("swift"), ¬_empty_assertion(WILDCARD_NAME_FIELD));
assert_element_relative(&rendered, "$0.name().toString()", "$0.records()[0].name()");
assert_container_accessor_appears_once(&rendered, CONTAINER_ACCESSOR);
}
#[test]
fn wildcard_container_stays_anchored_to_the_result_variable() {
let rendered = render(&report_resolver("swift"), &contains_assertion(WILDCARD_FIELD));
assert!(
rendered.contains("result.records().contains(where: {"),
"container half must quantify over the result variable's own field, got: {rendered}"
);
}
#[test]
fn wildcard_container_keeps_its_envelope_projection() {
let rendered = render(&envelope_resolver("swift"), &contains_assertion(WILDCARD_FIELD));
assert!(
rendered.contains("result.results()[0].records().contains(where: {"),
"container half must keep the result-anchored envelope projection, got: {rendered}"
);
assert_container_accessor_appears_once(&rendered, CONTAINER_ACCESSOR);
}