#[cfg(test)]
#[macro_use]
extern crate doc_comment;
#[cfg(test)]
doctest!("../README.md");
mod c_slice;
mod c_vec;
pub use c_slice::*;
pub use c_vec::*;
#[cfg(test)]
mod tests {
extern crate libc;
use super::{CSlice, CVec};
use std::ptr;
fn v_malloc(n: usize) -> CVec<u8> {
unsafe {
let mem = libc::malloc(n as _) as *mut u8;
CVec::new_with_dtor(mem, n, |mem| {
libc::free((mem) as *mut _);
})
}
}
macro_rules! s_malloc {
($n:expr) => {{
unsafe {
let mem: *mut u8 = libc::malloc($n as _) as *mut _;
CSlice::new(mem, $n)
}
}};
}
#[test]
fn vec_test_basic() {
let mut cv = v_malloc(16);
*cv.get_mut(3).unwrap() = 8;
*cv.get_mut(4).unwrap() = 9;
assert_eq!(*cv.get(3).unwrap(), 8);
assert_eq!(*cv.get(4).unwrap(), 9);
assert_eq!(*cv.get(3).unwrap(), cv[3]);
assert_eq!(*cv.get(4).unwrap(), cv[4]);
assert_eq!(cv.len(), 16);
}
#[test]
fn slice_test_basic() {
let mut cs = v_malloc(16);
cs[3] = 8;
cs[4] = 9;
assert_eq!(cs[3], 8);
assert_eq!(cs[4], 9);
assert_eq!(cs.len(), 16);
let cs = cs.as_cslice();
assert_eq!(cs[3], 8);
assert_eq!(cs[4], 9);
assert_eq!(cs.len(), 16);
}
#[test]
#[should_panic]
fn vec_test_panic_at_null() {
unsafe {
CVec::new(ptr::null_mut::<u8>(), 9);
}
}
#[test]
#[should_panic]
fn slice_test_panic_at_null() {
unsafe {
CSlice::new(ptr::null_mut::<u8>(), 9);
}
}
#[test]
fn vec_test_overrun_get() {
let cv = v_malloc(16);
assert!(cv.get(17).is_none());
}
#[test]
#[should_panic]
fn slice_test_overrun_get() {
let cs = s_malloc!(16);
assert!(cs[17] == 18);
}
#[test]
fn vec_test_overrun_set() {
let mut cv = v_malloc(16);
assert!(cv.get_mut(17).is_none());
}
#[test]
fn vec_test_unwrap() {
unsafe {
let cv =
CVec::new_with_dtor(1 as *mut isize, 0, |_| panic!("Don't run this destructor!"));
let p = cv.into_inner();
assert_eq!(p, 1 as *mut isize);
}
}
#[test]
fn vec_to_slice_test() {
let mut cv = v_malloc(2);
*cv.get_mut(0).unwrap() = 10;
*cv.get_mut(1).unwrap() = 12;
let cs = cv.as_cslice();
assert_eq!(cs[0], 10);
assert_eq!(cs[1], 12);
}
#[test]
fn slice_to_vec_test() {
let mut cv = v_malloc(2);
{
let mut cs = cv.as_cslice_mut();
cs[0] = 13;
cs[1] = 26;
}
assert_eq!(*cv.get(0).unwrap(), 13);
assert_eq!(*cv.get(1).unwrap(), 26);
}
#[test]
fn convert_test() {
let mut cv = v_malloc(2);
{
let mut cs = cv.as_cslice_mut();
cs[0] = 1;
cs[1] = 99;
let v: Vec<_> = cs.into();
assert_eq!(1, v[0]);
assert_eq!(99, v[1]);
}
assert_eq!(1, cv[0]);
assert_eq!(99, cv[1]);
}
#[test]
fn iter_cvec() {
let mut cv = v_malloc(2);
{
let mut cs = cv.as_cslice_mut();
cs[0] = 13;
cs[1] = 26;
}
let mut iter = cv.iter();
assert_eq!(iter.next(), Some(&13));
assert_eq!(iter.next(), Some(&26));
assert_eq!(iter.next(), None);
assert_eq!(iter.next(), None);
}
#[test]
fn iter_cslice() {
let mut cs = v_malloc(2);
cs[0] = 13;
cs[1] = 26;
let slice = cs.as_cslice();
let mut iter = slice.iter();
assert_eq!(iter.next(), Some(&13));
assert_eq!(iter.next(), Some(&26));
assert_eq!(iter.next(), None);
assert_eq!(iter.next(), None);
}
}