use decy_core::transpile;
#[test]
fn test_multiply_with_recursive_call() {
let c_code = r#"
int rec(int n) {
return n * rec(n - 1);
}
"#;
let result = transpile(c_code);
assert!(result.is_ok(), "Transpilation failed: {:?}", result.err());
let rust_code = result.unwrap();
assert!(
rust_code.contains("n * rec(n - 1)")
|| rust_code.contains("n * rec(n-1)")
|| rust_code.contains("* rec("),
"DECY-116 BUG: Multiply operator converted to subtract!\nExpected: n * rec(n - 1)\nGot: {}",
rust_code
);
assert!(
!rust_code.contains("n - rec(n - 1)"),
"DECY-116 BUG: Found incorrect subtraction instead of multiplication!\nGot: {}",
rust_code
);
}
#[test]
fn test_factorial_multiply_preserved() {
let c_code = r#"
int factorial(int n) {
if (n <= 1) {
return 1;
}
return n * factorial(n - 1);
}
"#;
let result = transpile(c_code);
assert!(result.is_ok(), "Transpilation failed: {:?}", result.err());
let rust_code = result.unwrap();
assert!(
rust_code.contains("* factorial("),
"DECY-116 BUG: Factorial multiply not preserved!\nGot: {}",
rust_code
);
assert!(
!rust_code.contains("n - factorial("),
"DECY-116 BUG: Multiply incorrectly became subtract!\nGot: {}",
rust_code
);
}
#[test]
fn test_multiply_with_function_call_subtraction_arg() {
let c_code = r#"
int func(int x) {
return x;
}
int test(int a, int b) {
return a * func(b - 1);
}
"#;
let result = transpile(c_code);
assert!(result.is_ok(), "Transpilation failed: {:?}", result.err());
let rust_code = result.unwrap();
assert!(
rust_code.contains("a * func(") || rust_code.contains("* func("),
"DECY-116 BUG: Multiply with function call not preserved!\nGot: {}",
rust_code
);
}
#[test]
fn test_chained_multiply_with_calls() {
let c_code = r#"
int double_it(int x) {
return x * 2;
}
int compute(int a, int b, int c) {
return a * double_it(b) * double_it(c);
}
"#;
let result = transpile(c_code);
assert!(result.is_ok(), "Transpilation failed: {:?}", result.err());
let rust_code = result.unwrap();
let multiply_count = rust_code.matches(" * ").count() + rust_code.matches("a *").count();
assert!(
multiply_count >= 2,
"Expected at least 2 multiply operators in chained expression!\nGot {} in: {}",
multiply_count,
rust_code
);
}
#[test]
fn test_simple_multiply_preserved() {
let c_code = r#"
int mul(int a, int b) {
return a * b;
}
"#;
let result = transpile(c_code);
assert!(result.is_ok(), "Transpilation failed: {:?}", result.err());
let rust_code = result.unwrap();
assert!(
rust_code.contains("a * b"),
"Simple multiply should work!\nGot: {}",
rust_code
);
}
#[test]
fn test_multiply_with_variable_from_subtraction() {
let c_code = r#"
int factorial(int n) {
if (n <= 1) {
return 1;
}
int sub = factorial(n - 1);
return n * sub;
}
"#;
let result = transpile(c_code);
assert!(result.is_ok(), "Transpilation failed: {:?}", result.err());
let rust_code = result.unwrap();
assert!(
rust_code.contains("n * sub") || rust_code.contains("* sub"),
"Multiply with intermediate variable should work!\nGot: {}",
rust_code
);
}
#[test]
fn test_multiply_with_addition_in_func_arg() {
let c_code = r#"
int func(int x) {
return x;
}
int test(int a, int b) {
return a * func(b + 1);
}
"#;
let result = transpile(c_code);
assert!(result.is_ok(), "Transpilation failed: {:?}", result.err());
let rust_code = result.unwrap();
assert!(
rust_code.contains("* func("),
"Multiply with addition in func arg should work!\nGot: {}",
rust_code
);
}