muzgen/tests/Lexer.cpp

85 lines
1.6 KiB
C++
Raw Permalink Normal View History

#include <catch2/catch.hpp>
#include <lib/Lexer.hpp>
class LexerTest
{
public:
explicit LexerTest() {}
virtual ~LexerTest() {}
protected:
};
static std::string next_val(muz::Lexer& lexer)
{
auto tok = lexer.next();
if (tok)
{
return tok->string();
}
return "";
}
static void next_val_err(muz::Lexer& lexer)
{
REQUIRE_THROWS_AS(lexer.next(), muz::lexical_error);
}
TEST_CASE_METHOD(LexerTest, "Lexer_num")
{
muz::Lexer lexer;
lexer.scan(" 34 2.9 -7 -3.14 .1 1.");
REQUIRE("NUM[34]" == next_val(lexer));
REQUIRE("NUM[2.9]" == next_val(lexer));
REQUIRE("NUM[-7]" == next_val(lexer));
REQUIRE("NUM[-3.14]" == next_val(lexer));
REQUIRE("NUM[.1]" == next_val(lexer));
REQUIRE("NUM[1.]" == next_val(lexer));
REQUIRE("" == next_val(lexer));
}
TEST_CASE_METHOD(LexerTest, "Lexer_ident")
{
muz::Lexer lexer;
lexer.scan(" hello hello_world @hello");
REQUIRE("IDENT[hello]" == next_val(lexer));
REQUIRE("IDENT[hello_world]" == next_val(lexer));
REQUIRE("DIR_IDENT[@hello]" == next_val(lexer));
REQUIRE("" == next_val(lexer));
}
TEST_CASE_METHOD(LexerTest, "Lexer_commands")
{
muz::Lexer lexer;
lexer.scan(" [[]");
REQUIRE("OSQUARE" == next_val(lexer));
REQUIRE("OSQUARE" == next_val(lexer));
REQUIRE("CSQUARE" == next_val(lexer));
REQUIRE("" == next_val(lexer));
}
TEST_CASE_METHOD(LexerTest, "Lexer_unknown_sym_error")
{
muz::Lexer lexer;
lexer.scan(" § [[ \n ]");
next_val_err(lexer);
}
TEST_CASE_METHOD(LexerTest, "Lexer_comments")
{
muz::Lexer lexer;
lexer.scan(" # [[ \n ]");
REQUIRE("CSQUARE" == next_val(lexer));
REQUIRE("" == next_val(lexer));
}