#[macro_export]
macro_rules! assert_ok {
($expression:expr) => {
match $expression {
Ok(value) => value,
Err(err) => panic!("Expected Ok but got Err: {:?}", err),
}
};
($expression:expr, $message:expr) => {
match $expression {
Ok(value) => value,
Err(err) => panic!("{}: {:?}", $message, err),
}
};
}
#[macro_export]
macro_rules! assert_err {
($expression:expr) => {
match $expression {
Ok(value) => panic!("Expected Err but got Ok: {:?}", value),
Err(err) => err,
}
};
($expression:expr, $message:expr) => {
match $expression {
Ok(value) => panic!("{}: {:?}", $message, value),
Err(err) => err,
}
};
}
#[macro_export]
macro_rules! assert_err_variant {
($expression:expr, $pattern:pat) => {
match $expression {
Ok(value) => panic!("Expected Err but got Ok: {:?}", value),
Err($pattern) => (),
Err(err) => panic!("Error didn't match expected pattern: {:?}", err),
}
};
($expression:expr, $pattern:pat, $message:expr) => {
match $expression {
Ok(value) => panic!("{}: {:?}", $message, value),
Err($pattern) => (),
Err(err) => panic!("{}: {:?}", $message, err),
}
};
}
#[macro_export]
macro_rules! assert_async_ok {
($expression:expr) => {
match tokio_test::block_on($expression) {
Ok(value) => value,
Err(err) => panic!("Expected Ok but got Err: {:?}", err),
}
};
($expression:expr, $message:expr) => {
match tokio_test::block_on($expression) {
Ok(value) => value,
Err(err) => panic!("{}: {:?}", $message, err),
}
};
}
#[macro_export]
macro_rules! assert_async_err {
($expression:expr) => {
match tokio_test::block_on($expression) {
Ok(value) => panic!("Expected Err but got Ok: {:?}", value),
Err(err) => err,
}
};
($expression:expr, $message:expr) => {
match tokio_test::block_on($expression) {
Ok(value) => panic!("{}: {:?}", $message, value),
Err(err) => err,
}
};
}
#[macro_export]
macro_rules! with_env_vars {
($(($key:expr, $value:expr)),* => $body:expr) => {{
let mut guard = crate::helper::EnvVarGuard::new();
$(
guard.set($key, $value);
)*
let result = $body;
result
}};
}
#[macro_export]
macro_rules! test_cases {
($test_fn:expr, $(($name:expr, $input:expr, $expected:expr)),* $(,)?) => {
$(
let result = $test_fn($input);
assert_eq!(
result, $expected,
"Test case '{}' failed: expected {:?}, got {:?}",
$name, $expected, result
);
)*
};
}
#[macro_export]
macro_rules! with_mock_time {
($epoch_seconds:expr => $body:expr) => {{
let time_provider = crate::helper::MockTimeProvider::new($epoch_seconds);
let result = $body(&time_provider);
result
}};
($epoch_seconds:expr, $advance_by:expr => $body:expr) => {{
let mut time_provider = crate::helper::MockTimeProvider::new($epoch_seconds);
let result = $body(&time_provider);
time_provider.advance($advance_by);
let result2 = $body(&time_provider);
(result, result2)
}};
}
#[macro_export]
macro_rules! assert_timeout {
($timeout_ms:expr, $expression:expr) => {{
let result = tokio::time::timeout(
std::time::Duration::from_millis($timeout_ms),
$expression
).await;
assert!(result.is_err(), "Expected timeout but expression completed");
}};
}
#[macro_export]
macro_rules! assert_contains {
($collection:expr, $predicate:expr) => {
let found = $collection.iter().any($predicate);
assert!(found, "Collection does not contain expected item");
};
($collection:expr, $predicate:expr, $message:expr) => {
let found = $collection.iter().any($predicate);
assert!(found, "{}", $message);
};
}