authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-06-28 13:06:40+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-06-28 13:28:05+02:00
log6420e9350c2e940f850c32beadff4042858dc243
tree28dc2a1c45991b2dde28afe76c2c2ce7d45b1064
parent1188415f4cb73440fde05047cd8e6b79a2255efa

test: return error on unknown config value


2 files changed, 22 insertions(+), 18 deletions(-)

src/test.zig+21-18
......@@ -235,9 +235,9 @@ const TestManifest = struct {
235235 inner: std.mem.SplitIterator(u8),
236236 parse_fn: ParseFn(T),
237237
238 fn next(self: *@This()) ?T {
238 fn next(self: *@This()) !?T {
239239 const next_raw = self.inner.next() orelse return null;
240 return self.parse_fn(next_raw);
240 return try self.parse_fn(next_raw);
241241 }
242242 };
243243 }
......@@ -339,20 +339,20 @@ const TestManifest = struct {
339339 allocator: Allocator,
340340 key: []const u8,
341341 comptime T: type,
342 ) error{OutOfMemory}![]const T {
342 ) ![]const T {
343343 var out = std.ArrayList(T).init(allocator);
344344 defer out.deinit();
345345 var it = self.getConfigForKey(key, T);
346 while (it.next()) |item| {
346 while (try it.next()) |item| {
347347 try out.append(item);
348348 }
349349 return out.toOwnedSlice();
350350 }
351351
352 fn getConfigForKeyAssertSingle(self: TestManifest, key: []const u8, comptime T: type) T {
352 fn getConfigForKeyAssertSingle(self: TestManifest, key: []const u8, comptime T: type) !T {
353353 var it = self.getConfigForKey(key, T);
354 const res = it.next().?;
355 assert(it.next() == null);
354 const res = (try it.next()) orelse unreachable;
355 assert((try it.next()) == null);
356356 return res;
357357 }
358358
......@@ -373,33 +373,36 @@ const TestManifest = struct {
373373 }
374374
375375 fn ParseFn(comptime T: type) type {
376 return fn ([]const u8) ?T;
376 return fn ([]const u8) anyerror!T;
377377 }
378378
379379 fn getDefaultParser(comptime T: type) ParseFn(T) {
380380 switch (@typeInfo(T)) {
381381 .Int => return struct {
382 fn parse(str: []const u8) ?T {
383 return std.fmt.parseInt(T, str, 0) catch null;
382 fn parse(str: []const u8) anyerror!T {
383 return try std.fmt.parseInt(T, str, 0);
384384 }
385385 }.parse,
386386 .Bool => return struct {
387 fn parse(str: []const u8) ?T {
388 const as_int = std.fmt.parseInt(u1, str, 0) catch return null;
387 fn parse(str: []const u8) anyerror!T {
388 const as_int = try std.fmt.parseInt(u1, str, 0);
389389 return as_int > 0;
390390 }
391391 }.parse,
392392 .Enum => return struct {
393 fn parse(str: []const u8) ?T {
394 return std.meta.stringToEnum(T, str);
393 fn parse(str: []const u8) anyerror!T {
394 return std.meta.stringToEnum(T, str) orelse {
395 std.log.err("unknown enum variant for {s}: {s}", .{ @typeName(T), str });
396 return error.UnknownEnumVariant;
397 };
395398 }
396399 }.parse,
397400 .Struct => if (comptime std.mem.eql(u8, @typeName(T), "CrossTarget")) return struct {
398 fn parse(str: []const u8) ?T {
401 fn parse(str: []const u8) anyerror!T {
399402 var opts = CrossTarget.ParseOptions{
400403 .arch_os_abi = str,
401404 };
402 return CrossTarget.parse(opts) catch null;
405 return try CrossTarget.parse(opts);
403406 }
404407 }.parse else @compileError("no default parser for " ++ @typeName(T)),
405408 else => @compileError("no default parser for " ++ @typeName(T)),
......@@ -1128,8 +1131,8 @@ pub const TestContext = struct {
11281131 if (cases.items.len == 0) {
11291132 const backends = try manifest.getConfigForKeyAlloc(ctx.arena, "backend", Backend);
11301133 const targets = try manifest.getConfigForKeyAlloc(ctx.arena, "target", CrossTarget);
1131 const is_test = manifest.getConfigForKeyAssertSingle("is_test", bool);
1132 const output_mode = manifest.getConfigForKeyAssertSingle("output_mode", std.builtin.OutputMode);
1134 const is_test = try manifest.getConfigForKeyAssertSingle("is_test", bool);
1135 const output_mode = try manifest.getConfigForKeyAssertSingle("output_mode", std.builtin.OutputMode);
11331136
11341137 const name_prefix = blk: {
11351138 const ext_index = std.mem.lastIndexOfScalar(u8, current_file.*, '.') orelse
test/cases/recursive_inline_function.0.zig+1
......@@ -9,4 +9,5 @@ inline fn fibonacci(n: usize) usize {
99}
1010
1111// run
12// target=x86_64-linux,arm-linux,x86_64-macos,wasm32-wasi
1213//