use lz4::{
compress_inplace_buffer_size, decompress_inplace_buffer_size, decompress_inplace_margin,
size_of_state, version_number, version_string, COMPRESS_INPLACE_MARGIN, LZ4_DISTANCE_MAX,
LZ4_VERSION_MAJOR, LZ4_VERSION_MINOR, LZ4_VERSION_NUMBER, LZ4_VERSION_RELEASE,
LZ4_VERSION_STRING,
};
#[test]
fn version_major_is_1() {
assert_eq!(LZ4_VERSION_MAJOR, 1);
}
#[test]
fn version_minor_is_10() {
assert_eq!(LZ4_VERSION_MINOR, 10);
}
#[test]
fn version_release_is_0() {
assert_eq!(LZ4_VERSION_RELEASE, 0);
}
#[test]
fn version_number_constant_formula() {
assert_eq!(LZ4_VERSION_NUMBER, 11_000);
}
#[test]
fn version_number_constant_components() {
let expected = LZ4_VERSION_MAJOR * 100 * 100 + LZ4_VERSION_MINOR * 100 + LZ4_VERSION_RELEASE;
assert_eq!(LZ4_VERSION_NUMBER, expected);
}
#[test]
fn version_string_constant() {
assert_eq!(LZ4_VERSION_STRING, "1.10.0");
}
#[test]
fn version_number_fn_returns_constant() {
assert_eq!(version_number(), LZ4_VERSION_NUMBER);
assert_eq!(version_number(), 11_000);
}
#[test]
fn version_string_fn_returns_constant() {
assert_eq!(version_string(), LZ4_VERSION_STRING);
assert_eq!(version_string(), "1.10.0");
}
#[test]
fn version_string_fn_is_static() {
let s: &'static str = version_string();
assert!(!s.is_empty());
}
#[test]
fn size_of_state_is_positive() {
assert!(
size_of_state() > 0,
"size_of_state must be a positive number of bytes"
);
}
#[test]
fn size_of_state_matches_stream_state_internal_size() {
let rust_size = core::mem::size_of::<lz4::block::types::StreamStateInternal>() as i32;
assert_eq!(size_of_state(), rust_size);
}
#[test]
fn size_of_state_is_at_least_16_bytes() {
assert!(
size_of_state() >= 16,
"state size should be at least 16 bytes"
);
}
#[test]
fn decompress_inplace_margin_zero() {
assert_eq!(decompress_inplace_margin(0), 32);
}
#[test]
fn decompress_inplace_margin_256() {
assert_eq!(decompress_inplace_margin(256), 33);
}
#[test]
fn decompress_inplace_margin_1024() {
assert_eq!(decompress_inplace_margin(1024), 36);
}
#[test]
fn decompress_inplace_margin_65536() {
assert_eq!(decompress_inplace_margin(65536), 288);
}
#[test]
fn decompress_inplace_margin_formula() {
for x in [0usize, 1, 127, 255, 256, 512, 1000, 4096, 65535, 65536] {
let expected = (x >> 8) + 32;
assert_eq!(
decompress_inplace_margin(x),
expected,
"margin mismatch for compressed_size={x}"
);
}
}
#[test]
fn decompress_inplace_buffer_size_zero() {
assert_eq!(decompress_inplace_buffer_size(0), 32);
}
#[test]
fn decompress_inplace_buffer_size_1024() {
assert_eq!(decompress_inplace_buffer_size(1024), 1060);
}
#[test]
fn decompress_inplace_buffer_size_formula() {
for x in [0usize, 1, 255, 256, 1024, 4096, 65535] {
let expected = x + (x >> 8) + 32;
assert_eq!(
decompress_inplace_buffer_size(x),
expected,
"buffer_size mismatch for decompressed_size={x}"
);
}
}
#[test]
fn decompress_inplace_buffer_size_larger_than_input() {
for x in [1usize, 100, 1024, 65535] {
assert!(
decompress_inplace_buffer_size(x) > x,
"buffer size must exceed decompressed size for x={x}"
);
}
}
#[test]
fn lz4_distance_max_value() {
assert_eq!(LZ4_DISTANCE_MAX, 65_535usize);
}
#[test]
fn compress_inplace_margin_value() {
assert_eq!(COMPRESS_INPLACE_MARGIN, 65_567usize);
}
#[test]
fn compress_inplace_margin_formula() {
assert_eq!(COMPRESS_INPLACE_MARGIN, LZ4_DISTANCE_MAX + 32);
}
#[test]
fn compress_inplace_buffer_size_zero() {
assert_eq!(compress_inplace_buffer_size(0), COMPRESS_INPLACE_MARGIN);
}
#[test]
fn compress_inplace_buffer_size_1024() {
assert_eq!(compress_inplace_buffer_size(1024), 66_591usize);
}
#[test]
fn compress_inplace_buffer_size_formula() {
for x in [0usize, 1, 256, 1024, 65535, 65536] {
let expected = x + COMPRESS_INPLACE_MARGIN;
assert_eq!(
compress_inplace_buffer_size(x),
expected,
"buffer size mismatch for max_compressed_size={x}"
);
}
}
#[test]
fn compress_inplace_buffer_size_larger_than_input() {
for x in [0usize, 1, 1024, 65535] {
assert!(
compress_inplace_buffer_size(x) > x,
"buffer must exceed max_compressed_size for x={x}"
);
}
}
#[test]
fn reexport_lz4_compress_default_is_callable() {
let src = b"hello lz4 reexport test";
let bound = lz4::block::compress::compress_bound(src.len() as i32) as usize;
let mut dst = vec![0u8; bound];
let result = lz4::lz4_compress_default(src, &mut dst);
assert!(
result.is_ok(),
"lz4_compress_default reexport must work: {result:?}"
);
assert!(result.unwrap() > 0);
}
#[test]
fn reexport_lz4_decompress_safe_is_callable() {
let src = b"round-trip test via top-level reexports";
let bound = lz4::block::compress::compress_bound(src.len() as i32) as usize;
let mut compressed = vec![0u8; bound];
let n = lz4::lz4_compress_default(src, &mut compressed).unwrap();
let mut decompressed = vec![0u8; src.len()];
let result = lz4::lz4_decompress_safe(&compressed[..n], &mut decompressed);
assert!(
result.is_ok(),
"lz4_decompress_safe reexport must succeed: {result:?}"
);
let m = result.unwrap();
assert_eq!(m, src.len());
assert_eq!(&decompressed[..m], src.as_ref());
}