c-repl/test/lexer.cpp

128 lines
4.2 KiB
C++
Raw Normal View History

2023-11-15 11:59:38 +01:00
#include <string>
#include <vector>
using namespace std;
2024-01-12 14:10:23 +01:00
#include "include/test.hpp"
2023-11-15 11:59:38 +01:00
2024-01-12 15:52:52 +01:00
#include "../src/include/lexer.hpp"
2023-11-15 11:59:38 +01:00
int main() {
_TEST_PRESENTATION("Lexer");
2023-11-24 10:21:58 +01:00
/* All tokens */
vector<string> inputs = {
2023-12-26 12:46:05 +01:00
"int", "a", "=", "x", "++", "--", "==", "&&", "||", "<", ">", "<=", ">=", "!=", "!", "*", "/", "%", "=", ";", "(", ")", "{", "}", "if", "else", "while", "for", "break", "continue", "return", ","
2023-11-24 10:21:58 +01:00
};
2024-01-10 15:42:30 +01:00
vector<TokenType> expected_types = {
2023-12-08 09:04:05 +01:00
TokenType::Identifier, TokenType::Identifier, TokenType::Equal, TokenType::Identifier,
2023-11-24 10:21:58 +01:00
TokenType::DoublePlus, TokenType::DoubleMinus, TokenType::DoubleEqual, TokenType::Land,
TokenType::Lor, TokenType::Lt, TokenType::Gt, TokenType::Leq, TokenType::Geq, TokenType::NotEqual,
TokenType::Not, TokenType::Star, TokenType::Slash, TokenType::Percent, TokenType::Equal,
TokenType::Semicolon, TokenType::LParenthese, TokenType::RParenthese, TokenType::LCurlyBracket,
2023-12-08 15:29:30 +01:00
TokenType::RCurlyBracket, TokenType::If, TokenType::Else, TokenType::While, TokenType::For,
2023-12-26 12:46:05 +01:00
TokenType::Break, TokenType::Continue, TokenType::Return, TokenType::Comma
2023-11-24 10:21:58 +01:00
};
for (size_t i = 0; i < inputs.size(); i++) {
vector<Token> tokens = tokenize({ inputs[i] });
2024-01-10 15:42:30 +01:00
_TEST_ASSERT(tokens.size() == 1, _debug_get_token_type_name(expected_types[i]).c_str(), false);
_TEST_ASSERT(tokens[0].type == expected_types[i], _debug_get_token_type_name(expected_types[i]).c_str(), true);
2023-11-24 10:21:58 +01:00
}
2023-11-15 11:59:38 +01:00
/* Complex input */
{
string input = "int a = x+++7;";
2023-11-15 14:31:11 +01:00
vector<Token> tokens = tokenize({ input });
2023-11-15 11:59:38 +01:00
_TEST_ASSERT(
_TEST_NO_EXCEPTION(tokens.size() == 8),
"Il devrait y avoir 8 tokens",
false
)
_TEST_ASSERT(
2023-12-08 09:04:05 +01:00
_TEST_NO_EXCEPTION(tokens[0].type == TokenType::Identifier),
"Le premier token devrait être de type 'Identifier'",
2023-11-15 11:59:38 +01:00
false
)
_TEST_ASSERT(
2023-12-08 09:04:05 +01:00
_TEST_NO_EXCEPTION(get<string>(tokens[0].data) == "int"),
2023-11-15 11:59:38 +01:00
"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<string>(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<string>(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(
2023-12-08 09:04:05 +01:00
_TEST_NO_EXCEPTION(tokens[6].type == TokenType::Litteral),
"Le premier token devrait être de type 'Litteral'",
2023-11-15 11:59:38 +01:00
false
)
_TEST_ASSERT(
_TEST_NO_EXCEPTION(get<int>(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, "Triple plus", true)
2023-11-15 11:59:38 +01:00
}
/* Incorrect input */
{
string input = "int a = 10 @;";
_TEST_ASSERT(
2023-12-15 15:10:05 +01:00
_TEST_IS_EXCEPTION(tokenize({ input }), ErrorType::UnknownToken),
2023-11-15 11:59:38 +01:00
"Token invalide",
true
)
}
return 0;
}