Compare commits
1 Commits
main
...
799c090f79
| Author | SHA1 | Date | |
|---|---|---|---|
|
799c090f79
|
@@ -25,53 +25,40 @@ typedef struct {
|
||||
#define array_create(arr) \
|
||||
do { \
|
||||
ArrayHeader* header = \
|
||||
malloc(sizeof(*(arr)) * DYNAMIC_ARRAY_DEFAULT_ARRAY_SIZE + sizeof(ArrayHeader)); \
|
||||
if (header == NULL) { \
|
||||
abort(); \
|
||||
} \
|
||||
malloc(sizeof(*arr) * DYNAMIC_ARRAY_DEFAULT_ARRAY_SIZE + sizeof(ArrayHeader)); \
|
||||
header->size = 0; \
|
||||
header->capacity = DYNAMIC_ARRAY_DEFAULT_ARRAY_SIZE; \
|
||||
\
|
||||
(arr) = (void*)(header + 1); \
|
||||
arr = (void*)(header + 1); \
|
||||
} while (0)
|
||||
|
||||
#define array_get_header(arr) ((arr) ? ((ArrayHeader*)(arr) - 1) : NULL)
|
||||
#define array_get_header(arr) ((ArrayHeader*)(arr) - 1)
|
||||
|
||||
#define array_destroy(arr) \
|
||||
do { \
|
||||
if ((arr) == NULL) { \
|
||||
break; \
|
||||
} \
|
||||
free(array_get_header(arr)); \
|
||||
(arr) = NULL; \
|
||||
arr = NULL; \
|
||||
} while (0)
|
||||
|
||||
#define array_push_value(arr, value) \
|
||||
do { \
|
||||
if ((arr) == NULL) { \
|
||||
array_create(arr); \
|
||||
} \
|
||||
ArrayHeader* header = array_get_header(arr); \
|
||||
if (header->size >= header->capacity) { \
|
||||
if (header->size + 1 > header->capacity) { \
|
||||
size_t new_capacity = header->capacity * DYNAMIC_ARRAY_CAPACITY_FACTOR; \
|
||||
ArrayHeader* new_header = \
|
||||
realloc(header, sizeof(*(arr)) * new_capacity + sizeof(ArrayHeader)); \
|
||||
if (new_header == NULL) { \
|
||||
abort(); \
|
||||
} \
|
||||
realloc(header, sizeof(*arr) * new_capacity + sizeof(ArrayHeader)); \
|
||||
if (new_header != NULL) { \
|
||||
header = new_header; \
|
||||
header->capacity = new_capacity; \
|
||||
(arr) = (void*)(header + 1); \
|
||||
} \
|
||||
(arr)[header->size] = (value); \
|
||||
header->capacity = new_capacity; \
|
||||
arr = (void*)(header + 1); \
|
||||
} \
|
||||
arr[header->size] = value; \
|
||||
header->size++; \
|
||||
} while (0)
|
||||
|
||||
#define array_pop(arr) \
|
||||
do { \
|
||||
if ((arr) == NULL) { \
|
||||
break; \
|
||||
} \
|
||||
ArrayHeader* header = array_get_header(arr); \
|
||||
if (header->size == 0) { \
|
||||
break; \
|
||||
@@ -79,8 +66,4 @@ typedef struct {
|
||||
header->size--; \
|
||||
} while (0)
|
||||
|
||||
#define array_size(arr) ((arr) ? array_get_header(arr)->size : 0)
|
||||
|
||||
#define array_capacity(arr) ((arr) ? array_get_header(arr)->capacity : 0)
|
||||
|
||||
#endif
|
||||
@@ -2,11 +2,11 @@
|
||||
|
||||
#include "dynamic_array.h"
|
||||
|
||||
void setUp(void) {
|
||||
}
|
||||
|
||||
void tearDown(void) {
|
||||
}
|
||||
void setUp(void) {}
|
||||
|
||||
void tearDown(void) {}
|
||||
|
||||
|
||||
void test_array_create_without_options(void) {
|
||||
int *arr = NULL;
|
||||
@@ -18,6 +18,7 @@ void test_array_create_without_options(void) {
|
||||
array_destroy(arr);
|
||||
}
|
||||
|
||||
|
||||
void test_array_destroy(void) {
|
||||
int *arr = NULL;
|
||||
array_create(arr);
|
||||
@@ -25,6 +26,7 @@ void test_array_destroy(void) {
|
||||
TEST_ASSERT_NULL(arr);
|
||||
}
|
||||
|
||||
|
||||
void test_array_size_initial(void) {
|
||||
int *arr = NULL;
|
||||
array_create(arr);
|
||||
@@ -34,6 +36,7 @@ void test_array_size_initial(void) {
|
||||
array_destroy(arr);
|
||||
}
|
||||
|
||||
|
||||
void test_array_push_value(void) {
|
||||
int *arr = NULL;
|
||||
array_create(arr);
|
||||
@@ -46,6 +49,7 @@ void test_array_push_value(void) {
|
||||
array_destroy(arr);
|
||||
}
|
||||
|
||||
|
||||
void test_array_push_multiple_values(void) {
|
||||
int *arr = NULL;
|
||||
array_create(arr);
|
||||
@@ -62,6 +66,7 @@ void test_array_push_multiple_values(void) {
|
||||
array_destroy(arr);
|
||||
}
|
||||
|
||||
|
||||
void test_array_pop_decrements_size(void) {
|
||||
int *arr = NULL;
|
||||
array_create(arr);
|
||||
@@ -75,6 +80,7 @@ void test_array_pop_decrements_size(void) {
|
||||
array_destroy(arr);
|
||||
}
|
||||
|
||||
|
||||
void test_array_pop_on_empty_is_noop(void) {
|
||||
int *arr = NULL;
|
||||
array_create(arr);
|
||||
@@ -92,6 +98,7 @@ void test_array_pop_on_empty_is_noop(void) {
|
||||
array_destroy(arr);
|
||||
}
|
||||
|
||||
|
||||
void test_array_get_capacity_default(void) {
|
||||
int *arr = NULL;
|
||||
array_create(arr);
|
||||
@@ -101,6 +108,7 @@ void test_array_get_capacity_default(void) {
|
||||
array_destroy(arr);
|
||||
}
|
||||
|
||||
|
||||
void test_array_size_capacity_relationship(void) {
|
||||
int *arr = NULL;
|
||||
array_create(arr);
|
||||
@@ -116,6 +124,7 @@ void test_array_size_capacity_relationship(void) {
|
||||
array_destroy(arr);
|
||||
}
|
||||
|
||||
|
||||
void test_array_push_beyond_capacity(void) {
|
||||
int *arr = NULL;
|
||||
array_create(arr);
|
||||
@@ -132,6 +141,7 @@ void test_array_push_beyond_capacity(void) {
|
||||
array_destroy(arr);
|
||||
}
|
||||
|
||||
|
||||
void test_array_values_correct_after_growth(void) {
|
||||
int *arr = NULL;
|
||||
array_create(arr);
|
||||
@@ -149,6 +159,7 @@ void test_array_values_correct_after_growth(void) {
|
||||
array_destroy(arr);
|
||||
}
|
||||
|
||||
|
||||
void test_array_looping(void) {
|
||||
int *arr = NULL;
|
||||
array_create(arr);
|
||||
@@ -166,67 +177,9 @@ void test_array_looping(void) {
|
||||
}
|
||||
}
|
||||
|
||||
/* --- array_get_header branch: NULL arr → returns NULL --- */
|
||||
void test_array_get_header_on_null_returns_null(void) {
|
||||
int* arr = NULL;
|
||||
TEST_ASSERT_NULL(array_get_header(arr));
|
||||
}
|
||||
|
||||
/* --- array_destroy branch: NULL arr → no-op, does not crash --- */
|
||||
void test_array_destroy_on_null_is_noop(void) {
|
||||
int* arr = NULL;
|
||||
array_destroy(arr);
|
||||
TEST_ASSERT_NULL(arr);
|
||||
}
|
||||
|
||||
/* --- array_push_value branch: NULL arr → auto-creates the array --- */
|
||||
void test_array_push_value_on_null_auto_creates(void) {
|
||||
int* arr = NULL;
|
||||
array_push_value(arr, 7);
|
||||
TEST_ASSERT_NOT_NULL(arr);
|
||||
TEST_ASSERT_EQUAL(7, arr[0]);
|
||||
TEST_ASSERT_EQUAL(1, array_get_header(arr)->size);
|
||||
array_destroy(arr);
|
||||
}
|
||||
|
||||
/* --- array_pop branch: NULL arr → no-op, does not crash --- */
|
||||
void test_array_pop_on_null_is_noop(void) {
|
||||
int* arr = NULL;
|
||||
array_pop(arr);
|
||||
TEST_ASSERT_NULL(arr);
|
||||
}
|
||||
|
||||
/* --- array_size branch: NULL arr → 0 --- */
|
||||
void test_array_size_on_null_returns_zero(void) {
|
||||
int* arr = NULL;
|
||||
TEST_ASSERT_EQUAL(0, array_size(arr));
|
||||
}
|
||||
|
||||
/* --- array_size branch: non-NULL arr → current size --- */
|
||||
void test_array_size_returns_current_size(void) {
|
||||
int* arr = NULL;
|
||||
array_create(arr);
|
||||
array_push_value(arr, 1);
|
||||
array_push_value(arr, 2);
|
||||
TEST_ASSERT_EQUAL(2, array_size(arr));
|
||||
array_destroy(arr);
|
||||
}
|
||||
|
||||
/* --- array_capacity branch: NULL arr → 0 --- */
|
||||
void test_array_capacity_on_null_returns_zero(void) {
|
||||
int* arr = NULL;
|
||||
TEST_ASSERT_EQUAL(0, array_capacity(arr));
|
||||
}
|
||||
|
||||
/* --- array_capacity branch: non-NULL arr → current capacity --- */
|
||||
void test_array_capacity_returns_current_capacity(void) {
|
||||
int* arr = NULL;
|
||||
array_create(arr);
|
||||
TEST_ASSERT_EQUAL(DYNAMIC_ARRAY_DEFAULT_ARRAY_SIZE, array_capacity(arr));
|
||||
array_destroy(arr);
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
int main(void)
|
||||
{
|
||||
UNITY_BEGIN();
|
||||
|
||||
RUN_TEST(test_array_create_without_options);
|
||||
@@ -242,14 +195,5 @@ int main(void) {
|
||||
RUN_TEST(test_array_values_correct_after_growth);
|
||||
RUN_TEST(test_array_looping);
|
||||
|
||||
RUN_TEST(test_array_get_header_on_null_returns_null);
|
||||
RUN_TEST(test_array_destroy_on_null_is_noop);
|
||||
RUN_TEST(test_array_push_value_on_null_auto_creates);
|
||||
RUN_TEST(test_array_pop_on_null_is_noop);
|
||||
RUN_TEST(test_array_size_on_null_returns_zero);
|
||||
RUN_TEST(test_array_size_returns_current_size);
|
||||
RUN_TEST(test_array_capacity_on_null_returns_zero);
|
||||
RUN_TEST(test_array_capacity_returns_current_capacity);
|
||||
|
||||
return UNITY_END();
|
||||
}
|
||||
Reference in New Issue
Block a user