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}