use crate::DeferredMap;
#[test]
fn test_get_with_invalid_key() {
let mut map = DeferredMap::new();
let h = map.allocate_handle();
let _ = h.key();
map.insert(h, 42);
let h2 = map.allocate_handle();
let k2 = h2.key();
assert_eq!(map.get(k2), None);
}
#[test]
fn test_get_mut_with_invalid_key() {
let mut map = DeferredMap::new();
let h = map.allocate_handle();
let _ = h.key();
map.insert(h, 42);
let h2 = map.allocate_handle();
let k2 = h2.key();
assert_eq!(map.get_mut(k2), None);
}
#[test]
fn test_contains_key_with_invalid_key() {
let mut map = DeferredMap::new();
let h = map.allocate_handle();
let k = h.key();
map.insert(h, 42);
assert!(map.contains_key(k));
let h2 = map.allocate_handle();
let k2 = h2.key();
assert!(!map.contains_key(k2));
}
#[test]
fn test_operations_after_clear() {
let mut map = DeferredMap::new();
let mut keys = Vec::new();
for i in 0..10 {
let h = map.allocate_handle();
let k = h.key();
map.insert(h, i);
keys.push(k);
}
map.clear();
for key in keys {
assert_eq!(map.get(key), None);
assert_eq!(map.remove(key), None);
assert!(!map.contains_key(key));
}
assert!(map.is_empty());
assert_eq!(map.len(), 0);
}
#[test]
fn test_iter_on_empty_map() {
let map: DeferredMap<i32> = DeferredMap::new();
let count = map.iter().count();
assert_eq!(count, 0);
}
#[test]
fn test_iter_mut_on_empty_map() {
let mut map: DeferredMap<i32> = DeferredMap::new();
let count = map.iter_mut().count();
assert_eq!(count, 0);
}
#[test]
fn test_iter_skips_removed_elements() {
let mut map = DeferredMap::new();
let mut keys = Vec::new();
for i in 0..10 {
let h = map.allocate_handle();
let k = h.key();
map.insert(h, i);
keys.push(k);
}
map.remove(keys[2]);
map.remove(keys[5]);
map.remove(keys[8]);
let count = map.iter().count();
assert_eq!(count, 7); }
#[test]
fn test_iter_mut_skips_removed_elements() {
let mut map = DeferredMap::new();
let mut keys = Vec::new();
for i in 0..10 {
let h = map.allocate_handle();
let k = h.key();
map.insert(h, i);
keys.push(k);
}
map.remove(keys[0]);
map.remove(keys[9]);
let count = map.iter_mut().count();
assert_eq!(count, 8);
}
#[test]
fn test_clone_empty_map() {
let map: DeferredMap<i32> = DeferredMap::new();
let cloned = map.clone();
assert_eq!(cloned.len(), 0);
assert_eq!(cloned.capacity(), 0);
assert!(cloned.is_empty());
}
#[test]
fn test_clone_with_values() {
let mut map = DeferredMap::new();
let h1 = map.allocate_handle();
let _k1 = h1.key();
map.insert(h1, 42);
let h2 = map.allocate_handle();
let _k2 = h2.key();
map.insert(h2, 100);
let cloned = map.clone();
assert_eq!(cloned.len(), 2);
let values: Vec<_> = cloned.iter().map(|(_, v)| *v).collect();
assert!(values.contains(&42));
assert!(values.contains(&100));
}
#[test]
fn test_clone_independence() {
let mut map = DeferredMap::new();
let h = map.allocate_handle();
let k = h.key();
map.insert(h, 42);
let mut cloned = map.clone();
let (k_cloned, _) = cloned
.iter()
.find(|(_, v)| **v == 42)
.expect("Value 42 not found in cloned map");
if let Some(value) = cloned.get_mut(k_cloned) {
*value = 100;
}
assert_eq!(map.get(k), Some(&42));
assert_eq!(cloned.get(k_cloned), Some(&100));
}
#[test]
fn test_clone_from() {
let mut map1 = DeferredMap::new();
let h1 = map1.allocate_handle();
let _k1 = h1.key();
map1.insert(h1, 1);
let mut map2 = DeferredMap::new();
let h2 = map2.allocate_handle();
map2.insert(h2, 2);
map2.clone_from(&map1);
assert_eq!(map2.len(), 1);
let (k2, v2) = map2.iter().next().expect("Map2 should not be empty");
assert_eq!(v2, &1);
assert_eq!(map2.get(k2), Some(&1));
}
#[test]
fn test_default_creates_empty_map() {
let map: DeferredMap<i32> = DeferredMap::default();
assert!(map.is_empty());
assert_eq!(map.len(), 0);
}
#[test]
fn test_with_capacity_zero() {
let map: DeferredMap<i32> = DeferredMap::with_capacity(0);
assert_eq!(map.capacity(), 0);
assert!(map.is_empty());
}
#[test]
fn test_with_capacity_large() {
let map: DeferredMap<i32> = DeferredMap::with_capacity(1000);
assert!(map.capacity() >= 1000);
}
#[test]
fn test_operations_on_map_with_gaps() {
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 h3 = map.allocate_handle();
let k3 = h3.key();
map.insert(h3, 3);
map.remove(k2);
let h4 = map.allocate_handle();
let k4 = h4.key();
map.insert(h4, 4);
assert_eq!(map.get(k1), Some(&1));
assert_eq!(map.get(k2), None); assert_eq!(map.get(k3), Some(&3));
assert_eq!(map.get(k4), Some(&4));
assert_eq!(map.len(), 3);
}
#[test]
fn test_get_after_modification() {
let mut map = DeferredMap::new();
let h = map.allocate_handle();
let k = h.key();
map.insert(h, 42);
if let Some(value) = map.get_mut(k) {
*value = 100;
}
assert_eq!(map.get(k), Some(&100));
}
#[test]
fn test_remove_during_iteration() {
let mut map = DeferredMap::new();
let mut keys = Vec::new();
for i in 0..10 {
let h = map.allocate_handle();
let k = h.key();
map.insert(h, i);
keys.push(k);
}
let iter_keys: Vec<_> = map.iter().map(|(k, _)| k).collect();
for &k in &iter_keys[0..5] {
map.remove(k);
}
assert_eq!(map.iter().count(), 5);
}
#[test]
fn test_very_large_key_values() {
let mut map: DeferredMap<i32> = DeferredMap::new();
let h = map.allocate_handle();
let k = h.key();
assert_eq!(map.get(k), None);
}
#[test]
fn test_consecutive_handle_allocations() {
let mut map = DeferredMap::<i32>::new();
let handles: Vec<_> = (0..100).map(|_| map.allocate_handle()).collect();
let mut indices = std::collections::HashSet::new();
for handle in &handles {
let index = handle.index();
assert!(indices.insert(index), "Duplicate index found");
}
}
#[test]
fn test_interleaved_operations() {
let mut map = DeferredMap::new();
let h1 = map.allocate_handle();
let k1 = h1.key();
map.insert(h1, 1);
let h2 = map.allocate_handle();
assert_eq!(map.get(k1), Some(&1));
let k2 = h2.key();
map.insert(h2, 2);
map.remove(k1);
let h3 = map.allocate_handle();
let k3 = h3.key();
map.insert(h3, 3);
assert_eq!(map.get(k2), Some(&2));
assert_eq!(map.get(k3), Some(&3));
assert_eq!(map.len(), 2);
}
#[test]
fn test_map_with_option_type() {
let mut map = DeferredMap::new();
let h1 = map.allocate_handle();
let k1 = h1.key();
map.insert(h1, Some(42));
let h2 = map.allocate_handle();
let k2 = h2.key();
map.insert(h2, None::<i32>);
assert_eq!(map.get(k1), Some(&Some(42)));
assert_eq!(map.get(k2), Some(&None));
}
#[test]
fn test_map_with_result_type() {
let mut map = DeferredMap::new();
let h1 = map.allocate_handle();
let k1 = h1.key();
map.insert(h1, Ok::<i32, String>(42));
let h2 = map.allocate_handle();
let k2 = h2.key();
map.insert(h2, Err::<i32, String>("error".to_string()));
assert_eq!(map.get(k1), Some(&Ok(42)));
assert_eq!(map.get(k2), Some(&Err("error".to_string())));
}