use decy_core::transpile;
#[test]
fn test_simple_main_function() {
let c_code = r#"
int main() {
return 0;
}
"#;
let result = transpile(c_code);
assert!(result.is_ok(), "Transpilation failed: {:?}", result.err());
let rust_code = result.unwrap();
assert!(
rust_code.contains("fn main") || rust_code.contains("main"),
"Expected main function, got: {}",
&rust_code[..rust_code.len().min(200)]
);
}
#[test]
fn test_simple_variable_declaration() {
let c_code = r#"
int main() {
int x = 42;
return x;
}
"#;
let result = transpile(c_code);
assert!(result.is_ok(), "Transpilation failed: {:?}", result.err());
let rust_code = result.unwrap();
assert!(
rust_code.contains("let x") || rust_code.contains("x:") || rust_code.contains("42"),
"Expected variable declaration or value 42, got: {}",
rust_code
);
assert!(
rust_code.contains("i32") || rust_code.contains("42") || rust_code.contains("exit"),
"Expected type annotation, value, or exit call, got: {}",
rust_code
);
}
#[test]
fn test_simple_arithmetic() {
let c_code = r#"
int add(int a, int b) {
return a + b;
}
int main() {
int result = add(10, 20);
return result;
}
"#;
let result = transpile(c_code);
assert!(result.is_ok(), "Transpilation failed: {:?}", result.err());
let rust_code = result.unwrap();
assert!(rust_code.contains("fn add"), "Expected function definition, got: {}", rust_code);
assert!(
rust_code.contains("a") && rust_code.contains("b"),
"Expected parameters, got: {}",
rust_code
);
assert!(
rust_code.contains("+ b") || rust_code.contains("a +"),
"Expected addition operation, got: {}",
rust_code
);
}
#[test]
fn test_if_statement() {
let c_code = r#"
int main() {
int x = 10;
if (x > 5) {
return 1;
}
return 0;
}
"#;
let result = transpile(c_code);
assert!(result.is_ok(), "Transpilation failed: {:?}", result.err());
let rust_code = result.unwrap();
assert!(rust_code.contains("if"), "Expected if statement, got: {}", rust_code);
assert!(
rust_code.contains("> 5") || rust_code.contains("x >"),
"Expected comparison, got: {}",
rust_code
);
}
#[test]
fn test_for_loop() {
let c_code = r#"
int main() {
int sum = 0;
for (int i = 0; i < 10; i++) {
sum = sum + i;
}
return sum;
}
"#;
let result = transpile(c_code);
assert!(result.is_ok(), "Transpilation failed: {:?}", result.err());
let rust_code = result.unwrap();
assert!(
rust_code.contains("for") || rust_code.contains("loop") || rust_code.contains("while"),
"Expected loop construct, got: {}",
rust_code
);
}
#[test]
fn test_printf_transformation() {
let c_code = r#"
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
"#;
let result = transpile(c_code);
assert!(result.is_ok(), "Transpilation failed: {:?}", result.err());
let rust_code = result.unwrap();
assert!(
rust_code.contains("println!")
|| rust_code.contains("print!")
|| rust_code.contains("printf"),
"Expected println! macro or printf function, got: {}",
&rust_code[..rust_code.len().min(500)]
);
assert!(!rust_code.is_empty(), "Transpiled code should not be empty");
}
#[test]
fn test_multiple_functions() {
let c_code = r#"
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
int main() {
int x = add(10, 5);
int y = subtract(10, 5);
return x + y;
}
"#;
let result = transpile(c_code);
assert!(result.is_ok(), "Transpilation failed: {:?}", result.err());
let rust_code = result.unwrap();
assert!(rust_code.contains("fn add"), "Expected add function, got: {}", rust_code);
assert!(rust_code.contains("fn subtract"), "Expected subtract function, got: {}", rust_code);
assert!(rust_code.contains("fn main"), "Expected main function, got: {}", rust_code);
}
#[test]
fn test_integration_summary() {
let foundation_tests = 8;
let target_tests = 50;
let coverage_percent = (foundation_tests as f64 / target_tests as f64) * 100.0;
assert!(
coverage_percent >= 10.0,
"Integration test coverage too low: {}% (target: 100%)",
coverage_percent
);
println!(
"Integration Test Progress: {}/{} tests ({:.1}%)",
foundation_tests, target_tests, coverage_percent
);
}
#[test]
fn test_decy190_function_declaration_and_definition_no_duplicate() {
let c_code = r#"
int power(int m, int n);
int main() {
return power(2, 3);
}
int power(int base, int n) {
int result = 1;
int i;
for (i = 0; i < n; i++)
result = result * base;
return result;
}
"#;
let result = transpile(c_code);
assert!(result.is_ok(), "Transpilation failed: {:?}", result.err());
let rust_code = result.unwrap();
let power_count = rust_code.matches("fn power").count();
assert_eq!(
power_count, 1,
"DECY-190: Expected exactly 1 'fn power' definition, found {}. \
Function declaration should not generate a separate stub.\n\
Generated code:\n{}",
power_count, rust_code
);
}