use truefix_core::{Field, FieldMap, Group, GroupSpec, Message, decode_with_groups, encode};
struct HeaderGroupSpec;
impl GroupSpec for HeaderGroupSpec {
fn group_of(&self, count_tag: u32) -> Option<(u32, &[u32])> {
(count_tag == 128).then_some((115, &[115][..]))
}
}
fn msg_with_header_group() -> Message {
let mut m = Message::new();
m.header.set(Field::string(8, "FIX.4.4"));
m.header.set(Field::string(35, "D"));
let mut group = Group::new(128);
let mut entry_a = FieldMap::new();
entry_a.add_field(Field::string(115, "A"));
let mut entry_b = FieldMap::new();
entry_b.add_field(Field::string(115, "B"));
group.add_entry(entry_a);
group.add_entry(entry_b);
m.header.add_group(group);
m.body.set(Field::string(11, "ORD1"));
m
}
#[test]
fn a_header_repeating_group_is_structured_on_decode() {
let bytes = encode(&msg_with_header_group());
let decoded = decode_with_groups(&bytes, &HeaderGroupSpec).expect("decode");
let entries = decoded.header.group(128).expect("header group present");
assert_eq!(entries.len(), 2);
assert_eq!(entries[0].get(115).unwrap().as_str().unwrap(), "A");
assert_eq!(entries[1].get(115).unwrap().as_str().unwrap(), "B");
}
#[test]
fn a_header_repeating_group_round_trips_byte_identically() {
let bytes = encode(&msg_with_header_group());
let decoded = decode_with_groups(&bytes, &HeaderGroupSpec).expect("decode");
assert_eq!(encode(&decoded), bytes);
}
#[test]
fn without_a_matching_group_spec_the_same_bytes_decode_as_flat_fields() {
struct NoGroups;
impl GroupSpec for NoGroups {
fn group_of(&self, _count_tag: u32) -> Option<(u32, &[u32])> {
None
}
}
let bytes = encode(&msg_with_header_group());
let decoded = decode_with_groups(&bytes, &NoGroups).expect("decode");
assert!(decoded.header.group(128).is_none());
assert_eq!(decoded.header.get(128).unwrap().as_str().unwrap(), "2");
}