54 lines
1.1 KiB
C++
54 lines
1.1 KiB
C++
|
#include <catch2/catch.hpp>
|
||
|
#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_errors")
|
||
|
{
|
||
|
grino::Lexer lexer {m_logger, "tests/lexer"};
|
||
|
lexer.scan(" § ");
|
||
|
REQUIRE_THROWS_AS(lexer.next(), grino::lexical_error);
|
||
|
}
|
||
|
|
||
|
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);
|
||
|
}
|
||
|
}
|