|
#include <catch2/catch_test_macros.hpp>
|
|
#include "UserScript/parser.h"
|
|
|
|
using token = scripting::ast::token;
|
|
using symbol_t = scripting::ast::symbol_t;
|
|
using identifier = scripting::ast::identifier;
|
|
|
|
TEST_CASE("Lexer Test 01") {
|
|
std::string code = "/salad 12 13 \"hello\" ident\n";
|
|
std::vector<token> expected = {
|
|
token{.value = symbol_t::divide},
|
|
token{.value = identifier{.value = "salad"}},
|
|
token{.value = 12},
|
|
token{.value = 13},
|
|
token{.value = "hello"},
|
|
token{.value = identifier{.value = "ident"}},
|
|
token{.value = symbol_t::new_line}
|
|
};
|
|
|
|
std::vector<scripting::script_error> errors;
|
|
auto lexed = scripting::ast::lex(code, errors);
|
|
|
|
REQUIRE(errors.empty());
|
|
|
|
REQUIRE(lexed.size() == expected.size());
|
|
for(size_t idx = 0; idx < lexed.size(); ++idx) {
|
|
REQUIRE(lexed[idx].value.index() == expected[idx].value.index());
|
|
REQUIRE(lexed[idx].value == expected[idx].value);
|
|
}
|
|
}
|
|
|
|
TEST_CASE("Lexer Test 01 (Doubled)") {
|
|
std::string code = "/salad 12 13 \"hello\" ident\n/salad 12 13 \"hello\" ident\n";
|
|
std::vector<token> expected = {
|
|
token{.value = symbol_t::divide},
|
|
token{.value = identifier{.value = "salad"}},
|
|
token{.value = 12},
|
|
token{.value = 13},
|
|
token{.value = "hello"},
|
|
token{.value = identifier{.value = "ident"}},
|
|
token{.value = symbol_t::new_line},
|
|
token{.value = symbol_t::divide},
|
|
token{.value = identifier{.value = "salad"}},
|
|
token{.value = 12},
|
|
token{.value = 13},
|
|
token{.value = "hello"},
|
|
token{.value = identifier{.value = "ident"}},
|
|
token{.value = symbol_t::new_line}
|
|
};
|
|
|
|
std::vector<scripting::script_error> errors;
|
|
auto lexed = scripting::ast::lex(code, errors);
|
|
|
|
REQUIRE(errors.empty());
|
|
|
|
REQUIRE(lexed.size() == expected.size());
|
|
for(size_t idx = 0; idx < lexed.size(); ++idx) {
|
|
REQUIRE(lexed[idx].value.index() == expected[idx].value.index());
|
|
REQUIRE(lexed[idx].value == expected[idx].value);
|
|
}
|
|
}
|
|
|
|
TEST_CASE("Lexer Test 02") {
|
|
std::string code = "/salad 12 13 \"hello\" ident\n"
|
|
"/salad 12 13 \"hello\" ident\n"
|
|
"if(/test)\n"
|
|
" /nice\n"
|
|
"endif";
|
|
auto line1 = std::make_shared<const std::string>("/salad 12 13 \"hello\" ident");
|
|
auto line2 = line1;
|
|
auto line3 = std::make_shared<const std::string>("if(/test)");
|
|
auto line4 = std::make_shared<const std::string>(" /nice");
|
|
auto line5 = std::make_shared<const std::string>("endif");
|
|
using cl = scripting::code_location;
|
|
std::vector<token> expected = {
|
|
token{.location = std::make_shared<cl>(cl{.line_contents = line1, .line_number = 1, .column_number = 1}), .value = symbol_t::divide},
|
|
token{.location = std::make_shared<cl>(cl{.line_contents = line1, .line_number = 1, .column_number = 2}), .value = identifier{.value = "salad"}},
|
|
token{.location = std::make_shared<cl>(cl{.line_contents = line1, .line_number = 1, .column_number = 8}), .value = 12},
|
|
token{.location = std::make_shared<cl>(cl{.line_contents = line1, .line_number = 1, .column_number = 11}), .value = 13},
|
|
token{.location = std::make_shared<cl>(cl{.line_contents = line1, .line_number = 1, .column_number = 14}), .value = "hello"},
|
|
token{.location = std::make_shared<cl>(cl{.line_contents = line1, .line_number = 1, .column_number = 22}), .value = identifier{.value = "ident"}},
|
|
token{.location = std::make_shared<cl>(cl{.line_contents = line1, .line_number = 1, .column_number = 27}), .value = symbol_t::new_line},
|
|
token{.location = std::make_shared<cl>(cl{.line_contents = line2, .line_number = 2, .column_number = 1}), .value = symbol_t::divide},
|
|
token{.location = std::make_shared<cl>(cl{.line_contents = line2, .line_number = 2, .column_number = 2}), .value = identifier{.value = "salad"}},
|
|
token{.location = std::make_shared<cl>(cl{.line_contents = line2, .line_number = 2, .column_number = 8}), .value = 12},
|
|
token{.location = std::make_shared<cl>(cl{.line_contents = line2, .line_number = 2, .column_number = 11}), .value = 13},
|
|
token{.location = std::make_shared<cl>(cl{.line_contents = line2, .line_number = 2, .column_number = 14}), .value = "hello"},
|
|
token{.location = std::make_shared<cl>(cl{.line_contents = line2, .line_number = 2, .column_number = 22}), .value = identifier{.value = "ident"}},
|
|
token{.location = std::make_shared<cl>(cl{.line_contents = line2, .line_number = 2, .column_number = 27}), .value = symbol_t::new_line},
|
|
token{.location = std::make_shared<cl>(cl{.line_contents = line3, .line_number = 3, .column_number = 1}), .value = identifier{.value = "if"}},
|
|
token{.location = std::make_shared<cl>(cl{.line_contents = line3, .line_number = 3, .column_number = 3}), .value = symbol_t::l_paren},
|
|
token{.location = std::make_shared<cl>(cl{.line_contents = line3, .line_number = 3, .column_number = 4}), .value = symbol_t::divide},
|
|
token{.location = std::make_shared<cl>(cl{.line_contents = line3, .line_number = 3, .column_number = 5}), .value = identifier{.value = "test"}},
|
|
token{.location = std::make_shared<cl>(cl{.line_contents = line3, .line_number = 3, .column_number = 9}), .value = symbol_t::r_paren},
|
|
token{.location = std::make_shared<cl>(cl{.line_contents = line3, .line_number = 3, .column_number = 10}), .value = symbol_t::new_line},
|
|
token{.location = std::make_shared<cl>(cl{.line_contents = line4, .line_number = 4, .column_number = 5}), .value = symbol_t::divide},
|
|
token{.location = std::make_shared<cl>(cl{.line_contents = line4, .line_number = 4, .column_number = 6}), .value = identifier{.value = "nice"}},
|
|
token{.location = std::make_shared<cl>(cl{.line_contents = line4, .line_number = 4, .column_number = 10}), .value = symbol_t::new_line},
|
|
token{.location = std::make_shared<cl>(cl{.line_contents = line5, .line_number = 5, .column_number = 1}), .value = identifier{.value = "endif"}},
|
|
};
|
|
std::vector<scripting::script_error> errors;
|
|
auto lexed = scripting::ast::lex(code, errors);
|
|
|
|
REQUIRE(errors.empty());
|
|
|
|
REQUIRE(lexed.size() == expected.size());
|
|
for(size_t idx = 0; idx < lexed.size(); ++idx) {
|
|
REQUIRE(lexed[idx].value.index() == expected[idx].value.index());
|
|
REQUIRE(lexed[idx].value == expected[idx].value);
|
|
REQUIRE(lexed[idx].location);
|
|
if(expected[idx].location) {
|
|
REQUIRE(expected[idx].location->column_number == lexed[idx].location->column_number);
|
|
REQUIRE(expected[idx].location->line_number == lexed[idx].location->line_number);
|
|
REQUIRE((bool)lexed[idx].location->line_contents);
|
|
REQUIRE(*(expected[idx].location->line_contents) == *(lexed[idx].location->line_contents));
|
|
}
|
|
}
|
|
}
|