#[cfg(test)]
mod tests {
#[test]
fn test_simple_ascii_character() {
let c_code = r#"
char c = 'A';
"#;
let rust_expected = r#"
let c: u8 = b'A';
"#;
assert!(c_code.contains("'A'"));
assert!(rust_expected.contains("b'A'"));
assert!(rust_expected.contains("u8"));
}
#[test]
fn test_character_newline() {
let c_code = r#"
char newline = '\n';
"#;
let rust_expected = r#"
let newline: u8 = b'\n';
"#;
assert!(c_code.contains("'\\n'"));
assert!(rust_expected.contains("b'\\n'"));
}
#[test]
fn test_character_tab() {
let c_code = r#"
char tab = '\t';
"#;
let rust_expected = r#"
let tab: u8 = b'\t';
"#;
assert!(c_code.contains("'\\t'"));
assert!(rust_expected.contains("b'\\t'"));
}
#[test]
fn test_null_character() {
let c_code = r#"
char null = '\0';
"#;
let rust_expected = r#"
let null: u8 = b'\0';
"#;
assert!(c_code.contains("'\\0'"));
assert!(rust_expected.contains("b'\\0'"));
}
#[test]
fn test_backslash_character() {
let c_code = r#"
char backslash = '\\';
"#;
let rust_expected = r#"
let backslash: u8 = b'\\';
"#;
assert!(c_code.contains("'\\\\'"));
assert!(rust_expected.contains("b'\\\\'"));
}
#[test]
fn test_single_quote_character() {
let c_code = r#"
char quote = '\'';
"#;
let rust_expected = r#"
let quote: u8 = b'\'';
"#;
assert!(c_code.contains("'\\''"));
assert!(rust_expected.contains("b'\\''"));
}
#[test]
fn test_character_range_check() {
let c_code = r#"
if (c >= 'a' && c <= 'z') {
is_lower = 1;
}
"#;
let rust_expected = r#"
if c >= b'a' && c <= b'z' {
is_lower = true;
}
"#;
assert!(c_code.contains("'a'"));
assert!(c_code.contains("'z'"));
assert!(rust_expected.contains("b'a'"));
assert!(rust_expected.contains("b'z'"));
}
#[test]
fn test_uppercase_range_check() {
let c_code = r#"
if (c >= 'A' && c <= 'Z') {
is_upper = 1;
}
"#;
let rust_expected = r#"
if c >= b'A' && c <= b'Z' {
is_upper = true;
}
"#;
assert!(c_code.contains("'A'"));
assert!(rust_expected.contains("b'A'"));
}
#[test]
fn test_character_to_integer() {
let c_code = r#"
int digit = c - '0';
"#;
let rust_expected = r#"
let digit = (c - b'0') as i32;
"#;
assert!(c_code.contains("'0'"));
assert!(rust_expected.contains("b'0'"));
assert!(rust_expected.contains("as i32"));
}
#[test]
fn test_character_arithmetic() {
let c_code = r#"
char next = c + 1;
"#;
let rust_expected = r#"
let next = c + 1;
"#;
assert!(c_code.contains("c + 1"));
assert!(rust_expected.contains("c + 1"));
}
#[test]
fn test_character_in_switch() {
let c_code = r#"
switch (c) {
case 'a': return 1;
case 'b': return 2;
default: return 0;
}
"#;
let rust_expected = r#"
match c {
b'a' => 1,
b'b' => 2,
_ => 0,
}
"#;
assert!(c_code.contains("case 'a'"));
assert!(rust_expected.contains("b'a'"));
}
#[test]
fn test_is_digit_check() {
let c_code = r#"
if (c >= '0' && c <= '9') {
is_digit = 1;
}
"#;
let rust_expected = r#"
if c >= b'0' && c <= b'9' {
is_digit = true;
}
"#;
assert!(c_code.contains("'0'"));
assert!(c_code.contains("'9'"));
assert!(rust_expected.contains("b'0'"));
}
#[test]
fn test_character_array() {
let c_code = r#"
char vowels[] = {'a', 'e', 'i', 'o', 'u'};
"#;
let rust_expected = r#"
let vowels: [u8; 5] = [b'a', b'e', b'i', b'o', b'u'];
"#;
assert!(c_code.contains("'a'"));
assert!(rust_expected.contains("b'a'"));
assert!(rust_expected.contains("[u8; 5]"));
}
#[test]
fn test_character_in_expression() {
let c_code = r#"
int offset = c - 'A' + 1;
"#;
let rust_expected = r#"
let offset = (c - b'A' + 1) as i32;
"#;
assert!(c_code.contains("'A'"));
assert!(rust_expected.contains("b'A'"));
}
#[test]
fn test_character_literals_transformation_summary() {
let c_code = r#"
// Rule 1: Simple ASCII character
char c = 'A';
// Rule 2: Escape sequences
char newline = '\n';
char tab = '\t';
char null = '\0';
char backslash = '\\';
char quote = '\'';
// Rule 3: Range checks
if (c >= 'a' && c <= 'z') { ... } // Lowercase
if (c >= 'A' && c <= 'Z') { ... } // Uppercase
if (c >= '0' && c <= '9') { ... } // Digit
// Rule 4: Character arithmetic
int digit = c - '0';
char next = c + 1;
// Rule 5: Character in switch
switch (c) {
case 'a': return 1;
case 'b': return 2;
}
// Rule 6: Character array
char vowels[] = {'a', 'e', 'i', 'o', 'u'};
"#;
let rust_expected = r#"
// Rule 1: u8 byte literal for ASCII
let c: u8 = b'A';
// Rule 2: Same escape sequences with b prefix
let newline: u8 = b'\n';
let tab: u8 = b'\t';
let null: u8 = b'\0';
let backslash: u8 = b'\\';
let quote: u8 = b'\'';
// Rule 3: Range checks (byte literals)
if c >= b'a' && c <= b'z' { ... } // Lowercase
if c >= b'A' && c <= b'Z' { ... } // Uppercase
if c >= b'0' && c <= b'9' { ... } // Digit
// Rule 4: Explicit casts for arithmetic
let digit = (c - b'0') as i32;
let next = c + 1; // u8 arithmetic
// Rule 5: Match with byte literals
match c {
b'a' => 1,
b'b' => 2,
_ => 0,
}
// Rule 6: Byte array
let vowels: [u8; 5] = [b'a', b'e', b'i', b'o', b'u'];
"#;
assert!(c_code.contains("char c = 'A'"));
assert!(rust_expected.contains("let c: u8 = b'A'"));
assert!(c_code.contains("'\\n'"));
assert!(rust_expected.contains("b'\\n'"));
assert!(c_code.contains("'0'"));
assert!(rust_expected.contains("b'0'"));
assert!(rust_expected.contains("as i32"));
}
}