summaryrefslogtreecommitdiffstats
path: root/library/alloc/tests/borrow.rs
blob: 57976aa6cdfdfee288d90fc2afe91ae16109f30e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
use std::borrow::{Cow, ToOwned};
use std::ffi::{CStr, OsStr};
use std::path::Path;
use std::rc::Rc;
use std::sync::Arc;

macro_rules! test_from_cow {
    ($value:ident => $($ty:ty),+) => {$(
        let borrowed = <$ty>::from(Cow::Borrowed($value));
        let owned = <$ty>::from(Cow::Owned($value.to_owned()));
        assert_eq!($value, &*borrowed);
        assert_eq!($value, &*owned);
    )+};
    ($value:ident : & $ty:ty) => {
        test_from_cow!($value => Box<$ty>, Rc<$ty>, Arc<$ty>);
    }
}

#[test]
fn test_from_cow_slice() {
    let slice: &[i32] = &[1, 2, 3];
    test_from_cow!(slice: &[i32]);
}

#[test]
fn test_from_cow_str() {
    let string = "hello";
    test_from_cow!(string: &str);
}

#[test]
fn test_from_cow_c_str() {
    let string = CStr::from_bytes_with_nul(b"hello\0").unwrap();
    test_from_cow!(string: &CStr);
}

#[test]
fn test_from_cow_os_str() {
    let string = OsStr::new("hello");
    test_from_cow!(string: &OsStr);
}

#[test]
fn test_from_cow_path() {
    let path = Path::new("hello");
    test_from_cow!(path: &Path);
}

#[test]
fn cow_const() {
    // test that the methods of `Cow` are usable in a const context

    const COW: Cow<'_, str> = Cow::Borrowed("moo");

    const IS_BORROWED: bool = COW.is_borrowed();
    assert!(IS_BORROWED);

    const IS_OWNED: bool = COW.is_owned();
    assert!(!IS_OWNED);
}