Skip to content

Commit e5b1103

Browse files
committed
FFlist: add tests
1 parent 6eed532 commit e5b1103

File tree

3 files changed

+101
-2
lines changed

3 files changed

+101
-2
lines changed

CMakeLists.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,8 +413,16 @@ if (BUILD_TESTS)
413413
PRIVATE libfastfetch
414414
)
415415

416+
add_executable(fastfetch-test-list
417+
tests/list.c
418+
)
419+
target_link_libraries(fastfetch-test-list
420+
PRIVATE libfastfetch
421+
)
422+
416423
enable_testing()
417424
add_test(NAME test-strbuf COMMAND fastfetch-test-strbuf)
425+
add_test(NAME test-list COMMAND fastfetch-test-list)
418426
endif()
419427

420428
##################

src/util/FFlist.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ uint32_t ffListFirstIndexComp(const FFlist* list, void* compElement, bool(*compF
4646

4747
void ffListDestroy(FFlist* list)
4848
{
49-
if(list->data != NULL)
50-
free(list->data);
49+
//Avoid free-after-use. These 3 assignments are cheap so don't remove them
50+
list->capacity = list->length = 0;
51+
free(list->data);
52+
list->data = NULL;
5153
}

tests/list.c

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
#include "fastfetch.h"
2+
3+
#include <string.h>
4+
#include <stdarg.h>
5+
#include <stdlib.h>
6+
7+
static void testFailed(const FFlist* list, const char* message, ...)
8+
{
9+
va_list args;
10+
va_start(args, message);
11+
fputs(FASTFETCH_TEXT_MODIFIER_ERROR, stderr);
12+
vfprintf(stderr, message, args);
13+
for (uint32_t i = 0; i < list->length; ++i)
14+
{
15+
fprintf(stderr, "%u ", *(uint32_t*)ffListGet(list, i));
16+
}
17+
fputc('\n', stderr);
18+
fputs(FASTFETCH_TEXT_MODIFIER_RESET, stderr);
19+
fputc('\n', stderr);
20+
va_end(args);
21+
exit(1);
22+
}
23+
24+
int main(int argc, char** argv)
25+
{
26+
FF_UNUSED(argc, argv)
27+
28+
FFlist list;
29+
30+
//initA
31+
32+
ffListInitA(&list, sizeof(uint32_t), 0);
33+
34+
if(ffListGet(&list, 0) != NULL)
35+
testFailed(&list, "ffListGet(&list, 0) != NULL");
36+
37+
if(list.elementSize != sizeof(int))
38+
testFailed(&list, "list.elementSize != sizeof(int)");
39+
40+
if(list.capacity != 0)
41+
testFailed(&list, "list.capacity != 0");
42+
43+
if(list.length != 0)
44+
testFailed(&list, "list.length != 0");
45+
46+
//add
47+
for (uint32_t i = 1; i <= FF_LIST_DEFAULT_ALLOC + 1; ++i)
48+
{
49+
*(uint32_t*)ffListAdd(&list) = i;
50+
51+
if(list.elementSize != sizeof(uint32_t))
52+
testFailed(&list, "list.elementSize != sizeof(uint32_t)");
53+
54+
if(list.length != i)
55+
testFailed(&list, "list.length != i");
56+
57+
if(i <= FF_LIST_DEFAULT_ALLOC)
58+
{
59+
if(list.capacity != FF_LIST_DEFAULT_ALLOC)
60+
testFailed(&list, "list.length != FF_LIST_DEFAULT_ALLOC");
61+
}
62+
else
63+
{
64+
if(list.capacity != FF_LIST_DEFAULT_ALLOC * 2)
65+
testFailed(&list, "list.length != FF_LIST_DEFAULT_ALLOC * 2");
66+
}
67+
68+
if(*(uint32_t*)ffListGet(&list, 0) != 1)
69+
testFailed(&list, "*(int*)ffListGet(&list, 0) != 1");
70+
71+
if(*(uint32_t*)ffListGet(&list, i - 1) != i)
72+
testFailed(&list, "*(int*)ffListGet(&list, i - 1) != i");
73+
}
74+
75+
//Destroy
76+
ffListDestroy(&list);
77+
78+
if(list.elementSize != sizeof(uint32_t))
79+
testFailed(&list, "list.elementSize != sizeof(uint32_t)");
80+
81+
if(list.capacity != 0)
82+
testFailed(&list, "list.capacity != 0");
83+
84+
if(list.length != 0)
85+
testFailed(&list, "list.length != 0");
86+
87+
//Success
88+
puts("\033[32mAll tests passed!"FASTFETCH_TEXT_MODIFIER_RESET);
89+
}

0 commit comments

Comments
 (0)