use crate::common::test_helpers::{compress_with_method, test_round_trip};
use wow_mpq::compression::{decompress, flags};
#[test]
fn test_sparse_decompression() {
let mut compressed = vec![];
let expected = b"Hello\0\0\0\0\0\0\0\0\0\0World\0\0\0\0\0End";
compressed.extend_from_slice(&[0x00, 0x00, 0x00, 0x1C]);
compressed.push(0x84); compressed.extend_from_slice(b"Hello");
compressed.push(0x07);
compressed.push(0x84); compressed.extend_from_slice(b"World");
compressed.push(0x02);
compressed.push(0x82); compressed.extend_from_slice(b"End");
let decompressed =
decompress(&compressed, flags::SPARSE, expected.len()).expect("Decompression failed");
assert_eq!(decompressed, expected);
}
#[test]
fn test_sparse_compression_decompression() {
let test_data = b"Data\0\0\0\0\0\0\0\0with\0\0\0\0lots\0\0\0\0\0\0\0\0of\0\0\0zeros";
let compressed = compress_with_method(test_data, flags::SPARSE).expect("Compression failed");
if !compressed.is_empty() && compressed[0] == flags::SPARSE {
assert!(compressed.len() < test_data.len());
println!(
"Sparse compression ratio for data with zeros: {:.1}%",
100.0 * compressed.len() as f64 / test_data.len() as f64
);
}
test_round_trip(test_data, flags::SPARSE).expect("Round trip failed");
}
#[test]
fn test_sparse_all_zeros() {
let all_zeros = vec![0u8; 1000];
let compressed = compress_with_method(&all_zeros, flags::SPARSE).expect("Compression failed");
if !compressed.is_empty() && compressed[0] == flags::SPARSE {
assert!(compressed.len() < 20);
println!(
"Sparse compression of 1000 zeros: {} bytes",
compressed.len()
);
}
test_round_trip(&all_zeros, flags::SPARSE).expect("All zeros round trip failed");
}
#[test]
fn test_sparse_no_zeros() {
let no_zeros: Vec<u8> = (1..=255).collect();
let compressed = compress_with_method(&no_zeros, flags::SPARSE).expect("Compression failed");
if !compressed.is_empty() && compressed[0] == flags::SPARSE {
assert!(compressed.len() > no_zeros.len());
}
test_round_trip(&no_zeros, flags::SPARSE).expect("No zeros round trip failed");
}