diff --git a/src/dynamic_array.h b/src/dynamic_array.h index e4cdbfe..764b328 100644 --- a/src/dynamic_array.h +++ b/src/dynamic_array.h @@ -63,6 +63,9 @@ typedef struct { #define array_pop(arr) \ do { \ ArrayHeader *header = array_get_header(arr); \ + if (header->size == 0) { \ + break; \ + } \ header->size--; \ } while (0) diff --git a/src/test_dynamic_array.c b/src/test_dynamic_array.c index 0f23ea6..de49963 100644 --- a/src/test_dynamic_array.c +++ b/src/test_dynamic_array.c @@ -81,6 +81,24 @@ void test_array_pop_decrements_size(void) { } +void test_array_pop_on_empty_is_noop(void) { + int *arr = NULL; + array_create(arr); + + array_push_value(arr, 99); + TEST_ASSERT_EQUAL(1, array_get_header(arr)->size); + TEST_ASSERT_EQUAL(99, arr[0]); + + array_pop(arr); + TEST_ASSERT_EQUAL(0, array_get_header(arr)->size); + + array_pop(arr); // should not underflow + TEST_ASSERT_EQUAL(0, array_get_header(arr)->size); + + array_destroy(arr); +} + + void test_array_get_capacity_default(void) { int *arr = NULL; array_create(arr); @@ -142,6 +160,24 @@ void test_array_values_correct_after_growth(void) { } +void test_array_looping(void) { + int *arr = NULL; + array_create(arr); + + const int num_elements = DYNAMIC_ARRAY_DEFAULT_ARRAY_SIZE * 2; + for (int i = 0; i < num_elements; i++) { + array_push_value(arr, i); + } + + const ArrayHeader *header = array_get_header(arr); + TEST_ASSERT_EQUAL(num_elements, header->size); + + for (int i = 0; i < header->size; i++) { + TEST_ASSERT_EQUAL(i, arr[i]); + } +} + + int main(void) { UNITY_BEGIN(); @@ -152,10 +188,12 @@ int main(void) RUN_TEST(test_array_push_value); RUN_TEST(test_array_push_multiple_values); RUN_TEST(test_array_pop_decrements_size); + RUN_TEST(test_array_pop_on_empty_is_noop); RUN_TEST(test_array_get_capacity_default); RUN_TEST(test_array_size_capacity_relationship); RUN_TEST(test_array_push_beyond_capacity); RUN_TEST(test_array_values_correct_after_growth); + RUN_TEST(test_array_looping); return UNITY_END(); } \ No newline at end of file