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); }