- Added the `herodo` package to the workspace. - Updated the MONOREPO_CONVERSION_PLAN.md to reflect the completion of the herodo package conversion. - Updated README.md and build_herodo.sh to reflect the new package structure. - Created herodo/Cargo.toml, herodo/README.md, herodo/src/main.rs, herodo/src/lib.rs, and herodo/tests/integration_tests.rs and herodo/tests/unit_tests.rs.
269 lines
9.0 KiB
Rust
269 lines
9.0 KiB
Rust
//! Unit tests for herodo library functions
|
|
//!
|
|
//! These tests focus on individual functions and components of the herodo library.
|
|
|
|
use std::fs;
|
|
use tempfile::TempDir;
|
|
|
|
/// Test the collect_rhai_files function indirectly through directory operations
|
|
#[test]
|
|
fn test_rhai_file_collection_logic() {
|
|
let temp_dir = TempDir::new().expect("Failed to create temp directory");
|
|
|
|
// Create various files
|
|
fs::write(temp_dir.path().join("script1.rhai"), "// Script 1")
|
|
.expect("Failed to write script1");
|
|
fs::write(temp_dir.path().join("script2.rhai"), "// Script 2")
|
|
.expect("Failed to write script2");
|
|
fs::write(temp_dir.path().join("not_script.txt"), "Not a script")
|
|
.expect("Failed to write txt file");
|
|
fs::write(temp_dir.path().join("README.md"), "# README").expect("Failed to write README");
|
|
|
|
// Create subdirectory with more scripts
|
|
let sub_dir = temp_dir.path().join("subdir");
|
|
fs::create_dir(&sub_dir).expect("Failed to create subdirectory");
|
|
fs::write(sub_dir.join("sub_script.rhai"), "// Sub script")
|
|
.expect("Failed to write sub script");
|
|
|
|
// Count .rhai files manually
|
|
let mut rhai_count = 0;
|
|
for entry in fs::read_dir(temp_dir.path()).expect("Failed to read temp directory") {
|
|
let entry = entry.expect("Failed to get directory entry");
|
|
let path = entry.path();
|
|
if path.is_file() && path.extension().map_or(false, |ext| ext == "rhai") {
|
|
rhai_count += 1;
|
|
}
|
|
}
|
|
|
|
// Should find 2 .rhai files in the main directory
|
|
assert_eq!(
|
|
rhai_count, 2,
|
|
"Should find exactly 2 .rhai files in main directory"
|
|
);
|
|
|
|
// Verify subdirectory has 1 .rhai file
|
|
let mut sub_rhai_count = 0;
|
|
for entry in fs::read_dir(&sub_dir).expect("Failed to read subdirectory") {
|
|
let entry = entry.expect("Failed to get directory entry");
|
|
let path = entry.path();
|
|
if path.is_file() && path.extension().map_or(false, |ext| ext == "rhai") {
|
|
sub_rhai_count += 1;
|
|
}
|
|
}
|
|
|
|
assert_eq!(
|
|
sub_rhai_count, 1,
|
|
"Should find exactly 1 .rhai file in subdirectory"
|
|
);
|
|
}
|
|
|
|
/// Test path validation logic
|
|
#[test]
|
|
fn test_path_validation() {
|
|
let temp_dir = TempDir::new().expect("Failed to create temp directory");
|
|
let script_path = temp_dir.path().join("test.rhai");
|
|
|
|
// Create a test script
|
|
fs::write(&script_path, "println(\"test\");").expect("Failed to write test script");
|
|
|
|
// Test file path validation
|
|
assert!(script_path.exists(), "Script file should exist");
|
|
assert!(script_path.is_file(), "Script path should be a file");
|
|
|
|
// Test directory path validation
|
|
assert!(temp_dir.path().exists(), "Temp directory should exist");
|
|
assert!(temp_dir.path().is_dir(), "Temp path should be a directory");
|
|
|
|
// Test non-existent path
|
|
let nonexistent = temp_dir.path().join("nonexistent.rhai");
|
|
assert!(!nonexistent.exists(), "Non-existent path should not exist");
|
|
}
|
|
|
|
/// Test file extension checking
|
|
#[test]
|
|
fn test_file_extension_checking() {
|
|
let temp_dir = TempDir::new().expect("Failed to create temp directory");
|
|
|
|
// Create files with different extensions
|
|
let rhai_file = temp_dir.path().join("script.rhai");
|
|
let txt_file = temp_dir.path().join("document.txt");
|
|
let no_ext_file = temp_dir.path().join("no_extension");
|
|
|
|
fs::write(&rhai_file, "// Rhai script").expect("Failed to write rhai file");
|
|
fs::write(&txt_file, "Text document").expect("Failed to write txt file");
|
|
fs::write(&no_ext_file, "No extension").expect("Failed to write no extension file");
|
|
|
|
// Test extension detection
|
|
assert_eq!(rhai_file.extension().unwrap(), "rhai");
|
|
assert_eq!(txt_file.extension().unwrap(), "txt");
|
|
assert!(no_ext_file.extension().is_none());
|
|
|
|
// Test extension comparison
|
|
assert!(rhai_file.extension().map_or(false, |ext| ext == "rhai"));
|
|
assert!(!txt_file.extension().map_or(false, |ext| ext == "rhai"));
|
|
assert!(!no_ext_file.extension().map_or(false, |ext| ext == "rhai"));
|
|
}
|
|
|
|
/// Test script content reading
|
|
#[test]
|
|
fn test_script_content_reading() {
|
|
let temp_dir = TempDir::new().expect("Failed to create temp directory");
|
|
let script_path = temp_dir.path().join("content_test.rhai");
|
|
|
|
let expected_content = r#"
|
|
println("Testing content reading");
|
|
let value = 42;
|
|
value * 2
|
|
"#;
|
|
|
|
fs::write(&script_path, expected_content).expect("Failed to write script content");
|
|
|
|
// Read the content back
|
|
let actual_content = fs::read_to_string(&script_path).expect("Failed to read script content");
|
|
assert_eq!(
|
|
actual_content, expected_content,
|
|
"Script content should match"
|
|
);
|
|
|
|
// Verify content contains expected elements
|
|
assert!(
|
|
actual_content.contains("println"),
|
|
"Content should contain println"
|
|
);
|
|
assert!(
|
|
actual_content.contains("let value = 42"),
|
|
"Content should contain variable declaration"
|
|
);
|
|
assert!(
|
|
actual_content.contains("value * 2"),
|
|
"Content should contain expression"
|
|
);
|
|
}
|
|
|
|
/// Test directory traversal logic
|
|
#[test]
|
|
fn test_directory_traversal() {
|
|
let temp_dir = TempDir::new().expect("Failed to create temp directory");
|
|
|
|
// Create nested directory structure
|
|
let level1 = temp_dir.path().join("level1");
|
|
let level2 = level1.join("level2");
|
|
let level3 = level2.join("level3");
|
|
|
|
fs::create_dir_all(&level3).expect("Failed to create nested directories");
|
|
|
|
// Create scripts at different levels
|
|
fs::write(temp_dir.path().join("root.rhai"), "// Root script")
|
|
.expect("Failed to write root script");
|
|
fs::write(level1.join("level1.rhai"), "// Level 1 script")
|
|
.expect("Failed to write level1 script");
|
|
fs::write(level2.join("level2.rhai"), "// Level 2 script")
|
|
.expect("Failed to write level2 script");
|
|
fs::write(level3.join("level3.rhai"), "// Level 3 script")
|
|
.expect("Failed to write level3 script");
|
|
|
|
// Verify directory structure
|
|
assert!(temp_dir.path().is_dir(), "Root temp directory should exist");
|
|
assert!(level1.is_dir(), "Level 1 directory should exist");
|
|
assert!(level2.is_dir(), "Level 2 directory should exist");
|
|
assert!(level3.is_dir(), "Level 3 directory should exist");
|
|
|
|
// Verify scripts exist at each level
|
|
assert!(
|
|
temp_dir.path().join("root.rhai").exists(),
|
|
"Root script should exist"
|
|
);
|
|
assert!(
|
|
level1.join("level1.rhai").exists(),
|
|
"Level 1 script should exist"
|
|
);
|
|
assert!(
|
|
level2.join("level2.rhai").exists(),
|
|
"Level 2 script should exist"
|
|
);
|
|
assert!(
|
|
level3.join("level3.rhai").exists(),
|
|
"Level 3 script should exist"
|
|
);
|
|
}
|
|
|
|
/// Test sorting behavior for script execution order
|
|
#[test]
|
|
fn test_script_sorting_order() {
|
|
let temp_dir = TempDir::new().expect("Failed to create temp directory");
|
|
|
|
// Create scripts with names that should be sorted
|
|
let scripts = vec![
|
|
"03_third.rhai",
|
|
"01_first.rhai",
|
|
"02_second.rhai",
|
|
"10_tenth.rhai",
|
|
"05_fifth.rhai",
|
|
];
|
|
|
|
for script in &scripts {
|
|
fs::write(
|
|
temp_dir.path().join(script),
|
|
format!("// Script: {}", script),
|
|
)
|
|
.expect("Failed to write script");
|
|
}
|
|
|
|
// Collect and sort the scripts manually to verify sorting logic
|
|
let mut found_scripts = Vec::new();
|
|
for entry in fs::read_dir(temp_dir.path()).expect("Failed to read directory") {
|
|
let entry = entry.expect("Failed to get directory entry");
|
|
let path = entry.path();
|
|
if path.is_file() && path.extension().map_or(false, |ext| ext == "rhai") {
|
|
found_scripts.push(path.file_name().unwrap().to_string_lossy().to_string());
|
|
}
|
|
}
|
|
|
|
found_scripts.sort();
|
|
|
|
// Verify sorting order
|
|
let expected_order = vec![
|
|
"01_first.rhai",
|
|
"02_second.rhai",
|
|
"03_third.rhai",
|
|
"05_fifth.rhai",
|
|
"10_tenth.rhai",
|
|
];
|
|
|
|
assert_eq!(
|
|
found_scripts, expected_order,
|
|
"Scripts should be sorted in correct order"
|
|
);
|
|
}
|
|
|
|
/// Test empty directory handling
|
|
#[test]
|
|
fn test_empty_directory_detection() {
|
|
let temp_dir = TempDir::new().expect("Failed to create temp directory");
|
|
let empty_subdir = temp_dir.path().join("empty");
|
|
|
|
fs::create_dir(&empty_subdir).expect("Failed to create empty subdirectory");
|
|
|
|
// Verify directory is empty
|
|
let entries: Vec<_> = fs::read_dir(&empty_subdir)
|
|
.expect("Failed to read empty directory")
|
|
.collect();
|
|
|
|
assert!(entries.is_empty(), "Directory should be empty");
|
|
|
|
// Count .rhai files in empty directory
|
|
let mut rhai_count = 0;
|
|
for entry in fs::read_dir(&empty_subdir).expect("Failed to read empty directory") {
|
|
let entry = entry.expect("Failed to get directory entry");
|
|
let path = entry.path();
|
|
if path.is_file() && path.extension().map_or(false, |ext| ext == "rhai") {
|
|
rhai_count += 1;
|
|
}
|
|
}
|
|
|
|
assert_eq!(
|
|
rhai_count, 0,
|
|
"Empty directory should contain no .rhai files"
|
|
);
|
|
}
|