suicmez/tests/codegen/README.md
2025-12-17 13:18:12 +05:30

201 lines
4.6 KiB
Markdown

# Codegen Tests
This directory contains test cases for the suicmez compiler's code generation (codegen) phase. Each test demonstrates different language features and their corresponding C output.
## Test Files
### Basic Tests
#### `test_executable.sui` / `test_executable.c`
**Purpose:** Simple executable test with basic integer arithmetic
**Features:**
- Basic function definitions
- Integer variables and operations
- Return statements
**Run:**
```bash
suicmez tests/codegen/test_executable.sui
gcc tests/codegen/test_executable.c -o test_executable
./test_executable
```
#### `test_array_simple.sui` / `test_array_simple.c`
**Purpose:** Test heap-allocated arrays with indexing
**Features:**
- Array literals: `[1, 2, 3]`
- Array indexing: `arr[0]`
- Arrays as pointers: `int*`
- C99 compound literals for array initialization
**Output:**
```
| int* arr = (int[]){1, 2, 3} |
0x...
| int x = arr[0] |
1
```
#### `test_enum_simple.sui` / `test_enum_simple.c`
**Purpose:** Test enum types with discriminant + union pattern
**Features:**
- Enum variants
- Discriminant field for pattern matching
- Union-based storage for variant data
- Proper struct ordering
**Generated Structures:**
```c
struct Color_Red { };
struct Color_Green { };
struct Color_Blue { };
struct Color_union {
struct Color_Red red;
struct Color_Green green;
struct Color_Blue blue;
};
struct Color {
int discriminant;
struct Color_union data;
};
```
### Comprehensive Tests
#### `test_comprehensive.sui` / `test_comprehensive.c`
**Purpose:** Combined test of all major features
**Features:**
- Stack-allocated types: `int`, `float`, `bool`
- Heap-allocated types: arrays, strings
- Struct instantiation and field access
- Enum creation and initialization
- Function calls with multiple parameters
- Complex expressions
**Demonstrates:**
- Proper memory management distinctions
- Type conversions and initializations
- Debug output for each statement
**Run:**
```bash
suicmez tests/codegen/test_comprehensive.sui
gcc tests/codegen/test_comprehensive.c -o test_comprehensive
./test_comprehensive
```
**Sample Output:**
```
| int x = 10 |
10
| int y = 20 |
20
| int sum = add(x, y) |
30
| struct Point p = (struct Point){ .x = 5, .y = 15 } |
5
| int* arr = (int[]){1, 2, 3, 4, 5} |
0x7ffd6d57d0b0
| int first = arr[0] |
1
| char* msg = "hello" |
hello
```
#### `test_all_types.sui` / `test_all_types.c`
**Purpose:** Exhaustive test of all language types
**Features:**
- All primitive types: `int`, `float`, `bool`
- Strings with heap allocation
- Structs with multiple fields
- Enums with discriminant
- Arrays with indexing
**Run:**
```bash
suicmez tests/codegen/test_all_types.sui
gcc tests/codegen/test_all_types.c -o test_all_types
./test_all_types
```
## Memory Management Strategy
The codegen implements the following allocation strategy:
### Stack-Allocated (Copyable)
- `int`, `float`, `bool`, `char` - passed by value
- Structs (stored directly, not as pointers)
- Enums (stored directly with discriminant + union)
### Heap-Allocated (with Debug Visibility)
- **Arrays**: `int*` pointers created with C99 compound literals
```c
int* arr = (int[]){1, 2, 3, 4, 5};
```
- **Strings**: `char*` pointers to string constants
```c
char* msg = "hello";
```
## Debug Output Feature
Every statement generates debug output showing:
1. The executed statement
2. The resulting value (if applicable)
**Format:**
```c
int x = 10;
printf("| int x = 10 | \n %d\n", x);
```
**Output:**
```
| int x = 10 |
10
```
### Format Specifiers
The system automatically selects the correct format:
- `%d` - integers and booleans
- `%f` - floats
- `%s` - strings (char*)
- `%p` - pointers and arrays
## Compilation
All generated C code compiles with standard C99:
```bash
gcc -std=c99 <file>.c -o <executable>
```
## Running Tests Manually
```bash
# Generate C code from .sui file
suicmez tests/codegen/test_comprehensive.sui
# Compile the generated C code
gcc tests/codegen/test_comprehensive.c -o /tmp/test_comprehensive
# Run with debug output
/tmp/test_comprehensive
```
## Expected Behavior
All tests should:
1. ✅ Compile successfully with GCC
2. ✅ Generate valid C99 code
3. ✅ Execute without errors
4. ✅ Display debug output for each statement
5. ✅ Return correct exit codes
## Implementation Notes
- Structs are declared before enums in the output to avoid forward references
- Enum variant structs are generated before the union
- Array types use C99 compound literals for initialization
- All pointers are properly typed (not generic `void*`)
- Debug output uses `printf` with appropriate format specifiers