~alva/zig-bare

4d29be0a8e2c73aee0f7acd7b175649c1785dfe3 — ugla a month ago 0bedced
Run example in README as a test (hackily)
4 files changed, 57 insertions(+), 52 deletions(-)

M README.md
A src/README.md
M src/bare.zig
M src/test.zig
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);
        }
    }
}