ReviewOS

also looking at this

zig-utils/zig-test-framework

Define stable JSON event protocol

#27
Merged glennmichael123 wants to merge codex/issue-10-json-events into main
11 files +442 -177
tests/reporter_test.zigmodified+22-9
Changes to tests/reporter_test.zig
@@ -47,8 +47,8 @@ test "reporter dot output" {
4747 try std.testing.expect(std.mem.indexOf(u8, output, "Passed: 1") != null);
4848}
4949
50test "reporter json output" {
51 var buffer: [2048]u8 = undefined;
50test "reporter json output uses versioned event envelopes" {
51 var buffer: [4096]u8 = undefined;
5252 const writer: std.Io.Writer = .fixed(&buffer);
5353 var reporter = ztf.JsonReporter.init(std.testing.allocator, writer);
5454 defer reporter.deinit();
@@ -56,20 +56,29 @@ test "reporter json output" {
5656 defer results.deinit();
5757 results.total = 1;
5858 results.passed = 1;
59 var test_case = ztf.TestCase.init("passes", passingTest);
59 var test_case = ztf.TestCase.init("passes \"quoted\"\nname", passingTest);
6060 test_case.status = .passed;
6161
6262 try reporter.reporter.onRunStart(1);
63 try reporter.reporter.onSuiteStart("suite");
63 try reporter.reporter.onSuiteStart("suite\tone");
64 try reporter.reporter.onTestStart(test_case.name);
6465 try reporter.reporter.onTestEnd(&test_case);
65 try reporter.reporter.onSuiteEnd("suite");
66 try reporter.reporter.onSuiteEnd("suite\tone");
6667 try reporter.reporter.onRunEnd(&results);
6768
6869 const output = buffer[0..reporter.writer.end];
69 try std.testing.expect(std.mem.indexOf(u8, output, "\"name\":\"passes\"") != null);
70 try std.testing.expect(std.mem.indexOf(u8, output, "\"passed\":1") != null);
7170 var parsed = try std.json.parseFromSlice(std.json.Value, std.testing.allocator, output, .{});
7271 defer parsed.deinit();
72 const events = parsed.value.array.items;
73 try std.testing.expectEqual(@as(usize, 6), events.len);
74 try std.testing.expectEqual(@as(i64, ztf.protocol_version), events[0].object.get("protocol_version").?.integer);
75 try std.testing.expectEqualStrings("run_start", events[0].object.get("type").?.string);
76 try std.testing.expectEqualStrings("test_start", events[2].object.get("type").?.string);
77 const test_data = events[3].object.get("data").?.object;
78 try std.testing.expectEqualStrings(test_case.name, test_data.get("name").?.string);
79 try std.testing.expectEqualStrings("suite\tone", test_data.get("suite").?.string);
80 try std.testing.expectEqualStrings("run_end", events[5].object.get("type").?.string);
81 try std.testing.expectEqual(@as(i64, 1), events[5].object.get("data").?.object.get("passed").?.integer);
7382}
7483
7584test "reporter json output includes flaky attempt history" {
@@ -106,10 +115,14 @@ test "reporter json output includes flaky attempt history" {
106115
107116 const output = buffer[0..reporter.writer.end];
108117 try std.testing.expect(std.mem.indexOf(u8, output, "\"status\":\"flaky\"") != null);
109 try std.testing.expect(std.mem.indexOf(u8, output, "\"attempts\":[") != null);
110 try std.testing.expect(std.mem.indexOf(u8, output, "\"durationNs\":10") != null);
118 try std.testing.expect(std.mem.indexOf(u8, output, "\"type\":\"retry\"") != null);
119 try std.testing.expect(std.mem.indexOf(u8, output, "\"duration_ns\":10") != null);
111120 var parsed = try std.json.parseFromSlice(std.json.Value, allocator, output, .{});
112121 defer parsed.deinit();
122 const events = parsed.value.array.items;
123 try std.testing.expectEqualStrings("retry", events[2].object.get("type").?.string);
124 try std.testing.expectEqualStrings("retry", events[3].object.get("type").?.string);
125 try std.testing.expectEqualStrings("test_end", events[4].object.get("type").?.string);
113126}
114127
115128test "reporter set selects the same built-ins for every executor" {