| //@ run-pass |
| //! Test deref patterns using string and bytestring literals. |
| |
| #![feature(deref_patterns)] |
| #![allow(incomplete_features)] |
| |
| 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); |
| } |
| } |