#include "rlexer.h"
#include "rio.h"
#include "rtest.h"
void test_lexer() {
rtest_banner("Lexer");
rlex("123"
"-123 "
"123.22.123.33"
"-123.33"
"abc "
"_abc "
"abc_ "
"a_a"
"\"string content 123\""
"\"!@#$%^& *()-+\""
"\"ab\\tc\\n\\\"\\r\""
"--++-+/*<>!@#$%^&*(){}?[]"
"\n"
"()");
rtest_banner("Number");
rtoken_t token = rlex_next();
rtest_assert(token.type == RT_NUMBER);
rtest_assert(!strcmp(token.value, "123"));
rtest_banner("Negative number");
token = rlex_next();
rtest_assert(token.type == RT_NUMBER);
rtest_assert(!strcmp(token.value, "-123"));
rtest_banner("Decimal Number");
token = rlex_next();
rtest_assert(token.type == RT_NUMBER);
rtest_assert(!strcmp(token.value, "123.22"));
token = rlex_next();
rtest_assert(token.type == RT_PUNCT);
rtest_assert(!strcmp(token.value, "."));
token = rlex_next();
rtest_assert(token.type == RT_NUMBER);
rtest_assert(!strcmp(token.value, "123.33"));
rtest_banner("Decimal Negative number");
token = rlex_next();
rtest_assert(token.type == RT_NUMBER);
rtest_assert(!strcmp(token.value, "-123.33"));
rtest_banner("Symbol");
token = rlex_next();
rtest_assert(token.type == RT_SYMBOL);
rtest_assert(!strcmp(token.value, "abc"));
token = rlex_next();
rtest_assert(token.type == RT_SYMBOL);
rtest_assert(!strcmp(token.value, "_abc"));
token = rlex_next();
rtest_assert(token.type == RT_SYMBOL);
rtest_assert(!strcmp(token.value, "abc_"));
token = rlex_next();
rtest_assert(token.type == RT_SYMBOL);
rtest_assert(!strcmp(token.value, "a_a"));
rtest_banner("String");
token = rlex_next();
rtest_assert(token.type == RT_STRING);
rtest_assert(!strcmp(token.value, "string content 123"));
token = rlex_next();
rtest_assert(token.type == RT_STRING);
rtest_assert(!strcmp(token.value, "!@#$\%^& *()-+"));
token = rlex_next();
rtest_assert(token.type == RT_STRING);
rtest_assert(!strcmp(token.value, "ab\tc\n\"\r"));
rtest_banner("Operator");
token = rlex_next();
rtest_assert(token.type == RT_OPERATOR);
rtest_assert(!strcmp(token.value, "--++-+/*<>"));
rtest_banner("Punct") token = rlex_next();
rtest_assert(token.type == RT_PUNCT);
rtest_assert(!strcmp(token.value, "!@#$%^"));
token = rlex_next();
rtest_assert(token.type == RT_OPERATOR);
rtest_assert(!strcmp(token.value, "&*"));
rtest_banner("Grouping");
token = rlex_next();
rtest_assert(token.type == RT_BRACE_OPEN);
rassert(!strcmp(token.value, "("));
token = rlex_next();
rtest_assert(token.type == RT_BRACE_CLOSE);
rassert(!strcmp(token.value, ")"));
token = rlex_next();
rtest_assert(token.type == RT_CURLY_BRACE_OPEN);
rassert(!strcmp(token.value, "{"));
token = rlex_next();
rtest_assert(token.type == RT_CURLY_BRACE_CLOSE);
rassert(!strcmp(token.value, "}"));
token = rlex_next();
rtest_assert(token.type == RT_PUNCT);
rassert(!strcmp(token.value, "?"));
token = rlex_next();
rtest_assert(token.type == RT_BRACKET_OPEN);
rassert(!strcmp(token.value, "["));
token = rlex_next();
rtest_assert(token.type == RT_BRACKET_CLOSE);
rassert(!strcmp(token.value, "]"));
rtest_banner("Line number");
token = rlex_next();
rtest_assert(token.type == RT_BRACE_OPEN);
rassert(!strcmp(token.value, "("));
rassert(token.line == 2);
token = rlex_next();
rtest_assert(token.type == RT_BRACE_CLOSE);
rassert(!strcmp(token.value, ")"));
rassert(token.line == 2);
rtest_banner("EOF");
token = rlex_next();
rtest_assert(token.type == RT_EOF);
rtest_assert(!strcmp(token.value, "eof"));
rtest_assert(token.line == 2);
}
void test_formatter() {
rtest_banner("Formatter");
char *formatted = rlex_format("{123{345{678}}}");
char *expected_curly_braces = "{\n"
" 123\n"
" {\n"
" 345\n"
" {\n"
" 678\n"
" }\n \n"
" }\n \n"
"}\n";
rtest_assert(!strcmp(formatted, expected_curly_braces));
free(formatted);
formatted = rlex_format("\"123\",66,true,(1,2,3)");
char *expected_comma = "\"123\", 66, true, (1, 2, 3)";
rtest_assert(!strcmp(formatted, expected_comma));
free(formatted);
formatted = rlex_format("lala lolo");
char *expected_new_lines1 = "lala\nlolo";
rtest_assert(!strcmp(formatted, expected_new_lines1));
free(formatted);
formatted = rlex_format("lala=lolo");
char *expected_new_lines2 = "lala = lolo";
rtest_assert(!strcmp(formatted, expected_new_lines2));
free(formatted);
formatted = rlex_format("lala+lolo=(1,2,3)");
char *expected_new_lines3 = "lala + lolo = (1, 2, 3)";
rtest_assert(!strcmp(formatted, expected_new_lines3));
free(formatted);
formatted = rlex_format("lala+lolo=(1,2,3) little.test=(4,5,6)");
char *expected_new_lines4 = "lala + lolo = (1, 2, 3)\nlittle.test = (4, 5, 6)";
rtest_assert(!strcmp(formatted, expected_new_lines4));
free(formatted);
}
int main(int argc, char *argv[]) {
if (argc == 1) {
test_formatter();
test_lexer();
return rtest_end("");
} else {
if (!rfile_exists(argv[1])) {
rassert(false && "File does not exist.");
}
unsigned int length = rfile_size(argv[1]);
char content[length + 1];
length = rfile_readb(argv[1], content, length);
content[length] = 0;
char *formatted = rlex_format(content);
printf("%s", formatted);
}
}