use decy_core::transpile;
#[test]
fn test_transpile_simple_function_pointer_declaration() {
let c_code = "int (*callback)(int, int);";
let rust_code = transpile(c_code).expect("Transpilation should succeed");
assert!(
rust_code.contains("callback"),
"Should include callback variable"
);
assert!(
rust_code.contains("fn(i32, i32) -> i32"),
"Should generate Rust fn type"
);
}
#[test]
fn test_transpile_function_pointer_void_return() {
let c_code = "void (*handler)(int);";
let rust_code = transpile(c_code).expect("Transpilation should succeed");
assert!(
rust_code.contains("handler"),
"Should include handler variable"
);
assert!(
rust_code.contains("fn(i32)"),
"Should generate fn type with no return"
);
}
#[test]
fn test_transpile_function_pointer_no_params() {
let c_code = "int (*get_value)(void);";
let rust_code = transpile(c_code).expect("Transpilation should succeed");
assert!(rust_code.contains("get_value"));
assert!(
rust_code.contains("fn() -> i32"),
"Should generate fn() -> i32"
);
}
#[test]
fn test_transpile_multiple_function_pointers() {
let c_code = r#"
int (*add)(int, int);
int (*subtract)(int, int);
"#;
let rust_code = transpile(c_code).expect("Transpilation should succeed");
assert!(rust_code.contains("add"));
assert!(rust_code.contains("subtract"));
assert!(rust_code.matches("fn(i32, i32) -> i32").count() >= 2);
}
#[test]
fn test_transpile_function_pointer_with_function() {
let c_code = r#"
int add(int a, int b) {
return a + b;
}
int (*operation)(int, int);
"#;
let rust_code = transpile(c_code).expect("Transpilation should succeed");
assert!(rust_code.contains("fn add"));
assert!(rust_code.contains("operation"));
assert!(rust_code.contains("fn(i32, i32) -> i32"));
}
#[test]
fn test_transpile_function_pointer_typedef() {
let c_code = "typedef int (*Callback)(int, int);";
let rust_code = transpile(c_code).expect("Transpilation should succeed");
assert!(rust_code.contains("type Callback"));
assert!(rust_code.contains("fn(i32, i32) -> i32"));
}
#[test]
fn test_transpile_struct_with_function_pointer_field() {
let c_code = r#"
struct Handler {
void (*on_event)(int);
};
"#;
let rust_code = transpile(c_code).expect("Transpilation should succeed");
assert!(rust_code.contains("struct Handler"));
assert!(rust_code.contains("on_event"));
assert!(rust_code.contains("fn(i32)"));
}
#[test]
fn test_transpile_callback_pattern() {
let c_code = r#"
typedef void (*EventCallback)(int);
struct EventHandler {
EventCallback callback;
};
"#;
let rust_code = transpile(c_code).expect("Transpilation should succeed");
assert!(rust_code.contains("type EventCallback"));
assert!(rust_code.contains("struct EventHandler"));
assert!(rust_code.contains("callback"));
}
#[test]
fn test_transpile_function_pointer_with_pointer_params() {
let c_code = "void (*process)(int*, char*);";
let rust_code = transpile(c_code).expect("Transpilation should succeed");
assert!(rust_code.contains("process"));
assert!(rust_code.contains("fn("));
}