Stage2/Testing: Add convenience wrappers

This commit is contained in:
Noam Preil 2020-06-26 02:42:02 -04:00
parent c88edbc46f
commit 649da2df52
No known key found for this signature in database
GPG Key ID: FC347E7C85BE8238
4 changed files with 83 additions and 9 deletions

View File

@ -138,6 +138,14 @@ pub const TestContext = struct {
return &ctx.cases.items[ctx.cases.items.len - 1];
}
pub fn exe(ctx: *TestContext, name: []const u8, target: std.zig.CrossTarget) *Case {
return ctx.addExe(name, target, .Zig);
}
pub fn exeZIR(ctx: *TestContext, name: []const u8, target: std.zig.CrossTarget) *Case {
return ctx.addExe(name, target, .ZIR);
}
pub fn addObj(
ctx: *TestContext,
name: []const u8,
@ -154,6 +162,14 @@ pub const TestContext = struct {
return &ctx.cases.items[ctx.cases.items.len - 1];
}
pub fn obj(ctx: *TestContext, name: []const u8, target: std.zig.CrossTarget) *Case {
return ctx.addObj(name, target, .Zig);
}
pub fn objZIR(ctx: *TestContext, name: []const u8, target: std.zig.CrossTarget) *Case {
return ctx.addObj(name, target, .ZIR);
}
pub fn addCompareOutput(
ctx: *TestContext,
name: []const u8,
@ -164,6 +180,24 @@ pub const TestContext = struct {
ctx.addExe(name, .{}, T).addCompareOutput(src, expected_stdout);
}
pub fn compareOutput(
ctx: *TestContext,
name: []const u8,
src: [:0]const u8,
expected_stdout: []const u8,
) void {
return ctx.addCompareOutput(name, .Zig, src, expected_stdout);
}
pub fn compareOutputZIR(
ctx: *TestContext,
name: []const u8,
src: [:0]const u8,
expected_stdout: []const u8,
) void {
ctx.addCompareOutput(name, .ZIR, src, expected_stdout);
}
pub fn addTransform(
ctx: *TestContext,
name: []const u8,
@ -175,6 +209,26 @@ pub const TestContext = struct {
ctx.addObj(name, target, T).addTransform(src, result);
}
pub fn transform(
ctx: *TestContext,
name: []const u8,
target: std.zig.CrossTarget,
src: [:0]const u8,
result: [:0]const u8,
) void {
ctx.addTransform(name, target, .Zig, src, result);
}
pub fn transformZIR(
ctx: *TestContext,
name: []const u8,
target: std.zig.CrossTarget,
src: [:0]const u8,
result: [:0]const u8,
) void {
ctx.addTransform(name, target, .ZIR, src, result);
}
pub fn addError(
ctx: *TestContext,
name: []const u8,
@ -186,6 +240,26 @@ pub const TestContext = struct {
ctx.addObj(name, target, T).addError(src, expected_errors);
}
pub fn compileError(
ctx: *TestContext,
name: []const u8,
target: std.zig.CrossTarget,
src: [:0]const u8,
expected_errors: []const []const u8,
) void {
ctx.addError(name, target, .Zig, src, expected_errors);
}
pub fn compileErrorZIR(
ctx: *TestContext,
name: []const u8,
target: std.zig.CrossTarget,
src: [:0]const u8,
expected_errors: []const []const u8,
) void {
ctx.addError(name, target, .ZIR, src, expected_errors);
}
fn init() TestContext {
const allocator = std.heap.page_allocator;
return .{ .cases = std.ArrayList(Case).init(allocator) };

View File

@ -17,7 +17,7 @@ pub fn addCases(ctx: *TestContext) !void {
}
{
var case = ctx.addExe("hello world with updates", linux_x64, .Zig);
var case = ctx.exe("hello world with updates", linux_x64);
// Regular old hello world
case.addCompareOutput(
\\export fn _start() noreturn {

View File

@ -9,7 +9,7 @@ const linux_x64 = std.zig.CrossTarget{
};
pub fn addCases(ctx: *TestContext) !void {
ctx.addError("call undefined local", linux_x64, .ZIR,
ctx.compileErrorZIR("call undefined local", linux_x64,
\\@noreturn = primitive(noreturn)
\\
\\@start_fnty = fntype([], @noreturn, cc=Naked)
@ -19,7 +19,7 @@ pub fn addCases(ctx: *TestContext) !void {
// TODO: address inconsistency in this message and the one in the next test
, &[_][]const u8{":5:13: error: unrecognized identifier: %test"});
ctx.addError("call with non-existent target", linux_x64, .ZIR,
ctx.compileErrorZIR("call with non-existent target", linux_x64,
\\@noreturn = primitive(noreturn)
\\
\\@start_fnty = fntype([], @noreturn, cc=Naked)
@ -31,7 +31,7 @@ pub fn addCases(ctx: *TestContext) !void {
, &[_][]const u8{":5:13: error: decl 'notafunc' not found"});
// TODO: this error should occur at the call site, not the fntype decl
ctx.addError("call naked function", linux_x64, .ZIR,
ctx.compileErrorZIR("call naked function", linux_x64,
\\@noreturn = primitive(noreturn)
\\
\\@start_fnty = fntype([], @noreturn, cc=Naked)

View File

@ -9,7 +9,7 @@ const linux_x64 = std.zig.CrossTarget{
};
pub fn addCases(ctx: *TestContext) !void {
ctx.addTransform("referencing decls which appear later in the file", linux_x64, .ZIR,
ctx.transformZIR("referencing decls which appear later in the file", linux_x64,
\\@void = primitive(void)
\\@fnty = fntype([], @void, cc=C)
\\
@ -32,7 +32,7 @@ pub fn addCases(ctx: *TestContext) !void {
\\})
\\
);
ctx.addTransform("elemptr, add, cmp, condbr, return, breakpoint", linux_x64, .ZIR,
ctx.transformZIR("elemptr, add, cmp, condbr, return, breakpoint", linux_x64,
\\@void = primitive(void)
\\@usize = primitive(usize)
\\@fnty = fntype([], @void, cc=C)
@ -86,7 +86,7 @@ pub fn addCases(ctx: *TestContext) !void {
);
{
var case = ctx.addObj("reference cycle with compile error in the cycle", linux_x64, .ZIR);
var case = ctx.objZIR("reference cycle with compile error in the cycle", linux_x64);
case.addTransform(
\\@void = primitive(void)
\\@fnty = fntype([], @void, cc=C)
@ -207,7 +207,7 @@ pub fn addCases(ctx: *TestContext) !void {
return;
}
ctx.addCompareOutput("hello world ZIR", .ZIR,
ctx.compareOutputZIR("hello world ZIR",
\\@noreturn = primitive(noreturn)
\\@void = primitive(void)
\\@usize = primitive(usize)
@ -265,7 +265,7 @@ pub fn addCases(ctx: *TestContext) !void {
\\
);
ctx.addCompareOutput("function call with no args no return value", .ZIR,
ctx.compareOutputZIR("function call with no args no return value",
\\@noreturn = primitive(noreturn)
\\@void = primitive(void)
\\@usize = primitive(usize)