1#![cfg(feature = "bzip2")]
8
9pub(crate) mod decoder;
10pub(crate) mod encoder;
11pub(crate) mod error;
12mod mtf;
13
14const HEADER_B: u8 = 0x42;
15const HEADER_Z: u8 = 0x5a;
16#[allow(non_upper_case_globals)]
17const HEADER_h: u8 = 0x68;
18const HEADER_0: u8 = 0x30;
19
20const BZ_G_SIZE: usize = 50;
21
22#[cfg(test)]
23mod tests {
24 use crate::action::Action;
25 use crate::bzip2::decoder::BZip2Decoder;
26 use crate::bzip2::encoder::BZip2Encoder;
27 use crate::traits::decoder::DecodeExt;
28 use crate::traits::encoder::EncodeExt;
29 #[cfg(not(feature = "std"))]
30 #[allow(unused_imports)]
31 use alloc::vec;
32 #[cfg(not(feature = "std"))]
33 use alloc::vec::Vec;
34 use log::debug;
35 use simple_logger;
36
37 fn setup() {
38 let _ = simple_logger::init();
39 }
40
41 #[test]
42 fn test_unit() {
43 setup();
44 let ret = b"a\n"
45 .iter()
46 .cloned()
47 .encode(&mut BZip2Encoder::new(9), Action::Finish)
48 .collect::<Result<Vec<_>, _>>();
49
50 assert_eq!(
51 ret,
52 Ok(vec![
53 0x42, 0x5A, 0x68, 0x39, 0x31, 0x41, 0x59, 0x26, 0x53, 0x59,
54 0x63, 0x3E, 0xD6, 0xE2, 0x00, 0x00, 0x00, 0xC1, 0x00, 0x00,
55 0x10, 0x20, 0x00, 0x20, 0x00, 0x21, 0x00, 0x82, 0xB1, 0x77,
56 0x24, 0x53, 0x85, 0x09, 0x06, 0x33, 0xED, 0x6E, 0x20,
57 ])
58 );
59
60 let ret2 = ret
61 .unwrap()
62 .iter()
63 .cloned()
64 .decode(&mut BZip2Decoder::new())
65 .collect::<Result<Vec<_>, _>>();
66 if let Err(e) = ret2 {
67 debug!("{}", e);
68 }
69 assert_eq!(ret2, Ok(b"a\n".to_vec()));
70 }
71
72 fn check_unzip(actual: &[u8], expected: &[u8]) {
73 let ret2 = actual
74 .iter()
75 .cloned()
76 .decode(&mut BZip2Decoder::new())
77 .collect::<Result<Vec<_>, _>>();
78 if let Err(e) = ret2 {
79 debug!("{}", e);
80 }
81 assert!(ret2 == Ok(expected.to_vec()), "invalid unzip");
82 }
83
84 #[test]
85 fn test_sample1() {
86 setup();
87
88 let mut encoder = BZip2Encoder::new(1);
89 let ret = include_bytes!("../../data/sample1.ref")
90 .iter()
91 .cloned()
92 .encode(&mut encoder, Action::Finish)
93 .collect::<Result<Vec<_>, _>>()
94 .unwrap();
95 check_unzip(&ret, include_bytes!("../../data/sample1.ref"));
96
97 check_unzip(
98 include_bytes!("../../data/sample1.bz2"),
99 include_bytes!("../../data/sample1.ref"),
100 );
101 }
102
103 #[test]
104 fn test_sample2() {
105 setup();
106
107 let mut encoder = BZip2Encoder::new(2);
108 let ret = include_bytes!("../../data/sample2.ref")
109 .iter()
110 .cloned()
111 .encode(&mut encoder, Action::Finish)
112 .collect::<Result<Vec<_>, _>>()
113 .unwrap();
114 check_unzip(&ret, include_bytes!("../../data/sample2.ref"));
115
116 check_unzip(
117 include_bytes!("../../data/sample2.bz2"),
118 include_bytes!("../../data/sample2.ref"),
119 );
120 }
121
122 #[test]
123 fn test_sample3() {
124 setup();
125
126 let mut encoder = BZip2Encoder::new(3);
127 let ret = include_bytes!("../../data/sample3.ref")
128 .iter()
129 .cloned()
130 .encode(&mut encoder, Action::Finish)
131 .collect::<Result<Vec<_>, _>>()
132 .unwrap();
133 check_unzip(&ret, include_bytes!("../../data/sample3.ref"));
134
135 check_unzip(
136 include_bytes!("../../data/sample3.bz2"),
137 include_bytes!("../../data/sample3.ref"),
138 );
139 }
140
141 #[test]
142 fn test_sample4() {
143 setup();
144 check_unzip(
145 include_bytes!("../../data/sample4.bz2"),
146 include_bytes!("../../data/sample4.ref"),
147 );
148 }
149
150 #[test]
151 fn test_long() {
152 setup();
153 let data = b"a".iter().cycle().take(1000).cloned().collect::<Vec<u8>>();
154
155 let compressed = data
156 .iter()
157 .cloned()
158 .encode(&mut BZip2Encoder::new(9), Action::Finish)
159 .collect::<Result<Vec<_>, _>>();
160
161 let decompressed = compressed
162 .unwrap()
163 .iter()
164 .cloned()
165 .decode(&mut BZip2Decoder::new())
166 .collect::<Result<Vec<_>, _>>();
167
168 if let Err(e) = decompressed {
169 debug!("{}", e);
170 }
171 assert_eq!(decompressed, Ok(data));
172 }
173}