use std::fs;
use std::io;
use tempfile::tempdir;
use tree_create::create_tree;
fn verify_structure(dir: &std::path::Path, expected_paths: &[&str]) -> io::Result<()> {
for path in expected_paths {
let full_path = dir.join(path);
assert!(
full_path.exists(),
"Path not found: {:?}",
full_path
);
if path.ends_with('/') {
assert!(
full_path.is_dir(),
"Expected directory, found file: {:?}",
full_path
);
} else {
assert!(
full_path.is_file(),
"Expected file, found directory: {:?}",
full_path
);
}
}
Ok(())
}
#[test]
fn test_create_from_ascii_tree() -> io::Result<()> {
let dir = tempdir()?;
let input = "\
project/
├── src/
│ ├── main.rs
│ └── lib.rs
└── Cargo.toml";
create_tree(input, dir.path(), false)?;
verify_structure(dir.path(), &[
"project/",
"project/src/",
"project/src/main.rs",
"project/src/lib.rs",
"project/Cargo.toml",
])
}
#[test]
fn test_create_from_indented() -> io::Result<()> {
let dir = tempdir()?;
let input = "\
project/
src/
main.rs
lib.rs
Cargo.toml";
create_tree(input, dir.path(), false)?;
verify_structure(dir.path(), &[
"project/",
"project/src/",
"project/src/main.rs",
"project/src/lib.rs",
"project/Cargo.toml",
])
}
#[test]
fn test_deep_nesting() -> io::Result<()> {
let dir = tempdir()?;
let input = "\
project/
src/
components/
ui/
buttons/
primary.rs
secondary.rs
inputs/
text.rs
number.rs";
create_tree(input, dir.path(), false)?;
verify_structure(dir.path(), &[
"project/",
"project/src/",
"project/src/components/",
"project/src/components/ui/",
"project/src/components/ui/buttons/",
"project/src/components/ui/buttons/primary.rs",
"project/src/components/ui/buttons/secondary.rs",
"project/src/components/ui/inputs/",
"project/src/components/ui/inputs/text.rs",
"project/src/components/ui/inputs/number.rs",
])
}
#[test]
fn test_empty_input() {
let dir = tempdir().unwrap();
let result = create_tree("", dir.path(), false);
assert!(result.is_err());
assert_eq!(
result.unwrap_err().to_string(),
"Input is empty"
);
}
#[test]
fn test_indented_root_error() {
let dir = tempdir().unwrap();
let input = " project/\n src/";
let result = create_tree(input, dir.path(), false);
assert!(result.is_err());
assert_eq!(
result.unwrap_err().to_string(),
"Root directory (line 1) should not be indented"
);
}
#[test]
fn test_creating_in_existing_directory() -> io::Result<()> {
let dir = tempdir()?;
let project_dir = dir.path().join("project");
fs::create_dir(&project_dir)?;
let input = "\
project/
└── src/
└── main.rs";
create_tree(input, dir.path(), false)?;
verify_structure(dir.path(), &[
"project/",
"project/src/",
"project/src/main.rs",
])
}
#[test]
fn test_inconsistent_indentation() {
let dir = tempdir().unwrap();
let input = "\
project/
src/
main.rs";
let result = create_tree(input, dir.path(), false);
assert!(result.is_err());
assert!(result.unwrap_err().to_string().contains("Inconsistent indentation"));
}
#[test]
fn test_tab_indentation() -> io::Result<()> {
let dir = tempdir()?;
let input = "\
project/
\tsrc/
\t\tmain.rs
\t\tlib.rs
\tCargo.toml";
create_tree(input, dir.path(), false)?;
verify_structure(dir.path(), &[
"project/",
"project/src/",
"project/src/main.rs",
"project/src/lib.rs",
"project/Cargo.toml",
])
}
#[test]
fn test_force_overwrite() -> io::Result<()> {
let dir = tempdir()?;
let initial_input = "\
project/
src/
main.rs";
create_tree(initial_input, dir.path(), false)?;
fs::write(
dir.path().join("project/src/main.rs"),
"initial content"
)?;
let new_input = "\
project/
src/
main.rs
lib.rs";
create_tree(new_input, dir.path(), false)?;
assert_eq!(
fs::read_to_string(dir.path().join("project/src/main.rs"))?,
"initial content"
);
create_tree(new_input, dir.path(), true)?;
assert_eq!(
fs::read_to_string(dir.path().join("project/src/main.rs"))?,
""
);
Ok(())
}