#include #include "../lib/Factory.hpp" class LexerTest { public: explicit LexerTest() {} virtual ~LexerTest() {} void test_next(sk::Lexer& lexer, std::string const& oracle) { auto token = lexer.next(); REQUIRE(token); REQUIRE(oracle == token->string()); } void test_end(sk::Lexer& lexer) { auto token = lexer.next(); REQUIRE(nullptr == token); } protected: sk::Logger m_logger; sk::Factory m_factory {"tests/lexer", m_logger}; }; TEST_CASE_METHOD(LexerTest, "Lexer_unknown_token") { auto lexer = m_factory.make_lexer(); lexer->scan(" ยง "); REQUIRE_THROWS_AS(lexer->next(), sk::lexical_error); } TEST_CASE_METHOD(LexerTest, "Lexer_int") { auto lexer = m_factory.make_lexer(); lexer->scan(" 47 29 3 "); test_next(*lexer, "INT[47]"); test_next(*lexer, "INT[29]"); test_next(*lexer, "INT[3]"); test_end(*lexer); } TEST_CASE_METHOD(LexerTest, "Lexer_float") { auto lexer = m_factory.make_lexer(); lexer->scan(" 27.0 3.33 "); test_next(*lexer, "FLOAT[27.0]"); test_next(*lexer, "FLOAT[3.33]"); test_end(*lexer); } TEST_CASE_METHOD(LexerTest, "Lexer_bools") { auto lexer = m_factory.make_lexer(); lexer->scan(" true false "); test_next(*lexer, "BOOL[true]"); test_next(*lexer, "BOOL[false]"); test_end(*lexer); } TEST_CASE_METHOD(LexerTest, "Lexer_string") { auto lexer = m_factory.make_lexer(); lexer->scan(" ' true' 'false ' 'both' "); test_next(*lexer, "STRING[' true']"); test_next(*lexer, "STRING['false ']"); test_next(*lexer, "STRING['both']"); test_end(*lexer); } TEST_CASE_METHOD(LexerTest, "Lexer_comments") { auto lexer = m_factory.make_lexer(); lexer->scan(" ' true' ;; 'false ' \n 'both' "); test_next(*lexer, "STRING[' true']"); test_next(*lexer, "STRING['both']"); test_end(*lexer); }