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}