also looking at this
Implement the web UI server with Zig I/O
#26
8 files
+513
-114
| @@ -41,6 +41,12 @@ pub const LoaderOptions = struct { | ||
| 41 | 41 | ui_server: ?*ui_server.UIServer = null, |
| 42 | 42 | }; |
| 43 | 43 | |
| 44 | fn broadcastJson(server: *ui_server.UIServer, allocator: std.mem.Allocator, event: []const u8, value: anytype) !void { | |
| 45 | const json = try std.json.Stringify.valueAlloc(allocator, value, .{}); | |
| 46 | defer allocator.free(json); | |
| 47 | try server.broadcast(event, json); | |
| 48 | } | |
| 49 | ||
| 44 | 50 | /// Run all discovered test files |
| 45 | 51 | pub fn runDiscoveredTests( |
| 46 | 52 | allocator: std.mem.Allocator, |
| @@ -101,9 +107,7 @@ pub fn runDiscoveredTests( | ||
| 101 | 107 | |
| 102 | 108 | // Notify UI of run start |
| 103 | 109 | if (options.ui_server) |server| { |
| 104 | var buffer: [256]u8 = undefined; | |
| 105 | const json = try std.fmt.bufPrint(&buffer, "", .{selected_files}); | |
| 106 | try server.broadcast("run_start", json); | |
| 110 | try broadcastJson(server, allocator, "run_start", .{ .total = selected_files }); | |
| 107 | 111 | } |
| 108 | 112 | |
| 109 | 113 | var files_run: usize = 0; |
| @@ -125,10 +129,8 @@ pub fn runDiscoveredTests( | ||
| 125 | 129 | |
| 126 | 130 | // Notify UI of test file start |
| 127 | 131 | if (options.ui_server) |server| { |
| 128 | var buffer: [512]u8 = undefined; | |
| 129 | const json = try std.fmt.bufPrint(&buffer, "", .{file.name}); | |
| 130 | try server.broadcast("suite_start", json); | |
| 131 | try server.broadcast("test_start", json); | |
| 132 | try broadcastJson(server, allocator, "suite_start", .{ .name = file.name }); | |
| 133 | try broadcastJson(server, allocator, "test_start", .{ .name = file.name }); | |
| 132 | 134 | } |
| 133 | 135 | |
| 134 | 136 | files_run += 1; |
| @@ -180,15 +182,14 @@ pub fn runDiscoveredTests( | ||
| 180 | 182 | |
| 181 | 183 | // Notify UI of test file end |
| 182 | 184 | if (options.ui_server) |server| { |
| 183 | var buffer: [512]u8 = undefined; | |
| 184 | const json = try std.fmt.bufPrint(&buffer, "", .{ | |
| 185 | file.name, | |
| 186 | @tagName(test_case.status), | |
| 187 | test_case.execution_time_ns, | |
| 188 | test_case.attempts.items.len, | |
| 185 | try broadcastJson(server, allocator, "test_end", .{ | |
| 186 | .name = file.name, | |
| 187 | .status = @tagName(test_case.status), | |
| 188 | .execution_time_ns = test_case.execution_time_ns, | |
| 189 | .attempts = test_case.attempts.items.len, | |
| 190 | .error_message = "", | |
| 189 | 191 | }); |
| 190 | try server.broadcast("test_end", json); | |
| 191 | try server.broadcast("suite_end", try std.fmt.bufPrint(&buffer, "", .{file.name})); | |
| 192 | try broadcastJson(server, allocator, "suite_end", .{ .name = file.name }); | |
| 192 | 193 | } |
| 193 | 194 | |
| 194 | 195 | if (test_case.status == .passed) { |
| @@ -218,9 +219,13 @@ pub fn runDiscoveredTests( | ||
| 218 | 219 | |
| 219 | 220 | // Notify UI of run end |
| 220 | 221 | if (options.ui_server) |server| { |
| 221 | var buffer: [512]u8 = undefined; | |
| 222 | const json = try std.fmt.bufPrint(&buffer, "", .{ results.total, results.passed, results.failed, results.skipped }); | |
| 223 | try server.broadcast("run_end", json); | |
| 222 | try broadcastJson(server, allocator, "run_end", .{ | |
| 223 | .total = results.total, | |
| 224 | .passed = results.passed, | |
| 225 | .flaky = results.flaky, | |
| 226 | .failed = results.failed, | |
| 227 | .skipped = results.skipped, | |
| 228 | }); | |
| 224 | 229 | } |
| 225 | 230 | |
| 226 | 231 | if (options.shard) |shard| { |