use decy_core::transpile;
#[test]
fn test_call_site_array_to_slice() {
let c_code = r#"
int sum_array(int* arr, int len) {
int sum = 0;
for (int i = 0; i < len; i++) {
sum = sum + arr[i];
}
return sum;
}
int main() {
int nums[5];
nums[0] = 1;
nums[1] = 2;
nums[2] = 3;
nums[3] = 4;
nums[4] = 5;
int result = sum_array(nums, 5);
return result;
}
"#;
let result = transpile(c_code).expect("Transpilation should succeed");
println!("Generated Rust code:\n{}", result);
assert!(
result.contains("arr: &[i32]") || result.contains("arr: &mut [i32]"),
"Function should take slice param\nGenerated:\n{}",
result
);
assert!(
!result.contains("sum_array(nums, 5)") && !result.contains("sum_array(mut nums, 5)"),
"Call site should NOT have (array, len) syntax\nGenerated:\n{}",
result
);
assert!(
result.contains("sum_array(&nums)") || result.contains("sum_array(&mut nums)"),
"Call site should pass &nums or &mut nums\nGenerated:\n{}",
result
);
}
#[test]
fn test_call_site_slice_compiles() {
let c_code = r#"
int sum_array(int* arr, int len) {
int sum = 0;
for (int i = 0; i < len; i++) {
sum = sum + arr[i];
}
return sum;
}
int main() {
int nums[5];
int result = sum_array(nums, 5);
return result;
}
"#;
let result = transpile(c_code).expect("Transpilation should succeed");
println!("Generated Rust code:\n{}", result);
use std::process::Command;
let temp_dir = tempfile::tempdir().expect("Failed to create temp dir");
let temp_file_path = temp_dir.path().join("test_code.rs");
std::fs::write(&temp_file_path, format!("#![allow(unused)]\n{}", result))
.expect("Failed to write temp file");
let output = Command::new("rustc")
.arg("--emit=metadata")
.arg("--crate-type=lib")
.arg("--crate-name=decy_test")
.arg("--out-dir")
.arg(temp_dir.path())
.arg(&temp_file_path)
.output()
.expect("Failed to run rustc");
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
output.status.success(),
"Generated code should compile:\n{}\n\nStderr:\n{}",
result,
stderr
);
}
#[test]
fn test_multiple_slice_calls() {
let c_code = r#"
int sum(int* arr, int n) {
int total = 0;
for (int i = 0; i < n; i++) {
total = total + arr[i];
}
return total;
}
int max(int* arr, int n) {
int m = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] > m) {
m = arr[i];
}
}
return m;
}
int main() {
int data[3];
data[0] = 10;
data[1] = 20;
data[2] = 30;
int s = sum(data, 3);
int m = max(data, 3);
return s + m;
}
"#;
let result = transpile(c_code).expect("Transpilation should succeed");
println!("Generated Rust code:\n{}", result);
assert!(
result.contains("sum(&data)") || result.contains("sum(&mut data)"),
"sum call should pass slice\nGenerated:\n{}",
result
);
assert!(
result.contains("max(&data)") || result.contains("max(&mut data)"),
"max call should pass slice\nGenerated:\n{}",
result
);
}