YREA-SLS/SLS_C/tests/tests.c

108 lines
3.7 KiB
C

// Kyler Olsen
// YREA SLS
// SLS Tests
// November 2025
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "sls/errors.h"
#include "tests/tests.h"
const SlsStr TEST_FILE_NAME = SLS_STR("TEST_FILE.SLS");
typedef struct {
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;
static void test_report(TestsReport reports, TestCounts *counts) {
counts->total += reports.count;
for (size_t i = 0; i < reports.count; i++) {
switch (reports.tests[i].status) {
case TEST_ERROR:
// Bright Red
printf("\x1b[91mTest errored: %s\n\t%s\n\x1b[0m", reports.tests[i].name.str, reports.tests[i].error.message.str);
counts->errored += 1;
break;
case TEST_ERROR_FAIL:
// Magenta
printf("\x1b[35mLexing errored: %s\n\t%s\n\x1b[0m", reports.tests[i].name.str, reports.tests[i].error.message.str);
counts->error_failed += 1;
break;
case TEST_LOGIC_ERROR_FAIL:
// Red
printf("\x1b[31mTest failed with lexical error: %s\n\t%s\n\x1b[0m", reports.tests[i].name.str, reports.tests[i].error.message.str);
counts->logic_error_failed += 1;
sls_str_free(&reports.tests[i].message);
break;
case TEST_LOGIC_FAIL:
// Red
printf("\x1b[31mTest failed: %s\n\t%s\n\x1b[0m", reports.tests[i].name.str, reports.tests[i].message.str);
counts->logic_failed += 1;
sls_str_free(&reports.tests[i].message);
break;
case TEST_PASS:
// Green
printf("\x1b[32mTest passed: %s\n\x1b[0m", reports.tests[i].name.str);
counts->passed += 1;
break;
case TEST_NOT_IMPLEMENTED:
// Blue
printf("\x1b[34mTest not implemented: %s\n\x1b[0m", reports.tests[i].name.str);
counts->not_implemented += 1;
break;
default:
// Bright Red
printf("\x1b[91mTest errored: %s\n\tUnknown test result status.\n\x1b[0m", reports.tests[i].name.str);
counts->errored += 1;
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,
};
printf(" ===== SlsStr Tests =====\n");
test_report(run_string_tests(), &counts);
printf(" ===== Lexer Tests =====\n");
test_report(run_lexer_tests(), &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;
}