From 79f7e327ff06c3a5aeb5cf1e0f5186195531d40f Mon Sep 17 00:00:00 2001 From: LaEntropiaa Date: Thu, 5 Mar 2026 08:27:36 -0600 Subject: [PATCH] First test added, changed signature for using pointers beacause i forgot you can't actually change a parameter because c copies everything, stupid from me to forget that --- include/lexer.h | 8 +++--- src/lexer.c | 55 +++++++++++++++++++++++++++------------- test/CMakeLists.txt | 6 ++--- test/test_ASTNodeArray.c | 46 +++++++++++++++++++++++++++++++++ 4 files changed, 91 insertions(+), 24 deletions(-) create mode 100644 test/test_ASTNodeArray.c diff --git a/include/lexer.h b/include/lexer.h index 30f01fc..8fd95eb 100644 --- a/include/lexer.h +++ b/include/lexer.h @@ -20,6 +20,7 @@ typedef enum { typedef enum { ARRAY_OK = 0, + ARRAY_NULL, ARRAY_EMPTY, ARRAY_OUT_OF_BOUNDS, ARRAY_NULL_ARG, @@ -56,10 +57,11 @@ typedef struct { // Basic array functionality ASTNodeArray ASTNodeArray_init(size_t size); void ASTNodeArray_free(ASTNodeArray *arr); -ASTNodeArrayErr ASTNodeArray_push(ASTNodeArray arr, ASTNode node); -ASTNodeArrayErr ASTNodeArray_get(const ASTNodeArray arr, size_t index, ASTNode *out); +ASTNodeArrayErr ASTNodeArray_push(ASTNodeArray *arr, ASTNode node); +ASTNodeArrayErr ASTNodeArray_get(const ASTNodeArray *arr, size_t index, ASTNode *out); // Out in pop can be NULL so it doesn't return anything -ASTNodeArrayErr ASTNodeArray_pop(ASTNodeArray arr, size_t index, ASTNode *out); +ASTNodeArrayErr ASTNodeArray_pop(ASTNodeArray *arr, size_t index, ASTNode *out); +size_t ASTNodeArray_len(ASTNodeArray *arr); // Lexer funtions as well as few functionality LexerErr tokenize(const char* input, ASTNodeArray *out); diff --git a/src/lexer.c b/src/lexer.c index 3f6f86b..859ff93 100644 --- a/src/lexer.c +++ b/src/lexer.c @@ -23,58 +23,77 @@ void ASTNodeArray_free(ASTNodeArray *arr) { arr->len = 0; } -ASTNodeArrayErr ASTNodeArray_get(const ASTNodeArray arr, size_t index, ASTNode *out) { +ASTNodeArrayErr ASTNodeArray_get(const ASTNodeArray *arr, size_t index, ASTNode *out) { + if (arr == NULL) { + return ARRAY_NULL; + } + if (out == NULL) { return ARRAY_NULL_ARG; } - if (arr.len == 0) { + if (arr->len == 0) { return ARRAY_EMPTY; } - if (index >= arr.len) { + if (index >= arr->len) { return ARRAY_OUT_OF_BOUNDS; } - *out = arr.data[index]; + *out = arr->data[index]; return ARRAY_OK; } -ASTNodeArrayErr ASTNodeArray_push(ASTNodeArray arr, ASTNode node) { - if (arr.len >= arr.cap) { - size_t new_cap = arr.cap * 2; - ASTNode *tmp = realloc(arr.data, new_cap * sizeof(ASTNode)); +ASTNodeArrayErr ASTNodeArray_push(ASTNodeArray *arr, ASTNode node) { + if (arr == NULL) { + return ARRAY_NULL; + } + + if (arr->len >= arr->cap) { + size_t new_cap = arr->cap * 2; + ASTNode *tmp = realloc(arr->data, new_cap * sizeof(ASTNode)); if (tmp == NULL) { return ARRAY_ALLOC; } - arr.data = tmp; - arr.cap = new_cap; + arr->data = tmp; + arr->cap = new_cap; } - arr.data[arr.len] = node; - arr.len += 1; + arr->data[arr->len] = node; + arr->len = arr->len + 1; return ARRAY_OK; } -ASTNodeArrayErr ASTNodeArray_pop(ASTNodeArray arr, size_t index, ASTNode *out) { - if (arr.len == 0) { +ASTNodeArrayErr ASTNodeArray_pop(ASTNodeArray *arr, size_t index, ASTNode *out) { + if (arr == NULL) { + return ARRAY_NULL; + } + + if (arr->len == 0) { return ARRAY_EMPTY; } - if (index >= arr.len) { + if (index >= arr->len) { return ARRAY_OUT_OF_BOUNDS; } if (out != NULL) { - ASTNode node_to_delete = arr.data[index]; + ASTNode node_to_delete = arr->data[index]; *out = node_to_delete; } - for (size_t i = index; i < arr.len - 1; i++) { - arr.data[index] = arr.data[index + 1]; + for (size_t i = index; i < arr->len - 1; i++) { + arr->data[index] = arr->data[index + 1]; } return ARRAY_OK; } + +size_t ASTNodeArray_len(ASTNodeArray *arr) { + if (arr == NULL) { + return 0; + } + return arr->len; +} diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 2e3cef2..99aff45 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,10 +1,10 @@ find_package(cmocka REQUIRED) -add_executable(test_parser test_parser.c) +add_executable(test_nodeArray test_ASTNodeArray.c) -target_link_libraries(test_parser +target_link_libraries(test_nodeArray calculator_lib cmocka::cmocka ) -add_test(NAME parser_tests COMMAND test_parser) +add_test(NAME nodeArray_tests COMMAND test_nodeArray) diff --git a/test/test_ASTNodeArray.c b/test/test_ASTNodeArray.c new file mode 100644 index 0000000..4138ea3 --- /dev/null +++ b/test/test_ASTNodeArray.c @@ -0,0 +1,46 @@ +#include "lexer.h" +#include +#include +#include +#include +#include +#include + +static void test_array_push(void **state) { + (void) state; + + ASTNodeArray arr = ASTNodeArray_init(2); + ASTNode node1 = { + .type = NODE_NUMBER, + .operator = { .number = 90 } + }; + + ASTNode node2 = { + .type = NODE_NUMBER, + .operator = { .number = 80 } + }; + + ASTNode node3 = { + .type = NODE_NUMBER, + .operator = { .number = 70 } + }; + + assert_int_equal(ASTNodeArray_push(&arr, node1), ARRAY_OK); + assert_int_equal(ASTNodeArray_len(&arr), 1); + + assert_int_equal(ASTNodeArray_push(&arr, node2), ARRAY_OK); + assert_int_equal(ASTNodeArray_len(&arr), 2); + + assert_int_equal(ASTNodeArray_push(&arr, node3), ARRAY_OK); + assert_int_equal(ASTNodeArray_len(&arr), 3); +} + + + +int main(void) { + const struct CMUnitTest tests[] = { + cmocka_unit_test(test_array_push), + }; + + return cmocka_run_group_tests(tests, NULL, NULL); +}