Dinamic Array
 
Loading...
Searching...
No Matches
main.c File Reference
#include "darr.h"
#include <assert.h>
#include <limits.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

Go to the source code of this file.

Macros

#define T   float
 

Functions

void test_staticness (void)
 
void test_basic_operations (void)
 
bool compare (void const *curr, void const *value)
 
void test_edge_cases (void)
 
void test_large_array (void)
 
int main (void)
 

Macro Definition Documentation

◆ T

#define T   float

Definition at line 13 of file main.c.

Function Documentation

◆ compare()

bool compare ( void const * curr,
void const * value )

Definition at line 111 of file main.c.

111 {
112 return *(T *)curr == *(T *)value;
113}
#define T
Definition main.c:13

◆ main()

int main ( void )

Definition at line 22 of file main.c.

22 {
27
28 puts("\nAll tests passed!");
29
30 return 0;
31}
void test_edge_cases(void)
Definition main.c:116
void test_staticness(void)
Definition main.c:34
void test_basic_operations(void)
Definition main.c:59
void test_large_array(void)
Definition main.c:139

◆ test_basic_operations()

void test_basic_operations ( void )

Definition at line 59 of file main.c.

59 {
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}
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
bool compare(void const *curr, void const *value)
Definition main.c:111
Definition darr.h:50

◆ test_edge_cases()

void test_edge_cases ( void )

Definition at line 116 of file main.c.

116 {
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}

◆ test_large_array()

void test_large_array ( void )

Definition at line 139 of file main.c.

139 {
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}

◆ test_staticness()

void test_staticness ( void )

Definition at line 34 of file main.c.

34 {
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}