blob: 74c2d90ed8559ec15685a4c0ebede7a015cb00cc [file] [log] [blame]
extern crate id_tree;
use id_tree::InsertBehavior::*;
use id_tree::MoveBehavior::*;
use id_tree::Node;
use id_tree::NodeIdError::*;
use id_tree::RemoveBehavior::*;
use id_tree::SwapBehavior::*;
use id_tree::Tree;
use id_tree::TreeBuilder;
#[test]
fn test_old_node_id() {
let mut tree: Tree<i32> = TreeBuilder::new().build();
let root_node = Node::new(1);
let root_id = tree.insert(root_node, AsRoot).ok().unwrap();
let root_id_copy = root_id.clone(); // this is essential to getting the Result::Err()
let root_node = tree.remove_node(root_id, OrphanChildren);
assert!(root_node.is_ok());
let root_node_again = tree.remove_node(root_id_copy, OrphanChildren);
assert!(root_node_again.is_err());
let error = root_node_again.err().unwrap();
assert_eq!(error, NodeIdNoLongerValid);
}
#[test]
fn test_get_node_from_other_tree() {
let mut tree_a: Tree<i32> = TreeBuilder::new().build();
let tree_b: Tree<i32> = TreeBuilder::new().build();
let root_node_a = Node::new(1);
let root_node_id_a = tree_a.insert(root_node_a, AsRoot).unwrap();
let root_node_a = tree_a.get(&root_node_id_a);
let root_node_b = tree_b.get(&root_node_id_a); //note use of wrong tree
assert!(root_node_a.is_ok());
assert!(root_node_b.is_err());
assert_eq!(root_node_b.err().unwrap(), InvalidNodeIdForTree);
}
#[test]
fn test_get_mut_node_from_other_tree() {
let mut tree_a: Tree<i32> = TreeBuilder::new().build();
let mut tree_b: Tree<i32> = TreeBuilder::new().build();
let root_node_a = Node::new(1);
let root_node_id_a = tree_a.insert(root_node_a, AsRoot).unwrap();
let root_node_a = tree_a.get_mut(&root_node_id_a);
let root_node_b = tree_b.get_mut(&root_node_id_a); //note use of wrong tree
assert!(root_node_a.is_ok());
assert!(root_node_b.is_err());
assert_eq!(root_node_b.err().unwrap(), InvalidNodeIdForTree);
}
#[test]
fn test_remove_node_lift_children_from_other_tree() {
let mut tree_a: Tree<i32> = TreeBuilder::new().build();
let mut tree_b: Tree<i32> = TreeBuilder::new().build();
let root_node_id_a = tree_a.insert(Node::new(1), AsRoot).unwrap();
// note use of wrong tree
let root_node_b = tree_b.remove_node(root_node_id_a, LiftChildren);
assert!(root_node_b.is_err());
let error = root_node_b.err().unwrap();
assert_eq!(error, InvalidNodeIdForTree);
}
#[test]
fn test_remove_node_orphan_children_from_other_tree() {
let mut tree_a: Tree<i32> = TreeBuilder::new().build();
let mut tree_b: Tree<i32> = TreeBuilder::new().build();
let root_node_id_a = tree_a.insert(Node::new(1), AsRoot).unwrap();
// note use of wrong tree
let root_node_b = tree_b.remove_node(root_node_id_a, OrphanChildren);
assert!(root_node_b.is_err());
let error = root_node_b.err().unwrap();
assert_eq!(error, InvalidNodeIdForTree);
}
#[test]
fn test_remove_node_remove_children_from_other_tree() {
let mut tree_a: Tree<i32> = TreeBuilder::new().build();
let mut tree_b: Tree<i32> = TreeBuilder::new().build();
let root_node_id_a = tree_a.insert(Node::new(1), AsRoot).unwrap();
// note use of wrong tree
let root_node_b = tree_b.remove_node(root_node_id_a, DropChildren);
assert!(root_node_b.is_err());
let error = root_node_b.err().unwrap();
assert_eq!(error, InvalidNodeIdForTree);
}
#[test]
fn test_move_node_into_other_tree() {
let mut tree_a: Tree<i32> = TreeBuilder::new().build();
let mut tree_b: Tree<i32> = TreeBuilder::new().build();
let root_node_a = Node::new(1);
let root_node_id_a = tree_a.insert(root_node_a, AsRoot).unwrap();
let root_node_b = Node::new(1);
let root_node_id_b = tree_b.insert(root_node_b, AsRoot).unwrap();
// note use of invalid parent
let result = tree_a.move_node(&root_node_id_a, ToParent(&root_node_id_b));
assert!(result.is_err());
let error = result.err().unwrap();
assert_eq!(error, InvalidNodeIdForTree);
}
#[test]
fn test_move_node_from_other_tree() {
let mut tree_a: Tree<i32> = TreeBuilder::new().build();
let mut tree_b: Tree<i32> = TreeBuilder::new().build();
let root_node_a = Node::new(1);
let root_node_id_a = tree_a.insert(root_node_a, AsRoot).unwrap();
let root_node_b = Node::new(1);
let root_node_id_b = tree_b.insert(root_node_b, AsRoot).unwrap();
// note use of invalid child
let result = tree_a.move_node(&root_node_id_b, ToParent(&root_node_id_a));
assert!(result.is_err());
let error = result.err().unwrap();
assert_eq!(error, InvalidNodeIdForTree);
}
#[test]
fn test_move_node_to_root_by_invalid_id() {
let mut tree_a: Tree<i32> = TreeBuilder::new().build();
let mut tree_b: Tree<i32> = TreeBuilder::new().build();
let root_node_a = Node::new(1);
let _ = tree_a.insert(root_node_a, AsRoot).unwrap();
let root_node_b = Node::new(1);
let root_node_id_b = tree_b.insert(root_node_b, AsRoot).unwrap();
let result = tree_a.move_node(&root_node_id_b, ToRoot);
assert!(result.is_err());
let error = result.err().unwrap();
assert_eq!(error, InvalidNodeIdForTree);
}
#[test]
fn test_sort_by_invalid_id() {
let mut tree_a: Tree<i32> = TreeBuilder::new().build();
let mut tree_b: Tree<i32> = TreeBuilder::new().build();
let root_node_a = Node::new(1);
let _ = tree_a.insert(root_node_a, AsRoot).unwrap();
let root_node_b = Node::new(1);
let root_node_id_b = tree_b.insert(root_node_b, AsRoot).unwrap();
let result = tree_a.sort_children_by(&root_node_id_b, |a, b| a.data().cmp(b.data()));
assert!(result.is_err());
let error = result.err().unwrap();
assert_eq!(error, InvalidNodeIdForTree);
}
#[test]
fn test_sort_by_data_invalid_id() {
let mut tree_a: Tree<i32> = TreeBuilder::new().build();
let mut tree_b: Tree<i32> = TreeBuilder::new().build();
let root_node_a = Node::new(1);
let _ = tree_a.insert(root_node_a, AsRoot).unwrap();
let root_node_b = Node::new(1);
let root_node_id_b = tree_b.insert(root_node_b, AsRoot).unwrap();
let result = tree_a.sort_children_by_data(&root_node_id_b);
assert!(result.is_err());
let error = result.err().unwrap();
assert_eq!(error, InvalidNodeIdForTree);
}
#[test]
fn test_sort_by_key_invalid_id() {
let mut tree_a: Tree<i32> = TreeBuilder::new().build();
let mut tree_b: Tree<i32> = TreeBuilder::new().build();
let root_node_a = Node::new(1);
let _ = tree_a.insert(root_node_a, AsRoot).unwrap();
let root_node_b = Node::new(1);
let root_node_id_b = tree_b.insert(root_node_b, AsRoot).unwrap();
let result = tree_a.sort_children_by_key(&root_node_id_b, |x| *x.data());
assert!(result.is_err());
let error = result.err().unwrap();
assert_eq!(error, InvalidNodeIdForTree);
}
#[test]
fn test_swap_sub_trees_of_different_trees() {
let mut tree_a: Tree<i32> = TreeBuilder::new().build();
let mut tree_b: Tree<i32> = TreeBuilder::new().build();
let root_node_a = Node::new(1);
let root_node_id_a = tree_a.insert(root_node_a, AsRoot).unwrap();
let root_node_b = Node::new(1);
let root_node_id_b = tree_b.insert(root_node_b, AsRoot).unwrap();
// note use of invalid child
let result = tree_a.swap_nodes(&root_node_id_b, &root_node_id_a, TakeChildren);
assert!(result.is_err());
let error = result.err().unwrap();
assert_eq!(error, InvalidNodeIdForTree);
}
#[test]
fn test_ancestors_different_trees() {
let mut a = Tree::new();
let b = Tree::<i32>::new();
let root_id = a.insert(Node::new(1), AsRoot).unwrap();
// note usage of `b` instead of `a`
let ancestors = b.ancestors(&root_id);
assert!(ancestors.is_err());
let error = ancestors.err().unwrap();
assert_eq!(error, InvalidNodeIdForTree);
}
#[test]
fn test_ancestors_old_id() {
let mut a = Tree::new();
let root_id = a.insert(Node::new(1), AsRoot).unwrap();
// `.clone()` required to get this error
let root_id_clone = root_id.clone();
let _ = a.remove_node(root_id, DropChildren).unwrap();
// note usage of cloned `NodeId`
let ancestors = a.ancestors(&root_id_clone);
assert!(ancestors.is_err());
let error = ancestors.err().unwrap();
assert_eq!(error, NodeIdNoLongerValid);
}
#[test]
fn test_ancestor_ids_different_trees() {
let mut a = Tree::new();
let b = Tree::<i32>::new();
let root_id = a.insert(Node::new(1), AsRoot).unwrap();
// note usage of `b` instead of `a`
let ancestors = b.ancestor_ids(&root_id);
assert!(ancestors.is_err());
let error = ancestors.err().unwrap();
assert_eq!(error, InvalidNodeIdForTree);
}
#[test]
fn test_ancestor_ids_old_id() {
let mut a = Tree::new();
let root_id = a.insert(Node::new(1), AsRoot).unwrap();
// `.clone()` required to get this error
let root_id_clone = root_id.clone();
let _ = a.remove_node(root_id, DropChildren).unwrap();
// note usage of cloned `NodeId`
let ancestors = a.ancestor_ids(&root_id_clone);
assert!(ancestors.is_err());
let error = ancestors.err().unwrap();
assert_eq!(error, NodeIdNoLongerValid);
}
#[test]
fn test_children_different_trees() {
let mut a = Tree::new();
let b = Tree::<i32>::new();
let root_id = a.insert(Node::new(1), AsRoot).unwrap();
// note usage of `b` instead of `a`
let ancestors = b.children(&root_id);
assert!(ancestors.is_err());
let error = ancestors.err().unwrap();
assert_eq!(error, InvalidNodeIdForTree);
}
#[test]
fn test_children_old_id() {
let mut a = Tree::new();
let root_id = a.insert(Node::new(1), AsRoot).unwrap();
// `.clone()` required to get this error
let root_id_clone = root_id.clone();
let _ = a.remove_node(root_id, DropChildren).unwrap();
// note usage of cloned `NodeId`
let ancestors = a.children(&root_id_clone);
assert!(ancestors.is_err());
let error = ancestors.err().unwrap();
assert_eq!(error, NodeIdNoLongerValid);
}
#[test]
fn test_children_ids_different_trees() {
let mut a = Tree::new();
let b = Tree::<i32>::new();
let root_id = a.insert(Node::new(1), AsRoot).unwrap();
// note usage of `b` instead of `a`
let ancestors = b.children_ids(&root_id);
assert!(ancestors.is_err());
let error = ancestors.err().unwrap();
assert_eq!(error, InvalidNodeIdForTree);
}
#[test]
fn test_children_ids_old_id() {
let mut a = Tree::new();
let root_id = a.insert(Node::new(1), AsRoot).unwrap();
// `.clone()` required to get this error
let root_id_clone = root_id.clone();
let _ = a.remove_node(root_id, DropChildren).unwrap();
// note usage of cloned `NodeId`
let ancestors = a.children_ids(&root_id_clone);
assert!(ancestors.is_err());
let error = ancestors.err().unwrap();
assert_eq!(error, NodeIdNoLongerValid);
}