From dfc0fd87d73d3dde85ba839d0171a0fd5fe11fec Mon Sep 17 00:00:00 2001 From: ala89 Date: Wed, 15 Nov 2023 11:59:38 +0100 Subject: [PATCH] Add more tests --- src/include/tokenize.h | 7 +++ src/tokenize.cpp | 4 +- test/expr_arithmetiques.cpp | 9 ++- test/include/test.h | 16 +++++- test/tokenize.cpp | 107 ++++++++++++++++++++++++++++++++++++ test/variables.cpp | 15 +++-- 6 files changed, 145 insertions(+), 13 deletions(-) create mode 100644 test/tokenize.cpp diff --git a/src/include/tokenize.h b/src/include/tokenize.h index 15a1fe8..167b490 100644 --- a/src/include/tokenize.h +++ b/src/include/tokenize.h @@ -4,6 +4,7 @@ #include #include #include +#include using namespace std; enum class TokenType { Type, Identifier, Int, Plus, Minus, DoublePlus, DoubleMinus, Star, Slash, Percent, Equal, Semicolon, LParenthese, RParenthese }; @@ -16,6 +17,12 @@ struct Token { TokenData data { }; }; +class TokenError : public std::runtime_error { +public: + explicit TokenError(const std::string& message) + : std::runtime_error(message) {} +}; + /* Parses a string into a vector of tokens */ diff --git a/src/tokenize.cpp b/src/tokenize.cpp index 3253986..140d684 100644 --- a/src/tokenize.cpp +++ b/src/tokenize.cpp @@ -1,7 +1,6 @@ #include #include #include -#include #include "include/tokenize.h" using namespace std; @@ -152,8 +151,7 @@ vector tokenize(string str) { str.erase(0, 1); } else { - cerr << "Unknown token: \"" << str << "\"" << endl; - break; + throw TokenError("Unknown token {}"); } } diff --git a/test/expr_arithmetiques.cpp b/test/expr_arithmetiques.cpp index 3a561c2..e95f09c 100644 --- a/test/expr_arithmetiques.cpp +++ b/test/expr_arithmetiques.cpp @@ -17,17 +17,20 @@ int main() { _TEST_ASSERT( _TEST_NO_EXCEPTION(execute("10 + 3 * (7 - 2);") == 25), - "Priorités" + "Priorités", + true ); _TEST_ASSERT( _TEST_NO_EXCEPTION(execute("12 - 4 - 20;") == -12), - "Ordre de soustraction" + "Ordre de soustraction", + true ); _TEST_ASSERT( _TEST_NO_EXCEPTION(execute("-7 + 13 + -6;") == 0), - "Opérateurs unaires" + "Opérateurs unaires", + true ); return 0; diff --git a/test/include/test.h b/test/include/test.h index a9756cb..b313cb2 100644 --- a/test/include/test.h +++ b/test/include/test.h @@ -9,9 +9,9 @@ #define _TEST_PRESENTATION(description) { printf("\n" BLUE "#### %s:" BOLD "%s" RESET BLUE " #####" RESET "\n", __FILE__, description); } -#define _TEST_ASSERT(condition, description) { \ +#define _TEST_ASSERT(condition, description, show_ok) { \ if (condition) { \ - printf("[" GREEN "OK" RESET "] %s:%d: %s\n", __FILE__, __LINE__, description); \ + if (show_ok) printf("[" GREEN "OK" RESET "] %s:%d: %s\n", __FILE__, __LINE__, description); \ } else { \ printf("[" RED "ERREUR" RESET "] %s:%d: %s\n", __FILE__, __LINE__, description); \ exit(1); \ @@ -29,5 +29,17 @@ } \ }() +#define _TEST_IS_EXCEPTION(expr, excep) \ + [&]() -> bool { \ + try { \ + (expr); \ + return false; \ + } catch (const excep& e) { \ + return true; \ + } \ + catch (...) { \ + return false; \ + } \ + }() #endif \ No newline at end of file diff --git a/test/tokenize.cpp b/test/tokenize.cpp new file mode 100644 index 0000000..b05a5db --- /dev/null +++ b/test/tokenize.cpp @@ -0,0 +1,107 @@ +#include +#include +using namespace std; + +#include "include/test.h" + +#include "../src/include/tokenize.h" + +int main() { + _TEST_PRESENTATION("Lexer"); + + /* Complex input */ + { + string input = "int a = x+++7;"; + + vector tokens = tokenize(input); + + _TEST_ASSERT( + _TEST_NO_EXCEPTION(tokens.size() == 8), + "Il devrait y avoir 8 tokens", + false + ) + + _TEST_ASSERT( + _TEST_NO_EXCEPTION(tokens[0].type == TokenType::Type), + "Le premier token devrait être de type 'Type'", + false + ) + _TEST_ASSERT( + _TEST_NO_EXCEPTION(get(tokens[0].data) == Type::Int), + "Les données du premier token devraient être 'Int'", + false + ) + + _TEST_ASSERT( + _TEST_NO_EXCEPTION(tokens[1].type == TokenType::Identifier), + "Le deuxième token devrait être un 'Identifiant'", + false + ) + _TEST_ASSERT( + _TEST_NO_EXCEPTION(get(tokens[1].data) == "a"), + "Les données du deuxième token devraient être 'a'", + false + ) + + _TEST_ASSERT( + _TEST_NO_EXCEPTION(tokens[2].type == TokenType::Equal), + "Le troisième token devrait être 'Equal'", + false + ) + + _TEST_ASSERT( + _TEST_NO_EXCEPTION(tokens[3].type == TokenType::Identifier), + "Le quatrième token devrait être un 'Identifiant'", + false + ) + _TEST_ASSERT( + _TEST_NO_EXCEPTION(get(tokens[3].data) == "x"), + "Les données du quatrième token devraient être 'x'", + false + ) + + _TEST_ASSERT( + _TEST_NO_EXCEPTION(tokens[4].type == TokenType::DoublePlus), + "Le cinquième token devrait être 'DoublePlus'", + false + ) + + _TEST_ASSERT( + _TEST_NO_EXCEPTION(tokens[5].type == TokenType::Plus), + "Le cinquième token devrait être 'Plus'", + false + ) + + _TEST_ASSERT( + _TEST_NO_EXCEPTION(tokens[6].type == TokenType::Int), + "Le premier token devrait être de type 'Int'", + false + ) + _TEST_ASSERT( + _TEST_NO_EXCEPTION(get(tokens[6].data) == 7), + "Les données du premier token devraient être '7'", + false + ) + + _TEST_ASSERT( + _TEST_NO_EXCEPTION(tokens[7].type == TokenType::Semicolon), + "Le cinquième token devrait être 'Semicolon'", + false + ) + + _TEST_ASSERT(true, "+++", true) + } + + /* Incorrect input */ + { + string input = "int a = 10 @;"; + + _TEST_ASSERT( + _TEST_IS_EXCEPTION(tokenize(input), TokenError), + "Token invalide", + true + ) + } + + return 0; +} \ No newline at end of file diff --git a/test/variables.cpp b/test/variables.cpp index 6ca7ceb..dead4ff 100644 --- a/test/variables.cpp +++ b/test/variables.cpp @@ -17,27 +17,32 @@ int main() { _TEST_ASSERT( _TEST_NO_EXCEPTION(execute("int uneVariableFarfelue__ = 12;") == 12), - "Déclaration avec assignement" + "Déclaration avec assignement", + true ); _TEST_ASSERT( _TEST_NO_EXCEPTION(execute("int x = 5; x = x + 3;") == 8), - "Déclaration puis assignement" + "Déclaration puis assignement", + true ); _TEST_ASSERT( _TEST_NO_EXCEPTION(execute("int a = 27; ++a;") == 28), - "Incrémentation par la gauche" + "Incrémentation par la gauche", + true ); _TEST_ASSERT( _TEST_NO_EXCEPTION(execute("int a = 27; a--;") == 27), - "Décrémentation par la droite" + "Décrémentation par la droite", + true ); _TEST_ASSERT( _TEST_NO_EXCEPTION(execute("int a = 27; -(+-++a);") == 28), - "Incrémentation et opérations unaires" + "Incrémentation et opérations unaires", + true ); return 0;