#![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_parent_file_with_submodules_not_copied() {
let temp_dir = TempDir::new().unwrap();
let project = temp_dir.path();
let src = project.join("src");
let output = project.join("out");
fs::create_dir_all(&src).unwrap();
fs::create_dir_all(&output).unwrap();
fs::write(
src.join("events.rs"),
"pub mod dispatcher;\npub use dispatcher::ComponentEventDispatcher;",
)
.unwrap();
let events_dir = src.join("events");
fs::create_dir_all(&events_dir).unwrap();
fs::write(
events_dir.join("dispatcher.rs"),
"pub struct ComponentEventDispatcher {}",
)
.unwrap();
fs::write(src.join("button.wj"), "pub struct Button {}").unwrap();
fs::write(src.join("input.wj"), "pub struct Input {}").unwrap();
let status = std::process::Command::new(env!("CARGO_BIN_EXE_wj"))
.arg("build")
.arg(&src)
.arg("-o")
.arg(&output)
.arg("--target")
.arg("rust")
.arg("--no-cargo")
.current_dir(project)
.status()
.expect("Failed to execute wj");
assert!(status.success());
let events_rs_copied = output.join("events.rs");
assert!(
!events_rs_copied.exists(),
"events.rs should NOT be copied (has subdirectory)"
);
let events_dir_copied = output.join("events");
assert!(
!events_dir_copied.exists(),
"events/ directory should NOT be copied (module parent tree)"
);
let mod_rs = output.join("mod.rs");
if mod_rs.exists() {
let mod_content = fs::read_to_string(&mod_rs).unwrap();
assert!(
!mod_content.contains("pub mod events;"),
"mod.rs should NOT declare events (module parent with subdirectory)"
);
}
}
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_simple_rs_file_without_subdirectory_is_copied() {
let temp_dir = TempDir::new().unwrap();
let project = temp_dir.path();
let src = project.join("src");
let output = project.join("out");
fs::create_dir_all(&src).unwrap();
fs::create_dir_all(&output).unwrap();
fs::write(src.join("utils.rs"), "pub fn helper() {}").unwrap();
fs::write(src.join("button.wj"), "pub struct Button {}").unwrap();
fs::write(src.join("input.wj"), "pub struct Input {}").unwrap();
let status = std::process::Command::new(env!("CARGO_BIN_EXE_wj"))
.arg("build")
.arg(&src)
.arg("-o")
.arg(&output)
.arg("--target")
.arg("rust")
.arg("--no-cargo")
.current_dir(project)
.status()
.expect("Failed to execute wj");
assert!(status.success());
let utils_rs_copied = output.join("utils.rs");
assert!(
utils_rs_copied.exists(),
"utils.rs SHOULD be copied (no subdirectory)"
);
let mod_rs = output.join("mod.rs");
if mod_rs.exists() {
let mod_content = fs::read_to_string(&mod_rs).unwrap();
assert!(
mod_content.contains("pub mod utils;"),
"mod.rs SHOULD declare utils (simple file)"
);
}
}
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_directory_with_mod_rs_not_copied() {
let temp_dir = TempDir::new().unwrap();
let project = temp_dir.path();
let src = project.join("src");
let output = project.join("out");
fs::create_dir_all(&src).unwrap();
fs::create_dir_all(&output).unwrap();
let ffi_dir = src.join("ffi");
fs::create_dir_all(&ffi_dir).unwrap();
fs::write(ffi_dir.join("mod.rs"), "pub fn ffi_call() {}").unwrap();
fs::write(src.join("button.wj"), "pub struct Button {}").unwrap();
fs::write(src.join("input.wj"), "pub struct Input {}").unwrap();
let status = std::process::Command::new(env!("CARGO_BIN_EXE_wj"))
.arg("build")
.arg(&src)
.arg("-o")
.arg(&output)
.arg("--target")
.arg("rust")
.arg("--no-cargo")
.current_dir(project)
.status()
.expect("Failed to execute wj");
assert!(status.success());
let ffi_dir_copied = output.join("ffi");
assert!(
ffi_dir_copied.exists(),
"ffi/ directory SHOULD be copied (FFI module with mod.rs)"
);
let mod_rs = output.join("mod.rs");
if mod_rs.exists() {
let mod_content = fs::read_to_string(&mod_rs).unwrap();
assert!(
mod_content.contains("pub mod ffi;"),
"mod.rs SHOULD declare ffi (directory module)"
);
}
}
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_edge_case_both_file_and_directory() {
let temp_dir = TempDir::new().unwrap();
let project = temp_dir.path();
let src = project.join("src");
let output = project.join("out");
fs::create_dir_all(&src).unwrap();
fs::create_dir_all(&output).unwrap();
fs::write(
src.join("config.rs"),
"pub mod settings;\npub use settings::*;",
)
.unwrap();
let config_dir = src.join("config");
fs::create_dir_all(&config_dir).unwrap();
fs::write(config_dir.join("settings.rs"), "pub struct Settings {}").unwrap();
fs::write(src.join("button.wj"), "pub struct Button {}").unwrap();
fs::write(src.join("input.wj"), "pub struct Input {}").unwrap();
let status = std::process::Command::new(env!("CARGO_BIN_EXE_wj"))
.arg("build")
.arg(&src)
.arg("-o")
.arg(&output)
.arg("--target")
.arg("rust")
.arg("--no-cargo")
.current_dir(project)
.status()
.expect("Failed to execute wj");
assert!(status.success());
let config_rs_copied = output.join("config.rs");
assert!(
!config_rs_copied.exists(),
"config.rs should NOT be copied (module parent with subdirectory)"
);
let config_dir_copied = output.join("config");
assert!(
!config_dir_copied.exists(),
"config/ directory should NOT be copied (module parent tree)"
);
}