#![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 std::path::PathBuf;
use std::process::Command;
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_string_borrow_inference() {
let test_file = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.join("tests")
.join("string_borrow_inference_test.wj");
let output_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.join("target")
.join("test_output")
.join("string_borrow_inference");
let _ = std::fs::remove_dir_all(&output_dir);
std::fs::create_dir_all(&output_dir).unwrap();
let output = Command::new(test_utils::wj_binary())
.args(["build"])
.arg(&test_file)
.arg("--output")
.arg(&output_dir)
.arg("--no-cargo") .output()
.expect("Failed to run compiler");
if !output.status.success() {
eprintln!(
"Compiler stderr: {}",
String::from_utf8_lossy(&output.stderr)
);
eprintln!(
"Compiler stdout: {}",
String::from_utf8_lossy(&output.stdout)
);
panic!("Compilation failed");
}
let generated_file = output_dir.join("string_borrow_inference_test.rs");
let generated_code = std::fs::read_to_string(&generated_file)
.or_else(|_| {
std::fs::read_to_string(
output_dir
.join("wj")
.join("windjammer")
.join("tests")
.join("string_borrow_inference_test.rs"),
)
})
.expect("Failed to read generated file (tried both possible paths)");
println!("Generated code:\n{}", generated_code);
assert!(
generated_code.contains("fn new")
&& generated_code.contains("String")
&& generated_code.contains("Logger"),
"new should take owned String (parameter is stored). Generated:\n{}",
generated_code
);
assert!(
generated_code.contains("fn store_path") && generated_code.contains("String"),
"store_path should take owned String (parameter is pushed). Generated:\n{}",
generated_code
);
println!("✓ String borrow inference test passed!");
}