This repository has been archived on 2023-09-09. You can view files and clone it, but cannot push or open issues/pull-requests.
skemla/tests/Lexer.cpp

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