use general_purpose_paracletic_hyper_cube::compression::{
Codec, CompressionError, compress_with, decompress_with, stats_with,
};
use general_purpose_paracletic_hyper_cube::datasets::{
harmonic_wave, mixed_signal, pseudo_random, pulse_train,
};
fn assert_roundtrip(codec: Codec, data: &[u8]) {
let encoded = compress_with(codec, data);
let decoded = decompress_with(codec, &encoded).expect("decompression should succeed");
assert_eq!(decoded, data, "roundtrip mismatch for {}", codec.name());
}
#[test]
fn every_codec_roundtrips_common_datasets() {
let datasets = vec![
harmonic_wave(8192),
pulse_train(8192),
mixed_signal(8192, 0xCAFE_BABE),
pseudo_random(8192, 0xABCD_1234),
];
for codec in Codec::ALL {
for dataset in &datasets {
assert_roundtrip(codec, dataset);
}
}
}
#[test]
fn chromoharmonic_outperforms_rle_on_harmonic_wave() {
let dataset = harmonic_wave(16384);
let chromo = compress_with(Codec::Chromoharmonic, &dataset);
let rle = compress_with(Codec::RunLength, &dataset);
assert!(
chromo.len() < rle.len(),
"expected chromoharmonic to beat RLE on smooth harmonic data"
);
}
#[test]
fn corrupted_streams_return_errors() {
let chromo_bad = vec![42, 0x80];
let delta_bad = vec![12, 0x80];
let rle_bad = vec![3];
assert!(matches!(
decompress_with(Codec::Chromoharmonic, &chromo_bad),
Err(CompressionError::CorruptStream(_))
));
assert!(matches!(
decompress_with(Codec::DeltaPulse, &delta_bad),
Err(CompressionError::CorruptStream(_))
));
assert!(matches!(
decompress_with(Codec::RunLength, &rle_bad),
Err(CompressionError::CorruptStream(_))
));
}
#[test]
fn stats_match_compression_output_size() {
let dataset = mixed_signal(4096, 7);
for codec in Codec::ALL {
let compressed = compress_with(codec, &dataset);
let stats = stats_with(codec, &dataset).expect("stats check");
assert_eq!(stats.input_bytes, dataset.len());
assert_eq!(stats.output_bytes, compressed.len());
}
}