1 use core::ops::DerefMut;
4 fn op1() -> Result<isize, &'static str> {
7 fn op2() -> Result<isize, &'static str> {
13 assert_eq!(op1().and(Ok(667)).unwrap(), 667);
14 assert_eq!(op1().and(Err::<i32, &'static str>("bad")).unwrap_err(), "bad");
16 assert_eq!(op2().and(Ok(667)).unwrap_err(), "sadface");
17 assert_eq!(op2().and(Err::<i32, &'static str>("bad")).unwrap_err(), "sadface");
22 assert_eq!(op1().and_then(|i| Ok::<isize, &'static str>(i + 1)).unwrap(), 667);
23 assert_eq!(op1().and_then(|_| Err::<isize, &'static str>("bad")).unwrap_err(), "bad");
25 assert_eq!(op2().and_then(|i| Ok::<isize, &'static str>(i + 1)).unwrap_err(), "sadface");
26 assert_eq!(op2().and_then(|_| Err::<isize, &'static str>("bad")).unwrap_err(), "sadface");
31 assert_eq!(op1().or(Ok::<_, &'static str>(667)).unwrap(), 666);
32 assert_eq!(op1().or(Err("bad")).unwrap(), 666);
34 assert_eq!(op2().or(Ok::<_, &'static str>(667)).unwrap(), 667);
35 assert_eq!(op2().or(Err("bad")).unwrap_err(), "bad");
40 assert_eq!(op1().or_else(|_| Ok::<isize, &'static str>(667)).unwrap(), 666);
41 assert_eq!(op1().or_else(|e| Err::<isize, &'static str>(e)).unwrap(), 666);
43 assert_eq!(op2().or_else(|_| Ok::<isize, &'static str>(667)).unwrap(), 667);
44 assert_eq!(op2().or_else(|e| Err::<isize, &'static str>(e)).unwrap_err(), "sadface");
49 assert!(Ok::<isize, isize>(1).map(|x| x + 1) == Ok(2));
50 assert!(Err::<isize, isize>(1).map(|x| x + 1) == Err(1));
54 fn test_impl_map_err() {
55 assert!(Ok::<isize, isize>(1).map_err(|x| x + 1) == Ok(1));
56 assert!(Err::<isize, isize>(1).map_err(|x| x + 1) == Err(2));
61 let v: Result<Vec<isize>, ()> = (0..0).map(|_| Ok::<isize, ()>(0)).collect();
62 assert!(v == Ok(vec![]));
64 let v: Result<Vec<isize>, ()> = (0..3).map(|x| Ok::<isize, ()>(x)).collect();
65 assert!(v == Ok(vec![0, 1, 2]));
67 let v: Result<Vec<isize>, isize> = (0..3).map(|x| if x > 1 { Err(x) } else { Ok(x) }).collect();
70 // test that it does not take more elements than it needs
71 let mut functions: [Box<dyn Fn() -> Result<(), isize>>; 3] =
72 [Box::new(|| Ok(())), Box::new(|| Err(1)), Box::new(|| panic!())];
74 let v: Result<Vec<()>, isize> = functions.iter_mut().map(|f| (*f)()).collect();
79 fn test_fmt_default() {
80 let ok: Result<isize, &'static str> = Ok(100);
81 let err: Result<isize, &'static str> = Err("Err");
83 let s = format!("{ok:?}");
84 assert_eq!(s, "Ok(100)");
85 let s = format!("{err:?}");
86 assert_eq!(s, "Err(\"Err\")");
91 let ok: Result<isize, &'static str> = Ok(100);
92 let ok_err: Result<isize, &'static str> = Err("Err");
94 assert_eq!(ok.unwrap_or(50), 100);
95 assert_eq!(ok_err.unwrap_or(50), 50);
99 fn test_unwrap_or_else() {
100 fn handler(msg: &'static str) -> isize {
101 if msg == "I got this." { 50 } else { panic!("BadBad") }
104 let ok: Result<isize, &'static str> = Ok(100);
105 let ok_err: Result<isize, &'static str> = Err("I got this.");
107 assert_eq!(ok.unwrap_or_else(handler), 100);
108 assert_eq!(ok_err.unwrap_or_else(handler), 50);
113 pub fn test_unwrap_or_else_panic() {
114 fn handler(msg: &'static str) -> isize {
115 if msg == "I got this." { 50 } else { panic!("BadBad") }
118 let bad_err: Result<isize, &'static str> = Err("Unrecoverable mess.");
119 let _: isize = bad_err.unwrap_or_else(handler);
123 fn test_unwrap_unchecked() {
124 let ok: Result<isize, &'static str> = Ok(100);
125 assert_eq!(unsafe { ok.unwrap_unchecked() }, 100);
129 fn test_unwrap_err_unchecked() {
130 let ok_err: Result<isize, &'static str> = Err("Err");
131 assert_eq!(unsafe { ok_err.unwrap_err_unchecked() }, "Err");
135 pub fn test_expect_ok() {
136 let ok: Result<isize, &'static str> = Ok(100);
137 assert_eq!(ok.expect("Unexpected error"), 100);
140 #[should_panic(expected = "Got expected error: \"All good\"")]
141 pub fn test_expect_err() {
142 let err: Result<isize, &'static str> = Err("All good");
143 err.expect("Got expected error");
147 pub fn test_expect_err_err() {
148 let ok: Result<&'static str, isize> = Err(100);
149 assert_eq!(ok.expect_err("Unexpected ok"), 100);
152 #[should_panic(expected = "Got expected ok: \"All good\"")]
153 pub fn test_expect_err_ok() {
154 let err: Result<&'static str, isize> = Ok("All good");
155 err.expect_err("Got expected ok");
160 let ok: Result<isize, &'static str> = Ok(100);
161 let mut it = ok.iter();
162 assert_eq!(it.size_hint(), (1, Some(1)));
163 assert_eq!(it.next(), Some(&100));
164 assert_eq!(it.size_hint(), (0, Some(0)));
165 assert!(it.next().is_none());
166 assert_eq!((&ok).into_iter().next(), Some(&100));
168 let err: Result<isize, &'static str> = Err("error");
169 assert_eq!(err.iter().next(), None);
173 pub fn test_iter_mut() {
174 let mut ok: Result<isize, &'static str> = Ok(100);
175 for loc in ok.iter_mut() {
178 assert_eq!(ok, Ok(200));
182 assert_eq!(ok, Ok(300));
184 let mut err: Result<isize, &'static str> = Err("error");
185 for loc in err.iter_mut() {
188 assert_eq!(err, Err("error"));
192 pub fn test_unwrap_or_default() {
193 assert_eq!(op1().unwrap_or_default(), 666);
194 assert_eq!(op2().unwrap_or_default(), 0);
198 pub fn test_into_ok() {
199 fn infallible_op() -> Result<isize, !> {
203 assert_eq!(infallible_op().into_ok(), 666);
206 impl From<MyNeverToken> for ! {
207 fn from(never: MyNeverToken) -> ! {
212 fn infallible_op2() -> Result<isize, MyNeverToken> {
216 assert_eq!(infallible_op2().into_ok(), 667);
220 pub fn test_into_err() {
221 fn until_error_op() -> Result<!, isize> {
225 assert_eq!(until_error_op().into_err(), 666);
228 impl From<MyNeverToken> for ! {
229 fn from(never: MyNeverToken) -> ! {
234 fn until_error_op2() -> Result<MyNeverToken, isize> {
238 assert_eq!(until_error_op2().into_err(), 667);
243 fn try_result_ok() -> Result<u8, u32> {
244 let result: Result<u8, u8> = Ok(1);
248 assert_eq!(try_result_ok(), Ok(1));
250 fn try_result_err() -> Result<u8, u32> {
251 let result: Result<u8, u8> = Err(1);
255 assert_eq!(try_result_err(), Err(1));
259 fn test_result_as_deref() {
260 // &Result<T: Deref, E>::Ok(T).as_deref() ->
261 // Result<&T::Deref::Target, &E>::Ok(&*T)
262 let ref_ok = &Result::Ok::<&i32, u8>(&42);
263 let expected_result = Result::Ok::<&i32, &u8>(&42);
264 assert_eq!(ref_ok.as_deref(), expected_result);
266 let ref_ok = &Result::Ok::<String, u32>(String::from("a result"));
267 let expected_result = Result::Ok::<&str, &u32>("a result");
268 assert_eq!(ref_ok.as_deref(), expected_result);
270 let ref_ok = &Result::Ok::<Vec<i32>, u32>(vec![1, 2, 3, 4, 5]);
271 let expected_result = Result::Ok::<&[i32], &u32>([1, 2, 3, 4, 5].as_slice());
272 assert_eq!(ref_ok.as_deref(), expected_result);
274 // &Result<T: Deref, E>::Err(T).as_deref() ->
275 // Result<&T::Deref::Target, &E>::Err(&*E)
277 let ref_err = &Result::Err::<&u8, i32>(val);
278 let expected_result = Result::Err::<&u8, &i32>(&val);
279 assert_eq!(ref_err.as_deref(), expected_result);
281 let s = String::from("an error");
282 let ref_err = &Result::Err::<&u32, String>(s.clone());
283 let expected_result = Result::Err::<&u32, &String>(&s);
284 assert_eq!(ref_err.as_deref(), expected_result);
286 let v = vec![5, 4, 3, 2, 1];
287 let ref_err = &Result::Err::<&u32, Vec<i32>>(v.clone());
288 let expected_result = Result::Err::<&u32, &Vec<i32>>(&v);
289 assert_eq!(ref_err.as_deref(), expected_result);
293 fn test_result_as_deref_mut() {
294 // &mut Result<T: DerefMut, E>::Ok(T).as_deref_mut() ->
295 // Result<&mut T::DerefMut::Target, &mut E>::Ok(&mut *T)
297 let mut expected_val = 42;
298 let mut_ok = &mut Result::Ok::<&mut i32, u8>(&mut val);
299 let expected_result = Result::Ok::<&mut i32, &mut u8>(&mut expected_val);
300 assert_eq!(mut_ok.as_deref_mut(), expected_result);
302 let mut expected_string = String::from("a result");
303 let mut_ok = &mut Result::Ok::<String, u32>(expected_string.clone());
304 let expected_result = Result::Ok::<&mut str, &mut u32>(expected_string.deref_mut());
305 assert_eq!(mut_ok.as_deref_mut(), expected_result);
307 let mut expected_vec = vec![1, 2, 3, 4, 5];
308 let mut_ok = &mut Result::Ok::<Vec<i32>, u32>(expected_vec.clone());
309 let expected_result = Result::Ok::<&mut [i32], &mut u32>(expected_vec.as_mut_slice());
310 assert_eq!(mut_ok.as_deref_mut(), expected_result);
312 // &mut Result<T: DerefMut, E>::Err(T).as_deref_mut() ->
313 // Result<&mut T, &mut E>::Err(&mut *E)
315 let mut_err = &mut Result::Err::<&mut u8, i32>(val);
316 let expected_result = Result::Err::<&mut u8, &mut i32>(&mut val);
317 assert_eq!(mut_err.as_deref_mut(), expected_result);
319 let mut expected_string = String::from("an error");
320 let mut_err = &mut Result::Err::<&mut u32, String>(expected_string.clone());
321 let expected_result = Result::Err::<&mut u32, &mut String>(&mut expected_string);
322 assert_eq!(mut_err.as_deref_mut(), expected_result);
324 let mut expected_vec = vec![5, 4, 3, 2, 1];
325 let mut_err = &mut Result::Err::<&mut u32, Vec<i32>>(expected_vec.clone());
326 let expected_result = Result::Err::<&mut u32, &mut Vec<i32>>(&mut expected_vec);
327 assert_eq!(mut_err.as_deref_mut(), expected_result);
332 // test that the methods of `Result` are usable in a const context
334 const RESULT: Result<usize, bool> = Ok(32);
336 const REF: Result<&usize, &bool> = RESULT.as_ref();
337 assert_eq!(REF, Ok(&32));
339 const IS_OK: bool = RESULT.is_ok();
342 const IS_ERR: bool = RESULT.is_err();
347 const fn result_const_mut() {
348 let mut result: Result<usize, bool> = Ok(32);
351 let as_mut = result.as_mut();
354 Err(_) => unreachable!(),
358 let mut result_err: Result<usize, bool> = Err(false);
361 let as_mut = result_err.as_mut();
363 Ok(_) => unreachable!(),
370 fn result_opt_conversions() {
371 #[derive(Copy, Clone, Debug, PartialEq)]
374 fn try_num(x: i32) -> Result<i32, BadNumErr> {
375 if x <= 5 { Ok(x + 1) } else { Err(BadNumErr) }
378 type ResOpt = Result<Option<i32>, BadNumErr>;
379 type OptRes = Option<Result<i32, BadNumErr>>;
381 let mut x: ResOpt = Ok(Some(5));
382 let mut y: OptRes = Some(Ok(5));
383 assert_eq!(x, y.transpose());
384 assert_eq!(x.transpose(), y);
388 assert_eq!(x, y.transpose());
389 assert_eq!(x.transpose(), y);
392 y = Some(Err(BadNumErr));
393 assert_eq!(x, y.transpose());
394 assert_eq!(x.transpose(), y);
396 let res: Result<Vec<i32>, BadNumErr> = (0..10)
399 Ok(if y % 2 == 0 { Some(y - 1) } else { None })
401 .filter_map(Result::transpose)
404 assert_eq!(res, Err(BadNumErr))
408 fn result_try_trait_v2_branch() {
409 use core::num::NonZeroU32;
410 use core::ops::{ControlFlow::*, Try};
411 assert_eq!(Ok::<i32, i32>(4).branch(), Continue(4));
412 assert_eq!(Err::<i32, i32>(4).branch(), Break(Err(4)));
413 let one = NonZeroU32::new(1).unwrap();
414 assert_eq!(Ok::<(), NonZeroU32>(()).branch(), Continue(()));
415 assert_eq!(Err::<(), NonZeroU32>(one).branch(), Break(Err(one)));
416 assert_eq!(Ok::<NonZeroU32, ()>(one).branch(), Continue(one));
417 assert_eq!(Err::<NonZeroU32, ()>(()).branch(), Break(Err(())));