#include #include "../lib/Parser.hpp" #include "../lib/Factory.hpp" class ParserTest { public: explicit ParserTest() {} virtual ~ParserTest() {} void test_parser(std::string const& oracle, std::string const& source) { auto parser = jk::Factory(m_logger, "tests/parser").make_parser(); auto root = parser->parse(source); REQUIRE(oracle == root->string()); } protected: jk::Logger m_logger; }; TEST_CASE_METHOD(ParserTest, "Parser_funcall") { test_parser("PROG", " "); test_parser("PROG(FUNCALL(IDENT[hello]))", " (hello) "); test_parser("PROG(FUNCALL(IDENT[hello],INT[1],INT[2]))", " (hello 1 2) "); test_parser("PROG(FUNCALL(IDENT[hello],INT[1],INT[2],IDENT[bim!]))", " (hello 1 2 bim!) "); } TEST_CASE_METHOD(ParserTest, "Parser_vardecl") { test_parser("PROG(VARDECL(IDENT[hello],INT[4]))", " ($ hello 4) "); test_parser("PROG(VARDECL(IDENT[world]," "FUNCALL(IDENT[f],INT[3],INT[2])))", " ($ world (f 3 2)) "); }