read-tree 0.1.0

A read-only tree structure.
Documentation
use super::*;

fn tiny() -> Tree<usize> {
    let mut sap = Sapling::new();
    sap.push_leaf(1);
    sap.build().unwrap()
}

fn small() -> Tree<usize> {
    let mut sap = Sapling::new();
    sap.push(1);
    sap.push_leaf(11);
    sap.push(12);
    sap.push(121);
    sap.push_leaf(1211);
    sap.pop();
    sap.push_leaf(122);
    sap.pop();
    sap.pop();
    sap.build().unwrap()
}

mod test_sapling {
    use super::*;

    #[test]
    fn test_tiny() {
        tiny();
    }

    #[test]
    fn test_small() {
        small();
    }

    #[test]
    fn test_err() {
        let sap = Sapling::<usize>::new();
        sap.build().unwrap_err();

        let mut sap = Sapling::<usize>::new();
        assert!(sap.pop().is_none());

        let mut sap = Sapling::new();
        sap.push(0);
        sap.build().unwrap_err();

        let mut sap = Sapling::new();
        sap.push_leaf(0);
        sap.push_leaf(0);
        sap.build().unwrap_err();

        let mut sap = Sapling::new();
        sap.push(0);
        sap.push(0);
        sap.pop();
        sap.build().unwrap_err();
    }

    #[test]
    fn test_clear() {
        let mut sap = Sapling::new();
        sap.push_leaf(0);
        sap.clear();
        sap.build().unwrap_err();

        let mut sap = Sapling::new();
        sap.push(0);
        sap.clear();
        sap.push_leaf(0);
        sap.build().unwrap();

        let mut sap = Sapling::new();
        sap.push_leaf(0);
        sap.clear();
        sap.push_leaf(0);
        sap.build().unwrap();
    }
}

mod test_node {
    use super::*;

    #[test]
    fn test_to_tree() {
        let tree_1 = small();
        let tree_2 = tree_1.root().into_tree();
        for (n1, n2) in tree_1.root().iter().zip(tree_2.root().iter()) {
            assert_eq!(n1.data(), n2.data());
        }
    }
}

mod test_iter {
    use super::*;

    #[test]
    fn test_iter_children() {
        let tree = small();
        let mut iter = tree.root().children();

        let node = iter.next().unwrap();
        assert_eq!(node.depth(), 1);
        assert_eq!(node.data(), &11);

        let node = iter.next().unwrap();
        assert_eq!(node.depth(), 1);
        assert_eq!(node.data(), &12);

        assert!(iter.next().is_none());
    }

    #[test]
    fn test_iter_descendants() {
        let tree = small();
        let mut iter = tree.root().iter();

        let node = iter.next().unwrap();
        assert_eq!(node.depth(), 0);
        assert_eq!(node.data(), &1);

        let node = iter.next().unwrap();
        assert_eq!(node.depth(), 1);
        assert_eq!(node.data(), &11);

        let node = iter.next().unwrap();
        assert_eq!(node.depth(), 1);
        assert_eq!(node.data(), &12);

        let node = iter.next().unwrap();
        assert_eq!(node.depth(), 2);
        assert_eq!(node.data(), &121);

        let node = iter.next().unwrap();
        assert_eq!(node.depth(), 3);
        assert_eq!(node.data(), &1211);

        let node = iter.next().unwrap();
        assert_eq!(node.depth(), 2);
        assert_eq!(node.data(), &122);

        assert!(iter.next().is_none());
    }
}