#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN #include "../../extern/doctest.hpp" #include "../../src/Parser/Lexer/Lexer.hpp" using namespace ElohimScript::Parser; #define SYMBOL_TEST(script, symbol) \ TEST_CASE("Lex " script) { \ auto lexer = Lexer(script); \ const auto* token = lexer.Lex(); \ CHECK(token->GetKind() == LexTokenKind::symbol); \ CHECK(token->GetNext()->GetKind() == LexTokenKind::EndOfFile); \ delete token; \ } SYMBOL_TEST("*", StarSymbol) SYMBOL_TEST("**", StarStarSymbol) SYMBOL_TEST("*=", StarEqualsSymbol) SYMBOL_TEST("**=", StarStarEqualsSymbol) SYMBOL_TEST("/", SlashSymbol) SYMBOL_TEST("/=", SlashEqualsSymbol) SYMBOL_TEST("%", PercentSymbol) SYMBOL_TEST("%=", PercentEqualsSymbol) SYMBOL_TEST("+", PlusSymbol) SYMBOL_TEST("+=", PlusEqualsSymbol) SYMBOL_TEST("++", PlusPlusSymbol) SYMBOL_TEST("-", MinusSymbol) SYMBOL_TEST("-=", MinusEqualsSymbol) SYMBOL_TEST("--", MinusMinusSymbol) SYMBOL_TEST("<", LessThanSymbol) SYMBOL_TEST("<=", LessThanEqualsSymbol) SYMBOL_TEST("<<", LessThanLessThanSymbol) SYMBOL_TEST("<<=", LessThanLessThanEqualsSymbol) SYMBOL_TEST(">", GreaterThanSymbol) SYMBOL_TEST(">=", GreaterThanEqualsSymbol) SYMBOL_TEST(">>", GreaterThanGreaterThanSymbol) SYMBOL_TEST(">>=", GreaterThanGreaterThanEqualsSymbol) SYMBOL_TEST(">>>", GreaterThanGreaterThanGreaterThanSymbol) SYMBOL_TEST(">>>=", GreaterThanGreaterThanGreaterThanEqualsSymbol) SYMBOL_TEST("(", OpenParenthesisSymbol) SYMBOL_TEST(")", CloseParenthesisSymbol) SYMBOL_TEST("=", EqualsSymbol) SYMBOL_TEST("==", EqualsEqualsSymbol) SYMBOL_TEST("!", ExclamationMarkSymbol) SYMBOL_TEST("!=", ExclamationMarkEqualsSymbol) SYMBOL_TEST("!is", ExclamationMarkIsSymbol) SYMBOL_TEST("?", QuestionMarkSymbol) SYMBOL_TEST(":", ColonSymbol) SYMBOL_TEST("::", ColonColonSymbol) SYMBOL_TEST("&", AmpersandSymbol) SYMBOL_TEST("&=", AmpersandEqualsSymbol) SYMBOL_TEST("&&", AmpersandAmpersandSymbol) SYMBOL_TEST(",", CommaSymbol) SYMBOL_TEST("{", OpenCurlyParenthesisSymbol) SYMBOL_TEST("}", CloseCurlyParenthesisSymbol) SYMBOL_TEST(";", SemicolonSymbol) SYMBOL_TEST("|", VerticalLineSymbol) SYMBOL_TEST("|=", VerticalLineEqualsSymbol) SYMBOL_TEST("||", VerticalLineVerticalLineSymbol) SYMBOL_TEST("^", CaretSymbol) SYMBOL_TEST("^=", CaretEqualsSymbol) SYMBOL_TEST("^^", CaretCaretSymbol) SYMBOL_TEST("~", TildeSymbol) SYMBOL_TEST(".", DotSymbol) SYMBOL_TEST("[", OpenBlockParenthesisSymbol) SYMBOL_TEST("]", CloseBlockParenthesisSymbol) SYMBOL_TEST("@", AtSymbol) SYMBOL_TEST(" ", Whitespace) #undef SYMBOL_TEST TEST_CASE("Lex whitespace") { auto whitespace = {" ", "\t", "\n", "\r", "\xef\xbb\xbf"}; for (auto v : whitespace) { auto lexer = Lexer(v); const auto* token = lexer.Lex(); CHECK(token->GetKind() == LexTokenKind::Whitespace); CHECK(token->GetNext()->GetKind() == LexTokenKind::EndOfFile); delete token; } }