assertables/
assert_eq.rs

1//! Assert an expression is equal to another.
2//!
3//! Pseudocode:<br>
4//! a = b
5//!
6//! # Module macro
7//!
8//! * [`assert_eq_as_result`](macro@crate::assert_eq_as_result)
9//!
10//! # Rust standard macros
11//!
12//! * [`assert_eq`](https://doc.rust-lang.org/std/macro.assert_eq.html)
13//! * [`debug_assert_eq`](https://doc.rust-lang.org/std/macro.debug_assert_eq.html)
14
15/// Assert an expression is equal to another.
16///
17/// Pseudocode:<br>
18/// a = b
19///
20/// * If true, return Result `Ok(())`.
21///
22/// * Otherwise, return Result `Err(message)`.
23///
24/// This macro is useful for runtime checks, such as checking parameters,
25/// or sanitizing inputs, or handling different results in different ways.
26///
27/// # Module macros
28///
29/// * [`assert_eq_as_result`](macro@crate::assert_eq_as_result)
30///
31/// # Rust standard macros
32///
33/// * [`assert_eq`](https://doc.rust-lang.org/std/macro.assert_eq.html)
34/// * [`debug_assert_eq`](https://doc.rust-lang.org/std/macro.debug_assert_eq.html)
35///
36#[macro_export]
37macro_rules! assert_eq_as_result {
38    ($a:expr, $b:expr $(,)?) => {{
39        match (&$a, &$b) {
40            (a, b) => {
41                if a == b {
42                    Ok(())
43                } else {
44                    Err(format!(
45                        concat!(
46                            "assertion failed: `assert_eq!(a, b)`\n",
47                            "https://docs.rs/assertables/9.5.5/assertables/macro.assert_eq.html\n",
48                            " a label: `{}`,\n",
49                            " a debug: `{:?}`,\n",
50                            " b label: `{}`,\n",
51                            " b debug: `{:?}`",
52                        ),
53                        stringify!($a),
54                        a,
55                        stringify!($b),
56                        b
57                    ))
58                }
59            }
60        }
61    }};
62}
63
64#[cfg(test)]
65mod test_assert_eq_as_result {
66
67    #[test]
68    fn success() {
69        let a: i8 = 1;
70        let b: i8 = 1;
71        let actual = assert_eq_as_result!(a, b);
72        assert_eq!(actual.unwrap(), ());
73    }
74
75    #[test]
76    fn failure() {
77        let a: i8 = 1;
78        let b: i8 = 2;
79        let actual = assert_eq_as_result!(a, b);
80        let message = concat!(
81            "assertion failed: `assert_eq!(a, b)`\n",
82            "https://docs.rs/assertables/9.5.5/assertables/macro.assert_eq.html\n",
83            " a label: `a`,\n",
84            " a debug: `1`,\n",
85            " b label: `b`,\n",
86            " b debug: `2`",
87        );
88        assert_eq!(actual.unwrap_err(), message);
89    }
90}