mod common;
use common::{TmpDir, find_in_tree};
use std::fs;
use iced_swdir_tree::{DirectoryFilter, DirectoryTree, DirectoryTreeEvent, SelectionMode};
#[test]
fn selection_lands_on_the_target_path() {
let td = TmpDir::new("select");
fs::create_dir(td.path().join("keeps")).unwrap();
fs::create_dir(td.path().join("also")).unwrap();
let mut tree = DirectoryTree::new(td.path().to_path_buf());
iced_swdir_tree::__testing::scan_and_feed(&mut tree, td.path().to_path_buf());
let target = td.path().join("keeps");
let _ = tree.update(DirectoryTreeEvent::Selected(
target.clone(),
true,
SelectionMode::Replace,
));
assert_eq!(tree.selected_path(), Some(target.as_path()));
}
#[test]
fn filter_change_preserves_selection_cursor() {
let td = TmpDir::new("select-filter");
fs::create_dir(td.path().join("keeps")).unwrap();
fs::write(td.path().join("file.txt"), b"").unwrap();
let mut tree =
DirectoryTree::new(td.path().to_path_buf()).with_filter(DirectoryFilter::FilesAndFolders);
iced_swdir_tree::__testing::scan_and_feed(&mut tree, td.path().to_path_buf());
let target = td.path().join("file.txt");
let _ = tree.update(DirectoryTreeEvent::Selected(
target.clone(),
false,
SelectionMode::Replace,
));
assert_eq!(tree.selected_path(), Some(target.as_path()));
tree.set_filter(DirectoryFilter::FoldersOnly);
assert_eq!(
tree.selected_path(),
Some(target.as_path()),
"v0.2: selection cursor survives filter change"
);
tree.set_filter(DirectoryFilter::FilesAndFolders);
assert_eq!(tree.selected_path(), Some(target.as_path()));
}
#[test]
fn filter_change_preserves_directory_selection_when_still_visible() {
let td = TmpDir::new("select-folder-filter");
fs::create_dir(td.path().join("keeps")).unwrap();
fs::write(td.path().join("file.txt"), b"").unwrap();
let mut tree =
DirectoryTree::new(td.path().to_path_buf()).with_filter(DirectoryFilter::FilesAndFolders);
iced_swdir_tree::__testing::scan_and_feed(&mut tree, td.path().to_path_buf());
let target = td.path().join("keeps");
let _ = tree.update(DirectoryTreeEvent::Selected(
target.clone(),
true,
SelectionMode::Replace,
));
assert_eq!(tree.selected_path(), Some(target.as_path()));
tree.set_filter(DirectoryFilter::FoldersOnly);
assert_eq!(tree.selected_path(), Some(target.as_path()));
let node = find_in_tree(&tree, &target).expect("folder must still be in the tree");
assert!(
node.is_selected,
"per-node flag must be re-synced after rebuild"
);
}