ReviewOS

also looking at this

zig-utils/zig-test-framework

Add reproducible randomized test order

#29
Merged glennmichael123 wants to merge codex/issue-14-random-order into main
18 files +487 -42
tests/reporter_test.zigmodified+33-0
Changes to tests/reporter_test.zig
@@ -56,6 +56,8 @@ test "reporter json output uses versioned event envelopes" {
5656 defer results.deinit();
5757 results.total = 1;
5858 results.passed = 1;
59 results.random_seed = 4242;
60 reporter.reporter.random_seed = 4242;
5961 var test_case = ztf.TestCase.init("passes \"quoted\"\nname", passingTest);
6062 test_case.status = .passed;
6163
@@ -73,12 +75,14 @@ test "reporter json output uses versioned event envelopes" {
7375 try std.testing.expectEqual(@as(usize, 6), events.len);
7476 try std.testing.expectEqual(@as(i64, ztf.protocol_version), events[0].object.get("protocol_version").?.integer);
7577 try std.testing.expectEqualStrings("run_start", events[0].object.get("type").?.string);
78 try std.testing.expectEqual(@as(i64, 4242), events[0].object.get("data").?.object.get("random_seed").?.integer);
7679 try std.testing.expectEqualStrings("test_start", events[2].object.get("type").?.string);
7780 const test_data = events[3].object.get("data").?.object;
7881 try std.testing.expectEqualStrings(test_case.name, test_data.get("name").?.string);
7982 try std.testing.expectEqualStrings("suite\tone", test_data.get("suite").?.string);
8083 try std.testing.expectEqualStrings("run_end", events[5].object.get("type").?.string);
8184 try std.testing.expectEqual(@as(i64, 1), events[5].object.get("data").?.object.get("passed").?.integer);
85 try std.testing.expectEqual(@as(i64, 4242), events[5].object.get("data").?.object.get("random_seed").?.integer);
8286}
8387
8488test "reporter json output includes flaky attempt history" {
@@ -140,3 +144,32 @@ test "reporter set selects the same built-ins for every executor" {
140144 try std.testing.expect(reporters.selected() == &reporters.tap.reporter);
141145 try std.testing.expect(!reporters.selected().use_colors);
142146}
147
148test "JUnit reporter records the random seed as a suite property" {
149 const allocator = std.testing.allocator;
150 var tmp = std.testing.tmpDir(.{});
151 defer tmp.cleanup();
152 const output_path = try std.fmt.allocPrint(allocator, ".zig-cache/tmp/{s}/results.xml", .{tmp.sub_path});
153 defer allocator.free(output_path);
154
155 var reporter = ztf.JUnitReporter.init(allocator, output_path);
156 defer reporter.deinit();
157 reporter.reporter.random_seed = 73;
158 var results = ztf.TestResults.init(allocator);
159 defer results.deinit();
160 results.total = 1;
161 results.passed = 1;
162 results.random_seed = 73;
163 var test_case = ztf.TestCase.init("passes", passingTest);
164 test_case.status = .passed;
165
166 try reporter.reporter.onRunStart(1);
167 try reporter.reporter.onSuiteStart("suite");
168 try reporter.reporter.onTestEnd(&test_case);
169 try reporter.reporter.onSuiteEnd("suite");
170 try reporter.reporter.onRunEnd(&results);
171
172 const output = try ztf.compat.readFileAlloc(allocator, output_path);
173 defer allocator.free(output);
174 try std.testing.expect(std.mem.indexOf(u8, output, "<property name=\"random_seed\" value=\"73\"/>") != null);
175}