88 lines
1.8 KiB
C++
88 lines
1.8 KiB
C++
|
#include <catch2/catch.hpp>
|
||
|
#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);
|
||
|
}
|