use trees::binary::BinaryMaxHeap;
#[test]
fn max_heap_debug_works() {
let mut tree = BinaryMaxHeap::<usize>::default();
tree.push(1);
tree.push(2);
tree.push(3);
tree.push(7);
tree.push(17);
tree.push(19);
tree.push(25);
tree.push(36);
tree.push(100);
assert_eq!(
format!("{:?}", tree),
"BinaryMaxHeap { data: [100, 36, 19, 25, 3, 2, 17, 1, 7] }"
);
}
#[test]
fn max_heap_push_works() {
let mut tree = BinaryMaxHeap::<usize>::default();
tree.push(1);
tree.push(2);
tree.push(3);
tree.push(7);
tree.push(17);
tree.push(19);
tree.push(25);
tree.push(36);
tree.push(100);
assert_eq!(tree.len(), 9);
assert_eq!(tree.as_ref(), &[100, 36, 19, 25, 3, 2, 17, 1, 7]);
}
#[test]
fn max_heap_from_iter_works() {
let tree = BinaryMaxHeap::from_iter([1, 2, 3, 7, 17, 19, 25, 36, 100]);
assert_eq!(tree.as_ref(), &[100, 36, 25, 7, 17, 19, 3, 2, 1]);
assert_max_heap_property_fulfilled(tree);
let tree = BinaryMaxHeap::from_iter(random_values(100));
assert_eq!(tree.len(), 100);
assert_max_heap_property_fulfilled(tree);
}
#[test]
fn max_heap_pop_works() {
let mut tree = BinaryMaxHeap::<usize>::default();
tree.push(1);
tree.push(2);
tree.push(3);
tree.push(7);
tree.push(17);
tree.push(19);
tree.push(25);
tree.push(36);
tree.push(100);
debug_assert_eq!(tree.pop(), Some(100));
debug_assert_eq!(tree.pop(), Some(36));
debug_assert_eq!(tree.pop(), Some(25));
debug_assert_eq!(tree.pop(), Some(19));
debug_assert_eq!(tree.pop(), Some(17));
debug_assert_eq!(tree.pop(), Some(7));
debug_assert_eq!(tree.pop(), Some(3));
debug_assert_eq!(tree.pop(), Some(2));
debug_assert_eq!(tree.pop(), Some(1));
debug_assert_eq!(tree.pop(), None);
}
#[test]
fn max_heap_push_pop_when_greater_than_root() {
let mut tree = BinaryMaxHeap::<usize>::default();
tree.push(1);
tree.push(2);
tree.push(3);
tree.push(7);
tree.push(17);
tree.push(19);
tree.push(25);
tree.push(36);
tree.push(100);
debug_assert_eq!(tree.push_pop(101), 101);
assert_max_heap_property_fulfilled(tree);
}
#[test]
fn max_heap_push_pop_when_smaller_than_root() {
let mut tree = BinaryMaxHeap::<usize>::default();
tree.push(1);
tree.push(2);
tree.push(3);
tree.push(7);
tree.push(17);
tree.push(19);
tree.push(25);
tree.push(36);
tree.push(100);
debug_assert_eq!(tree.push_pop(99), 100);
assert_max_heap_property_fulfilled(tree);
}
#[test]
fn max_heap_push_pop_when_smallest() {
let mut tree = BinaryMaxHeap::<usize>::default();
tree.push(1);
tree.push(2);
tree.push(3);
tree.push(7);
tree.push(17);
tree.push(19);
tree.push(25);
tree.push(36);
tree.push(100);
debug_assert_eq!(tree.push_pop(0), 100);
assert_max_heap_property_fulfilled(tree);
}
#[test]
fn max_heap_upholds_max_property() {
let mut tree = BinaryMaxHeap::with_capacity(100);
for value in random_values(100) {
tree.push(value)
}
assert_max_heap_property_fulfilled(tree);
}
#[test]
fn max_heap_delete_works() {
let mut tree = BinaryMaxHeap::<usize>::default();
tree.push(1);
tree.push(2);
tree.push(3);
tree.push(7);
tree.push(17);
tree.push(19);
tree.push(25);
tree.push(36);
tree.push(100);
assert_eq!(tree.as_ref(), &[100, 36, 19, 25, 3, 2, 17, 1, 7]);
assert!(tree.remove(&3));
assert!(!tree.contains(&3));
assert_eq!(tree.as_ref(), &[100, 36, 19, 25, 7, 2, 17, 1]);
assert_max_heap_property_fulfilled(tree.clone());
assert!(tree.remove(&19));
assert!(!tree.contains(&19));
assert_eq!(tree.as_ref(), &[100, 36, 17, 25, 7, 2, 1]);
assert_max_heap_property_fulfilled(tree.clone());
assert!(tree.remove(&1));
assert!(!tree.contains(&1));
assert_eq!(tree.as_ref(), &[100, 36, 17, 25, 7, 2]);
assert_max_heap_property_fulfilled(tree.clone());
while let Some(value) = tree.peek().cloned() {
tree.remove(&value);
assert_max_heap_property_fulfilled(tree.clone());
}
}
#[test]
fn max_heap_replace_where_works() {
let mut tree = BinaryMaxHeap::<usize>::default();
tree.push(1);
tree.push(2);
tree.push(3);
tree.push(7);
tree.push(17);
tree.push(19);
tree.push(25);
tree.push(36);
tree.push(100);
assert_eq!(tree.len(), 9);
assert_eq!(tree.as_ref(), &[100, 36, 19, 25, 3, 2, 17, 1, 7]);
assert!(tree.replace_where(|&x| x == 17, 120).is_some());
assert!(!tree.contains(&17));
assert!(tree.contains(&120));
assert_eq!(tree.len(), 9);
assert_eq!(tree.as_ref(), &[120, 36, 100, 25, 3, 2, 19, 1, 7]);
assert_max_heap_property_fulfilled(tree.clone());
assert!(tree.replace_where(|&x| x == 120, 120).is_some());
assert!(tree.contains(&120));
assert_eq!(tree.len(), 9);
assert_eq!(tree.as_ref(), &[120, 36, 100, 25, 3, 2, 19, 1, 7]);
assert_max_heap_property_fulfilled(tree.clone());
assert!(tree.replace(&2437, 1).is_none());
}
#[test]
fn max_heap_replace_where_with_works() {
let mut tree = BinaryMaxHeap::<usize>::default();
tree.push(1);
tree.push(2);
tree.push(3);
tree.push(7);
tree.push(17);
tree.push(19);
tree.push(25);
tree.push(36);
tree.push(100);
assert_eq!(tree.len(), 9);
assert_eq!(tree.as_ref(), &[100, 36, 19, 25, 3, 2, 17, 1, 7]);
assert!(tree.replace_where_with(|&x| x == 17, |value| *value = 120));
assert!(!tree.contains(&17));
assert!(tree.contains(&120));
assert_eq!(tree.len(), 9);
assert_eq!(tree.as_ref(), &[120, 36, 100, 25, 3, 2, 19, 1, 7]);
assert_max_heap_property_fulfilled(tree.clone());
assert!(tree.replace_where_with(|&x| x == 120, |value| *value = 120));
assert!(tree.contains(&120));
assert_eq!(tree.len(), 9);
assert_eq!(tree.as_ref(), &[120, 36, 100, 25, 3, 2, 19, 1, 7]);
assert_max_heap_property_fulfilled(tree.clone());
}
fn assert_max_heap_property_fulfilled<T>(mut tree: BinaryMaxHeap<T>)
where
T: PartialOrd,
{
let last = if let Some(value) = tree.pop() {
value
} else {
return;
};
while let Some(value) = tree.pop() {
assert!(last >= value);
}
}
fn random_values(count: usize) -> Vec<i64> {
let mut vec = Vec::with_capacity(count);
for _ in 0..count {
vec.push(rand::random());
}
vec
}