ReviewOS

also looking at this

zig-utils/zig-test-framework

Implement the web UI server with Zig I/O

#26
Merged glennmichael123 wants to merge codex/issue-9-ui-server into main
8 files +513 -114
src/test_loader.zigmodified+23-18
Changes to src/test_loader.zig
@@ -41,6 +41,12 @@ pub const LoaderOptions = struct {
4141 ui_server: ?*ui_server.UIServer = null,
4242};
4343
44fn 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
4450/// Run all discovered test files
4551pub fn runDiscoveredTests(
4652 allocator: std.mem.Allocator,
@@ -101,9 +107,7 @@ pub fn runDiscoveredTests(
101107
102108 // Notify UI of run start
103109 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 });
107111 }
108112
109113 var files_run: usize = 0;
@@ -125,10 +129,8 @@ pub fn runDiscoveredTests(
125129
126130 // Notify UI of test file start
127131 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 });
132134 }
133135
134136 files_run += 1;
@@ -180,15 +182,14 @@ pub fn runDiscoveredTests(
180182
181183 // Notify UI of test file end
182184 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 = "",
189191 });
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 });
192193 }
193194
194195 if (test_case.status == .passed) {
@@ -218,9 +219,13 @@ pub fn runDiscoveredTests(
218219
219220 // Notify UI of run end
220221 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 });
224229 }
225230
226231 if (options.shard) |shard| {