YREA-SLS/SLS_C/tests/lexer_tests.c

85 lines
2.2 KiB
C

// Kyler Olsen
// YREA SLS
// Lexer Tests
// October 2025
#include <stdlib.h>
#include <stdint.h>
#include "sls/sls_errors.h"
#include "sls/lexer.h"
#include "tests/tests.h"
static const size_t NUM_OF_TESTS = 1;
typedef struct {
TestResult result;
LexerInfo lexer_info;
} LexerTest;
static LexerTest start_up_test(const char *test_name, const char *test_code) {
LexerTest test = (LexerTest) {
.result = (TestResult) { .name = test_name, .success = 0 } };
lexer_init(&test.lexer_info, TEST_FILE_NAME, test_code);
return test;
}
static void clean_up_test(LexerResult result) {
if (result.type == SLS_RESULT)
clean_token_result(result.result);
}
static TestResult logic_fail_test(LexerTest test, LexerResult result, const char *message) {
clean_up_test(result);
test.result.success = 0;
test.result.message = message;
return test.result;
}
static TestResult error_fail_test(LexerTest test, LexerResult result, SlsError error) {
clean_up_test(result);
test.result.success = 0;
test.result.error = error;
return test.result;
}
static TestResult pass_test(LexerTest test, LexerResult result) {
clean_up_test(result);
test.result.success = 1;
return test.result;
}
static TestResult test_add_statement() {
LexerTest test = start_up_test("test_add_statement", "3 4 +");
LexerResult result = lexical_analysis(&test.lexer_info);
if (result.type == SLS_ERROR)
return fail_test(test, result, result.error.message);
LexerTokenResult *head = result.result;
if (head->type == SLS_ERROR)
return fail_test(test, result, result.error.message);
if (head->result.type != TOKEN_INTEGER)
return fail_test(test, result);
if (head->result.integer_literal.type != INTEGER_I64)
return fail_test(test, result);
if (head->result.integer_literal.value != 3)
return fail_test(test, result);
return pass_test(test, result);
}
TestsReport run_lexer_tests() {
TestsReport test_report = (TestsReport){
.section = "lexer_tests",
.count = NUM_OF_TESTS,
.tests = malloc(sizeof(TestResult) * NUM_OF_TESTS),
};
test_report.tests[0] = test_add_statement();
return test_report;
}