Implements string lexing.
This commit is contained in:
@@ -7,25 +7,24 @@ using namespace ElohimScript::Parser;
|
||||
TEST_CASE("Lex " script) { \
|
||||
auto lexer = Lexer(script); \
|
||||
const auto* token = lexer.Lex(); \
|
||||
REQUIRE(token->GetKind() == LexTokenKind::IntegerToken); \
|
||||
auto value = ((const IntegerToken*)token)->GetValue(); \
|
||||
REQUIRE(token->GetKind() == LexTokenKind::IntegerLiteral); \
|
||||
auto value = ((const IntegerLiteral*)token)->GetValue(); \
|
||||
CHECK(value == (expected)); \
|
||||
CHECK(token->GetNext()->GetKind() == LexTokenKind::EndOfFile); \
|
||||
delete token; \
|
||||
}
|
||||
|
||||
#define FLOAT_TEST(script, expected) \
|
||||
#define FLOAT_TEST(script, expected) \
|
||||
TEST_CASE("Lex " script) { \
|
||||
auto lexer = Lexer(script); \
|
||||
const auto* token = lexer.Lex(); \
|
||||
REQUIRE(token->GetKind() == LexTokenKind::FloatToken); \
|
||||
auto value = ((const FloatToken*)token)->GetValue(); \
|
||||
REQUIRE(token->GetKind() == LexTokenKind::FloatLiteral); \
|
||||
auto value = ((const FloatLiteral*)token)->GetValue(); \
|
||||
CHECK(value == (expected)); \
|
||||
CHECK(token->GetNext()->GetKind() == LexTokenKind::EndOfFile); \
|
||||
delete token; \
|
||||
}
|
||||
|
||||
|
||||
// Decimal lexing
|
||||
INTEGER_TEST("123456", 123456);
|
||||
INTEGER_TEST("0d123456", 123456);
|
||||
@@ -61,4 +60,7 @@ INTEGER_TEST("0b1", 1);
|
||||
INTEGER_TEST("0b11", 3);
|
||||
INTEGER_TEST("0b111", 7);
|
||||
INTEGER_TEST("0b1111", 15);
|
||||
INTEGER_TEST("0b110011", 51);
|
||||
INTEGER_TEST("0b110011", 51);
|
||||
|
||||
#undef INTEGER_TEST
|
||||
#undef FLOAT_TEST
|
||||
33
tests/LexerTests/StringLexTests.cpp
Normal file
33
tests/LexerTests/StringLexTests.cpp
Normal file
@@ -0,0 +1,33 @@
|
||||
#include "../../extern/doctest.hpp"
|
||||
#include "../../src/Parser/Lexer/Lexer.hpp"
|
||||
|
||||
using namespace ElohimScript::Parser;
|
||||
|
||||
#define STRING_TEST(str, constraint) \
|
||||
TEST_CASE("Lex string " constraint str constraint) { \
|
||||
auto lexer = Lexer(constraint str constraint); \
|
||||
const auto* token = lexer.Lex(); \
|
||||
REQUIRE(token->GetKind() == LexTokenKind::StringLiteral); \
|
||||
auto value = ((const StringLiteral*)token)->GetValue(); \
|
||||
CHECK(value == std::u8string(reinterpret_cast<const char8_t*>(str))); \
|
||||
CHECK(token->GetNext()->GetKind() == LexTokenKind::EndOfFile); \
|
||||
delete token; \
|
||||
}
|
||||
|
||||
STRING_TEST("foo bar", "'");
|
||||
STRING_TEST("foo bar", "\"");
|
||||
STRING_TEST("foo bar", "\"\"\"");
|
||||
STRING_TEST("\"foo bar\"", "\"\"\"");
|
||||
STRING_TEST("\"\"foo bar\"\"", "\"\"\"");
|
||||
|
||||
TEST_CASE("Lex multiline string") {
|
||||
auto lexer = Lexer(R"("""foo
|
||||
bar""")");
|
||||
const auto* token = lexer.Lex();
|
||||
REQUIRE(token->GetKind() == LexTokenKind::StringLiteral);
|
||||
auto value = (dynamic_cast<const StringLiteral*>(token))->GetValue();
|
||||
CHECK(value == std::u8string(reinterpret_cast<const char8_t*>(R"(foo
|
||||
bar)")));
|
||||
CHECK(token->GetNext()->GetKind() == LexTokenKind::EndOfFile);
|
||||
delete token;
|
||||
}
|
||||
Reference in New Issue
Block a user