#[cfg(test)]
mod tests {
#[test]
fn test_simple_variable_identifier() {
let c_code = r#"
int x = 5;
y = x;
"#;
let rust_expected = r#"
let x: i32 = 5;
y = x;
"#;
assert!(c_code.contains("x"));
assert!(rust_expected.contains("x"));
}
#[test]
fn test_function_identifier() {
let c_code = r#"
int result = calculate(x);
"#;
let rust_expected = r#"
let result = calculate(x);
"#;
assert!(c_code.contains("calculate"));
assert!(rust_expected.contains("calculate"));
}
#[test]
fn test_identifier_in_expression() {
let c_code = r#"
result = x + y * z;
"#;
let rust_expected = r#"
result = x + y * z;
"#;
assert!(c_code.contains("x + y * z"));
assert!(rust_expected.contains("x + y * z"));
}
#[test]
fn test_identifier_shadowing() {
let c_code = r#"
int x = 5;
{
int x = 10;
printf("%d\n", x);
}
"#;
let rust_expected = r#"
let x = 5;
{
let x = 10;
println!("{}", x);
}
"#;
assert!(c_code.contains("int x = 5"));
assert!(c_code.contains("int x = 10"));
assert!(rust_expected.contains("let x = 5"));
assert!(rust_expected.contains("let x = 10"));
}
#[test]
fn test_identifier_naming_convention() {
let c_code = r#"
int myVariable = 5;
"#;
let rust_expected = r#"
let my_variable: i32 = 5;
"#;
assert!(c_code.contains("myVariable"));
assert!(rust_expected.contains("my_variable"));
}
#[test]
fn test_constant_identifier() {
let c_code = r#"
#define MAX_SIZE 100
int arr[MAX_SIZE];
"#;
let rust_expected = r#"
const MAX_SIZE: usize = 100;
let arr: [i32; MAX_SIZE];
"#;
assert!(c_code.contains("MAX_SIZE"));
assert!(rust_expected.contains("MAX_SIZE"));
}
#[test]
fn test_parameter_identifier() {
let c_code = r#"
int add(int a, int b) {
return a + b;
}
"#;
let rust_expected = r#"
fn add(a: i32, b: i32) -> i32 {
a + b
}
"#;
assert!(c_code.contains("a + b"));
assert!(rust_expected.contains("a + b"));
}
#[test]
fn test_struct_field_identifier() {
let c_code = r#"
point.x = 10;
int y = point.y;
"#;
let rust_expected = r#"
point.x = 10;
let y = point.y;
"#;
assert!(c_code.contains("point.x"));
assert!(c_code.contains("point.y"));
assert!(rust_expected.contains("point.x"));
assert!(rust_expected.contains("point.y"));
}
#[test]
fn test_array_identifier() {
let c_code = r#"
arr[i] = 42;
int val = arr[j];
"#;
let rust_expected = r#"
arr[i] = 42;
let val = arr[j];
"#;
assert!(c_code.contains("arr[i]"));
assert!(c_code.contains("arr[j]"));
assert!(rust_expected.contains("arr[i]"));
assert!(rust_expected.contains("arr[j]"));
}
#[test]
fn test_pointer_identifier() {
let c_code = r#"
int* ptr;
int x = *ptr;
"#;
let rust_expected = r#"
let ptr: &i32;
let x = *ptr;
"#;
assert!(c_code.contains("*ptr"));
assert!(rust_expected.contains("*ptr"));
}
#[test]
fn test_identifier_in_condition() {
let c_code = r#"
if (x > 0) {
return x;
}
"#;
let rust_expected = r#"
if x > 0 {
return x;
}
"#;
assert!(c_code.contains("if (x > 0)"));
assert!(rust_expected.contains("if x > 0"));
}
#[test]
fn test_identifier_in_loop() {
let c_code = r#"
for (int i = 0; i < n; i++) {
sum += i;
}
"#;
let rust_expected = r#"
for i in 0..n {
sum += i;
}
"#;
assert!(c_code.contains("sum += i"));
assert!(rust_expected.contains("sum += i"));
}
#[test]
fn test_global_identifier() {
let c_code = r#"
int global_counter = 0;
void increment() {
global_counter++;
}
"#;
let rust_expected = r#"
static mut GLOBAL_COUNTER: i32 = 0;
fn increment() {
unsafe {
GLOBAL_COUNTER += 1;
}
}
"#;
assert!(c_code.contains("global_counter"));
assert!(rust_expected.contains("GLOBAL_COUNTER"));
}
#[test]
fn test_typedef_identifier() {
let c_code = r#"
typedef int Integer;
Integer x = 5;
"#;
let rust_expected = r#"
type Integer = i32;
let x: Integer = 5;
"#;
assert!(c_code.contains("Integer x"));
assert!(rust_expected.contains("x: Integer"));
}
#[test]
fn test_enum_identifier() {
let c_code = r#"
enum Color { RED, GREEN, BLUE };
enum Color c = RED;
"#;
let rust_expected = r#"
enum Color { Red, Green, Blue }
let c = Color::Red;
"#;
assert!(c_code.contains("RED"));
assert!(rust_expected.contains("Red"));
}
#[test]
fn test_raw_identifier() {
let c_note = "C cannot use keywords as identifiers";
let rust_code = r#"
let r#type = "string";
let r#match = 5;
"#;
assert!(c_note.contains("cannot"));
assert!(rust_code.contains("r#type"));
assert!(rust_code.contains("r#match"));
}
#[test]
fn test_identifier_transformation_summary() {
let c_code = r#"
// Rule 1: Simple variable identifier (same)
int x = 5;
y = x;
// Rule 2: Function identifier (same)
result = calculate(x);
// Rule 3: In expression (same)
result = x + y * z;
// Rule 4: Shadowing (allowed in both)
int a = 5;
{ int a = 10; }
// Rule 5: Naming convention (camelCase → snake_case)
int myVariable = 5;
// Rule 6: Constants (SCREAMING_SNAKE_CASE)
#define MAX_SIZE 100
// Rule 7: Parameters (same)
int add(int a, int b) { return a + b; }
// Rule 8: Struct fields (same)
point.x = 10;
// Rule 9: Array subscript (same)
arr[i] = 42;
// Rule 10: Pointer dereference (same)
int x = *ptr;
// Rule 11: In condition (same)
if (x > 0) { return x; }
// Rule 12: In loop (different syntax)
for (int i = 0; i < n; i++) { sum += i; }
// Rule 13: Global (static mut, unsafe)
int global_counter = 0;
// Rule 14: Typedef (type alias)
typedef int Integer;
// Rule 15: Enum (qualified path)
enum Color { RED };
"#;
let rust_expected = r#"
// Rule 1: Same
let x: i32 = 5;
y = x;
// Rule 2: Same
let result = calculate(x);
// Rule 3: Same
result = x + y * z;
// Rule 4: Shadowing allowed
let a = 5;
{ let a = 10; }
// Rule 5: snake_case
let my_variable: i32 = 5;
// Rule 6: SCREAMING_SNAKE_CASE
const MAX_SIZE: usize = 100;
// Rule 7: Same
fn add(a: i32, b: i32) -> i32 { a + b }
// Rule 8: Same
point.x = 10;
// Rule 9: Same
arr[i] = 42;
// Rule 10: Same dereference
let x = *ptr;
// Rule 11: Same usage
if x > 0 { return x; }
// Rule 12: Different loop syntax
for i in 0..n { sum += i; }
// Rule 13: static mut, unsafe
static mut GLOBAL_COUNTER: i32 = 0;
// Rule 14: type alias
type Integer = i32;
// Rule 15: Qualified path
enum Color { Red }
"#;
assert!(c_code.contains("int x = 5"));
assert!(rust_expected.contains("let x: i32 = 5"));
assert!(c_code.contains("myVariable"));
assert!(rust_expected.contains("my_variable"));
assert!(c_code.contains("MAX_SIZE"));
assert!(rust_expected.contains("MAX_SIZE"));
assert!(c_code.contains("global_counter"));
assert!(rust_expected.contains("GLOBAL_COUNTER"));
}
}