diff options
Diffstat (limited to 'src/test/parse.zig')
| -rw-r--r-- | src/test/parse.zig | 70 |
1 files changed, 58 insertions, 12 deletions
diff --git a/src/test/parse.zig b/src/test/parse.zig index 0e83258..f1a7857 100644 --- a/src/test/parse.zig +++ b/src/test/parse.zig @@ -1,19 +1,65 @@ const std = @import("std"); const testing = std.testing; +const expect = testing.expect; pub const io = @import("../zisp/io.zig"); pub const value = @import("../zisp/value.zig"); pub const Value = value.Value; -fn parseString(str: []const u8) Value { +fn parse(str: []const u8) Value { var fbs = std.io.fixedBufferStream(str); return io.parser.parse(fbs.reader().any()); } +test "parse empty" { + try expect(parse("").eq(value.eof)); + try expect(parse(";").eq(value.eof)); + try expect(parse(";~").eq(value.eof)); + try expect(parse(" ;").eq(value.eof)); + try expect(parse(" ;~").eq(value.eof)); + try expect(parse("; ").eq(value.eof)); + try expect(parse(";~ ").eq(value.eof)); + try expect(parse(";\n").eq(value.eof)); + try expect(parse(";\n ").eq(value.eof)); + try expect(parse(";~foo").eq(value.eof)); + try expect(parse(";~foo ").eq(value.eof)); + try expect(parse(";~foo;").eq(value.eof)); + try expect(parse(";~foo ;").eq(value.eof)); + try expect(parse("\t\r\n ;foo\n;~(\nbar\n)").eq(value.eof)); +} + +test "parse short bare string" { + const str = value.sstr.pack; + try expect(parse(".").eq(str("."))); + try expect(parse("..").eq(str(".."))); + try expect(parse("...").eq(str("..."))); + try expect(parse(".a.b").eq(str(".a.b"))); + try expect(parse("+0.1").eq(str("+0.1"))); + try expect(parse("-0.1").eq(str("-0.1"))); + try expect(parse("10.1").eq(str("10.1"))); + try expect(parse("|x()|").eq(str("x()"))); + try expect(parse("|{\\|}|").eq(str("{|}"))); + try expect(parse("foobar").eq(str("foobar"))); + try expect(parse("!$%&*+").eq(str("!$%&*+"))); + try expect(parse("-/<=>?").eq(str("-/<=>?"))); + try expect(parse("@^_~00").eq(str("@^_~00"))); +} + +test "parse long bare string" { + const str = value.istr.intern; + try expect(parse("foobarbaz").eq(str("foobarbaz"))); + try expect(parse(".foo.bar.baz").eq(str(".foo.bar.baz"))); + try expect(parse("+foo.bar.baz").eq(str("+foo.bar.baz"))); + try expect(parse("-foo.bar.baz").eq(str("-foo.bar.baz"))); + try expect(parse("0foo.bar.baz").eq(str("0foo.bar.baz"))); + try expect(parse("!$%&*+-/<=>?@^_~").eq(str("!$%&*+-/<=>?@^_~"))); + try expect(parse("|foo\\x20bar\\x0abaz|").eq(str("foo bar\nbaz"))); +} + test "parse" { - const val = parseString("\"foo\""); + const val = parse("foo"); try testing.expect(value.sstr.check(val)); @@ -22,7 +68,7 @@ test "parse" { } test "parse2" { - const val = parseString( + const val = parse( \\ ;; Testing some crazy datum comments \\ ;~"bar"([x #"y"]{##`,'z}) #"foo" \\ ;; end @@ -31,7 +77,7 @@ test "parse2" { const r = value.rune.unpack(value.pair.car(val)); try testing.expectEqualStrings("HASH", r.slice()); - const s = value.pair.cdr(val); + const s = value.pair.cdr(value.pair.cdr(val)); try testing.expect(value.sstr.check(s)); const f = value.sstr.unpack(s); @@ -39,7 +85,7 @@ test "parse2" { } test "parse3" { - const val = parseString( + const val = parse( \\(foo ;~x ;~(x y) ;~x #bar [#x #"baz"] 'bat) ); @@ -53,12 +99,12 @@ test "parse3" { try testing.expect(value.sstr.check(e1)); try testing.expect(value.rune.check(e2)); - try testing.expect(value.pair.check(e3)); - try testing.expect(value.pair.check(e4)); + try testing.expect(value.pair.check(e3) != null); + try testing.expect(value.pair.check(e4) != null); } test "parse4" { - const val = parseString("(foo . ;~x bar ;~y)"); + const val = parse("(foo . ;~x bar ;~y)"); const s = value.sstr.unpack(value.pair.car(val)); try testing.expectEqualStrings("foo", s.slice()); @@ -72,7 +118,7 @@ test "unparse" { var out: std.ArrayList(u8) = .init(gpa.allocator()); const w = out.writer(); - const v = parseString("#foo"); + const v = parse("#foo"); try io.unparser.unparse(w, v); try testing.expectEqualStrings("#foo", try out.toOwnedSlice()); } @@ -82,7 +128,7 @@ test "unparse2" { var out: std.ArrayList(u8) = .init(gpa.allocator()); const w = out.writer(); - const v = parseString("#{foo bar['x]}"); + const v = parse("#{foo bar['x]}"); try io.unparser.unparse(w, v); try testing.expectEqualStrings( "(#HASH #BRACE foo (#JOIN bar #SQUARE (#QUOTE . x)))", @@ -92,7 +138,7 @@ test "unparse2" { fn writeParseResult(str: []const u8) !void { const w = std.io.getStdErr().writer(); - const v = parseString(str); + const v = parse(str); try io.unparser.unparse(w, v); try w.writeByte('\n'); } @@ -158,5 +204,5 @@ fn parseBench(path: []const u8, iters: usize) !void { test "parse bench" { try parseBench("src/test/data/parser-test-1.scm", 200); try parseBench("src/test/data/parser-test-2.scm", 800); - try parseBench("src/test/data/parser-torture.scm", 1); + //try parseBench("src/test/data/parser-torture.scm", 1); } |
