1c67d6573Sopenharmony_ci// Convenience macros. 2c67d6573Sopenharmony_ci 3c67d6573Sopenharmony_cimacro_rules! findall { 4c67d6573Sopenharmony_ci ($re:expr, $text:expr) => {{ 5c67d6573Sopenharmony_ci $re.find_iter(text!($text)) 6c67d6573Sopenharmony_ci .map(|m| (m.start(), m.end())).collect::<Vec<_>>() 7c67d6573Sopenharmony_ci }} 8c67d6573Sopenharmony_ci} 9c67d6573Sopenharmony_ci 10c67d6573Sopenharmony_ci// Macros for automatically producing tests. 11c67d6573Sopenharmony_ci 12c67d6573Sopenharmony_cimacro_rules! ismatch { 13c67d6573Sopenharmony_ci ($name:ident, $re:expr, $text:expr, $ismatch:expr) => { 14c67d6573Sopenharmony_ci #[test] 15c67d6573Sopenharmony_ci fn $name() { 16c67d6573Sopenharmony_ci let re = regex!($re); 17c67d6573Sopenharmony_ci assert_eq!($ismatch, re.is_match(text!($text))); 18c67d6573Sopenharmony_ci } 19c67d6573Sopenharmony_ci }; 20c67d6573Sopenharmony_ci} 21c67d6573Sopenharmony_ci 22c67d6573Sopenharmony_cimacro_rules! mat( 23c67d6573Sopenharmony_ci ($name:ident, $re:expr, $text:expr, $($loc:tt)+) => ( 24c67d6573Sopenharmony_ci #[test] 25c67d6573Sopenharmony_ci fn $name() { 26c67d6573Sopenharmony_ci let text = text!($text); 27c67d6573Sopenharmony_ci let expected: Vec<Option<_>> = vec![$($loc)+]; 28c67d6573Sopenharmony_ci let r = regex!($re); 29c67d6573Sopenharmony_ci let got: Vec<Option<_>> = match r.captures(text) { 30c67d6573Sopenharmony_ci Some(c) => { 31c67d6573Sopenharmony_ci assert!(r.is_match(text)); 32c67d6573Sopenharmony_ci assert!(r.shortest_match(text).is_some()); 33c67d6573Sopenharmony_ci r.capture_names() 34c67d6573Sopenharmony_ci .enumerate() 35c67d6573Sopenharmony_ci .map(|(i, _)| c.get(i).map(|m| (m.start(), m.end()))) 36c67d6573Sopenharmony_ci .collect() 37c67d6573Sopenharmony_ci } 38c67d6573Sopenharmony_ci None => vec![None], 39c67d6573Sopenharmony_ci }; 40c67d6573Sopenharmony_ci // The test set sometimes leave out capture groups, so truncate 41c67d6573Sopenharmony_ci // actual capture groups to match test set. 42c67d6573Sopenharmony_ci let mut sgot = &got[..]; 43c67d6573Sopenharmony_ci if sgot.len() > expected.len() { 44c67d6573Sopenharmony_ci sgot = &sgot[0..expected.len()] 45c67d6573Sopenharmony_ci } 46c67d6573Sopenharmony_ci if expected != sgot { 47c67d6573Sopenharmony_ci panic!("For RE '{}' against '{:?}', \ 48c67d6573Sopenharmony_ci expected '{:?}' but got '{:?}'", 49c67d6573Sopenharmony_ci $re, text, expected, sgot); 50c67d6573Sopenharmony_ci } 51c67d6573Sopenharmony_ci } 52c67d6573Sopenharmony_ci ); 53c67d6573Sopenharmony_ci); 54c67d6573Sopenharmony_ci 55c67d6573Sopenharmony_cimacro_rules! matiter( 56c67d6573Sopenharmony_ci ($name:ident, $re:expr, $text:expr) => ( 57c67d6573Sopenharmony_ci #[test] 58c67d6573Sopenharmony_ci fn $name() { 59c67d6573Sopenharmony_ci let text = text!($text); 60c67d6573Sopenharmony_ci let expected: Vec<(usize, usize)> = vec![]; 61c67d6573Sopenharmony_ci let r = regex!($re); 62c67d6573Sopenharmony_ci let got: Vec<_> = 63c67d6573Sopenharmony_ci r.find_iter(text).map(|m| (m.start(), m.end())).collect(); 64c67d6573Sopenharmony_ci if expected != got { 65c67d6573Sopenharmony_ci panic!("For RE '{}' against '{:?}', \ 66c67d6573Sopenharmony_ci expected '{:?}' but got '{:?}'", 67c67d6573Sopenharmony_ci $re, text, expected, got); 68c67d6573Sopenharmony_ci } 69c67d6573Sopenharmony_ci let captures_got: Vec<_> = 70c67d6573Sopenharmony_ci r.captures_iter(text) 71c67d6573Sopenharmony_ci .map(|c| c.get(0).unwrap()) 72c67d6573Sopenharmony_ci .map(|m| (m.start(), m.end())) 73c67d6573Sopenharmony_ci .collect(); 74c67d6573Sopenharmony_ci if captures_got != got { 75c67d6573Sopenharmony_ci panic!("For RE '{}' against '{:?}', \ 76c67d6573Sopenharmony_ci got '{:?}' using find_iter but got '{:?}' \ 77c67d6573Sopenharmony_ci using captures_iter", 78c67d6573Sopenharmony_ci $re, text, got, captures_got); 79c67d6573Sopenharmony_ci } 80c67d6573Sopenharmony_ci } 81c67d6573Sopenharmony_ci ); 82c67d6573Sopenharmony_ci ($name:ident, $re:expr, $text:expr, $($loc:tt)+) => ( 83c67d6573Sopenharmony_ci #[test] 84c67d6573Sopenharmony_ci fn $name() { 85c67d6573Sopenharmony_ci let text = text!($text); 86c67d6573Sopenharmony_ci let expected: Vec<_> = vec![$($loc)+]; 87c67d6573Sopenharmony_ci let r = regex!($re); 88c67d6573Sopenharmony_ci let got: Vec<_> = 89c67d6573Sopenharmony_ci r.find_iter(text).map(|m| (m.start(), m.end())).collect(); 90c67d6573Sopenharmony_ci if expected != got { 91c67d6573Sopenharmony_ci panic!("For RE '{}' against '{:?}', \ 92c67d6573Sopenharmony_ci expected '{:?}' but got '{:?}'", 93c67d6573Sopenharmony_ci $re, text, expected, got); 94c67d6573Sopenharmony_ci } 95c67d6573Sopenharmony_ci let captures_got: Vec<_> = 96c67d6573Sopenharmony_ci r.captures_iter(text) 97c67d6573Sopenharmony_ci .map(|c| c.get(0).unwrap()) 98c67d6573Sopenharmony_ci .map(|m| (m.start(), m.end())) 99c67d6573Sopenharmony_ci .collect(); 100c67d6573Sopenharmony_ci if captures_got != got { 101c67d6573Sopenharmony_ci panic!("For RE '{}' against '{:?}', \ 102c67d6573Sopenharmony_ci got '{:?}' using find_iter but got '{:?}' \ 103c67d6573Sopenharmony_ci using captures_iter", 104c67d6573Sopenharmony_ci $re, text, got, captures_got); 105c67d6573Sopenharmony_ci } 106c67d6573Sopenharmony_ci } 107c67d6573Sopenharmony_ci ); 108c67d6573Sopenharmony_ci); 109c67d6573Sopenharmony_ci 110c67d6573Sopenharmony_cimacro_rules! matset { 111c67d6573Sopenharmony_ci ($name:ident, $res:expr, $text:expr, $($match_index:expr),*) => { 112c67d6573Sopenharmony_ci #[test] 113c67d6573Sopenharmony_ci fn $name() { 114c67d6573Sopenharmony_ci let text = text!($text); 115c67d6573Sopenharmony_ci let set = regex_set!($res); 116c67d6573Sopenharmony_ci assert!(set.is_match(text)); 117c67d6573Sopenharmony_ci let expected = vec![$($match_index),*]; 118c67d6573Sopenharmony_ci let matches = set.matches(text); 119c67d6573Sopenharmony_ci assert!(matches.matched_any()); 120c67d6573Sopenharmony_ci let got: Vec<_> = matches.into_iter().collect(); 121c67d6573Sopenharmony_ci assert_eq!(expected, got); 122c67d6573Sopenharmony_ci } 123c67d6573Sopenharmony_ci } 124c67d6573Sopenharmony_ci} 125c67d6573Sopenharmony_ci 126c67d6573Sopenharmony_cimacro_rules! nomatset { 127c67d6573Sopenharmony_ci ($name:ident, $res:expr, $text:expr) => { 128c67d6573Sopenharmony_ci #[test] 129c67d6573Sopenharmony_ci fn $name() { 130c67d6573Sopenharmony_ci let text = text!($text); 131c67d6573Sopenharmony_ci let set = regex_set!($res); 132c67d6573Sopenharmony_ci assert!(!set.is_match(text)); 133c67d6573Sopenharmony_ci let matches = set.matches(text); 134c67d6573Sopenharmony_ci assert!(!matches.matched_any()); 135c67d6573Sopenharmony_ci assert_eq!(0, matches.into_iter().count()); 136c67d6573Sopenharmony_ci } 137c67d6573Sopenharmony_ci } 138c67d6573Sopenharmony_ci} 139c67d6573Sopenharmony_ci 140c67d6573Sopenharmony_cimacro_rules! split { 141c67d6573Sopenharmony_ci ($name:ident, $re:expr, $text:expr, $expected:expr) => { 142c67d6573Sopenharmony_ci #[test] 143c67d6573Sopenharmony_ci fn $name() { 144c67d6573Sopenharmony_ci let re = regex!($re); 145c67d6573Sopenharmony_ci let splitted: Vec<_> = re.split(t!($text)).collect(); 146c67d6573Sopenharmony_ci assert_eq!($expected, &*splitted); 147c67d6573Sopenharmony_ci } 148c67d6573Sopenharmony_ci } 149c67d6573Sopenharmony_ci} 150c67d6573Sopenharmony_ci 151c67d6573Sopenharmony_cimacro_rules! splitn { 152c67d6573Sopenharmony_ci ($name:ident, $re:expr, $text:expr, $limit:expr, $expected:expr) => { 153c67d6573Sopenharmony_ci #[test] 154c67d6573Sopenharmony_ci fn $name() { 155c67d6573Sopenharmony_ci let re = regex!($re); 156c67d6573Sopenharmony_ci let splitted: Vec<_> = re.splitn(t!($text), $limit).collect(); 157c67d6573Sopenharmony_ci assert_eq!($expected, &*splitted); 158c67d6573Sopenharmony_ci } 159c67d6573Sopenharmony_ci } 160c67d6573Sopenharmony_ci} 161