rassert_rs/
lib.rs

1/// Helper macro to return an Err if the expression fails.
2///
3/// # Example
4/// ```rust
5/// use rassert_rs::rassert;
6///
7/// enum MyError {
8///     SaulBadman,
9/// }
10///
11/// fn test() -> Result<i32, MyError> {
12///     rassert!(42 != 42, MyError::SaulBadman);
13///     Ok(72)
14/// }
15///
16/// fn main() {
17///     assert!(test().is_err());
18/// }
19/// ```
20#[macro_export]
21macro_rules! rassert {
22    ($expr: expr, $err: expr) => {
23        let _ = if $expr {
24            Ok(())
25        } else {
26            Err($err)
27        }?;
28    };
29}
30
31/// Helper macro to cleanly execute an expression and return out of the function if it fails.
32///
33/// # Example
34/// ```rust
35/// use rassert_rs::rassert_notify;
36///
37/// fn main() {
38///     rassert_notify!(42 != 42, println!("Yikes"));
39///     // Prints 'Yikes'
40/// }
41/// ```
42#[macro_export]
43macro_rules! rassert_notify {
44    ($expr: expr, $notify: expr) => {
45        if !$expr {
46            $notify;
47            return;
48        }
49    };
50}
51
52/// Helper macro to cleanly execute an expression and continue a loop if it fails.
53///
54/// # Example
55/// ```rust
56/// use rassert_rs::rassert_notify_continue;
57///
58/// fn main() {
59///     let mut i = 1;
60///     while i != 5 {
61///         i += 1;
62///         rassert_notify_continue!(42 != 42, println!("Yikes"));
63///         // Prints 'Yikes' and continues the loop
64///     }
65/// }
66/// ```
67#[macro_export]
68macro_rules! rassert_notify_continue {
69    ($expr: expr, $notify: expr) => {
70        if !$expr {
71            $notify;
72            continue;
73        }
74    };
75}
76
77/// Helper macro to cleanly execute an expression and break a loop if it fails.
78///
79/// # Example
80/// ```rust
81/// use rassert_rs::rassert_notify_break;
82///
83/// fn main() {
84///     let mut i = 1;
85///     while i != 5 {
86///         rassert_notify_break!(42 != 42, println!("Yikes"));
87///         // Prints 'Yikes' and breaks the loop
88///         i += 1;
89///     }
90///     assert_eq!(i, 1);
91/// }
92/// ```
93#[macro_export]
94macro_rules! rassert_notify_break {
95    ($expr: expr, $notify: expr) => {
96        if !$expr {
97            $notify;
98            break;
99        }
100    };
101}
102
103#[cfg(test)]
104mod tests {
105    use crate::{rassert, rassert_notify};
106
107    struct TestError;
108
109    fn driver(f: impl Fn() -> Result<(), TestError>) -> Result<(), TestError> {
110        f()
111    }
112
113    #[test]
114    fn check_ok() {
115        let result = driver(|| {
116            rassert!(1 == 1, TestError);
117
118            Ok(())
119        });
120
121        assert!(result.is_ok());
122    }
123
124    #[test]
125    fn check_err() {
126        let result = driver(|| {
127            rassert!(1 != 1, TestError);
128
129            Ok(())
130        });
131
132        assert!(result.is_err());
133    }
134
135    #[allow(unused_assignments)]
136    #[test]
137    fn check_notify() {
138        let mut var = 72;
139        rassert_notify!(42 != 42, var = 42);
140        assert_eq!(var, 42);
141    }
142
143    #[allow(unused_assignments)]
144    #[test]
145    fn check_notify_continue() {
146        let mut var = 72;
147        while var != 42 {
148            rassert_notify_continue!(42 != 42, var = 42);
149        }
150        assert_eq!(var, 42);
151    }
152
153    #[allow(unused_assignments)]
154    #[test]
155    fn check_notify_break() {
156        let mut var = 72;
157        loop {
158            rassert_notify_break!(42 != 42, var = 42);
159        }
160        assert_eq!(var, 42);
161    }
162}