1#[macro_export]
42macro_rules! assert_err {
43 ($cond:expr $(,)?) => {
44 match $cond {
45 ::core::result::Result::Err(e) => e,
46 ::core::result::Result::Ok(t) => ::core::panic!("assertion failed, expected Err(_), got Ok({:?})", t),
47 }
48 };
49 ($cond:expr, $($arg:tt)+) => {
50 match $cond {
51 ::core::result::Result::Err(e) => e,
52 ::core::result::Result::Ok(t) => ::core::panic!("assertion failed, expected Err(_), got Ok({:?}): {}", t, ::core::format_args!($($arg)+)),
53 }
54 };
55}
56
57#[macro_export]
64macro_rules! debug_assert_err {
65 ($($arg:tt)*) => {
66 #[cfg(debug_assertions)]
67 $crate::assert_err!($($arg)*);
68 }
69}
70
71#[cfg(test)]
72mod tests {
73 #[test]
74 fn err() {
75 assert_err!(Err::<(), _>(()));
76 }
77
78 #[test]
79 #[should_panic(expected = "assertion failed, expected Err(_), got Ok(())")]
80 fn not_err() {
81 assert_err!(Ok::<_, ()>(()));
82 }
83
84 #[test]
85 #[should_panic(expected = "assertion failed, expected Err(_), got Ok(()): foo")]
86 fn not_err_custom_message() {
87 assert_err!(Ok::<_, ()>(()), "foo");
88 }
89
90 #[test]
91 fn err_value_returned() {
92 let value = assert_err!(Err::<(), _>(42));
93 assert_eq!(value, 42);
94 }
95
96 #[test]
97 #[cfg_attr(not(debug_assertions), ignore = "only run in debug mode")]
98 fn debug_err() {
99 debug_assert_err!(Err::<(), _>(()));
100 }
101
102 #[test]
103 #[cfg_attr(not(debug_assertions), ignore = "only run in debug mode")]
104 #[should_panic(expected = "assertion failed, expected Err(_), got Ok(())")]
105 fn debug_not_err() {
106 debug_assert_err!(Ok::<_, ()>(()));
107 }
108
109 #[test]
110 #[cfg_attr(not(debug_assertions), ignore = "only run in debug mode")]
111 #[should_panic(expected = "assertion failed, expected Err(_), got Ok(()): foo")]
112 fn debug_not_err_custom_message() {
113 debug_assert_err!(Ok::<_, ()>(()), "foo");
114 }
115
116 #[test]
117 #[cfg_attr(debug_assertions, ignore = "only run in release mode")]
118 fn debug_release_not_err() {
119 debug_assert_err!(Ok::<_, ()>(()));
120 }
121
122 #[test]
123 fn does_not_require_err_to_impl_debug() {
124 enum Foo {
125 Bar,
126 }
127
128 assert_err!(Err::<(), _>(Foo::Bar));
129 }
130
131 #[test]
132 fn debug_does_not_require_err_to_impl_debug() {
133 #[allow(dead_code)]
134 enum Foo {
135 Bar,
136 }
137
138 debug_assert_err!(Err::<(), _>(Foo::Bar));
139 }
140
141 #[test]
142 fn does_not_require_err_to_impl_debug_custom_message() {
143 enum Foo {
144 Bar,
145 }
146
147 assert_err!(Err::<(), _>(Foo::Bar), "foo");
148 }
149
150 #[test]
151 fn debug_does_not_require_err_to_impl_debug_custom_message() {
152 #[allow(dead_code)]
153 enum Foo {
154 Bar,
155 }
156
157 debug_assert_err!(Err::<(), _>(Foo::Bar), "foo");
158 }
159}