#[macro_export]
macro_rules! assert_matches_as_result {
($($arg:tt)*) => {
if matches!($($arg)*) {
Ok(())
} else {
Err(
format!(
concat!(
"assertion failed: `assert_matches!(a)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_matches.html\n",
" args: `{}`",
),
stringify!($($arg)*)
)
)
}
};
}
#[cfg(test)]
mod test_assert_matches_as_result {
mod use_char {
#[test]
fn success() {
let a = 'a';
let actual = assert_matches_as_result!(a, 'a'..='z');
assert_eq!(actual.unwrap(), ());
}
#[test]
fn failure() {
let a = 'a';
let actual = assert_matches_as_result!(a, 'b'..='z');
let message = concat!(
"assertion failed: `assert_matches!(a)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_matches.html\n",
" args: `a, 'b'..='z'`",
);
assert_eq!(actual.unwrap_err(), message);
}
}
mod use_some {
#[test]
fn success() {
let a = Some(1);
let actual = assert_matches_as_result!(a, Some(x) if x < 2);
assert_eq!(actual.unwrap(), ());
}
#[test]
fn failure() {
let a = Some(2);
let actual = assert_matches_as_result!(a, Some(x) if x < 2);
let message = concat!(
"assertion failed: `assert_matches!(a)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_matches.html\n",
" args: `a, Some(x) if x < 2`",
);
assert_eq!(actual.unwrap_err(), message);
}
}
}
#[macro_export]
macro_rules! assert_matches {
($expression:expr, $pattern:pat if $guard:expr $(,)?) => {
match $crate::assert_matches_as_result!($expression, $pattern if $guard) {
Ok(()) => (),
Err(err) => panic!("{}", err),
}
};
($expression:expr, $pattern:pat) => {
match $crate::assert_matches_as_result!($expression, $pattern) {
Ok(()) => (),
Err(err) => panic!("{}", err),
}
};
($expression:expr, $pattern:pat if $guard:expr, $($message:tt)+) => {
match $crate::assert_matches_as_result!($expression, $pattern if $guard) {
Ok(()) => (),
Err(err) => panic!("{}\n{}", format_args!($($message)+), err),
}
};
($expression:expr, $pattern:pat, $($message:tt)+) => {
match $crate::assert_matches_as_result!($expression, $pattern) {
Ok(()) => (),
Err(err) => panic!("{}\n{}", format_args!($($message)+), err),
}
};
}
#[cfg(test)]
mod test_assert_matches {
mod use_char {
use std::panic;
#[test]
fn success() {
let a = 'a';
let actual = assert_matches!(a, 'a'..='z');
assert_eq!(actual, ());
}
#[test]
fn success_with_custom_message() {
let a = 'a';
let actual = assert_matches!(a, 'a'..='z', "a is {a}");
assert_eq!(actual, ());
}
#[test]
fn failure() {
let a = 'a';
let result = panic::catch_unwind(|| {
let _actual = assert_matches!(a, 'b'..='z');
});
let message = concat!(
"assertion failed: `assert_matches!(a)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_matches.html\n",
" args: `a, 'b'..='z'`",
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
#[test]
fn failure_with_custom_message() {
let a = 'a';
let result = panic::catch_unwind(|| {
let _actual = assert_matches!(a, 'b'..='z', "a is {a}");
});
let message = concat!(
"a is a\n",
"assertion failed: `assert_matches!(a)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_matches.html\n",
" args: `a, 'b'..='z'`",
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}
mod use_some {
use std::panic;
#[test]
fn success() {
let a = Some(1);
let actual = assert_matches!(a, Some(x) if x < 2);
assert_eq!(actual, ());
}
#[test]
fn success_with_custom_message() {
let a = Some(1);
let actual = assert_matches!(a, Some(x) if x < 2, "a is {:?}", a);
assert_eq!(actual, ());
}
#[test]
fn failure() {
let a = Some(2);
let result = panic::catch_unwind(|| {
let _actual = assert_matches!(a, Some(x) if x < 2);
});
let message = concat!(
"assertion failed: `assert_matches!(a)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_matches.html\n",
" args: `a, Some(x) if x < 2`",
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
#[test]
fn failure_with_custom_message() {
let a = Some(2);
let result = panic::catch_unwind(|| {
let _actual = assert_matches!(a, Some(x) if x < 2, "a is {:?}", a);
});
let message = concat!(
"a is Some(2)\n",
"assertion failed: `assert_matches!(a)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_matches.html\n",
" args: `a, Some(x) if x < 2`",
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}
}
#[macro_export]
macro_rules! debug_assert_matches {
($($arg:tt)*) => {
if cfg!(debug_assertions) {
$crate::assert_matches!($($arg)*);
}
};
}
#[cfg(test)]
mod test_debug_assert_matches {
mod use_char {
use std::panic;
#[test]
fn success() {
let a = 'a';
let _actual = debug_assert_matches!(a, 'a'..='z');
}
#[test]
fn success_with_custom_message() {
let a = 'a';
let _actual = debug_assert_matches!(a, 'a'..='z', "a is {a}");
}
#[test]
fn failure() {
let a = 'a';
let result = panic::catch_unwind(|| {
let _actual = debug_assert_matches!(a, 'b'..='z');
});
let message = concat!(
"assertion failed: `assert_matches!(a)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_matches.html\n",
" args: `a, 'b'..='z'`",
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
#[test]
fn failure_with_custom_message() {
let a = 'a';
let result = panic::catch_unwind(|| {
let _actual = debug_assert_matches!(a, 'b'..='z', "a is {a}");
});
let message = concat!(
"a is a\n",
"assertion failed: `assert_matches!(a)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_matches.html\n",
" args: `a, 'b'..='z'`",
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}
mod use_some {
use std::panic;
#[test]
fn success() {
let a = Some(1);
let _actual = debug_assert_matches!(a, Some(x) if x < 2);
}
#[test]
fn success_with_custom_message() {
let a = Some(1);
let _actual = debug_assert_matches!(a, Some(x) if x < 2, "a is {:?}", a);
}
#[test]
fn failure() {
let a = Some(2);
let result = panic::catch_unwind(|| {
let _actual = debug_assert_matches!(a, Some(x) if x < 2);
});
let message = concat!(
"assertion failed: `assert_matches!(a)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_matches.html\n",
" args: `a, Some(x) if x < 2`",
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
#[test]
fn failure_with_custom_message() {
let a = Some(2);
let result = panic::catch_unwind(|| {
let _actual = debug_assert_matches!(a, Some(x) if x < 2, "a is {:?}", a);
});
let message = concat!(
"a is Some(2)\n",
"assertion failed: `assert_matches!(a)`\n",
"https://docs.rs/assertables/9.9.0/assertables/macro.assert_matches.html\n",
" args: `a, Some(x) if x < 2`",
);
assert_eq!(
result
.unwrap_err()
.downcast::<String>()
.unwrap()
.to_string(),
message
);
}
}
}