Initial commit, support for lexing symbols and numericals.
This commit is contained in:
64
tests/LexerTests/NumericalLexTests.cpp
Normal file
64
tests/LexerTests/NumericalLexTests.cpp
Normal file
@@ -0,0 +1,64 @@
|
||||
#include "../../extern/doctest.hpp"
|
||||
#include "../../src/Parser/Lexer/Lexer.hpp"
|
||||
|
||||
using namespace ElohimScript::Parser;
|
||||
|
||||
#define INTEGER_TEST(script, expected) \
|
||||
TEST_CASE("Lex " script) { \
|
||||
auto lexer = Lexer(script); \
|
||||
const auto* token = lexer.Lex(); \
|
||||
REQUIRE(token->GetKind() == LexTokenKind::IntegerToken); \
|
||||
auto value = ((const IntegerToken*)token)->GetValue(); \
|
||||
CHECK(value == (expected)); \
|
||||
CHECK(token->GetNext()->GetKind() == LexTokenKind::EndOfFile); \
|
||||
delete token; \
|
||||
}
|
||||
|
||||
#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(); \
|
||||
CHECK(value == (expected)); \
|
||||
CHECK(token->GetNext()->GetKind() == LexTokenKind::EndOfFile); \
|
||||
delete token; \
|
||||
}
|
||||
|
||||
|
||||
// Decimal lexing
|
||||
INTEGER_TEST("123456", 123456);
|
||||
INTEGER_TEST("0d123456", 123456);
|
||||
INTEGER_TEST("50000000000", 50000000000);
|
||||
|
||||
// Decimal float lexing
|
||||
FLOAT_TEST("123.456", 123.456);
|
||||
FLOAT_TEST("0.456", 0.456);
|
||||
FLOAT_TEST("0.456e12", 0.456e12);
|
||||
FLOAT_TEST("0.456E12", 0.456E12);
|
||||
|
||||
// Hexadecimal lexing
|
||||
INTEGER_TEST("0x0", 0);
|
||||
INTEGER_TEST("0xF", 15);
|
||||
INTEGER_TEST("0xf", 15);
|
||||
INTEGER_TEST("0xFF", 255);
|
||||
INTEGER_TEST("0xfF", 255);
|
||||
INTEGER_TEST("0xFFF", 4095);
|
||||
INTEGER_TEST("0xFFFF", 65535);
|
||||
INTEGER_TEST("0xFFFFF", 1048575);
|
||||
INTEGER_TEST("0xFFFFFF", 16777215);
|
||||
|
||||
// Octal lexing
|
||||
INTEGER_TEST("0o0", 0);
|
||||
INTEGER_TEST("0o7", 7);
|
||||
INTEGER_TEST("0o77", 63);
|
||||
INTEGER_TEST("0o777", 511);
|
||||
INTEGER_TEST("0o7777", 4095);
|
||||
|
||||
// Binary lexing
|
||||
INTEGER_TEST("0b0", 0);
|
||||
INTEGER_TEST("0b1", 1);
|
||||
INTEGER_TEST("0b11", 3);
|
||||
INTEGER_TEST("0b111", 7);
|
||||
INTEGER_TEST("0b1111", 15);
|
||||
INTEGER_TEST("0b110011", 51);
|
||||
81
tests/LexerTests/SymbolLexTests.cpp
Normal file
81
tests/LexerTests/SymbolLexTests.cpp
Normal file
@@ -0,0 +1,81 @@
|
||||
#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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user