zstd-complete 0.3.0

A pure Rust Zstandard compressor and decompressor with bounded streaming I/O
Documentation
use alloc::vec::Vec;

use super::{
    cctx_params::{LdmParameters, ParamSwitch},
    ldm::{
        sequence::{
            fill_prefix_hash_table, generate_sequences_no_dict, generate_sequences_with_prefix,
        },
        LdmHashTable,
    },
};

#[test]
fn ldm_no_dict_rejects_matches_beyond_window_like_c() {
    let params = LdmParameters {
        enable_ldm: ParamSwitch::Enable,
        window_log: 10,
        hash_log: 10,
        min_match_length: 16,
        bucket_size_log: 3,
        hash_rate_log: 0,
    };
    let max_distance = 1_u32 << params.window_log;
    let mut data = Vec::with_capacity(4096);
    let mut value = 0x9e37_79b9_u32;
    for _ in 0..4000 {
        value ^= value << 13;
        value ^= value >> 17;
        value ^= value << 5;
        data.push(value as u8);
    }

    let old_repeat = data[128..192].to_vec();
    data[3800..3864].copy_from_slice(&old_repeat);
    let near_repeat = data[3200..3264].to_vec();
    data[3900..3964].copy_from_slice(&near_repeat);
    let mut table = LdmHashTable::new(params);

    let result = generate_sequences_no_dict(&data, params, &mut table).expect("test storage admission");

    assert!(!result.sequences.is_empty());
    assert!(
        result
            .sequences
            .iter()
            .all(|sequence| sequence.offset <= max_distance),
        "{:?}",
        result.sequences
    );
}

#[test]
fn ldm_dictionary_match_can_exceed_window_until_dictionary_expires_like_c() {
    let params = LdmParameters {
        enable_ldm: ParamSwitch::Enable,
        window_log: 10,
        hash_log: 16,
        min_match_length: 16,
        bucket_size_log: 3,
        hash_rate_log: 0,
    };
    let max_distance = 1_u32 << params.window_log;
    let mut dictionary = Vec::with_capacity(2048);
    let mut value = 0xa5a5_1234_u32;
    for _ in 0..2048 {
        value ^= value << 13;
        value ^= value >> 17;
        value ^= value << 5;
        dictionary.push(value as u8);
    }
    let repeat = dictionary[128..192].to_vec();
    let mut combined = dictionary;
    let source_start = combined.len();
    combined.extend_from_slice(&repeat);
    let mut table = LdmHashTable::new(params);

    fill_prefix_hash_table(&combined, 0..source_start, params, &mut table);
    let result =
        generate_sequences_with_prefix(&combined, source_start..combined.len(), params, &mut table).expect("test storage admission");

    assert!(
        result
            .sequences
            .iter()
            .any(|sequence| sequence.offset > max_distance),
        "{:?}",
        result.sequences
    );
}