#[cfg(test)]
mod tests {
#[test]
fn test_less_than() {
let c_code = r#"
if (a < b) {
smaller = a;
}
"#;
let rust_expected = r#"
if a < b {
smaller = a;
}
"#;
assert!(c_code.contains("a < b"));
assert!(rust_expected.contains("a < b"));
}
#[test]
fn test_greater_than() {
let c_code = r#"
if (a > b) {
larger = a;
}
"#;
let rust_expected = r#"
if a > b {
larger = a;
}
"#;
assert!(c_code.contains("a > b"));
assert!(rust_expected.contains("a > b"));
}
#[test]
fn test_less_than_or_equal() {
let c_code = r#"
if (a <= b) {
process();
}
"#;
let rust_expected = r#"
if a <= b {
process();
}
"#;
assert!(c_code.contains("a <= b"));
assert!(rust_expected.contains("a <= b"));
}
#[test]
fn test_greater_than_or_equal() {
let c_code = r#"
if (a >= b) {
process();
}
"#;
let rust_expected = r#"
if a >= b {
process();
}
"#;
assert!(c_code.contains("a >= b"));
assert!(rust_expected.contains("a >= b"));
}
#[test]
fn test_equality() {
let c_code = r#"
if (a == b) {
handle_equal();
}
"#;
let rust_expected = r#"
if a == b {
handle_equal();
}
"#;
assert!(c_code.contains("a == b"));
assert!(rust_expected.contains("a == b"));
}
#[test]
fn test_inequality() {
let c_code = r#"
if (a != b) {
handle_different();
}
"#;
let rust_expected = r#"
if a != b {
handle_different();
}
"#;
assert!(c_code.contains("a != b"));
assert!(rust_expected.contains("a != b"));
}
#[test]
fn test_range_check() {
let c_code = r#"
if (x >= MIN && x <= MAX) {
in_range = 1;
}
"#;
let rust_expected = r#"
if x >= MIN && x <= MAX {
in_range = true;
}
"#;
assert!(c_code.contains("x >= MIN && x <= MAX"));
assert!(rust_expected.contains("x >= MIN && x <= MAX"));
}
#[test]
fn test_comparison_in_loop() {
let c_code = r#"
for (int i = 0; i < n; i++) {
if (arr[i] >= threshold) {
count++;
}
}
"#;
let rust_expected = r#"
for i in 0..n {
if arr[i] >= threshold {
count += 1;
}
}
"#;
assert!(c_code.contains("i < n"));
assert!(rust_expected.contains("arr[i] >= threshold"));
}
#[test]
fn test_finding_minimum() {
let c_code = r#"
int min = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] < min) {
min = arr[i];
}
}
"#;
let rust_expected = r#"
let mut min = arr[0];
for i in 1..n {
if arr[i] < min {
min = arr[i];
}
}
"#;
assert!(c_code.contains("arr[i] < min"));
assert!(rust_expected.contains("arr[i] < min"));
}
#[test]
fn test_ternary_with_comparison() {
let c_code = r#"
int result = (a > b) ? a : b;
"#;
let rust_expected = r#"
let result = if a > b { a } else { b };
"#;
assert!(c_code.contains("a > b"));
assert!(rust_expected.contains("if a > b"));
}
#[test]
fn test_null_zero_comparison() {
let c_code = r#"
if (ptr != NULL && value != 0) {
process(ptr, value);
}
"#;
let rust_expected = r#"
if let Some(ptr) = opt {
if value != 0 {
process(ptr, value);
}
}
"#;
assert!(c_code.contains("ptr != NULL"));
assert!(c_code.contains("value != 0"));
assert!(rust_expected.contains("value != 0"));
}
#[test]
fn test_string_comparison() {
let c_code = r#"
if (strcmp(str1, str2) == 0) {
strings_equal();
}
"#;
let rust_expected = r#"
if str1 == str2 {
strings_equal();
}
"#;
assert!(c_code.contains("strcmp(str1, str2) == 0"));
assert!(rust_expected.contains("str1 == str2"));
}
#[test]
fn test_comparison_as_value() {
let c_code = r#"
int is_larger = (a > b);
if (is_larger) {
process();
}
"#;
let rust_expected = r#"
let is_larger = a > b;
if is_larger {
process();
}
"#;
assert!(c_code.contains("int is_larger"));
assert!(rust_expected.contains("let is_larger"));
}
#[test]
fn test_sorting_comparison() {
let c_code = r#"
if (arr[i] < arr[j]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
"#;
let rust_expected = r#"
if arr[i] < arr[j] {
let temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
"#;
assert!(c_code.contains("arr[i] < arr[j]"));
assert!(rust_expected.contains("arr[i] < arr[j]"));
}
#[test]
fn test_comparison_operators_summary() {
let c_code = r#"
// Relational operators
if (a < b) { ... } // Less than
if (a > b) { ... } // Greater than
if (a <= b) { ... } // Less than or equal
if (a >= b) { ... } // Greater than or equal
// Equality operators
if (a == b) { ... } // Equal
if (a != b) { ... } // Not equal
// Range check
if (x >= MIN && x <= MAX) { ... }
// Finding min/max
int min = (a < b) ? a : b;
// NULL check (C idiom)
if (ptr != NULL) { ... }
// String comparison (C needs strcmp)
if (strcmp(s1, s2) == 0) { ... }
"#;
let rust_expected = r#"
// Relational operators (same syntax)
if a < b { ... } // Less than
if a > b { ... } // Greater than
if a <= b { ... } // Less than or equal
if a >= b { ... } // Greater than or equal
// Equality operators (same syntax)
if a == b { ... } // Equal
if a != b { ... } // Not equal
// Range check (same)
if x >= MIN && x <= MAX { ... }
// Finding min/max (if expression)
let min = if a < b { a } else { b };
// Option pattern (Rust)
if let Some(ptr) = opt { ... }
// String comparison (direct ==)
if s1 == s2 { ... }
"#;
assert!(c_code.contains("a < b"));
assert!(c_code.contains("a > b"));
assert!(c_code.contains("a <= b"));
assert!(c_code.contains("a >= b"));
assert!(c_code.contains("a == b"));
assert!(c_code.contains("a != b"));
assert!(rust_expected.contains("a < b"));
assert!(rust_expected.contains("a == b"));
}
}