From 2727b5509e578e8388f3f0c736ebd9fa82922d25 Mon Sep 17 00:00:00 2001 From: agra Date: Sun, 15 Feb 2026 12:02:36 +0200 Subject: [PATCH] tests --- examples/10-generic-struct.sx | 3 +- examples/vision.sx | 98 --------------------------- src/codegen.zig | 10 ++- src/main.zig | 7 +- tests/expected/01-basic.exit | 1 + tests/expected/01-basic.txt | 1 + tests/expected/02-stdout.exit | 1 + tests/expected/02-stdout.txt | 1 + tests/expected/03-structs.exit | 1 + tests/expected/03-structs.txt | 6 ++ tests/expected/04-shadow.exit | 1 + tests/expected/04-shadow.txt | 4 ++ tests/expected/05-run.exit | 1 + tests/expected/05-run.txt | 2 + tests/expected/06-generic.exit | 1 + tests/expected/06-generic.txt | 3 + tests/expected/07-defer.exit | 1 + tests/expected/07-defer.txt | 1 + tests/expected/09-import.exit | 1 + tests/expected/09-import.txt | 2 + tests/expected/10-generic-struct.exit | 1 + tests/expected/10-generic-struct.txt | 16 +++++ tests/expected/11-vector-math.exit | 1 + tests/expected/11-vector-math.txt | 4 ++ tests/expected/12-meta.exit | 1 + tests/expected/12-meta.txt | 4 ++ tests/expected/13-code.exit | 1 + tests/expected/13-code.txt | 1 + tests/expected/14-demo.exit | 1 + tests/expected/14-demo.txt | 1 + tests/expected/15-while.exit | 1 + tests/expected/15-while.txt | 4 ++ tests/expected/16-union.exit | 1 + tests/expected/16-union.txt | 8 +++ tests/expected/17-lambda.exit | 1 + tests/expected/17-lambda.txt | 1 + tests/expected/18-conditions.exit | 1 + tests/expected/18-conditions.txt | 1 + tests/expected/19-varargs.exit | 1 + tests/expected/19-varargs.txt | 4 ++ tests/expected/20-any-varargs.exit | 1 + tests/expected/20-any-varargs.txt | 3 + tests/expected/21-categories.exit | 1 + tests/expected/21-categories.txt | 7 ++ tests/expected/22-anytype.exit | 1 + tests/expected/22-anytype.txt | 1 + tests/expected/23-quicksort.exit | 1 + tests/expected/23-quicksort.txt | 1 + tests/expected/24-list.exit | 1 + tests/expected/24-list.txt | 1 + tests/expected/25-slices.exit | 1 + tests/expected/25-slices.txt | 9 +++ tests/expected/26-pointers.exit | 1 + tests/expected/26-pointers.txt | 5 ++ tests/expected/29-fn-pointers.exit | 1 + tests/expected/29-fn-pointers.txt | 4 ++ tests/expected/30-union.exit | 1 + tests/expected/30-union.txt | 6 ++ tests/expected/31-flags.exit | 1 + tests/expected/31-flags.txt | 26 +++++++ tests/run_examples.sh | 92 +++++++++++++++++++++++++ 61 files changed, 263 insertions(+), 102 deletions(-) delete mode 100644 examples/vision.sx create mode 100644 tests/expected/01-basic.exit create mode 100644 tests/expected/01-basic.txt create mode 100644 tests/expected/02-stdout.exit create mode 100644 tests/expected/02-stdout.txt create mode 100644 tests/expected/03-structs.exit create mode 100644 tests/expected/03-structs.txt create mode 100644 tests/expected/04-shadow.exit create mode 100644 tests/expected/04-shadow.txt create mode 100644 tests/expected/05-run.exit create mode 100644 tests/expected/05-run.txt create mode 100644 tests/expected/06-generic.exit create mode 100644 tests/expected/06-generic.txt create mode 100644 tests/expected/07-defer.exit create mode 100644 tests/expected/07-defer.txt create mode 100644 tests/expected/09-import.exit create mode 100644 tests/expected/09-import.txt create mode 100644 tests/expected/10-generic-struct.exit create mode 100644 tests/expected/10-generic-struct.txt create mode 100644 tests/expected/11-vector-math.exit create mode 100644 tests/expected/11-vector-math.txt create mode 100644 tests/expected/12-meta.exit create mode 100644 tests/expected/12-meta.txt create mode 100644 tests/expected/13-code.exit create mode 100644 tests/expected/13-code.txt create mode 100644 tests/expected/14-demo.exit create mode 100644 tests/expected/14-demo.txt create mode 100644 tests/expected/15-while.exit create mode 100644 tests/expected/15-while.txt create mode 100644 tests/expected/16-union.exit create mode 100644 tests/expected/16-union.txt create mode 100644 tests/expected/17-lambda.exit create mode 100644 tests/expected/17-lambda.txt create mode 100644 tests/expected/18-conditions.exit create mode 100644 tests/expected/18-conditions.txt create mode 100644 tests/expected/19-varargs.exit create mode 100644 tests/expected/19-varargs.txt create mode 100644 tests/expected/20-any-varargs.exit create mode 100644 tests/expected/20-any-varargs.txt create mode 100644 tests/expected/21-categories.exit create mode 100644 tests/expected/21-categories.txt create mode 100644 tests/expected/22-anytype.exit create mode 100644 tests/expected/22-anytype.txt create mode 100644 tests/expected/23-quicksort.exit create mode 100644 tests/expected/23-quicksort.txt create mode 100644 tests/expected/24-list.exit create mode 100644 tests/expected/24-list.txt create mode 100644 tests/expected/25-slices.exit create mode 100644 tests/expected/25-slices.txt create mode 100644 tests/expected/26-pointers.exit create mode 100644 tests/expected/26-pointers.txt create mode 100644 tests/expected/29-fn-pointers.exit create mode 100644 tests/expected/29-fn-pointers.txt create mode 100644 tests/expected/30-union.exit create mode 100644 tests/expected/30-union.txt create mode 100644 tests/expected/31-flags.exit create mode 100644 tests/expected/31-flags.txt create mode 100755 tests/run_examples.sh diff --git a/examples/10-generic-struct.sx b/examples/10-generic-struct.sx index a51a6cf..6123f49 100644 --- a/examples/10-generic-struct.sx +++ b/examples/10-generic-struct.sx @@ -85,7 +85,6 @@ main :: () { print("{}\n", size_of(Foo)); print("{}\n", size_of(Complex)); - - size:= size_of(Sx); + size := size_of(Sx); print("{}\n", size); } diff --git a/examples/vision.sx b/examples/vision.sx deleted file mode 100644 index 71b2031..0000000 --- a/examples/vision.sx +++ /dev/null @@ -1,98 +0,0 @@ -main :: { - // imagine a game loop - while(running) { - render_ui(build_menu); - } -} - -build_menu :: (ctx: ViewContext) -> View { - // use ctx to allocate some state at the for Menu ViewContext - state : MenuState = ctx.state(MenuState); - - // named args - HStack(ctx, - children = .[ - Button(ctx, - label = "Up", - onTap = ctx.callback(goUp, state), - ), - ScrollView(ctx, - LazyVStack(ctx, - builder = ctx.callback(build_menu_entry, state), - ), - ) - ], - ); -} - -build_menu_entry :: (ctx: *ViewContext, index: s32, state: *MenuState) -> View { - entry := state.entries[index]; - is_selected := index == state.selected_index; - icon := if entry.is_dir then "[D]" else " "; - Button(ctx, - label = concat(icon, " ", entry.name), - on_tap = ctx.callback(menu_go, state, index), - ); -} - -ViewContext :: struct { - //TBD -} - -MenuState :: struct { - current_path: string; - entries: List(MenuEntry); - error_message: string; -} - -MenuEntry :: struct { - name: string; - is_dir: bool; -} - -menu_go_up :: (state: *MenuState) { - parent := fs.path.dirname(state.current_path) else return; - // this frees the current path & copies parent to be owned by MenuState - state.current_path = parent; - menu_refresh(state); -} - -menu_go :: (state: *MenuState, s32 index) { - entry := state.entries[index] else return; - state.current_path := concat(state.current_path, "/", entry.name); - menu_refresh(state); -} - -menu_refresh :: (state: *MenuState) { - // this could retain the capacity - state.entries.clear(); - // this would basically create a copy of the empty string :( - state.error_message = ""; - - // ... multi return params vs Generic Result to deal with exceptions - // ... nullable - dir := io.Dir.open(state.current_path); - if !dir { - state.error_message = "failed to open"; - return; - }; - defer dir.close(); - - for iter.iterate() { - entries.append(.{it.name, it.kind == .Directory}); - } -} - -HStackState :: struct { - spacing: f32 = 8; - alignment: VerticalAlignment = .center; - padding: f32 = 0; - background: ?Color; - corner_radius: f32 = 0, -} - -HStack :: (ctx: ViewContext, children: []View) -> View { - data := ctx.alloc(HStackState); - data.* = .{}; -} - diff --git a/src/codegen.zig b/src/codegen.zig index c9a5c20..faa3754 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -4223,8 +4223,16 @@ pub const CodeGen = struct { fn genSizeOf(self: *CodeGen, call_node: ast.Call) !c.LLVMValueRef { if (call_node.args.len != 1) return self.emitError("size_of expects exactly 1 argument"); - const ty = self.resolveType(call_node.args[0]); + const arg = call_node.args[0]; + const ty = self.resolveType(arg); if (std.meta.eql(ty, Type.void_type)) { + // Uninstantiated generic type function → size of a function pointer + if (arg.data == .identifier or arg.data == .type_expr) { + const name = if (arg.data == .identifier) arg.data.identifier.name else arg.data.type_expr.name; + if (self.generic_templates.contains(name) or self.generic_struct_templates.contains(name)) { + return self.constInt64(self.getTypeSize(self.ptrType())); + } + } return self.constInt64(0); } const llvm_ty = self.typeToLLVM(ty); diff --git a/src/main.zig b/src/main.zig index 96788b6..20460eb 100644 --- a/src/main.zig +++ b/src/main.zig @@ -97,10 +97,15 @@ pub fn main(init: std.process.Init) !void { std.debug.print("error: failed to run program\n", .{}); return; }; - _ = child.wait(io) catch { + const term = child.wait(io) catch { std.debug.print("error: program execution failed\n", .{}); return; }; + switch (term) { + .exited => |code| if (code != 0) std.process.exit(code), + .signal => std.process.exit(1), + .stopped, .unknown => std.process.exit(1), + } } else { printUsage(); } diff --git a/tests/expected/01-basic.exit b/tests/expected/01-basic.exit new file mode 100644 index 0000000..d81cc07 --- /dev/null +++ b/tests/expected/01-basic.exit @@ -0,0 +1 @@ +42 diff --git a/tests/expected/01-basic.txt b/tests/expected/01-basic.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/tests/expected/01-basic.txt @@ -0,0 +1 @@ + diff --git a/tests/expected/02-stdout.exit b/tests/expected/02-stdout.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/02-stdout.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/02-stdout.txt b/tests/expected/02-stdout.txt new file mode 100644 index 0000000..e965047 --- /dev/null +++ b/tests/expected/02-stdout.txt @@ -0,0 +1 @@ +Hello diff --git a/tests/expected/03-structs.exit b/tests/expected/03-structs.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/03-structs.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/03-structs.txt b/tests/expected/03-structs.txt new file mode 100644 index 0000000..13a3e2a --- /dev/null +++ b/tests/expected/03-structs.txt @@ -0,0 +1,6 @@ +v1: Vec4{x: 1.000000, y: 2.000000, z: 3.000000, w: 0.000000} +v2: Vec4{x: 4.000000, y: 1.000000, z: 1.000000, w: 3.000000} +v3: Vec4{x: 2.000000, y: 3.000000, z: 4.000000, w: 0.000000} +v4: Vec4{x: 9.000000, y: 0.000000, z: 5.000000, w: 6.000000} + +Complex{foo: .S(Complex.foo.B{val: hello})} diff --git a/tests/expected/04-shadow.exit b/tests/expected/04-shadow.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/04-shadow.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/04-shadow.txt b/tests/expected/04-shadow.txt new file mode 100644 index 0000000..3de6937 --- /dev/null +++ b/tests/expected/04-shadow.txt @@ -0,0 +1,4 @@ +scope opened +scoped x: 6 +scope closed +main x: 42 diff --git a/tests/expected/05-run.exit b/tests/expected/05-run.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/05-run.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/05-run.txt b/tests/expected/05-run.txt new file mode 100644 index 0000000..39e6780 --- /dev/null +++ b/tests/expected/05-run.txt @@ -0,0 +1,2 @@ +hello 25 +hello 25 diff --git a/tests/expected/06-generic.exit b/tests/expected/06-generic.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/06-generic.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/06-generic.txt b/tests/expected/06-generic.txt new file mode 100644 index 0000000..c5b2aaa --- /dev/null +++ b/tests/expected/06-generic.txt @@ -0,0 +1,3 @@ +sum: 5 +sum: 42 +sum: 42.500000 diff --git a/tests/expected/07-defer.exit b/tests/expected/07-defer.exit new file mode 100644 index 0000000..d81cc07 --- /dev/null +++ b/tests/expected/07-defer.exit @@ -0,0 +1 @@ +42 diff --git a/tests/expected/07-defer.txt b/tests/expected/07-defer.txt new file mode 100644 index 0000000..ae3eb5b --- /dev/null +++ b/tests/expected/07-defer.txt @@ -0,0 +1 @@ +still here diff --git a/tests/expected/09-import.exit b/tests/expected/09-import.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/09-import.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/09-import.txt b/tests/expected/09-import.txt new file mode 100644 index 0000000..b9402ac --- /dev/null +++ b/tests/expected/09-import.txt @@ -0,0 +1,2 @@ +hello thereafter hello +[1.000000, 2.000000, 3.000000] diff --git a/tests/expected/10-generic-struct.exit b/tests/expected/10-generic-struct.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/10-generic-struct.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/10-generic-struct.txt b/tests/expected/10-generic-struct.txt new file mode 100644 index 0000000..99abcd6 --- /dev/null +++ b/tests/expected/10-generic-struct.txt @@ -0,0 +1,16 @@ +v1: Vec__3_f32{data: [1.000000, 3.000000, 2.000000]} +v2: [1.000000, 3.000000, 2.000000] +buff: [0.000000, 2.000000, 3.500000, 4.000000, 0.000000] +comp: Complex__u32{value: 42, count: 1} +add: [4.000000, 5.000000, 3.000000] +v2.x: 1.000000 +v2[1]: 3.000000 +scaled: [2.000000, 6.000000, 4.000000] +neg: [-1.000000, -3.000000, -2.000000] +sqrt(9): 3.000000 +.counter(0.500000) +4 +16 +8 +8 +8 diff --git a/tests/expected/11-vector-math.exit b/tests/expected/11-vector-math.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/11-vector-math.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/11-vector-math.txt b/tests/expected/11-vector-math.txt new file mode 100644 index 0000000..0e39165 --- /dev/null +++ b/tests/expected/11-vector-math.txt @@ -0,0 +1,4 @@ +dot: 0.000000 +cross: [0.000000, 0.000000, 1.000000] +length: 5.000000 +norm: [0.600000, 0.800000, 0.000000] diff --git a/tests/expected/12-meta.exit b/tests/expected/12-meta.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/12-meta.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/12-meta.txt b/tests/expected/12-meta.txt new file mode 100644 index 0000000..84b8809 --- /dev/null +++ b/tests/expected/12-meta.txt @@ -0,0 +1,4 @@ +f64 +3.200000 +Vec4 +() -> s32 diff --git a/tests/expected/13-code.exit b/tests/expected/13-code.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/13-code.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/13-code.txt b/tests/expected/13-code.txt new file mode 100644 index 0000000..e724533 --- /dev/null +++ b/tests/expected/13-code.txt @@ -0,0 +1 @@ +hello from the other side diff --git a/tests/expected/14-demo.exit b/tests/expected/14-demo.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/14-demo.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/14-demo.txt b/tests/expected/14-demo.txt new file mode 100644 index 0000000..4dbb69d --- /dev/null +++ b/tests/expected/14-demo.txt @@ -0,0 +1 @@ +[1.000000, 0.000000, -1.000000] diff --git a/tests/expected/15-while.exit b/tests/expected/15-while.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/15-while.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/15-while.txt b/tests/expected/15-while.txt new file mode 100644 index 0000000..680d5cf --- /dev/null +++ b/tests/expected/15-while.txt @@ -0,0 +1,4 @@ +count: 5 +break at: 12 +sum of odd 1-9: 25 +sum 55 diff --git a/tests/expected/16-union.exit b/tests/expected/16-union.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/16-union.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/16-union.txt b/tests/expected/16-union.txt new file mode 100644 index 0000000..3504f10 --- /dev/null +++ b/tests/expected/16-union.txt @@ -0,0 +1,8 @@ +circle: .circle(3.140000) +radius: 3.140000 +none: .circle +rect: .circle(Shape.rect{w: 4.000000, h: 2.000000}) +sh: .circle(2.710000) +rect val: Shape.rect{w: 2.000000, h: 4.000000} +matched rect +case : 2 diff --git a/tests/expected/17-lambda.exit b/tests/expected/17-lambda.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/17-lambda.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/17-lambda.txt b/tests/expected/17-lambda.txt new file mode 100644 index 0000000..a83d1d5 --- /dev/null +++ b/tests/expected/17-lambda.txt @@ -0,0 +1 @@ +-3 diff --git a/tests/expected/18-conditions.exit b/tests/expected/18-conditions.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/18-conditions.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/18-conditions.txt b/tests/expected/18-conditions.txt new file mode 100644 index 0000000..f2f029d --- /dev/null +++ b/tests/expected/18-conditions.txt @@ -0,0 +1 @@ +containedcontainedcontained diff --git a/tests/expected/19-varargs.exit b/tests/expected/19-varargs.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/19-varargs.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/19-varargs.txt b/tests/expected/19-varargs.txt new file mode 100644 index 0000000..232307c --- /dev/null +++ b/tests/expected/19-varargs.txt @@ -0,0 +1,4 @@ +60 +1 2 3 4 5 +60 +10 20 30 diff --git a/tests/expected/20-any-varargs.exit b/tests/expected/20-any-varargs.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/20-any-varargs.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/20-any-varargs.txt b/tests/expected/20-any-varargs.txt new file mode 100644 index 0000000..db5f0fb --- /dev/null +++ b/tests/expected/20-any-varargs.txt @@ -0,0 +1,3 @@ +42 hello true 3.140000 +point: (10,20) 99 +3 diff --git a/tests/expected/21-categories.exit b/tests/expected/21-categories.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/21-categories.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/21-categories.txt b/tests/expected/21-categories.txt new file mode 100644 index 0000000..1ff4278 --- /dev/null +++ b/tests/expected/21-categories.txt @@ -0,0 +1,7 @@ +p: Point{x: 10, y: 20} +c: Color{r: 255, g: 128, b: 0} +n: 42 +s: hello +b: true +&p: *Point@0xADDR +&p: *Point@0xADDR diff --git a/tests/expected/22-anytype.exit b/tests/expected/22-anytype.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/22-anytype.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/22-anytype.txt b/tests/expected/22-anytype.txt new file mode 100644 index 0000000..7ed6ff8 --- /dev/null +++ b/tests/expected/22-anytype.txt @@ -0,0 +1 @@ +5 diff --git a/tests/expected/23-quicksort.exit b/tests/expected/23-quicksort.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/23-quicksort.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/23-quicksort.txt b/tests/expected/23-quicksort.txt new file mode 100644 index 0000000..3563ea2 --- /dev/null +++ b/tests/expected/23-quicksort.txt @@ -0,0 +1 @@ +[1, 2, 2, 2, 3, 3, 4, 5, 5, 6, 6, 333] diff --git a/tests/expected/24-list.exit b/tests/expected/24-list.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/24-list.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/24-list.txt b/tests/expected/24-list.txt new file mode 100644 index 0000000..98c2e6e --- /dev/null +++ b/tests/expected/24-list.txt @@ -0,0 +1 @@ +List__s32{items: [*]s32@0xADDR, len: 5, cap: 8} diff --git a/tests/expected/25-slices.exit b/tests/expected/25-slices.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/25-slices.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/25-slices.txt b/tests/expected/25-slices.txt new file mode 100644 index 0000000..dd3a9a8 --- /dev/null +++ b/tests/expected/25-slices.txt @@ -0,0 +1,9 @@ +arr.len = 5 +arr[1..4] = [1, 4, 1] +sub.len = 3 +arr[..3] = [3, 1, 4] +arr[2..] = [4, 1, 5] +sl[1..4] = [20, 30, 40] +mid[1..] = [30, 40] +msg[6..11] = world +msg[..5] = hello diff --git a/tests/expected/26-pointers.exit b/tests/expected/26-pointers.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/26-pointers.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/26-pointers.txt b/tests/expected/26-pointers.txt new file mode 100644 index 0000000..fc47ddc --- /dev/null +++ b/tests/expected/26-pointers.txt @@ -0,0 +1,5 @@ +before: Vec2{x: 1.000000, y: 2.000000} +after: Vec2{x: 99.000000, y: 2.000000} +copy: Vec2{x: 99.000000, y: 2.000000} +mp[0] = 10 +mp[2] = 30 diff --git a/tests/expected/29-fn-pointers.exit b/tests/expected/29-fn-pointers.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/29-fn-pointers.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/29-fn-pointers.txt b/tests/expected/29-fn-pointers.txt new file mode 100644 index 0000000..a799a7f --- /dev/null +++ b/tests/expected/29-fn-pointers.txt @@ -0,0 +1,4 @@ +fp(3,4) = 7 +fp(3,4) = 12 +apply(add,5,6) = 11 +apply(mul,5,6) = 30 diff --git a/tests/expected/30-union.exit b/tests/expected/30-union.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/30-union.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/30-union.txt b/tests/expected/30-union.txt new file mode 100644 index 0000000..4cf92e1 --- /dev/null +++ b/tests/expected/30-union.txt @@ -0,0 +1,6 @@ +f=3.140000 +i=1078523331 +x=1.000000 +y=2.000000 +data[0]=1.000000 +data[1]=2.000000 diff --git a/tests/expected/31-flags.exit b/tests/expected/31-flags.exit new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/expected/31-flags.exit @@ -0,0 +1 @@ +0 diff --git a/tests/expected/31-flags.txt b/tests/expected/31-flags.txt new file mode 100644 index 0000000..e105ef2 --- /dev/null +++ b/tests/expected/31-flags.txt @@ -0,0 +1,26 @@ +perms: .read | .write + checking: .read | .write + - can read + - can write + +all: .read | .write | .execute + checking: .read | .write | .execute + - can read + - can write + - can execute + +read only: .read + checking: .read + - can read + +match on flags: + execute + +window: .vsync | .resizable +raw value: 68 + +color: .blue +raw: 2 + +0xFF & 0x0F = 15 +1 | 2 | 4 = 7 diff --git a/tests/run_examples.sh b/tests/run_examples.sh new file mode 100755 index 0000000..07ff2eb --- /dev/null +++ b/tests/run_examples.sh @@ -0,0 +1,92 @@ +#!/bin/bash +# Example regression test runner +# Usage: ./tests/run_examples.sh [--update] +# --update: regenerate expected output and exit code files + +set -uo pipefail + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" +SX="$ROOT_DIR/zig-out/bin/sx" +EXPECTED_DIR="$SCRIPT_DIR/expected" + +PASS=0 +FAIL=0 +SKIP=0 +TIMEOUT_COUNT=0 +UPDATE=0 +TIMEOUT=10 + +if [[ "${1:-}" == "--update" ]]; then + UPDATE=1 +fi + +normalize() { + sed 's/0x[0-9a-f]\{4,\}/0xADDR/g' +} + +for expected_file in "$EXPECTED_DIR"/*.txt; do + name=$(basename "$expected_file" .txt) + sx_file="$ROOT_DIR/examples/${name}.sx" + exit_file="$EXPECTED_DIR/${name}.exit" + + if [[ ! -f "$sx_file" ]]; then + SKIP=$((SKIP + 1)) + continue + fi + + printf " %-30s" "$name" + actual=$(timeout "$TIMEOUT" "$SX" run "$sx_file" 2>&1 | normalize) + actual_exit=${PIPESTATUS[0]} + + if [[ $actual_exit -eq 124 ]]; then + TIMEOUT_COUNT=$((TIMEOUT_COUNT + 1)) + echo "TIMEOUT (>${TIMEOUT}s)" + continue + fi + + if [[ $UPDATE -eq 1 ]]; then + echo "$actual" > "$expected_file" + echo "$actual_exit" > "$exit_file" + echo " updated $name (exit=$actual_exit)" + continue + fi + + expected=$(cat "$expected_file" | normalize) + expected_exit=0 + if [[ -f "$exit_file" ]]; then + expected_exit=$(cat "$exit_file") + fi + + output_ok=true + exit_ok=true + + if [[ "$actual" != "$expected" ]]; then + output_ok=false + fi + if [[ "$actual_exit" != "$expected_exit" ]]; then + exit_ok=false + fi + + if $output_ok && $exit_ok; then + PASS=$((PASS + 1)) + echo "ok" + else + FAIL=$((FAIL + 1)) + echo "FAIL" + if ! $output_ok; then + diff <(echo "$expected") <(echo "$actual") || true + fi + if ! $exit_ok; then + echo " exit code: expected=$expected_exit actual=$actual_exit" + fi + fi +done + +if [[ $UPDATE -eq 1 ]]; then + echo "Updated all expected output files." + exit 0 +fi + +echo "$PASS passed, $FAIL failed, $SKIP skipped, $TIMEOUT_COUNT timed out" +[[ $FAIL -eq 0 && $TIMEOUT_COUNT -eq 0 ]]