#include #include "../src/Lexer.hpp" class LexerTest { public: explicit LexerTest() {} virtual ~LexerTest() {} void test_next(grino::Lexer& lexer, std::string const& oracle) { auto node = lexer.next(); REQUIRE(node != nullptr); REQUIRE(oracle == node->string()); } void test_end(grino::Lexer& lexer) { auto node = lexer.next(); REQUIRE(node == nullptr); } protected: grino::Logger m_logger; }; TEST_CASE_METHOD(LexerTest, "Lexer_booleans") { grino::Lexer lexer {m_logger, "tests/lexer"}; SECTION("space around") { lexer.scan(" true false "); test_next(lexer, "BOOL[true]"); test_next(lexer, "BOOL[false]"); test_end(lexer); } SECTION("no space around") { lexer.scan("true false"); test_next(lexer, "BOOL[true]"); test_next(lexer, "BOOL[false]"); test_end(lexer); } } TEST_CASE_METHOD(LexerTest, "Lexer_comments") { grino::Lexer lexer {m_logger, "tests/lexer"}; lexer.scan(" true ; false \n\n true "); test_next(lexer, "BOOL[true]"); test_next(lexer, "BOOL[true]"); test_end(lexer); } TEST_CASE_METHOD(LexerTest, "Lexer_vardecl") { grino::Lexer lexer {m_logger, "tests/lexer"}; lexer.scan(" $ () coucou) "); test_next(lexer, "DECL"); test_next(lexer, "OPAR"); test_next(lexer, "CPAR"); test_next(lexer, "IDENT[coucou]"); test_next(lexer, "CPAR"); test_end(lexer); } TEST_CASE_METHOD(LexerTest, "Lexer_no_end_space") { grino::Lexer lexer {m_logger, "tests/lexer"}; lexer.scan(")"); test_next(lexer, "CPAR"); test_end(lexer); }