use std::path::PathBuf;
fn fixture(name: &str) -> Vec<u8> {
let path = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.join("tests/fixtures")
.join(name);
std::fs::read(&path).unwrap_or_else(|e| panic!("could not read fixture {name}: {e}"))
}
#[test]
fn detects_lzexe_exe_as_compressed() {
let data = fixture("LZEXE.EXE");
assert!(lzexe::is_compressed(&data));
}
#[test]
fn detects_upackexe_as_compressed() {
let data = fixture("UPACKEXE.EXE");
assert!(lzexe::is_compressed(&data));
}
#[test]
fn does_not_flag_random_bytes_as_compressed() {
assert!(!lzexe::is_compressed(b"hello world"));
}
#[test]
fn does_not_flag_bare_mz_header_as_compressed() {
let mut hdr = vec![0u8; 64];
hdr[0] = 0x4D; hdr[1] = 0x5A; hdr[6] = 2; hdr[0x18] = 0x40; assert!(!lzexe::is_compressed(&hdr));
}
#[test]
fn passthrough_returns_input_unchanged_for_non_exe() {
let input = b"not an exe at all".to_vec();
let out = lzexe::decompress(&input).unwrap();
assert_eq!(out, input);
}
#[test]
fn passthrough_returns_input_unchanged_for_plain_mz() {
let mut exe = vec![0u8; 512];
exe[0] = 0x4D; exe[1] = 0x5A; exe[4] = 2; exe[6] = 1; let out = lzexe::decompress(&exe).unwrap();
assert_eq!(out, exe);
}
#[test]
fn decompresses_lzexe_exe_to_expected_size() {
let data = fixture("LZEXE.EXE");
let out = lzexe::decompress(&data).expect("decompression failed");
assert_eq!(out.len(), 19440, "unexpected decompressed size");
}
#[test]
fn decompresses_upackexe_to_expected_size() {
let data = fixture("UPACKEXE.EXE");
let out = lzexe::decompress(&data).expect("decompression failed");
assert_eq!(out.len(), 11840, "unexpected decompressed size");
}
#[test]
fn decompressed_lzexe_exe_contains_version_string() {
let data = fixture("LZEXE.EXE");
let out = lzexe::decompress(&data).expect("decompression failed");
let needle = b"LZEXE.EXE Version 0.91";
assert!(
out.windows(needle.len()).any(|w| w == needle),
"version string not found in decompressed LZEXE.EXE"
);
}
#[test]
fn decompressed_upackexe_contains_version_string() {
let data = fixture("UPACKEXE.EXE");
let out = lzexe::decompress(&data).expect("decompression failed");
let needle = b"UPACKEXE";
assert!(
out.windows(needle.len()).any(|w| w == needle),
"version string not found in decompressed UPACKEXE.EXE"
);
}
#[test]
fn decompressed_lzexe_exe_is_valid_mz() {
let data = fixture("LZEXE.EXE");
let out = lzexe::decompress(&data).unwrap();
assert_eq!(&out[0..2], b"MZ", "output does not start with MZ");
let reloc_count = u16::from_le_bytes([out[6], out[7]]);
assert!(reloc_count > 0, "expected relocation entries in decompressed output");
assert!(!lzexe::is_compressed(&out), "output should not itself be LZEXE-packed");
}
#[test]
fn decompress_is_idempotent_on_plain_mz() {
let data = fixture("LZEXE.EXE");
let once = lzexe::decompress(&data).unwrap();
let twice = lzexe::decompress(&once).unwrap();
assert_eq!(once, twice);
}
#[test]
fn lzexe_exe_matches_golden() {
let compressed = fixture("LZEXE.EXE");
let golden = fixture("LZEXE_GOLD.EXE");
let out = lzexe::decompress(&compressed).expect("decompression failed");
assert_eq!(out, golden, "LZEXE.EXE decompressed output differs from golden");
}
#[test]
fn upackexe_matches_golden() {
let compressed = fixture("UPACKEXE.EXE");
let golden = fixture("UPACKEXE_GOLD.EXE");
let out = lzexe::decompress(&compressed).expect("decompression failed");
assert_eq!(out, golden, "UPACKEXE.EXE decompressed output differs from golden");
}
#[test]
fn gamecompjs_lzexe91_matches_golden() {
let out = lzexe::decompress(&fixture("lzexe91.bin")).expect("decompression failed");
assert_eq!(out, fixture("gamecompjs_gold.bin"));
}
#[test]
fn gamecompjs_lzexe91e_matches_golden() {
let out = lzexe::decompress(&fixture("lzexe91e.bin")).expect("decompression failed");
assert_eq!(out, fixture("gamecompjs_gold.bin"));
}
#[test]
fn gamecompjs_lzexe90_payload_matches() {
let out90 = lzexe::decompress(&fixture("lzexe90.bin")).expect("decompression failed");
let out91 = fixture("gamecompjs_gold.bin");
let header_paras_90 = u16::from_le_bytes([out90[8], out90[9]]) as usize;
let header_paras_91 = u16::from_le_bytes([out91[8], out91[9]]) as usize;
assert_eq!(out90[header_paras_90 * 16..], out91[header_paras_91 * 16..]);
}