assertables/
assert_ne.rs

1//! Assert an expression is not equal to another.
2//!
3//! Pseudocode:<br>
4//! a ≠ b
5//!
6//! # Module macro
7//!
8//! * [`assert_ne_as_result`](macro@crate::assert_ne_as_result)
9//!
10//! # Rust standard macros
11//!
12//! * [`assert_ne`](https://doc.rust-lang.org/std/macro.assert_ne.html)
13//! * [`debug_assert_ne`](https://doc.rust-lang.org/std/macro.debug_assert_ne.html)
14
15/// Assert an expression is not equal to another.
16///
17/// Pseudocode:<br>
18/// a ≠ b
19///
20/// * If true, return Result `Ok(())`.
21///
22/// * When false, return [`Err`] with a message and the values of the
23///   expressions with their debug representations.
24///
25/// This macro is useful for runtime checks, such as checking parameters,
26/// or sanitizing inputs, or handling different results in different ways.
27///
28/// # Module macro
29///
30/// * [`assert_ne_as_result`](macro@crate::assert_ne_as_result)
31///
32/// # Rust standard macros
33///
34/// * [`assert_ne`](https://doc.rust-lang.org/std/macro.assert_ne.html)
35/// * [`debug_assert_ne`](https://doc.rust-lang.org/std/macro.debug_assert_ne.html)
36///
37#[macro_export]
38macro_rules! assert_ne_as_result {
39    ($a:expr, $b:expr $(,)?) => {{
40        match (&$a, &$b) {
41            (a, b) => {
42                if a != b {
43                    Ok(())
44                } else {
45                    Err(format!(
46                        concat!(
47                            "assertion failed: `assert_ne!(a, b)`\n",
48                            "https://docs.rs/assertables/9.5.3/assertables/macro.assert_ne.html\n",
49                            " a label: `{}`,\n",
50                            " a debug: `{:?}`,\n",
51                            " b label: `{}`,\n",
52                            " b debug: `{:?}`"
53                        ),
54                        stringify!($a),
55                        a,
56                        stringify!($b),
57                        b
58                    ))
59                }
60            }
61        }
62    }};
63}
64
65#[cfg(test)]
66mod test_assert_ne_as_result {
67
68    #[test]
69    fn ne() {
70        let a: i8 = 1;
71        let b: i8 = 2;
72        let actual = assert_ne_as_result!(a, b);
73        assert_eq!(actual.unwrap(), ());
74    }
75
76    #[test]
77    fn eq() {
78        let a: i8 = 1;
79        let b: i8 = 1;
80        let actual = assert_ne_as_result!(a, b);
81        let message = concat!(
82            "assertion failed: `assert_ne!(a, b)`\n",
83            "https://docs.rs/assertables/9.5.3/assertables/macro.assert_ne.html\n",
84            " a label: `a`,\n",
85            " a debug: `1`,\n",
86            " b label: `b`,\n",
87            " b debug: `1`",
88        );
89        assert_eq!(actual.unwrap_err(), message);
90    }
91
92    use std::sync::Once;
93    #[test]
94    fn once() {
95
96        static A: Once = Once::new();
97        fn a() -> i8 {
98            if A.is_completed() { panic!("A.is_completed()") } else { A.call_once(|| {}) }
99            1
100        }
101
102        static B: Once = Once::new();
103        fn b() -> i8 {
104            if B.is_completed() { panic!("B.is_completed()") } else { B.call_once(|| {}) }
105            2
106        }
107
108        assert_eq!(A.is_completed(), false);
109        assert_eq!(B.is_completed(), false);
110        let result = assert_ne_as_result!(a(), b());
111        assert!(result.is_ok());
112        assert_eq!(A.is_completed(), true);
113        assert_eq!(B.is_completed(), true);   
114    }
115
116}