1#![allow(clippy::needless_doctest_main)]
2#![doc = include_str!("../README.md")]
3
4mod decoder;
5mod encoder;
6
7pub use decoder::{DeltaDecoder, DeltaDecoderExt, DeltaDecoderIter};
8pub use encoder::{DeltaEncoder, DeltaEncoderExt, DeltaEncoderIter};
9
10#[cfg(test)]
11mod tests {
12 use std::iter::zip;
13
14 use super::*;
15
16 pub(crate) const TEST_DATA: &[(&[i64], &[i64])] = &[
17 (&[], &[]),
18 (&[0], &[0]),
19 (&[1], &[1]),
20 (&[1, 2], &[1, 1]),
21 (&[1, -2], &[1, -3]),
22 (&[1, 3, 5], &[1, 2, 2]),
23 (&[1, 3, 10], &[1, 2, 7]),
24 (&[i64::MIN], &[i64::MIN]),
25 (&[i64::MAX], &[i64::MAX]),
26 (
27 &[i64::MAX, i64::MIN],
28 &[i64::MAX, i64::MIN.wrapping_sub(i64::MAX)],
29 ),
30 (&[0, i64::MAX], &[0, i64::MAX]),
31 (
32 &[0, i64::MAX, i64::MIN, i64::MAX],
33 &[
34 0,
35 i64::MAX,
36 i64::MIN.wrapping_sub(i64::MAX),
37 i64::MAX.wrapping_add(i64::MAX) + 1,
38 ],
39 ),
40 ];
41
42 fn run(original: &[i64], encoded: &[i64]) {
43 assert_eq!(original.len(), encoded.len());
44
45 let mut enc = DeltaEncoder::default();
46 let mut dec = DeltaDecoder::default();
47 for (&o, &e) in zip(original, encoded) {
48 assert_eq!(enc.encode(o), e, "individual encoded value mismatch");
49 assert_eq!(dec.decode(e), o, "individual decoded value mismatch");
50 }
51
52 let result: Vec<i64> = encoded.iter().copied().original().deltas().collect();
53 assert_eq!(result, encoded, "round-trip decoded: {encoded:?}");
54
55 let result: Vec<i64> = original.iter().copied().deltas().original().collect();
56 assert_eq!(result, original, "round-trip original: {original:?}");
57 }
58
59 #[test]
60 fn test() {
61 for &(original, encoded) in TEST_DATA {
62 run(original, encoded);
63 }
64 }
65}