#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(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(token))->GetValue(); CHECK(value == std::u8string(reinterpret_cast(R"(foo bar)"))); CHECK(token->GetNext()->GetKind() == LexTokenKind::EndOfFile); delete token; }