use revue::widget::data::tree::Tree;
use revue::widget::data::tree::TreeNode;
#[test]
fn test_tree_new() {
let t = Tree::new();
assert!(t.is_empty());
assert_eq!(t.selected_index(), 0);
}
#[test]
fn test_tree_default() {
let t = Tree::default();
assert!(t.is_empty());
}
#[test]
fn test_tree_builder() {
let t = Tree::new()
.node(TreeNode::new("A"))
.node(TreeNode::new("B"));
assert_eq!(t.len(), 2);
assert_eq!(t.visible_count(), 2);
}
#[test]
fn test_tree_helper() {
let t = Tree::new().node(TreeNode::new("Test"));
assert_eq!(t.len(), 1);
}
#[test]
fn test_tree_node() {
let node = TreeNode::new("Root")
.child(TreeNode::new("Child 1"))
.child(TreeNode::new("Child 2"));
assert_eq!(node.label, "Root");
assert_eq!(node.children.len(), 2);
assert!(node.has_children());
}
#[test]
fn test_tree_node_leaf() {
let leaf = TreeNode::leaf("Leaf");
assert!(!leaf.has_children());
}
#[test]
fn test_tree_node_children_builder() {
let children = vec![TreeNode::new("Child 1"), TreeNode::new("Child 2")];
let node = TreeNode::new("Parent").children(children);
assert_eq!(node.children.len(), 2);
}
#[test]
fn test_tree_node_expanded_builder() {
let node = TreeNode::new("Test").expanded(true);
assert!(node.expanded);
}
#[test]
fn test_tree_navigation() {
let t = Tree::new().nodes(vec![
TreeNode::new("One"),
TreeNode::new("Two"),
TreeNode::new("Three"),
]);
let mut t = t;
assert_eq!(t.selected_index(), 0);
t.select_next();
assert_eq!(t.selected_index(), 1);
t.select_next();
assert_eq!(t.selected_index(), 2);
t.select_next(); assert_eq!(t.selected_index(), 2);
t.select_prev();
assert_eq!(t.selected_index(), 1);
t.select_first();
assert_eq!(t.selected_index(), 0);
t.select_last();
assert_eq!(t.selected_index(), 2);
}
#[test]
fn test_tree_expand_collapse() {
let mut t = Tree::new().node(
TreeNode::new("Parent")
.child(TreeNode::new("Child 1"))
.child(TreeNode::new("Child 2")),
);
assert_eq!(t.visible_count(), 1);
t.toggle_expand();
assert_eq!(t.visible_count(), 3);
t.toggle_expand();
assert_eq!(t.visible_count(), 1);
}
#[test]
fn test_tree_expand_collapse_methods() {
let mut t = Tree::new().node(
TreeNode::new("Parent")
.child(TreeNode::new("Child 1"))
.child(TreeNode::new("Child 2")),
);
assert_eq!(t.visible_count(), 1);
t.expand();
assert_eq!(t.visible_count(), 3);
t.collapse();
assert_eq!(t.visible_count(), 1);
}
#[test]
fn test_tree_expand_already_expanded() {
let mut t = Tree::new().node(
TreeNode::new("Parent")
.expanded(true)
.child(TreeNode::new("Child")),
);
let visible_before = t.visible_count();
t.expand();
assert_eq!(t.visible_count(), visible_before);
}
#[test]
fn test_tree_collapse_already_collapsed() {
let mut t = Tree::new().node(TreeNode::new("Parent").child(TreeNode::new("Child")));
t.collapse();
assert_eq!(t.visible_count(), 1);
}
#[test]
fn test_tree_expand_leaf_node() {
let mut t = Tree::new().node(TreeNode::new("Leaf"));
t.expand();
assert_eq!(t.visible_count(), 1);
}
#[test]
fn test_tree_selected_label() {
let t = Tree::new().nodes(vec![TreeNode::new("First"), TreeNode::new("Second")]);
assert_eq!(t.selected_label(), Some("First"));
}
#[test]
fn test_tree_selected_label_none() {
let t = Tree::new();
assert!(t.selected_label().is_none());
}
#[test]
fn test_tree_handle_key() {
use revue::event::Key;
let mut t = Tree::new().node(
TreeNode::new("Root")
.child(TreeNode::new("A"))
.child(TreeNode::new("B")),
);
t.handle_key(&Key::Enter);
assert_eq!(t.visible_count(), 3);
t.handle_key(&Key::Down);
assert_eq!(t.selected_index(), 1);
t.handle_key(&Key::Up);
assert_eq!(t.selected_index(), 0);
}
#[test]
fn test_tree_handle_key_non_searchable_vim_keys() {
use revue::event::Key;
let mut t = Tree::new().nodes(vec![
TreeNode::new("One"),
TreeNode::new("Two"),
TreeNode::new("Three"),
]);
assert!(t.handle_key(&Key::Char('j')));
assert_eq!(t.selected_index(), 1);
assert!(t.handle_key(&Key::Char('k')));
assert_eq!(t.selected_index(), 0);
}
#[test]
fn test_tree_handle_key_expand_with_space() {
use revue::event::Key;
let mut t = Tree::new().node(TreeNode::new("Parent").child(TreeNode::new("Child")));
assert!(t.handle_key(&Key::Char(' ')));
assert_eq!(t.visible_count(), 2); }
#[test]
fn test_tree_handle_key_expand_collapse_with_vim() {
use revue::event::Key;
let mut t = Tree::new().node(TreeNode::new("Parent").child(TreeNode::new("Child")));
assert!(t.handle_key(&Key::Char('l')));
assert_eq!(t.visible_count(), 2);
assert!(t.handle_key(&Key::Char('h')));
assert_eq!(t.visible_count(), 1);
}
#[test]
fn test_tree_handle_key_searchable_up_down() {
use revue::event::Key;
let mut t = Tree::new()
.nodes(vec![TreeNode::new("One"), TreeNode::new("Two")])
.searchable(true);
assert!(t.handle_key(&Key::Down));
assert_eq!(t.selected_index(), 1);
assert!(t.handle_key(&Key::Up));
assert_eq!(t.selected_index(), 0);
}
#[test]
fn test_tree_handle_key_searchable_enter() {
use revue::event::Key;
let mut t = Tree::new()
.node(TreeNode::new("Parent").child(TreeNode::new("Child")))
.searchable(true);
assert!(t.handle_key(&Key::Enter));
assert_eq!(t.visible_count(), 2);
}
#[test]
fn test_tree_handle_key_searchable_left_right() {
use revue::event::Key;
let mut t = Tree::new()
.node(TreeNode::new("Parent").child(TreeNode::new("Child")))
.searchable(true);
assert!(t.handle_key(&Key::Right));
assert_eq!(t.visible_count(), 2);
assert!(t.handle_key(&Key::Left));
assert_eq!(t.visible_count(), 1);
}
#[test]
fn test_tree_handle_key_special_search_chars() {
use revue::event::Key;
let mut t = Tree::new()
.nodes(vec![
TreeNode::new("file-name"),
TreeNode::new("file_name"),
TreeNode::new("file.name"),
TreeNode::new("path/to/file"),
])
.searchable(true);
t.handle_key(&Key::Char('-'));
assert_eq!(t.query(), "-");
t.clear_query();
t.handle_key(&Key::Char('_'));
assert_eq!(t.query(), "_");
t.clear_query();
t.handle_key(&Key::Char('.'));
assert_eq!(t.query(), ".");
t.clear_query();
t.handle_key(&Key::Char('/'));
assert_eq!(t.query(), "/");
}
#[test]
fn test_tree_handle_key_unhandled() {
use revue::event::Key;
let mut t = Tree::new().node(TreeNode::new("Test"));
assert!(!t.handle_key(&Key::Tab));
}
#[test]
fn test_tree_searchable() {
let mut t = Tree::new()
.nodes(vec![
TreeNode::new("apple.rs"),
TreeNode::new("banana.rs"),
TreeNode::new("cherry.rs"),
])
.searchable(true);
assert!(t.is_searchable());
assert_eq!(t.query(), "");
t.set_query("ap");
assert_eq!(t.query(), "ap");
assert_eq!(t.match_count(), 1); assert_eq!(t.selected_index(), 0);
t.set_query("rs");
assert_eq!(t.match_count(), 3);
t.clear_query();
assert_eq!(t.query(), "");
assert_eq!(t.match_count(), 0);
}
#[test]
fn test_tree_search_navigation() {
let mut t = Tree::new()
.nodes(vec![
TreeNode::new("file1.txt"),
TreeNode::new("file2.txt"),
TreeNode::new("other.rs"),
TreeNode::new("file3.txt"),
])
.searchable(true);
t.set_query("file");
assert_eq!(t.match_count(), 3);
assert_eq!(t.current_match_index(), 1); assert_eq!(t.selected_index(), 0);
t.next_match();
assert_eq!(t.current_match_index(), 2);
assert_eq!(t.selected_index(), 1);
t.next_match();
assert_eq!(t.current_match_index(), 3);
assert_eq!(t.selected_index(), 3);
t.next_match();
assert_eq!(t.current_match_index(), 1);
assert_eq!(t.selected_index(), 0);
t.prev_match();
assert_eq!(t.current_match_index(), 3);
assert_eq!(t.selected_index(), 3); }
#[test]
fn test_tree_search_expanded() {
let mut t = Tree::new()
.node(
TreeNode::new("src")
.expanded(true)
.child(TreeNode::new("main.rs"))
.child(TreeNode::new("lib.rs")),
)
.node(TreeNode::new("Cargo.toml"))
.searchable(true);
t.set_query(".rs");
assert_eq!(t.match_count(), 2); }
#[test]
fn test_tree_get_match() {
let mut t = Tree::new()
.nodes(vec![TreeNode::new("Hello World")])
.searchable(true);
assert!(t.get_match("Hello World").is_none());
t.set_query("hw");
let m = t.get_match("Hello World");
assert!(m.is_some());
let m = m.unwrap();
assert!(m.indices.contains(&0)); assert!(m.indices.contains(&6)); }
#[test]
fn test_tree_searchable_keys() {
use revue::event::Key;
let mut t = Tree::new()
.nodes(vec![
TreeNode::new("apple"),
TreeNode::new("apricot"),
TreeNode::new("banana"),
])
.searchable(true);
t.handle_key(&Key::Char('a'));
assert_eq!(t.query(), "a");
assert_eq!(t.match_count(), 3);
t.handle_key(&Key::Char('p'));
assert_eq!(t.query(), "ap");
assert_eq!(t.match_count(), 2);
t.handle_key(&Key::Backspace);
assert_eq!(t.query(), "a");
t.handle_key(&Key::Char('n'));
assert_eq!(t.current_match_index(), 2);
t.handle_key(&Key::Char('N'));
assert_eq!(t.current_match_index(), 1);
t.handle_key(&Key::Escape);
assert_eq!(t.query(), "");
}
#[test]
fn test_tree_is_match() {
let mut t = Tree::new()
.nodes(vec![TreeNode::new("file1.txt"), TreeNode::new("file2.txt")])
.searchable(true);
t.set_query("file1");
assert!(t.is_match(0));
assert!(!t.is_match(1));
}
#[test]
fn test_tree_current_match_index_empty() {
let t = Tree::new()
.nodes(vec![TreeNode::new("test")])
.searchable(true);
assert_eq!(t.current_match_index(), 0);
}
#[test]
fn test_tree_next_prev_match_empty() {
let mut t = Tree::new()
.nodes(vec![TreeNode::new("test")])
.searchable(true);
assert!(!t.next_match());
assert!(!t.prev_match());
}