test: expand golden C-codegen tests from 2 to 8 examples

Add golden tests for: structs, generics, algebraic_enums, enums,
methods, strings. Each test captures the expected C output from the
bootstrap compiler for regression detection.

Also remove leftover 'PARSER FIX V2 ACTIVE' debug print from parser.bux.
This commit is contained in:
2026-06-09 15:58:44 +03:00
parent 3ed5891de2
commit 265bda850d
20 changed files with 29235 additions and 2 deletions
+1 -1
View File
@@ -78,7 +78,7 @@ selfhost: build
.PHONY: test-golden .PHONY: test-golden
GOLDEN_TESTS := hello fibonacci GOLDEN_TESTS := hello fibonacci structs generics algebraic_enums enums methods strings
test-golden: build test-golden: build
@echo "=== Golden tests ===" @echo "=== Golden tests ==="
-1
View File
@@ -553,7 +553,6 @@ func parserParsePostfixExpr(p: *Parser) -> *Expr {
let siCol: uint32 = parserCurToken(p).column; let siCol: uint32 = parserCurToken(p).column;
let typeName: String = left.strValue; let typeName: String = left.strValue;
var fieldCount: int = 0; var fieldCount: int = 0;
PrintLine("PARSER FIX V2 ACTIVE");
var firstField: *Expr = null as *Expr; var firstField: *Expr = null as *Expr;
var lastField: *Expr = null as *Expr; var lastField: *Expr = null as *Expr;
while !parserCheck(p, tkRBrace) && parserPeek(p, 0) != tkEndOfFile { while !parserCheck(p, tkRBrace) && parserPeek(p, 0) != tkEndOfFile {
+7
View File
@@ -0,0 +1,7 @@
[Package]
Name = "algebraic_enums"
Version = "0.1.0"
Type = "bin"
[Build]
Output = "Bin"
File diff suppressed because it is too large Load Diff
+29
View File
@@ -0,0 +1,29 @@
// Algebraic Enums - Enums with data (tagged unions)
import Std::Io::{PrintLine, PrintInt};
enum Result {
Ok(int),
Err(String)
}
func Main() -> int {
let r1: Result = Result { tag: Result_Ok };
r1.data.Ok_0 = 42;
let r2: Result = Result { tag: Result_Err };
r2.data.Err_0 = "error message";
if r1.tag == Result_Ok {
PrintLine("r1 is Ok:");
PrintInt(r1.data.Ok_0);
PrintLine("");
}
if r2.tag == Result_Err {
PrintLine("r2 is Err:");
PrintLine(r2.data.Err_0);
}
return 0;
}
+7
View File
@@ -0,0 +1,7 @@
[Package]
Name = "enums"
Version = "0.1.0"
Type = "bin"
[Build]
Output = "Bin"
File diff suppressed because it is too large Load Diff
+34
View File
@@ -0,0 +1,34 @@
// Enums - Enumeration types
import Std::Io::{PrintLine, PrintInt};
enum Color {
Red,
Green,
Blue
}
func ColorName(c: Color) -> String {
if c == Color::Red {
return "Red";
}
if c == Color::Green {
return "Green";
}
if c == Color::Blue {
return "Blue";
}
return "Unknown";
}
func Main() -> int {
let myColor: Color = Color::Green;
PrintLine("My color is:");
PrintLine(ColorName(myColor));
PrintLine("Color value:");
PrintInt(myColor as int);
PrintLine("");
return 0;
}
+7
View File
@@ -0,0 +1,7 @@
[Package]
Name = "generics"
Version = "0.1.0"
Type = "bin"
[Build]
Output = "Bin"
File diff suppressed because it is too large Load Diff
+26
View File
@@ -0,0 +1,26 @@
// Generics - Generic functions and structs
import Std::Io::{PrintLine, PrintInt};
func Max<T>(a: T, b: T) -> T {
if a > b {
return a;
} else {
return b;
}
}
func Main() -> int {
let m1: int = Max<int>(10, 20);
let m2: int = Max<int>(5, 3);
PrintLine("Max(10, 20) = ");
PrintInt(m1);
PrintLine("");
PrintLine("Max(5, 3) = ");
PrintInt(m2);
PrintLine("");
return 0;
}
+7
View File
@@ -0,0 +1,7 @@
[Package]
Name = "methods"
Version = "0.1.0"
Type = "bin"
[Build]
Output = "Bin"
File diff suppressed because it is too large Load Diff
+38
View File
@@ -0,0 +1,38 @@
// Methods - Struct with methods using extend
import Std::Io::{PrintLine, PrintInt};
struct Rectangle {
width: int;
height: int;
}
extend Rectangle {
func Area(self: Rectangle) -> int {
return self.width * self.height;
}
func Perimeter(self: Rectangle) -> int {
return 2 * (self.width + self.height);
}
}
func Main() -> int {
let rect: Rectangle = Rectangle { width: 10, height: 5 };
PrintLine("Rectangle:");
PrintLine("Width = ");
PrintInt(rect.width);
PrintLine("");
PrintLine("Height = ");
PrintInt(rect.height);
PrintLine("");
PrintLine("Area = ");
PrintInt(rect.Area());
PrintLine("");
PrintLine("Perimeter = ");
PrintInt(rect.Perimeter());
PrintLine("");
return 0;
}
+7
View File
@@ -0,0 +1,7 @@
[Package]
Name = "strings"
Version = "0.1.0"
Type = "bin"
[Build]
Output = "Bin"
File diff suppressed because it is too large Load Diff
+34
View File
@@ -0,0 +1,34 @@
// Strings - String manipulation with Std::String
import Std::Io::{PrintLine, PrintInt};
import Std::String::{String_Len, String_Eq, String_Concat};
func Main() -> int {
let hello: String = "Hello";
let world: String = "World";
PrintLine("String operations:");
// Length
PrintLine("Length of 'Hello':");
PrintInt(String_Len(hello));
PrintLine("");
// Concatenation
let greeting: String = String_Concat(hello, ", ");
let greeting2: String = String_Concat(greeting, world);
let full: String = String_Concat(greeting2, "!");
PrintLine("Concatenated:");
PrintLine(full);
// Equality
if String_Eq(hello, "Hello") {
PrintLine("'Hello' equals 'Hello'");
}
if !String_Eq(hello, world) {
PrintLine("'Hello' does not equal 'World'");
}
return 0;
}
+7
View File
@@ -0,0 +1,7 @@
[Package]
Name = "structs"
Version = "0.1.0"
Type = "bin"
[Build]
Output = "Bin"
File diff suppressed because it is too large Load Diff
+29
View File
@@ -0,0 +1,29 @@
// Structs - Basic struct usage
import Std::Io::{PrintLine, PrintInt};
struct Point {
x: int;
y: int;
}
func AddPoints(a: Point, b: Point) -> Point {
let result: Point = Point { x: a.x + b.x, y: a.y + b.y };
return result;
}
func Main() -> int {
let p1: Point = Point { x: 10, y: 20 };
let p2: Point = Point { x: 5, y: 15 };
let sum: Point = AddPoints(p1, p2);
PrintLine("Point sum:");
PrintLine("x = ");
PrintInt(sum.x);
PrintLine("");
PrintLine("y = ");
PrintInt(sum.y);
PrintLine("");
return 0;
}