85 lines
1.6 KiB
C++
85 lines
1.6 KiB
C++
#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));
|
|
}
|