summaryrefslogtreecommitdiff
path: root/src/test/parse.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/parse.zig')
-rw-r--r--src/test/parse.zig70
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);
}