tree-experiments 0.1.0

Experiments with tree-like data structures
Documentation
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);

    // Ensure a baseline representation.
    assert_eq!(tree.as_ref(), &[1, 2, 7, 3, 25, 36, 17, 100, 19]);

    // Delete an element where the internal replacement is less than the value (25 vs. 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());

    // Delete the last value.
    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());

    // Delete an element where the internal replacement is greater than the value (7 vs. 17).
    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());

    // Remove all remaining values.
    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
}