trait-obj-list 0.1.2

List of unsized trait objects, stored in a flat array
Documentation
#[path = "../src/test_utils.rs"]
mod utils;

use std::any::Any;

use trait_obj_list::DynList;

use crate::utils::assert_any_eq;

utils::for_each_list_type! {
	#[test]
	fn no_empty_cursor<T>() {
		let mut l = DynList::<dyn Any, T>::new();
		assert!(l.cursor().is_none());
	}

	#[test]
	fn cursor<T>() {
		let mut l = DynList::<dyn Any, T>::new();
		l.extend(0..10i32);
		assert_eq!(l.len(), 10);

		let mut cursor = l.cursor().unwrap();
		for i in 0..10 {
			assert_any_eq(cursor.current(), i);
			assert_eq!(cursor.move_next(), i != 9);
		}
		assert!(!cursor.move_next());

		let mut cursor = l.cursor().unwrap();
		for i in 0..5 {
			assert_any_eq(cursor.current(), i);
			assert!(cursor.move_next());
		}
		cursor.drop_after();
		assert_eq!(l.len(), 5);

		for (i, v) in l.iter().enumerate() {
			assert_any_eq(v, i as i32);
		}

		l.shrink_to_fit();
		assert_eq!(l.len(), 5);
		for (i, v) in l.iter().enumerate() {
			assert_any_eq(v, i as i32);
		}
	}
}

#[test]
fn no_empty_cursor_end_double_linked() {
	let mut l = DynList::<dyn Any, trait_obj_list::types::DoubleLinked>::new();
	assert!(l.cursor_end().is_none());
}

#[test]
fn cursor_rev_double_linked() {
	let mut l = DynList::<dyn Any, trait_obj_list::types::DoubleLinked>::new();
	l.extend(0..10i32);
	assert_eq!(l.len(), 10);

	let mut cursor = l.cursor().unwrap();
	assert!(!cursor.move_prev());

	let mut cursor = l.cursor_end().unwrap();
	for i in (0..10).rev() {
		assert_any_eq(cursor.current(), i);
		assert_eq!(cursor.move_prev(), i != 0);
	}
	assert!(!cursor.move_prev());

	let mut cursor = l.cursor_end().unwrap();
	for i in (6..10).rev() {
		assert_any_eq(cursor.current(), i);
		assert!(cursor.move_prev());
	}
	cursor.drop_after();

	assert_eq!(l.len(), 5);

	for (i, v) in l.iter().enumerate() {
		assert_any_eq(v, i as i32);
	}

	l.shrink_to_fit();
	assert_eq!(l.len(), 5);
	for (i, v) in l.iter().enumerate() {
		assert_any_eq(v, i as i32);
	}
}