use crate::{DeferredMap, SecondaryMap};
#[test]
fn test_secondary_map_basic() {
let mut map = DeferredMap::new();
let h1 = map.allocate_handle();
let k1 = h1.key();
map.insert(h1, 1);
let h2 = map.allocate_handle();
let k2 = h2.key();
map.insert(h2, 2);
let mut sec = SecondaryMap::new();
assert!(sec.is_empty());
sec.insert(k1, "one");
sec.insert(k2, "two");
assert_eq!(sec.len(), 2);
assert!(sec.contains_key(k1));
assert!(sec.contains_key(k2));
assert_eq!(sec.get(k1), Some(&"one"));
assert_eq!(sec.get(k2), Some(&"two"));
if let Some(v) = sec.get_mut(k1) {
*v = "one_modified";
}
assert_eq!(sec.get(k1), Some(&"one_modified"));
assert_eq!(sec.remove(k1), Some("one_modified"));
assert!(!sec.contains_key(k1));
assert_eq!(sec.len(), 1);
assert_eq!(sec.remove(k1), None);
}
#[test]
fn test_generation_cycle() {
let mut map = DeferredMap::new();
let mut sec = SecondaryMap::new();
let h1 = map.allocate_handle();
let k1 = h1.key();
map.insert(h1, 100);
sec.insert(k1, 10);
assert_eq!(sec.get(k1), Some(&10));
map.remove(k1);
let h2 = map.allocate_handle();
let k2 = h2.key();
map.insert(h2, 200);
assert_ne!(k1, k2);
assert_eq!(sec.get(k1), Some(&10));
assert_eq!(sec.get(k2), None);
let old = sec.insert(k2, 20);
assert_eq!(old, None);
assert_eq!(sec.get(k2), Some(&20));
assert_eq!(sec.get(k1), None);
let res = sec.insert(k1, 999);
assert_eq!(res, None);
assert_eq!(sec.get(k2), Some(&20)); }
#[test]
fn test_retain_and_clear() {
let mut map = DeferredMap::new();
let mut sec = SecondaryMap::new();
let h1 = map.allocate_handle();
let k1 = h1.key();
map.insert(h1, 1);
let h2 = map.allocate_handle();
let k2 = h2.key();
map.insert(h2, 2);
let h3 = map.allocate_handle();
let k3 = h3.key();
map.insert(h3, 3);
sec.insert(k1, 10);
sec.insert(k2, 20);
sec.insert(k3, 30);
assert_eq!(sec.len(), 3);
sec.retain(|k, v| {
assert!(k == k1 || k == k2 || k == k3);
*v > 15
});
assert_eq!(sec.len(), 2);
assert!(!sec.contains_key(k1));
assert_eq!(sec.get(k2), Some(&20));
assert_eq!(sec.get(k3), Some(&30));
sec.clear();
assert!(sec.is_empty());
assert!(!sec.contains_key(k2));
}
#[test]
fn test_iterators() {
let mut map = DeferredMap::new();
let mut sec = SecondaryMap::new();
let h1 = map.allocate_handle();
let k1 = h1.key();
map.insert(h1, 0);
let h2 = map.allocate_handle();
let k2 = h2.key();
map.insert(h2, 0);
sec.insert(k1, 100);
sec.insert(k2, 200);
let pairs: std::collections::HashMap<crate::DefaultKey, i32> =
sec.iter().map(|(k, v)| (k, *v)).collect();
assert_eq!(pairs.len(), 2);
assert_eq!(pairs.get(&k1), Some(&100));
assert_eq!(pairs.get(&k2), Some(&200));
for (_, v) in sec.iter_mut() {
*v += 1;
}
assert_eq!(sec.get(k1), Some(&101));
assert_eq!(sec.get(k2), Some(&201));
}