#[cfg(test)]
mod tests {
#[test]
fn test_simple_decimal() {
let c_code = r#"
int x = 42;
"#;
let rust_expected = r#"
let x: i32 = 42;
"#;
assert!(c_code.contains("42"));
assert!(rust_expected.contains("42"));
assert!(rust_expected.contains("i32"));
}
#[test]
fn test_zero_literal() {
let c_code = r#"
int x = 0;
"#;
let rust_expected = r#"
let x: i32 = 0;
"#;
assert!(c_code.contains("= 0"));
assert!(rust_expected.contains("= 0"));
}
#[test]
fn test_octal_literal() {
let c_code = r#"
int x = 052;
"#;
let rust_expected = r#"
let x: i32 = 0o52;
"#;
assert!(c_code.contains("052"));
assert!(rust_expected.contains("0o52"));
}
#[test]
fn test_hexadecimal_literal() {
let c_code = r#"
int x = 0x2A;
"#;
let rust_expected = r#"
let x: i32 = 0x2A;
"#;
assert!(c_code.contains("0x2A"));
assert!(rust_expected.contains("0x2A"));
}
#[test]
fn test_hexadecimal_lowercase() {
let c_code = r#"
int x = 0xff;
"#;
let rust_expected = r#"
let x: i32 = 0xff;
"#;
assert!(c_code.contains("0xff"));
assert!(rust_expected.contains("0xff"));
}
#[test]
fn test_unsigned_literal() {
let c_code = r#"
unsigned int x = 42U;
"#;
let rust_expected = r#"
let x: u32 = 42;
"#;
assert!(c_code.contains("42U"));
assert!(rust_expected.contains("u32"));
}
#[test]
fn test_long_literal() {
let c_code = r#"
long x = 42L;
"#;
let rust_expected = r#"
let x: i64 = 42;
"#;
assert!(c_code.contains("42L"));
assert!(rust_expected.contains("i64"));
}
#[test]
fn test_unsigned_long() {
let c_code = r#"
unsigned long x = 42UL;
"#;
let rust_expected = r#"
let x: u64 = 42;
"#;
assert!(c_code.contains("42UL"));
assert!(rust_expected.contains("u64"));
}
#[test]
fn test_long_long() {
let c_code = r#"
long long x = 42LL;
"#;
let rust_expected = r#"
let x: i64 = 42;
"#;
assert!(c_code.contains("42LL"));
assert!(rust_expected.contains("i64"));
}
#[test]
fn test_unsigned_long_long() {
let c_code = r#"
unsigned long long x = 42ULL;
"#;
let rust_expected = r#"
let x: u64 = 42;
"#;
assert!(c_code.contains("42ULL"));
assert!(rust_expected.contains("u64"));
}
#[test]
fn test_binary_literal() {
let rust_code = r#"
let x: i32 = 0b101010;
"#;
assert!(rust_code.contains("0b101010"));
}
#[test]
fn test_underscores_for_readability() {
let rust_code = r#"
let million: i32 = 1_000_000;
"#;
assert!(rust_code.contains("1_000_000"));
}
#[test]
fn test_hex_with_underscores() {
let rust_code = r#"
let color: u32 = 0xFF_AA_BB_CC;
"#;
assert!(rust_code.contains("0xFF_AA_BB_CC"));
}
#[test]
fn test_rust_type_suffix() {
let rust_code = r#"
let x = 42i32;
let y = 42u32;
let z = 42i64;
"#;
assert!(rust_code.contains("42i32"));
assert!(rust_code.contains("42u32"));
assert!(rust_code.contains("42i64"));
}
#[test]
fn test_maximum_values() {
let c_code = r#"
int max_int = 2147483647;
unsigned int max_uint = 4294967295U;
"#;
let rust_expected = r#"
let max_int: i32 = 2147483647;
let max_uint: u32 = 4294967295;
"#;
assert!(c_code.contains("2147483647"));
assert!(rust_expected.contains("2147483647"));
}
#[test]
fn test_negative_literal() {
let c_code = r#"
int x = -42;
"#;
let rust_expected = r#"
let x: i32 = -42;
"#;
assert!(c_code.contains("-42"));
assert!(rust_expected.contains("-42"));
}
#[test]
fn test_integer_literals_transformation_summary() {
let c_code = r#"
// Rule 1: Decimal (same)
int x = 42;
// Rule 2: Octal (DIFFERENT!)
int octal = 052; // Leading 0 means octal in C
// Rule 3: Hexadecimal (same)
int hex = 0x2A;
// Rule 4: Suffixes
unsigned int u = 42U;
long l = 42L;
unsigned long ul = 42UL;
long long ll = 42LL;
unsigned long long ull = 42ULL;
// Rule 5: Zero
int zero = 0;
// Rule 6: Negative
int neg = -42;
// Rule 7: Max values
int max = 2147483647;
"#;
let rust_expected = r#"
// Rule 1: Decimal (same)
let x: i32 = 42;
// Rule 2: Octal (EXPLICIT prefix safer)
let octal: i32 = 0o52; // 0o prefix in Rust
// Rule 3: Hexadecimal (same)
let hex: i32 = 0x2A;
// Rule 4: Type annotations or suffixes
let u: u32 = 42; // or 42u32
let l: i64 = 42; // or 42i64
let ul: u64 = 42; // or 42u64
let ll: i64 = 42; // or 42i64
let ull: u64 = 42; // or 42u64
// Rule 5: Zero (same)
let zero: i32 = 0;
// Rule 6: Negative (same)
let neg: i32 = -42;
// Rule 7: Max values (same)
let max: i32 = 2147483647;
// Rust-only features:
let binary = 0b101010; // Binary literals
let readable = 1_000_000; // Underscores
"#;
assert!(c_code.contains("int x = 42"));
assert!(rust_expected.contains("let x: i32 = 42"));
assert!(c_code.contains("052"));
assert!(rust_expected.contains("0o52"));
assert!(c_code.contains("0x2A"));
assert!(rust_expected.contains("42u32"));
assert!(rust_expected.contains("0b101010"));
}
}