dairy 0.2.2

A more compact, user friendly clone-on-write smart pointer.
Documentation
#![allow(clippy::from_iter_instead_of_collect)]

use std::borrow::Borrow;
use std::ffi::OsStr;
use std::iter::FromIterator;

use dairy::Cow;

type T<'a> = Cow<'a, [&'a str]>;

#[test]
fn cow_slice_is_borrowed() {
    let c = T::borrowed(&["Hello", "World!"]);
    assert!(c.is_borrowed());
    assert!(!c.is_owned());
}

#[test]
fn cow_slice_is_owned() {
    let c = T::owned(vec!["Hello", "World!"]);
    assert!(!c.is_borrowed());
    assert!(c.is_owned());
}

#[test]
fn cow_slice_borrowed_into_owned() {
    let c = T::borrowed(&["Hello", "World!"]);
    let v: Vec<&str> = c.into_owned();
    assert_eq!(v, &["Hello", "World!"]);
}

#[test]
fn cow_slice_owned_into_owned() {
    let c = T::owned(vec!["Hello", "World!"]);
    let v: Vec<&str> = c.into_owned();
    assert_eq!(v, &["Hello", "World!"]);
}

#[test]
fn cow_slice_borrowed_ref() {
    let c = T::borrowed(&["Hello", "World!"]);

    // Deref
    let v: &[&str] = &*c;
    assert_eq!(v, &["Hello", "World!"]);

    // Borrow
    let v: &[&str] = c.borrow();
    assert_eq!(v, &["Hello", "World!"]);
}

#[test]
fn cow_slice_owned_ref() {
    let c = T::owned(vec!["Hello", "World!"]);

    // Deref
    let v: &[&str] = &*c;
    assert_eq!(v, &["Hello", "World!"]);

    // Borrow
    let v: &[&str] = c.borrow();
    assert_eq!(v, &["Hello", "World!"]);
}

#[test]
fn cow_slice_borrowed_clone() {
    let c1 = T::borrowed(&["Hello", "World!"]);
    let c2 = c1.clone();
    assert!(c1.is_borrowed());
    assert!(c2.is_borrowed());
}

#[test]
fn cow_slice_owned_clone() {
    let c1 = T::owned(vec!["Hello", "World!"]);
    let c2 = c1.clone();
    assert!(c1.is_owned());
    assert!(c2.is_owned());
}

#[test]
fn cow_slice_borrowed_as_ref() {
    let c = T::borrowed(&["Hello", "World!"]);

    let v: &[&str] = c.as_ref();
    assert_eq!(v, &["Hello", "World!"]);
}

#[test]
fn cow_slice_owned_as_ref() {
    let c = T::owned(vec!["Hello", "World!"]);

    let v: &[&str] = c.as_ref();
    assert_eq!(v, &["Hello", "World!"]);
}

#[test]
fn cow_slice_from() {
    Vec::from(T::borrowed(&["Hello", "World!"]));
    Vec::from(T::owned(vec!["Hello", "World!"]));

    Box::<[&str]>::from(T::borrowed(&["Hello", "World!"]));
    Box::<[&str]>::from(T::owned(vec!["Hello", "World!"]));

    assert!(Cow::<[&str]>::from(&["Hello", "World!"][..]).is_borrowed());
    assert!(Cow::<[&str]>::from(vec!["Hello", "World!"]).is_owned());
    assert!(Cow::<[&str]>::from(&vec!["Hello", "World!"]).is_borrowed());
    assert!(Cow::<[&str]>::from(vec!["Hello", "World!"].into_boxed_slice()).is_owned());
}

#[test]
fn cow_slice_borrowed_partial_eq() {
    let c = T::borrowed(&["Hello", "World!"]);

    assert_eq!(c, ["Hello", "World!"]);
    assert_eq!(c, &["Hello", "World!"]);
    assert_eq!(c, &["Hello", "World!"][..]);
    assert_eq!(c, vec!["Hello", "World!"]);
    assert_eq!(c, &vec!["Hello", "World!"]);
    // assert_eq!(c, Box::new(&["Hello", "World!"][..]));

    assert_eq!(c, [OsStr::new("Hello"), OsStr::new("World!")]);
    assert_eq!(c, &[OsStr::new("Hello"), OsStr::new("World!")]);
    assert_eq!(c, vec![OsStr::new("Hello"), OsStr::new("World!")]);
    assert_eq!(c, &vec![OsStr::new("Hello"), OsStr::new("World!")]);
}

#[test]
fn cow_slice_extend() {
    let mut c = T::default();
    c.extend(vec!["Hello", "World!"]);
    assert_eq!(c, &["Hello", "World!"]);

    let mut c = T::default();
    c.extend(&["Hello", "World!"]);
    assert_eq!(c, &["Hello", "World!"]);
}

#[test]
fn cow_slice_from_iter() {
    let c = T::from_iter(vec!["Hello", "World!"]);
    assert_eq!(c, &["Hello", "World!"]);

    let c = T::from_iter(&["Hello", "World!"]);
    assert_eq!(c, &["Hello", "World!"]);
}