use std::collections::{HashMap, HashSet};
use super::assertions::{AssertionRenderContext, render_assertion};
use crate::e2e::codegen::wildcard_element_fixture::{
WILDCARD_FIELD, assert_container_accessor_appears_once, assert_element_relative, contains_assertion,
envelope_resolver, report_resolver,
};
use crate::e2e::field_access::FieldResolver;
const CONTAINER_ACCESSOR: &str = ".Records";
fn render(resolver: &FieldResolver) -> String {
let mut out = String::new();
let context = AssertionRenderContext {
effective_result_var: "result",
import_alias: "sample",
field_resolver: resolver,
optional_locals: &HashMap::new(),
numeric_scalar_fields: &HashSet::new(),
presence_checked_fields: &HashSet::new(),
result_is_simple: false,
result_is_array: false,
is_streaming: false,
streaming_item_type: None,
};
render_assertion(&mut out, &context, &contains_assertion(WILDCARD_FIELD));
out
}
#[test]
fn wildcard_loop_body_is_relative_to_the_element_binding() {
let rendered = render(&report_resolver("go"));
assert_element_relative(&rendered, "e.Kind", "e.Records[0].Kind");
assert_container_accessor_appears_once(&rendered, CONTAINER_ACCESSOR);
}
#[test]
fn wildcard_container_stays_anchored_to_the_result_variable() {
let rendered = render(&report_resolver("go"));
assert!(
rendered.contains("for _, e := range result.Records {"),
"container half must iterate the result variable's own field, got: {rendered}"
);
}
#[test]
fn wildcard_container_keeps_its_envelope_projection() {
let rendered = render(&envelope_resolver("go"));
assert!(
rendered.contains("for _, e := range result.Results[0].Records {"),
"container half must keep the result-anchored envelope projection, got: {rendered}"
);
assert_container_accessor_appears_once(&rendered, CONTAINER_ACCESSOR);
}