use super::arena::*;
const TEST_ENTITIES: &[&str] = &["a", "b", "c", "d"];
mod arena {
use super::*;
fn alloc_arena(entities: &[&'static str]) -> Arena<usize, &'static str> {
let mut arena = <Arena<usize, &'static str>>::new();
assert_eq!(arena.len(), 0);
assert!(arena.is_empty());
for idx in 0..entities.len() {
assert!(arena.get(idx).is_err());
}
for (n, str) in entities.iter().enumerate() {
assert_eq!(arena.alloc(str).ok(), Some(n));
}
assert_eq!(arena.len(), entities.len());
assert!(!arena.is_empty());
for (n, str) in entities.iter().enumerate() {
assert_eq!(arena.get(n).ok(), Some(str));
assert_eq!(&arena[n], str);
}
assert!(arena.get(arena.len()).is_err());
arena
}
#[test]
fn alloc_works() {
alloc_arena(TEST_ENTITIES);
}
#[test]
fn clear_works() {
let mut arena = alloc_arena(TEST_ENTITIES);
arena.clear();
assert_eq!(arena.len(), 0);
assert!(arena.is_empty());
for idx in 0..arena.len() {
assert!(arena.get(idx).is_err());
}
assert!(arena.get(arena.len()).is_err());
}
#[test]
fn iter_works() {
let arena = alloc_arena(TEST_ENTITIES);
assert!(arena.iter().eq(TEST_ENTITIES.iter().enumerate()));
}
#[test]
fn from_iter_works() {
let expected = alloc_arena(TEST_ENTITIES);
let actual = TEST_ENTITIES.iter().copied().collect::<Arena<_, _>>();
assert_eq!(actual, expected);
}
#[test]
fn duplicates_work() {
let mut arena = alloc_arena(TEST_ENTITIES);
let previous_len = arena.len();
for (idx, str) in TEST_ENTITIES.iter().enumerate() {
let offset = previous_len + idx;
assert_eq!(arena.alloc(str).ok(), Some(offset));
assert_eq!(arena.get(offset).ok(), Some(str));
}
assert_eq!(arena.len(), previous_len + TEST_ENTITIES.len());
}
}
mod dedup_arena {
use super::*;
fn alloc_dedup_arena(entities: &[&'static str]) -> DedupArena<usize, &'static str> {
let mut arena = <DedupArena<usize, &'static str>>::new();
assert_eq!(arena.len(), 0);
assert!(arena.is_empty());
for idx in 0..entities.len() {
assert!(arena.get(idx).is_err());
}
for (n, str) in entities.iter().enumerate() {
assert_eq!(arena.alloc(str).ok(), Some(n));
}
assert_eq!(arena.len(), entities.len());
assert!(!arena.is_empty());
for (n, str) in entities.iter().enumerate() {
assert_eq!(arena.get(n).ok(), Some(str));
assert_eq!(&arena[n], str);
}
assert!(arena.get(arena.len()).is_err());
arena
}
#[test]
fn alloc_works() {
alloc_dedup_arena(TEST_ENTITIES);
}
#[test]
fn clear_works() {
let mut arena = alloc_dedup_arena(TEST_ENTITIES);
arena.clear();
assert_eq!(arena.len(), 0);
assert!(arena.is_empty());
for idx in 0..arena.len() {
assert!(arena.get(idx).is_err());
}
assert!(arena.get(arena.len()).is_err());
}
#[test]
fn iter_works() {
let arena = alloc_dedup_arena(TEST_ENTITIES);
assert!(arena.iter().eq(TEST_ENTITIES.iter().enumerate()));
}
#[test]
fn from_iter_works() {
let expected = alloc_dedup_arena(TEST_ENTITIES);
let actual = TEST_ENTITIES.iter().copied().collect::<DedupArena<_, _>>();
assert_eq!(actual, expected);
}
#[test]
fn duplicates_work() {
let mut arena = alloc_dedup_arena(TEST_ENTITIES);
for (key, str) in TEST_ENTITIES.iter().enumerate() {
assert_eq!(arena.alloc(str).ok(), Some(key));
assert_eq!(arena.get(key).ok(), Some(str));
}
assert_eq!(arena.len(), TEST_ENTITIES.len());
}
}