]> git.lizzy.rs Git - dragonstd.git/blob - test/test_array.c
a6c8e19fa87fe345e6e6c7a5b3761791937eb6de
[dragonstd.git] / test / test_array.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <assert.h>
4 #include <time.h>
5 #include "../array.h"
6
7 int cmp_int(const int *pa, const int *pb)
8 {
9         return *pa - *pb;
10 }
11
12 void assert_in_order(Array *arr)
13 {
14         for (size_t i = 1; i < arr->siz; i++)
15                 assert(((int *) arr->ptr)[i - 1] <= ((int *) arr->ptr)[i]);
16 }
17
18 void dump(Array *arr)
19 {
20         for (size_t i = 0; i < arr->siz; i++) {
21                 printf("%d", ((int *) arr->ptr)[i]);
22
23                 if (i != arr->siz - 1)
24                         printf(",");
25         }
26 }
27
28 int main()
29 {
30         printf("-------------\n");
31         printf("Testing Array\n");
32         printf("-------------\n");
33
34         int i;
35         Array arr, arr2;
36         srand(time(NULL));
37
38         printf("testing ini\n");
39         array_ini(&arr, sizeof(int), 0);
40
41         printf("testing add\n");
42         i = 1; array_apd(&arr, &i);
43         i = 3; array_apd(&arr, &i);
44         i = 4; array_apd(&arr, &i);
45
46         printf("testing put\n");
47         i = 2; array_put(&arr, &i, 1);
48         i = 5; array_put(&arr, &i, arr.siz);
49
50         printf("testing siz: exp: 5 got: %lu\n", arr.siz);
51         assert(arr.siz == 5);
52
53         printf("testing cap: exp: 5 got: %lu\n", arr.cap);
54         assert(arr.cap == 5);
55
56         printf("testing contents: exp: 1,2,3,4,5 got: "); dump(&arr); printf("\n");
57         for (size_t j = 0; j < arr.siz; j++)
58                 assert((size_t) ((int *) arr.ptr)[j] == j + 1);
59
60         printf("testing cln\n");
61         array_cln(&arr2, &arr);
62
63         printf("testing equality: exp: "); dump(&arr); printf(" got: "); dump(&arr2);
64         printf("\n");
65
66         for (size_t j = 0; j < arr.siz; j++)
67                 assert(((int *) arr.ptr)[j] == ((int *) arr2.ptr)[j]);
68
69         printf("testing clr\n");
70         array_clr(&arr);
71         array_clr(&arr2);
72
73         printf("testing ini after clr\n");
74         array_ini(&arr, sizeof(int), 5);
75
76         printf("testing cap: exp: 0 got: %lu\n", arr.cap);
77         assert(arr.cap == 0);
78
79         printf("testing overallocation\n");
80         i = 50; array_apd(&arr, &i);
81
82         printf("testing cap: exp: 0 got: %lu\n", arr.cap);
83         assert(arr.siz == 1);
84
85         printf("testing cap: exp: 6 got: %lu\n", arr.cap);
86         assert(arr.cap == 6);
87
88         for (int j = 0; j < 7; j++) {
89                 i = rand() % 100; array_apd(&arr, &i);
90         }
91
92         printf("testing siz: exp: 8 got: %lu\n", arr.cap);
93         assert(arr.siz == 8);
94
95         printf("testing cap: exp: 12 got: %lu\n", arr.cap);
96         assert(arr.cap == 12);
97
98         printf("testing grw\n");
99         array_grw(&arr, 5);
100
101         printf("testing siz: exp: 13 got: %lu\n", arr.cap);
102         assert(arr.siz == 13);
103
104         printf("testing cap: exp: 18 got: %lu\n", arr.cap);
105         assert(arr.cap == 18);
106
107         printf("testing shr\n");
108         array_shr(&arr, 5);
109
110         printf("testing siz: exp: 8 got: %lu\n", arr.cap);
111         assert(arr.siz == 8);
112
113         printf("testing cap: exp: 8 got: %lu\n", arr.cap);
114         assert(arr.cap == 8);
115
116         printf("testing srt\n");
117         array_srt(&arr, &cmp_int);
118
119         printf("testing order: exp: (sorted) got: "); dump(&arr); printf("\n");
120         assert_in_order(&arr);
121
122         for (size_t j = 0; j < arr.siz; j++) {
123                 i = ((int *) arr.ptr)[j];
124                 ssize_t s = array_fnd(&arr, &i, NULL, &cmp_int);
125
126                 printf("testing fnd at index %lu: exp: >=0 got: %ld\n", j, s);
127                 assert(s >= 0);
128
129                 int k = ((int *) arr.ptr)[s];
130
131                 printf("testing fnd at index %lu: exp: %d got: %d\n", j, i, k);
132                 assert(k == i);
133         }
134
135         printf("testing ins\n");
136         for (int j = 0; j < 10; j++) {
137                 i = rand() % 100; array_ins(&arr, &i, &cmp_int);
138         }
139
140         printf("testing order: exp: (sorted) got: "); dump(&arr); printf("\n");
141         assert_in_order(&arr);
142
143         array_clr(&arr);
144 }