better error messages in WPT report (in line with what main branch is doing)

This commit is contained in:
Karl Seguin
2025-04-16 19:34:36 +08:00
parent d688d8812d
commit e3638053d0
3 changed files with 23 additions and 19 deletions

View File

@@ -411,14 +411,17 @@ test "Browser.DOM.node" {
var runner = try testing.jsRunner(testing.tracking_allocator, .{}); var runner = try testing.jsRunner(testing.tracking_allocator, .{});
defer runner.deinit(); defer runner.deinit();
try runner.exec( {
\\ function trimAndReplace(str) { var err_out: ?[]const u8 = null;
\\ str = str.replace(/(\r\n|\n|\r)/gm,''); try runner.exec(
\\ str = str.replace(/\s+/g, ' '); \\ function trimAndReplace(str) {
\\ str = str.trim(); \\ str = str.replace(/(\r\n|\n|\r)/gm,'');
\\ return str; \\ str = str.replace(/\s+/g, ' ');
\\ } \\ str = str.trim();
); \\ return str;
\\ }
, &err_out);
}
try runner.testCases(&.{ try runner.testCases(&.{
.{ "document.body.compareDocumentPosition(document.firstChild); ", "10" }, .{ "document.body.compareDocumentPosition(document.firstChild); ", "10" },

View File

@@ -468,17 +468,18 @@ pub const JsRunner = struct {
} }
} }
pub fn exec(self: *JsRunner, src: []const u8) !void { pub fn exec(self: *JsRunner, src: []const u8, err_msg: *?[]const u8) !void {
_ = try self.eval(src); _ = try self.eval(src, err_msg);
} }
pub fn eval(self: *JsRunner, src: []const u8) !Env.Value { pub fn eval(self: *JsRunner, src: []const u8, err_msg: *?[]const u8) !Env.Value {
var try_catch: Env.TryCatch = undefined; var try_catch: Env.TryCatch = undefined;
try_catch.init(self.executor); try_catch.init(self.executor);
defer try_catch.deinit(); defer try_catch.deinit();
return self.executor.exec(src, null) catch |err| { return self.executor.exec(src, null) catch |err| {
if (try try_catch.err(self.arena)) |msg| { if (try try_catch.err(self.arena)) |msg| {
err_msg.* = msg;
std.debug.print("Error runnign script: {s}\n", .{msg}); std.debug.print("Error runnign script: {s}\n", .{msg});
} }
return err; return err;

View File

@@ -30,7 +30,7 @@ const polyfill = @import("../browser/polyfill/polyfill.zig");
// runWPT parses the given HTML file, starts a js env and run the first script // runWPT parses the given HTML file, starts a js env and run the first script
// tags containing javascript sources. // tags containing javascript sources.
// It loads first the js libs files. // It loads first the js libs files.
pub fn run(arena: Allocator, comptime dir: []const u8, f: []const u8, loader: *FileLoader, msg_out: *?[]const u8) ![]const u8 { pub fn run(arena: Allocator, comptime dir: []const u8, f: []const u8, loader: *FileLoader, err_msg: *?[]const u8) ![]const u8 {
// document // document
const html = blk: { const html = blk: {
const file = try std.fs.cwd().openFile(f, .{}); const file = try std.fs.cwd().openFile(f, .{});
@@ -48,7 +48,7 @@ pub fn run(arena: Allocator, comptime dir: []const u8, f: []const u8, loader: *F
// display console logs // display console logs
defer { defer {
const res = runner.eval("console.join('\\n');") catch unreachable; const res = runner.eval("console.join('\\n');", err_msg) catch unreachable;
const log = res.toString(arena) catch unreachable; const log = res.toString(arena) catch unreachable;
if (log.len > 0) { if (log.len > 0) {
std.debug.print("-- CONSOLE LOG\n{s}\n--\n", .{log}); std.debug.print("-- CONSOLE LOG\n{s}\n--\n", .{log});
@@ -63,7 +63,7 @@ pub fn run(arena: Allocator, comptime dir: []const u8, f: []const u8, loader: *F
\\ console.debug = function () { \\ console.debug = function () {
\\ console.push("debug", ...arguments); \\ console.push("debug", ...arguments);
\\ }; \\ };
); , err_msg);
// loop over the scripts. // loop over the scripts.
const doc = parser.documentHTMLToDocument(runner.state.document.?); const doc = parser.documentHTMLToDocument(runner.state.document.?);
@@ -79,12 +79,12 @@ pub fn run(arena: Allocator, comptime dir: []const u8, f: []const u8, loader: *F
// no need to free path, thanks to the arena. // no need to free path, thanks to the arena.
path = try fspath.join(arena, &.{ "/", dirname, path }); path = try fspath.join(arena, &.{ "/", dirname, path });
} }
try runner.exec(try loader.get(path)); try runner.exec(try loader.get(path), err_msg);
} }
// If the script as a source text, execute it. // If the script as a source text, execute it.
const src = try parser.nodeTextContent(s) orelse continue; const src = try parser.nodeTextContent(s) orelse continue;
try runner.exec(src); try runner.exec(src, err_msg);
} }
// Mark tests as ready to run. // Mark tests as ready to run.
@@ -104,17 +104,17 @@ pub fn run(arena: Allocator, comptime dir: []const u8, f: []const u8, loader: *F
defer try_catch.deinit(); defer try_catch.deinit();
runner.loop.run() catch |err| { runner.loop.run() catch |err| {
if (try try_catch.err(arena)) |msg| { if (try try_catch.err(arena)) |msg| {
msg_out.* = msg; err_msg.* = msg;
} }
return err; return err;
}; };
} }
// Check the final test status. // Check the final test status.
try runner.exec("report.status;"); try runner.exec("report.status;", err_msg);
// return the detailed result. // return the detailed result.
const res = try runner.eval("report.log"); const res = try runner.eval("report.log", err_msg);
return res.toString(arena); return res.toString(arena);
} }