authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-04-28 00:54:20+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-04-28 18:35:01+02:00
log2cd456f8f451bc73d719381bcb0f3242a1de2e04
treeea6913490b0b0af597547463d4f4909bc7c9d76c
parent495bb12e6a5b5783fa14cc08c2c940ee60b80607

test: correctly handle multiple backends

To correctly handle multiple backends crossed with multiple targets, we need to push all elements in separate allocated arrays rather than operate on raw iterators. Hence, introduce `getConfigForKeyAlloc`.

1 files changed, 25 insertions(+), 7 deletions(-)

src/test.zig+25-7
...@@ -347,6 +347,21 @@ const TestManifest = struct {...@@ -347,6 +347,21 @@ const TestManifest = struct {
347 return self.getConfigForKeyCustomParser(key, T, getDefaultParser(T));347 return self.getConfigForKeyCustomParser(key, T, getDefaultParser(T));
348 }348 }
349349
350 fn getConfigForKeyAlloc(
351 self: TestManifest,
352 allocator: Allocator,
353 key: []const u8,
354 comptime T: type,
355 ) error{OutOfMemory}![]const T {
356 var out = std.ArrayList(T).init(allocator);
357 defer out.deinit();
358 var it = self.getConfigForKey(key, T);
359 while (it.next()) |item| {
360 try out.append(item);
361 }
362 return out.toOwnedSlice();
363 }
364
350 fn getConfigForKeyAssertSingle(self: TestManifest, key: []const u8, comptime T: type) T {365 fn getConfigForKeyAssertSingle(self: TestManifest, key: []const u8, comptime T: type) T {
351 var it = self.getConfigForKey(key, T);366 var it = self.getConfigForKey(key, T);
352 const res = it.next().?;367 const res = it.next().?;
...@@ -360,8 +375,9 @@ const TestManifest = struct {...@@ -360,8 +375,9 @@ const TestManifest = struct {
360 };375 };
361 }376 }
362377
363 fn trailingAlloc(self: TestManifest, arena: Allocator) ![]const []const u8 {378 fn trailingAlloc(self: TestManifest, allocator: Allocator) error{OutOfMemory}![]const []const u8 {
364 var out = std.ArrayList([]const u8).init(arena);379 var out = std.ArrayList([]const u8).init(allocator);
380 defer out.deinit();
365 var it = self.trailing();381 var it = self.trailing();
366 while (it.next()) |line| {382 while (it.next()) |line| {
367 try out.append(line);383 try out.append(line);
...@@ -1068,8 +1084,8 @@ pub const TestContext = struct {...@@ -1068,8 +1084,8 @@ pub const TestContext = struct {
1068 var manifest = try TestManifest.parse(ctx.arena, src);1084 var manifest = try TestManifest.parse(ctx.arena, src);
10691085
1070 if (cases.items.len == 0) {1086 if (cases.items.len == 0) {
1071 var backends = manifest.getConfigForKey("backend", Backend);1087 const backends = try manifest.getConfigForKeyAlloc(ctx.arena, "backend", Backend);
1072 var targets = manifest.getConfigForKey("target", CrossTarget);1088 const targets = try manifest.getConfigForKeyAlloc(ctx.arena, "target", CrossTarget);
1073 const is_test = manifest.getConfigForKeyAssertSingle("is_test", bool);1089 const is_test = manifest.getConfigForKeyAssertSingle("is_test", bool);
1074 const output_mode = manifest.getConfigForKeyAssertSingle("output_mode", std.builtin.OutputMode);1090 const output_mode = manifest.getConfigForKeyAssertSingle("output_mode", std.builtin.OutputMode);
10751091
...@@ -1081,10 +1097,11 @@ pub const TestContext = struct {...@@ -1081,10 +1097,11 @@ pub const TestContext = struct {
1081 };1097 };
10821098
1083 // Cross-product to get all possible test combinations1099 // Cross-product to get all possible test combinations
1084 while (backends.next()) |backend| {1100 for (backends) |backend| {
1085 while (targets.next()) |target| {1101 for (targets) |target| {
1086 const name = try std.fmt.allocPrint(ctx.arena, "{s} ({s})", .{1102 const name = try std.fmt.allocPrint(ctx.arena, "{s} ({s}, {s})", .{
1087 name_prefix,1103 name_prefix,
1104 @tagName(backend),
1088 try target.zigTriple(ctx.arena),1105 try target.zigTriple(ctx.arena),
1089 });1106 });
1090 const next = ctx.cases.items.len;1107 const next = ctx.cases.items.len;
...@@ -1095,6 +1112,7 @@ pub const TestContext = struct {...@@ -1095,6 +1112,7 @@ pub const TestContext = struct {
1095 .updates = std.ArrayList(TestContext.Update).init(ctx.cases.allocator),1112 .updates = std.ArrayList(TestContext.Update).init(ctx.cases.allocator),
1096 .is_test = is_test,1113 .is_test = is_test,
1097 .output_mode = output_mode,1114 .output_mode = output_mode,
1115 .link_libc = backend == .llvm,
1098 .files = std.ArrayList(TestContext.File).init(ctx.cases.allocator),1116 .files = std.ArrayList(TestContext.File).init(ctx.cases.allocator),
1099 });1117 });
1100 try cases.append(next);1118 try cases.append(next);