#[cfg(test)]
mod tests {
#[test]
fn test_simple_assignment() {
let c_code = r#"
int x = 0;
x = 5;
"#;
let rust_expected = r#"
let mut x = 0;
x = 5;
"#;
assert!(c_code.contains("x = 5"));
assert!(rust_expected.contains("x = 5"));
assert!(rust_expected.contains("let mut"));
}
#[test]
fn test_assignment_type_conversion() {
let c_code = r#"
int x;
float f = 3.14;
x = f;
"#;
let rust_expected = r#"
let mut x: i32;
let f: f32 = 3.14;
x = f as i32;
"#;
assert!(c_code.contains("x = f"));
assert!(rust_expected.contains("x = f as i32"));
}
#[test]
fn test_multiple_assignments() {
let c_code = r#"
int x = 0;
x = 5;
x = 10;
x = 15;
"#;
let rust_expected = r#"
let mut x = 0;
x = 5;
x = 10;
x = 15;
"#;
assert!(c_code.contains("x = 5"));
assert!(c_code.contains("x = 10"));
assert!(c_code.contains("x = 15"));
assert!(rust_expected.contains("let mut"));
}
#[test]
fn test_assignment_from_expression() {
let c_code = r#"
int x = 0;
x = a + b * c;
"#;
let rust_expected = r#"
let mut x = 0;
x = a + b * c;
"#;
assert!(c_code.contains("x = a + b * c"));
assert!(rust_expected.contains("x = a + b * c"));
}
#[test]
fn test_assignment_from_function() {
let c_code = r#"
int x;
x = get_value();
"#;
let rust_expected = r#"
let mut x: i32;
x = get_value();
"#;
assert!(c_code.contains("x = get_value()"));
assert!(rust_expected.contains("x = get_value()"));
}
#[test]
fn test_assignment_array_element() {
let c_code = r#"
int arr[10];
arr[0] = 42;
"#;
let rust_expected = r#"
let mut arr: [i32; 10];
arr[0] = 42;
"#;
assert!(c_code.contains("arr[0] = 42"));
assert!(rust_expected.contains("arr[0] = 42"));
assert!(rust_expected.contains("let mut arr"));
}
#[test]
fn test_assignment_struct_field() {
let c_code = r#"
struct Point p;
p.x = 10;
p.y = 20;
"#;
let rust_expected = r#"
let mut p: Point;
p.x = 10;
p.y = 20;
"#;
assert!(c_code.contains("p.x = 10"));
assert!(rust_expected.contains("p.x = 10"));
assert!(rust_expected.contains("let mut p"));
}
#[test]
fn test_assignment_pointer_dereference() {
let c_code = r#"
int* ptr;
*ptr = 42;
"#;
let rust_expected = r#"
let ptr: *mut i32;
unsafe { *ptr = 42; }
"#;
assert!(c_code.contains("*ptr = 42"));
assert!(rust_expected.contains("unsafe"));
assert!(rust_expected.contains("*ptr = 42"));
}
#[test]
fn test_chained_assignment() {
let c_code = r#"
int x, y, z;
x = y = z = 5;
"#;
let rust_expected = r#"
let mut x: i32;
let mut y: i32;
let mut z: i32;
z = 5;
y = 5;
x = 5;
"#;
assert!(c_code.contains("x = y = z = 5"));
assert!(rust_expected.contains("z = 5"));
assert!(rust_expected.contains("y = 5"));
assert!(rust_expected.contains("x = 5"));
}
#[test]
fn test_assignment_in_condition() {
let c_code = r#"
int x;
if ((x = get_value()) != 0) {
process(x);
}
"#;
let rust_expected = r#"
let mut x: i32;
x = get_value();
if x != 0 {
process(x);
}
"#;
assert!(c_code.contains("(x = get_value())"));
assert!(rust_expected.contains("x = get_value();"));
assert!(rust_expected.contains("if x != 0"));
}
#[test]
fn test_self_assignment_operation() {
let c_code = r#"
int count = 0;
count = count + 1;
"#;
let rust_expected = r#"
let mut count = 0;
count = count + 1;
"#;
assert!(c_code.contains("count = count + 1"));
assert!(rust_expected.contains("count = count + 1"));
}
#[test]
fn test_const_vs_immutable() {
let c_code = r#"
const int x = 5;
// x = 10; // ERROR: cannot modify const
"#;
let rust_expected = r#"
let x = 5; // Immutable by default
// x = 10; // ERROR: cannot assign twice to immutable
"#;
assert!(c_code.contains("const int x"));
assert!(rust_expected.contains("let x"));
assert!(!rust_expected.contains("let mut"));
}
#[test]
fn test_assignment_from_ternary() {
let c_code = r#"
int max;
max = (a > b) ? a : b;
"#;
let rust_expected = r#"
let max = if a > b { a } else { b };
"#;
assert!(c_code.contains("max = (a > b) ? a : b"));
assert!(rust_expected.contains("let max = if"));
}
#[test]
fn test_assignment_negative_value() {
let c_code = r#"
int x = 0;
x = -42;
"#;
let rust_expected = r#"
let mut x = 0;
x = -42;
"#;
assert!(c_code.contains("x = -42"));
assert!(rust_expected.contains("x = -42"));
}
#[test]
fn test_assignment_return_value() {
let c_code = r#"
int x, y;
y = (x = 5); // x=5 returns 5, y becomes 5
"#;
let rust_expected = r#"
let mut x: i32;
let mut y: i32;
x = 5;
y = x; // Cannot use assignment as expression
"#;
assert!(c_code.contains("y = (x = 5)"));
assert!(rust_expected.contains("x = 5"));
assert!(rust_expected.contains("y = x"));
}
#[test]
fn test_simple_assignment_transformation_summary() {
let c_code = r#"
// Rule 1: Simple assignment (mutable by default)
int x = 0;
x = 5;
// Rule 2: Type conversion (implicit)
int i;
float f = 3.14;
i = f;
// Rule 3: Multiple assignments
x = 10;
x = 15;
// Rule 4: Assignment from expression
x = a + b;
// Rule 5: Assignment from function
x = get_value();
// Rule 6: Array element
int arr[10];
arr[0] = 42;
// Rule 7: Struct field
struct Point p;
p.x = 10;
// Rule 8: Pointer dereference
int* ptr;
*ptr = 42;
// Rule 9: Chained assignment
int a, b, c;
a = b = c = 5;
// Rule 10: Assignment in condition
if ((x = foo()) != 0) { }
// Rule 11: Self-assignment
count = count + 1;
"#;
let rust_expected = r#"
// Rule 1: Requires mut keyword
let mut x = 0;
x = 5;
// Rule 2: Explicit cast required
let mut i: i32;
let f: f32 = 3.14;
i = f as i32;
// Rule 3: Same with mut
x = 10;
x = 15;
// Rule 4: Same syntax
x = a + b;
// Rule 5: Same syntax
x = get_value();
// Rule 6: Array must be mut
let mut arr: [i32; 10];
arr[0] = 42;
// Rule 7: Struct must be mut
let mut p: Point;
p.x = 10;
// Rule 8: Unsafe required
let ptr: *mut i32;
unsafe { *ptr = 42; }
// Rule 9: Must split (cannot chain)
let mut a: i32;
let mut b: i32;
let mut c: i32;
c = 5;
b = 5;
a = 5;
// Rule 10: Must separate assignment and condition
x = foo();
if x != 0 { }
// Rule 11: Same (could use +=)
count = count + 1;
"#;
assert!(c_code.contains("int x = 0"));
assert!(rust_expected.contains("let mut x = 0"));
assert!(c_code.contains("i = f"));
assert!(rust_expected.contains("i = f as i32"));
assert!(c_code.contains("a = b = c = 5"));
assert!(rust_expected.contains("c = 5"));
assert!(rust_expected.contains("b = 5"));
assert!(c_code.contains("(x = foo())"));
assert!(rust_expected.contains("x = foo();"));
assert!(c_code.contains("*ptr = 42"));
assert!(rust_expected.contains("unsafe"));
}
}