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
16
void
test_staticness
(
void
);
17
void
test_basic_operations
(
void
);
18
bool
compare
(
void
const
*curr,
void
const
*value);
19
void
test_edge_cases
(
void
);
20
void
test_large_array
(
void
);
21
22
int
main
(
void
) {
23
test_staticness
();
24
test_basic_operations
();
25
test_edge_cases
();
26
test_large_array
();
27
28
puts(
"\nAll tests passed!"
);
29
30
return
0;
31
}
32
33
// Test if the element pointers is easely changed
34
void
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
59
void
test_basic_operations
(
void
) {
60
darr_t
*darr =
darr_new
();
61
62
// Test initial state
63
assert(
darr_get_size
(darr) == 0);
64
assert(
darr_get_capacity
(darr) ==
DARR_DEFAULT_CAPACITY
);
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
111
bool
compare
(
void
const
*curr,
void
const
*value) {
112
return
*(
T
*)curr == *(
T
*)value;
113
}
114
115
// Test function for edge cases
116
void
test_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
139
void
test_large_array
() {
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);
168
assert(
darr_get_capacity
(darr) ==
DARR_DEFAULT_CAPACITY
);
169
170
// Clean up
171
darr_destroy
(darr);
172
printf(
"{test_large_array}\t passed!\n"
);
173
}
darr.h
darr_get_capacity
size_t darr_get_capacity(darr_t *da)
Definition
darr.c:45
darr_pop
int darr_pop(darr_t *da)
Definition
darr.c:70
DARR_DEFAULT_CAPACITY
#define DARR_DEFAULT_CAPACITY
Definition
darr.h:13
darr_get_size
size_t darr_get_size(darr_t *da)
Definition
darr.c:37
darr_new
darr_t * darr_new(void)
Definition
darr.c:21
darr_find
int darr_find(darr_t *da, void *value, compfun_t compare)
Definition
darr.c:123
darr_destroy
void darr_destroy(darr_t *da)
Definition
darr.c:131
darr_push
int darr_push(darr_t *da, void *value, size_t size)
Definition
darr.c:54
darr_insert_at
int darr_insert_at(darr_t *da, size_t index, void *value, size_t size)
Definition
darr.c:86
darr_at
void * darr_at(darr_t *da, size_t index)
Definition
darr.c:50
darr_delete_at
int darr_delete_at(darr_t *da, size_t index)
Definition
darr.c:106
T
#define T
Definition
main.c:13
test_edge_cases
void test_edge_cases(void)
Definition
main.c:116
test_staticness
void test_staticness(void)
Definition
main.c:34
compare
bool compare(void const *curr, void const *value)
Definition
main.c:111
test_basic_operations
void test_basic_operations(void)
Definition
main.c:59
test_large_array
void test_large_array(void)
Definition
main.c:139
main
int main(void)
Definition
main.c:22
darr_t
Definition
darr.h:50
src
main.c
Generated by
1.12.0