mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-09 00:17:44 +00:00
99 lines
2.9 KiB
Rust
99 lines
2.9 KiB
Rust
//@ 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);
|
|
}
|
|
}
|