1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
//! Tests for array params missing `&` bug (P0-ARRAY-REF-001).
//!
//! Verifies that array params generate `arr: &[i32]` NOT `arr: [i32]`
use decy_codegen::CodeGenerator;
use decy_hir::{HirFunction, HirParameter, HirStatement, HirType};
/// Helper: Create test function
fn create_function(
name: &str,
params: Vec<HirParameter>,
return_type: HirType,
body: Vec<HirStatement>,
) -> HirFunction {
HirFunction::new_with_body(name.to_string(), return_type, params, body)
}
// ============================================================================
// TEST 1: Array param has & reference
// ============================================================================
#[test]
fn test_array_param_has_reference() {
// void process(int arr[]) → fn process(arr: &[i32])
let func = create_function(
"process",
vec![HirParameter::new(
"arr".to_string(),
HirType::Array {
element_type: Box::new(HirType::Int),
size: None, // Unsized array
},
)],
HirType::Void,
vec![],
);
let generator = CodeGenerator::new();
let code = generator.generate_function(&func);
// Must have &[i32] not just [i32]
assert!(
code.contains("&[i32]") || code.contains("&mut [i32]"),
"Array param should be &[i32] or &mut [i32], got:\n{}",
code
);
// Must NOT have bare [i32] without &
let has_bare_array = code.contains(": [i32]") && !code.contains("&[i32]");
assert!(
!has_bare_array,
"Should NOT have bare [i32] without &:\n{}",
code
);
}
// ============================================================================
// TEST 2: Fixed-size array param has & reference
// ============================================================================
#[test]
fn test_fixed_array_param_has_reference() {
// void process(int arr[10]) → fn process(arr: &[i32])
let func = create_function(
"process_fixed",
vec![HirParameter::new(
"arr".to_string(),
HirType::Array {
element_type: Box::new(HirType::Int),
size: Some(10),
},
)],
HirType::Void,
vec![],
);
let generator = CodeGenerator::new();
let code = generator.generate_function(&func);
// Should have slice reference (arrays decay to pointers in C)
assert!(
code.contains("&[i32]") || code.contains("&mut [i32]"),
"Fixed array param should decay to slice reference:\n{}",
code
);
}
// ============================================================================
// TEST 3: Char array param has & reference
// ============================================================================
#[test]
fn test_char_array_param_has_reference() {
// void process(char str[]) → fn process(str: &[u8])
let func = create_function(
"process_str",
vec![HirParameter::new(
"str".to_string(),
HirType::Array {
element_type: Box::new(HirType::Char),
size: None,
},
)],
HirType::Void,
vec![],
);
let generator = CodeGenerator::new();
let code = generator.generate_function(&func);
assert!(
code.contains("&[u8]") || code.contains("&mut [u8]"),
"Char array param should be &[u8]:\n{}",
code
);
}