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