use vexil_runtime::{BitReader, BitWriter};
#[test]
fn union_array_payload_preserves_all_elements() {
let mut w = BitWriter::new();
w.write_leb128(0);
let mut payload_w = BitWriter::new();
payload_w.write_leb128(3);
payload_w.write_u32(1);
payload_w.write_string("alpha");
payload_w.flush_to_byte_boundary();
payload_w.write_u32(2);
payload_w.write_string("beta");
payload_w.flush_to_byte_boundary();
payload_w.write_u32(3);
payload_w.write_string("gamma");
payload_w.flush_to_byte_boundary();
let payload = payload_w.finish();
w.write_leb128(payload.len() as u64);
w.write_raw_bytes(&payload);
let bytes = w.finish();
let mut r = BitReader::new(&bytes);
let disc = r.read_leb128(10).unwrap();
assert_eq!(disc, 0);
let len = r.read_leb128(10).unwrap() as usize;
let payload_bytes = r.read_raw_bytes(len).unwrap();
let mut pr = BitReader::new(&payload_bytes);
let count = pr.read_leb128(10).unwrap() as usize;
assert_eq!(count, 3);
for i in 0..count {
let id = pr.read_u32().unwrap();
let name = pr.read_string().unwrap();
pr.flush_to_byte_boundary();
assert_eq!(id, (i + 1) as u32);
match i {
0 => assert_eq!(name, "alpha"),
1 => assert_eq!(name, "beta"),
2 => assert_eq!(name, "gamma"),
_ => unreachable!(),
}
}
}
#[test]
fn union_encode_no_spurious_leading_byte() {
let mut w = BitWriter::new();
w.write_leb128(0);
let mut payload_w = BitWriter::new();
payload_w.write_u32(42);
payload_w.flush_to_byte_boundary();
let payload = payload_w.finish();
w.write_leb128(payload.len() as u64);
w.write_raw_bytes(&payload);
let bytes = w.finish();
assert_eq!(bytes[0], 0x00); assert!(
bytes[1] > 0,
"second byte should be payload length, not zero"
);
}