use simple_fs::{ListOptions, iter_dirs, list_dirs};
type Result<T> = core::result::Result<T, Box<dyn std::error::Error>>;
#[test]
fn test_iter_dirs_list_dirs() -> Result<()> {
let dirs = list_dirs("./", None, None)?;
assert!(
!dirs.is_empty(),
"Expected to find at least one directory, but found none."
);
for dir in dirs {
assert!(dir.is_dir(), "Expected {} to be a directory", dir.as_str());
}
Ok(())
}
#[test]
fn test_list_dirs_one_level_dotted() -> Result<()> {
let dirs = list_dirs("./tests-data/", None, None)?;
let dir_paths = dirs.iter().map(|p| p.as_str()).collect::<Vec<_>>();
assert!(dir_paths.contains(&"./tests-data/dir1"), "Should contain dir1");
assert!(
dir_paths.contains(&"./tests-data/another-dir"),
"Should contain another-dir"
);
Ok(())
}
#[test]
fn test_list_dirs_with_glob_pattern() -> Result<()> {
let dirs = list_dirs("./tests-data/", Some(&["./tests-data/dir1"]), None)?;
let dir_paths = dirs.iter().map(|p| p.as_str()).collect::<Vec<_>>();
assert_eq!(dirs.len(), 1, "Should have 1 directory matching 'dir1'");
assert!(dir_paths.contains(&"./tests-data/dir1"), "Should contain dir1");
assert!(
!dir_paths.contains(&"./tests-data/another-dir"),
"Should not contain another-dir"
);
Ok(())
}
#[test]
fn test_list_dirs_with_relative_glob() -> Result<()> {
let dirs = list_dirs(
"./tests-data/",
Some(&["another-dir"]),
Some(ListOptions::default().with_relative_glob()),
)?;
let dir_paths = dirs.iter().map(|p| p.as_str()).collect::<Vec<_>>();
assert_eq!(dirs.len(), 1, "Should have 1 directory matching 'another-dir'");
assert!(
dir_paths.contains(&"./tests-data/another-dir"),
"Should contain another-dir"
);
assert!(!dir_paths.contains(&"./tests-data/dir1"), "Should not contain dir1");
Ok(())
}
#[test]
fn test_list_dirs_recursive() -> Result<()> {
let dirs = list_dirs("./tests-data/", Some(&["./tests-data/**"]), None)?;
let dir_paths = dirs.iter().map(|p| p.as_str()).collect::<Vec<_>>();
assert!(dir_paths.contains(&"./tests-data/dir1"), "Should contain dir1");
assert!(
dir_paths.contains(&"./tests-data/dir1/dir2"),
"Should contain dir1/dir2"
);
assert!(
dir_paths.contains(&"./tests-data/dir1/dir2/dir3"),
"Should contain dir1/dir2/dir3"
);
assert!(
dir_paths.contains(&"./tests-data/another-dir"),
"Should contain another-dir"
);
assert!(
dir_paths.contains(&"./tests-data/another-dir/sub-dir"),
"Should contain another-dir/sub-dir"
);
assert!(
dir_paths.contains(&"./tests-data/another-dir/sub-dir/deep-folder"),
"Should contain another-dir/sub-dir/deep-folder"
);
Ok(())
}
#[test]
fn test_list_dirs_with_exclude_option() -> Result<()> {
let list_options = ListOptions::default()
.with_exclude_globs(&["**/dir2", "**/dir2/**"])
.with_relative_glob();
let dirs = list_dirs("./tests-data/", Some(&["**"]), Some(list_options))?;
let dir_paths = dirs.iter().map(|p| p.as_str()).collect::<Vec<_>>();
assert!(dir_paths.contains(&"./tests-data/dir1"), "Should contain dir1");
assert!(
!dir_paths.contains(&"./tests-data/dir1/dir2"),
"Should not contain dir1/dir2"
);
assert!(
!dir_paths.contains(&"./tests-data/dir1/dir2/dir3"),
"Should not contain dir1/dir2/dir3"
);
assert!(
dir_paths.contains(&"./tests-data/another-dir"),
"Should contain another-dir"
);
Ok(())
}
#[test]
fn test_iter_dirs_functionality() -> Result<()> {
let dir_iter = iter_dirs("./tests-data/", None, None)?;
let dirs: Vec<_> = dir_iter.collect();
assert!(dirs.len() >= 2, "Should have at least 2 directories");
let dir_paths = dirs.iter().map(|p| p.as_str()).collect::<Vec<_>>();
assert!(dir_paths.contains(&"./tests-data/dir1"), "Should contain dir1");
assert!(
dir_paths.contains(&"./tests-data/another-dir"),
"Should contain another-dir"
);
Ok(())
}
#[test]
fn test_list_dirs_absolute_path() -> Result<()> {
let test_data_abs = std::fs::canonicalize("./tests-data/")?;
let dirs = list_dirs(&test_data_abs, None, None)?;
assert!(
dirs.len() >= 2,
"Should have at least 2 directories using absolute path"
);
let dir_names: Vec<_> = dirs.iter().map(|p| p.name()).collect();
assert!(dir_names.contains(&"dir1"), "Should contain dir1");
assert!(dir_names.contains(&"another-dir"), "Should contain another-dir");
Ok(())
}
#[test]
fn test_list_dirs_with_negative_glob() -> Result<()> {
let dirs = list_dirs(
"./tests-data/",
Some(&["**", "!**/dir2"]), None,
)?;
let dir_paths = dirs.iter().map(|p| p.as_str()).collect::<Vec<_>>();
assert!(dir_paths.contains(&"./tests-data/dir1"), "Should contain dir1");
assert!(
!dir_paths.contains(&"./tests-data/dir1/dir2"),
"Should not contain dir1/dir2"
);
assert!(
dir_paths.contains(&"./tests-data/another-dir"),
"Should contain another-dir"
);
assert!(
dir_paths.contains(&"./tests-data/another-dir/sub-dir"),
"Should contain another-dir/sub-dir"
);
Ok(())
}
#[test]
fn test_list_dirs_with_multiple_negative_globs() -> Result<()> {
let dirs = list_dirs(
"./tests-data/",
Some(&[
"**", "!**/dir2", "!**/deep-folder", ]),
None,
)?;
let dir_paths = dirs.iter().map(|p| p.as_str()).collect::<Vec<_>>();
assert!(dir_paths.contains(&"./tests-data/dir1"), "Should contain dir1");
assert!(
!dir_paths.contains(&"./tests-data/dir1/dir2"),
"Should not contain dir1/dir2"
);
assert!(
dir_paths.contains(&"./tests-data/another-dir"),
"Should contain another-dir"
);
assert!(
dir_paths.contains(&"./tests-data/another-dir/sub-dir"),
"Should contain another-dir/sub-dir"
);
assert!(
!dir_paths.contains(&"./tests-data/another-dir/sub-dir/deep-folder"),
"Should not contain another-dir/sub-dir/deep-folder"
);
Ok(())
}
#[test]
fn test_list_dirs_with_only_negative_globs() -> Result<()> {
let dirs = list_dirs(
"./tests-data/",
Some(&["!**/dir2", "!**/deep-folder"]), None,
)?;
let dir_paths = dirs.iter().map(|p| p.as_str()).collect::<Vec<_>>();
assert!(dir_paths.contains(&"./tests-data/dir1"), "Should contain dir1");
assert!(
!dir_paths.contains(&"./tests-data/dir1/dir2"),
"Should not contain dir1/dir2"
);
assert!(
!dir_paths.contains(&"./tests-data/another-dir/sub-dir/deep-folder"),
"Should not contain another-dir/sub-dir/deep-folder"
);
Ok(())
}