diff options
Diffstat (limited to 'src/root.zig')
-rw-r--r-- | src/root.zig | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/src/root.zig b/src/root.zig index 57f99c0..4e278e3 100644 --- a/src/root.zig +++ b/src/root.zig @@ -12,7 +12,7 @@ const declarations = std.meta.declarations; const eql = std.mem.eql; const expectEqual = std.testing.expectEqual; const expectEqualDeep = std.testing.expectEqualDeep; -const expectError = std.testing.expectError; +const expectEqualStrings = std.testing.expectEqualStrings; const std = @import("std"); const toLower = std.ascii.toLower; const zeroes = std.mem.zeroes; @@ -350,19 +350,27 @@ test "isomorphism" { } /// Evaluates the Janet program given in str. -pub fn eval(comptime T: type, str: []const u8, src: [*:0]const u8) !T { +pub fn eval(comptime T: type, str: []const u8, + src: [*:0]const u8) !union (enum) { ret: T, err: []const u8 } { var ret: Value = undefined; const errflags = janet.dobytes(root_env, str.ptr, @intCast(str.len), src, &ret); // Errors are already logged by Janet, // among them only one is returned and not machine-readable. - return if (errflags == 0) unwrap(T, ret) else error.JanetError; + return if (errflags == 0) .{ + .ret = try unwrap(T, ret) + } else .{ + .err = try unwrap([]const u8, ret) + }; } test eval { init(); defer deinit(); - try expectEqual(try eval(i32, "(+ 3 7)", @src().fn_name), 10); + switch (try eval(i32, "(+ 3 7)", @src().fn_name)) { + .ret => |ret| try expectEqual(@as(i32, 10), ret), + .err => return error.TestUnexpectedError, + } } /// Binds val to name. @@ -382,9 +390,10 @@ test def { init(); defer deinit(); try def("seven", Number{ .n = 7 }, "number 7 in a struct"); - const nine = try eval(Number, "(:next-n (:next-n seven))", - @src().fn_name); - try expectEqual(Number{ .n = 9 }, nine); + switch (try eval(Number, "(:next-n (:next-n seven))", @src().fn_name)) { + .ret => |nine| try expectEqual(Number{ .n = 9 }, nine), + .err => return error.TestUnexpectedError, + } } /// Gets value. @@ -433,7 +442,10 @@ test defn { .documentation = "(add a b)\n\nReturn a + b.", .source = @src(), }); - try expectEqual(try eval(i32, "(add 3 7)", @src().fn_name), 10); + switch (try eval(i32, "(add 3 7)", @src().fn_name)) { + .ret => |ret| try expectEqual(@as(i32, 10), ret), + .err => return error.TestUnexpectedError, + } try defn(struct { fn raise() !void { return error.ThisIsFine; } @@ -442,5 +454,8 @@ test defn { .documentation = "(raise)\n\nRaise an error.", .source = @src(), }); - try expectError(error.JanetError, eval(void, "(raise)", @src().fn_name)); + switch (try eval(void, "(raise)", @src().fn_name)) { + .ret => return error.TestExpectedError, + .err => |err| try expectEqualStrings("this is fine", err), + } } |