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 {
347347 return self.getConfigForKeyCustomParser(key, T, getDefaultParser(T));
348348 }
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
350365 fn getConfigForKeyAssertSingle(self: TestManifest, key: []const u8, comptime T: type) T {
351366 var it = self.getConfigForKey(key, T);
352367 const res = it.next().?;
......@@ -360,8 +375,9 @@ const TestManifest = struct {
360375 };
361376 }
362377
363 fn trailingAlloc(self: TestManifest, arena: Allocator) ![]const []const u8 {
364 var out = std.ArrayList([]const u8).init(arena);
378 fn trailingAlloc(self: TestManifest, allocator: Allocator) error{OutOfMemory}![]const []const u8 {
379 var out = std.ArrayList([]const u8).init(allocator);
380 defer out.deinit();
365381 var it = self.trailing();
366382 while (it.next()) |line| {
367383 try out.append(line);
......@@ -1068,8 +1084,8 @@ pub const TestContext = struct {
10681084 var manifest = try TestManifest.parse(ctx.arena, src);
10691085
10701086 if (cases.items.len == 0) {
1071 var backends = manifest.getConfigForKey("backend", Backend);
1072 var targets = manifest.getConfigForKey("target", CrossTarget);
1087 const backends = try manifest.getConfigForKeyAlloc(ctx.arena, "backend", Backend);
1088 const targets = try manifest.getConfigForKeyAlloc(ctx.arena, "target", CrossTarget);
10731089 const is_test = manifest.getConfigForKeyAssertSingle("is_test", bool);
10741090 const output_mode = manifest.getConfigForKeyAssertSingle("output_mode", std.builtin.OutputMode);
10751091
......@@ -1081,10 +1097,11 @@ pub const TestContext = struct {
10811097 };
10821098
10831099 // Cross-product to get all possible test combinations
1084 while (backends.next()) |backend| {
1085 while (targets.next()) |target| {
1086 const name = try std.fmt.allocPrint(ctx.arena, "{s} ({s})", .{
1100 for (backends) |backend| {
1101 for (targets) |target| {
1102 const name = try std.fmt.allocPrint(ctx.arena, "{s} ({s}, {s})", .{
10871103 name_prefix,
1104 @tagName(backend),
10881105 try target.zigTriple(ctx.arena),
10891106 });
10901107 const next = ctx.cases.items.len;
......@@ -1095,6 +1112,7 @@ pub const TestContext = struct {
10951112 .updates = std.ArrayList(TestContext.Update).init(ctx.cases.allocator),
10961113 .is_test = is_test,
10971114 .output_mode = output_mode,
1115 .link_libc = backend == .llvm,
10981116 .files = std.ArrayList(TestContext.File).init(ctx.cases.allocator),
10991117 });
11001118 try cases.append(next);