41 lines
1.8 KiB
Rust
41 lines
1.8 KiB
Rust
//! An encoded rendition over a package's pieces (extensions/platform-encode.md §9): the
|
|
//! committed corpus `encode-conformance/rendition/` regenerates byte for byte from its pinned
|
|
//! fixture streams and the base golden, and every case gets its outcome.
|
|
|
|
use std::collections::BTreeMap;
|
|
use std::path::PathBuf;
|
|
use wai_pack::rendition::{Package, corpus};
|
|
|
|
fn dir() -> PathBuf {
|
|
PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../encode-conformance/rendition")
|
|
}
|
|
|
|
fn streams() -> BTreeMap<String, Vec<u8>> {
|
|
corpus::STREAMS.iter().map(|(f, _, _)| (f.to_string(), std::fs::read(dir().join("streams").join(f)).expect("a fixture stream"))).collect()
|
|
}
|
|
|
|
#[test]
|
|
fn the_rendition_corpus_regenerates_byte_for_byte() {
|
|
let pkg = Package::read(&dir().join(corpus::PACKAGE), corpus::COMPONENT).expect("the base golden");
|
|
let files = corpus::generate(&pkg, &streams()).expect("the corpus generates");
|
|
for (p, b) in &files {
|
|
assert_eq!(std::fs::read(dir().join(p)).ok().as_ref(), Some(b), "{p} does not regenerate: run `wai-pack rendition-vectors gen`");
|
|
}
|
|
let on_disk = wai::pin::read_dir_set(&dir().join("cases")).expect("cases/");
|
|
let want: BTreeMap<String, Vec<u8>> = files.iter().filter_map(|(k, v)| k.strip_prefix("cases/").map(|k| (k.to_string(), v.clone()))).collect();
|
|
assert_eq!(on_disk.keys().collect::<Vec<_>>(), want.keys().collect::<Vec<_>>(), "cases/ holds exactly the generated files");
|
|
}
|
|
|
|
#[test]
|
|
fn every_rendition_case_gets_its_outcome() {
|
|
let n = corpus::check(&dir()).unwrap_or_else(|e| panic!("{e}"));
|
|
assert!(n >= 9);
|
|
}
|
|
|
|
#[test]
|
|
fn the_stream_pins_hold() {
|
|
let pins: serde_json::Value = serde_json::from_slice(&std::fs::read(dir().join("streams.json")).expect("streams.json")).expect("JSON");
|
|
for (k, v) in streams() {
|
|
assert_eq!(pins[&k].as_str(), Some(wai_pack::sha256_hex(&v).as_str()), "{k}");
|
|
}
|
|
}
|