macro_rules! test_parametrized {
($func_name:ident, $type_ident:ident, $type:ty) => {
#[test]
fn $type_ident() {
return $func_name::<$type>();
}
}
}
#[cfg(test)]
mod tests {
use assert_panic::assert_panic;
use tesap_std::Vector;
#[test]
fn test_new_init_trivial_type() {
let mut v = Vector::<u32>::new_init(3, &10);
assert_eq!(v.as_slice(), &[10, 10, 10]);
assert_eq!(v.len(), 3);
}
#[test]
fn test_new_init_clone_type() {
let mut s = String::from("asdf");
let mut v = Vector::<String>::new_init(3, &s);
}
#[test]
fn test_new_empty() {
let mut v: Vector<i32> = Vector::new(0);
assert_eq!(v.len(), 0);
assert_eq!(v.capacity(), 1);
}
#[test]
fn test_pop_till_empty() {
let mut v = Vector::new_init(3, &1);
assert_eq!(v.len(), 3);
assert_eq!(v.pop(), Some(1));
assert_eq!(v.len(), 2);
assert_eq!(v.pop(), Some(1));
assert_eq!(v.len(), 1);
assert_eq!(v.pop(), Some(1));
assert_eq!(v.len(), 0);
assert_eq!(v.pop(), None);
}
#[test]
fn test_push_empty() {
let mut v = Vector::new_init(0, &0);
assert_eq!(v.push(1), true);
assert_eq!(v.len(), 1);
assert_eq!(v.capacity(), 1);
}
#[test]
fn test_push_multiple() {
let mut v = Vector::new_init(5, &10);
assert_eq!(v.push(100), true);
assert_eq!(v.len, 6);
assert_eq!(v[v.len - 1], 100);
assert_eq!(v.push(101), true);
assert_eq!(v.len, 7);
assert_eq!(v[v.len - 1], 101);
assert_eq!(v.push(102), true);
assert_eq!(v.len, 8);
assert_eq!(v[v.len - 1], 102);
}
#[test]
fn test_as_slice_str() {
let mut s = String::from("asdf");
let mut c = Vector::<String>::new_init(3, &s);
assert_eq!(c.as_slice(), &["asdf", "asdf", "asdf"]);
}
#[test]
fn test_index_get() {
let mut s = String::from("asdf");
let mut c = Vector::<String>::new_init(3, &s);
assert_eq!(c[0], "asdf");
assert_eq!(c[1], "asdf");
assert_eq!(c[2], "asdf");
}
#[test]
fn test_index_get_mut_ref_set() {
let mut s = String::from("asdf");
let mut c = Vector::<String>::new_init(3, &s);
let s2: &mut String = &mut c[0];
assert_eq!(s2, "asdf");
*s2 = String::from("123");
assert_eq!(c.as_slice(), &["123", "asdf", "asdf"]);
}
#[test]
fn test_index_set() {
let mut s = String::from("asdf");
let mut c = Vector::<String>::new_init(3, &s);
let s2 = String::from("new");
c[0] = s2;
assert_eq!(c.as_slice(), &["new", "asdf", "asdf"]);
let mut v = Vector::<u32>::new_init(3, &5);
v[1] = 99;
assert_eq!(v[1], 99);
}
#[test]
fn test_index_out_of_bounds() {
let mut v = Vector::<u32>::new_init(3, &10);
assert_eq!(v[0], 10);
assert_eq!(v[1], 10);
assert_eq!(v[2], 10);
assert_panic!({ v[3]; });
}
#[test]
fn test_as_slice() {
let mut v = Vector::<u8>::new_init(3, &1);
assert_eq!(v.as_slice(), &[1, 1, 1]);
v[1] = 10;
assert_eq!(v.as_slice(), &[1, 10, 1]);
}
#[test]
fn test_as_slice_operations() {
let mut v = Vector::new_init(5, &1);
assert_eq!(v.as_slice(), &[1, 1, 1, 1, 1]);
v.push(10);
assert_eq!(v.as_slice(), &[1, 1, 1, 1, 1, 10]);
v.push(10);
assert_eq!(v.as_slice(), &[1, 1, 1, 1, 1, 10, 10]);
assert_eq!(v.pop(), Some(10));
assert_eq!(v.as_slice(), &[1, 1, 1, 1, 1, 10]);
v[1] = 100;
assert_eq!(v.as_slice(), &[1, 100, 1, 1, 1, 10]);
}
#[test]
fn test_vector_to_std_vec_from_raw_parts() {
let mut v: Vec<u8> = Vec::new();
v.push(20);
v.push(20);
v.push(23);
v.push(23);
v.push(28);
v.push(20);
v[0] = 10;
v.push(22);
v.shrink_to_fit();
v.push(21);
let mut c: Vector<u8> = Vector {
ptr: v.as_mut_ptr(),
len: v.len(),
cap: v.len(),
};
assert_eq!(v.as_slice(), c.as_slice());
std::mem::forget(c);
let mut v: Vec<String> = Vec::new();
v.push(String::from("abc"));
v.push(String::from("def"));
v.push(String::from("ghi"));
let mut v_view: Vector<String> = Vector {
ptr: v.as_mut_ptr(),
len: v.len(),
cap: v.len(),
};
std::mem::forget(v);
}
#[test]
fn test_debug() {
let c = Vector::<u8>::new_init(3, &1);
println!("Debug: {:?}", c);
assert_eq!(c.as_slice(), &[1, 1, 1]);
let c: Vector<String> = Vector::new_init(5, &"123".to_string());
assert_eq!(c.as_slice(), &["123", "123", "123", "123", "123"]);
println!("Debug: {:?}", c);
assert_eq!(c.as_slice(), &["123", "123", "123", "123", "123"]);
}
#[test]
fn test_str() {
let c: Vector<&str> = Vector::from_slice_clone(&["x", "y", "z"]);
assert_eq!(c.as_slice(), &["x", "y", "z"]);
std::mem::forget(c);
let c: Vector<&str> = Vector::from_slice_copy(&["x", "y", "z"]);
assert_eq!(c.as_slice(), &["x", "y", "z"]);
std::mem::forget(c);
}
#[test]
fn test_std_string() {
let mut c: Vector<String> = Vector::from_slice_clone(&["x".to_string(), "y".to_string(), "z".to_string()]);
assert_eq!(c.as_slice(), &["x", "y", "z"]);
std::mem::forget(c);
}
#[test]
fn test_from_std_vec() {
let v: Vec<u8> = vec![1, 2, 3, 4, 5];
let v2: Vector<u8> = Vector::from(v);
assert_eq!(v2.as_slice(), &[1, 2, 3, 4, 5]);
let v: Vec<&str> = vec!["x", "y", "z"];
let v2: Vector<&str> = Vector::from(v);
assert_eq!(v2.as_slice(), &["x", "y", "z"]);
}
#[test]
fn test_into_std_vec() {
let v: Vec<u8> = {
let v2: Vector<u8> = Vector::from_slice_copy(&[1, 2, 3, 4, 5]);
v2.into()
};
assert_eq!(v.as_slice(), &[1, 2, 3, 4, 5]);
let v: Vector<&str> = Vector::from_slice_clone(&["x", "y", "z"]);
let v2: Vec<&str> = v.into();
assert_eq!(v2.as_slice(), &["x", "y", "z"]);
}
#[test]
fn test_deref() {
let v: Vector<i32> = Vector::new_init(5, &1);
assert_panic!({ (&*v)[100]; });
}
#[test]
fn test_deref_iter() {
let v: Vector<usize> = Vector::from_slice_copy(&[1, 2, 3, 4, 5]);
let v2: Vec<usize> = v.iter()
.map(|el| { el * el })
.collect();
assert_eq!(v2.as_slice(), &[1, 4, 9, 16, 25]);
}
#[test]
fn test_deref_join() {
let mut v: Vector<String> = Vector::new(0);
v.push("12".to_string());
v.push("34".to_string());
v.push("56".to_string());
assert_eq!(v.join("|"), "12|34|56");
}
}