1c67d6573Sopenharmony_ci#[test] 2c67d6573Sopenharmony_cifn empty_regex_empty_match() { 3c67d6573Sopenharmony_ci let re = regex!(""); 4c67d6573Sopenharmony_ci assert_eq!(vec![(0, 0)], findall!(re, "")); 5c67d6573Sopenharmony_ci} 6c67d6573Sopenharmony_ci 7c67d6573Sopenharmony_ci#[test] 8c67d6573Sopenharmony_cifn empty_regex_nonempty_match() { 9c67d6573Sopenharmony_ci let re = regex!(""); 10c67d6573Sopenharmony_ci assert_eq!(vec![(0, 0), (1, 1), (2, 2), (3, 3)], findall!(re, "abc")); 11c67d6573Sopenharmony_ci} 12c67d6573Sopenharmony_ci 13c67d6573Sopenharmony_ci#[test] 14c67d6573Sopenharmony_cifn one_zero_length_match() { 15c67d6573Sopenharmony_ci let re = regex!(r"[0-9]*"); 16c67d6573Sopenharmony_ci assert_eq!(vec![(0, 0), (1, 2), (3, 4)], findall!(re, "a1b2")); 17c67d6573Sopenharmony_ci} 18c67d6573Sopenharmony_ci 19c67d6573Sopenharmony_ci#[test] 20c67d6573Sopenharmony_cifn many_zero_length_match() { 21c67d6573Sopenharmony_ci let re = regex!(r"[0-9]*"); 22c67d6573Sopenharmony_ci assert_eq!( 23c67d6573Sopenharmony_ci vec![(0, 0), (1, 2), (3, 3), (4, 4), (5, 6)], 24c67d6573Sopenharmony_ci findall!(re, "a1bbb2") 25c67d6573Sopenharmony_ci ); 26c67d6573Sopenharmony_ci} 27c67d6573Sopenharmony_ci 28c67d6573Sopenharmony_ci#[test] 29c67d6573Sopenharmony_cifn many_sequential_zero_length_match() { 30c67d6573Sopenharmony_ci let re = regex!(r"[0-9]?"); 31c67d6573Sopenharmony_ci assert_eq!( 32c67d6573Sopenharmony_ci vec![(0, 0), (1, 2), (2, 3), (4, 5), (6, 6)], 33c67d6573Sopenharmony_ci findall!(re, "a12b3c") 34c67d6573Sopenharmony_ci ); 35c67d6573Sopenharmony_ci} 36c67d6573Sopenharmony_ci 37c67d6573Sopenharmony_ci#[test] 38c67d6573Sopenharmony_cifn quoted_bracket_set() { 39c67d6573Sopenharmony_ci let re = regex!(r"([\x{5b}\x{5d}])"); 40c67d6573Sopenharmony_ci assert_eq!(vec![(0, 1), (1, 2)], findall!(re, "[]")); 41c67d6573Sopenharmony_ci let re = regex!(r"([\[\]])"); 42c67d6573Sopenharmony_ci assert_eq!(vec![(0, 1), (1, 2)], findall!(re, "[]")); 43c67d6573Sopenharmony_ci} 44c67d6573Sopenharmony_ci 45c67d6573Sopenharmony_ci#[test] 46c67d6573Sopenharmony_cifn first_range_starts_with_left_bracket() { 47c67d6573Sopenharmony_ci let re = regex!(r"([\[-z])"); 48c67d6573Sopenharmony_ci assert_eq!(vec![(0, 1), (1, 2)], findall!(re, "[]")); 49c67d6573Sopenharmony_ci} 50c67d6573Sopenharmony_ci 51c67d6573Sopenharmony_ci#[test] 52c67d6573Sopenharmony_cifn range_ends_with_escape() { 53c67d6573Sopenharmony_ci let re = regex!(r"([\[-\x{5d}])"); 54c67d6573Sopenharmony_ci assert_eq!(vec![(0, 1), (1, 2)], findall!(re, "[]")); 55c67d6573Sopenharmony_ci} 56c67d6573Sopenharmony_ci 57c67d6573Sopenharmony_ci#[test] 58c67d6573Sopenharmony_cifn empty_match_find_iter() { 59c67d6573Sopenharmony_ci let re = regex!(r".*?"); 60c67d6573Sopenharmony_ci assert_eq!(vec![(0, 0), (1, 1), (2, 2), (3, 3)], findall!(re, "abc")); 61c67d6573Sopenharmony_ci} 62c67d6573Sopenharmony_ci 63c67d6573Sopenharmony_ci#[test] 64c67d6573Sopenharmony_cifn empty_match_captures_iter() { 65c67d6573Sopenharmony_ci let re = regex!(r".*?"); 66c67d6573Sopenharmony_ci let ms: Vec<_> = re 67c67d6573Sopenharmony_ci .captures_iter(text!("abc")) 68c67d6573Sopenharmony_ci .map(|c| c.get(0).unwrap()) 69c67d6573Sopenharmony_ci .map(|m| (m.start(), m.end())) 70c67d6573Sopenharmony_ci .collect(); 71c67d6573Sopenharmony_ci assert_eq!(ms, vec![(0, 0), (1, 1), (2, 2), (3, 3)]); 72c67d6573Sopenharmony_ci} 73c67d6573Sopenharmony_ci 74c67d6573Sopenharmony_ci#[test] 75c67d6573Sopenharmony_cifn capture_names() { 76c67d6573Sopenharmony_ci let re = regex!(r"(.)(?P<a>.)"); 77c67d6573Sopenharmony_ci assert_eq!(3, re.captures_len()); 78c67d6573Sopenharmony_ci assert_eq!((3, Some(3)), re.capture_names().size_hint()); 79c67d6573Sopenharmony_ci assert_eq!( 80c67d6573Sopenharmony_ci vec![None, None, Some("a")], 81c67d6573Sopenharmony_ci re.capture_names().collect::<Vec<_>>() 82c67d6573Sopenharmony_ci ); 83c67d6573Sopenharmony_ci} 84c67d6573Sopenharmony_ci 85c67d6573Sopenharmony_ci#[test] 86c67d6573Sopenharmony_cifn regex_string() { 87c67d6573Sopenharmony_ci assert_eq!(r"[a-zA-Z0-9]+", regex!(r"[a-zA-Z0-9]+").as_str()); 88c67d6573Sopenharmony_ci assert_eq!(r"[a-zA-Z0-9]+", &format!("{}", regex!(r"[a-zA-Z0-9]+"))); 89c67d6573Sopenharmony_ci assert_eq!(r"[a-zA-Z0-9]+", &format!("{:?}", regex!(r"[a-zA-Z0-9]+"))); 90c67d6573Sopenharmony_ci} 91c67d6573Sopenharmony_ci 92c67d6573Sopenharmony_ci#[test] 93c67d6573Sopenharmony_cifn capture_index() { 94c67d6573Sopenharmony_ci let re = regex!(r"^(?P<name>.+)$"); 95c67d6573Sopenharmony_ci let cap = re.captures(t!("abc")).unwrap(); 96c67d6573Sopenharmony_ci assert_eq!(&cap[0], t!("abc")); 97c67d6573Sopenharmony_ci assert_eq!(&cap[1], t!("abc")); 98c67d6573Sopenharmony_ci assert_eq!(&cap["name"], t!("abc")); 99c67d6573Sopenharmony_ci} 100c67d6573Sopenharmony_ci 101c67d6573Sopenharmony_ci#[test] 102c67d6573Sopenharmony_ci#[should_panic] 103c67d6573Sopenharmony_ci#[cfg_attr(all(target_env = "msvc", target_pointer_width = "32"), ignore)] 104c67d6573Sopenharmony_cifn capture_index_panic_usize() { 105c67d6573Sopenharmony_ci let re = regex!(r"^(?P<name>.+)$"); 106c67d6573Sopenharmony_ci let cap = re.captures(t!("abc")).unwrap(); 107c67d6573Sopenharmony_ci let _ = cap[2]; 108c67d6573Sopenharmony_ci} 109c67d6573Sopenharmony_ci 110c67d6573Sopenharmony_ci#[test] 111c67d6573Sopenharmony_ci#[should_panic] 112c67d6573Sopenharmony_ci#[cfg_attr(all(target_env = "msvc", target_pointer_width = "32"), ignore)] 113c67d6573Sopenharmony_cifn capture_index_panic_name() { 114c67d6573Sopenharmony_ci let re = regex!(r"^(?P<name>.+)$"); 115c67d6573Sopenharmony_ci let cap = re.captures(t!("abc")).unwrap(); 116c67d6573Sopenharmony_ci let _ = cap["bad name"]; 117c67d6573Sopenharmony_ci} 118c67d6573Sopenharmony_ci 119c67d6573Sopenharmony_ci#[test] 120c67d6573Sopenharmony_cifn capture_index_lifetime() { 121c67d6573Sopenharmony_ci // This is a test of whether the types on `caps["..."]` are general 122c67d6573Sopenharmony_ci // enough. If not, this will fail to typecheck. 123c67d6573Sopenharmony_ci fn inner(s: &str) -> usize { 124c67d6573Sopenharmony_ci let re = regex!(r"(?P<number>[0-9]+)"); 125c67d6573Sopenharmony_ci let caps = re.captures(t!(s)).unwrap(); 126c67d6573Sopenharmony_ci caps["number"].len() 127c67d6573Sopenharmony_ci } 128c67d6573Sopenharmony_ci assert_eq!(3, inner("123")); 129c67d6573Sopenharmony_ci} 130c67d6573Sopenharmony_ci 131c67d6573Sopenharmony_ci#[test] 132c67d6573Sopenharmony_cifn capture_misc() { 133c67d6573Sopenharmony_ci let re = regex!(r"(.)(?P<a>a)?(.)(?P<b>.)"); 134c67d6573Sopenharmony_ci let cap = re.captures(t!("abc")).unwrap(); 135c67d6573Sopenharmony_ci 136c67d6573Sopenharmony_ci assert_eq!(5, cap.len()); 137c67d6573Sopenharmony_ci 138c67d6573Sopenharmony_ci assert_eq!((0, 3), { 139c67d6573Sopenharmony_ci let m = cap.get(0).unwrap(); 140c67d6573Sopenharmony_ci (m.start(), m.end()) 141c67d6573Sopenharmony_ci }); 142c67d6573Sopenharmony_ci assert_eq!(None, cap.get(2)); 143c67d6573Sopenharmony_ci assert_eq!((2, 3), { 144c67d6573Sopenharmony_ci let m = cap.get(4).unwrap(); 145c67d6573Sopenharmony_ci (m.start(), m.end()) 146c67d6573Sopenharmony_ci }); 147c67d6573Sopenharmony_ci 148c67d6573Sopenharmony_ci assert_eq!(t!("abc"), match_text!(cap.get(0).unwrap())); 149c67d6573Sopenharmony_ci assert_eq!(None, cap.get(2)); 150c67d6573Sopenharmony_ci assert_eq!(t!("c"), match_text!(cap.get(4).unwrap())); 151c67d6573Sopenharmony_ci 152c67d6573Sopenharmony_ci assert_eq!(None, cap.name("a")); 153c67d6573Sopenharmony_ci assert_eq!(t!("c"), match_text!(cap.name("b").unwrap())); 154c67d6573Sopenharmony_ci} 155c67d6573Sopenharmony_ci 156c67d6573Sopenharmony_ci#[test] 157c67d6573Sopenharmony_cifn sub_capture_matches() { 158c67d6573Sopenharmony_ci let re = regex!(r"([a-z])(([a-z])|([0-9]))"); 159c67d6573Sopenharmony_ci let cap = re.captures(t!("a5")).unwrap(); 160c67d6573Sopenharmony_ci let subs: Vec<_> = cap.iter().collect(); 161c67d6573Sopenharmony_ci 162c67d6573Sopenharmony_ci assert_eq!(5, subs.len()); 163c67d6573Sopenharmony_ci assert!(subs[0].is_some()); 164c67d6573Sopenharmony_ci assert!(subs[1].is_some()); 165c67d6573Sopenharmony_ci assert!(subs[2].is_some()); 166c67d6573Sopenharmony_ci assert!(subs[3].is_none()); 167c67d6573Sopenharmony_ci assert!(subs[4].is_some()); 168c67d6573Sopenharmony_ci 169c67d6573Sopenharmony_ci assert_eq!(t!("a5"), match_text!(subs[0].unwrap())); 170c67d6573Sopenharmony_ci assert_eq!(t!("a"), match_text!(subs[1].unwrap())); 171c67d6573Sopenharmony_ci assert_eq!(t!("5"), match_text!(subs[2].unwrap())); 172c67d6573Sopenharmony_ci assert_eq!(t!("5"), match_text!(subs[4].unwrap())); 173c67d6573Sopenharmony_ci} 174c67d6573Sopenharmony_ci 175c67d6573Sopenharmony_ciexpand!(expand1, r"(?-u)(?P<foo>\w+)", "abc", "$foo", "abc"); 176c67d6573Sopenharmony_ciexpand!(expand2, r"(?-u)(?P<foo>\w+)", "abc", "$0", "abc"); 177c67d6573Sopenharmony_ciexpand!(expand3, r"(?-u)(?P<foo>\w+)", "abc", "$1", "abc"); 178c67d6573Sopenharmony_ciexpand!(expand4, r"(?-u)(?P<foo>\w+)", "abc", "$$1", "$1"); 179c67d6573Sopenharmony_ciexpand!(expand5, r"(?-u)(?P<foo>\w+)", "abc", "$$foo", "$foo"); 180c67d6573Sopenharmony_ciexpand!(expand6, r"(?-u)(?P<a>\w+)\s+(?P<b>\d+)", "abc 123", "$b$a", "123abc"); 181c67d6573Sopenharmony_ciexpand!(expand7, r"(?-u)(?P<a>\w+)\s+(?P<b>\d+)", "abc 123", "z$bz$az", "z"); 182c67d6573Sopenharmony_ciexpand!( 183c67d6573Sopenharmony_ci expand8, 184c67d6573Sopenharmony_ci r"(?-u)(?P<a>\w+)\s+(?P<b>\d+)", 185c67d6573Sopenharmony_ci "abc 123", 186c67d6573Sopenharmony_ci ".$b.$a.", 187c67d6573Sopenharmony_ci ".123.abc." 188c67d6573Sopenharmony_ci); 189c67d6573Sopenharmony_ciexpand!( 190c67d6573Sopenharmony_ci expand9, 191c67d6573Sopenharmony_ci r"(?-u)(?P<a>\w+)\s+(?P<b>\d+)", 192c67d6573Sopenharmony_ci "abc 123", 193c67d6573Sopenharmony_ci " $b $a ", 194c67d6573Sopenharmony_ci " 123 abc " 195c67d6573Sopenharmony_ci); 196c67d6573Sopenharmony_ciexpand!(expand10, r"(?-u)(?P<a>\w+)\s+(?P<b>\d+)", "abc 123", "$bz$az", ""); 197c67d6573Sopenharmony_ci 198c67d6573Sopenharmony_ciexpand!(expand_name1, r"%(?P<Z>[a-z]+)", "%abc", "$Z%", "abc%"); 199c67d6573Sopenharmony_ciexpand!(expand_name2, r"\[(?P<Z>[a-z]+)", "[abc", "$Z[", "abc["); 200c67d6573Sopenharmony_ciexpand!(expand_name3, r"\{(?P<Z>[a-z]+)", "{abc", "$Z{", "abc{"); 201c67d6573Sopenharmony_ciexpand!(expand_name4, r"\}(?P<Z>[a-z]+)", "}abc", "$Z}", "abc}"); 202c67d6573Sopenharmony_ciexpand!(expand_name5, r"%([a-z]+)", "%abc", "$1a%", "%"); 203c67d6573Sopenharmony_ciexpand!(expand_name6, r"%([a-z]+)", "%abc", "${1}a%", "abca%"); 204c67d6573Sopenharmony_ciexpand!(expand_name7, r"\[(?P<Z[>[a-z]+)", "[abc", "${Z[}[", "abc["); 205c67d6573Sopenharmony_ciexpand!(expand_name8, r"\[(?P<Z[>[a-z]+)", "[abc", "${foo}[", "["); 206c67d6573Sopenharmony_ciexpand!(expand_name9, r"\[(?P<Z[>[a-z]+)", "[abc", "${1a}[", "["); 207c67d6573Sopenharmony_ciexpand!(expand_name10, r"\[(?P<Z[>[a-z]+)", "[abc", "${#}[", "["); 208c67d6573Sopenharmony_ciexpand!(expand_name11, r"\[(?P<Z[>[a-z]+)", "[abc", "${$$}[", "["); 209c67d6573Sopenharmony_ci 210c67d6573Sopenharmony_cisplit!( 211c67d6573Sopenharmony_ci split1, 212c67d6573Sopenharmony_ci r"(?-u)\s+", 213c67d6573Sopenharmony_ci "a b\nc\td\n\t e", 214c67d6573Sopenharmony_ci &[t!("a"), t!("b"), t!("c"), t!("d"), t!("e")] 215c67d6573Sopenharmony_ci); 216c67d6573Sopenharmony_cisplit!( 217c67d6573Sopenharmony_ci split2, 218c67d6573Sopenharmony_ci r"(?-u)\b", 219c67d6573Sopenharmony_ci "a b c", 220c67d6573Sopenharmony_ci &[t!(""), t!("a"), t!(" "), t!("b"), t!(" "), t!("c"), t!("")] 221c67d6573Sopenharmony_ci); 222c67d6573Sopenharmony_cisplit!(split3, r"a$", "a", &[t!(""), t!("")]); 223c67d6573Sopenharmony_cisplit!(split_none, r"-", r"a", &[t!("a")]); 224c67d6573Sopenharmony_cisplit!(split_trailing_blank, r"-", r"a-", &[t!("a"), t!("")]); 225c67d6573Sopenharmony_cisplit!(split_trailing_blanks, r"-", r"a--", &[t!("a"), t!(""), t!("")]); 226c67d6573Sopenharmony_cisplit!(split_empty, r"-", r"", &[t!("")]); 227c67d6573Sopenharmony_ci 228c67d6573Sopenharmony_cisplitn!(splitn_below_limit, r"-", r"a", 2, &[t!("a")]); 229c67d6573Sopenharmony_cisplitn!(splitn_at_limit, r"-", r"a-b", 2, &[t!("a"), t!("b")]); 230c67d6573Sopenharmony_cisplitn!(splitn_above_limit, r"-", r"a-b-c", 2, &[t!("a"), t!("b-c")]); 231c67d6573Sopenharmony_cisplitn!(splitn_zero_limit, r"-", r"a-b", 0, empty_vec!()); 232c67d6573Sopenharmony_cisplitn!(splitn_trailing_blank, r"-", r"a-", 2, &[t!("a"), t!("")]); 233c67d6573Sopenharmony_cisplitn!(splitn_trailing_separator, r"-", r"a--", 2, &[t!("a"), t!("-")]); 234c67d6573Sopenharmony_cisplitn!(splitn_empty, r"-", r"", 1, &[t!("")]); 235