extern crate alloc;
use crate::OrdMap;
use alloc::string::String;
use core::cell::Cell;
#[test]
fn test_simple() {
let mut map: OrdMap<String, String, 4> = Default::default();
assert_eq!(map.len(), 0);
assert_eq!(map.insert("Richberger".into(), "Taylor".into()), Ok(None));
assert_eq!(
map.insert("Richberger".into(), "Harpo".into()),
Ok(Some((String::from("Richberger"), String::from("Harpo"))))
);
assert_eq!(
map.replace("Richberger".into(), "Groucho".into()),
Ok(Some((String::from("Richberger"), String::from("Taylor"))))
);
assert_eq!(map.get("Richberger"), Some(&String::from("Groucho")));
assert_eq!(&map["Richberger"], &String::from("Groucho"));
assert_eq!(map.len(), 1);
*map.get_mut("Richberger").unwrap() = String::from("Taylor");
assert_eq!(map.get("Richberger"), Some(&String::from("Taylor")));
assert_eq!(map["Richberger"], String::from("Taylor"));
}
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
struct Value<'a> {
value: u8,
drop_counter: &'a Cell<u8>,
}
impl<'a> Value<'a> {
fn new(value: u8, drop_counter: &'a Cell<u8>) -> Self {
Self {
value,
drop_counter,
}
}
}
impl<'a> Drop for Value<'a> {
fn drop(&mut self) {
self.drop_counter.set(self.drop_counter.get() + 1);
}
}
#[test]
fn test_drop() {
let drop_counter = Cell::new(0u8);
let mut map: OrdMap<_, (), 4> = Default::default();
assert_eq!(map.insert(Value::new(4, &drop_counter), ()), Ok(None));
assert_eq!(drop_counter.get(), 0);
assert!(matches!(
map.insert(Value::new(4, &drop_counter), ()),
Ok(Some(_))
));
assert_eq!(drop_counter.get(), 1);
assert_eq!(map.insert(Value::new(6, &drop_counter), ()), Ok(None));
assert_eq!(map.insert(Value::new(5, &drop_counter), ()), Ok(None));
assert_eq!(drop_counter.get(), 1);
let removed = map.remove(&Value::new(5, &drop_counter)).unwrap();
assert_eq!(drop_counter.get(), 2);
drop(removed);
assert_eq!(drop_counter.get(), 3);
map.clear();
assert_eq!(drop_counter.get(), 5);
assert_eq!(map.insert(Value::new(4, &drop_counter), ()), Ok(None));
assert_eq!(map.insert(Value::new(2, &drop_counter), ()), Ok(None));
assert_eq!(map.insert(Value::new(8, &drop_counter), ()), Ok(None));
assert_eq!(map.insert(Value::new(5, &drop_counter), ()), Ok(None));
assert_eq!(drop_counter.get(), 5);
assert!(matches!(
map.insert(Value::new(3, &drop_counter), ()),
Err(_)
));
assert_eq!(drop_counter.get(), 6);
drop(map);
assert_eq!(drop_counter.get(), 10);
let mut set: OrdMap<_, (), 6> = Default::default();
assert_eq!(set.insert(Value::new(1, &drop_counter), ()), Ok(None));
assert_eq!(set.insert(Value::new(2, &drop_counter), ()), Ok(None));
assert_eq!(set.insert(Value::new(3, &drop_counter), ()), Ok(None));
assert_eq!(set.insert(Value::new(4, &drop_counter), ()), Ok(None));
assert_eq!(set.insert(Value::new(5, &drop_counter), ()), Ok(None));
assert_eq!(set.insert(Value::new(6, &drop_counter), ()), Ok(None));
set.retain(|k, ()| k.value % 2 == 0);
assert_eq!(drop_counter.get(), 13);
drop(set);
assert_eq!(drop_counter.get(), 16);
let mut set: OrdMap<_, (), 6> = Default::default();
assert_eq!(set.insert(Value::new(1, &drop_counter), ()), Ok(None));
assert_eq!(set.insert(Value::new(2, &drop_counter), ()), Ok(None));
assert_eq!(set.insert(Value::new(3, &drop_counter), ()), Ok(None));
assert_eq!(set.insert(Value::new(4, &drop_counter), ()), Ok(None));
assert_eq!(set.insert(Value::new(5, &drop_counter), ()), Ok(None));
assert_eq!(set.insert(Value::new(6, &drop_counter), ()), Ok(None));
assert_eq!(drop_counter.get(), 16);
for (value, ()) in set {
assert_eq!(drop_counter.get(), 16);
assert_eq!(value.value, 1);
drop(value);
assert_eq!(drop_counter.get(), 17);
break;
}
assert_eq!(drop_counter.get(), 22);
}