use crate::{
error::{ArenaFull, InsertWithKeyError},
Arena,
};
#[test]
fn controller() {
let arena = Arena::<()>::new(1);
let controller1 = arena.controller();
controller1.try_reserve().unwrap();
let controller2 = arena.controller();
assert_eq!(controller2.try_reserve(), Err(ArenaFull));
}
#[test]
fn try_reserve() {
let arena = Arena::<()>::new(3);
let controller = arena.controller();
assert!(controller.try_reserve().is_ok());
assert!(controller.try_reserve().is_ok());
assert!(controller.try_reserve().is_ok());
assert_eq!(controller.try_reserve(), Err(ArenaFull));
}
#[test]
fn capacity() {
let mut arena = Arena::new(3);
assert_eq!(arena.capacity(), 3);
arena.insert(1).unwrap();
assert_eq!(arena.capacity(), 3);
let key2 = arena.insert(2).unwrap();
assert_eq!(arena.capacity(), 3);
arena.remove(key2);
assert_eq!(arena.capacity(), 3);
}
#[test]
fn len() {
let mut arena = Arena::new(3);
arena.insert(1).unwrap();
assert_eq!(arena.len(), 1);
arena.insert(2).unwrap();
assert_eq!(arena.len(), 2);
let key3 = arena.insert(3).unwrap();
assert_eq!(arena.len(), 3);
arena.insert(4).ok();
assert_eq!(arena.len(), 3);
arena.remove(key3);
assert_eq!(arena.len(), 2);
arena.remove(key3);
assert_eq!(arena.len(), 2);
}
#[test]
fn controller_capacity() {
let mut arena = Arena::new(3);
let controller = arena.controller();
assert_eq!(controller.capacity(), 3);
controller.try_reserve().unwrap();
assert_eq!(controller.capacity(), 3);
let key = arena.insert(()).unwrap();
assert_eq!(controller.capacity(), 3);
arena.remove(key);
assert_eq!(controller.capacity(), 3);
}
#[test]
fn controller_len() {
let mut arena = Arena::new(3);
let controller = arena.controller();
assert_eq!(controller.len(), 0);
controller.try_reserve().unwrap();
assert_eq!(controller.len(), 1);
let key = arena.insert(()).unwrap();
assert_eq!(controller.len(), 2);
arena.remove(key);
assert_eq!(controller.len(), 1);
}
#[test]
fn insert_with_key() {
let mut arena = Arena::new(3);
let controller = arena.controller();
let key = controller.try_reserve().unwrap();
assert!(arena.insert_with_key(key, 1).is_ok());
assert_eq!(arena.get(key), Some(&1));
assert_eq!(
arena.insert_with_key(key, 2),
Err(InsertWithKeyError::KeyNotReserved)
);
}
#[test]
fn insert_with_invalid_key_index() {
let key = {
let mut arena = Arena::new(5);
for _ in 0..4 {
arena.insert(()).unwrap();
}
arena.insert(()).unwrap()
};
let mut arena = Arena::new(3);
assert_eq!(
arena.insert_with_key(key, ()),
Err(InsertWithKeyError::InvalidKey)
);
}
#[test]
fn insert_with_invalid_key_generation() {
let key = {
let mut arena = Arena::new(1);
let key = arena.insert(()).unwrap();
arena.remove(key);
arena.insert(()).unwrap()
};
let mut arena = Arena::new(1);
assert_eq!(
arena.insert_with_key(key, ()),
Err(InsertWithKeyError::InvalidKey)
);
}
#[test]
fn insert() {
let mut arena = Arena::new(3);
let key1 = arena.insert(1).unwrap();
let key2 = arena.insert(2).unwrap();
let key3 = arena.insert(3).unwrap();
assert_eq!(arena.get(key1), Some(&1));
assert_eq!(arena.get(key2), Some(&2));
assert_eq!(arena.get(key3), Some(&3));
assert_eq!(arena.insert(4), Err(ArenaFull));
}
#[test]
fn remove() {
let mut arena = Arena::new(3);
let key1 = arena.insert(1).unwrap();
let key2 = arena.insert(2).unwrap();
let key3 = arena.insert(3).unwrap();
assert_eq!(arena.remove(key2), Some(2));
assert_eq!(arena.remove(key2), None);
assert_eq!(arena.get(key1), Some(&1));
assert_eq!(arena.get(key3), Some(&3));
assert!(arena.insert(4).is_ok());
assert_eq!(arena.remove(key2), None);
}
#[test]
fn get() {
let mut arena = Arena::new(3);
let key1 = arena.insert(1).unwrap();
let key2 = arena.insert(2).unwrap();
let key3 = arena.insert(3).unwrap();
assert_eq!(arena.get(key1), Some(&1));
assert_eq!(arena.get(key2), Some(&2));
assert_eq!(arena.get(key3), Some(&3));
assert_eq!(arena.get_mut(key1), Some(&mut 1));
assert_eq!(arena.get_mut(key2), Some(&mut 2));
assert_eq!(arena.get_mut(key3), Some(&mut 3));
arena.remove(key2);
assert_eq!(arena.get(key2), None);
arena.insert(4).unwrap();
assert_eq!(arena.get(key2), None);
}
#[test]
fn retain() {
let mut arena = Arena::new(6);
let key1 = arena.insert(1).unwrap();
let key2 = arena.insert(2).unwrap();
let key3 = arena.insert(3).unwrap();
let key4 = arena.insert(4).unwrap();
let key5 = arena.insert(5).unwrap();
let key6 = arena.insert(6).unwrap();
arena.retain(|num| num % 2 == 0);
assert_eq!(arena.get(key1), None);
assert_eq!(arena.get(key2), Some(&2));
assert_eq!(arena.get(key3), None);
assert_eq!(arena.get(key4), Some(&4));
assert_eq!(arena.get(key5), None);
assert_eq!(arena.get(key6), Some(&6));
}
#[test]
fn iter() {
let mut arena = Arena::new(3);
let key1 = arena.insert(1).unwrap();
let key2 = arena.insert(2).unwrap();
let key3 = arena.insert(3).unwrap();
let mut iter = arena.iter();
assert_eq!(iter.next(), Some((key3, &3)));
assert_eq!(iter.next(), Some((key2, &2)));
assert_eq!(iter.next(), Some((key1, &1)));
assert_eq!(iter.next(), None);
arena.remove(key2);
let mut iter = arena.iter();
assert_eq!(iter.next(), Some((key3, &3)));
assert_eq!(iter.next(), Some((key1, &1)));
assert_eq!(iter.next(), None);
let key4 = arena.insert(4).unwrap();
let mut iter = arena.iter();
assert_eq!(iter.next(), Some((key4, &4)));
assert_eq!(iter.next(), Some((key3, &3)));
assert_eq!(iter.next(), Some((key1, &1)));
assert_eq!(iter.next(), None);
}
#[test]
fn iter_mut() {
let mut arena = Arena::new(3);
let key1 = arena.insert(1).unwrap();
let key2 = arena.insert(2).unwrap();
let key3 = arena.insert(3).unwrap();
let mut iter = arena.iter_mut();
assert_eq!(iter.next(), Some((key3, &mut 3)));
assert_eq!(iter.next(), Some((key2, &mut 2)));
assert_eq!(iter.next(), Some((key1, &mut 1)));
assert_eq!(iter.next(), None);
arena.remove(key2);
let mut iter = arena.iter_mut();
assert_eq!(iter.next(), Some((key3, &mut 3)));
assert_eq!(iter.next(), Some((key1, &mut 1)));
assert_eq!(iter.next(), None);
let key4 = arena.insert(4).unwrap();
let mut iter = arena.iter_mut();
assert_eq!(iter.next(), Some((key4, &mut 4)));
assert_eq!(iter.next(), Some((key3, &mut 3)));
assert_eq!(iter.next(), Some((key1, &mut 1)));
assert_eq!(iter.next(), None);
}
#[test]
fn iter_mut_use_after_next() {
let mut arena = Arena::new(2);
let _ = arena.insert(1).unwrap();
let _ = arena.insert(2).unwrap();
let mut iter = arena.iter_mut();
let first = iter.next().unwrap();
let _second = iter.next().unwrap();
*first.1 = 3;
}
#[test]
fn drain_filter() {
let mut arena = Arena::new(6);
let key1 = arena.insert(1).unwrap();
let key2 = arena.insert(2).unwrap();
let key3 = arena.insert(3).unwrap();
let key4 = arena.insert(4).unwrap();
let key5 = arena.insert(5).unwrap();
let key6 = arena.insert(6).unwrap();
let mut iter = arena.drain_filter(|num| num % 2 == 0);
assert_eq!(iter.next(), Some((key6, 6)));
assert_eq!(iter.next(), Some((key4, 4)));
assert_eq!(iter.next(), Some((key2, 2)));
assert_eq!(iter.next(), None);
assert_eq!(arena.len(), 3);
assert_eq!(arena.get(key1), Some(&1));
assert_eq!(arena.get(key2), None);
assert_eq!(arena.get(key3), Some(&3));
assert_eq!(arena.get(key4), None);
assert_eq!(arena.get(key5), Some(&5));
assert_eq!(arena.get(key6), None);
}