Dinamic Array
 
Loading...
Searching...
No Matches
main.c
Go to the documentation of this file.
1#include "darr.h"
2#include <assert.h>
3#include <limits.h>
4#include <stddef.h>
5#include <stdio.h>
6#include <stdlib.h>
7#include <time.h>
8
9/* #define T char */
10/* #define T short */
11/* #define T int */
12/* #define T long */
13#define T float
14/* #define T double */
15
16void test_staticness(void);
17void test_basic_operations(void);
18bool compare(void const *curr, void const *value);
19void test_edge_cases(void);
20void test_large_array(void);
21
22int main(void) {
27
28 puts("\nAll tests passed!");
29
30 return 0;
31}
32
33// Test if the element pointers is easely changed
34void test_staticness(void) {
35 __auto_type darr = darr_new();
36
37 T a = 12;
38
39 darr_push(darr, &a, sizeof(T));
40
41 a = 13;
42
43 assert(*(T *)darr_at(darr, 0) == 12);
44
45 T *b = malloc(sizeof(T));
46 *b = 21;
47
48 darr_push(darr, b, sizeof(T));
49 free(b);
50
51 assert(*(T *)darr_at(darr, 1) == 21);
52
53 // Clean up
54 darr_destroy(darr);
55 printf("{test_staticness}\t passed!\n");
56}
57
58// Test function for basic operations
60 darr_t *darr = darr_new();
61
62 // Test initial state
63 assert(darr_get_size(darr) == 0);
65 assert(darr_at(darr, 0) == NULL); // Out of bounds access should return NULL
66
67 // Test push
68 T value1 = 10, value2 = 20, value3 = 30;
69 assert(darr_push(darr, &value1, sizeof(T)) == 0); // First element at index 0
70 assert(darr_push(darr, &value2, sizeof(T)) == 1); // Second element at index 1
71 assert(darr_push(darr, &value3, sizeof(T)) == 2); // Third element at index 2
72
73 // Test size and capacity after pushes
74 assert(darr_get_size(darr) == 3);
75 assert(darr_get_capacity(darr) >= 3); // Capacity should have grown
76
77 // Test at
78 assert(*(T *)darr_at(darr, 0) == value1);
79 assert(*(T *)darr_at(darr, 1) == value2);
80 assert(*(T *)darr_at(darr, 2) == value3);
81 assert(darr_at(darr, 3) == NULL); // Out of bounds access
82
83 // Test pop
84 assert(darr_pop(darr) == 2); // Pop last element (index 2)
85 assert(darr_get_size(darr) == 2);
86 assert(darr_at(darr, 2) == NULL); // Element at index 2 should be gone
87
88 // Test insert_at
89 T value4 = 15;
90 assert(darr_insert_at(darr, 1, &value4, sizeof(T)) == 1); // Insert at index 1
91 assert(darr_get_size(darr) == 3);
92 assert(*(T *)darr_at(darr, 1) == value4); // Check inserted value
93 assert(*(T *)darr_at(darr, 2) == value2); // Check shifted value
94
95 // Test delete_at
96 assert(darr_delete_at(darr, 1) == 1); // Delete at index 1
97 assert(darr_get_size(darr) == 2);
98 assert(*(T *)darr_at(darr, 1) == value2); // Check shifted value
99
100 // Test find
101 assert(darr_find(darr, &value1, compare) == 0); // Find value1 at index 0
102 assert(darr_find(darr, &value2, compare) == 1); // Find value2 at index 1
103 assert(darr_find(darr, &value3, compare) == -1); // value3 was popped
104
105 // Clean up
106 darr_destroy(darr);
107 printf("{test_basic_operations}\t passed!\n");
108}
109
110// Helper function to compare two values
111bool compare(void const *curr, void const *value) {
112 return *(T *)curr == *(T *)value;
113}
114
115// Test function for edge cases
117 darr_t *darr = darr_new();
118
119 // Test empty array
120 assert(darr_pop(darr) == -1); // Pop from empty array
121 assert(darr_delete_at(darr, 0) == -1); // Delete from empty array
122 assert(darr_insert_at(darr, 1, &(T){10}, sizeof(T)) == -1);
123
124 // Test inserting at the end
125 assert(darr_insert_at(darr, 0, &(T){10}, sizeof(T)) == 0);
126 assert(darr_insert_at(darr, 1, &(T){20}, sizeof(T)) == 1);
127
128 // Test deleting the only element
129 assert(darr_delete_at(darr, 0) == 0); // Delete at index 0
130 assert(darr_get_size(darr) == 1);
131 assert(*(T *)darr_at(darr, 0) == 20); // Check remaining element
132
133 // Clean up
134 darr_destroy(darr);
135 printf("{test_edge_cases}\t passed!\n");
136}
137
138// Test function for large arrays
140 darr_t *darr = darr_new();
141 size_t const N = 1000;
142
143 // Push N elements
144 for (size_t i = 0; i < N; ++i) {
145 T *value = malloc(sizeof(T));
146
147 *value = i;
148
149 assert(darr_push(darr, value, sizeof(T)) == (int)i);
150
151 free(value);
152 }
153
154 // Check size and capacity
155 assert(darr_get_size(darr) == N);
156 assert(darr_get_capacity(darr) >= N);
157
158 // Check values
159 for (size_t i = 0; i < N; ++i)
160 assert(*(T *)darr_at(darr, i) == (T)i);
161
162 // Pop all elements
163 for (size_t i = 0; i < N; ++i)
164 assert(darr_pop(darr) == (int)(N - i - 1));
165
166 // Check final state
167 assert(darr_get_size(darr) == 0);
169
170 // Clean up
171 darr_destroy(darr);
172 printf("{test_large_array}\t passed!\n");
173}
size_t darr_get_capacity(darr_t *da)
Definition darr.c:45
int darr_pop(darr_t *da)
Definition darr.c:70
#define DARR_DEFAULT_CAPACITY
Definition darr.h:13
size_t darr_get_size(darr_t *da)
Definition darr.c:37
darr_t * darr_new(void)
Definition darr.c:21
int darr_find(darr_t *da, void *value, compfun_t compare)
Definition darr.c:123
void darr_destroy(darr_t *da)
Definition darr.c:131
int darr_push(darr_t *da, void *value, size_t size)
Definition darr.c:54
int darr_insert_at(darr_t *da, size_t index, void *value, size_t size)
Definition darr.c:86
void * darr_at(darr_t *da, size_t index)
Definition darr.c:50
int darr_delete_at(darr_t *da, size_t index)
Definition darr.c:106
#define T
Definition main.c:13
void test_edge_cases(void)
Definition main.c:116
void test_staticness(void)
Definition main.c:34
bool compare(void const *curr, void const *value)
Definition main.c:111
void test_basic_operations(void)
Definition main.c:59
void test_large_array(void)
Definition main.c:139
int main(void)
Definition main.c:22
Definition darr.h:50