#[cfg(test)]
mod tests {
#[test]
fn test_simple_string_literal() {
let c_code = r#"
char* msg = "Hello";
"#;
let rust_expected = r#"
let msg: &str = "Hello";
"#;
assert!(c_code.contains("\"Hello\""));
assert!(rust_expected.contains("\"Hello\""));
assert!(rust_expected.contains("&str"));
}
#[test]
fn test_string_with_newline() {
let c_code = r#"
char* msg = "Hello\nWorld";
"#;
let rust_expected = r#"
let msg = "Hello\nWorld";
"#;
assert!(c_code.contains("\\n"));
assert!(rust_expected.contains("\\n"));
}
#[test]
fn test_string_with_multiple_escapes() {
let c_code = r#"
char* msg = "Name:\tJohn\nAge:\t25";
"#;
let rust_expected = r#"
let msg = "Name:\tJohn\nAge:\t25";
"#;
assert!(c_code.contains("\\t"));
assert!(c_code.contains("\\n"));
assert!(rust_expected.contains("\\t"));
}
#[test]
fn test_string_with_quotes() {
let c_code = r#"
char* msg = "He said \"Hello\"";
"#;
let rust_expected = r#"
let msg = "He said \"Hello\"";
"#;
assert!(c_code.contains("\\\""));
assert!(rust_expected.contains("\\\""));
}
#[test]
fn test_string_with_backslash() {
let c_code = r#"
char* path = "C:\\Users\\John";
"#;
let rust_expected = r#"
let path = "C:\\Users\\John";
"#;
assert!(c_code.contains("\\\\"));
assert!(rust_expected.contains("\\\\"));
}
#[test]
fn test_empty_string() {
let c_code = r#"
char* empty = "";
"#;
let rust_expected = r#"
let empty = "";
"#;
assert!(c_code.contains("\"\""));
assert!(rust_expected.contains("\"\""));
}
#[test]
fn test_string_concatenation() {
let c_code = r#"
char* msg = "Hello" " " "World";
"#;
let rust_expected = r#"
let msg = concat!("Hello", " ", "World");
"#;
assert!(c_code.contains("\"Hello\" \" \" \"World\""));
assert!(rust_expected.contains("concat!"));
}
#[test]
fn test_printf_string() {
let c_code = r#"
printf("Name: %s\n", name);
"#;
let rust_expected = r#"
println!("Name: {}", name);
"#;
assert!(c_code.contains("%s"));
assert!(rust_expected.contains("{}"));
}
#[test]
fn test_printf_multiple_values() {
let c_code = r#"
printf("Name: %s, Age: %d\n", name, age);
"#;
let rust_expected = r#"
println!("Name: {}, Age: {}", name, age);
"#;
assert!(c_code.contains("%s"));
assert!(c_code.contains("%d"));
assert!(rust_expected.contains("{}, Age: {}"));
}
#[test]
fn test_string_as_argument() {
let c_code = r#"
process_message("Hello World");
"#;
let rust_expected = r#"
process_message("Hello World");
"#;
assert!(c_code.contains("\"Hello World\""));
assert!(rust_expected.contains("\"Hello World\""));
}
#[test]
fn test_string_in_struct() {
let c_code = r#"
struct Person p = { "John", 25 };
"#;
let rust_expected = r#"
let p = Person { name: "John", age: 25 };
"#;
assert!(c_code.contains("\"John\""));
assert!(rust_expected.contains("\"John\""));
}
#[test]
fn test_string_comparison() {
let c_code = r#"
if (strcmp(s1, "Hello") == 0) {
found = 1;
}
"#;
let rust_expected = r#"
if s1 == "Hello" {
found = true;
}
"#;
assert!(c_code.contains("strcmp"));
assert!(rust_expected.contains("s1 == \"Hello\""));
}
#[test]
fn test_multiline_string() {
let c_code = r#"
char* sql = "SELECT * FROM users\n"
"WHERE age > 18\n"
"ORDER BY name";
"#;
let rust_expected = r#"
let sql = "SELECT * FROM users\n\
WHERE age > 18\n\
ORDER BY name";
"#;
assert!(c_code.contains("SELECT"));
assert!(rust_expected.contains("SELECT"));
}
#[test]
fn test_string_with_explicit_null() {
let c_code = r#"
char* data = "abc\0def";
"#;
let rust_expected = r#"
let data = "abc\0def";
"#;
assert!(c_code.contains("\\0"));
assert!(rust_expected.contains("\\0"));
}
#[test]
fn test_string_literals_transformation_summary() {
let c_code = r#"
// Rule 1: Simple string
char* msg = "Hello";
// Rule 2: Escape sequences
char* escaped = "Line1\nLine2\tTab";
// Rule 3: Empty string
char* empty = "";
// Rule 4: Concatenation
char* concat = "Hello" " " "World";
// Rule 5: printf format
printf("Value: %d\n", x);
// Rule 6: String comparison
if (strcmp(s, "test") == 0) { ... }
// Rule 7: Quotes and backslashes
char* path = "C:\\Users\\John";
char* quote = "He said \"Hi\"";
// Rule 8: Null character
char* data = "abc\0def";
"#;
let rust_expected = r#"
// Rule 1: &str type
let msg: &str = "Hello";
// Rule 2: Same escape sequences
let escaped = "Line1\nLine2\tTab";
// Rule 3: Empty string same
let empty = "";
// Rule 4: concat!() macro
let concat = concat!("Hello", " ", "World");
// Rule 5: println! with {}
println!("Value: {}", x);
// Rule 6: Direct == comparison
if s == "test" { ... }
// Rule 7: Same escaping
let path = "C:\\Users\\John";
let quote = "He said \"Hi\"";
// Rule 8: Null character valid
let data = "abc\0def";
"#;
assert!(c_code.contains("char* msg"));
assert!(rust_expected.contains("let msg: &str"));
assert!(c_code.contains("\\n"));
assert!(c_code.contains("strcmp"));
assert!(rust_expected.contains("=="));
assert!(rust_expected.contains("concat!"));
}
}