#![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_string_literal_in_qualified_call_no_to_string() {
let temp_dir = TempDir::new().unwrap();
let draw_source = r#"
pub fn draw_text(text: string, x: f32, y: f32) {
println!("{} at ({}, {})", text, x, y)
}
"#;
let game_source = r#"
use crate::draw
pub struct Game {
pub active: bool,
}
impl Game {
pub fn render(self) {
draw::draw_text("HELLO WORLD", 100.0, 200.0)
}
}
"#;
let src_dir = temp_dir.path().join("src");
fs::create_dir_all(&src_dir).unwrap();
fs::write(src_dir.join("draw.wj"), draw_source).unwrap();
fs::write(src_dir.join("game.wj"), game_source).unwrap();
let wj_output = Command::new(env!("CARGO_BIN_EXE_wj"))
.arg("build")
.arg("--no-cargo")
.arg("src/")
.current_dir(temp_dir.path())
.output()
.expect("Failed to execute wj compiler");
if !wj_output.status.success() {
panic!(
"Compilation failed:\nstdout:\n{}\nstderr:\n{}",
String::from_utf8_lossy(&wj_output.stdout),
String::from_utf8_lossy(&wj_output.stderr)
);
}
let game_rs = temp_dir.path().join("build").join("game.rs");
let generated = fs::read_to_string(&game_rs).unwrap_or_else(|_| {
panic!(
"Failed to read generated game.rs. Build output:\n{}",
String::from_utf8_lossy(&wj_output.stdout)
)
});
assert!(
!generated.contains(r#""HELLO WORLD".to_string()"#),
"String literal should NOT get .to_string() for borrowed string param.\nGenerated:\n{}",
generated
);
assert!(
generated.contains(r#""HELLO WORLD""#),
"string literal should be passed directly.\nGenerated:\n{}",
generated
);
}
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_single_file_qualified_call_with_conflicting_metadata() {
let temp_dir = TempDir::new().unwrap();
let game_source = r#"
use crate::draw
pub fn render() {
draw::draw_text("HELLO", 100.0, 200.0)
}
"#;
let conflicting_meta = r#"{
"module_path": "rendering_api",
"functions": {
"draw_text": {
"params": ["string", "Custom(\"f32\")", "Custom(\"f32\")"],
"return_type": null,
"is_associated": false,
"parent_type": null,
"param_ownership": ["Owned", "Owned", "Owned"],
"has_self_receiver": false
}
},
"structs": {},
"trait_impls": {},
"copy_structs": [],
"version": "0.46.0"
}"#;
let src_dir = temp_dir.path().join("src");
fs::create_dir_all(&src_dir).unwrap();
fs::write(src_dir.join("game.wj"), game_source).unwrap();
fs::write(src_dir.join("rendering_api.wj.meta"), conflicting_meta).unwrap();
let wj_output = Command::new(env!("CARGO_BIN_EXE_wj"))
.arg("build")
.arg("--no-cargo")
.arg("src/game.wj")
.current_dir(temp_dir.path())
.output()
.expect("Failed to execute wj compiler");
if !wj_output.status.success() {
panic!(
"Compilation failed:\nstdout:\n{}\nstderr:\n{}",
String::from_utf8_lossy(&wj_output.stdout),
String::from_utf8_lossy(&wj_output.stderr)
);
}
let game_rs = temp_dir.path().join("build").join("game.rs");
let generated =
fs::read_to_string(&game_rs).unwrap_or_else(|_| panic!("Failed to read generated game.rs"));
assert!(
!generated.contains(r#""HELLO".to_string()"#),
"String literal should NOT get .to_string() from wrong module's metadata.\n\
The simple-name fallback 'draw_text' matched rendering_api's signature (Owned),\n\
but the call is draw::draw_text which is a different module.\n\
Generated:\n{}",
generated
);
}
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_string_literal_in_type_qualified_call_with_owned_param() {
let temp_dir = TempDir::new().unwrap();
let source = r#"
pub struct Label {
pub text: string,
}
impl Label {
pub fn new(text: string) -> Label {
Label { text: text }
}
}
pub fn make_label() -> Label {
Label::new("Hello")
}
"#;
let src_dir = temp_dir.path().join("src");
fs::create_dir_all(&src_dir).unwrap();
fs::write(src_dir.join("label.wj"), source).unwrap();
let wj_output = Command::new(env!("CARGO_BIN_EXE_wj"))
.arg("build")
.arg("--no-cargo")
.arg("src/")
.current_dir(temp_dir.path())
.output()
.expect("Failed to execute wj compiler");
if !wj_output.status.success() {
panic!(
"Compilation failed:\nstdout:\n{}\nstderr:\n{}",
String::from_utf8_lossy(&wj_output.stdout),
String::from_utf8_lossy(&wj_output.stderr)
);
}
let label_rs = temp_dir.path().join("build").join("label.rs");
let generated = fs::read_to_string(&label_rs)
.unwrap_or_else(|_| panic!("Failed to read generated label.rs"));
assert!(
generated.contains(r#"Label::new("Hello")"#),
"String literal should pass as &str for struct-literal-stored param.\nGenerated:\n{}",
generated
);
}