use broadcast_common::{Parse, Serialize};
use dvb_subtitle::PesDataField;
mod support;
const MAX_SEEDS: usize = 16;
fn exercise(bytes: &[u8]) -> bool {
match PesDataField::parse(bytes) {
Ok(f) => {
let _ = f.try_to_bytes();
true
}
Err(_) => false,
}
}
#[test]
fn truncation_and_mutation_of_real_data_fields_never_panic() {
let seeds = support::data_fields(MAX_SEEDS);
assert!(!seeds.is_empty(), "no real subtitle data fields found");
let mut parsed_after_mutation = 0usize;
for seed in &seeds {
assert!(exercise(seed), "seed must parse");
for n in 0..=seed.len() {
exercise(&seed[..n]);
}
for pos in 0..seed.len() {
for v in [0x00u8, 0x01, 0x0F, 0x7F, 0x80, 0xFF, seed[pos] ^ 0x55] {
let mut m = seed.clone();
m[pos] = v;
if exercise(&m) {
parsed_after_mutation += 1;
}
}
}
}
assert!(parsed_after_mutation > 100, "{parsed_after_mutation}");
}