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