use object_hash::{canonical, hash};
mod support;
use support::Reader;
const CORPUS: &str = include_str!("fixtures/fuzz.tsv");
fn corpus() -> Vec<(String, String, String)> {
CORPUS
.lines()
.filter(|line| !line.trim().is_empty())
.map(|line| {
let fields: Vec<&str> = line.split('\t').collect();
assert_eq!(fields.len(), 3, "malformed line: {line:?}");
(
fields[0].to_string(),
fields[1].to_string(),
fields[2].to_string(),
)
})
.collect()
}
#[test]
fn every_random_value_matches_the_reference() {
let cases = corpus();
assert!(cases.len() >= 4000, "only {} cases", cases.len());
let mut failures = Vec::new();
for (description, canonical_form, digest) in &cases {
let mut reader = Reader::new(description);
let value = reader.value();
assert_eq!(
reader.at,
description.len(),
"not all of {description:?} was read"
);
let got_canonical = canonical(&value);
if got_canonical != *canonical_form {
failures.push(format!(
"{description}\n canonical\n expected {canonical_form:?}\n got {got_canonical:?}"
));
continue;
}
let got_digest = hash(&value);
if got_digest != *digest {
failures.push(format!(
"{description}\n digest\n expected {digest}\n got {got_digest}"
));
}
}
assert!(
failures.len() < 10,
"{} failures, first few:\n{}",
failures.len(),
failures.join("\n")
);
assert!(
failures.is_empty(),
"{} failures:\n{}",
failures.len(),
failures.join("\n")
);
}