Skip to main content

wowlab_test_support/
batch.rs

1/// Verify heterogeneous matcher pairs, collecting every failure into one result.
2#[macro_export]
3macro_rules! verify_all {
4    ($($actual:expr => $matcher:expr),+ $(,)?) => {{
5        let mut combined_failure = googletest::verify_true!(true).err();
6        $(
7            if let Err(mut failure) = googletest::verify_that!($actual, $matcher) {
8                failure.description = format!(
9                    "{}:\n{}",
10                    stringify!($actual),
11                    failure.description,
12                );
13                if let Some(existing) = &mut combined_failure {
14                    existing.description.push_str("\n\n");
15                    existing.description.push_str(&failure.description);
16                } else {
17                    combined_failure = Some(failure);
18                }
19            }
20        )+
21        match combined_failure {
22            Some(failure) => Err(failure),
23            None => Ok(()),
24        }
25    }};
26}
27
28/// Run heterogeneous non-fatal matcher pairs in a gtest body.
29#[macro_export]
30macro_rules! expect_all {
31    ($($actual:expr => $matcher:expr),+ $(,)?) => {{
32        $(
33            googletest::scoped_trace!(stringify!($actual));
34            googletest::expect_that!($actual, $matcher);
35        )+
36    }};
37}
38
39#[cfg(test)]
40mod tests {
41    use googletest::prelude::*;
42
43    #[gtest]
44    fn verify_all_accepts_heterogeneous_successes() -> Result<()> {
45        crate::verify_all!(1 => eq(1), "value" => starts_with("val"))
46    }
47
48    #[gtest]
49    fn verify_all_reports_each_failed_expression() -> Result<()> {
50        let error = crate::verify_all!(1 => eq(2), "value" => eq("other"))
51            .expect_err("fixture assertions should fail");
52
53        verify_that!(
54            error.description,
55            all!(contains_substring("1:"), contains_substring("\"value\":"))
56        )
57    }
58
59    #[gtest]
60    fn expect_all_accepts_heterogeneous_successes() {
61        crate::expect_all!(1 => eq(1), "value" => starts_with("val"));
62    }
63}