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
This commit is contained in:
@@ -20,6 +20,7 @@ typedef enum {
|
|||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
ARRAY_OK = 0,
|
ARRAY_OK = 0,
|
||||||
|
ARRAY_NULL,
|
||||||
ARRAY_EMPTY,
|
ARRAY_EMPTY,
|
||||||
ARRAY_OUT_OF_BOUNDS,
|
ARRAY_OUT_OF_BOUNDS,
|
||||||
ARRAY_NULL_ARG,
|
ARRAY_NULL_ARG,
|
||||||
@@ -56,10 +57,11 @@ typedef struct {
|
|||||||
// Basic array functionality
|
// Basic array functionality
|
||||||
ASTNodeArray ASTNodeArray_init(size_t size);
|
ASTNodeArray ASTNodeArray_init(size_t size);
|
||||||
void ASTNodeArray_free(ASTNodeArray *arr);
|
void ASTNodeArray_free(ASTNodeArray *arr);
|
||||||
ASTNodeArrayErr ASTNodeArray_push(ASTNodeArray arr, ASTNode node);
|
ASTNodeArrayErr ASTNodeArray_push(ASTNodeArray *arr, ASTNode node);
|
||||||
ASTNodeArrayErr ASTNodeArray_get(const ASTNodeArray arr, size_t index, ASTNode *out);
|
ASTNodeArrayErr ASTNodeArray_get(const ASTNodeArray *arr, size_t index, ASTNode *out);
|
||||||
// Out in pop can be NULL so it doesn't return anything
|
// 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
|
// Lexer funtions as well as few functionality
|
||||||
LexerErr tokenize(const char* input, ASTNodeArray *out);
|
LexerErr tokenize(const char* input, ASTNodeArray *out);
|
||||||
|
|||||||
55
src/lexer.c
55
src/lexer.c
@@ -23,58 +23,77 @@ void ASTNodeArray_free(ASTNodeArray *arr) {
|
|||||||
arr->len = 0;
|
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) {
|
if (out == NULL) {
|
||||||
return ARRAY_NULL_ARG;
|
return ARRAY_NULL_ARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (arr.len == 0) {
|
if (arr->len == 0) {
|
||||||
return ARRAY_EMPTY;
|
return ARRAY_EMPTY;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (index >= arr.len) {
|
if (index >= arr->len) {
|
||||||
return ARRAY_OUT_OF_BOUNDS;
|
return ARRAY_OUT_OF_BOUNDS;
|
||||||
}
|
}
|
||||||
|
|
||||||
*out = arr.data[index];
|
*out = arr->data[index];
|
||||||
|
|
||||||
return ARRAY_OK;
|
return ARRAY_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTNodeArrayErr ASTNodeArray_push(ASTNodeArray arr, ASTNode node) {
|
ASTNodeArrayErr ASTNodeArray_push(ASTNodeArray *arr, ASTNode node) {
|
||||||
if (arr.len >= arr.cap) {
|
if (arr == NULL) {
|
||||||
size_t new_cap = arr.cap * 2;
|
return ARRAY_NULL;
|
||||||
ASTNode *tmp = realloc(arr.data, new_cap * sizeof(ASTNode));
|
}
|
||||||
|
|
||||||
|
if (arr->len >= arr->cap) {
|
||||||
|
size_t new_cap = arr->cap * 2;
|
||||||
|
ASTNode *tmp = realloc(arr->data, new_cap * sizeof(ASTNode));
|
||||||
if (tmp == NULL) {
|
if (tmp == NULL) {
|
||||||
return ARRAY_ALLOC;
|
return ARRAY_ALLOC;
|
||||||
}
|
}
|
||||||
arr.data = tmp;
|
arr->data = tmp;
|
||||||
arr.cap = new_cap;
|
arr->cap = new_cap;
|
||||||
}
|
}
|
||||||
|
|
||||||
arr.data[arr.len] = node;
|
arr->data[arr->len] = node;
|
||||||
arr.len += 1;
|
arr->len = arr->len + 1;
|
||||||
|
|
||||||
return ARRAY_OK;
|
return ARRAY_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTNodeArrayErr ASTNodeArray_pop(ASTNodeArray arr, size_t index, ASTNode *out) {
|
ASTNodeArrayErr ASTNodeArray_pop(ASTNodeArray *arr, size_t index, ASTNode *out) {
|
||||||
if (arr.len == 0) {
|
if (arr == NULL) {
|
||||||
|
return ARRAY_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (arr->len == 0) {
|
||||||
return ARRAY_EMPTY;
|
return ARRAY_EMPTY;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (index >= arr.len) {
|
if (index >= arr->len) {
|
||||||
return ARRAY_OUT_OF_BOUNDS;
|
return ARRAY_OUT_OF_BOUNDS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (out != NULL) {
|
if (out != NULL) {
|
||||||
ASTNode node_to_delete = arr.data[index];
|
ASTNode node_to_delete = arr->data[index];
|
||||||
*out = node_to_delete;
|
*out = node_to_delete;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = index; i < arr.len - 1; i++) {
|
for (size_t i = index; i < arr->len - 1; i++) {
|
||||||
arr.data[index] = arr.data[index + 1];
|
arr->data[index] = arr->data[index + 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
return ARRAY_OK;
|
return ARRAY_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t ASTNodeArray_len(ASTNodeArray *arr) {
|
||||||
|
if (arr == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return arr->len;
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
find_package(cmocka REQUIRED)
|
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
|
calculator_lib
|
||||||
cmocka::cmocka
|
cmocka::cmocka
|
||||||
)
|
)
|
||||||
|
|
||||||
add_test(NAME parser_tests COMMAND test_parser)
|
add_test(NAME nodeArray_tests COMMAND test_nodeArray)
|
||||||
|
|||||||
46
test/test_ASTNodeArray.c
Normal file
46
test/test_ASTNodeArray.c
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
#include "lexer.h"
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <setjmp.h>
|
||||||
|
#include <cmocka.h>
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user