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}