#[macro_export]
macro_rules! assert_result_ok {
($result:expr) => {
match $result {
Ok(value) => value,
Err(e) => panic!(
"Expected Ok, got Err: {:?}\n at {}:{}:{}",
e,
file!(),
line!(),
column!()
),
}
};
($result:expr, $($msg:tt)+) => {
match $result {
Ok(value) => value,
Err(e) => panic!(
"{}: Expected Ok, got Err: {:?}\n at {}:{}:{}",
format!($($msg)+),
e,
file!(),
line!(),
column!()
),
}
};
}
#[macro_export]
macro_rules! assert_result_err {
($result:expr) => {
match $result {
Ok(value) => panic!(
"Expected Err, got Ok: {:?}\n at {}:{}:{}",
value,
file!(),
line!(),
column!()
),
Err(e) => e,
}
};
($result:expr, $($msg:tt)+) => {
match $result {
Ok(value) => panic!(
"{}: Expected Err, got Ok: {:?}\n at {}:{}:{}",
format!($($msg)+),
value,
file!(),
line!(),
column!()
),
Err(e) => e,
}
};
}
#[macro_export]
macro_rules! assert_contains_error {
($result:expr, $pattern:expr) => {{
let err = $crate::assert_result_err!($result);
let err_str = err.to_string();
assert!(
err_str.contains($pattern),
"Error '{}' does not contain '{}'\n at {}:{}:{}",
err_str,
$pattern,
file!(),
line!(),
column!()
);
err
}};
}
#[macro_export]
macro_rules! assert_validation_error_count {
($validation:expr, $count:expr) => {
match $validation {
stillwater::Validation::Success(value) => panic!(
"Expected {} validation errors, got success with: {:?}\n at {}:{}:{}",
$count,
value,
file!(),
line!(),
column!()
),
stillwater::Validation::Failure(errors) => {
assert_eq!(
errors.len(),
$count,
"Expected {} errors, got {}: {:?}\n at {}:{}:{}",
$count,
errors.len(),
errors,
file!(),
line!(),
column!()
);
errors
}
}
};
}
#[macro_export]
macro_rules! assert_validation_ok {
($validation:expr) => {
match $validation {
stillwater::Validation::Success(value) => value,
stillwater::Validation::Failure(errors) => panic!(
"Expected validation success, got {} errors: {:?}\n at {}:{}:{}",
errors.len(),
errors,
file!(),
line!(),
column!()
),
}
};
}
#[macro_export]
macro_rules! assert_validation_err {
($validation:expr) => {
match $validation {
stillwater::Validation::Success(value) => panic!(
"Expected validation failure, got success: {:?}\n at {}:{}:{}",
value,
file!(),
line!(),
column!()
),
stillwater::Validation::Failure(errors) => errors,
}
};
}
#[cfg(test)]
mod tests {
#[test]
fn test_assert_result_ok_success() {
let result: Result<i32, String> = Ok(42);
let value = assert_result_ok!(result);
assert_eq!(value, 42);
}
#[test]
#[should_panic(expected = "Expected Ok, got Err")]
fn test_assert_result_ok_failure() {
let result: Result<i32, String> = Err("error".to_string());
let _ = assert_result_ok!(result);
}
#[test]
fn test_assert_result_ok_with_message() {
let result: Result<i32, String> = Ok(42);
let value = assert_result_ok!(result, "custom message");
assert_eq!(value, 42);
}
#[test]
fn test_assert_result_err_success() {
let result: Result<i32, String> = Err("error".to_string());
let err = assert_result_err!(result);
assert_eq!(err, "error");
}
#[test]
#[should_panic(expected = "Expected Err, got Ok")]
fn test_assert_result_err_failure() {
let result: Result<i32, String> = Ok(42);
let _ = assert_result_err!(result);
}
#[test]
fn test_assert_contains_error_success() {
let result: Result<i32, String> = Err("File not found: test.rs".to_string());
let _ = assert_contains_error!(result, "not found");
}
#[test]
#[should_panic(expected = "does not contain")]
fn test_assert_contains_error_pattern_mismatch() {
let result: Result<i32, String> = Err("Permission denied".to_string());
assert_contains_error!(result, "not found");
}
#[test]
fn test_assert_validation_error_count() {
use stillwater::Validation;
let validation: Validation<i32, Vec<String>> =
Validation::Failure(vec!["e1".to_string(), "e2".to_string()]);
let errors = assert_validation_error_count!(validation, 2);
assert_eq!(errors.len(), 2);
}
#[test]
#[should_panic(expected = "Expected 3 errors")]
fn test_assert_validation_error_count_mismatch() {
use stillwater::Validation;
let validation: Validation<i32, Vec<String>> =
Validation::Failure(vec!["e1".to_string(), "e2".to_string()]);
let _ = assert_validation_error_count!(validation, 3);
}
#[test]
fn test_assert_validation_ok() {
use stillwater::Validation;
let validation: Validation<i32, Vec<String>> = Validation::Success(42);
let value = assert_validation_ok!(validation);
assert_eq!(value, 42);
}
#[test]
#[should_panic(expected = "Expected validation success")]
fn test_assert_validation_ok_failure() {
use stillwater::Validation;
let validation: Validation<i32, Vec<String>> =
Validation::Failure(vec!["error".to_string()]);
let _ = assert_validation_ok!(validation);
}
#[test]
fn test_assert_validation_err() {
use stillwater::Validation;
let validation: Validation<i32, Vec<String>> =
Validation::Failure(vec!["error".to_string()]);
let errors = assert_validation_err!(validation);
assert_eq!(errors.len(), 1);
}
#[test]
#[should_panic(expected = "Expected validation failure")]
fn test_assert_validation_err_success() {
use stillwater::Validation;
let validation: Validation<i32, Vec<String>> = Validation::Success(42);
let _ = assert_validation_err!(validation);
}
}