tree-experiments 0.1.0

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

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

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

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

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

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