diff --git a/TODO.md b/TODO.md index d5d0268..e164ed6 100644 --- a/TODO.md +++ b/TODO.md @@ -2,8 +2,8 @@ ## Current: - [ ] Sorting in the file list (local files): - - [ ] Testing env - - [ ] Test dlist + - [x] Testing env + - [x] Test dlist - [ ] Dlist sort ## Global tasks: diff --git a/src/utils/dlist.c b/src/utils/dlist.c index 81c43ab..0270958 100644 --- a/src/utils/dlist.c +++ b/src/utils/dlist.c @@ -4,34 +4,22 @@ #include #include -typedef struct dlist_el_t { - struct dlist_el_t *next; - struct dlist_el_t *previous; - void *el_ptr; -} dlist_el_t; +#include "dlist.h" -typedef struct dlist_t { - dlist_el_t *start; - dlist_el_t *current; - size_t len; -} dlist_t; - -void dlist_add(dlist_t *dlist, void *el_ptr, int el_siz, bool prepend); - -dlist_t *dlist_init(void *el_ptr, int el_siz) { +dlist_t *_dlist_init(void *el_ptr, int el_siz) { dlist_t *dlist = malloc(sizeof(dlist_t)); dlist->len = 0; dlist->current = NULL; dlist->start = NULL; if (el_ptr != NULL) { - dlist_add(dlist, el_ptr, el_siz, false); + _dlist_add(dlist, el_ptr, el_siz, false); } return dlist; } -void dlist_add(dlist_t *dlist, void *el_ptr, int el_siz, bool prepend) { +void _dlist_add(dlist_t *dlist, void *el_ptr, int el_siz, bool prepend) { dlist_el_t *d_el = malloc(sizeof(dlist_el_t)); d_el->el_ptr = malloc(el_siz); memcpy(d_el->el_ptr, el_ptr, el_siz); @@ -41,23 +29,36 @@ void dlist_add(dlist_t *dlist, void *el_ptr, int el_siz, bool prepend) { d_el->next = NULL; dlist->start = d_el; dlist->current = d_el; + dlist->pointer = d_el; } else if (prepend) { d_el->previous = NULL; d_el->next = dlist->start; + dlist->start->previous = d_el; dlist->start = d_el; } else { + d_el->previous = dlist->current; d_el->next = NULL; dlist->current->next = d_el; dlist->current = d_el; + dlist->pointer = d_el; } dlist->len++; } -void *dlist_get_current(dlist_t *dlist) { - return dlist->current->el_ptr; +void *dlist_it_prev(dlist_t *dlist) { + if (dlist->pointer->previous != NULL) { + dlist->pointer = dlist->pointer->previous; + return dlist->pointer->el_ptr; + } else { + return NULL; + } } -void *dlist_it_prev(dlist_t *dlist) { - dlist->current = dlist->current->previous; - return dlist->current; +void *dlist_it_next(dlist_t *dlist) { + if (dlist->pointer->next != NULL) { + dlist->pointer = dlist->pointer->next; + return dlist->pointer->el_ptr; + } else { + return NULL; + } } \ No newline at end of file diff --git a/src/utils/dlist.h b/src/utils/dlist.h new file mode 100644 index 0000000..d86701c --- /dev/null +++ b/src/utils/dlist.h @@ -0,0 +1,31 @@ +#ifndef DLIST_H +#define DLIST_H + +#include +#include + +typedef struct dlist_el_t { + struct dlist_el_t *next; + struct dlist_el_t *previous; + void *el_ptr; +} dlist_el_t; + +typedef struct dlist_t { + dlist_el_t *start; + dlist_el_t *current; + dlist_el_t *pointer; + size_t len; +} dlist_t; + +dlist_t *_dlist_init(void *el_ptr, int el_siz); +void *dlist_get_current(dlist_t *dlist); +void *dlist_it_prev(dlist_t *dlist); +void _dlist_add(dlist_t *dlist, void *el_ptr, int el_siz, bool prepend); +void *dlist_it_prev(dlist_t *dlist); +void *dlist_it_next(dlist_t *dlist); + +#define dlist_init(el_ptr, el_def) _dlist_init(el_ptr, sizeof(el_def)) +#define dlist_add(dlist, el_ptr, el_def, prepend) _dlist_add(dlist, el_ptr, sizeof(el_def), prepend) +#define dlist_get_current(dlist) dlist->current->el_ptr + +#endif \ No newline at end of file diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index e69de29..47202fc 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(utils) \ No newline at end of file diff --git a/test/utils/CMakeLists.txt b/test/utils/CMakeLists.txt new file mode 100644 index 0000000..6cdbb7e --- /dev/null +++ b/test/utils/CMakeLists.txt @@ -0,0 +1,13 @@ +# ---/ process_client_command /-------------------------------------- + +add_executable(test_dlist + dlist.c +) + +target_link_libraries(test_dlist + cmocka + common + utils +) + +add_test(NAME utils_dlist COMMAND test_dlist) \ No newline at end of file diff --git a/test/utils/dlist.c b/test/utils/dlist.c new file mode 100644 index 0000000..2a49672 --- /dev/null +++ b/test/utils/dlist.c @@ -0,0 +1,109 @@ +#include +#include +#include +#include + +typedef struct { + int num; + char *text; + char buf[128]; +} test_t; + +#define LOREM_IPSUM \ + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod " \ + "tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim " \ + "veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea " \ + "commodo consequat. Duis aute irure dolor in reprehenderit in voluptate " \ + "velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint " \ + "occaecat cupidatat non proident, sunt in culpa qui officia deserunt " \ + "mollit anim id est laborum." + +void test__init(void **state) { + test_t t = {.buf = "TEST BUF", .num = 123, .text = LOREM_IPSUM}; + + dlist_t *dlist = dlist_init(&t, test_t); + assert_int_equal(dlist->len, 1); + test_t *dt_ptr = dlist->current->el_ptr; + assert_int_equal(dt_ptr->num, t.num); + assert_string_equal(dt_ptr->buf, t.buf); + assert_ptr_equal(dt_ptr->text, LOREM_IPSUM); +} + +void test__init__add_several_times(void **state) { + test_t t1 = {.buf = "TEST BUF", .num = 123, .text = LOREM_IPSUM}; + test_t t2 = {.buf = "TEST 1 BUF", .num = 11, .text = "RAND 1 TEXT"}; + test_t t3 = {.buf = "TEST 2 BUF", .num = 22, .text = "RAND 2 TEXT"}; + + dlist_t *dlist = dlist_init(NULL, test_t); + + dlist_add(dlist, &t1, test_t, false); + dlist_add(dlist, &t2, test_t, false); + dlist_add(dlist, &t3, test_t, false); + + assert_int_equal(dlist->len, 3); + + test_t *dl_t1 = dlist->start->el_ptr; + test_t *dl_t2 = dlist->start->next->el_ptr; + test_t *dl_t3 = dlist->current->el_ptr; + + assert_memory_equal(dl_t1, &t1, sizeof(test_t)); + assert_memory_equal(dl_t2, &t2, sizeof(test_t)); + assert_memory_equal(dl_t3, &t3, sizeof(test_t)); +} + +void test__init__add_several_times_prepend(void **state) { + test_t t1 = {.buf = "TEST BUF", .num = 123, .text = LOREM_IPSUM}; + test_t t2 = {.buf = "TEST 1 BUF", .num = 11, .text = "RAND 1 TEXT"}; + test_t t3 = {.buf = "TEST 2 BUF", .num = 22, .text = "RAND 2 TEXT"}; + + dlist_t *dlist = dlist_init(NULL, test_t); + + dlist_add(dlist, &t1, test_t, true); + dlist_add(dlist, &t2, test_t, true); + dlist_add(dlist, &t3, test_t, true); + + assert_int_equal(dlist->len, 3); + + test_t *dl_t1 = dlist->current->el_ptr; + test_t *dl_t2 = dlist->current->previous->el_ptr; + test_t *dl_t3 = dlist->start->el_ptr; + + assert_memory_equal(dl_t1, &t1, sizeof(test_t)); + assert_memory_equal(dl_t2, &t2, sizeof(test_t)); + assert_memory_equal(dl_t3, &t3, sizeof(test_t)); +} + +void test__init__add_and_iterate(void **state) { + test_t t1 = {.buf = "TEST BUF", .num = 123, .text = LOREM_IPSUM}; + test_t t2 = {.buf = "TEST 1 BUF", .num = 11, .text = "RAND 1 TEXT"}; + test_t t3 = {.buf = "TEST 2 BUF", .num = 22, .text = "RAND 2 TEXT"}; + + dlist_t *dlist = dlist_init(NULL, test_t); + + dlist_add(dlist, &t1, test_t, false); + dlist_add(dlist, &t2, test_t, false); + dlist_add(dlist, &t3, test_t, false); + + test_t *dl_t3 = dlist_get_current(dlist); + test_t *dl_t2 = dlist_it_prev(dlist); + test_t *dl_t1 = dlist_it_prev(dlist); + + assert_memory_equal(dl_t1, &t1, sizeof(test_t)); + assert_memory_equal(dl_t2, &t2, sizeof(test_t)); + assert_memory_equal(dl_t3, &t3, sizeof(test_t)); +} + +int setup(void **state) { return 0; } +int tear_down(void **state) { return 0; } + +int main(int argc, char **argv) { + const struct CMUnitTest tests[] = { + cmocka_unit_test(test__init), + cmocka_unit_test(test__init__add_several_times), + cmocka_unit_test(test__init__add_several_times_prepend), + cmocka_unit_test(test__init__add_and_iterate), + + }; + + return cmocka_run_group_tests(tests, setup, tear_down); +} \ No newline at end of file