From fe3d4ce758822d65a0a5d617b7b77df2dbc972d8 Mon Sep 17 00:00:00 2001 From: Ben Longbons Date: Sun, 16 Mar 2014 14:55:57 -0700 Subject: Implement new magic frontend using sexpr --- src/sexpr/parser_test.cpp | 89 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/sexpr/parser_test.cpp (limited to 'src/sexpr/parser_test.cpp') diff --git a/src/sexpr/parser_test.cpp b/src/sexpr/parser_test.cpp new file mode 100644 index 0000000..a752313 --- /dev/null +++ b/src/sexpr/parser_test.cpp @@ -0,0 +1,89 @@ +#include "parser.hpp" + +#include + +static +io::FD string_pipe(ZString sz) +{ + io::FD rfd, wfd; + if (-1 == io::FD::pipe(rfd, wfd)) + return io::FD(); + if (sz.size() != wfd.write(sz.c_str(), sz.size())) + { + rfd.close(); + wfd.close(); + return io::FD(); + } + wfd.close(); + return rfd; +} + +TEST(sexpr, parser) +{ + sexpr::SExpr s; + io::LineSpan span; + sexpr::Lexer lexer("", string_pipe(" foo( ) 123\"\" \n")); + + EXPECT_TRUE(sexpr::parse(lexer, s)); + EXPECT_EQ(s._type, sexpr::TOKEN); + EXPECT_EQ(s._str, "foo"); + + EXPECT_TRUE(sexpr::parse(lexer, s)); + EXPECT_EQ(s._type, sexpr::LIST); + EXPECT_EQ(s._list, std::vector()); + + EXPECT_TRUE(sexpr::parse(lexer, s)); + EXPECT_EQ(s._type, sexpr::INT); + EXPECT_EQ(s._int, 123); + + EXPECT_TRUE(sexpr::parse(lexer, s)); + EXPECT_EQ(s._type, sexpr::STRING); + EXPECT_EQ(s._str, ""); + + EXPECT_FALSE(sexpr::parse(lexer, s)); + EXPECT_EQ(lexer.peek(), sexpr::TOK_EOF); +} + +TEST(sexpr, parselist) +{ + sexpr::SExpr s; + sexpr::Lexer lexer("", string_pipe("(foo)(bar)\n")); + + EXPECT_TRUE(sexpr::parse(lexer, s)); + EXPECT_EQ(s._type, sexpr::LIST); + EXPECT_EQ(s._list.size(), 1); + EXPECT_EQ(s._list[0]._type, sexpr::TOKEN); + EXPECT_EQ(s._list[0]._str, "foo"); + + EXPECT_TRUE(sexpr::parse(lexer, s)); + EXPECT_EQ(s._type, sexpr::LIST); + EXPECT_EQ(s._list.size(), 1); + EXPECT_EQ(s._list[0]._type, sexpr::TOKEN); + EXPECT_EQ(s._list[0]._str, "bar"); + + EXPECT_FALSE(sexpr::parse(lexer, s)); + EXPECT_EQ(lexer.peek(), sexpr::TOK_EOF); +} + +TEST(sexpr, parsebad) +{ + for (ZString bad : { + ZString("(\n"), + ZString(")\n"), + ZString("\"\n"), + ZString("'\n"), + ZString("\\\n"), + ZString("\"\\"), + ZString("\"\\z\""), + ZString("(()\n"), + ZString("((\n"), + ZString("((\"\n"), + }) + { + sexpr::SExpr s; + io::LineSpan span; + sexpr::Lexer lexer("", string_pipe(bad)); + EXPECT_FALSE(sexpr::parse(lexer, s)); + EXPECT_EQ(lexer.peek(), sexpr::TOK_ERROR); + } +} -- cgit v1.2.3-70-g09d2