#[cfg(test)]
mod tests {
#[test]
fn test_sizeof_basic_type() {
let c_code = r#"
sizeof(int)
"#;
let rust_expected = r#"
std::mem::size_of::<i32>()
"#;
assert!(c_code.contains("sizeof(int)"));
assert!(rust_expected.contains("std::mem::size_of::<i32>()"));
}
#[test]
fn test_sizeof_variable() {
let c_code = r#"
int x = 10;
size_t s = sizeof(x);
"#;
let rust_expected = r#"
let x: i32 = 10;
let s: usize = std::mem::size_of_val(&x);
"#;
assert!(c_code.contains("sizeof(x)"));
assert!(rust_expected.contains("std::mem::size_of_val(&x)"));
}
#[test]
fn test_sizeof_array() {
let c_code = r#"
int arr[10];
size_t bytes = sizeof(arr);
"#;
let rust_expected = r#"
let arr: [i32; 10];
let bytes: usize = std::mem::size_of_val(&arr);
"#;
assert!(c_code.contains("sizeof(arr)"));
assert!(rust_expected.contains("std::mem::size_of_val(&arr)"));
}
#[test]
fn test_array_length_calculation() {
let c_code = r#"
int arr[10];
int len = sizeof(arr) / sizeof(arr[0]);
"#;
let rust_expected = r#"
let arr: [i32; 10];
let len = arr.len();
"#;
assert!(c_code.contains("sizeof(arr) / sizeof(arr[0])"));
assert!(rust_expected.contains("arr.len()"));
}
#[test]
fn test_sizeof_struct_type() {
let c_code = r#"
struct Point { int x; int y; };
size_t s = sizeof(struct Point);
"#;
let rust_expected = r#"
struct Point { x: i32, y: i32 }
let s: usize = std::mem::size_of::<Point>();
"#;
assert!(c_code.contains("sizeof(struct Point)"));
assert!(rust_expected.contains("std::mem::size_of::<Point>()"));
}
#[test]
fn test_sizeof_pointer() {
let c_code = r#"
size_t ptr_size = sizeof(int*);
"#;
let rust_expected = r#"
let ptr_size: usize = std::mem::size_of::<*const i32>();
"#;
assert!(c_code.contains("sizeof(int*)"));
assert!(rust_expected.contains("std::mem::size_of::<*const i32>()"));
}
#[test]
fn test_sizeof_in_malloc() {
let c_code = r#"
int *arr = malloc(10 * sizeof(int));
"#;
let rust_expected = r#"
let arr: Vec<i32> = Vec::with_capacity(10);
"#;
assert!(c_code.contains("malloc(10 * sizeof(int))"));
assert!(rust_expected.contains("Vec::with_capacity(10)"));
}
#[test]
fn test_sizeof_char() {
let c_code = r#"
size_t char_size = sizeof(char);
"#;
let rust_expected = r#"
let char_size: usize = std::mem::size_of::<u8>();
"#;
assert!(c_code.contains("sizeof(char)"));
assert!(rust_expected.contains("std::mem::size_of::<u8>()"));
}
#[test]
fn test_sizeof_multidimensional_array() {
let c_code = r#"
int matrix[3][4];
size_t total_bytes = sizeof(matrix);
"#;
let rust_expected = r#"
let matrix: [[i32; 4]; 3];
let total_bytes: usize = std::mem::size_of_val(&matrix);
"#;
assert!(c_code.contains("sizeof(matrix)"));
assert!(rust_expected.contains("std::mem::size_of_val(&matrix)"));
}
#[test]
fn test_sizeof_in_conditional() {
let c_code = r#"
if (sizeof(void*) == 8) {
// 64-bit system
}
"#;
let rust_expected = r#"
if std::mem::size_of::<*const ()>() == 8 {
// 64-bit system
}
"#;
assert!(c_code.contains("sizeof(void*) == 8"));
assert!(rust_expected.contains("std::mem::size_of::<*const ()>() == 8"));
}
#[test]
fn test_sizeof_typedef() {
let c_code = r#"
typedef int MyInt;
size_t s = sizeof(MyInt);
"#;
let rust_expected = r#"
type MyInt = i32;
let s: usize = std::mem::size_of::<MyInt>();
"#;
assert!(c_code.contains("sizeof(MyInt)"));
assert!(rust_expected.contains("std::mem::size_of::<MyInt>()"));
}
#[test]
fn test_sizeof_struct_with_padding() {
let c_code = r#"
struct S {
char c;
int i;
};
size_t s = sizeof(struct S); // Likely 8, not 5
"#;
let rust_expected = r#"
#[repr(C)]
struct S {
c: u8,
i: i32,
}
let s: usize = std::mem::size_of::<S>(); // 8 with repr(C)
"#;
assert!(c_code.contains("sizeof(struct S)"));
assert!(rust_expected.contains("std::mem::size_of::<S>()"));
}
#[test]
fn test_sizeof_as_constant() {
let c_code = r#"
#define BUFFER_SIZE sizeof(struct Packet)
"#;
let rust_expected = r#"
const BUFFER_SIZE: usize = std::mem::size_of::<Packet>();
"#;
assert!(c_code.contains("sizeof(struct Packet)"));
assert!(rust_expected.contains("std::mem::size_of::<Packet>()"));
}
#[test]
fn test_sizeof_without_parentheses() {
let c_code = r#"
int x;
size_t s = sizeof x;
"#;
let rust_expected = r#"
let x: i32;
let s: usize = std::mem::size_of_val(&x);
"#;
assert!(c_code.contains("sizeof x"));
assert!(rust_expected.contains("std::mem::size_of_val(&x)"));
}
#[test]
fn test_sizeof_in_array_size() {
let c_code = r#"
struct Data data;
char buffer[sizeof(struct Data)];
"#;
let rust_expected = r#"
let data: Data;
let buffer: [u8; std::mem::size_of::<Data>()];
"#;
assert!(c_code.contains("sizeof(struct Data)"));
assert!(rust_expected.contains("std::mem::size_of::<Data>()"));
}
#[test]
fn test_sizeof_transformation_summary() {
let c_code = r#"
// Rule 1: sizeof(type) → size_of::<T>()
sizeof(int);
// Rule 2: sizeof expr → size_of_val(&expr)
int x; sizeof(x);
// Rule 3: sizeof(array) → size_of_val(&array)
int arr[10]; sizeof(arr);
// Rule 4: sizeof(struct) → size_of::<T>()
struct Point p; sizeof(struct Point);
// Rule 5: sizeof(pointer) → size_of::<*const T>()
sizeof(int*);
// Rule 6: Array length → .len()
sizeof(arr) / sizeof(arr[0]);
"#;
let rust_expected = r#"
// Rule 1: Generic function
std::mem::size_of::<i32>();
// Rule 2: Reference required
let x: i32; std::mem::size_of_val(&x);
// Rule 3: Full array size
let arr: [i32; 10]; std::mem::size_of_val(&arr);
// Rule 4: No "struct" keyword
let p: Point; std::mem::size_of::<Point>();
// Rule 5: Pointer type
std::mem::size_of::<*const i32>();
// Rule 6: Simpler method
arr.len();
"#;
assert!(c_code.contains("sizeof(int)"));
assert!(rust_expected.contains("std::mem::size_of::<i32>()"));
assert!(c_code.contains("sizeof(x)"));
assert!(rust_expected.contains("std::mem::size_of_val(&x)"));
assert!(c_code.contains("sizeof(arr) / sizeof(arr[0])"));
assert!(rust_expected.contains("arr.len()"));
}
}