bitutils2/
lib.rs

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("[>u3:0..3]+[u3:^0..3]").unwrap().match_length(&v), Some(BitIndex::new(1, 4)));
262        // assert_eq!(BinRegex::new("[u4:^0..2]*[>u4:0..2]+").unwrap().match_length(&v), Some(BitIndex::new(5, 4)));
263        // assert_eq!(BinRegex::new("[u12:2514]").unwrap().find(&v).unwrap().span(), (bx!(,9), bx!(,9+12)));
264        // assert_eq!(BinRegex::new("[>u20:1026313]").unwrap().find(&v).unwrap().span(), (bx!(3, 3), bx!(5, 7)));
265        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("[>u3:0..3]+[u3:^0..3]").unwrap().match_length(&v), Some(BitIndex::new(1, 4)));
277        // assert_eq!(BinRegex::new("[u4:^0..2]*[>u4:0..2]+").unwrap().match_length(&v), Some(BitIndex::new(5, 4)));
278        // assert_eq!(BinRegex::new("[u12:2514]").unwrap().find(&v).unwrap().span(), (bx!(,9), bx!(,9+12)));
279        // assert_eq!(BinRegex::new("[>u20:1026313]").unwrap().find(&v).unwrap().span(), (bx!(3, 3), bx!(5, 7)));
280        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        //assert_eq!(BinRegex::new("([([('')(_')])*_])*f0").unwrap().match_length(&v), Some(bx!(,40)));
352        //assert_eq!(BinRegex::new("[[('')(_')]*_]*f0").unwrap().match_length(&v), Some(bx!(,40)));
353    }
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}