@@ -233,3 +233,96 @@ fn test_try() {
233
233
}
234
234
assert_eq ! ( try_result_err( ) , Err ( 1 ) ) ;
235
235
}
236
+
237
+ #[ test]
238
+ fn test_result_deref ( ) {
239
+ // &Result<T: Deref, E>::Ok(T).deref_ok() ->
240
+ // Result<&T::Deref::Target, &E>::Ok(&*T)
241
+ let ref_ok = & Result :: Ok :: < & i32 , u8 > ( & 42 ) ;
242
+ let expected_result = Result :: Ok :: < & i32 , & u8 > ( & 42 ) ;
243
+ assert_eq ! ( ref_ok. deref_ok( ) , expected_result) ;
244
+
245
+ let ref_ok = & Result :: Ok :: < String , u32 > ( String :: from ( "a result" ) ) ;
246
+ let expected_result = Result :: Ok :: < & str , & u32 > ( "a result" ) ;
247
+ assert_eq ! ( ref_ok. deref_ok( ) , expected_result) ;
248
+
249
+ let ref_ok = & Result :: Ok :: < Vec < i32 > , u32 > ( vec ! [ 1 , 2 , 3 , 4 , 5 ] ) ;
250
+ let expected_result = Result :: Ok :: < & [ i32 ] , & u32 > ( & [ 1 , 2 , 3 , 4 , 5 ] [ ..] ) ;
251
+ assert_eq ! ( ref_ok. deref_ok( ) , expected_result) ;
252
+
253
+ // &Result<T: Deref, E: Deref>::Ok(T).deref() ->
254
+ // Result<&T::Deref::Target, &E::Deref::Target>::Ok(&*T)
255
+ let ref_ok = & Result :: Ok :: < & i32 , & u8 > ( & 42 ) ;
256
+ let expected_result = Result :: Ok :: < & i32 , & u8 > ( & 42 ) ;
257
+ assert_eq ! ( ref_ok. deref( ) , expected_result) ;
258
+
259
+ let ref_ok = & Result :: Ok :: < String , & u32 > ( String :: from ( "a result" ) ) ;
260
+ let expected_result = Result :: Ok :: < & str , & u32 > ( "a result" ) ;
261
+ assert_eq ! ( ref_ok. deref( ) , expected_result) ;
262
+
263
+ let ref_ok = & Result :: Ok :: < Vec < i32 > , & u32 > ( vec ! [ 1 , 2 , 3 , 4 , 5 ] ) ;
264
+ let expected_result = Result :: Ok :: < & [ i32 ] , & u32 > ( & [ 1 , 2 , 3 , 4 , 5 ] [ ..] ) ;
265
+ assert_eq ! ( ref_ok. deref( ) , expected_result) ;
266
+
267
+ // &Result<T, E: Deref>::Err(T).deref_err() ->
268
+ // Result<&T, &E::Deref::Target>::Err(&*E)
269
+ let ref_err = & Result :: Err :: < u8 , & i32 > ( & 41 ) ;
270
+ let expected_result = Result :: Err :: < & u8 , & i32 > ( & 41 ) ;
271
+ assert_eq ! ( ref_err. deref_err( ) , expected_result) ;
272
+
273
+ let ref_err = & Result :: Err :: < u32 , String > ( String :: from ( "an error" ) ) ;
274
+ let expected_result = Result :: Err :: < & u32 , & str > ( "an error" ) ;
275
+ assert_eq ! ( ref_err. deref_err( ) , expected_result) ;
276
+
277
+ let ref_err = & Result :: Err :: < u32 , Vec < i32 > > ( vec ! [ 5 , 4 , 3 , 2 , 1 ] ) ;
278
+ let expected_result = Result :: Err :: < & u32 , & [ i32 ] > ( & [ 5 , 4 , 3 , 2 , 1 ] [ ..] ) ;
279
+ assert_eq ! ( ref_err. deref_err( ) , expected_result) ;
280
+
281
+ // &Result<T: Deref, E: Deref>::Err(T).deref_err() ->
282
+ // Result<&T, &E::Deref::Target>::Err(&*E)
283
+ let ref_err = & Result :: Err :: < & u8 , & i32 > ( & 41 ) ;
284
+ let expected_result = Result :: Err :: < & u8 , & i32 > ( & 41 ) ;
285
+ assert_eq ! ( ref_err. deref( ) , expected_result) ;
286
+
287
+ let ref_err = & Result :: Err :: < & u32 , String > ( String :: from ( "an error" ) ) ;
288
+ let expected_result = Result :: Err :: < & u32 , & str > ( "an error" ) ;
289
+ assert_eq ! ( ref_err. deref( ) , expected_result) ;
290
+
291
+ let ref_err = & Result :: Err :: < & u32 , Vec < i32 > > ( vec ! [ 5 , 4 , 3 , 2 , 1 ] ) ;
292
+ let expected_result = Result :: Err :: < & u32 , & [ i32 ] > ( & [ 5 , 4 , 3 , 2 , 1 ] [ ..] ) ;
293
+ assert_eq ! ( ref_err. deref( ) , expected_result) ;
294
+
295
+ // The following cases test calling deref_* with the wrong variant (i.e.
296
+ // `deref_ok()` with a `Result::Err()`, or `deref_err()` with a `Result::Ok()`.
297
+ // While unusual, these cases are supported to ensure that an `inner_deref`
298
+ // call can still be made even when one of the Result types does not implement
299
+ // `Deref` (for example, std::io::Error).
300
+
301
+ // &Result<T, E: Deref>::Ok(T).deref_err() ->
302
+ // Result<&T, &E::Deref::Target>::Ok(&T)
303
+ let ref_ok = & Result :: Ok :: < i32 , & u8 > ( 42 ) ;
304
+ let expected_result = Result :: Ok :: < & i32 , & u8 > ( & 42 ) ;
305
+ assert_eq ! ( ref_ok. deref_err( ) , expected_result) ;
306
+
307
+ let ref_ok = & Result :: Ok :: < & str , & u32 > ( "a result" ) ;
308
+ let expected_result = Result :: Ok :: < & & str , & u32 > ( & "a result" ) ;
309
+ assert_eq ! ( ref_ok. deref_err( ) , expected_result) ;
310
+
311
+ let ref_ok = & Result :: Ok :: < [ i32 ; 5 ] , & u32 > ( [ 1 , 2 , 3 , 4 , 5 ] ) ;
312
+ let expected_result = Result :: Ok :: < & [ i32 ; 5 ] , & u32 > ( & [ 1 , 2 , 3 , 4 , 5 ] ) ;
313
+ assert_eq ! ( ref_ok. deref_err( ) , expected_result) ;
314
+
315
+ // &Result<T: Deref, E>::Err(E).deref_ok() ->
316
+ // Result<&T::Deref::Target, &E>::Err(&E)
317
+ let ref_err = & Result :: Err :: < & u8 , i32 > ( 41 ) ;
318
+ let expected_result = Result :: Err :: < & u8 , & i32 > ( & 41 ) ;
319
+ assert_eq ! ( ref_err. deref_ok( ) , expected_result) ;
320
+
321
+ let ref_err = & Result :: Err :: < & u32 , & str > ( "an error" ) ;
322
+ let expected_result = Result :: Err :: < & u32 , & & str > ( & "an error" ) ;
323
+ assert_eq ! ( ref_err. deref_ok( ) , expected_result) ;
324
+
325
+ let ref_err = & Result :: Err :: < & u32 , [ i32 ; 5 ] > ( [ 5 , 4 , 3 , 2 , 1 ] ) ;
326
+ let expected_result = Result :: Err :: < & u32 , & [ i32 ; 5 ] > ( & [ 5 , 4 , 3 , 2 , 1 ] ) ;
327
+ assert_eq ! ( ref_err. deref_ok( ) , expected_result) ;
328
+ }
0 commit comments