#[path = "fixtures.rs"]
mod fixtures;
use fixtures::FIXTURES;
use pith_zip::ZipArchive;
fn load(file: &str) -> Vec<u8> {
let path = std::path::Path::new(env!("CARGO_MANIFEST_DIR"))
.join("tests")
.join("fixtures")
.join(file);
std::fs::read(&path).unwrap_or_else(|e| panic!("cannot read fixture {}: {e}", path.display()))
}
#[test]
fn every_fixture_matches_its_corpus_entry() {
for fixture in FIXTURES {
let data = load(fixture.file);
let arc = ZipArchive::new(&data).unwrap_or_else(|e| {
panic!(
"fixture {} ({}): failed to parse: {e}",
fixture.file, fixture.why
)
});
assert_eq!(
arc.len(),
fixture.members.len(),
"fixture {} member count drifted from the corpus",
fixture.file
);
for (entry, member) in arc.entries().iter().zip(fixture.members) {
assert_eq!(entry.name(), member.name);
assert_eq!(entry.method(), member.method);
assert_eq!(entry.uses_data_descriptor(), member.descriptor);
let body = member.body.bytes();
assert_eq!(entry.uncompressed_size(), body.len() as u64);
let bytes = arc.extract(entry).unwrap_or_else(|e| {
panic!(
"fixture {} member {} failed to extract: {e}",
fixture.file, member.name
)
});
assert_eq!(bytes, body);
assert_eq!(pith_digest::crc32(&bytes), entry.crc32());
}
}
}
#[test]
fn fixture_directory_and_corpus_agree() {
let mut committed: Vec<String> =
std::fs::read_dir(std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures"))
.expect("fixtures directory exists")
.map(|e| {
e.expect("dirent")
.file_name()
.to_string_lossy()
.into_owned()
})
.filter(|n| n.ends_with(".zip"))
.collect();
committed.sort();
let mut declared: Vec<String> = FIXTURES.iter().map(|f| f.file.to_owned()).collect();
declared.sort();
assert_eq!(committed, declared);
}
#[test]
fn empty_fixture_reports_empty() {
let data = load("empty.zip");
let arc = ZipArchive::new(&data).expect("empty fixture parses");
assert!(arc.is_empty());
assert!(arc.entries().is_empty());
assert!(arc.by_name("anything").is_none());
}
#[test]
fn stored_fixture_extracts_under_the_default_ceiling() {
let data = load("stored.zip");
let arc = ZipArchive::new(&data).expect("stored fixture parses");
let a = arc.by_name("a.txt").expect("a.txt present");
assert_eq!(
arc.extract(a).unwrap(),
b"stored payload, no compression at all"
);
}