hcompress/
lib.rs

1#[cfg(test)]
2#[macro_use]
3extern crate quickcheck;
4
5pub mod read;
6pub mod write;
7
8pub(crate) const CODE_MAGIC: [u8; 2] = [0xDD, 0x99];
9
10#[derive(Clone, Debug)]
11#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
12pub struct Data16 {
13    pub d: Vec<i16>,
14}
15
16#[derive(Clone, Debug)]
17#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
18pub struct Data32 {
19    pub d: Vec<i32>,
20}
21
22#[cfg(test)]
23mod tests {
24
25    use bytemuck::cast_slice_mut;
26    use quickcheck::TestResult;
27
28    use super::*;
29
30    quickcheck! {
31        fn encode_decode_32bit(input_data: Vec<i16>) -> TestResult {
32            let d = input_data.iter().map(|&x| x as i32).collect::<Vec<i32>>();
33            let mut input: Vec<i32> = d.clone();
34
35            let y = 1;
36            let x = input.len();
37            let scale = 0; //lossless
38
39            if x < 10 {
40                return TestResult::discard();
41            }
42
43            let mut compressed: Vec<u8> = Vec::with_capacity(x * y * 100);
44            let mut encoder = crate::write::HCEncoder::new(&mut compressed);
45
46            let _ = encoder.write(&mut input, y, x, scale);
47
48            let mut uncompressed: Vec<i32> = vec![0; x * y];
49            let mut decoder = crate::read::HCDecoder::new();
50            let _ = decoder.read(&compressed, 0, &mut uncompressed);
51
52            if d == uncompressed {
53                return TestResult::passed();
54            } else {
55                return TestResult::failed();
56            }
57        }
58
59
60        fn encode_decode_64bit(input_data: Vec<i32>) -> TestResult {
61            let d = input_data.iter().map(|&x| x as i64).collect::<Vec<i64>>();
62            let mut input: Vec<i64> = d.clone();
63
64            let y = 1;
65            let x = input.len();
66            let scale = 0; //lossless
67
68            if x < 2 {
69                return TestResult::discard();
70            }
71
72            let mut compressed: Vec<u8> = Vec::with_capacity(x * y * 100);
73            let mut encoder = crate::write::HCEncoder::new(&mut compressed);
74
75            let _ = encoder.write64(&mut input, y, x, scale);
76
77            let mut uncompressed: Vec<i32> = vec![0; x * y * 2];
78            let mut decoder = crate::read::HCDecoder::new();
79            let _ = decoder.read64(&compressed, 0, cast_slice_mut(&mut uncompressed));
80
81            if input_data == uncompressed[..(x*y)] {
82                return TestResult::passed();
83            } else {
84                return TestResult::failed();
85            }
86        }
87    }
88}