| ... | ... | @@ -347,6 +347,21 @@ const TestManifest = struct { |
| 347 | 347 | return self.getConfigForKeyCustomParser(key, T, getDefaultParser(T)); |
| 348 | 348 | } |
| 349 | 349 | |
| 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 | 365 | fn getConfigForKeyAssertSingle(self: TestManifest, key: []const u8, comptime T: type) T { |
| 351 | 366 | var it = self.getConfigForKey(key, T); |
| 352 | 367 | const res = it.next().?; |
| ... | ... | @@ -360,8 +375,9 @@ const TestManifest = struct { |
| 360 | 375 | }; |
| 361 | 376 | } |
| 362 | 377 | |
| 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(); |
| 365 | 381 | var it = self.trailing(); |
| 366 | 382 | while (it.next()) |line| { |
| 367 | 383 | try out.append(line); |
| ... | ... | @@ -1068,8 +1084,8 @@ pub const TestContext = struct { |
| 1068 | 1084 | var manifest = try TestManifest.parse(ctx.arena, src); |
| 1069 | 1085 | |
| 1070 | 1086 | 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); |
| 1073 | 1089 | const is_test = manifest.getConfigForKeyAssertSingle("is_test", bool); |
| 1074 | 1090 | const output_mode = manifest.getConfigForKeyAssertSingle("output_mode", std.builtin.OutputMode); |
| 1075 | 1091 | |
| ... | ... | @@ -1081,10 +1097,11 @@ pub const TestContext = struct { |
| 1081 | 1097 | }; |
| 1082 | 1098 | |
| 1083 | 1099 | // 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})", .{ |
| 1087 | 1103 | name_prefix, |
| 1104 | @tagName(backend), |
| 1088 | 1105 | try target.zigTriple(ctx.arena), |
| 1089 | 1106 | }); |
| 1090 | 1107 | const next = ctx.cases.items.len; |
| ... | ... | @@ -1095,6 +1112,7 @@ pub const TestContext = struct { |
| 1095 | 1112 | .updates = std.ArrayList(TestContext.Update).init(ctx.cases.allocator), |
| 1096 | 1113 | .is_test = is_test, |
| 1097 | 1114 | .output_mode = output_mode, |
| 1115 | .link_libc = backend == .llvm, |
| 1098 | 1116 | .files = std.ArrayList(TestContext.File).init(ctx.cases.allocator), |
| 1099 | 1117 | }); |
| 1100 | 1118 | try cases.append(next); |