#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); }