diff --git a/src/arraylist.c b/src/arraylist.c index 9bb6685..f29e7b0 100644 --- a/src/arraylist.c +++ b/src/arraylist.c @@ -276,7 +276,7 @@ ArrayListErr arraylist_remove_at(ArrayList *arr, size_t index, void *out) { } if (arr->len < 1) { - return ARRLIST_OK; + return ARRLIST_EMPTY; } if (out != NULL) { @@ -359,11 +359,9 @@ ArrayListErr arraylist_reserve(ArrayList *arr, size_t size_to_reserve) { return ARRLIST_NULL_ARG; } - if (size_to_reserve < 1) { - return ARRLIST_INVALID_CAPACITY; - } + if (arr->capacity + size_to_reserve > SIZE_MAX / arr->elem_size || + size_to_reserve > SIZE_MAX / arr->elem_size) { - if (arr->capacity + size_to_reserve > SIZE_MAX / arr->elem_size) { return ARRLIST_ALLOC_OVERFLOW; } diff --git a/test/test_arraylist.c b/test/test_arraylist.c index dbf9fbf..42942fb 100644 --- a/test/test_arraylist.c +++ b/test/test_arraylist.c @@ -901,6 +901,25 @@ static void test_clear_non_empty_array(void **state) { arraylist_destroy(&arr); } +static void test_clear_already_empty_array(void **state) { + (void) state; + + ArrayList *arr = arraylist_init(64, sizeof(int)); + assert_non_null(arr); + + assert_uint_equal(arraylist_clear(arr), ARRLIST_OK); + + arraylist_destroy(&arr); +} + +static void test_clear_null_array(void **state) { + (void) state; + + ArrayList *arr = NULL; + + assert_uint_equal(arraylist_clear(arr), ARRLIST_NULL_ARG); +} + //Resize static void test_resize_increase_capacity(void **state) { (void) state; @@ -958,23 +977,41 @@ static void test_resize_null_array(void **state) { assert_uint_equal(arraylist_resize(arr, 65), ARRLIST_NULL_ARG); } -static void test_clear_already_empty_array(void **state) { +// Reserve +static void test_reserve_normal_capacity(void **state) { (void) state; ArrayList *arr = arraylist_init(64, sizeof(int)); assert_non_null(arr); - assert_uint_equal(arraylist_clear(arr), ARRLIST_OK); + assert_uint_equal(arraylist_reserve(arr, 32), ARRLIST_OK); + assert_uint_equal(arraylist_capacity(arr), 96); arraylist_destroy(&arr); } -static void test_clear_null_array(void **state) { +static void test_reserve_size_max(void **state) { (void) state; - ArrayList *arr = NULL; + ArrayList *arr = arraylist_init(64, sizeof(int)); + assert_non_null(arr); - assert_uint_equal(arraylist_clear(arr), ARRLIST_NULL_ARG); + assert_uint_equal(arraylist_reserve(arr, SIZE_MAX), ARRLIST_ALLOC_OVERFLOW); + assert_uint_equal(arraylist_capacity(arr), 64); + + arraylist_destroy(&arr); +} + +static void test_reserve_size_0(void **state) { + (void) state; + + ArrayList *arr = arraylist_init(64, sizeof(int)); + assert_non_null(arr); + + assert_uint_equal(arraylist_reserve(arr, 0), ARRLIST_OK); + assert_uint_equal(arraylist_capacity(arr), 64); + + arraylist_destroy(&arr); } int main(void) { @@ -1082,6 +1119,12 @@ int main(void) { cmocka_unit_test(test_resize_null_array), }; + const struct CMUnitTest reserve[] = { + cmocka_unit_test(test_reserve_normal_capacity), + cmocka_unit_test(test_reserve_size_0), + cmocka_unit_test(test_reserve_size_max), + }; + int rc = 0; rc += cmocka_run_group_tests(init, NULL, NULL); @@ -1097,6 +1140,7 @@ int main(void) { rc += cmocka_run_group_tests(set, NULL, NULL); rc += cmocka_run_group_tests(clear, NULL, NULL); rc += cmocka_run_group_tests(resize, NULL, NULL); + rc += cmocka_run_group_tests(reserve, NULL, NULL); return rc; }