Worked on tests
This commit is contained in:
parent
6aad733263
commit
389890a7e7
|
|
@ -47,12 +47,15 @@ run: $(TARGET)
|
||||||
@echo "Running $(TARGET)..."
|
@echo "Running $(TARGET)..."
|
||||||
./$(TARGET)
|
./$(TARGET)
|
||||||
|
|
||||||
|
test_cases: ../SLS_Tests/yaml_to_c_tests.py ../SLS_Tests/cases.yaml
|
||||||
|
python3 ../SLS_Tests/yaml_to_c_tests.py ../SLS_Tests/cases.yaml ./tests/lexer_tests.c
|
||||||
|
|
||||||
# Build test runner executable
|
# Build test runner executable
|
||||||
$(TEST_TARGET): $(TEST_OBJECTS) $(NON_MAIN_OBJECTS) | $(BINDIR)
|
$(TEST_TARGET): $(TEST_OBJECTS) $(NON_MAIN_OBJECTS) | $(BINDIR)
|
||||||
$(CC) $(LDFLAGS) $^ -o $@ -lm
|
$(CC) $(LDFLAGS) $^ -o $@ -lm
|
||||||
|
|
||||||
# Run tests
|
# Run tests
|
||||||
test: $(TEST_TARGET)
|
test: test_cases $(TEST_TARGET)
|
||||||
@echo "Running tests..."
|
@echo "Running tests..."
|
||||||
./$(TEST_TARGET)
|
./$(TEST_TARGET)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -33,38 +33,44 @@ void clean_up_test(LexerResult result) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TestResult error_test(LexerTest *test, LexerResult result, SlsError error) {
|
TestResult error_test(LexerTest *test, LexerResult result, SlsError error) {
|
||||||
clean_up_test(result);
|
|
||||||
test->result.status = TEST_ERROR;
|
test->result.status = TEST_ERROR;
|
||||||
test->result.error = error;
|
test->result.error = error;
|
||||||
|
clean_up_test(result);
|
||||||
return test->result;
|
return test->result;
|
||||||
}
|
}
|
||||||
|
|
||||||
TestResult logic_fail_test(LexerTest *test, LexerResult result, char *message) {
|
TestResult logic_fail_test(LexerTest *test, LexerResult result, char *message) {
|
||||||
if (message == 0) return error_test(test, result, (SlsError) {
|
if (message == 0) return error_test(test, result, (SlsError) {
|
||||||
.message = "Out of Memory Error!", .code = 1, });
|
.message = "Out of Memory Error!", .code = 1, });
|
||||||
clean_up_test(result);
|
|
||||||
test->result.status = TEST_LOGIC_FAIL;
|
test->result.status = TEST_LOGIC_FAIL;
|
||||||
test->result.message = message;
|
test->result.message = message;
|
||||||
|
clean_up_test(result);
|
||||||
return test->result;
|
return test->result;
|
||||||
}
|
}
|
||||||
|
|
||||||
TestResult logic_error_fail_test(LexerTest *test, LexerResult result, SlsError error) {
|
TestResult logic_error_fail_test(LexerTest *test, LexerResult result, SlsError error) {
|
||||||
clean_up_test(result);
|
|
||||||
test->result.status = TEST_LOGIC_ERROR_FAIL;
|
test->result.status = TEST_LOGIC_ERROR_FAIL;
|
||||||
test->result.error = error;
|
test->result.error = error;
|
||||||
|
|
||||||
|
size_t message_length = strlen(error.message) + 1;
|
||||||
|
const char *message = (char *)malloc(sizeof(char) * message_length);
|
||||||
|
strncpy(message, error.message, message_length);
|
||||||
|
test->result.error.message = message;
|
||||||
|
|
||||||
|
clean_up_test(result);
|
||||||
return test->result;
|
return test->result;
|
||||||
}
|
}
|
||||||
|
|
||||||
TestResult error_fail_test(LexerTest *test, LexerResult result, SlsError error) {
|
TestResult error_fail_test(LexerTest *test, LexerResult result, SlsError error) {
|
||||||
clean_up_test(result);
|
|
||||||
test->result.status = TEST_ERROR_FAIL;
|
test->result.status = TEST_ERROR_FAIL;
|
||||||
test->result.error = error;
|
test->result.error = error;
|
||||||
|
clean_up_test(result);
|
||||||
return test->result;
|
return test->result;
|
||||||
}
|
}
|
||||||
|
|
||||||
TestResult skip_test(LexerTest *test, LexerResult result) {
|
TestResult skip_test(LexerTest *test, LexerResult result) {
|
||||||
clean_up_test(result);
|
|
||||||
test->result.status = TEST_NOT_IMPLEMENTED;
|
test->result.status = TEST_NOT_IMPLEMENTED;
|
||||||
|
clean_up_test(result);
|
||||||
return test->result;
|
return test->result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -74,8 +80,8 @@ TestResult skip_test_no_result(LexerTest *test) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TestResult pass_test(LexerTest *test, LexerResult result) {
|
TestResult pass_test(LexerTest *test, LexerResult result) {
|
||||||
clean_up_test(result);
|
|
||||||
test->result.status = TEST_PASS;
|
test->result.status = TEST_PASS;
|
||||||
|
clean_up_test(result);
|
||||||
return test->result;
|
return test->result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
#include "tests/tests.h"
|
#include "tests/tests.h"
|
||||||
|
|
||||||
|
|
||||||
static const size_t NUM_OF_TESTS = 22;
|
static const size_t NUM_OF_TESTS = 20;
|
||||||
|
|
||||||
static TestResult test_Empty_Statement() {
|
static TestResult test_Empty_Statement() {
|
||||||
LexerTest test = start_up_test("test_Empty_Statement", "");
|
LexerTest test = start_up_test("test_Empty_Statement", "");
|
||||||
|
|
@ -37,8 +37,8 @@ static TestResult test_Integer_Default_Decimal_0() {
|
||||||
return pass_test(&test, result);
|
return pass_test(&test, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
static TestResult test_Integer_Default_Decimal_1_neg() {
|
static TestResult test_Integer_Default_Decimal_1() {
|
||||||
LexerTest test = start_up_test("test_Integer_Default_Decimal_1_neg", "-1");
|
LexerTest test = start_up_test("test_Integer_Default_Decimal_1", "-1");
|
||||||
LexerResult result = lexical_analysis(&test.lexer_info);
|
LexerResult result = lexical_analysis(&test.lexer_info);
|
||||||
if (result.type == SLS_ERROR) return error_fail_test(&test, result, result.error);
|
if (result.type == SLS_ERROR) return error_fail_test(&test, result, result.error);
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
|
@ -47,16 +47,6 @@ static TestResult test_Integer_Default_Decimal_1_neg() {
|
||||||
return pass_test(&test, result);
|
return pass_test(&test, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
static TestResult test_Integer_Default_Decimal_1_pos() {
|
|
||||||
LexerTest test = start_up_test("test_Integer_Default_Decimal_1_pos", "+1");
|
|
||||||
LexerResult result = lexical_analysis(&test.lexer_info);
|
|
||||||
if (result.type == SLS_ERROR) return error_fail_test(&test, result, result.error);
|
|
||||||
size_t i = 0;
|
|
||||||
if (test_integer_value(&test, result, i++, &(TestIntegerValue){INTEGER_I64, 1})) return test.result;
|
|
||||||
if (test_eof_value(&test, result, i++, 0)) return test.result;
|
|
||||||
return pass_test(&test, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
static TestResult test_Integer_Default_Decimal_Leading_Zeros() {
|
static TestResult test_Integer_Default_Decimal_Leading_Zeros() {
|
||||||
LexerTest test = start_up_test("test_Integer_Default_Decimal_Leading_Zeros", "00042");
|
LexerTest test = start_up_test("test_Integer_Default_Decimal_Leading_Zeros", "00042");
|
||||||
LexerResult result = lexical_analysis(&test.lexer_info);
|
LexerResult result = lexical_analysis(&test.lexer_info);
|
||||||
|
|
@ -108,7 +98,7 @@ static TestResult test_Integer_Default_Octal_0o755() {
|
||||||
}
|
}
|
||||||
|
|
||||||
static TestResult test_Integer_i8_Decimal_127() {
|
static TestResult test_Integer_i8_Decimal_127() {
|
||||||
LexerTest test = start_up_test("test_Integer_i8_Decimal_127", "127i8");
|
LexerTest test = start_up_test("test_Integer_i8_Decimal_127", "127:i8");
|
||||||
LexerResult result = lexical_analysis(&test.lexer_info);
|
LexerResult result = lexical_analysis(&test.lexer_info);
|
||||||
if (result.type == SLS_ERROR) return error_fail_test(&test, result, result.error);
|
if (result.type == SLS_ERROR) return error_fail_test(&test, result, result.error);
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
|
@ -118,7 +108,7 @@ static TestResult test_Integer_i8_Decimal_127() {
|
||||||
}
|
}
|
||||||
|
|
||||||
static TestResult test_Integer_i8_Decimal_128() {
|
static TestResult test_Integer_i8_Decimal_128() {
|
||||||
LexerTest test = start_up_test("test_Integer_i8_Decimal_128", "-128i8");
|
LexerTest test = start_up_test("test_Integer_i8_Decimal_128", "-128:i8");
|
||||||
LexerResult result = lexical_analysis(&test.lexer_info);
|
LexerResult result = lexical_analysis(&test.lexer_info);
|
||||||
if (result.type == SLS_ERROR) return error_fail_test(&test, result, result.error);
|
if (result.type == SLS_ERROR) return error_fail_test(&test, result, result.error);
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
|
@ -128,7 +118,7 @@ static TestResult test_Integer_i8_Decimal_128() {
|
||||||
}
|
}
|
||||||
|
|
||||||
static TestResult test_Integer_u8_Decimal_255() {
|
static TestResult test_Integer_u8_Decimal_255() {
|
||||||
LexerTest test = start_up_test("test_Integer_u8_Decimal_255", "255u8");
|
LexerTest test = start_up_test("test_Integer_u8_Decimal_255", "255:u8");
|
||||||
LexerResult result = lexical_analysis(&test.lexer_info);
|
LexerResult result = lexical_analysis(&test.lexer_info);
|
||||||
if (result.type == SLS_ERROR) return error_fail_test(&test, result, result.error);
|
if (result.type == SLS_ERROR) return error_fail_test(&test, result, result.error);
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
|
@ -152,12 +142,12 @@ static TestResult test_Integer_Default_Decimal_with_Commas_Invalid() {
|
||||||
LexerResult result = lexical_analysis(&test.lexer_info);
|
LexerResult result = lexical_analysis(&test.lexer_info);
|
||||||
if (result.type == SLS_ERROR) return error_fail_test(&test, result, result.error);
|
if (result.type == SLS_ERROR) return error_fail_test(&test, result, result.error);
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
if (test_for_error(&test, result, i++, &(TestErrorMessage){52, "Invalid numeric literal: unexpected ',' in integer."})) return test.result;
|
if (test_for_error(&test, result, i++, &(TestErrorMessage){60, "Invalid decimal literal: unexpected ',' in decimal integer."})) return test.result;
|
||||||
return pass_test(&test, result);
|
return pass_test(&test, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
static TestResult test_Integer_i8_Overflow() {
|
static TestResult test_Integer_i8_Overflow() {
|
||||||
LexerTest test = start_up_test("test_Integer_i8_Overflow", "128i8");
|
LexerTest test = start_up_test("test_Integer_i8_Overflow", "128:i8");
|
||||||
LexerResult result = lexical_analysis(&test.lexer_info);
|
LexerResult result = lexical_analysis(&test.lexer_info);
|
||||||
if (result.type == SLS_ERROR) return error_fail_test(&test, result, result.error);
|
if (result.type == SLS_ERROR) return error_fail_test(&test, result, result.error);
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
|
@ -166,7 +156,7 @@ static TestResult test_Integer_i8_Overflow() {
|
||||||
}
|
}
|
||||||
|
|
||||||
static TestResult test_Integer_i8_Underflow() {
|
static TestResult test_Integer_i8_Underflow() {
|
||||||
LexerTest test = start_up_test("test_Integer_i8_Underflow", "-129i8");
|
LexerTest test = start_up_test("test_Integer_i8_Underflow", "-129:i8");
|
||||||
LexerResult result = lexical_analysis(&test.lexer_info);
|
LexerResult result = lexical_analysis(&test.lexer_info);
|
||||||
if (result.type == SLS_ERROR) return error_fail_test(&test, result, result.error);
|
if (result.type == SLS_ERROR) return error_fail_test(&test, result, result.error);
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
|
@ -179,7 +169,7 @@ static TestResult test_Integer_Default_Invalid_Characters() {
|
||||||
LexerResult result = lexical_analysis(&test.lexer_info);
|
LexerResult result = lexical_analysis(&test.lexer_info);
|
||||||
if (result.type == SLS_ERROR) return error_fail_test(&test, result, result.error);
|
if (result.type == SLS_ERROR) return error_fail_test(&test, result, result.error);
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
if (test_for_error(&test, result, i++, &(TestErrorMessage){51, "Invalid numeric literal: unexpected character 'a'."})) return test.result;
|
if (test_for_error(&test, result, i++, &(TestErrorMessage){60, "Invalid decimal literal: unexpected 'a' in decimal integer."})) return test.result;
|
||||||
return pass_test(&test, result);
|
return pass_test(&test, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -198,34 +188,27 @@ static TestResult test_Integer_Default_Invalid_Prefix() {
|
||||||
LexerResult result = lexical_analysis(&test.lexer_info);
|
LexerResult result = lexical_analysis(&test.lexer_info);
|
||||||
if (result.type == SLS_ERROR) return error_fail_test(&test, result, result.error);
|
if (result.type == SLS_ERROR) return error_fail_test(&test, result, result.error);
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
if (test_for_error(&test, result, i++, &(TestErrorMessage){47, "Invalid binary literal: digit '2' not allowed."})) return test.result;
|
if (test_for_error(&test, result, i++, &(TestErrorMessage){58, "Invalid binary literal: unexpected '2' in binary integer."})) return test.result;
|
||||||
return pass_test(&test, result);
|
return pass_test(&test, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
static TestResult test_Integer_Default_Invalid_Underscore_Start() {
|
static TestResult test_Integer_Default_Underscore_End() {
|
||||||
LexerTest test = start_up_test("test_Integer_Default_Invalid_Underscore_Start", "_42");
|
LexerTest test = start_up_test("test_Integer_Default_Underscore_End", "42_");
|
||||||
LexerResult result = lexical_analysis(&test.lexer_info);
|
LexerResult result = lexical_analysis(&test.lexer_info);
|
||||||
if (result.type == SLS_ERROR) return error_fail_test(&test, result, result.error);
|
if (result.type == SLS_ERROR) return error_fail_test(&test, result, result.error);
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
if (test_for_error(&test, result, i++, &(TestErrorMessage){55, "Invalid numeric literal: cannot start with underscore."})) return test.result;
|
if (test_integer_value(&test, result, i++, &(TestIntegerValue){INTEGER_I64, 42})) return test.result;
|
||||||
|
if (test_eof_value(&test, result, i++, 0)) return test.result;
|
||||||
return pass_test(&test, result);
|
return pass_test(&test, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
static TestResult test_Integer_Default_Invalid_Underscore_End() {
|
static TestResult test_Integer_Default_Underscore_Double() {
|
||||||
LexerTest test = start_up_test("test_Integer_Default_Invalid_Underscore_End", "42_");
|
LexerTest test = start_up_test("test_Integer_Default_Underscore_Double", "4__2");
|
||||||
LexerResult result = lexical_analysis(&test.lexer_info);
|
LexerResult result = lexical_analysis(&test.lexer_info);
|
||||||
if (result.type == SLS_ERROR) return error_fail_test(&test, result, result.error);
|
if (result.type == SLS_ERROR) return error_fail_test(&test, result, result.error);
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
if (test_for_error(&test, result, i++, &(TestErrorMessage){53, "Invalid numeric literal: cannot end with underscore."})) return test.result;
|
if (test_integer_value(&test, result, i++, &(TestIntegerValue){INTEGER_I64, 42})) return test.result;
|
||||||
return pass_test(&test, result);
|
if (test_eof_value(&test, result, i++, 0)) return test.result;
|
||||||
}
|
|
||||||
|
|
||||||
static TestResult test_Integer_Default_Invalid_Underscore_Double() {
|
|
||||||
LexerTest test = start_up_test("test_Integer_Default_Invalid_Underscore_Double", "4__2");
|
|
||||||
LexerResult result = lexical_analysis(&test.lexer_info);
|
|
||||||
if (result.type == SLS_ERROR) return error_fail_test(&test, result, result.error);
|
|
||||||
size_t i = 0;
|
|
||||||
if (test_for_error(&test, result, i++, &(TestErrorMessage){62, "Invalid numeric literal: consecutive underscores not allowed."})) return test.result;
|
|
||||||
return pass_test(&test, result);
|
return pass_test(&test, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -240,8 +223,7 @@ TestsReport run_lexer_tests() {
|
||||||
|
|
||||||
test_report.tests[i++] = test_Empty_Statement();
|
test_report.tests[i++] = test_Empty_Statement();
|
||||||
test_report.tests[i++] = test_Integer_Default_Decimal_0();
|
test_report.tests[i++] = test_Integer_Default_Decimal_0();
|
||||||
test_report.tests[i++] = test_Integer_Default_Decimal_1_neg();
|
test_report.tests[i++] = test_Integer_Default_Decimal_1();
|
||||||
test_report.tests[i++] = test_Integer_Default_Decimal_1_pos();
|
|
||||||
test_report.tests[i++] = test_Integer_Default_Decimal_Leading_Zeros();
|
test_report.tests[i++] = test_Integer_Default_Decimal_Leading_Zeros();
|
||||||
test_report.tests[i++] = test_Integer_Default_Hex_0xFF();
|
test_report.tests[i++] = test_Integer_Default_Hex_0xFF();
|
||||||
test_report.tests[i++] = test_Integer_Default_Hex_0xdeadbeef();
|
test_report.tests[i++] = test_Integer_Default_Hex_0xdeadbeef();
|
||||||
|
|
@ -257,9 +239,8 @@ TestsReport run_lexer_tests() {
|
||||||
test_report.tests[i++] = test_Integer_Default_Invalid_Characters();
|
test_report.tests[i++] = test_Integer_Default_Invalid_Characters();
|
||||||
test_report.tests[i++] = test_Integer_Default_Whitespace();
|
test_report.tests[i++] = test_Integer_Default_Whitespace();
|
||||||
test_report.tests[i++] = test_Integer_Default_Invalid_Prefix();
|
test_report.tests[i++] = test_Integer_Default_Invalid_Prefix();
|
||||||
test_report.tests[i++] = test_Integer_Default_Invalid_Underscore_Start();
|
test_report.tests[i++] = test_Integer_Default_Underscore_End();
|
||||||
test_report.tests[i++] = test_Integer_Default_Invalid_Underscore_End();
|
test_report.tests[i++] = test_Integer_Default_Underscore_Double();
|
||||||
test_report.tests[i++] = test_Integer_Default_Invalid_Underscore_Double();
|
|
||||||
|
|
||||||
return test_report;
|
return test_report;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,43 +11,94 @@
|
||||||
|
|
||||||
const char *TEST_FILE_NAME = "TEST_FILE.SLS";
|
const char *TEST_FILE_NAME = "TEST_FILE.SLS";
|
||||||
|
|
||||||
int main(void) {
|
typedef struct {
|
||||||
TestsReport lexer_reports = run_lexer_tests();
|
uint16_t errored;
|
||||||
|
uint16_t error_failed;
|
||||||
|
uint16_t logic_error_failed;
|
||||||
|
uint16_t logic_failed;
|
||||||
|
uint16_t passed;
|
||||||
|
uint16_t not_implemented;
|
||||||
|
uint16_t total;
|
||||||
|
} TestCounts;
|
||||||
|
|
||||||
for (size_t i = 0; i < lexer_reports.count; i++) {
|
static void lexer_test_report(TestsReport reports, TestCounts *counts) {
|
||||||
switch (lexer_reports.tests[i].status) {
|
counts->total += reports.count;
|
||||||
|
for (size_t i = 0; i < reports.count; i++) {
|
||||||
|
switch (reports.tests[i].status) {
|
||||||
case TEST_ERROR:
|
case TEST_ERROR:
|
||||||
// Bright Red
|
// Bright Red
|
||||||
printf("\x1b[91mTest errored: %s\n\t%s\n\x1b[0m", lexer_reports.tests[i].name, lexer_reports.tests[i].error.message);
|
printf("\x1b[91mTest errored: %s\n\t%s\n\x1b[0m", reports.tests[i].name, reports.tests[i].error.message);
|
||||||
|
counts->errored += 1;
|
||||||
break;
|
break;
|
||||||
case TEST_ERROR_FAIL:
|
case TEST_ERROR_FAIL:
|
||||||
// Magenta
|
// Magenta
|
||||||
printf("\x1b[35mLexing errored: %s\n\t%s\n\x1b[0m", lexer_reports.tests[i].name, lexer_reports.tests[i].error.message);
|
printf("\x1b[35mLexing errored: %s\n\t%s\n\x1b[0m", reports.tests[i].name, reports.tests[i].error.message);
|
||||||
|
counts->error_failed += 1;
|
||||||
break;
|
break;
|
||||||
case TEST_LOGIC_ERROR_FAIL:
|
case TEST_LOGIC_ERROR_FAIL:
|
||||||
// Red
|
// Red
|
||||||
printf("\x1b[31mTest failed with error: %s\n\t%s\n\x1b[0m", lexer_reports.tests[i].name, lexer_reports.tests[i].error.message);
|
printf("\x1b[31mTest failed with lexical error: %s\n\t%s\n\x1b[0m", reports.tests[i].name, reports.tests[i].error.message);
|
||||||
free(lexer_reports.tests[i].message);
|
counts->logic_error_failed += 1;
|
||||||
|
free(reports.tests[i].message);
|
||||||
break;
|
break;
|
||||||
case TEST_LOGIC_FAIL:
|
case TEST_LOGIC_FAIL:
|
||||||
// Red
|
// Red
|
||||||
printf("\x1b[31mTest failed: %s\n\t%s\n\x1b[0m", lexer_reports.tests[i].name, lexer_reports.tests[i].message);
|
printf("\x1b[31mTest failed: %s\n\t%s\n\x1b[0m", reports.tests[i].name, reports.tests[i].message);
|
||||||
free(lexer_reports.tests[i].message);
|
counts->logic_failed += 1;
|
||||||
|
free(reports.tests[i].message);
|
||||||
break;
|
break;
|
||||||
case TEST_PASS:
|
case TEST_PASS:
|
||||||
// Green
|
// Green
|
||||||
printf("\x1b[32mTest passed: %s\n\x1b[0m", lexer_reports.tests[i].name);
|
printf("\x1b[32mTest passed: %s\n\x1b[0m", reports.tests[i].name);
|
||||||
|
counts->passed += 1;
|
||||||
break;
|
break;
|
||||||
case TEST_NOT_IMPLEMENTED:
|
case TEST_NOT_IMPLEMENTED:
|
||||||
// Blue
|
// Blue
|
||||||
printf("\x1b[34mTest not implemented: %s\n\x1b[0m", lexer_reports.tests[i].name);
|
printf("\x1b[34mTest not implemented: %s\n\x1b[0m", reports.tests[i].name);
|
||||||
|
counts->not_implemented += 1;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// Bright Red
|
// Bright Red
|
||||||
printf("\x1b[91mTest errored: %s\n\tUnknown test result status.\n\x1b[0m", lexer_reports.tests[i].name);
|
printf("\x1b[91mTest errored: %s\n\tUnknown test result status.\n\x1b[0m", reports.tests[i].name);
|
||||||
|
counts->errored += 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
TestCounts counts = {
|
||||||
|
.errored = 0,
|
||||||
|
.error_failed = 0,
|
||||||
|
.logic_error_failed = 0,
|
||||||
|
.logic_failed = 0,
|
||||||
|
.passed = 0,
|
||||||
|
.not_implemented = 0,
|
||||||
|
.total = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
TestsReport lexer_reports = run_lexer_tests();
|
||||||
|
lexer_test_report(lexer_reports, &counts);
|
||||||
|
|
||||||
|
printf(" ===== Tests Overview =====\n");
|
||||||
|
if (counts.errored > 0)
|
||||||
|
// Bright Red
|
||||||
|
printf("\x1b[91m%d of %d tests encountered an error.\n\x1b[0m", counts.errored, counts.total);
|
||||||
|
if (counts.error_failed > 0)
|
||||||
|
// Magenta
|
||||||
|
printf("\x1b[35m%d of %d tests failed because of an interpreter error.\n\x1b[0m", counts.error_failed, counts.total);
|
||||||
|
if (counts.logic_error_failed > 0)
|
||||||
|
// Red
|
||||||
|
printf("\x1b[31m%d of %d tests failed because of a lexical, parsing, or runtime error.\n\x1b[0m", counts.logic_error_failed, counts.total);
|
||||||
|
if (counts.logic_failed > 0)
|
||||||
|
// Red
|
||||||
|
printf("\x1b[31m%d of %d tests failed because of a logical error.\n\x1b[0m", counts.logic_failed, counts.total);
|
||||||
|
if (counts.passed > 0)
|
||||||
|
// Green
|
||||||
|
printf("\x1b[32m%d of %d tests passed.\n\x1b[0m", counts.passed, counts.total);
|
||||||
|
if (counts.not_implemented > 0)
|
||||||
|
// Blue
|
||||||
|
printf("\x1b[34m%d of %d tests are not implemented.\n\x1b[0m", counts.not_implemented, counts.total);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@
|
||||||
- type: i64
|
- type: i64
|
||||||
value: 0
|
value: 0
|
||||||
|
|
||||||
- name: Integer Default Decimal -1 neg
|
- name: Integer Default Decimal -1
|
||||||
code: "-1"
|
code: "-1"
|
||||||
tokens:
|
tokens:
|
||||||
- type: i64
|
- type: i64
|
||||||
|
|
@ -54,19 +54,6 @@
|
||||||
- type: i64
|
- type: i64
|
||||||
value: -1
|
value: -1
|
||||||
|
|
||||||
- name: Integer Default Decimal +1 pos
|
|
||||||
code: "+1"
|
|
||||||
tokens:
|
|
||||||
- type: i64
|
|
||||||
value: 1
|
|
||||||
operations:
|
|
||||||
- function: push
|
|
||||||
type: i64
|
|
||||||
value: 1
|
|
||||||
stack_final:
|
|
||||||
- type: i64
|
|
||||||
value: 1
|
|
||||||
|
|
||||||
- name: Integer Default Decimal Leading Zeros
|
- name: Integer Default Decimal Leading Zeros
|
||||||
code: "00042"
|
code: "00042"
|
||||||
tokens:
|
tokens:
|
||||||
|
|
@ -133,7 +120,7 @@
|
||||||
value: 493
|
value: 493
|
||||||
|
|
||||||
- name: Integer i8 Decimal 127
|
- name: Integer i8 Decimal 127
|
||||||
code: "127i8"
|
code: "127:i8"
|
||||||
tokens:
|
tokens:
|
||||||
- type: i8
|
- type: i8
|
||||||
value: 127
|
value: 127
|
||||||
|
|
@ -146,7 +133,7 @@
|
||||||
value: 127
|
value: 127
|
||||||
|
|
||||||
- name: Integer i8 Decimal -128
|
- name: Integer i8 Decimal -128
|
||||||
code: "-128i8"
|
code: "-128:i8"
|
||||||
tokens:
|
tokens:
|
||||||
- type: i8
|
- type: i8
|
||||||
value: -128
|
value: -128
|
||||||
|
|
@ -159,7 +146,7 @@
|
||||||
value: -128
|
value: -128
|
||||||
|
|
||||||
- name: Integer u8 Decimal 255
|
- name: Integer u8 Decimal 255
|
||||||
code: "255u8"
|
code: "255:u8"
|
||||||
tokens:
|
tokens:
|
||||||
- type: u8
|
- type: u8
|
||||||
value: 255
|
value: 255
|
||||||
|
|
@ -188,15 +175,15 @@
|
||||||
code: "1,000,000"
|
code: "1,000,000"
|
||||||
tokens:
|
tokens:
|
||||||
- type: error
|
- type: error
|
||||||
value: "Invalid numeric literal: unexpected ',' in integer."
|
value: "Invalid decimal literal: unexpected ',' in decimal integer."
|
||||||
|
|
||||||
- name: Integer i8 Overflow
|
- name: Integer i8 Overflow
|
||||||
code: "128i8"
|
code: "128:i8"
|
||||||
runtime_error:
|
runtime_error:
|
||||||
message: "Integer overflow: 128 exceeds range for i8."
|
message: "Integer overflow: 128 exceeds range for i8."
|
||||||
|
|
||||||
- name: Integer i8 Underflow
|
- name: Integer i8 Underflow
|
||||||
code: "-129i8"
|
code: "-129:i8"
|
||||||
runtime_error:
|
runtime_error:
|
||||||
message: "Integer underflow: -129 exceeds range for i8."
|
message: "Integer underflow: -129 exceeds range for i8."
|
||||||
|
|
||||||
|
|
@ -204,7 +191,7 @@
|
||||||
code: "12a3"
|
code: "12a3"
|
||||||
tokens:
|
tokens:
|
||||||
- type: error
|
- type: error
|
||||||
value: "Invalid numeric literal: unexpected character 'a'."
|
value: "Invalid decimal literal: unexpected 'a' in decimal integer."
|
||||||
|
|
||||||
- name: Integer Default Whitespace
|
- name: Integer Default Whitespace
|
||||||
code: " 42 "
|
code: " 42 "
|
||||||
|
|
@ -223,25 +210,33 @@
|
||||||
code: "0b2"
|
code: "0b2"
|
||||||
tokens:
|
tokens:
|
||||||
- type: error
|
- type: error
|
||||||
value: "Invalid binary literal: digit '2' not allowed."
|
value: "Invalid binary literal: unexpected '2' in binary integer."
|
||||||
|
|
||||||
- name: Integer Default Invalid Underscore Start
|
- name: Integer Default Underscore End
|
||||||
code: "_42"
|
|
||||||
tokens:
|
|
||||||
- type: error
|
|
||||||
value: "Invalid numeric literal: cannot start with underscore."
|
|
||||||
|
|
||||||
- name: Integer Default Invalid Underscore End
|
|
||||||
code: "42_"
|
code: "42_"
|
||||||
tokens:
|
tokens:
|
||||||
- type: error
|
- type: i64
|
||||||
value: "Invalid numeric literal: cannot end with underscore."
|
value: 42
|
||||||
|
operations:
|
||||||
|
- function: push
|
||||||
|
type: i64
|
||||||
|
value: 42
|
||||||
|
stack_final:
|
||||||
|
- type: i64
|
||||||
|
value: 42
|
||||||
|
|
||||||
- name: Integer Default Invalid Underscore Double
|
- name: Integer Default Underscore Double
|
||||||
code: "4__2"
|
code: "4__2"
|
||||||
tokens:
|
tokens:
|
||||||
- type: error
|
- type: i64
|
||||||
value: "Invalid numeric literal: consecutive underscores not allowed."
|
value: 42
|
||||||
|
operations:
|
||||||
|
- function: push
|
||||||
|
type: i64
|
||||||
|
value: 42
|
||||||
|
stack_final:
|
||||||
|
- type: i64
|
||||||
|
value: 42
|
||||||
|
|
||||||
# Basic Floats
|
# Basic Floats
|
||||||
# Basic Strings
|
# Basic Strings
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue