#[cfg(test)]
mod tests {
#[test]
fn test_simple_decimal() {
let c_code = r#"
double x = 3.14;
"#;
let rust_expected = r#"
let x: f64 = 3.14;
"#;
assert!(c_code.contains("3.14"));
assert!(rust_expected.contains("3.14"));
assert!(rust_expected.contains("f64"));
}
#[test]
fn test_float_suffix() {
let c_code = r#"
float x = 3.14f;
"#;
let rust_expected = r#"
let x: f32 = 3.14;
"#;
assert!(c_code.contains("3.14f"));
assert!(rust_expected.contains("f32"));
}
#[test]
fn test_scientific_positive() {
let c_code = r#"
double x = 1.5e10;
"#;
let rust_expected = r#"
let x: f64 = 1.5e10;
"#;
assert!(c_code.contains("1.5e10"));
assert!(rust_expected.contains("1.5e10"));
}
#[test]
fn test_scientific_negative() {
let c_code = r#"
double x = 2.3e-5;
"#;
let rust_expected = r#"
let x: f64 = 2.3e-5;
"#;
assert!(c_code.contains("2.3e-5"));
assert!(rust_expected.contains("2.3e-5"));
}
#[test]
fn test_zero_literal() {
let c_code = r#"
double x = 0.0;
"#;
let rust_expected = r#"
let x: f64 = 0.0;
"#;
assert!(c_code.contains("0.0"));
assert!(rust_expected.contains("0.0"));
}
#[test]
fn test_fractional_value() {
let c_code = r#"
double x = 0.5;
"#;
let rust_expected = r#"
let x: f64 = 0.5;
"#;
assert!(c_code.contains("0.5"));
assert!(rust_expected.contains("0.5"));
}
#[test]
fn test_leading_decimal_point() {
let c_code = r#"
double x = .5;
"#;
let rust_expected = r#"
let x: f64 = 0.5;
"#;
assert!(c_code.contains(".5"));
assert!(rust_expected.contains("0.5"));
assert!(!c_code.contains("0.5"));
}
#[test]
fn test_trailing_decimal_point() {
let c_code = r#"
double x = 5.;
"#;
let rust_expected = r#"
let x: f64 = 5.0;
"#;
assert!(c_code.contains("5."));
assert!(rust_expected.contains("5.0"));
}
#[test]
fn test_very_large_number() {
let c_code = r#"
double speed_of_light = 2.998e8;
"#;
let rust_expected = r#"
let speed_of_light: f64 = 2.998e8;
"#;
assert!(c_code.contains("2.998e8"));
assert!(rust_expected.contains("2.998e8"));
}
#[test]
fn test_very_small_number() {
let c_code = r#"
double planck = 6.626e-34;
"#;
let rust_expected = r#"
let planck: f64 = 6.626e-34;
"#;
assert!(c_code.contains("6.626e-34"));
assert!(rust_expected.contains("6.626e-34"));
}
#[test]
fn test_infinity() {
let c_code = r#"
double inf = INFINITY;
"#;
let rust_expected = r#"
let inf = f64::INFINITY;
"#;
assert!(c_code.contains("INFINITY"));
assert!(rust_expected.contains("f64::INFINITY"));
}
#[test]
fn test_nan() {
let c_code = r#"
double nan_val = NAN;
"#;
let rust_expected = r#"
let nan_val = f64::NAN;
"#;
assert!(c_code.contains("NAN"));
assert!(rust_expected.contains("f64::NAN"));
}
#[test]
fn test_nan_check() {
let c_code = r#"
if (isnan(x)) {
handle_error();
}
"#;
let rust_expected = r#"
if x.is_nan() {
handle_error();
}
"#;
assert!(c_code.contains("isnan(x)"));
assert!(rust_expected.contains("x.is_nan()"));
}
#[test]
fn test_infinity_check() {
let c_code = r#"
if (isinf(x)) {
handle_overflow();
}
"#;
let rust_expected = r#"
if x.is_infinite() {
handle_overflow();
}
"#;
assert!(c_code.contains("isinf(x)"));
assert!(rust_expected.contains("x.is_infinite()"));
}
#[test]
fn test_negative_zero() {
let c_code = r#"
double x = -0.0;
"#;
let rust_expected = r#"
let x: f64 = -0.0;
"#;
assert!(c_code.contains("-0.0"));
assert!(rust_expected.contains("-0.0"));
}
#[test]
fn test_floating_point_literals_transformation_summary() {
let c_code = r#"
// Rule 1: Simple decimal (same)
double x = 3.14;
// Rule 2: Scientific notation (same)
double large = 1.5e10;
double small = 2.3e-5;
// Rule 3: Float suffix
float f = 3.14f;
// Rule 4: Zero
double zero = 0.0;
// Rule 5: Fractional
double half = 0.5;
// Rule 6: Leading decimal (C only)
double leading = .5; // Valid in C
// Rule 7: Trailing decimal
double trailing = 5.; // Valid in C
// Rule 8: Special values
double inf = INFINITY;
double nan_val = NAN;
// Rule 9: Special checks
if (isnan(x)) { ... }
if (isinf(x)) { ... }
// Rule 10: Negative zero
double neg_zero = -0.0;
"#;
let rust_expected = r#"
// Rule 1: f64 type (default)
let x: f64 = 3.14;
// Rule 2: Same scientific notation
let large: f64 = 1.5e10;
let small: f64 = 2.3e-5;
// Rule 3: f32 type annotation or suffix
let f: f32 = 3.14; // or 3.14f32
// Rule 4: Zero same
let zero: f64 = 0.0;
// Rule 5: Fractional same
let half: f64 = 0.5;
// Rule 6: Add leading 0
let leading: f64 = 0.5; // NOT .5 in Rust
// Rule 7: Add trailing 0 for clarity
let trailing: f64 = 5.0; // NOT 5. in Rust
// Rule 8: Associated constants
let inf = f64::INFINITY;
let nan_val = f64::NAN;
// Rule 9: Methods instead of functions
if x.is_nan() { ... }
if x.is_infinite() { ... }
// Rule 10: Negative zero same (IEEE 754)
let neg_zero: f64 = -0.0;
"#;
assert!(c_code.contains("double x = 3.14"));
assert!(rust_expected.contains("let x: f64 = 3.14"));
assert!(c_code.contains("1.5e10"));
assert!(c_code.contains("3.14f"));
assert!(c_code.contains(".5"));
assert!(rust_expected.contains("0.5"));
assert!(c_code.contains("INFINITY"));
assert!(rust_expected.contains("f64::INFINITY"));
assert!(c_code.contains("isnan"));
assert!(rust_expected.contains("is_nan()"));
}
}