package zig_test import ( "cmp" "fmt" "strings" "testing" "git.frop.prof/luke/go-zig-compiler/internal/zig" ) func Expect[T cmp.Ordered](expected, actual T) error { if expected != actual { return fmt.Errorf("\nExpected: %v\nActual: %v", expected, actual) } return nil } func TestHelloWorld(t *testing.T) { expected := `//! Hello, world! const std = @import("std"); fn main() void { std.debug.print("Hello, world!\n", .{}); } ` root := &zig.Root{ ContainerDocComment: "Hello, world!", ContainerMembers: []*zig.ContainerMember{ { Decl: &zig.GlobalVarDecl{ Const: true, Name: "std", Value: &zig.CallExpr{ Fun: &zig.Identifier{Name: "@import"}, Args: []zig.Expr{ &zig.Literal{Kind: "string", Value: "std"}, }, }, }, }, { Decl: &zig.FnDecl{ Name: "main", ReturnType: &zig.Identifier{Name: "void"}, Body: &zig.Block{ Stmts: []zig.Stmt{ &zig.ExprStmt{ Expr: &zig.CallExpr{ Fun: &zig.FieldAccessExpr{ Receiver: &zig.FieldAccessExpr{ Receiver: &zig.Identifier{Name: "std"}, Field: "debug", }, Field: "print", }, Args: []zig.Expr{ &zig.Literal{Kind: "string", Value: "Hello, world!\n"}, &zig.InitListExpr{Empty: true}, }, }, }, }, }, }, }, }, } sb := new(strings.Builder) err := zig.Write(sb, root) if err != nil { t.FailNow() } actual := sb.String() if err = Expect(expected, actual); err != nil { t.Error(err) } }