nada/
lib.rs

1mod encoder;
2use encoder::Encoder;
3
4mod decoder;
5pub use decoder::DecodeError;
6use decoder::Decoder;
7
8pub fn encode(input: impl IntoIterator<Item = u8>) -> Vec<u8> {
9    let mut encoder = Encoder::new();
10
11    for byte in input {
12        encoder.feed(byte);
13    }
14
15    encoder.output()
16}
17
18pub fn decode(input: impl IntoIterator<Item = u8>) -> Result<Vec<u8>, DecodeError> {
19    let mut decoder = Decoder::new();
20    let mut iter = input.into_iter();
21
22    while let Some(byte) = iter.next() {
23        decoder.feed(byte)?;
24    }
25
26    decoder.output()
27}
28
29#[cfg(test)]
30mod tests {
31    use super::*;
32
33    #[test]
34    fn test_encode_decode() {
35        let data = vec![0, 0, 0xFF, 0, 0, 0, 0xFF, 0];
36        let encoded = encode(data.clone());
37        let decoded = decode(encoded).unwrap();
38        assert_eq!(data, decoded);
39    }
40
41    #[test]
42    fn test_encode_decode_empty() {
43        let data: Vec<u8> = vec![];
44        let encoded = encode(data.clone());
45        let decoded = decode(encoded);
46        assert_eq!(Ok(data), decoded);
47    }
48
49    #[test]
50    fn test_encode_decode_no_zeros() {
51        let data = vec![1, 2, 3, 4, 5];
52        let encoded = encode(data.clone());
53        let decoded = decode(encoded);
54        assert_eq!(Ok(data), decoded);
55    }
56
57    #[test]
58    fn test_encode_decode_no_zeros_or_ff() {
59        let data = vec![1, 2, 3, 4, 5];
60        let encoded = encode(data.clone());
61        let decoded = decode(encoded);
62        assert_eq!(Ok(data), decoded);
63    }
64
65    #[test]
66    fn test_encode_decode_only_zeros() {
67        let data = vec![0, 0, 0, 0];
68        let encoded = encode(data.clone());
69        assert_eq!(encoded, vec![0xFF, 4]);
70        let decoded = decode(encoded);
71        assert_eq!(Ok(data), decoded);
72    }
73
74    #[test]
75    fn test_encode_decode_only_ff() {
76        let data = vec![0xFF, 0xFF, 0xFF];
77        let encoded = encode(data.clone());
78        assert_eq!(encoded, vec![0xFF, 2, 0xFF, 1]);
79        let decoded = decode(encoded);
80        assert_eq!(Ok(data), decoded);
81    }
82
83    #[test]
84    fn test_encode_decode_mixed() {
85        let data = vec![0, 0xFF, 1, 2, 0, 0, 0xFF, 3];
86        let encoded = encode(data.clone());
87        let decoded = decode(encoded);
88        assert_eq!(Ok(data), decoded);
89    }
90
91    #[test]
92    fn test_encode_decode_large_run() {
93        let data = vec![0; 300];
94        let encoded = encode(data.clone());
95        assert_eq!(encoded, vec![0xFF, 255, 0xFF, 45]);
96        let decoded = decode(encoded);
97        assert_eq!(Ok(data), decoded);
98    }
99
100    #[test]
101    fn test_encode_decode_large_run_with_ff() {
102        let mut data = vec![0; 300];
103        data[100] = 0xFF;
104        let encoded = encode(data.clone());
105        assert_eq!(encoded, vec![0xFF, 100, 0xFF, 1, 0xFF, 199]);
106        let decoded = decode(encoded);
107        assert_eq!(Ok(data), decoded);
108    }
109
110    #[test]
111    fn test_error_unexpected_eof() {
112        let data = vec![0xFF];
113        let result = decode(data);
114        assert_eq!(result, Err(DecodeError::UnexpectedEOF));
115    }
116
117    #[test]
118    fn test_error_unexpected_eof_with_zeros() {
119        let data = vec![0xFF, 25, 0xFF];
120        let result = decode(data);
121        assert_eq!(result, Err(DecodeError::UnexpectedEOF));
122    }
123
124    #[test]
125    fn test_reserved_sequence() {
126        let encoded = vec![0xFF, 0x01, 0xFF, 0x05, 2, 0xFF, 0, 0x03];
127        assert_eq!(decode(encoded), Err(DecodeError::ReservedSequence));
128    }
129}