#![cfg(any(
not(any(
feature = "parser_tests",
feature = "analyzer_tests",
feature = "codegen_tests",
feature = "interpreter_tests",
feature = "conformance_tests",
feature = "integration_tests",
)),
feature = "codegen_tests",
))]
use std::fs;
use std::process::Command;
use tempfile::TempDir;
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_method_calls_in_if_blocks() {
let temp_dir = TempDir::new().unwrap();
let test_file = temp_dir.path().join("test.wj");
fs::write(
&test_file,
r#"fn test_if_method_calls() -> string {
let mut json = "{"
let pretty = true
if pretty {
json.push_str("\n ")
}
json.push_str("test")
json
}
"#,
)
.unwrap();
let wj_binary = std::env::current_exe()
.unwrap()
.parent()
.unwrap()
.parent()
.unwrap()
.join("wj");
let output = Command::new(&wj_binary)
.args(["build", test_file.to_str().unwrap(), "--no-cargo"])
.current_dir(temp_dir.path())
.output()
.expect("Failed to run wj build");
if !output.status.success() {
eprintln!("STDOUT: {}", String::from_utf8_lossy(&output.stdout));
eprintln!("STDERR: {}", String::from_utf8_lossy(&output.stderr));
panic!("wj build failed");
}
let rust_file = temp_dir.path().join("build/test.rs");
let rust_code = fs::read_to_string(&rust_file).expect("Failed to read generated Rust");
println!("Generated Rust code:\n{}", rust_code);
assert!(
!rust_code.contains("json::push_str"),
"BUG FOUND! Generated code uses json::push_str (module syntax) instead of json.push_str (method call). \
This happens when method calls are inside if blocks without semicolons.\n\
Generated code:\n{}",
rust_code
);
assert!(
rust_code.contains("json.push_str"),
"Method calls should use dot syntax"
);
}