| macro_rules! searcher { |
| ($name:ident, $re:expr, $haystack:expr) => ( |
| searcher!($name, $re, $haystack, vec vec![]); |
| ); |
| ($name:ident, $re:expr, $haystack:expr, $($steps:expr,)*) => ( |
| searcher!($name, $re, $haystack, vec vec![$($steps),*]); |
| ); |
| ($name:ident, $re:expr, $haystack:expr, $($steps:expr),*) => ( |
| searcher!($name, $re, $haystack, vec vec![$($steps),*]); |
| ); |
| ($name:ident, $re:expr, $haystack:expr, vec $expect_steps:expr) => ( |
| #[test] |
| #[allow(unused_imports)] |
| fn $name() { |
| searcher_expr! {{ |
| use std::str::pattern::{Pattern, Searcher}; |
| use std::str::pattern::SearchStep::{Match, Reject, Done}; |
| let re = regex!($re); |
| let mut se = re.into_searcher($haystack); |
| let mut got_steps = vec![]; |
| loop { |
| match se.next() { |
| Done => break, |
| step => { got_steps.push(step); } |
| } |
| } |
| assert_eq!(got_steps, $expect_steps); |
| }} |
| } |
| ); |
| } |
| |
| searcher!(searcher_empty_regex_empty_haystack, r"", "", Match(0, 0)); |
| searcher!(searcher_empty_regex, r"", "ab", |
| Match(0, 0), Reject(0, 1), Match(1, 1), Reject(1, 2), Match(2, 2)); |
| searcher!(searcher_empty_haystack, r"\d", ""); |
| searcher!(searcher_one_match, r"\d", "5", |
| Match(0, 1)); |
| searcher!(searcher_no_match, r"\d", "a", |
| Reject(0, 1)); |
| searcher!(searcher_two_adjacent_matches, r"\d", "56", |
| Match(0, 1), Match(1, 2)); |
| searcher!(searcher_two_non_adjacent_matches, r"\d", "5a6", |
| Match(0, 1), Reject(1, 2), Match(2, 3)); |
| searcher!(searcher_reject_first, r"\d", "a6", |
| Reject(0, 1), Match(1, 2)); |
| searcher!(searcher_one_zero_length_matches, r"\d*", "a1b2", |
| Match(0, 0), // ^ |
| Reject(0, 1), // a |
| Match(1, 2), // a1 |
| Reject(2, 3), // a1b |
| Match(3, 4), // a1b2 |
| ); |
| searcher!(searcher_many_zero_length_matches, r"\d*", "a1bbb2", |
| Match(0, 0), // ^ |
| Reject(0, 1), // a |
| Match(1, 2), // a1 |
| Reject(2, 3), // a1b |
| Match(3, 3), // a1bb |
| Reject(3, 4), // a1bb |
| Match(4, 4), // a1bbb |
| Reject(4, 5), // a1bbb |
| Match(5, 6), // a1bbba |
| ); |
| searcher!(searcher_unicode, r".+?", "Ⅰ1Ⅱ2", |
| Match(0, 3), Match(3, 4), Match(4, 7), Match(7, 8)); |