Skip to content

Commit c025fde

Browse files
committed
fixed some and added more tests
1 parent 1712448 commit c025fde

File tree

7 files changed

+158
-18
lines changed

7 files changed

+158
-18
lines changed

src/libcore/option.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -878,7 +878,7 @@ impl<T: Default> Option<T> {
878878
}
879879
}
880880

881-
# [unstable(feature = "inner_deref", reason = "newly added", issue = "50264")]
881+
#[unstable(feature = "inner_deref", reason = "newly added", issue = "50264")]
882882
impl<T: Deref> Option<T> {
883883
/// Converts from `&Option<T>` to `Option<&T::Target>`.
884884
///

src/libcore/tests/option.rs

+8
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,15 @@ fn test_option_deref() {
304304
let ref_option = &Some(&42);
305305
assert_eq!(ref_option.deref(), Some(&42));
306306

307+
let ref_option = &Some(String::from("a result"));
308+
assert_eq!(ref_option.deref(), Some("a result"));
309+
310+
let ref_option = &Some(vec![1, 2, 3, 4, 5]);
311+
assert_eq!(ref_option.deref(), Some(&[1, 2, 3, 4, 5][..]));
312+
307313
// None: &Option<T: Deref>>::None -> None
308314
let ref_option: &Option<&i32> = &None;
309315
assert_eq!(ref_option.deref(), None);
316+
317+
310318
}

src/libcore/tests/result.rs

+85-17
Original file line numberDiff line numberDiff line change
@@ -234,21 +234,89 @@ fn test_try() {
234234

235235
#[test]
236236
fn test_result_deref() {
237-
// Ok(T).deref_ok() -> Result<&T, &E::Deref::Target>::Ok(&T)
238-
let ref_ok: &Result<&i32, &u8> = &Ok(&42);
239-
assert_eq!(ref_ok.deref_ok(), Ok(&42));
240-
assert_eq!(ref_ok.deref_ok(), Ok(&42));
241-
assert_eq!(ref_ok.deref(), Ok(&42));
242-
243-
// Err(E) -> Result<&T, &E::Deref::Target>::Err(&*E)
244-
let ref_err: &Result<&i32, &u8> = &Err(&41);
245-
assert_eq!(ref_err.deref_err(), Err(&41));
246-
assert_eq!(ref_err.deref_err(), Err(&41));
247-
assert_eq!(ref_err.deref(), Err(&41));
248-
249-
// &Ok(T).deref_err() -> Result<&T, &E::Deref::Target>::Ok(&T)
250-
assert_eq!(ref_ok.deref_err(), Ok(&&42));
251-
252-
// &Err(E) -> Result<&T::Deref::Target, &E>::Err(&E)
253-
assert_eq!(ref_err.deref_ok(), Err(&&41));
237+
// &Result<T: Deref, E>::Ok(T).deref_ok() ->
238+
// Result<&T::Deref::Target, &E>::Ok(&*T)
239+
let ref_ok = &Result::Ok::<&i32, u8>(&42);
240+
let expected_result = Result::Ok::<&i32, &u8>(&42);
241+
assert_eq!(ref_ok.deref_ok(), expected_result);
242+
243+
let ref_ok = &Result::Ok::<String, u32>(String::from("a result"));
244+
let expected_result = Result::Ok::<&str, &u32>("a result");
245+
assert_eq!(ref_ok.deref_ok(), expected_result);
246+
247+
let ref_ok = &Result::Ok::<Vec<i32>, u32>(vec![1, 2, 3, 4, 5]);
248+
let expected_result = Result::Ok::<&[i32], &u32>(&[1, 2, 3, 4, 5][..]);
249+
assert_eq!(ref_ok.deref_ok(), expected_result);
250+
251+
// &Result<T: Deref, E: Deref>::Ok(T).deref() ->
252+
// Result<&T::Deref::Target, &E::Deref::Target>::Ok(&*T)
253+
let ref_ok = &Result::Ok::<&i32, &u8>(&42);
254+
let expected_result = Result::Ok::<&i32, &u8>(&42);
255+
assert_eq!(ref_ok.deref(), expected_result);
256+
257+
let ref_ok = &Result::Ok::<String, &u32>(String::from("a result"));
258+
let expected_result = Result::Ok::<&str, &u32>("a result");
259+
assert_eq!(ref_ok.deref(), expected_result);
260+
261+
let ref_ok = &Result::Ok::<Vec<i32>, &u32>(vec![1, 2, 3, 4, 5]);
262+
let expected_result = Result::Ok::<&[i32], &u32>(&[1, 2, 3, 4, 5][..]);
263+
assert_eq!(ref_ok.deref(), expected_result);
264+
265+
// &Result<T, E: Deref>::Err(T).deref_err() ->
266+
// Result<&T, &E::Deref::Target>::Err(&*E)
267+
let ref_err = &Result::Err::<u8, &i32>(&41);
268+
let expected_result = Result::Err::<&u8, &i32>(&41);
269+
assert_eq!(ref_err.deref_err(), expected_result);
270+
271+
let ref_err = &Result::Err::<u32, String>(String::from("an error"));
272+
let expected_result = Result::Err::<&u32, &str>("an error");
273+
assert_eq!(ref_err.deref_err(), expected_result);
274+
275+
let ref_err = &Result::Err::<u32, Vec<i32>>(vec![5, 4, 3, 2, 1]);
276+
let expected_result = Result::Err::<&u32, &[i32]>(&[5, 4, 3, 2, 1][..]);
277+
assert_eq!(ref_err.deref_err(), expected_result);
278+
279+
// &Result<T: Deref, E: Deref>::Err(T).deref_err() ->
280+
// Result<&T, &E::Deref::Target>::Err(&*E)
281+
let ref_err = &Result::Err::<&u8, &i32>(&41);
282+
let expected_result = Result::Err::<&u8, &i32>(&41);
283+
assert_eq!(ref_err.deref(), expected_result);
284+
285+
let ref_err = &Result::Err::<&u32, String>(String::from("an error"));
286+
let expected_result = Result::Err::<&u32, &str>("an error");
287+
assert_eq!(ref_err.deref(), expected_result);
288+
289+
let ref_err = &Result::Err::<&u32, Vec<i32>>(vec![5, 4, 3, 2, 1]);
290+
let expected_result = Result::Err::<&u32, &[i32]>(&[5, 4, 3, 2, 1][..]);
291+
assert_eq!(ref_err.deref(), expected_result);
292+
293+
// *Odd corner cases (tested for completeness)*
294+
295+
// &Result<T, E: Deref>::Ok(T).deref_err() ->
296+
// Result<&T, &E::Deref::Target>::Ok(&T)
297+
let ref_ok = &Result::Ok::<i32, &u8>(42);
298+
let expected_result = Result::Ok::<&i32, &u8>(&42);
299+
assert_eq!(ref_ok.deref_err(), expected_result);
300+
301+
let ref_ok = &Result::Ok::<&str, &u32>("a result");
302+
let expected_result = Result::Ok::<&&str, &u32>(&"a result");
303+
assert_eq!(ref_ok.deref_err(), expected_result);
304+
305+
let ref_ok = &Result::Ok::<[i32; 5], &u32>([1, 2, 3, 4, 5]);
306+
let expected_result = Result::Ok::<&[i32; 5], &u32>(&[1, 2, 3, 4, 5]);
307+
assert_eq!(ref_ok.deref_err(), expected_result);
308+
309+
// &Result<T: Deref, E>::Err(E).deref_ok() ->
310+
// Result<&T::Deref::Target, &E>::Err(&E)
311+
let ref_err = &Result::Err::<&u8, i32>(41);
312+
let expected_result = Result::Err::<&u8, &i32>(&41);
313+
assert_eq!(ref_err.deref_ok(), expected_result);
314+
315+
let ref_err = &Result::Err::<&u32, &str>("an error");
316+
let expected_result = Result::Err::<&u32, &&str>(&"an error");
317+
assert_eq!(ref_err.deref_ok(), expected_result);
318+
319+
let ref_err = &Result::Err::<&u32, [i32; 5]>([5, 4, 3, 2, 1]);
320+
let expected_result = Result::Err::<&u32, &[i32; 5]>(&[5, 4, 3, 2, 1]);
321+
assert_eq!(ref_err.deref_ok(), expected_result);
254322
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
#![feature(inner_deref)]
12+
13+
fn main() {
14+
let _result = &Some(42).deref();
15+
//~^ ERROR no method named `deref` found for type `std::option::Option<{integer}>`
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
#![feature(inner_deref)]
12+
13+
fn main() {
14+
let _result = &Ok(42).deref();
15+
//~^ ERROR no method named `deref` found
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
#![feature(inner_deref)]
12+
13+
fn main() {
14+
let _result = &Err(41).deref_err();
15+
//~^ ERROR no method named `deref_err` found
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
#![feature(inner_deref)]
12+
13+
fn main() {
14+
let _result = &Ok(42).deref_ok();
15+
//~^ ERROR no method named `deref_ok` found
16+
}

0 commit comments

Comments
 (0)