use super::*;
mod shared_bytes {
use super::SharedBytes;
#[test]
fn slice() {
let bytes = SharedBytes::from(&b"test"[..]);
assert_eq!(&*bytes, b"test");
let b2 = bytes.clone();
assert_eq!(&*b2, b"test");
assert_eq!(&*bytes, b"test");
drop(bytes);
assert_eq!(&*b2, b"test");
}
#[test]
fn vec() {
let bytes = SharedBytes::from(Vec::from(&b"test"[..]));
assert_eq!(&*bytes, b"test");
let b2 = bytes.clone();
assert_eq!(&*b2, b"test");
assert_eq!(&*bytes, b"test");
drop(bytes);
assert_eq!(&*b2, b"test");
}
}
#[cfg(feature = "utils")]
mod cell {
use crate::OnceInitCell;
#[test]
fn well_init() {
let cell = OnceInitCell::<(), ()>::with_value(());
assert!(cell.get().is_some());
let cell = OnceInitCell::new("test".to_owned());
let res = cell.get_or_try_init(|_| Err(()));
assert!(res.is_err());
assert!(cell.get().is_none());
let res =
std::panic::catch_unwind(|| cell.get_or_try_init(|_| -> Result<_, ()> { panic!() }));
assert!(res.is_err());
assert!(cell.get().is_none());
let res = cell.get_or_init(|s| s.to_owned() + " ok");
assert_eq!(res, "test ok");
assert_eq!(cell.get(), Some(&"test ok".to_owned()));
cell.get_or_init(|_| panic!("multiple init"));
}
#[test]
fn drop_bomb() {
#[allow(dead_code)]
struct Bomb(Box<i32>);
impl Drop for Bomb {
fn drop(&mut self) {
panic!("bomb");
}
}
let cell = OnceInitCell::new(Bomb(Box::new(0)));
let res = std::panic::catch_unwind(|| cell.get_or_init(|_| ()));
assert!(res.is_err());
assert!(cell.get().is_some());
}
}