]>
git.proxmox.com Git - rustc.git/blob - src/libcore/tests/result.rs
3 fn op1() -> Result
<isize, &'
static str> { Ok(666) }
4 fn op2() -> Result
<isize, &'
static str> { Err("sadface") }
8 assert_eq
!(op1().and(Ok(667)).unwrap(), 667);
9 assert_eq
!(op1().and(Err
::<i32, &'
static str>("bad")).unwrap_err(),
12 assert_eq
!(op2().and(Ok(667)).unwrap_err(), "sadface");
13 assert_eq
!(op2().and(Err
::<i32,&'
static str>("bad")).unwrap_err(),
19 assert_eq
!(op1().and_then(|i
| Ok
::<isize, &'
static str>(i
+ 1)).unwrap(), 667);
20 assert_eq
!(op1().and_then(|_
| Err
::<isize, &'
static str>("bad")).unwrap_err(),
23 assert_eq
!(op2().and_then(|i
| Ok
::<isize, &'
static str>(i
+ 1)).unwrap_err(),
25 assert_eq
!(op2().and_then(|_
| Err
::<isize, &'
static str>("bad")).unwrap_err(),
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(),
50 assert
!(Ok
::<isize, isize>(1).map(|x
| x
+ 1) == Ok(2));
51 assert
!(Err
::<isize, isize>(1).map(|x
| x
+ 1) == Err(1));
55 fn test_impl_map_err() {
56 assert
!(Ok
::<isize, isize>(1).map_err(|x
| x
+ 1) == Ok(1));
57 assert
!(Err
::<isize, isize>(1).map_err(|x
| x
+ 1) == Err(2));
62 let v
: Result
<Vec
<isize>, ()> = (0..0).map(|_
| Ok
::<isize, ()>(0)).collect();
63 assert
!(v
== Ok(vec
![]));
65 let v
: Result
<Vec
<isize>, ()> = (0..3).map(|x
| Ok
::<isize, ()>(x
)).collect();
66 assert
!(v
== Ok(vec
![0, 1, 2]));
68 let v
: Result
<Vec
<isize>, isize> = (0..3).map(|x
| {
69 if x
> 1 { Err(x) }
else { Ok(x) }
73 // test that it does not take more elements than it needs
74 let mut functions
: [Box
<dyn Fn() -> Result
<(), isize>>; 3] =
75 [box || Ok(()), box || Err(1), box || panic
!()];
77 let v
: Result
<Vec
<()>, isize> = functions
.iter_mut().map(|f
| (*f
)()).collect();
82 fn test_fmt_default() {
83 let ok
: Result
<isize, &'
static str> = Ok(100);
84 let err
: Result
<isize, &'
static str> = Err("Err");
86 let s
= format
!("{:?}", ok
);
87 assert_eq
!(s
, "Ok(100)");
88 let s
= format
!("{:?}", err
);
89 assert_eq
!(s
, "Err(\"Err\")");
94 let ok
: Result
<isize, &'
static str> = Ok(100);
95 let ok_err
: Result
<isize, &'
static str> = Err("Err");
97 assert_eq
!(ok
.unwrap_or(50), 100);
98 assert_eq
!(ok_err
.unwrap_or(50), 50);
102 fn test_unwrap_or_else() {
103 fn handler(msg
: &'
static str) -> isize {
104 if msg
== "I got this." {
111 let ok
: Result
<isize, &'
static str> = Ok(100);
112 let ok_err
: Result
<isize, &'
static str> = Err("I got this.");
114 assert_eq
!(ok
.unwrap_or_else(handler
), 100);
115 assert_eq
!(ok_err
.unwrap_or_else(handler
), 50);
120 #[cfg(not(miri))] // Miri does not support panics
121 pub fn test_unwrap_or_else_panic() {
122 fn handler(msg
: &'
static str) -> isize {
123 if msg
== "I got this." {
130 let bad_err
: Result
<isize, &'
static str> = Err("Unrecoverable mess.");
131 let _
: isize = bad_err
.unwrap_or_else(handler
);
136 pub fn test_expect_ok() {
137 let ok
: Result
<isize, &'
static str> = Ok(100);
138 assert_eq
!(ok
.expect("Unexpected error"), 100);
141 #[should_panic(expected="Got expected error: \"All good\"")]
142 #[cfg(not(miri))] // Miri does not support panics
143 pub fn test_expect_err() {
144 let err
: Result
<isize, &'
static str> = Err("All good");
145 err
.expect("Got expected error");
150 pub fn test_expect_err_err() {
151 let ok
: Result
<&'
static str, isize> = Err(100);
152 assert_eq
!(ok
.expect_err("Unexpected ok"), 100);
155 #[should_panic(expected="Got expected ok: \"All good\"")]
156 #[cfg(not(miri))] // Miri does not support panics
157 pub fn test_expect_err_ok() {
158 let err
: Result
<&'
static str, isize> = Ok("All good");
159 err
.expect_err("Got expected ok");
164 let ok
: Result
<isize, &'
static str> = Ok(100);
165 let mut it
= ok
.iter();
166 assert_eq
!(it
.size_hint(), (1, Some(1)));
167 assert_eq
!(it
.next(), Some(&100));
168 assert_eq
!(it
.size_hint(), (0, Some(0)));
169 assert
!(it
.next().is_none());
170 assert_eq
!((&ok
).into_iter().next(), Some(&100));
172 let err
: Result
<isize, &'
static str> = Err("error");
173 assert_eq
!(err
.iter().next(), None
);
177 pub fn test_iter_mut() {
178 let mut ok
: Result
<isize, &'
static str> = Ok(100);
179 for loc
in ok
.iter_mut() {
182 assert_eq
!(ok
, Ok(200));
186 assert_eq
!(ok
, Ok(300));
188 let mut err
: Result
<isize, &'
static str> = Err("error");
189 for loc
in err
.iter_mut() {
192 assert_eq
!(err
, Err("error"));
196 pub fn test_unwrap_or_default() {
197 assert_eq
!(op1().unwrap_or_default(), 666);
198 assert_eq
!(op2().unwrap_or_default(), 0);
203 fn try_result_some() -> Option
<u8> {
207 assert_eq
!(try_result_some(), Some(1));
209 fn try_result_none() -> Option
<u8> {
210 let val
= Err(NoneError
)?
;
213 assert_eq
!(try_result_none(), None
);
215 fn try_result_ok() -> Result
<u8, u8> {
216 let result
: Result
<u8, u8> = Ok(1);
220 assert_eq
!(try_result_ok(), Ok(1));
222 fn try_result_err() -> Result
<u8, u8> {
223 let result
: Result
<u8, u8> = Err(1);
227 assert_eq
!(try_result_err(), Err(1));
231 fn test_result_deref() {
232 // &Result<T: Deref, E>::Ok(T).deref_ok() ->
233 // Result<&T::Deref::Target, &E>::Ok(&*T)
234 let ref_ok
= &Result
::Ok
::<&i32, u8>(&42);
235 let expected_result
= Result
::Ok
::<&i32, &u8>(&42);
236 assert_eq
!(ref_ok
.deref_ok(), expected_result
);
238 let ref_ok
= &Result
::Ok
::<String
, u32>(String
::from("a result"));
239 let expected_result
= Result
::Ok
::<&str, &u32>("a result");
240 assert_eq
!(ref_ok
.deref_ok(), expected_result
);
242 let ref_ok
= &Result
::Ok
::<Vec
<i32>, u32>(vec
![1, 2, 3, 4, 5]);
243 let expected_result
= Result
::Ok
::<&[i32], &u32>(&[1, 2, 3, 4, 5][..]);
244 assert_eq
!(ref_ok
.deref_ok(), expected_result
);
246 // &Result<T: Deref, E: Deref>::Ok(T).deref() ->
247 // Result<&T::Deref::Target, &E::Deref::Target>::Ok(&*T)
248 let ref_ok
= &Result
::Ok
::<&i32, &u8>(&42);
249 let expected_result
= Result
::Ok
::<&i32, &u8>(&42);
250 assert_eq
!(ref_ok
.deref(), expected_result
);
252 let ref_ok
= &Result
::Ok
::<String
, &u32>(String
::from("a result"));
253 let expected_result
= Result
::Ok
::<&str, &u32>("a result");
254 assert_eq
!(ref_ok
.deref(), expected_result
);
256 let ref_ok
= &Result
::Ok
::<Vec
<i32>, &u32>(vec
![1, 2, 3, 4, 5]);
257 let expected_result
= Result
::Ok
::<&[i32], &u32>(&[1, 2, 3, 4, 5][..]);
258 assert_eq
!(ref_ok
.deref(), expected_result
);
260 // &Result<T, E: Deref>::Err(T).deref_err() ->
261 // Result<&T, &E::Deref::Target>::Err(&*E)
262 let ref_err
= &Result
::Err
::<u8, &i32>(&41);
263 let expected_result
= Result
::Err
::<&u8, &i32>(&41);
264 assert_eq
!(ref_err
.deref_err(), expected_result
);
266 let ref_err
= &Result
::Err
::<u32, String
>(String
::from("an error"));
267 let expected_result
= Result
::Err
::<&u32, &str>("an error");
268 assert_eq
!(ref_err
.deref_err(), expected_result
);
270 let ref_err
= &Result
::Err
::<u32, Vec
<i32>>(vec
![5, 4, 3, 2, 1]);
271 let expected_result
= Result
::Err
::<&u32, &[i32]>(&[5, 4, 3, 2, 1][..]);
272 assert_eq
!(ref_err
.deref_err(), expected_result
);
274 // &Result<T: Deref, E: Deref>::Err(T).deref_err() ->
275 // Result<&T, &E::Deref::Target>::Err(&*E)
276 let ref_err
= &Result
::Err
::<&u8, &i32>(&41);
277 let expected_result
= Result
::Err
::<&u8, &i32>(&41);
278 assert_eq
!(ref_err
.deref(), expected_result
);
280 let ref_err
= &Result
::Err
::<&u32, String
>(String
::from("an error"));
281 let expected_result
= Result
::Err
::<&u32, &str>("an error");
282 assert_eq
!(ref_err
.deref(), expected_result
);
284 let ref_err
= &Result
::Err
::<&u32, Vec
<i32>>(vec
![5, 4, 3, 2, 1]);
285 let expected_result
= Result
::Err
::<&u32, &[i32]>(&[5, 4, 3, 2, 1][..]);
286 assert_eq
!(ref_err
.deref(), expected_result
);
288 // The following cases test calling deref_* with the wrong variant (i.e.
289 // `deref_ok()` with a `Result::Err()`, or `deref_err()` with a `Result::Ok()`.
290 // While unusual, these cases are supported to ensure that an `inner_deref`
291 // call can still be made even when one of the Result types does not implement
292 // `Deref` (for example, std::io::Error).
294 // &Result<T, E: Deref>::Ok(T).deref_err() ->
295 // Result<&T, &E::Deref::Target>::Ok(&T)
296 let ref_ok
= &Result
::Ok
::<i32, &u8>(42);
297 let expected_result
= Result
::Ok
::<&i32, &u8>(&42);
298 assert_eq
!(ref_ok
.deref_err(), expected_result
);
300 let ref_ok
= &Result
::Ok
::<&str, &u32>("a result");
301 let expected_result
= Result
::Ok
::<&&str, &u32>(&"a result");
302 assert_eq
!(ref_ok
.deref_err(), expected_result
);
304 let ref_ok
= &Result
::Ok
::<[i32; 5], &u32>([1, 2, 3, 4, 5]);
305 let expected_result
= Result
::Ok
::<&[i32; 5], &u32>(&[1, 2, 3, 4, 5]);
306 assert_eq
!(ref_ok
.deref_err(), expected_result
);
308 // &Result<T: Deref, E>::Err(E).deref_ok() ->
309 // Result<&T::Deref::Target, &E>::Err(&E)
310 let ref_err
= &Result
::Err
::<&u8, i32>(41);
311 let expected_result
= Result
::Err
::<&u8, &i32>(&41);
312 assert_eq
!(ref_err
.deref_ok(), expected_result
);
314 let ref_err
= &Result
::Err
::<&u32, &str>("an error");
315 let expected_result
= Result
::Err
::<&u32, &&str>(&"an error");
316 assert_eq
!(ref_err
.deref_ok(), expected_result
);
318 let ref_err
= &Result
::Err
::<&u32, [i32; 5]>([5, 4, 3, 2, 1]);
319 let expected_result
= Result
::Err
::<&u32, &[i32; 5]>(&[5, 4, 3, 2, 1]);
320 assert_eq
!(ref_err
.deref_ok(), expected_result
);