#[cfg(test)]
mod tests {
#[test]
fn test_simple_counting_loop() {
let c_code = r#"
for (int i = 0; i < 10; i++) {
process(i);
}
"#;
let rust_expected = r#"
for i in 0..10 {
process(i);
}
"#;
assert!(c_code.contains("for (int i = 0; i < 10; i++)"));
assert!(rust_expected.contains("for i in 0..10"));
}
#[test]
fn test_inclusive_range() {
let c_code = r#"
for (int i = 0; i <= 10; i++) {
process(i);
}
"#;
let rust_expected = r#"
for i in 0..=10 {
process(i);
}
"#;
assert!(c_code.contains("i <= 10"));
assert!(rust_expected.contains("0..=10"));
}
#[test]
fn test_custom_step_increment() {
let c_code = r#"
for (int i = 0; i < 20; i += 2) {
process(i);
}
"#;
let rust_expected = r#"
for i in (0..20).step_by(2) {
process(i);
}
"#;
assert!(c_code.contains("i += 2"));
assert!(rust_expected.contains(".step_by(2)"));
}
#[test]
fn test_reverse_iteration() {
let c_code = r#"
for (int i = 10; i > 0; i--) {
process(i);
}
"#;
let rust_expected = r#"
for i in (1..=10).rev() {
process(i);
}
"#;
assert!(c_code.contains("i--"));
assert!(rust_expected.contains(".rev()"));
}
#[test]
fn test_array_iteration_manual_index() {
let c_code = r#"
for (int i = 0; i < arr_len; i++) {
sum += arr[i];
}
"#;
let rust_with_index = r#"
for i in 0..arr_len {
sum += arr[i];
}
"#;
assert!(c_code.contains("arr[i]"));
assert!(rust_with_index.contains("arr[i]"));
}
#[test]
fn test_array_iteration_with_iterator() {
let c_code = r#"
for (int i = 0; i < arr_len; i++) {
sum += arr[i];
}
"#;
let rust_idiomatic = r#"
for &item in arr.iter() {
sum += item;
}
"#;
assert!(c_code.contains("arr[i]"));
assert!(rust_idiomatic.contains(".iter()"));
}
#[test]
fn test_array_iteration_enumerate() {
let c_code = r#"
for (int i = 0; i < arr_len; i++) {
printf("arr[%d] = %d\n", i, arr[i]);
}
"#;
let rust_expected = r#"
for (i, &item) in arr.iter().enumerate() {
println!("arr[{}] = {}", i, item);
}
"#;
assert!(c_code.contains("arr[i]"));
assert!(rust_expected.contains(".enumerate()"));
}
#[test]
fn test_nested_loops() {
let c_code = r#"
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
matrix[i][j] = i * m + j;
}
}
"#;
let rust_expected = r#"
for i in 0..n {
for j in 0..m {
matrix[i][j] = i * m + j;
}
}
"#;
assert_eq!(c_code.matches("for (").count(), 2);
assert_eq!(rust_expected.matches("for ").count(), 2);
}
#[test]
fn test_loop_with_break() {
let c_code = r#"
for (int i = 0; i < n; i++) {
if (arr[i] == target) break;
process(arr[i]);
}
"#;
let rust_expected = r#"
for i in 0..n {
if arr[i] == target { break; }
process(arr[i]);
}
"#;
assert!(c_code.contains("break;"));
assert!(rust_expected.contains("break;"));
}
#[test]
fn test_loop_with_continue() {
let c_code = r#"
for (int i = 0; i < n; i++) {
if (arr[i] < 0) continue;
sum += arr[i];
}
"#;
let rust_expected = r#"
for i in 0..n {
if arr[i] < 0 { continue; }
sum += arr[i];
}
"#;
assert!(c_code.contains("continue;"));
assert!(rust_expected.contains("continue;"));
}
#[test]
fn test_loop_start_at_one() {
let c_code = r#"
for (int i = 1; i <= n; i++) {
process(i);
}
"#;
let rust_expected = r#"
for i in 1..=n {
process(i);
}
"#;
assert!(c_code.contains("i = 1"));
assert!(rust_expected.contains("1..=n"));
}
#[test]
fn test_infinite_for_loop() {
let c_code = r#"
for (;;) {
process();
if (done) break;
}
"#;
let rust_idiomatic = r#"
loop {
process();
if done { break; }
}
"#;
assert!(c_code.contains("for (;;)"));
assert!(rust_idiomatic.contains("loop {"));
}
#[test]
fn test_loop_with_multiple_statements() {
let c_code = r#"
for (int i = 0; i < n; i++) {
int temp = arr[i] * 2;
result[i] = temp + offset;
total += result[i];
}
"#;
let rust_expected = r#"
for i in 0..n {
let temp = arr[i] * 2;
result[i] = temp + offset;
total += result[i];
}
"#;
assert!(c_code.contains("int temp"));
assert!(rust_expected.contains("let temp"));
}
#[test]
fn test_loop_complex_condition() {
let c_code = r#"
for (int i = 0; i < n && !found; i++) {
if (arr[i] == target) found = 1;
}
"#;
let rust_expected = r#"
let mut i = 0;
while i < n && !found {
if arr[i] == target { found = true; }
i += 1;
}
"#;
assert!(c_code.contains("&& !found"));
assert!(rust_expected.contains("while"));
}
#[test]
fn test_loop_sum_accumulation() {
let c_code = r#"
int sum = 0;
for (int i = 0; i < n; i++) {
sum += arr[i];
}
"#;
let rust_loop_style = r#"
let mut sum = 0;
for i in 0..n {
sum += arr[i];
}
"#;
let rust_idiomatic = r#"
let sum: i32 = arr[..n].iter().sum();
"#;
assert!(c_code.contains("sum += arr[i]"));
assert!(rust_loop_style.contains("sum += arr[i]"));
assert!(rust_idiomatic.contains(".sum()"));
}
#[test]
fn test_for_loop_transformation_rules_summary() {
let c_code = r#"
// Rule 1: Simple counting (0 to n-1)
for (int i = 0; i < n; i++) { ... }
// Rule 2: Inclusive range (0 to n)
for (int i = 0; i <= n; i++) { ... }
// Rule 3: Custom step (increment by 2)
for (int i = 0; i < n; i += 2) { ... }
// Rule 4: Reverse iteration
for (int i = 10; i > 0; i--) { ... }
// Rule 5: Array with index
for (int i = 0; i < len; i++) { arr[i] = ...; }
// Rule 6: Array with iterator
for (int i = 0; i < len; i++) { sum += arr[i]; }
"#;
let rust_expected = r#"
// Rule 1: Simple counting (0 to n-1)
for i in 0..n { ... }
// Rule 2: Inclusive range (0 to n)
for i in 0..=n { ... }
// Rule 3: Custom step (increment by 2)
for i in (0..n).step_by(2) { ... }
// Rule 4: Reverse iteration
for i in (1..=10).rev() { ... }
// Rule 5: Array with index (or enumerate)
for (i, item) in arr.iter_mut().enumerate() { *item = ...; }
// Rule 6: Array with iterator (idiomatic)
for &item in arr.iter() { sum += item; }
"#;
assert!(c_code.contains("for (int"));
assert!(rust_expected.contains("for i in"));
assert!(rust_expected.contains(".."));
assert!(rust_expected.contains(".step_by"));
assert!(rust_expected.contains(".rev()"));
assert!(rust_expected.contains(".iter()"));
}
}