test dlist
This commit is contained in:
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
## Current:
|
## Current:
|
||||||
- [ ] Sorting in the file list (local files):
|
- [ ] Sorting in the file list (local files):
|
||||||
- [ ] Testing env
|
- [x] Testing env
|
||||||
- [ ] Test dlist
|
- [x] Test dlist
|
||||||
- [ ] Dlist sort
|
- [ ] Dlist sort
|
||||||
|
|
||||||
## Global tasks:
|
## Global tasks:
|
||||||
|
|||||||
+22
-21
@@ -4,34 +4,22 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
typedef struct dlist_el_t {
|
#include "dlist.h"
|
||||||
struct dlist_el_t *next;
|
|
||||||
struct dlist_el_t *previous;
|
|
||||||
void *el_ptr;
|
|
||||||
} dlist_el_t;
|
|
||||||
|
|
||||||
typedef struct dlist_t {
|
dlist_t *_dlist_init(void *el_ptr, int el_siz) {
|
||||||
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 = malloc(sizeof(dlist_t));
|
dlist_t *dlist = malloc(sizeof(dlist_t));
|
||||||
dlist->len = 0;
|
dlist->len = 0;
|
||||||
dlist->current = NULL;
|
dlist->current = NULL;
|
||||||
dlist->start = NULL;
|
dlist->start = NULL;
|
||||||
|
|
||||||
if (el_ptr != NULL) {
|
if (el_ptr != NULL) {
|
||||||
dlist_add(dlist, el_ptr, el_siz, false);
|
_dlist_add(dlist, el_ptr, el_siz, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
return dlist;
|
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));
|
dlist_el_t *d_el = malloc(sizeof(dlist_el_t));
|
||||||
d_el->el_ptr = malloc(el_siz);
|
d_el->el_ptr = malloc(el_siz);
|
||||||
memcpy(d_el->el_ptr, el_ptr, 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;
|
d_el->next = NULL;
|
||||||
dlist->start = d_el;
|
dlist->start = d_el;
|
||||||
dlist->current = d_el;
|
dlist->current = d_el;
|
||||||
|
dlist->pointer = d_el;
|
||||||
} else if (prepend) {
|
} else if (prepend) {
|
||||||
d_el->previous = NULL;
|
d_el->previous = NULL;
|
||||||
d_el->next = dlist->start;
|
d_el->next = dlist->start;
|
||||||
|
dlist->start->previous = d_el;
|
||||||
dlist->start = d_el;
|
dlist->start = d_el;
|
||||||
} else {
|
} else {
|
||||||
|
d_el->previous = dlist->current;
|
||||||
d_el->next = NULL;
|
d_el->next = NULL;
|
||||||
dlist->current->next = d_el;
|
dlist->current->next = d_el;
|
||||||
dlist->current = d_el;
|
dlist->current = d_el;
|
||||||
|
dlist->pointer = d_el;
|
||||||
}
|
}
|
||||||
dlist->len++;
|
dlist->len++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *dlist_get_current(dlist_t *dlist) {
|
void *dlist_it_prev(dlist_t *dlist) {
|
||||||
return dlist->current->el_ptr;
|
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) {
|
void *dlist_it_next(dlist_t *dlist) {
|
||||||
dlist->current = dlist->current->previous;
|
if (dlist->pointer->next != NULL) {
|
||||||
return dlist->current;
|
dlist->pointer = dlist->pointer->next;
|
||||||
|
return dlist->pointer->el_ptr;
|
||||||
|
} else {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
#ifndef DLIST_H
|
||||||
|
#define DLIST_H
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
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
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
add_subdirectory(utils)
|
||||||
@@ -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)
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
#include <cmocka.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <utils/dlist.h>
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user