use super::FieldResolver;
use crate::core::ir::{FieldDef, TypeDef};
#[test]
fn a_required_vec_with_skip_serializing_if_is_wire_optional() {
let type_def = TypeDef {
name: "DataNode".to_string(),
fields: vec![FieldDef {
name: "children".to_string(),
optional: false,
serde_skip_serializing_if: true,
..FieldDef::default()
}],
..TypeDef::default()
};
let wire_optional = FieldResolver::ir_wire_optional_fields(&[type_def]);
assert!(wire_optional.contains("children"));
}
#[test]
fn a_required_vec_with_skip_serializing_if_is_not_ir_optional() {
let type_def = TypeDef {
name: "DataNode".to_string(),
fields: vec![FieldDef {
name: "children".to_string(),
optional: false,
serde_skip_serializing_if: true,
..FieldDef::default()
}],
..TypeDef::default()
};
let (_reachable, _excluded, optional) = FieldResolver::ir_field_sets(&[type_def]);
assert!(
!optional.contains("children"),
"a required Vec<T> field must not be treated as Option<T>-optional just because it \
carries skip_serializing_if"
);
}
#[test]
fn a_plain_required_field_is_neither_optional_nor_wire_optional() {
let type_def = TypeDef {
name: "DataNode".to_string(),
fields: vec![FieldDef {
name: "kind".to_string(),
optional: false,
serde_skip_serializing_if: false,
..FieldDef::default()
}],
..TypeDef::default()
};
let wire_optional = FieldResolver::ir_wire_optional_fields(std::slice::from_ref(&type_def));
assert!(!wire_optional.contains("kind"));
let (_reachable, _excluded, optional) = FieldResolver::ir_field_sets(&[type_def]);
assert!(!optional.contains("kind"));
}
#[test]
fn is_wire_optional_key_matches_the_bare_key_regardless_of_nesting() {
let type_def = TypeDef {
name: "DataNode".to_string(),
fields: vec![FieldDef {
name: "children".to_string(),
serde_skip_serializing_if: true,
..FieldDef::default()
}],
..TypeDef::default()
};
let wire_optional = FieldResolver::ir_wire_optional_fields(&[type_def]);
let resolver = FieldResolver::new(
&std::collections::HashMap::new(),
&std::collections::HashSet::new(),
&std::collections::HashSet::new(),
&std::collections::HashSet::new(),
&std::collections::HashSet::new(),
)
.with_wire_optional_fields(wire_optional);
assert!(resolver.is_wire_optional_key("children"));
assert!(!resolver.is_wire_optional_key("data"));
}