#[cfg(test)]
mod tests {
#[test]
fn test_addition_assignment() {
let c_code = r#"
int count = 0;
count += 5;
"#;
let rust_expected = r#"
let mut count = 0;
count += 5;
"#;
assert!(c_code.contains("count += 5"));
assert!(rust_expected.contains("count += 5"));
assert!(rust_expected.contains("let mut count"));
}
#[test]
fn test_subtraction_assignment() {
let c_code = r#"
int balance = 100;
balance -= 25;
"#;
let rust_expected = r#"
let mut balance = 100;
balance -= 25;
"#;
assert!(c_code.contains("balance -= 25"));
assert!(rust_expected.contains("balance -= 25"));
}
#[test]
fn test_multiplication_assignment() {
let c_code = r#"
int value = 10;
value *= 3;
"#;
let rust_expected = r#"
let mut value = 10;
value *= 3;
"#;
assert!(c_code.contains("value *= 3"));
assert!(rust_expected.contains("value *= 3"));
}
#[test]
fn test_division_assignment() {
let c_code = r#"
int total = 100;
total /= 4;
"#;
let rust_expected = r#"
let mut total = 100;
total /= 4;
"#;
assert!(c_code.contains("total /= 4"));
assert!(rust_expected.contains("total /= 4"));
}
#[test]
fn test_modulo_assignment() {
let c_code = r#"
int index = 47;
index %= 10;
"#;
let rust_expected = r#"
let mut index = 47;
index %= 10;
"#;
assert!(c_code.contains("index %= 10"));
assert!(rust_expected.contains("index %= 10"));
}
#[test]
fn test_bitwise_and_assignment() {
let c_code = r#"
unsigned flags = 0xFF;
flags &= 0x0F;
"#;
let rust_expected = r#"
let mut flags: u32 = 0xFF;
flags &= 0x0F;
"#;
assert!(c_code.contains("flags &= 0x0F"));
assert!(rust_expected.contains("flags &= 0x0F"));
}
#[test]
fn test_bitwise_or_assignment() {
let c_code = r#"
unsigned flags = 0x00;
flags |= 0x04;
"#;
let rust_expected = r#"
let mut flags: u32 = 0x00;
flags |= 0x04;
"#;
assert!(c_code.contains("flags |= 0x04"));
assert!(rust_expected.contains("flags |= 0x04"));
}
#[test]
fn test_bitwise_xor_assignment() {
let c_code = r#"
unsigned state = 0x01;
state ^= 0x01;
"#;
let rust_expected = r#"
let mut state: u32 = 0x01;
state ^= 0x01;
"#;
assert!(c_code.contains("state ^= 0x01"));
assert!(rust_expected.contains("state ^= 0x01"));
}
#[test]
fn test_left_shift_assignment() {
let c_code = r#"
int value = 5;
value <<= 2;
"#;
let rust_expected = r#"
let mut value = 5;
value <<= 2;
"#;
assert!(c_code.contains("value <<= 2"));
assert!(rust_expected.contains("value <<= 2"));
}
#[test]
fn test_right_shift_assignment() {
let c_code = r#"
int value = 20;
value >>= 2;
"#;
let rust_expected = r#"
let mut value = 20;
value >>= 2;
"#;
assert!(c_code.contains("value >>= 2"));
assert!(rust_expected.contains("value >>= 2"));
}
#[test]
fn test_compound_in_loop() {
let c_code = r#"
int sum = 0;
for (int i = 0; i < n; i++) {
sum += arr[i];
}
"#;
let rust_expected = r#"
let mut sum = 0;
for i in 0..n {
sum += arr[i];
}
"#;
assert!(c_code.contains("sum += arr[i]"));
assert!(rust_expected.contains("sum += arr[i]"));
}
#[test]
fn test_multiple_compound_assignments() {
let c_code = r#"
int x = 10, y = 20;
x += 5;
y -= 3;
x *= 2;
"#;
let rust_expected = r#"
let mut x = 10;
let mut y = 20;
x += 5;
y -= 3;
x *= 2;
"#;
assert!(c_code.contains("x += 5"));
assert!(c_code.contains("y -= 3"));
assert!(c_code.contains("x *= 2"));
assert!(rust_expected.contains("let mut x"));
assert!(rust_expected.contains("let mut y"));
}
#[test]
fn test_compound_with_array_element() {
let c_code = r#"
arr[i] += 10;
"#;
let rust_expected = r#"
arr[i] += 10;
"#;
assert!(c_code.contains("arr[i] += 10"));
assert!(rust_expected.contains("arr[i] += 10"));
}
#[test]
fn test_compound_with_complex_lvalue() {
let c_code = r#"
arr[find_index()] += value;
"#;
let rust_expected = r#"
arr[find_index()] += value;
"#;
assert!(c_code.contains("arr[find_index()] += value"));
assert!(rust_expected.contains("arr[find_index()] += value"));
}
#[test]
fn test_compound_assignment_transformation_summary() {
let c_code = r#"
// Arithmetic compound assignments
x += 5; // Addition
x -= 3; // Subtraction
x *= 2; // Multiplication
x /= 4; // Division
x %= 10; // Modulo
// Bitwise compound assignments
flags &= mask; // AND (clear bits)
flags |= bit; // OR (set bits)
flags ^= toggle; // XOR (toggle bits)
value <<= n; // Left shift
value >>= n; // Right shift
// In loops (accumulation)
for (int i = 0; i < n; i++) {
sum += arr[i];
}
// With array elements
arr[i] += delta;
// Complex lvalue (evaluated once)
arr[find()] *= factor;
"#;
let _rust_expected = r#"
// Arithmetic compound assignments (same syntax, type-safe)
x += 5; // Addition
x -= 3; // Subtraction
x *= 2; // Multiplication
x /= 4; // Division (panics on zero)
x %= 10; // Modulo (panics on zero)
// Bitwise compound assignments (same syntax)
flags &= mask; // AND (clear bits)
flags |= bit; // OR (set bits)
flags ^= toggle; // XOR (toggle bits)
value <<= n; // Left shift (panics on overflow)
value >>= n; // Right shift (sign-extends)
// In loops (same pattern)
for i in 0..n {
sum += arr[i];
}
// With array elements (same)
arr[i] += delta;
// Complex lvalue (same guarantee: evaluated once)
arr[find()] *= factor;
"#;
assert!(c_code.contains("x += 5"));
assert!(c_code.contains("x -= 3"));
assert!(c_code.contains("x *= 2"));
assert!(c_code.contains("x /= 4"));
assert!(c_code.contains("x %= 10"));
assert!(c_code.contains("flags &= mask"));
assert!(c_code.contains("flags |= bit"));
assert!(c_code.contains("flags ^= toggle"));
assert!(c_code.contains("value <<= n"));
assert!(c_code.contains("value >>= n"));
assert!(_rust_expected.contains("x += 5"));
assert!(_rust_expected.contains("panics on zero"));
}
}