Restore unit tests

Commit dbd42bb (Cleaning up zig build output) broke the unit test.

Always use exit code 2, instead of 0.  This is the exit code used by the
build runner to notify the compiler to not report any further
diagnostics.

Move the Ziglings logo from the `build` function scope to the global
scope, and make it public so that tests.zig can use it to find the
number of lines to skip, instead of using an hard coded value.

Fixes #295
This commit is contained in:
Manlio Perillo 2023-05-09 17:15:22 +02:00
parent e4e096c680
commit 7aa0737929
2 changed files with 23 additions and 22 deletions

View file

@ -74,9 +74,22 @@ pub const Exercise = struct {
} }
}; };
pub const logo =
\\ _ _ _
\\ ___(_) __ _| (_)_ __ __ _ ___
\\ |_ | |/ _' | | | '_ \ / _' / __|
\\ / /| | (_| | | | | | | (_| \__ \
\\ /___|_|\__, |_|_|_| |_|\__, |___/
\\ |___/ |___/
\\
\\ "Look out! Broken programs below!"
\\
\\
;
pub fn build(b: *Build) !void { pub fn build(b: *Build) !void {
if (!compat.is_compatible) compat.die(); if (!compat.is_compatible) compat.die();
if (!validate_exercises()) std.os.exit(1); if (!validate_exercises()) std.os.exit(2);
use_color_escapes = false; use_color_escapes = false;
if (std.io.getStdErr().supportsAnsiEscapeCodes()) { if (std.io.getStdErr().supportsAnsiEscapeCodes()) {
@ -106,19 +119,6 @@ pub fn build(b: *Build) !void {
reset_text = "\x1b[0m"; reset_text = "\x1b[0m";
} }
const logo =
\\ _ _ _
\\ ___(_) __ _| (_)_ __ __ _ ___
\\ |_ | |/ _' | | | '_ \ / _' / __|
\\ / /| | (_| | | | | | | (_| \__ \
\\ /___|_|\__, |_|_|_| |_|\__, |___/
\\ |___/ |___/
\\
\\ "Look out! Broken programs below!"
\\
\\
;
const healed = b.option(bool, "healed", "Run exercises from patches/healed") orelse const healed = b.option(bool, "healed", "Run exercises from patches/healed") orelse
false; false;
const override_healed_path = b.option([]const u8, "healed-path", "Override healed path"); const override_healed_path = b.option([]const u8, "healed-path", "Override healed path");
@ -136,7 +136,7 @@ pub fn build(b: *Build) !void {
if (exno) |n| { if (exno) |n| {
if (n == 0 or n > exercises.len - 1) { if (n == 0 or n > exercises.len - 1) {
print("unknown exercise number: {}\n", .{n}); print("unknown exercise number: {}\n", .{n});
std.os.exit(1); std.os.exit(2);
} }
const ex = exercises[n - 1]; const ex = exercises[n - 1];
@ -280,10 +280,10 @@ const ZiglingStep = struct {
self.help(); self.help();
// NOTE: Returning 0 'success' status because the *exercise* failed, // NOTE: Using exit code 2 will prevent the Zig compiler to print
// but Ziglings did not. Otherwise the learner will see this message: // the message:
// "error: the following build command failed with exit code 1:..." // "error: the following build command failed with exit code 1:..."
std.os.exit(0); std.os.exit(2);
}; };
self.run(exe_path, prog_node) catch { self.run(exe_path, prog_node) catch {
@ -293,7 +293,7 @@ const ZiglingStep = struct {
self.help(); self.help();
// NOTE: See note above! // NOTE: See note above!
std.os.exit(0); std.os.exit(2);
}; };
} }

View file

@ -175,7 +175,7 @@ pub fn addCliTests(b: *std.Build, exercises: []const Exercise) *Step {
const cmd = b.addSystemCommand(&.{ b.zig_exe, "build", "-Dn=1" }); const cmd = b.addSystemCommand(&.{ b.zig_exe, "build", "-Dn=1" });
const expect = exercises[0].hint orelse ""; const expect = exercises[0].hint orelse "";
cmd.setName("zig build -Dn=1"); cmd.setName("zig build -Dn=1");
cmd.expectExitCode(1); cmd.expectExitCode(2);
cmd.addCheck(.{ .expect_stderr_match = expect }); cmd.addCheck(.{ .expect_stderr_match = expect });
cmd.step.dependOn(case_step); cmd.step.dependOn(case_step);
@ -282,10 +282,11 @@ const CheckStep = struct {
for (exercises) |ex| { for (exercises) |ex| {
if (ex.number() == 1 and self.has_logo) { if (ex.number() == 1 and self.has_logo) {
// Skip the logo. // Skip the logo.
const nlines = mem.count(u8, root.logo, "\n");
var buf: [80]u8 = undefined; var buf: [80]u8 = undefined;
var lineno: usize = 0; var lineno: usize = 0;
while (lineno < 8) : (lineno += 1) { while (lineno < nlines) : (lineno += 1) {
_ = try readLine(stderr, &buf); _ = try readLine(stderr, &buf);
} }
} }