Initial work on parsing.
This commit is contained in:
77
tests/ParserTests/ClassTests.cpp
Normal file
77
tests/ParserTests/ClassTests.cpp
Normal file
@@ -0,0 +1,77 @@
|
||||
#include "../../extern/doctest.hpp"
|
||||
#include "../../src/Parser/Parser.hpp"
|
||||
|
||||
using namespace MalachScript;
|
||||
|
||||
TEST_CASE("Parse basic class without body") {
|
||||
std::vector<Parser::LexToken*> vec = {
|
||||
new Parser::LexTokenImpl<Parser::LexTokenKind::ClassKeyword>(TextSpan(0, 0)),
|
||||
new Parser::IdentifierToken(TextSpan(0, 0), u8"foobar"),
|
||||
new Parser::LexTokenImpl<Parser::LexTokenKind::SemicolonSymbol>(TextSpan(0, 0)),
|
||||
new Parser::LexTokenImpl<Parser::LexTokenKind::EndOfFile>(TextSpan(0, 0)),
|
||||
};
|
||||
for (size_t i = 0; i < vec.size() - 1; i++) {
|
||||
vec[i]->SetNext(vec[i + 1]);
|
||||
}
|
||||
Diagnostics::Diagnostics diags;
|
||||
auto parser = Parser::Parser(u8"class without body", vec.front(), &diags);
|
||||
auto* script = parser.Parse();
|
||||
REQUIRE(diags.GetMessages().empty());
|
||||
{
|
||||
REQUIRE(script->GetStatements().size() == 1);
|
||||
REQUIRE(script->GetStatements()[0].get()->GetKind() == Parser::ParsedStatementKind::Class);
|
||||
}
|
||||
delete vec[0];
|
||||
delete script;
|
||||
}
|
||||
|
||||
#define PARSER_TEST(name, tokens, asserts) \
|
||||
TEST_CASE(name) { \
|
||||
std::vector<Parser::LexToken*> vec = { \
|
||||
tokens, \
|
||||
new Parser::LexTokenImpl<Parser::LexTokenKind::EndOfFile>(TextSpan(0, 0)), \
|
||||
}; \
|
||||
for (size_t i = 0; i < vec.size() - 1; i++) { \
|
||||
vec[i]->SetNext(vec[i + 1]); \
|
||||
} \
|
||||
Diagnostics::Diagnostics diags; \
|
||||
auto parser = Parser::Parser(u8"scriptname", vec.front(), &diags); \
|
||||
auto* script = parser.Parse(); \
|
||||
REQUIRE(diags.GetMessages().empty()); \
|
||||
asserts; \
|
||||
delete vec[0]; \
|
||||
delete script; \
|
||||
}
|
||||
|
||||
#define PARSER_TEST_TOKENS(...) __VA_ARGS__
|
||||
|
||||
PARSER_TEST("Parse basic class without body",
|
||||
PARSER_TEST_TOKENS(new Parser::LexTokenImpl<Parser::LexTokenKind::ClassKeyword>(TextSpan(0, 0)),
|
||||
new Parser::IdentifierToken(TextSpan(0, 0), u8"foobar"),
|
||||
new Parser::LexTokenImpl<Parser::LexTokenKind::SemicolonSymbol>(TextSpan(0, 0))),
|
||||
{
|
||||
REQUIRE(script->GetStatements().size() == 1);
|
||||
REQUIRE(script->GetStatements()[0].get()->GetKind() == Parser::ParsedStatementKind::Class);
|
||||
})
|
||||
|
||||
PARSER_TEST("Parse basic class without body with whitespaces",
|
||||
PARSER_TEST_TOKENS(new Parser::LexTokenImpl<Parser::LexTokenKind::ClassKeyword>(TextSpan(0, 0)),
|
||||
new Parser::LexTokenImpl<Parser::LexTokenKind::Whitespace>(TextSpan(0, 0)),
|
||||
new Parser::IdentifierToken(TextSpan(0, 0), u8"foobar"),
|
||||
new Parser::LexTokenImpl<Parser::LexTokenKind::Whitespace>(TextSpan(0, 0)),
|
||||
new Parser::LexTokenImpl<Parser::LexTokenKind::SemicolonSymbol>(TextSpan(0, 0))),
|
||||
{
|
||||
REQUIRE(script->GetStatements().size() == 1);
|
||||
REQUIRE(script->GetStatements()[0].get()->GetKind() == Parser::ParsedStatementKind::Class);
|
||||
})
|
||||
|
||||
PARSER_TEST(
|
||||
"Parse basic class with empty body",
|
||||
PARSER_TEST_TOKENS(new Parser::LexTokenImpl<Parser::LexTokenKind::ClassKeyword>(TextSpan(0, 0)),
|
||||
new Parser::IdentifierToken(TextSpan(0, 0), u8"foobar"),
|
||||
new Parser::LexTokenImpl<Parser::LexTokenKind::OpenCurlyParenthesisSymbol>(TextSpan(0, 0)),
|
||||
new Parser::LexTokenImpl<Parser::LexTokenKind::CloseCurlyParenthesisSymbol>(TextSpan(0, 0))),
|
||||
{
|
||||
REQUIRE(script->GetStatements().size() == 1);
|
||||
REQUIRE(script->GetStatements()[0].get()->GetKind() == Parser::ParsedStatementKind::Class);
|
||||
})
|
||||
27
tests/ParserTests/ParserIntegrationTests.cpp
Normal file
27
tests/ParserTests/ParserIntegrationTests.cpp
Normal file
@@ -0,0 +1,27 @@
|
||||
#include "../../extern/doctest.hpp"
|
||||
#include "../../src/Parser/Lexer/Lexer.hpp"
|
||||
#include "../../src/Parser/Parser.hpp"
|
||||
|
||||
using namespace MalachScript;
|
||||
|
||||
#define PARSE_TEST(name, scriptText, asserts) \
|
||||
TEST_CASE(name) { \
|
||||
Diagnostics::Diagnostics diags; \
|
||||
auto lexer = Parser::Lexer(name, scriptText, &diags); \
|
||||
auto token = lexer.Lex(); \
|
||||
auto parser = Parser::Parser(name, token, &diags); \
|
||||
auto script = parser.Parse(); \
|
||||
asserts; \
|
||||
}
|
||||
|
||||
PARSE_TEST("Parse class without definition", "class foobar;", {
|
||||
REQUIRE(diags.GetMessages().empty());
|
||||
REQUIRE(script->GetStatements().size() == 1);
|
||||
REQUIRE(script->GetStatements()[0].get()->GetKind() == Parser::ParsedStatementKind::Class);
|
||||
})
|
||||
|
||||
PARSE_TEST("Parse class with empty definition", "class foobar {}", {
|
||||
REQUIRE(diags.GetMessages().empty());
|
||||
REQUIRE(script->GetStatements().size() == 1);
|
||||
REQUIRE(script->GetStatements()[0].get()->GetKind() == Parser::ParsedStatementKind::Class);
|
||||
})
|
||||
Reference in New Issue
Block a user