use crate::OrdSet;
use core::cell::Cell;
#[test]
fn test_simple() {
let mut set: OrdSet<u8, 4> = Default::default();
assert_eq!(set.len(), 0);
assert!(set.is_empty());
assert_eq!(set.insert(5), Ok(None));
assert_eq!(set.insert(5), Ok(Some(5)));
assert_eq!(set.len(), 1);
assert!(!set.is_empty());
assert_eq!(set.insert(2), Ok(None));
assert_eq!(set.insert(8), Ok(None));
assert_eq!(set.insert(9), Ok(None));
assert_eq!(set.len(), 4);
assert_eq!(set.insert(4), Err(4));
assert_eq!(set.len(), 4);
assert_eq!(set.remove(&3), None);
assert_eq!(set.len(), 4);
assert_eq!(set.remove(&5), Some(5));
assert_eq!(set.len(), 3);
assert_eq!(set.insert(4), Ok(None));
assert_eq!(set.len(), 4);
assert_eq!(set.pop_last(), Some(9));
assert_eq!(set.len(), 3);
assert_eq!(set.first(), Some(&2));
assert_eq!(set.len(), 3);
assert_eq!(set.pop_first(), Some(2));
assert_eq!(set.len(), 2);
assert_eq!(set.pop_last(), Some(8));
assert_eq!(set.len(), 1);
assert!(!set.is_empty());
assert_eq!(set.pop_last(), Some(4));
assert!(set.is_empty());
assert_eq!(set.len(), 0);
assert_eq!(set.pop_last(), None);
assert_eq!(set.pop_first(), None);
assert_eq!(set.last(), None);
assert_eq!(set.first(), None);
let mut set: OrdSet<u8, 6> = OrdSet::from([1, 2, 3, 4, 5, 5, 6, 6]);
set.retain(|&k| k % 2 == 0);
assert!(set.iter().eq([2, 4, 6].iter()));
}
#[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 set: OrdSet<_, 4> = Default::default();
assert_eq!(set.insert(Value::new(4, &drop_counter)), Ok(None));
assert_eq!(drop_counter.get(), 0);
assert!(matches!(
set.insert(Value::new(4, &drop_counter)),
Ok(Some(_))
));
assert_eq!(drop_counter.get(), 1);
assert_eq!(set.insert(Value::new(6, &drop_counter)), Ok(None));
assert_eq!(set.insert(Value::new(5, &drop_counter)), Ok(None));
assert_eq!(drop_counter.get(), 1);
let removed = set.remove(&Value::new(5, &drop_counter)).unwrap();
assert_eq!(drop_counter.get(), 2);
drop(removed);
assert_eq!(drop_counter.get(), 3);
set.clear();
assert_eq!(drop_counter.get(), 5);
assert_eq!(set.insert(Value::new(4, &drop_counter)), Ok(None));
assert_eq!(set.insert(Value::new(2, &drop_counter)), Ok(None));
assert_eq!(set.insert(Value::new(8, &drop_counter)), Ok(None));
assert_eq!(set.insert(Value::new(5, &drop_counter)), Ok(None));
assert_eq!(drop_counter.get(), 5);
assert!(matches!(set.insert(Value::new(3, &drop_counter)), Err(_)));
assert_eq!(drop_counter.get(), 6);
drop(set);
assert_eq!(drop_counter.get(), 10);
let mut set: OrdSet<_, 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: OrdSet<_, 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);
}
#[test]
fn test_comparisons() {
let mut left: OrdSet<u8, 4> = Default::default();
let mut right: OrdSet<u8, 20> = Default::default();
assert_eq!(left.insert(5), Ok(None));
assert_eq!(left.insert(8), Ok(None));
assert_eq!(left.insert(6), Ok(None));
assert_eq!(right.insert(10), Ok(None));
assert_eq!(right.insert(6), Ok(None));
assert_eq!(right.insert(3), Ok(None));
assert!(left.union(&right).copied().eq([3u8, 5, 6, 8, 10]));
assert!(left.difference(&right).copied().eq([5u8, 8]));
assert!(right.difference(&left).copied().eq([3u8, 10]));
assert!(right.intersection(&left).copied().eq([6u8]));
assert!(left
.symmetric_difference(&right)
.copied()
.eq([3u8, 5, 8, 10]));
}