use super::FieldResolver;
use crate::core::ir::{FieldDef, TypeDef, TypeRef};
use std::collections::{HashMap, HashSet};
fn resolver_with_result_fields(result_fields: &[&str]) -> FieldResolver {
let result_fields: HashSet<String> = result_fields.iter().map(|s| s.to_string()).collect();
FieldResolver::new(
&HashMap::new(),
&HashSet::new(),
&result_fields,
&HashSet::new(),
&HashSet::new(),
)
}
#[test]
fn byte_payload_flag_rejects_any_field_path_with_no_ir_wired_in() {
let resolver = resolver_with_result_fields(&[]).with_result_is_byte_payload(true);
assert!(!resolver.is_valid_for_result("audio"));
assert!(!resolver.is_valid_for_result("Content"));
assert_eq!(resolver.result_field_oracle_knows("audio"), Some(false));
assert_eq!(resolver.result_field_oracle_knows("Content"), Some(false));
}
#[test]
fn byte_payload_flag_rejects_a_field_even_when_result_fields_declares_it() {
let resolver = resolver_with_result_fields(&["audio"]).with_result_is_byte_payload(true);
assert!(
!resolver.is_valid_for_result("audio"),
"result_fields declaring 'audio' must not rescue a byte-payload result"
);
assert_eq!(resolver.result_field_oracle_knows("audio"), Some(false));
}
fn struct_type_defs_with_audio_field() -> Vec<TypeDef> {
vec![TypeDef {
name: "Envelope".to_string(),
fields: vec![
FieldDef {
name: "audio".to_string(),
ty: TypeRef::Bytes,
..FieldDef::default()
},
FieldDef {
name: "title".to_string(),
ty: TypeRef::String,
..FieldDef::default()
},
],
..TypeDef::default()
}]
}
fn resolver_anchored_at_envelope() -> FieldResolver {
let type_defs = struct_type_defs_with_audio_field();
let map = FieldResolver::ir_result_field_facts(&type_defs, "rust");
let (reachable, excluded, optional) = FieldResolver::ir_field_sets(&type_defs);
FieldResolver::new(
&HashMap::new(),
&HashSet::new(),
&HashSet::new(),
&HashSet::new(),
&HashSet::new(),
)
.with_ir_result_fields(map, Some("Envelope".to_string()))
.with_ir_fields(reachable, excluded, optional)
}
#[test]
fn negative_control_a_genuine_struct_result_still_gets_field_access() {
let resolver = resolver_anchored_at_envelope();
assert!(resolver.is_valid_for_result("audio"));
assert!(resolver.is_valid_for_result("title"));
assert_eq!(resolver.result_field_oracle_knows("audio"), Some(true));
assert_eq!(resolver.result_field_oracle_knows("title"), Some(true));
}
#[test]
fn byte_payload_flag_overrides_even_a_fully_anchored_struct_result() {
let resolver = resolver_anchored_at_envelope().with_result_is_byte_payload(true);
assert!(!resolver.is_valid_for_result("audio"));
assert!(!resolver.is_valid_for_result("title"));
assert_eq!(resolver.result_field_oracle_knows("audio"), Some(false));
assert_eq!(resolver.result_field_oracle_knows("title"), Some(false));
}
#[test]
fn the_flag_defaults_to_false_and_is_purely_additive() {
let resolver = resolver_anchored_at_envelope();
assert!(
resolver.is_valid_for_result("audio"),
"constructing a resolver must never implicitly set the byte-payload flag"
);
}