paracletics-hypercube 0.1.0

General-purpose paracletic hyper cube compression toolkit.
Documentation
use paracletics_hypercube::compression::{
    Codec, CompressionError, compress_with, decompress_with, stats_with,
};
use paracletics_hypercube::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());
    }
}