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; 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; 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}