blob: 5360e3d6af89d9bc0e26c7bddccced09a70b86ef [file] [log] [blame]
//! Unit tests for boxed bit-slices.
#![cfg(test)]
#[cfg(not(feature = "std"))]
use alloc::vec;
use alloc::{
borrow::Cow,
boxed::Box,
};
use core::{
any,
borrow::{
Borrow,
BorrowMut,
},
convert::TryFrom,
fmt::{
Debug,
Display,
Pointer,
},
hash::Hash,
iter::{
FromIterator,
FusedIterator,
},
ops::{
Deref,
DerefMut,
},
};
use static_assertions::*;
use crate::prelude::*;
#[test]
fn inherents() {
let bits = bits![0, 1, 0, 0, 1];
let mut boxed = BitBox::from_bitslice(&bits[1 ..]);
assert_eq!(boxed, bits[1 ..]);
assert_eq!(boxed.bitspan.head().into_inner(), 1);
boxed.force_align();
assert_eq!(boxed.bitspan.head().into_inner(), 0);
let data = vec![0u8, 1, 2, 3].into_boxed_slice();
let ptr = data.as_ptr();
let boxed: BitBox<u8> = BitBox::from_boxed_slice(data);
assert_eq!(boxed.len(), 32);
assert_eq!(boxed.count_ones(), 4);
let data = boxed.into_boxed_slice();
assert_eq!(data.as_ptr(), ptr);
let bv = BitBox::<u8>::from_boxed_slice(data).into_bitvec();
assert_eq!(bv.len(), 32);
assert_eq!(bitbox![0, 1, 0, 0, 1].as_bitslice(), bits![0, 1, 0, 0, 1]);
assert_eq!(bitbox![0; 5].as_mut_bitslice(), bits![0; 5]);
let mut bb = bitbox![0; 5];
bb.fill_uninitialized(true);
assert_eq!(bb.as_raw_slice(), &[!0usize << 5][..]);
let ptr = BitBox::into_raw(bb);
let bb = unsafe { BitBox::from_raw(ptr) };
assert_eq!(ptr as *const BitSlice, bb.as_bitslice() as *const BitSlice);
}
#[test]
fn iter() {
let bb = bitbox![0, 1, 1, 0, 0, 1];
let mut iter = bb.into_iter();
assert_eq!(iter.len(), 6);
assert!(!iter.next().unwrap());
assert_eq!(iter.as_bitslice(), bits![1, 1, 0, 0, 1]);
assert!(iter.next_back().unwrap());
assert_eq!(iter.as_mut_bitslice(), bits![1, 1, 0, 0]);
assert!(iter.nth(1).unwrap());
assert!(!iter.nth_back(1).unwrap());
assert!(iter.next().is_none());
}
#[test]
fn traits() {
assert_impl_all!(
BitBox: AsMut<BitSlice>,
AsRef<BitSlice>,
Borrow<BitSlice>,
BorrowMut<BitSlice>,
Clone,
Debug,
Default,
Deref,
DerefMut,
Display,
Drop,
Eq,
From<&'static BitSlice>,
From<BitArray>,
From<Box<usize>>,
From<Cow<'static, BitSlice>>,
From<BitVec>,
FromIterator<bool>,
Hash,
Ord,
PartialEq<BitSlice>,
PartialOrd<BitSlice>,
Pointer,
TryFrom<Box<[usize]>>,
Unpin,
);
assert_impl_all!(
super::IntoIter: AsRef<BitSlice>,
Clone,
Debug,
DoubleEndedIterator,
ExactSizeIterator,
FusedIterator,
Send,
Sync,
);
}
#[test]
fn conversions() {
let bits = bits![0, 1, 0, 0, 1];
assert_eq!(BitBox::from(bits), bits);
let arr: BitArray = BitArray::new(rand::random());
assert_eq!(BitBox::from(arr), arr);
let boxed = Box::new(5usize);
assert_eq!(
BitBox::<_, Lsb0>::from(boxed.clone()),
boxed.view_bits::<Lsb0>()
);
let cow = Cow::Borrowed([0usize, 1].view_bits::<Lsb0>());
assert_eq!(BitBox::from(cow.clone()), &*cow);
assert_eq!(BitBox::from(bitvec![0, 1]), bits![0, 1]);
let boxed: Box<[usize]> = BitBox::from(cow.clone()).into();
assert_eq!(boxed[..], [0usize, 1][..]);
assert!(BitBox::<_, Lsb0>::try_from(boxed).is_ok());
assert!(BitBox::<usize, Lsb0>::default().is_empty());
}
#[test]
fn ops() {
let a = bitbox![0, 0, 1, 1];
let b = bitbox![0, 1, 0, 1];
let c = a.clone() & b.clone();
assert_eq!(c, bitbox![0, 0, 0, 1]);
let d = a.clone() | b.clone();
assert_eq!(d, bitbox![0, 1, 1, 1]);
let e = a.clone() ^ b;
assert_eq!(e, bitbox![0, 1, 1, 0]);
let mut f = !e;
assert_eq!(f, bitbox![1, 0, 0, 1]);
let _: &BitSlice = &a;
let _: &mut BitSlice = &mut f;
}
#[test]
fn format() {
#[cfg(not(feature = "std"))]
use alloc::format;
let render = format!("{:?}", bitbox![0, 1, 0, 0, 1]);
assert!(
render.starts_with(&format!(
"BitBox<usize, {}>",
any::type_name::<Lsb0>(),
))
);
assert!(render.ends_with("[0, 1, 0, 0, 1]"));
}