use dvb_si::descriptors::{parse_loop, AnyDescriptor};
#[test]
fn every_dispatched_tag_is_not_unknown() {
for &tag in AnyDescriptor::DISPATCHED_TAGS {
let mut bytes = vec![tag, 0x08];
bytes.extend_from_slice(&[0u8; 8]);
let items: Vec<_> = parse_loop(&bytes).collect();
assert_eq!(items.len(), 1, "tag {tag:#04x}: expected one item");
let parsed = items.into_iter().next().unwrap();
if let Ok(AnyDescriptor::Unknown { .. }) = &parsed {
panic!("tag {tag:#04x} dispatched to Unknown — missing dispatcher entry");
}
}
}
#[test]
fn undispatched_tags_yield_unknown() {
for tag in 0u8..=0xFF {
if AnyDescriptor::DISPATCHED_TAGS.contains(&tag) {
continue;
}
let bytes = [tag, 0x01, 0x00];
let parsed = parse_loop(&bytes).next().unwrap();
assert!(
matches!(parsed, Ok(AnyDescriptor::Unknown { tag: t, .. }) if t == tag),
"tag {tag:#04x}: expected Unknown, got {parsed:?}",
);
}
}
#[test]
fn eit_style_mixed_loop() {
let mut loop_bytes = Vec::new();
loop_bytes.extend_from_slice(&[0x4D, 0x07, b'e', b'n', b'g', 0x02, b'H', b'i', 0x00]);
loop_bytes.extend_from_slice(&[0x55, 0x04, b'G', b'B', b'R', 0x03]);
loop_bytes.extend_from_slice(&[0xA7, 0x02, 0xCA, 0xFE]);
let items: Vec<_> = parse_loop(&loop_bytes).collect::<Result<_, _>>().unwrap();
assert_eq!(items.len(), 3);
assert!(matches!(items[0], AnyDescriptor::ShortEvent(_)));
assert!(matches!(items[1], AnyDescriptor::ParentalRating(_)));
assert!(matches!(
items[2],
AnyDescriptor::Unknown {
tag: 0xA7,
body: [0xCA, 0xFE]
}
));
}
#[test]
fn truncated_tail_yields_ok_then_err_then_fuses() {
let mut bytes = Vec::new();
bytes.extend_from_slice(&[0x4D, 0x07, b'e', b'n', b'g', 0x02, b'H', b'i', 0x00]);
bytes.extend_from_slice(&[0x4D, 0xFF, 0x01]);
let mut it = parse_loop(&bytes);
assert!(matches!(it.next(), Some(Ok(AnyDescriptor::ShortEvent(_)))));
assert!(matches!(it.next(), Some(Err(_))));
assert!(it.next().is_none());
assert!(it.next().is_none(), "iterator must stay fused");
}
#[test]
fn per_descriptor_error_continues() {
let mut bytes = Vec::new();
bytes.extend_from_slice(&[0x69, 0x02, 0x00, 0x00]); bytes.extend_from_slice(&[0x42, 0x02, 0xFF, 0xFF]);
let items: Vec<_> = parse_loop(&bytes).collect();
assert_eq!(items.len(), 2);
assert!(items[0].is_err(), "malformed PDC should be Err");
assert!(matches!(items[1], Ok(AnyDescriptor::Stuffing(_))));
}
#[cfg(feature = "serde")]
#[test]
fn loop_serializes_decoded_json() {
let loop_bytes = [
0x4D, 0x0C, b'f', b'r', b'e', 0x07, b'J', b'o', b'u', b'r', b'n', b'a', b'l', 0x00,
];
let items: Vec<_> = parse_loop(&loop_bytes).collect::<Result<_, _>>().unwrap();
let json = serde_json::to_value(&items).unwrap();
assert_eq!(json[0]["shortEvent"]["event_name"], "Journal");
assert_eq!(json[0]["shortEvent"]["language_code"], "fre");
}