M README.md => README.md +14 -12
@@ 41,24 41,26 @@ const x = Bar{
.c = .{ .y = "hello" },
};
-var buf: [12]u8 = undefined;
-var fbs = io.fixedBufferStream(&buf);
+test "example" {
+ var buf: [12]u8 = undefined;
+ var fbs = io.fixedBufferStream(&buf);
-var reader = fbs.reader();
-var writer = fbs.writer();
+ var reader = fbs.reader();
+ var writer = fbs.writer();
-var e = encoder(writer);
-try e.encode(x);
+ var e = encoder(writer);
+ try e.encode(x);
-try fbs.seekTo(0);
+ try fbs.seekTo(0);
-var d = decoder(allocator, reader);
-defer d.deinit();
+ var d = decoder(std.testing.allocator, reader);
+ defer d.deinit();
-const y = try d.decode(Bar);
+ const y = try d.decode(Bar);
-std.log.info("x: {}", .{x});
-std.log.info("y: {}", .{y});
+ std.log.info("x: {}", .{x});
+ std.log.info("y: {}", .{y});
+}
```
Hash maps and slices require allocation;
A src/README.md => src/README.md +1 -0
@@ 0,0 1,1 @@
+../README.md<
\ No newline at end of file
M src/bare.zig => src/bare.zig +0 -39
@@ 511,42 511,3 @@ test "round trip union with void member" {
const res = try d.decode(U);
try std.testing.expectEqual(res, U{ .Hello = 123 });
}
-
-test "README example" {
- const Foo = union(enum) {
- x: u64,
- y: []const u8,
- z: void,
- };
-
- const Bar = struct {
- a: f32,
- b: u8,
- c: Foo,
- };
-
- const x = Bar{
- .a = 3.14,
- .b = 2,
- .c = .{ .y = "hello" },
- };
-
- var buf: [12]u8 = undefined;
- var fbs = io.fixedBufferStream(&buf);
-
- var reader = fbs.reader();
- var writer = fbs.writer();
-
- var e = encoder(writer);
- try e.encode(x);
-
- try fbs.seekTo(0);
-
- var d = decoder(std.testing.allocator, reader);
- defer d.deinit();
-
- const y = try d.decode(Bar);
-
- std.log.info("x: {}", .{x});
- std.log.info("y: {}", .{y});
-}
M src/test.zig => src/test.zig +42 -1
@@ 964,7 964,29 @@ fn testCompileError(comptime code: []const u8, comptime expected_error: []const
defer gpa.allocator().free(stderr);
const term = try proc.wait();
try checkErrorMessage(stderr, expected_error);
- try expectEqual(term.Exited, 1);
+ try expectEqual(@as(u8, 1), term.Exited);
+}
+
+fn runZigTestOnCodeString(comptime code: []const u8) !void {
+ var buf: [1024]u8 = undefined;
+ const fname = try std.fmt.bufPrint(&buf, "/tmp/zig-bare-test-{d}.zig", .{test_file_seq});
+ test_file_seq += 1;
+ var cwd = fs.cwd();
+ try cwd.copyFile("src/bare.zig", cwd, "/tmp/zig-bare.zig", .{});
+ var tmpfile = try cwd.createFile(fname, .{ .read = true, .truncate = true });
+ defer tmpfile.close();
+ _ = try tmpfile.write(boilerplate);
+ _ = try tmpfile.write(code);
+ var gpa = std.heap.GeneralPurposeAllocator(.{}){};
+ var proc = std.ChildProcess.init(&[_][]const u8{ "zig", "test", fname, "-fno-emit-bin" }, gpa.allocator());
+ proc.stderr_behavior = .Pipe;
+ proc.stdout_behavior = .Pipe;
+ try proc.spawn();
+ const stderr = try proc.stderr.?.reader().readAllAlloc(gpa.allocator(), 0x1000);
+ defer gpa.allocator().free(stderr);
+ std.debug.print("??? {s}\n", .{stderr});
+ const term = try proc.wait();
+ try expectEqual(@as(u8, 0), term.Exited);
}
fn checkErrorMessage(haystack: []const u8, message: []const u8) !void {
@@ 973,3 995,22 @@ fn checkErrorMessage(haystack: []const u8, message: []const u8) !void {
const errorslice = haystack[idx + errorstart.len ..];
try testing.expectStringStartsWith(errorslice, message);
}
+
+test "README example" {
+ @setEvalBranchQuota(1000000);
+ const readme_text = @embedFile("README.md");
+ const needle_start = "```zig";
+ const needle_end = "```";
+ const zig_code_start = comptime std.mem.indexOf(u8, readme_text, needle_start);
+
+ if (zig_code_start) |start| {
+ const rest = readme_text[start + needle_start.len ..];
+ const zig_code_end = comptime std.mem.indexOf(u8, rest, needle_end);
+
+ if (zig_code_end) |end| {
+ const zig_code = rest[0..end];
+
+ try runZigTestOnCodeString(zig_code);
+ }
+ }
+}