#include #include "../lib/Lexer.hpp" #include "../lib/Factory.hpp" class LexerTest { public: explicit LexerTest() {} virtual ~LexerTest() {} void test_next(jk::Lexer& lexer, std::string const& oracle) { auto token = lexer.next(); REQUIRE(token); REQUIRE(oracle == token->string()); } void test_end(jk::Lexer& lexer) { auto token = lexer.next(); REQUIRE(!token); } protected: jk::Logger m_logger; }; TEST_CASE_METHOD(LexerTest, "Lexer_int") { auto lexer = jk::Factory(m_logger, "tests/lexer").make_lexer(); lexer->scan("4 128 333"); test_next(*lexer, "INT[4]"); test_next(*lexer, "INT[128]"); test_next(*lexer, "INT[333]"); test_end(*lexer); } TEST_CASE_METHOD(LexerTest, "Lexer_comments") { auto lexer = jk::Factory(m_logger, "tests/lexer").make_lexer(); lexer->scan("4 # 128 \n 333"); test_next(*lexer, "INT[4]"); test_next(*lexer, "INT[333]"); test_end(*lexer); } TEST_CASE_METHOD(LexerTest, "Lexer_error") { auto lexer = jk::Factory(m_logger, "tests/lexer").make_lexer(); lexer->scan(" ยง "); REQUIRE_THROWS_AS(lexer->next(), jk::lexical_error); } TEST_CASE_METHOD(LexerTest, "Lexer_funcall") { auto lexer = jk::Factory(m_logger, "tests/lexer").make_lexer(); lexer->scan(" )( salut salut! salut? _salut -salut salut/monde"); test_next(*lexer, "CPAR"); test_next(*lexer, "OPAR"); test_next(*lexer, "IDENT[salut]"); test_next(*lexer, "IDENT[salut!]"); test_next(*lexer, "IDENT[salut?]"); test_next(*lexer, "IDENT[_salut]"); test_next(*lexer, "IDENT[-salut]"); test_next(*lexer, "IDENT[salut/monde]"); test_end(*lexer); } TEST_CASE_METHOD(LexerTest, "Lexer_vardecl") { auto lexer = jk::Factory(m_logger, "tests/lexer").make_lexer(); lexer->scan(" $ "); test_next(*lexer, "DECL"); test_end(*lexer); }