Add more tests

This commit is contained in:
ala89 2023-11-22 15:31:30 +01:00
parent ce431b5453
commit 574f73b637
4 changed files with 88 additions and 31 deletions

View File

@ -119,15 +119,6 @@ vector<Token> tokenize(vector<string> input, int initial_line) {
tokens.emplace_back(token); tokens.emplace_back(token);
j += 4; j += 4;
} }
else if (regex_search(str, m, IDENTIFIER_REGEX, regex_constants::match_continuous)) {
Token token = {
.type = TokenType::Identifier,
.data = m.str(),
.pos = pos
};
tokens.emplace_back(token);
j += m.str().length();
}
else if (str.starts_with("++")) { else if (str.starts_with("++")) {
Token token = { .type = TokenType::DoublePlus, .pos = pos }; Token token = { .type = TokenType::DoublePlus, .pos = pos };
tokens.emplace_back(token); tokens.emplace_back(token);
@ -198,6 +189,15 @@ vector<Token> tokenize(vector<string> input, int initial_line) {
tokens.emplace_back(token); tokens.emplace_back(token);
j += 1; j += 1;
} }
else if (regex_search(str, m, IDENTIFIER_REGEX, regex_constants::match_continuous)) {
Token token = {
.type = TokenType::Identifier,
.data = m.str(),
.pos = pos
};
tokens.emplace_back(token);
j += m.str().length();
}
else if (isspace(str[0])) { else if (isspace(str[0])) {
j += 1; j += 1;
} }

View File

@ -47,5 +47,23 @@ int main() {
true true
); );
_TEST_ASSERT(
_TEST_NO_EXCEPTION(execute("int a = 27; ++a;") == 28),
"Incrémentation par la gauche",
true
);
_TEST_ASSERT(
_TEST_NO_EXCEPTION(execute("int a = 27; a--;") == 27),
"Décrémentation par la droite",
true
);
_TEST_ASSERT(
_TEST_NO_EXCEPTION(execute("int a = 27; -(+-++a);") == 28),
"Incrémentation et opérations unaires",
true
);
return 0; return 0;
} }

39
test/statements.cpp Normal file
View File

@ -0,0 +1,39 @@
#include "include/test.h"
#include "../src/include/memory.h"
#include "../src/include/tokenize.h"
#include "../src/include/parser.h"
#include "../src/include/interpreter.h"
EvalResult execute(string s) {
Memory memory = Memory();
vector<Token> tokens = tokenize({ s });
Node ast = parse(tokens);
EvalResult res = eval(ast, memory);
return res;
}
int main() {
_TEST_PRESENTATION("Statements");
_TEST_ASSERT(
_TEST_NO_EXCEPTION(get<int>(execute("int x = 0; if (1) x++; x;")) == 1),
"If vérifié",
true
);
_TEST_ASSERT(
_TEST_NO_EXCEPTION(get<int>(execute("int x = 0; if (0) x++; x;")) == 0),
"If pas vérifié",
true
);
_TEST_ASSERT(
_TEST_NO_EXCEPTION(get<int>(execute("int x = 1; if (0) x++; else x--; x;")) == 0),
"If else pas vérifié",
true
);
return 0;
}

View File

@ -5,53 +5,53 @@
#include "../src/include/parser.h" #include "../src/include/parser.h"
#include "../src/include/interpreter.h" #include "../src/include/interpreter.h"
int execute(string s) { EvalResult execute(string s) {
Memory memory = Memory(); Memory memory = Memory();
vector<Token> tokens = tokenize({ s }); vector<Token> tokens = tokenize({ s });
Node ast = parse(tokens); Node ast = parse(tokens);
EvalResult res = eval(ast, memory); EvalResult res = eval(ast, memory);
return get<int>(res); return res;
} }
int main() { int main() {
_TEST_PRESENTATION("Variables"); _TEST_PRESENTATION("Variables");
_TEST_ASSERT( _TEST_ASSERT(
_TEST_NO_EXCEPTION(execute("int uneVariableFarfelue__ = 12;") == 12), _TEST_NO_EXCEPTION(get<int>(execute("int uneVariableFarfelue__ = 12;")) == 12),
"Déclaration avec assignement", "Déclaration avec assignement",
true true
); );
_TEST_ASSERT( _TEST_ASSERT(
_TEST_NO_EXCEPTION(execute("int x = 5; x = x + 3;") == 8), _TEST_NO_EXCEPTION(get<int>(execute("int x = 5; x = x + 3;")) == 8),
"Déclaration puis assignement", "Déclaration puis assignement",
true true
); );
_TEST_ASSERT(
_TEST_NO_EXCEPTION(execute("int a = 27; ++a;") == 28),
"Incrémentation par la gauche",
true
);
_TEST_ASSERT(
_TEST_NO_EXCEPTION(execute("int a = 27; a--;") == 27),
"Décrémentation par la droite",
true
);
_TEST_ASSERT(
_TEST_NO_EXCEPTION(execute("int a = 27; -(+-++a);") == 28),
"Incrémentation et opérations unaires",
true
);
_TEST_ASSERT( _TEST_ASSERT(
_TEST_IS_EXCEPTION(execute("1 + x;"), RuntimeError), _TEST_IS_EXCEPTION(execute("1 + x;"), RuntimeError),
"Identifieur indéfini", "Identifieur indéfini",
true true
); );
_TEST_ASSERT(
_TEST_IS_EXCEPTION(execute("int x; int x;"), RuntimeError),
"Identifieur déjà défini",
true
);
_TEST_ASSERT(
_TEST_NO_EXCEPTION(holds_alternative<monostate>(execute("int x; { int x; }"))),
"Identifieur déjà défini dans une autre scope",
true
);
_TEST_ASSERT(
_TEST_NO_EXCEPTION(get<int>(execute("int x = 1; int y; { int x = 2; y = x + 2; }; y;")) == 4),
"Shadowing",
true
);
return 0; return 0;
} }