const std = @import("std"); const io = std.io; const builtin = @import("builtin"); pub const io_mode: io.Mode = builtin.test_io_mode; pub fn main() void { const test_fn_list = builtin.test_functions; var ok_count: usize = 0; var skip_count: usize = 0; var fail_count: usize = 0; var async_frame_buffer: []align(std.Target.stack_align) u8 = undefined; // TODO this is on the next line (using `undefined` above) because otherwise zig incorrectly // ignores the alignment of the slice. async_frame_buffer = &[_]u8{}; for (test_fn_list) |test_fn| { const result = if (test_fn.async_frame_size) |size| switch (io_mode) { .evented => blk: { if (async_frame_buffer.len < size) { std.heap.page_allocator.free(async_frame_buffer); async_frame_buffer = std.heap.page_allocator.alignedAlloc(u8, std.Target.stack_align, size) catch @panic("out of memory"); } const casted_fn = @ptrCast(fn () callconv(.Async) anyerror!void, test_fn.func); break :blk await @asyncCall(async_frame_buffer, {}, casted_fn, .{}); }, .blocking => { skip_count += 1; continue; }, } else test_fn.func(); if (result) |_| { ok_count += 1; } else |err| switch (err) { error.SkipZigTest => { skip_count += 1; }, else => { fail_count += 1; }, } } if (ok_count == test_fn_list.len) { std.debug.print("All {d} tests passed.\n", .{ok_count}); } else { std.debug.print("{d} passed; {d} skipped; {d} failed.\n", .{ ok_count, skip_count, fail_count }); } if (ok_count != 1 or skip_count != 1 or fail_count != 1) { std.process.exit(1); } }