use blosc2_src::*;
#[test]
fn roundtrip() {
unsafe {
blosc2_init();
let text =
"I am here writing some very cool and novel words which I will compress and decompress";
let bytes = text.as_bytes();
let mut compressed = vec![0; bytes.len() * 2];
let stat = blosc2_compress(
9,
BLOSC_NOSHUFFLE as _,
std::mem::size_of::<u8>() as i32,
bytes.as_ptr().cast(),
bytes.len() as i32,
compressed.as_mut_ptr().cast(),
compressed.len() as i32,
);
assert!(stat > 0);
let mut outtext = vec![0_u8; bytes.len()];
let stat = blosc2_decompress(
compressed.as_ptr().cast(),
compressed.len() as i32,
outtext.as_mut_ptr().cast(),
outtext.len() as i32,
);
assert!(stat > 0);
assert_eq!(text, std::str::from_utf8(&outtext).unwrap());
blosc2_destroy();
}
}
#[test]
fn floats_roundtrip() {
let src: Vec<f32> = (0..10000)
.map(|num| ((num * 8923) % 100) as f32 / 2f32) .collect();
let dest: Vec<u8> = {
let typesize = std::mem::size_of::<f32>();
let src_size = src.len() * typesize;
let dest_size = src_size + BLOSC2_MAX_OVERHEAD as usize;
let mut dest = vec![0; dest_size];
let rsize = unsafe {
let mut cparams = BLOSC2_CPARAMS_DEFAULTS;
cparams.typesize = typesize as i32;
let context = blosc2_create_cctx(cparams);
blosc2_compress_ctx(
context,
src.as_ptr().cast(),
src_size as i32,
dest.as_mut_ptr().cast(),
dest_size as i32,
)
};
assert!(rsize > 0);
dest.drain(rsize as usize..);
dest
};
assert!(src.len() * std::mem::size_of::<f32>() > dest.len());
let result = {
let mut nbytes: i32 = 0;
let mut _cbytes: i32 = 0;
let mut _blocksize: i32 = 0;
unsafe {
blosc2_cbuffer_sizes(
dest.as_ptr().cast(),
&mut nbytes,
&mut _cbytes,
&mut _blocksize,
)
};
assert!(nbytes != 0);
let dest_size = nbytes / std::mem::size_of::<f32>() as i32;
let mut result = vec![0f32; dest_size as usize];
let error = unsafe {
let dparams = BLOSC2_DPARAMS_DEFAULTS;
let context = blosc2_create_dctx(dparams);
blosc2_decompress_ctx(
context,
dest.as_ptr().cast(),
dest.len() as i32,
result.as_mut_ptr().cast(),
nbytes,
)
};
assert!(error >= 1);
result
};
assert_eq!(src, result);
}