use trees::binary::BinaryMinHeap;
#[test]
fn min_heap_debug_works() {
let mut tree = BinaryMinHeap::<usize>::default();
tree.push(100);
tree.push(36);
tree.push(25);
tree.push(19);
tree.push(17);
tree.push(7);
tree.push(3);
tree.push(2);
tree.push(1);
assert_eq!(
format!("{:?}", tree),
"BinaryMinHeap { data: [1, 2, 7, 3, 25, 36, 17, 100, 19] }"
);
}
#[test]
fn min_heap_push_works() {
let mut tree = BinaryMinHeap::default();
tree.push(100);
tree.push(36);
tree.push(25);
tree.push(19);
tree.push(17);
tree.push(7);
tree.push(3);
tree.push(2);
tree.push(1);
assert_eq!(tree.len(), 9);
assert_eq!(tree.as_ref(), &[1, 2, 7, 3, 25, 36, 17, 100, 19]);
}
#[test]
fn min_heap_from_iter_works() {
let tree = BinaryMinHeap::from_iter([1, 2, 3, 7, 17, 19, 25, 36, 100]);
assert_eq!(tree.as_ref(), &[1, 2, 3, 7, 17, 19, 25, 36, 100]);
assert_min_heap_property_fulfilled(tree);
let tree = BinaryMinHeap::from_iter(random_values(100));
assert_eq!(tree.len(), 100);
assert_min_heap_property_fulfilled(tree);
}
#[test]
fn min_heap_pop_works() {
let mut tree = BinaryMinHeap::<usize>::default();
tree.push(100);
tree.push(36);
tree.push(25);
tree.push(19);
tree.push(17);
tree.push(7);
tree.push(3);
tree.push(2);
tree.push(1);
debug_assert_eq!(tree.pop(), Some(1));
debug_assert_eq!(tree.pop(), Some(2));
debug_assert_eq!(tree.pop(), Some(3));
debug_assert_eq!(tree.pop(), Some(7));
debug_assert_eq!(tree.pop(), Some(17));
debug_assert_eq!(tree.pop(), Some(19));
debug_assert_eq!(tree.pop(), Some(25));
debug_assert_eq!(tree.pop(), Some(36));
debug_assert_eq!(tree.pop(), Some(100));
debug_assert_eq!(tree.pop(), None);
}
#[test]
fn min_heap_push_pop_when_greater_than_root() {
let mut tree = BinaryMinHeap::<usize>::default();
tree.push(100);
tree.push(36);
tree.push(25);
tree.push(19);
tree.push(17);
tree.push(7);
tree.push(3);
tree.push(2);
tree.push(1);
debug_assert_eq!(tree.push_pop(4), 1);
assert_min_heap_property_fulfilled(tree);
}
#[test]
fn min_heap_push_pop_when_smaller_than_root() {
let mut tree = BinaryMinHeap::<usize>::default();
tree.push(100);
tree.push(36);
tree.push(25);
tree.push(19);
tree.push(17);
tree.push(7);
tree.push(3);
tree.push(2);
tree.push(1);
debug_assert_eq!(tree.push_pop(0), 0);
assert_min_heap_property_fulfilled(tree);
}
#[test]
fn min_heap_push_pop_when_largest() {
let mut tree = BinaryMinHeap::<usize>::default();
tree.push(100);
tree.push(36);
tree.push(25);
tree.push(19);
tree.push(17);
tree.push(7);
tree.push(3);
tree.push(2);
tree.push(1);
debug_assert_eq!(tree.push_pop(101), 1);
assert_min_heap_property_fulfilled(tree);
}
#[test]
fn min_heap_delete_works() {
let mut tree = BinaryMinHeap::<usize>::default();
tree.push(100);
tree.push(36);
tree.push(25);
tree.push(19);
tree.push(17);
tree.push(7);
tree.push(3);
tree.push(2);
tree.push(1);
assert_eq!(tree.as_ref(), &[1, 2, 7, 3, 25, 36, 17, 100, 19]);
assert!(tree.remove(&25));
assert!(!tree.contains(&25));
assert_eq!(tree.as_ref(), &[1, 2, 7, 3, 19, 36, 17, 100]);
assert_min_heap_property_fulfilled(tree.clone());
assert!(tree.remove(&100));
assert!(!tree.contains(&100));
assert_eq!(tree.as_ref(), &[1, 2, 7, 3, 19, 36, 17]);
assert_min_heap_property_fulfilled(tree.clone());
assert!(tree.remove(&7));
assert!(!tree.contains(&7));
assert_eq!(tree.as_ref(), &[1, 2, 17, 3, 19, 36]);
assert_min_heap_property_fulfilled(tree.clone());
while let Some(value) = tree.peek().cloned() {
tree.remove(&value);
assert_min_heap_property_fulfilled(tree.clone());
}
}
#[test]
fn min_heap_replace_works() {
let mut tree = BinaryMinHeap::<usize>::default();
tree.push(100);
tree.push(36);
tree.push(25);
tree.push(19);
tree.push(17);
tree.push(7);
tree.push(3);
tree.push(2);
tree.push(1);
assert_eq!(tree.len(), 9);
assert_eq!(tree.as_ref(), &[1, 2, 7, 3, 25, 36, 17, 100, 19]);
assert!(tree.replace(&17, 120).is_some());
assert!(!tree.contains(&17));
assert!(tree.contains(&120));
assert_eq!(tree.len(), 9);
assert_eq!(tree.as_ref(), &[1, 2, 7, 3, 25, 36, 120, 100, 19]);
assert_min_heap_property_fulfilled(tree.clone());
assert!(tree.replace(&1, 1).is_some());
assert!(tree.contains(&120));
assert_eq!(tree.len(), 9);
assert_eq!(tree.as_ref(), &[1, 2, 7, 3, 25, 36, 120, 100, 19]);
assert_min_heap_property_fulfilled(tree.clone());
assert!(tree.replace(&2437, 1).is_none());
}
#[test]
fn min_heap_replace_with_works() {
let mut tree = BinaryMinHeap::<usize>::default();
tree.push(100);
tree.push(36);
tree.push(25);
tree.push(19);
tree.push(17);
tree.push(7);
tree.push(3);
tree.push(2);
tree.push(1);
assert_eq!(tree.len(), 9);
assert_eq!(tree.as_ref(), &[1, 2, 7, 3, 25, 36, 17, 100, 19]);
assert!(tree.replace_with(&17, |value| *value = 120));
assert!(!tree.contains(&17));
assert!(tree.contains(&120));
assert_eq!(tree.len(), 9);
assert_eq!(tree.as_ref(), &[1, 2, 7, 3, 25, 36, 120, 100, 19]);
assert_min_heap_property_fulfilled(tree.clone());
assert!(tree.replace_with(&1, |value| *value = 1));
assert!(tree.contains(&120));
assert_eq!(tree.len(), 9);
assert_eq!(tree.as_ref(), &[1, 2, 7, 3, 25, 36, 120, 100, 19]);
assert_min_heap_property_fulfilled(tree.clone());
}
#[test]
fn min_heap_upholds_min_property() {
let mut tree = BinaryMinHeap::with_capacity(100);
for value in random_values(100) {
tree.push(value)
}
assert_min_heap_property_fulfilled(tree);
}
fn assert_min_heap_property_fulfilled<T>(mut tree: BinaryMinHeap<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
}