#![allow(clippy::expect_used, clippy::panic, clippy::unwrap_used)]
use zerodds_wire::{Endianness, ParameterRole, Writer};
#[test]
fn a_writer_records_nothing_until_it_is_asked_to() {
let mut plain = Writer::little_endian();
plain.write_u8(1);
plain.write_u32(2);
assert!(!plain.is_recording_padding());
assert!(plain.padding_spans().is_empty());
let mut recording = Writer::little_endian().recording_padding();
recording.write_u8(1);
recording.write_u32(2);
assert!(recording.is_recording_padding());
assert_eq!(recording.padding_spans(), [(1, 3)]);
}
#[test]
fn the_span_is_the_gap_the_alignment_rule_opens() {
let mut w = Writer::little_endian().recording_padding();
w.write_u8(0xFF);
w.write_f64(1.0);
assert_eq!(w.padding_spans(), [(1, 7)]);
assert!(
w.as_bytes()[1..8].iter().all(|octet| *octet == 0),
"{:?}",
w.as_bytes()
);
}
#[test]
fn an_already_aligned_member_records_nothing() {
let mut w = Writer::little_endian().recording_padding();
w.write_u32(1);
w.write_u32(2);
assert!(w.padding_spans().is_empty(), "{:?}", w.padding_spans());
}
#[test]
fn every_recorded_octet_is_a_zero_the_writer_wrote() {
let mut w = Writer::little_endian().recording_padding();
w.write_u8(1);
w.write_u16(0x0203);
w.write_u8(4);
w.write_f64(5.0);
w.write_u8(6);
w.write_u32(7);
let spans = w.padding_spans().to_vec();
assert!(!spans.is_empty());
let bytes = w.finish();
for (at, length) in spans {
assert!(
bytes[at..at + length].iter().all(|octet| *octet == 0),
"span ({at}, {length}) is not zero in {bytes:?}"
);
}
}
#[test]
fn a_promoted_parameter_header_carries_the_record_with_it() {
let mut w = Writer::little_endian().recording_padding();
let header = w
.write_pid(1, ParameterRole::Member, false)
.expect("a header the plan chose");
w.write_u8(0xAB);
w.align_to(4);
assert_eq!(w.padding_spans(), [(5, 3)]);
for _ in 0..70_000_u32 {
w.write_u8(0xCD);
}
w.finish_pid(header);
let spans = w.padding_spans().to_vec();
let bytes = w.finish();
assert_eq!(
spans.first().copied(),
Some((13, 3)),
"the splice moved the value by eight and the record did not follow: {spans:?}"
);
assert_eq!(&bytes[12..16], &[0xAB, 0, 0, 0], "{:?}", &bytes[..20]);
for (at, length) in spans {
assert!(
bytes[at..at + length].iter().all(|octet| *octet == 0),
"span ({at}, {length}) is not zero"
);
}
}
#[test]
fn a_shortened_emheader_carries_the_record_with_it() {
let mut w = Writer::with_max_align(Endianness::Little, 4)
.with_short_length_codes(true)
.recording_padding();
let header = w
.write_emheader(1, 4, false)
.expect("a header the plan chose");
w.write_u8(0xAB);
w.write_u32(0x0102_0304);
assert_eq!(
w.padding_spans(),
[(9, 3)],
"with the NEXTINT still there the gap is at nine"
);
w.finish_emheader(header)
.expect("the member is the length its code declares");
let spans = w.padding_spans().to_vec();
let bytes = w.finish();
assert_eq!(
spans.first().copied(),
Some((5, 3)),
"the NEXTINT was removed and the record did not follow: {spans:?}"
);
assert_eq!(bytes.len(), 12, "{bytes:?}");
assert_eq!(&bytes[4..12], &[0xAB, 0, 0, 0, 0x04, 0x03, 0x02, 0x01]);
for (at, length) in spans {
assert!(
bytes[at..at + length].iter().all(|octet| *octet == 0),
"span ({at}, {length}) is not zero"
);
}
}