| //@ run-pass | |
| //! Test deref patterns using string and bytestring literals. | |
| #![feature(deref_patterns)] | |
| fn main() { | |
| for (test_in, test_expect) in [("zero", 0), ("one", 1), ("two", 2)] { | |
| // Test string literal patterns having type `str`. | |
| let test_actual = match *test_in { | |
| "zero" => 0, | |
| "one" => 1, | |
| _ => 2, | |
| }; | |
| assert_eq!(test_actual, test_expect); | |
| // Test matching on `&mut str`. | |
| let test_actual = match &mut *test_in.to_string() { | |
| "zero" => 0, | |
| "one" => 1, | |
| _ => 2, | |
| }; | |
| assert_eq!(test_actual, test_expect); | |
| // Test string literals in deref patterns. | |
| let test_actual = match test_in.to_string() { | |
| deref!("zero") => 0, | |
| "one" => 1, | |
| _ => 2, | |
| }; | |
| assert_eq!(test_actual, test_expect); | |
| // Test peeling references in addition to smart pointers. | |
| let test_actual = match &test_in.to_string() { | |
| deref!("zero") => 0, | |
| "one" => 1, | |
| _ => 2, | |
| }; | |
| assert_eq!(test_actual, test_expect); | |
| } | |
| // Test that we can still mutate in the match arm after using a literal to test equality: | |
| let mut test = "test".to_string(); | |
| if let deref!(s @ "test") = &mut test { | |
| s.make_ascii_uppercase(); | |
| } | |
| assert_eq!(test, "TEST"); | |
| for (test_in, test_expect) in [(b"0", 0), (b"1", 1), (b"2", 2)] { | |
| // Test byte string literal patterns having type `[u8; N]` | |
| let test_actual = match *test_in { | |
| b"0" => 0, | |
| b"1" => 1, | |
| _ => 2, | |
| }; | |
| assert_eq!(test_actual, test_expect); | |
| // Test byte string literal patterns having type `[u8]` | |
| let test_actual = match *(test_in as &[u8]) { | |
| b"0" => 0, | |
| b"1" => 1, | |
| _ => 2, | |
| }; | |
| assert_eq!(test_actual, test_expect); | |
| // Test matching on `&mut [u8; N]`. | |
| let test_actual = match &mut test_in.clone() { | |
| b"0" => 0, | |
| b"1" => 1, | |
| _ => 2, | |
| }; | |
| assert_eq!(test_actual, test_expect); | |
| // Test matching on `&mut [u8]`. | |
| let test_actual = match &mut test_in.clone()[..] { | |
| b"0" => 0, | |
| b"1" => 1, | |
| _ => 2, | |
| }; | |
| assert_eq!(test_actual, test_expect); | |
| // Test byte string literals used as arrays in deref patterns. | |
| let test_actual = match Box::new(*test_in) { | |
| deref!(b"0") => 0, | |
| b"1" => 1, | |
| _ => 2, | |
| }; | |
| assert_eq!(test_actual, test_expect); | |
| // Test byte string literals used as slices in deref patterns. | |
| let test_actual = match test_in.to_vec() { | |
| deref!(b"0") => 0, | |
| b"1" => 1, | |
| _ => 2, | |
| }; | |
| assert_eq!(test_actual, test_expect); | |
| } | |
| } |