1mod bit_index;
2pub use crate::bit_index::{BitIndex, BitIndexable};
3
4mod bit_field;
5pub use crate::bit_field::{BitField, BitPad};
6
7pub mod semb;
8pub use crate::semb::{Semb, SembF16, SembF32, SembF64, SembF128};
9
10pub mod bin_regex;
11pub use crate::bin_regex::{BinRegex, BinMatch, BinCaptures};
12
13
14#[cfg(test)]
15mod match_tests {
16 use crate::{BinRegex, BitField, BitIndex, bx};
17
18 #[test]
19 fn captures_basic() {
20 let v = vec![0b01010101, 0b00110011, 0b00001111];
21 let re = BinRegex::new("(_'){4}_{2}").unwrap();
22 let caps = re.captures(&v).unwrap();
23 assert_eq!(caps.get(0).unwrap().span(), (bx!(,0), bx!(,10)));
24 assert_eq!(caps.get(0).unwrap().as_bf(), BitField::from_bin_str("0101 0101 00"));
25 assert_eq!(caps.get(1).unwrap().span(), (bx!(,6), bx!(,8)));
26 assert_eq!(caps.get(1).unwrap().as_bf(), BitField::from_bin_str("01"));
27
28 let re = BinRegex::new("(_')*").unwrap();
29 let caps = re.captures(&v).unwrap();
30 assert_eq!(caps.get(0).unwrap().span(), (bx!(,0), bx!(,8)));
31 assert_eq!(caps.get(0).unwrap().as_bf(), BitField::from_bin_str("0101 0101"));
32 assert_eq!(caps.get(1).unwrap().span(), (bx!(,6), bx!(,8)));
33 assert_eq!(caps.get(1).unwrap().as_bf(), BitField::from_bin_str("01"));
34
35 let re = BinRegex::new("_'((_')*)__('')(__'')*").unwrap();
36 let caps = re.captures(&v).unwrap();
37 assert_eq!(caps.get(0).unwrap().span(), (bx!(,0), bx!(,16)));
38 assert_eq!(caps.get(0).unwrap().as_bf(), BitField::from_bin_str("0101 0101 0011 0011"));
39 assert_eq!(caps.get(1).unwrap().span(), (bx!(,2), bx!(,8)));
40 assert_eq!(caps.get(1).unwrap().as_bf(), BitField::from_bin_str("0101 01"));
41 assert_eq!(caps.get(2).unwrap().span(), (bx!(,6), bx!(,8)));
42 assert_eq!(caps.get(2).unwrap().as_bf(), BitField::from_bin_str("01"));
43 assert_eq!(caps.get(3).unwrap().span(), (bx!(,10), bx!(,12)));
44 assert_eq!(caps.get(3).unwrap().as_bf(), BitField::from_bin_str("11"));
45 assert_eq!(caps.get(4).unwrap().span(), (bx!(,12), bx!(,16)));
46 assert_eq!(caps.get(4).unwrap().as_bf(), BitField::from_bin_str("0011"));
47
48 let re = BinRegex::new("_'(?<foo>(?<bar>_')*)__(?:'')(?<test>__'')*").unwrap();
49 assert_eq!(re.n_groups, 4);
50 let caps = re.captures(&v).unwrap();
51 assert_eq!(caps.get(0).unwrap().span(), (bx!(,0), bx!(,16)));
52 assert_eq!(caps.get(0).unwrap().as_bf(), BitField::from_bin_str("0101 0101 0011 0011"));
53 assert_eq!(caps.get(1).unwrap().span(), (bx!(,2), bx!(,8)));
54 assert_eq!(caps.get(1).unwrap().as_bf(), BitField::from_bin_str("0101 01"));
55 assert_eq!(caps.get(2).unwrap().span(), (bx!(,6), bx!(,8)));
56 assert_eq!(caps.get(2).unwrap().as_bf(), BitField::from_bin_str("01"));
57 assert_eq!(caps.get(3).unwrap().span(), (bx!(,12), bx!(,16)));
58 assert_eq!(caps.get(3).unwrap().as_bf(), BitField::from_bin_str("0011"));
59 assert_eq!(caps.name("foo").unwrap().span(), (bx!(,2), bx!(,8)));
60 assert_eq!(caps.name("foo").unwrap().as_bf(), BitField::from_bin_str("0101 01"));
61 assert_eq!(caps.name("bar").unwrap().span(), (bx!(,6), bx!(,8)));
62 assert_eq!(caps.name("bar").unwrap().as_bf(), BitField::from_bin_str("01"));
63 assert_eq!(caps.name("test").unwrap().span(), (bx!(,12), bx!(,16)));
64 assert_eq!(caps.name("test").unwrap().as_bf(), BitField::from_bin_str("0011"));
65
66 let v = vec![0b11010101, 0b00110100, 0b11010100, 0b11010101, 0b11110000];
67 let re = BinRegex::new("((('')|(_'))*|_)*f0").unwrap();
68 let caps = re.captures(&v).unwrap();
69 assert_eq!(caps.get(0).unwrap().span(), (bx!(,0), bx!(,40)));
70 assert_eq!(caps.get(1).unwrap().span(), (bx!(,24), bx!(,32)));
71 assert_eq!(caps.get(2).unwrap().span(), (bx!(,30), bx!(,32)));
72 assert_eq!(caps.get(3).unwrap().span(), (bx!(,24), bx!(,26)));
73 assert_eq!(caps.get(4).unwrap().span(), (bx!(,30), bx!(,32)));
74 }
75
76 #[test]
77 fn longest_match() {
78 let v = vec![0b01010101, 0b00110011, 0b00001111];
79 let re = BinRegex::new("(_')*_|(__)").unwrap();
80 let caps = re.captures(&v).unwrap();
81 assert_eq!(caps.get(0).unwrap().span(), (bx!(,0), bx!(,10)));
82
83 let re = BinRegex::new("(_')*?").unwrap();
84 let caps = re.captures(&v).unwrap();
85 assert_eq!(caps.get(0).unwrap().span(), (bx!(,0), bx!(,8)));
86 }
87
88 #[test]
89 fn basic() {
90 let v = vec![0b01010101, 0b00110011, 0b00001111];
91 assert_eq!(BinRegex::new("_'.").unwrap().match_length(&v), Some(bx!(,3)));
92 assert_eq!(BinRegex::new("_''").unwrap().match_length(&v), None);
93 assert_eq!(BinRegex::new("_'_'_'").unwrap().match_length(&v), Some(bx!(,6)));
94 assert_eq!(BinRegex::new(".'_!'__").unwrap().match_length(&v), Some(bx!(,14)));
95 assert_eq!(BinRegex::new("!!!").unwrap().match_length(&v), Some(bx!(,24)));
96 assert_eq!(BinRegex::new(".!!!").unwrap().match_length(&v), None);
97 assert_eq!(BinRegex::new("!!........").unwrap().match_length(&v), Some(bx!(,24)));
98 assert_eq!(BinRegex::new("!!____''''").unwrap().match_length(&v), Some(bx!(,24)));
99 assert_eq!(BinRegex::new("!!!.").unwrap().match_length(&v), None);
100
101 assert_eq!(BinRegex::new("55").unwrap().match_length(&v), Some(bx!(,8)));
102 assert_eq!(BinRegex::new("_aA").unwrap().match_length(&v), Some(bx!(,9)));
103 assert_eq!(BinRegex::new("_aA6_''0f").unwrap().match_length(&v), Some(bx!(,24)));
104 assert_eq!(BinRegex::new("!..c'8_F").unwrap().match_length(&v), Some(bx!(,24)));
105 }
106
107 #[test]
108 fn star_repetition() {
109 let v = vec![0b01010101, 0b00110011, 0b00001111];
110 assert_eq!(BinRegex::new("!_*").unwrap().match_length(&v), Some(bx!(,10)));
111 assert_eq!(BinRegex::new("!!.*_'").unwrap().match_length(&v), Some(bx!(,21)));
112 }
113
114 #[test]
115 fn exact_repetition() {
116 let v = vec![0b01010101, 0b00110011];
117 assert_eq!(BinRegex::new("_'_'_'_'_{2}").unwrap().match_length(&v), Some(bx!(,10)));
118 assert_eq!(BinRegex::new("(_'){4}_{2}").unwrap().match_length(&v), Some(bx!(,10)));
119 assert_eq!(BinRegex::new("(_'){5}_{2}").unwrap().match_length(&v), None);
120 }
121
122 #[test]
123 fn anchors() {
124 let v = vec![0b01010101, 0b00110011, 0b00001111];
125 assert_eq!(BinRegex::new(":5;5;33:0f:").unwrap().match_length(&v), Some(bx!(,24)));
126 assert_eq!(BinRegex::new(":5:5;33:0f:").unwrap().match_length(&v), None);
127 assert_eq!(BinRegex::new(".:").unwrap().match_length(&v), None);
128 assert_eq!(BinRegex::new("..;").unwrap().match_length(&v), None);
129 assert_eq!(BinRegex::new(":").unwrap().match_length(&v), Some(bx!(,0)));
130 }
131
132 #[test]
133 fn repetition() {
134 let v = vec![0b01010101, 0b00110011];
135 assert_eq!(BinRegex::new("_''?_?").unwrap().match_length(&v), Some(bx!(,3)));
136 assert_eq!(BinRegex::new("_''?'").unwrap().match_length(&v), None);
137 assert_eq!(BinRegex::new("_'_'_'_'_{2}").unwrap().match_length(&v), Some(bx!(,10)));
138 assert_eq!(BinRegex::new("(_'){4}_{2}").unwrap().match_length(&v), Some(bx!(,10)));
139 assert_eq!(BinRegex::new("(_'){5}_{2}").unwrap().match_length(&v), None);
140 assert_eq!(BinRegex::new("(_'){2,}_{2,}").unwrap().match_length(&v), Some(bx!(,10)));
141 assert_eq!(BinRegex::new("(_'){5,}_{2}").unwrap().match_length(&v), None);
142 assert_eq!(BinRegex::new("(_'){1,}").unwrap().match_length(&v), Some(bx!(,8)));
143 assert_eq!(BinRegex::new("(_'){2,4}_{1,10}").unwrap().match_length(&v), Some(bx!(,10)));
144 assert_eq!(BinRegex::new("(_'){4,8}_{1,2}").unwrap().match_length(&v), Some(bx!(,10)));
145 assert_eq!(BinRegex::new("(_'){2,3}").unwrap().match_length(&v), Some(bx!(,6)));
146 assert_eq!(BinRegex::new("(_'){5,10}").unwrap().match_length(&v), None);
147 assert_eq!(BinRegex::new("(_')+_+").unwrap().match_length(&v), Some(bx!(,10)));
148 assert_eq!(BinRegex::new("(_')+__+").unwrap().match_length(&v), Some(bx!(,10)));
149 assert_eq!(BinRegex::new("(_')+___+").unwrap().match_length(&v), None);
150 }
151
152 #[test]
153 fn laziness() {
154 let v = vec![0b01010101, 0b00110011, 0b00001111];
155 let re = BinRegex::new("(_')??(_')*").unwrap();
156 let caps = re.captures(&v).unwrap();
157 assert_eq!(caps.get(0).unwrap().span(), (bx!(,0), bx!(,8)));
158 assert_eq!(caps.get(1), None);
159
160 let re = BinRegex::new("(_')?(_')*").unwrap();
161 let caps = re.captures(&v).unwrap();
162 assert_eq!(caps.get(0).unwrap().span(), (bx!(,0), bx!(,8)));
163 assert_eq!(caps.get(1).unwrap().span(), (bx!(,0), bx!(,2)));
164
165 let re = BinRegex::new("(_')*?(_')*").unwrap();
166 let caps = re.captures(&v).unwrap();
167 assert_eq!(caps.get(0).unwrap().span(), (bx!(,0), bx!(,8)));
168 assert_eq!(caps.get(1), None);
169
170 let re = BinRegex::new("(_')*?__").unwrap();
171 let caps = re.captures(&v).unwrap();
172 assert_eq!(caps.get(0).unwrap().span(), (bx!(,0), bx!(,10)));
173 assert_eq!(caps.get(1).unwrap().span(), (bx!(,6), bx!(,8)));
174
175 let re = BinRegex::new("(_')*(_')*").unwrap();
176 let caps = re.captures(&v).unwrap();
177 assert_eq!(caps.get(0).unwrap().span(), (bx!(,0), bx!(,8)));
178 assert_eq!(caps.get(1).unwrap().span(), (bx!(,6), bx!(,8)));
179
180 let re = BinRegex::new("(_')+?(_')*").unwrap();
181 let caps = re.captures(&v).unwrap();
182 assert_eq!(caps.get(0).unwrap().span(), (bx!(,0), bx!(,8)));
183 assert_eq!(caps.get(1).unwrap().span(), (bx!(,0), bx!(,2)));
184
185 let re = BinRegex::new("(_')+(_')*").unwrap();
186 let caps = re.captures(&v).unwrap();
187 assert_eq!(caps.get(0).unwrap().span(), (bx!(,0), bx!(,8)));
188 assert_eq!(caps.get(1).unwrap().span(), (bx!(,6), bx!(,8)));
189
190 let re = BinRegex::new("(_'){2,}?(_')*").unwrap();
191 let caps = re.captures(&v).unwrap();
192 assert_eq!(caps.get(0).unwrap().span(), (bx!(,0), bx!(,8)));
193 assert_eq!(caps.get(1).unwrap().span(), (bx!(,2), bx!(,4)));
194
195 let re = BinRegex::new("(_'){2,}(_')*").unwrap();
196 let caps = re.captures(&v).unwrap();
197 assert_eq!(caps.get(0).unwrap().span(), (bx!(,0), bx!(,8)));
198 assert_eq!(caps.get(1).unwrap().span(), (bx!(,6), bx!(,8)));
199
200 let re = BinRegex::new("(_'){1,3}?(_')*").unwrap();
201 let caps = re.captures(&v).unwrap();
202 assert_eq!(caps.get(0).unwrap().span(), (bx!(,0), bx!(,8)));
203 assert_eq!(caps.get(1).unwrap().span(), (bx!(,0), bx!(,2)));
204
205 let re = BinRegex::new("(_'){1,3}(_')*").unwrap();
206 let caps = re.captures(&v).unwrap();
207 assert_eq!(caps.get(0).unwrap().span(), (bx!(,0), bx!(,8)));
208 assert_eq!(caps.get(1).unwrap().span(), (bx!(,4), bx!(,6)));
209
210 let re = BinRegex::new("(_'){2}?(_')*").unwrap();
211 let caps = re.captures(&v).unwrap();
212 assert_eq!(caps.get(0).unwrap().span(), (bx!(,0), bx!(,8)));
213 assert_eq!(caps.get(1).unwrap().span(), (bx!(,2), bx!(,4)));
214
215 let re = BinRegex::new("(_'){2}(_')*").unwrap();
216 let caps = re.captures(&v).unwrap();
217 assert_eq!(caps.get(0).unwrap().span(), (bx!(,0), bx!(,8)));
218 assert_eq!(caps.get(1).unwrap().span(), (bx!(,2), bx!(,4)));
219 }
220
221 #[test]
222 fn greedy_revert() {
223 let v = vec![0b01010101, 0b00110011];
224 assert_eq!(BinRegex::new("(_')*_'").unwrap().match_length(&v), Some(bx!(,8)));
225 assert_eq!(BinRegex::new(".*__").unwrap().match_length(&v), Some(bx!(,14)));
226 assert_eq!(BinRegex::new("(_')*_'.*_'_").unwrap().match_length(&v), Some(bx!(,9)));
227 assert_eq!(BinRegex::new(".*:").unwrap().match_length(&v), Some(bx!(,16)));
228 assert_eq!(BinRegex::new(".*:.").unwrap().match_length(&v), Some(bx!(,9)));
229 assert_eq!(BinRegex::new(".*:.;").unwrap().match_length(&v), None);
230 }
231
232 #[test]
233 fn choice() {
234 let v = vec![0b01010101, 0b00110011];
235 assert_eq!(BinRegex::new("_|'").unwrap().match_length(&v), Some(bx!(,1)));
236 assert_eq!(BinRegex::new("5|6").unwrap().match_length(&v), Some(bx!(,4)));
237 assert_eq!(BinRegex::new("_a|7").unwrap().match_length(&v), Some(bx!(,5)));
238 assert_eq!(BinRegex::new("_'5|f_'_|'6|7").unwrap().match_length(&v), Some(bx!(,13)));
239 }
240
241 #[test]
242 fn ascii_char_class() {
243 let v = "hello world! What's up?".as_bytes().to_vec();
244 assert_eq!(BinRegex::new("[a-z]*").unwrap().match_length(&v), Some(BitIndex::new(5, 0)));
245 assert_eq!(BinRegex::new("[a-z ]*").unwrap().match_length(&v), Some(BitIndex::new(11, 0)));
246 }
247
248 #[test]
249 fn uint_char_class() {
250 let v = vec![0b01100101, 0b01001110, 0b10010011, 0b11111111, 0b01010010, 0b00010011, 0b00010011];
251 assert_eq!(BinRegex::new("[>u3:0..3]+[u3:^0..3]").unwrap().match_length(&v), Some(BitIndex::new(1, 4)));
252 assert_eq!(BinRegex::new("[u4:^0..2]*[>u4:0..2]+").unwrap().match_length(&v), Some(BitIndex::new(5, 4)));
253 assert_eq!(BinRegex::new("[u12:2514]").unwrap().find(&v).unwrap().span(), (bx!(,9), bx!(,9+12)));
254 assert_eq!(BinRegex::new("[>u20:1026313]").unwrap().find(&v).unwrap().span(), (bx!(3, 3), bx!(5, 7)));
255 assert_eq!(BinRegex::new("[<u22:3538852]").unwrap().find(&v).unwrap().span(), (bx!(1, 6), bx!(4, 4)));
256 }
257
258 #[test]
259 fn iint_char_class() {
260 let v = vec![0b01100101, 0b01001110, 0b10010011, 0b11111111, 0b01010010, 0b00010011, 0b00010011];
261 assert_eq!(BinRegex::new("[<i8:-87]").unwrap().find(&v).unwrap().span(), (bx!(0, 5), bx!(1, 5)));
266 assert_eq!(BinRegex::new("[<i16:12577]").unwrap().find(&v).unwrap().span(), (bx!(4, 4), bx!(6, 4)));
267 assert_eq!(BinRegex::new("[>i8:-87]").unwrap().find(&v).unwrap().span(), (bx!(0, 5), bx!(1, 5)));
268 assert_eq!(BinRegex::new("[>i16:-2783]").unwrap().find(&v).unwrap().span(), (bx!(3, 4), bx!(5, 4)));
269 assert_eq!(BinRegex::new("[>i16:8497]").unwrap().find(&v).unwrap().span(), (bx!(4, 4), bx!(6, 4)));
270 assert_eq!(BinRegex::new("[<i16:8693]").unwrap().find(&v).unwrap().span(), (bx!(3, 4), bx!(5, 4)));
271 }
272
273 #[test]
274 fn oint_char_class() {
275 let v = vec![0b01100101, 0b01001110, 0b10010011, 0b11111111, 0b01010010, 0b00010011, 0b00010011];
276 assert_eq!(BinRegex::new("[<o16:-108]").unwrap().find(&v).unwrap().span(), (bx!(2, 0), bx!(4, 0)));
281 assert_eq!(BinRegex::new("[<o16:12577]").unwrap().find(&v).unwrap().span(), (bx!(4, 4), bx!(6, 4)));
282 assert_eq!(BinRegex::new("[<o5:-12]").unwrap().find(&v).unwrap().span(), (bx!(1, 1), bx!(1, 6)));
283 assert_eq!(BinRegex::new("[>o5:-12]").unwrap().find(&v).unwrap().span(), (bx!(1, 1), bx!(1, 6)));
284 assert_eq!(BinRegex::new("[>o16:-173]").unwrap().find(&v).unwrap().span(), (bx!(3, 0), bx!(5, 0)));
285 assert_eq!(BinRegex::new("[>o16:8497]").unwrap().find(&v).unwrap().span(), (bx!(4, 4), bx!(6, 4)));
286 assert_eq!(BinRegex::new("[>o5:-12][o10:-4..0]").unwrap().find(&v).unwrap().span(), (bx!(2, 3), bx!(4, 2)));
287 }
288
289 #[test]
290 fn sint_char_class() {
291 let v = vec![0b01100101, 0b01001110, 0b10010011, 0b11111111, 0b01010010, 0b00010011, 0b00010011];
292 assert_eq!(BinRegex::new("[<s6:-7]").unwrap().find(&v).unwrap().span(), (bx!(1, 1), bx!(1, 7)));
293 assert_eq!(BinRegex::new("[<s16:-32659]").unwrap().find(&v).unwrap().span(), (bx!(2, 0), bx!(4, 0)));
294 assert_eq!(BinRegex::new("[<s16:12577]").unwrap().find(&v).unwrap().span(), (bx!(4, 4), bx!(6, 4)));
295 assert_eq!(BinRegex::new("[>s6:-7]").unwrap().find(&v).unwrap().span(), (bx!(1, 1), bx!(1, 7)));
296 assert_eq!(BinRegex::new("[>s16:8497]").unwrap().find(&v).unwrap().span(), (bx!(4, 4), bx!(6, 4)));
297 assert_eq!(BinRegex::new("[>s16:-5119]").unwrap().find(&v).unwrap().span(), (bx!(2, 0), bx!(4, 0)));
298 assert_eq!(BinRegex::new("[>s6:-7][>s8:-150..-100]").unwrap().find(&v).unwrap().span(), (bx!(2, 3), bx!(4, 1)));
299 }
300
301 #[test]
302 fn nint_char_class() {
303 let v = vec![0b01100101, 0b01001110, 0b10010011, 0b11111111, 0b01010010, 0b00010011, 0b00010011];
304 assert_eq!(BinRegex::new("[<n6:-29]").unwrap().find(&v).unwrap().span(), (bx!(1, 1), bx!(1, 7)));
305 assert_eq!(BinRegex::new("[<n16:-28870]").unwrap().find(&v).unwrap().span(), (bx!(1, 0), bx!(3, 0)));
306 assert_eq!(BinRegex::new("[<n16:-3871]").unwrap().find(&v).unwrap().span(), (bx!(4, 4), bx!(6, 4)));
307 assert_eq!(BinRegex::new("[>n6:-29]").unwrap().find(&v).unwrap().span(), (bx!(1, 1), bx!(1, 7)));
308 assert_eq!(BinRegex::new("[>n16:-7951]").unwrap().find(&v).unwrap().span(), (bx!(4, 4), bx!(6, 4)));
309 assert_eq!(BinRegex::new("[>n16:14735]").unwrap().find(&v).unwrap().span(), (bx!(1, 0), bx!(3, 0)));
310 assert_eq!(BinRegex::new("[>n6:-29][>n8:-100..-70]").unwrap().find(&v).unwrap().span(), (bx!(2, 3), bx!(4, 1)));
311 }
312
313 #[test]
314 fn f16_char_class() {
315 let v = vec![0b01100101, 0b01001110, 0b10010011, 0b11111111, 0b01010010, 0b00010011, 0b00010011];
316 assert_eq!(BinRegex::new("[>f16:1358]").unwrap().find(&v).unwrap().span(), (bx!(0, 0), bx!(2, 0)));
317 assert_eq!(BinRegex::new("[<f16:25.58]").unwrap().find(&v).unwrap().span(), (bx!(0, 0), bx!(2, 0)));
318 assert_eq!(BinRegex::new("[>f16:-3204]").unwrap().find(&v).unwrap().span(), (bx!(3, 5), bx!(5, 5)));
319 assert_eq!(BinRegex::new("[<f16:-0.04684448242]").unwrap().find(&v).unwrap().span(), (bx!(2, 7), bx!(4, 7)));
320 assert_eq!(BinRegex::new("[>f16:-inf..-50000]").unwrap().find(&v).unwrap().span(), (bx!(3, 3), bx!(5, 3)));
321 assert_eq!(BinRegex::new("[>f16:48.59375,1.2,-7.27176666259e-5]").unwrap().find(&v).unwrap().span(), (bx!(4, 0), bx!(6, 0)));
322 assert_eq!(BinRegex::new("[<f16:10..20].*[<f16:10..20]").unwrap().find(&v).unwrap().span(), (bx!(0, 7), bx!(6, 2)));
323 assert_eq!(BinRegex::new("[<f16:qnan]").unwrap().find(&v).unwrap().span(), (bx!(1, 5), bx!(3, 5)));
324 assert_eq!(BinRegex::new("[>f16:qnan]").unwrap().find(&v).unwrap().span(), (bx!(2, 5), bx!(4, 5)));
325 assert_eq!(BinRegex::new("[<f16:-qnan]").unwrap().find(&v).unwrap().span(), (bx!(1, 6), bx!(3, 6)));
326 assert_eq!(BinRegex::new("[>f16:-qnan]").unwrap().find(&v).unwrap().span(), (bx!(2, 6), bx!(4, 6)));
327 assert_eq!(BinRegex::new("[<f16:-snan]").unwrap().find(&v).unwrap().span(), (bx!(2, 2), bx!(4, 2)));
328 assert_eq!(BinRegex::new("[>f16:-snan]").unwrap().find(&v).unwrap().span(), (bx!(3, 2), bx!(5, 2)));
329 assert_eq!(BinRegex::new("[>f16:qnan,-qnan]").unwrap().find(&v).unwrap().span(), (bx!(2, 5), bx!(4, 5)));
330 assert_eq!(BinRegex::new("[>f16:-qnan,-snan]").unwrap().find(&v).unwrap().span(), (bx!(2, 6), bx!(4, 6)));
331 }
332
333 #[test]
334 fn f32_char_class() {
335 let v = vec![0b01100101, 0b01001110, 0b10010011, 0b11111111, 0b01010010, 0b00010011, 0b00010011];
336 assert_eq!(BinRegex::new("[>f32:-1.450390125482823e+25]").unwrap().find(&v).unwrap().span(), (bx!(1, 4), bx!(5, 4)));
337 assert_eq!(BinRegex::new("[<f32:1.6618762643686762e-18]").unwrap().find(&v).unwrap().span(), (bx!(1, 4), bx!(5, 4)));
338 assert_eq!(BinRegex::new("[>f32:1e-5..1]").unwrap().find(&v).unwrap().span(), (bx!(1, 2), bx!(5, 2)));
339 assert_eq!(BinRegex::new("[>f32:-1e-26..0]").unwrap().find(&v).unwrap().span(), (bx!(2, 0), bx!(6, 0)));
340 assert_eq!(BinRegex::new("[<f32:100..120]").unwrap().find(&v).unwrap().span(), (bx!(1, 5), bx!(5, 5)));
341 assert_eq!(BinRegex::new("[<f32:-snan]").unwrap().find(&v).unwrap().span(), (bx!(0, 0), bx!(4, 0)));
342 }
343
344 #[test]
345 fn advanced() {
346 let v = vec![0b11010101, 0b00110100, 0b11010100, 0b11010101, 0b11110000];
347 assert_eq!(BinRegex::new("''(_')*__").unwrap().match_length(&v), Some(bx!(,10)));
348 assert_eq!(BinRegex::new("(''(_')*__)*").unwrap().match_length(&v), Some(bx!(,24)));
349 assert_eq!(BinRegex::new(".*(_')*_'!!").unwrap().match_length(&v), Some(bx!(,38)));
350 assert_eq!(BinRegex::new("((('')|(_'))*|_)*f0").unwrap().match_length(&v), Some(bx!(,40)));
351 }
354
355 #[test]
356 fn find() {
357 let v = vec![0b11010101, 0b00110100, 0b11010100, 0b11010101, 0b11110000];
358
359 let re = BinRegex::new("__''_'__").unwrap();
360 let m = re.find(&v).unwrap();
361 assert_eq!(m.span(), (bx!(,8), bx!(,16)));
362 assert_eq!(m.as_bf(), BitField::from_bin_str("00110100"));
363
364 let re = BinRegex::new(".''(_'){3,}..").unwrap();
365 let m = re.find(&v).unwrap();
366 assert_eq!(m.span(), (bx!(,23), bx!(,34)));
367 assert_eq!(m.as_bf(), BitField::from_bin_str("01101010111"));
368
369 let s = "My IP Address is 192.168.0.1. What's yours?".as_bytes().to_vec();
370 let re = BinRegex::new(":([0-9]{0,3}[.]){3}[0-9]{0,3}").unwrap();
371 let m = re.find(&s).unwrap();
372 assert_eq!(m.span(), (BitIndex::new(17, 0), BitIndex::new(28, 0)));
373 }
374
375 #[test]
376 fn find_iter() {
377 let v = vec![0x0f, 0x00, 0x01, 0x12, 0xf6, 0xc5, 0x01, 0x60];
378
379 let re = BinRegex::new("''(_+')+").unwrap();
380 let mut re_iter = re.find_iter(&v);
381 let m1 = re_iter.next().unwrap();
382 assert_eq!(m1.span(), (BitIndex::new(0, 6), BitIndex::new(4, 1)));
383 assert_eq!(m1.as_bf(), BitField::from_bin_str("11 0000 0000 0000 0001 0001 0010 1"));
384
385 let m2 = re_iter.next().unwrap();
386 assert_eq!(m2.span(), (BitIndex::new(4, 2), BitIndex::new(4, 6)));
387 assert_eq!(m2.as_bf(), BitField::from_bin_str("11 01"));
388
389 let m3 = re_iter.next().unwrap();
390 assert_eq!(m3.span(), (BitIndex::new(5, 0), BitIndex::new(7, 2)));
391 assert_eq!(m3.as_bf(), BitField::from_bin_str("1100 0101 0000 0001 01"));
392
393 let m4 = re_iter.next();
394 assert_eq!(m4, None);
395 }
396}