#[doc(hidden)]
#[inline]
#[must_use]
pub fn event_bytes<E: AsRef<[u8]> + ?Sized>(event: &E) -> &[u8] {
event.as_ref()
}
macro_rules! q {
($($name:expr => $pattern:expr),+ $(,)?) => {{
let mut q = $crate::Quamina::new();
$( q.add_pattern($name, $pattern).unwrap(); )+
q
}};
}
macro_rules! assert_matches {
($q:expr, $event:expr, $expected:expr) => {{
let matches = $q
.matches_for_event($crate::test_helpers::event_bytes(&$event))
.unwrap();
assert_eq!(matches, $expected, "Event: {}", $event);
}};
($q:expr, $event:expr, $expected:expr, $msg:expr) => {{
let matches = $q
.matches_for_event($crate::test_helpers::event_bytes(&$event))
.unwrap();
assert_eq!(matches, $expected, "{} (event: {})", $msg, $event);
}};
}
macro_rules! assert_no_match {
($q:expr, $event:expr) => {{
let matches = $q
.matches_for_event($crate::test_helpers::event_bytes(&$event))
.unwrap();
assert!(matches.is_empty(), "Expected no match for: {}", $event);
}};
($q:expr, $event:expr, $msg:expr) => {{
let matches = $q
.matches_for_event($crate::test_helpers::event_bytes(&$event))
.unwrap();
assert!(matches.is_empty(), "{} (event: {})", $msg, $event);
}};
}
macro_rules! assert_has_match {
($q:expr, $event:expr, $name:expr) => {{
let matches = $q
.matches_for_event($crate::test_helpers::event_bytes(&$event))
.unwrap();
assert!(
matches.contains(&$name),
"Expected {:?} in matches for {}, got {:?}",
$name,
$event,
matches
);
}};
($q:expr, $event:expr, $name:expr, $msg:expr) => {{
let matches = $q
.matches_for_event($crate::test_helpers::event_bytes(&$event))
.unwrap();
assert!(
matches.contains(&$name),
"{}: expected {:?} in matches for {}, got {:?}",
$msg,
$name,
$event,
matches
);
}};
}
macro_rules! assert_no_has_match {
($q:expr, $event:expr, $name:expr) => {{
let matches = $q
.matches_for_event($crate::test_helpers::event_bytes(&$event))
.unwrap();
assert!(
!matches.contains(&$name),
"Expected {:?} NOT in matches for {}, got {:?}",
$name,
$event,
matches
);
}};
}
macro_rules! assert_match_count {
($q:expr, $event:expr, $count:expr) => {{
let matches = $q
.matches_for_event($crate::test_helpers::event_bytes(&$event))
.unwrap();
assert_eq!(
matches.len(),
$count,
"Expected {} matches for {}, got {:?}",
$count,
$event,
matches
);
}};
($q:expr, $event:expr, $count:expr, $msg:expr) => {{
let matches = $q
.matches_for_event($crate::test_helpers::event_bytes(&$event))
.unwrap();
assert_eq!(
matches.len(),
$count,
"{}: expected {} matches for {}, got {:?}",
$msg,
$count,
$event,
matches
);
}};
}
macro_rules! assert_add_ok {
($q:expr, $name:expr, $pattern:expr) => {
assert!(
$q.add_pattern($name, $pattern).is_ok(),
"add_pattern({}, ...) should succeed",
$name
);
};
}
macro_rules! assert_add_err {
($q:expr, $name:expr, $pattern:expr) => {
assert!(
$q.add_pattern($name, $pattern).is_err(),
"add_pattern({}, ...) should fail",
$name
);
};
}
pub fn exercise_wildcard(pattern: &str, should_match: &[&str], should_not_match: &[&str]) {
let mut q = crate::Quamina::new();
let full_pattern = format!(r#"{{"x": [{{"wildcard": "{pattern}"}}]}}"#);
q.add_pattern(pattern, &full_pattern)
.unwrap_or_else(|_| panic!("Pattern should be valid: {pattern}"));
for text in should_match {
let event = format!(r#"{{"x": "{text}"}}"#);
let matches = q.matches_for_event(event.as_bytes()).unwrap();
assert!(
matches.contains(&pattern),
"Pattern '{pattern}' should match '{text}', got {matches:?}"
);
}
for text in should_not_match {
let event = format!(r#"{{"x": "{text}"}}"#);
let matches = q.matches_for_event(event.as_bytes()).unwrap();
assert!(
!matches.contains(&pattern),
"Pattern '{pattern}' should NOT match '{text}'"
);
}
}