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