use broadcast_common::{Parse, Serialize};
use st337::{Burst, DataMode};
fn real_eac3_frame() -> Vec<u8> {
std::fs::read(concat!(
env!("CARGO_MANIFEST_DIR"),
"/tests/fixtures/eac3_frame0.bin"
))
.expect("eac3_frame0.bin fixture must exist")
}
const EAC3_DATA_TYPE: u8 = 21;
fn build_burst(payload: &[u8]) -> Burst<'_> {
Burst::new(EAC3_DATA_TYPE, DataMode::Mode16, false, 0, 0, None, payload)
.expect("build burst from real E-AC-3 frame")
}
#[test]
fn wraps_real_eac3_frame_and_parses_back() {
let payload = real_eac3_frame();
assert_eq!(
payload.len(),
834,
"real E-AC-3 frame 0 is 834 bytes (ffprobe-confirmed)"
);
let burst = build_burst(&payload);
assert_eq!(burst.preamble.length_code, 834 * 8);
let bytes = burst.to_bytes();
assert_eq!(&bytes[0..2], &st337::SYNC_WORD_PA.to_le_bytes());
assert_eq!(&bytes[2..4], &st337::SYNC_WORD_PB.to_le_bytes());
assert_eq!(&bytes[4..6], &[0x15, 0x00]);
let parsed = Burst::parse(&bytes).expect("parse the wrapped real burst");
assert_eq!(parsed.preamble.data_type, EAC3_DATA_TYPE);
assert_eq!(parsed.preamble.data_mode, DataMode::Mode16);
assert!(!parsed.preamble.error_flag);
assert_eq!(parsed.preamble.data_stream_number, 0);
assert_eq!(
parsed.payload, payload,
"payload extracted from the parsed burst must be byte-identical to the real E-AC-3 frame"
);
}
#[test]
fn byte_identical_round_trip_real_fixture() {
let payload = real_eac3_frame();
let burst = build_burst(&payload);
let mut out = vec![0u8; burst.serialized_len()];
let n = burst.serialize_into(&mut out).unwrap();
assert_eq!(n, out.len());
let reparsed = Burst::parse(&out).unwrap();
assert_eq!(reparsed, burst, "parse(serialize(burst)) == burst");
let mut out2 = vec![0u8; reparsed.serialized_len()];
reparsed.serialize_into(&mut out2).unwrap();
assert_eq!(
out, out2,
"serialize(parse(serialize(burst))) is byte-identical"
);
}
#[test]
fn mutating_error_flag_changes_only_pc_bytes() {
let payload = real_eac3_frame();
let mut burst = build_burst(&payload);
let original = burst.to_bytes();
burst.preamble.error_flag = true;
let mutated = burst.to_bytes();
assert_ne!(
original, mutated,
"flipping error_flag must change the wire bytes"
);
assert_eq!(&original[0..4], &mutated[0..4], "Pa/Pb unaffected");
assert_ne!(&original[4..6], &mutated[4..6], "Pc must change");
assert_eq!(&original[6..], &mutated[6..], "Pd + payload unaffected");
}