blob: e70e9489fd01e4721bec6efef89e5b52b35111ff [file] [log] [blame]
// Convenience macros.
macro_rules! findall {
($re:expr, $text:expr) => {{
$re.find_iter(text!($text))
.map(|m| (m.start(), m.end())).collect::<Vec<_>>()
}}
}
// Macros for automatically producing tests.
macro_rules! ismatch {
($name:ident, $re:expr, $text:expr, $ismatch:expr) => {
#[test]
fn $name() {
let re = regex!($re);
assert_eq!($ismatch, re.is_match(text!($text)));
}
};
}
macro_rules! mat(
($name:ident, $re:expr, $text:expr, $($loc:tt)+) => (
#[test]
fn $name() {
let text = text!($text);
let expected: Vec<Option<_>> = vec![$($loc)+];
let r = regex!($re);
let got: Vec<Option<_>> = match r.captures(text) {
Some(c) => {
assert!(r.is_match(text));
assert!(r.shortest_match(text).is_some());
r.capture_names()
.enumerate()
.map(|(i, _)| c.get(i).map(|m| (m.start(), m.end())))
.collect()
}
None => vec![None],
};
// The test set sometimes leave out capture groups, so truncate
// actual capture groups to match test set.
let mut sgot = &got[..];
if sgot.len() > expected.len() {
sgot = &sgot[0..expected.len()]
}
if expected != sgot {
panic!("For RE '{}' against '{:?}', \
expected '{:?}' but got '{:?}'",
$re, text, expected, sgot);
}
}
);
);
macro_rules! matiter(
($name:ident, $re:expr, $text:expr) => (
#[test]
fn $name() {
let text = text!($text);
let expected: Vec<(usize, usize)> = vec![];
let r = regex!($re);
let got: Vec<_> =
r.find_iter(text).map(|m| (m.start(), m.end())).collect();
if expected != got {
panic!("For RE '{}' against '{:?}', \
expected '{:?}' but got '{:?}'",
$re, text, expected, got);
}
let captures_got: Vec<_> =
r.captures_iter(text)
.map(|c| c.get(0).unwrap())
.map(|m| (m.start(), m.end()))
.collect();
if captures_got != got {
panic!("For RE '{}' against '{:?}', \
got '{:?}' using find_iter but got '{:?}' \
using captures_iter",
$re, text, got, captures_got);
}
}
);
($name:ident, $re:expr, $text:expr, $($loc:tt)+) => (
#[test]
fn $name() {
let text = text!($text);
let expected: Vec<_> = vec![$($loc)+];
let r = regex!($re);
let got: Vec<_> =
r.find_iter(text).map(|m| (m.start(), m.end())).collect();
if expected != got {
panic!("For RE '{}' against '{:?}', \
expected '{:?}' but got '{:?}'",
$re, text, expected, got);
}
let captures_got: Vec<_> =
r.captures_iter(text)
.map(|c| c.get(0).unwrap())
.map(|m| (m.start(), m.end()))
.collect();
if captures_got != got {
panic!("For RE '{}' against '{:?}', \
got '{:?}' using find_iter but got '{:?}' \
using captures_iter",
$re, text, got, captures_got);
}
}
);
);
macro_rules! matset {
($name:ident, $res:expr, $text:expr, $($match_index:expr),*) => {
#[test]
fn $name() {
let text = text!($text);
let set = regex_set!($res);
assert!(set.is_match(text));
let expected = vec![$($match_index),*];
let matches = set.matches(text);
assert!(matches.matched_any());
let got: Vec<_> = matches.into_iter().collect();
assert_eq!(expected, got);
}
}
}
macro_rules! nomatset {
($name:ident, $res:expr, $text:expr) => {
#[test]
fn $name() {
let text = text!($text);
let set = regex_set!($res);
assert!(!set.is_match(text));
let matches = set.matches(text);
assert!(!matches.matched_any());
assert_eq!(0, matches.into_iter().count());
}
}
}
macro_rules! split {
($name:ident, $re:expr, $text:expr, $expected:expr) => {
#[test]
fn $name() {
let re = regex!($re);
let splitted: Vec<_> = re.split(t!($text)).collect();
assert_eq!($expected, &*splitted);
}
}
}
macro_rules! splitn {
($name:ident, $re:expr, $text:expr, $limit:expr, $expected:expr) => {
#[test]
fn $name() {
let re = regex!($re);
let splitted: Vec<_> = re.splitn(t!($text), $limit).collect();
assert_eq!($expected, &*splitted);
}
}
}