//! Always use `cargo miri test`, and never just `cargo test`. use super::prelude::{*, vec}; use std::{fmt::Debug, sync::atomic::{AtomicBool, Ordering}, any::Any}; trait DebugExt: Debug { fn debug(&self) -> String { format!("{:?}", self) } } impl DebugExt for T {} #[test] fn basic_push() { let mut vec: Vec = Vec::new(); vec.push(3); vec.push(5); vec.push(7); assert_eq!(vec, [3, 5, 7]); } #[test] fn box_push() { let mut vec: Vec = Vec::new(); vec.push_box(Box::new(1)); vec.push_box(Box::new(String::from("foo"))); vec.push_box(Box::new(true)); assert_eq!(vec.debug(), "[1, \"foo\", true]"); } #[test] fn unsize_push() { let mut vec: Vec = Vec::new(); vec.push_unsize(1); vec.push_unsize(String::from("foo")); vec.push_unsize(true); assert_eq!(vec.debug(), "[1, \"foo\", true]"); } #[test] fn all_macro() { let vec: Vec = vec![3, 5, 7]; assert_eq!(vec, [3, 5, 7]); let vec2: Vec = vec![box: Box::new(1) as _, Box::new(String::from("foo")) as _, Box::new(true) as _, ]; let vec3: Vec = vec![unsized: 1, String::from("foo"), true]; assert_eq!(vec2.debug(), vec3.debug()); let vec4: Vec = vec![3; 5]; assert_eq!(vec4, [3; 5]); } #[test] fn dropped() { static DROPPED: AtomicBool = AtomicBool::new(false); #[derive(Debug)] // for dyn Debug struct FunkyDrop; impl Drop for FunkyDrop { fn drop(&mut self) { DROPPED.store(true, Ordering::SeqCst); } } let vec: Vec = vec![unsized: 1, FunkyDrop, true]; assert_eq!(DROPPED.load(Ordering::SeqCst), false); drop(vec); assert_eq!(DROPPED.load(Ordering::SeqCst), true); } #[test] fn get() { let vec: Vec = vec![3, 5, 7]; assert_eq!(vec.get(0).copied(), Some(3)); assert_eq!(vec.get(1).copied(), Some(5)); assert_eq!(vec.get(2).copied(), Some(7)); assert_eq!(vec.get(3).copied(), None); } #[test] #[should_panic = "index out of bounds: the len is 3 but the index is 3"] fn index() { let vec: Vec = vec![3, 5, 7]; assert_eq!(vec[0], 3); assert_eq!(vec[1], 5); assert_eq!(vec[2], 7); vec[3]; } #[test] fn slice_flatten() { let mut vec: Vec<[i32]> = vec![unsized: [1, 2, 3], [4, 5], [6, 7, 8, 9]]; assert_eq!(vec.as_slice_flatten(), [1, 2, 3, 4, 5, 6, 7, 8, 9]); vec.as_mut_slice_flatten()[4] = 10; assert_eq!(vec[1], [4, 10]); } #[test] fn iteration() { let mut vec: Vec = vec![unsized: 1, String::from("foo"), true]; let mut iter = vec.iter(); assert_eq!(iter.next().unwrap().debug(), "1"); assert_eq!(iter.next().unwrap().debug(), "\"foo\""); assert_eq!(iter.next().unwrap().debug(), "true"); assert_eq!(iter.next().map(|_|()), None); let mut iter = vec.iter_mut(); // TODO: create a trait to properly test this assert_eq!(iter.next().unwrap().debug(), "1"); assert_eq!(iter.next().unwrap().debug(), "\"foo\""); assert_eq!(iter.next().unwrap().debug(), "true"); assert_eq!(iter.next().map(|_|()), None); let mut debugs = Vec::new(); // using custom vec instead of std vec >:) for item in vec { debugs.push(item.debug()); } assert_eq!(debugs, ["1", "\"foo\"", "true"]); } #[test] fn zst() { let vec: Vec<()> = vec![(), (), ()]; assert_eq!(vec[1], ()); for el in vec.iter() { drop(el); } assert_eq!(vec.debug(), "[(), (), ()]"); let vec: Vec = vec![unsized: (), (), ()]; assert_eq!(vec[1].debug(), "()"); for el in vec.iter() { drop(el); } assert_eq!(vec.debug(), "[(), (), ()]"); } #[test] fn downcast() { let mut vec: Vec = vec![unsized: 1, String::from("foo"), true]; assert_eq!(vec.downcast_get::(0), None); assert_eq!(vec.downcast_get::(0), Some(&1)); assert_eq!(vec.downcast_get_mut::(1), None); assert_eq!(vec.downcast_get_mut::(1), Some(&mut String::from("foo"))); assert_eq!(vec.downcast_pop::(), None); assert_eq!(vec.downcast_pop::(), Some(true)); } #[test] fn pop() { let mut vec: Vec = vec![unsized: 1, String::from("foo"), true]; assert_eq!(vec.pop().debug(), "Some(true)"); assert_eq!(vec.pop().debug(), "Some(\"foo\")"); assert_eq!(vec.pop().debug(), "Some(1)"); assert_eq!(vec.pop().debug(), "None"); } #[test] fn with_capacity() { // 4 and not 3 cause of `Layout::pad_to_align` let mut vec = Vec::with_capacity(4); let prev_ptr = vec.as_ptr(); vec.push(1); vec.push(2); vec.push(3); vec.push(4); assert_eq!(prev_ptr, vec.as_ptr()); vec.push(5); // should have realloc'ed by now assert_ne!(prev_ptr, vec.as_ptr()); } #[test] fn unsize() { let vec = vec![1, 2, 3]; let mut vec: Vec = vec.unsize(); vec.push_unsize(String::from("foo")); assert_eq!(vec.debug(), "[1, 2, 3, \"foo\"]"); } #[test] fn remove() { let mut vec: Vec = vec![unsized: 1, String::from("foo"), true]; assert_eq!(vec.remove(1).unwrap().debug(), "\"foo\""); assert_eq!(vec.debug(), "[1, true]"); }