#![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",
))]
#[path = "common/test_utils.rs"]
mod test_utils;
use anyhow::Result;
use std::fs;
use std::process::Command;
use tempfile::tempdir;
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_lib_module_no_conflict() -> Result<()> {
let temp_dir = tempdir().expect("tempdir").path().to_path_buf();
fs::create_dir_all(&temp_dir)?;
let src_dir = temp_dir.join("src");
fs::create_dir_all(&src_dir)?;
let lib_wj = src_dir.join("lib.wj");
fs::write(
&lib_wj,
r#"
struct LibConfig {
name: string,
version: i32,
}
impl LibConfig {
fn new(name: string) -> LibConfig {
LibConfig {
name: name,
version: 1,
}
}
}
"#,
)?;
let math_wj = src_dir.join("math.wj");
fs::write(
&math_wj,
r#"
fn add(a: i32, b: i32) -> i32 {
a + b
}
"#,
)?;
let wj_compiler = test_utils::wj_binary();
let lib_output = temp_dir.join("lib");
fs::create_dir_all(&lib_output)?;
let output = Command::new(&wj_compiler)
.arg("build")
.arg(&src_dir)
.arg("-o")
.arg(&lib_output)
.arg("--library")
.arg("--no-cargo")
.output()?;
let _stderr = String::from_utf8_lossy(&output.stderr);
let _stdout = String::from_utf8_lossy(&output.stdout);
let lib_rs_path = lib_output.join("lib.rs");
if lib_rs_path.exists() {
let lib_rs_content = fs::read_to_string(&lib_rs_path)?;
assert!(
!lib_rs_content.contains("pub mod lib;"),
"Generated lib.rs should NOT contain 'pub mod lib;' - this creates E0761 conflict.\nlib.rs content:\n{}",
lib_rs_content
);
println!("✓ lib.rs does not contain 'pub mod lib;' - correct!");
} else {
panic!("lib.rs was not generated at {:?}", lib_rs_path);
}
let _ = fs::remove_dir_all(&temp_dir);
Ok(())
}
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_window_module_no_conflict() -> Result<()> {
let temp_dir = tempdir().expect("tempdir").path().to_path_buf();
fs::create_dir_all(&temp_dir)?;
let src_dir = temp_dir.join("src");
fs::create_dir_all(&src_dir)?;
let window_wj = src_dir.join("window.wj");
fs::write(
&window_wj,
r#"
struct Window {
title: string,
width: i32,
height: i32,
}
"#,
)?;
let window_dir = src_dir.join("window");
fs::create_dir_all(&window_dir)?;
let window_manager_wj = window_dir.join("manager.wj");
fs::write(
&window_manager_wj,
r#"
struct WindowManager {
windows: Vec<i32>,
}
"#,
)?;
let tests_wj_dir = temp_dir.join("tests_wj");
fs::create_dir_all(&tests_wj_dir)?;
let test_wj = tests_wj_dir.join("window_test.wj");
fs::write(
&test_wj,
r#"
@test
fn test_window_module() {
// This test should compile without E0761 errors
assert!(true);
}
"#,
)?;
let wj_toml = temp_dir.join("wj.toml");
fs::write(
&wj_toml,
r#"
[package]
name = "test_window_conflict"
version = "0.1.0"
[dependencies]
"#,
)?;
let wj_compiler = test_utils::wj_binary();
let output = Command::new(&wj_compiler)
.arg("test")
.arg(&test_wj)
.current_dir(&temp_dir)
.output()?;
let _ = fs::remove_dir_all(&temp_dir);
let stderr = String::from_utf8_lossy(&output.stderr);
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(
!stderr.contains("file for module `window` found at both") && !stdout.contains("file for module `window` found at both"),
"Test framework should not create window module conflicts. Found conflict error:\nSTDOUT:\n{}\nSTDERR:\n{}",
stdout,
stderr
);
Ok(())
}