#![cfg(any(
not(any(
feature = "parser_tests",
feature = "analyzer_tests",
feature = "codegen_tests",
feature = "interpreter_tests",
feature = "conformance_tests",
feature = "integration_tests",
)),
feature = "integration_tests",
))]
use std::fs;
use tempfile::TempDir;
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_module_file_skips_missing_modules() {
let temp_dir = TempDir::new().unwrap();
let src_dir = temp_dir.path().join("src");
fs::create_dir(&src_dir).unwrap();
fs::write(src_dir.join("button.wj"), "pub struct Button {}").unwrap();
fs::write(src_dir.join("input.wj"), "pub struct Input {}").unwrap();
let output_dir = temp_dir.path().join("out");
fs::create_dir(&output_dir).unwrap();
let status = std::process::Command::new(env!("CARGO_BIN_EXE_wj"))
.arg("build")
.arg(&src_dir)
.arg("-o")
.arg(&output_dir)
.arg("--target")
.arg("rust")
.arg("--module-file")
.arg("--no-cargo")
.status()
.expect("Failed to execute wj");
assert!(status.success());
let mod_rs = fs::read_to_string(output_dir.join("mod.rs")).expect("mod.rs should be generated");
println!("Generated mod.rs:\n{}", mod_rs);
assert!(
mod_rs.contains("pub mod button;"),
"button.rs exists, should be declared"
);
assert!(
mod_rs.contains("pub mod input;"),
"input.rs exists, should be declared"
);
assert!(
!mod_rs.contains("pub mod mod;"),
"mod.rs should NOT be declared"
);
assert!(
!mod_rs.contains("pub mod lib;"),
"lib.rs doesn't exist, should NOT be declared"
);
}
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_generated_rust_files_excluded_from_module_list() {
let temp_dir = TempDir::new().unwrap();
let src_dir = temp_dir.path().join("src");
fs::create_dir(&src_dir).unwrap();
fs::write(src_dir.join("component.wj"), "pub struct Component {}").unwrap();
let output_dir = temp_dir.path().join("out");
fs::create_dir(&output_dir).unwrap();
let status = std::process::Command::new(env!("CARGO_BIN_EXE_wj"))
.arg("build")
.arg(&src_dir)
.arg("-o")
.arg(&output_dir)
.arg("--target")
.arg("rust")
.arg("--module-file")
.arg("--no-cargo")
.status()
.expect("Failed to execute wj");
assert!(status.success());
assert!(
output_dir.join("component.rs").exists(),
"component.rs should be generated"
);
let mod_rs = fs::read_to_string(output_dir.join("mod.rs")).unwrap();
println!("Generated mod.rs:\n{}", mod_rs);
assert!(mod_rs.contains("pub mod component;"));
assert!(!mod_rs.contains("pub mod mod;"));
let mod_count = mod_rs.matches("pub mod ").count();
assert_eq!(
mod_count, 1,
"Should have exactly 1 module declaration (component), got {}",
mod_count
);
}
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_nested_modules_only_declare_existing_files() {
let temp_dir = TempDir::new().unwrap();
let src_dir = temp_dir.path().join("src");
fs::create_dir(&src_dir).unwrap();
let components_dir = src_dir.join("components");
fs::create_dir(&components_dir).unwrap();
fs::write(components_dir.join("button.wj"), "pub struct Button {}").unwrap();
fs::write(components_dir.join("input.wj"), "pub struct Input {}").unwrap();
fs::write(src_dir.join("app.wj"), "pub struct App {}").unwrap();
let output_dir = temp_dir.path().join("out");
fs::create_dir(&output_dir).unwrap();
let status = std::process::Command::new(env!("CARGO_BIN_EXE_wj"))
.arg("build")
.arg(&src_dir)
.arg("-o")
.arg(&output_dir)
.arg("--target")
.arg("rust")
.arg("--module-file")
.arg("--no-cargo")
.status()
.expect("Failed to execute wj");
assert!(status.success());
let root_mod = fs::read_to_string(output_dir.join("mod.rs")).unwrap();
println!("Root mod.rs:\n{}", root_mod);
assert!(root_mod.contains("pub mod app;"), "app should be declared");
assert!(
root_mod.contains("pub mod components;"),
"components subdir should be declared"
);
let components_mod = fs::read_to_string(output_dir.join("components/mod.rs")).unwrap();
println!("\nComponents mod.rs:\n{}", components_mod);
assert!(
components_mod.contains("pub mod button;"),
"button should be declared"
);
assert!(
components_mod.contains("pub mod input;"),
"input should be declared"
);
assert!(
!components_mod.contains("pub mod mod;"),
"mod.rs should NOT declare itself"
);
}
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_empty_directory_generates_empty_mod_file() {
let temp_dir = TempDir::new().unwrap();
let src_dir = temp_dir.path().join("src");
fs::create_dir(&src_dir).unwrap();
let empty_dir = src_dir.join("empty");
fs::create_dir(&empty_dir).unwrap();
fs::write(src_dir.join("main.wj"), "fn main() {}").unwrap();
let output_dir = temp_dir.path().join("out");
fs::create_dir(&output_dir).unwrap();
let status = std::process::Command::new(env!("CARGO_BIN_EXE_wj"))
.arg("build")
.arg(&src_dir)
.arg("-o")
.arg(&output_dir)
.arg("--target")
.arg("rust")
.arg("--module-file")
.arg("--no-cargo")
.status()
.expect("Failed to execute wj");
assert!(status.success());
let empty_mod_path = output_dir.join("empty/mod.rs");
if empty_mod_path.exists() {
let empty_mod = fs::read_to_string(empty_mod_path).unwrap();
println!("Empty mod.rs:\n{}", empty_mod);
let mod_count = empty_mod.matches("pub mod ").count();
assert_eq!(
mod_count, 0,
"Empty directory should have no module declarations, got {}",
mod_count
);
}
}
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_cargo_toml_excluded_from_module_list() {
let temp_dir = TempDir::new().unwrap();
let src_dir = temp_dir.path().join("src");
fs::create_dir(&src_dir).unwrap();
fs::write(src_dir.join("button.wj"), "pub struct Button {}").unwrap();
fs::write(src_dir.join("input.wj"), "pub struct Input {}").unwrap();
let output_dir = temp_dir.path().join("out");
fs::create_dir(&output_dir).unwrap();
let status = std::process::Command::new(env!("CARGO_BIN_EXE_wj"))
.arg("build")
.arg(&src_dir)
.arg("-o")
.arg(&output_dir)
.arg("--target")
.arg("rust")
.arg("--module-file")
.arg("--no-cargo")
.status()
.expect("Failed to execute wj");
assert!(status.success());
fs::write(
output_dir.join("Cargo.toml"),
"[package]\nname = \"test\"\n\n[workspace]\n",
)
.unwrap();
let mod_rs = fs::read_to_string(output_dir.join("mod.rs")).expect("mod.rs should be generated");
assert!(
!mod_rs.contains("Cargo"),
"Cargo.toml should not appear in mod.rs"
);
assert!(
!mod_rs.contains("toml"),
"Cargo.toml should not appear in mod.rs"
);
assert!(mod_rs.contains("pub mod button;"));
assert!(mod_rs.contains("pub mod input;"));
}