Skip to main content

libflate/
lz77.rs

1//! The interface and implementations of LZ77 compression algorithm.
2//!
3//! LZ77 is a compression algorithm used in [DEFLATE](https://tools.ietf.org/html/rfc1951).
4pub use libflate_lz77::*;
5
6#[cfg(test)]
7mod tests {
8    use super::*;
9    use crate::deflate;
10    use crate::deflate::symbol::Symbol;
11    use alloc::{vec, vec::Vec};
12    use no_std_io2::io::{Read as _, Write as _};
13
14    #[test]
15    // See: https://github.com/sile/libflate/issues/21
16    fn issue21() {
17        let mut enc = DefaultLz77Encoder::new();
18        let mut sink = Vec::<Symbol>::new();
19        enc.encode(b"aaaaa", &mut sink);
20        enc.flush(&mut sink);
21        assert_eq!(
22            sink,
23            vec![
24                Symbol::Code(Code::Literal(97)),
25                Symbol::Code(Code::Pointer {
26                    length: 4,
27                    backward_distance: 1
28                })
29            ]
30        );
31    }
32
33    #[test]
34    fn no_compression_encoder_works_with_deflate() {
35        let options = deflate::EncodeOptions::with_lz77(NoCompressionLz77Encoder::new());
36        let mut encoder = deflate::Encoder::with_options(Vec::new(), options);
37        encoder.write_all(b"hello world").unwrap();
38        let encoded = encoder.finish().into_result().unwrap();
39
40        let mut decoder = deflate::Decoder::new(&encoded[..]);
41        let mut decoded = Vec::new();
42        decoder.read_to_end(&mut decoded).unwrap();
43        assert_eq!(decoded, b"hello world");
44    }
45
46    #[test]
47    fn default_encoder_works_with_deflate() {
48        let options = deflate::EncodeOptions::with_lz77(DefaultLz77Encoder::new());
49        let mut encoder = deflate::Encoder::with_options(Vec::new(), options);
50        encoder.write_all(b"hello hello hello").unwrap();
51        let encoded = encoder.finish().into_result().unwrap();
52
53        let mut decoder = deflate::Decoder::new(&encoded[..]);
54        let mut decoded = Vec::new();
55        decoder.read_to_end(&mut decoded).unwrap();
56        assert_eq!(decoded, b"hello hello hello");
57    }
58}