1#[macro_export]
54macro_rules! assert_ok {
55 ($cond:expr $(,)?) => {
56 match $cond {
57 ::core::result::Result::Ok(t) => t,
58 ::core::result::Result::Err(e) => {
59 ::core::panic!("assertion failed, expected Ok(_), got Err({:?})", e);
60 }
61 }
62 };
63 ($cond:expr, $($arg:tt)+) => {
64 match $cond {
65 ::core::result::Result::Ok(t) => t,
66 ::core::result::Result::Err(e) => {
67 ::core::panic!("assertion failed, expected Ok(_), got Err({:?}): {}", e, ::core::format_args!($($arg)+));
68 }
69 }
70 };
71}
72
73#[macro_export]
80macro_rules! debug_assert_ok {
81 ($($arg:tt)*) => {
82 #[cfg(debug_assertions)]
83 $crate::assert_ok!($($arg)*);
84 }
85}
86
87#[cfg(test)]
88mod tests {
89 #[test]
90 fn ok() {
91 assert_ok!(Ok::<_, ()>(()));
92 }
93
94 #[test]
95 #[should_panic(expected = "assertion failed, expected Ok(_), got Err(())")]
96 fn not_ok() {
97 assert_ok!(Err::<(), _>(()));
98 }
99
100 #[test]
101 #[should_panic(expected = "assertion failed, expected Ok(_), got Err(()): foo")]
102 fn not_ok_custom_message() {
103 assert_ok!(Err::<(), _>(()), "foo");
104 }
105
106 #[test]
107 fn ok_value_returned() {
108 let value = assert_ok!(Ok::<_, ()>(42));
109 assert_eq!(value, 42);
110 }
111
112 #[test]
113 fn debug_ok() {
114 debug_assert_ok!(Ok::<_, ()>(()));
115 }
116
117 #[test]
118 #[cfg_attr(not(debug_assertions), ignore = "only run in debug mode")]
119 #[should_panic(expected = "assertion failed, expected Ok(_), got Err(())")]
120 fn debug_not_ok() {
121 debug_assert_ok!(Err::<(), _>(()));
122 }
123
124 #[test]
125 #[cfg_attr(not(debug_assertions), ignore = "only run in debug mode")]
126 #[should_panic(expected = "assertion failed, expected Ok(_), got Err(()): foo")]
127 fn debug_not_ok_custom_message() {
128 debug_assert_ok!(Err::<(), _>(()), "foo");
129 }
130
131 #[test]
132 #[cfg_attr(debug_assertions, ignore = "only run in release mode")]
133 fn debug_release_not_ok() {
134 debug_assert_ok!(Err::<(), _>(()));
135 }
136
137 #[test]
138 fn does_not_require_ok_to_impl_debug() {
139 enum Foo {
140 Bar,
141 }
142
143 assert_ok!(Ok::<_, ()>(Foo::Bar));
144 }
145
146 #[test]
147 fn debug_does_not_require_ok_to_impl_debug() {
148 #[allow(dead_code)]
149 enum Foo {
150 Bar,
151 }
152
153 debug_assert_ok!(Ok::<_, ()>(Foo::Bar));
154 }
155
156 #[test]
157 fn does_not_require_ok_to_impl_debug_custom_message() {
158 enum Foo {
159 Bar,
160 }
161
162 assert_ok!(Ok::<_, ()>(Foo::Bar), "foo");
163 }
164
165 #[test]
166 fn debug_does_not_require_ok_to_impl_debug_custom_message() {
167 #[allow(dead_code)]
168 enum Foo {
169 Bar,
170 }
171
172 debug_assert_ok!(Ok::<_, ()>(Foo::Bar), "foo");
173 }
174}