diff --git a/src/arraylist.c b/src/arraylist.c index 335605c..9b1b804 100644 --- a/src/arraylist.c +++ b/src/arraylist.c @@ -528,7 +528,7 @@ ArrayListErr arrayslice_peek(const ArraySlice *slice, void *out) { return ARRLIST_NULL_ARG; } - if (slice->current == slice->end) { + if (slice->current >= slice->end) { return ARRLIST_INVALID_SLICE; } @@ -569,7 +569,7 @@ ArrayListErr arrayslice_advance(ArraySlice *slice, size_t n) { return ARRLIST_NULL_ARG; } - if (n > SIZE_MAX - slice->current || slice->current + n >= slice->end) { + if (n > SIZE_MAX - slice->current || slice->current + n > slice->end) { return ARRLIST_OUT_OF_BOUNDS; } diff --git a/test/test_arraylist.c b/test/test_arraylist.c index 3f8b551..596e968 100644 --- a/test/test_arraylist.c +++ b/test/test_arraylist.c @@ -1479,6 +1479,80 @@ static void test_slice_double_destroy(void **state) { arraylist_destroy(&arr); } +// Slice peek +static void test_slice_peek_valid_array(void **state) { + (void) state; + + ArrayList *arr = arraylist_init(64, sizeof(int)); + assert_non_null(arr); + + for (int i = 0; i < 10; i++) { + assert_uint_equal(arraylist_push_back(arr, &i), ARRLIST_OK); + } + + ArraySlice *slice = arraylist_slice(arr, 0, arraylist_size(arr)); + assert_non_null(slice); + + int m; + assert_uint_equal(arrayslice_peek(slice, &m), ARRLIST_OK); + assert_int_equal(m, 0); + + arrayslice_destroy(&slice); + arraylist_destroy(&arr); +} + +static void test_slice_peek_invalid_array(void **state) { + (void) state; + + ArrayList *arr = arraylist_init(64, sizeof(int)); + assert_non_null(arr); + + for (int i = 0; i < 10; i++) { + assert_uint_equal(arraylist_push_back(arr, &i), ARRLIST_OK); + } + + ArraySlice *slice = arraylist_slice(arr, 0, arraylist_size(arr)); + assert_non_null(slice); + + assert_uint_equal(arrayslice_advance(slice, 10), ARRLIST_OK); + + int m; + assert_uint_equal(arrayslice_peek(slice, &m), ARRLIST_INVALID_SLICE); + assert_int_equal(m, 0); + + arrayslice_destroy(&slice); + arraylist_destroy(&arr); +} + +static void test_slice_peek_null_out(void **state) { + (void) state; + + ArrayList *arr = arraylist_init(64, sizeof(int)); + assert_non_null(arr); + + for (int i = 0; i < 10; i++) { + assert_uint_equal(arraylist_push_back(arr, &i), ARRLIST_OK); + } + + ArraySlice *slice = arraylist_slice(arr, 0, arraylist_size(arr)); + assert_non_null(slice); + + assert_uint_equal(arrayslice_peek(slice, NULL), ARRLIST_NULL_ARG); + + arrayslice_destroy(&slice); + arraylist_destroy(&arr); +} + +static void test_slice_peek_null_slice(void **state) { + (void) state; + + ArraySlice *slice = NULL; + + int m; + assert_uint_equal(arrayslice_peek(slice, &m), ARRLIST_NULL_ARG); + assert_int_equal(m, 0); +} + int main(void) { const struct CMUnitTest init[] = { cmocka_unit_test(test_init_valid_parameters), @@ -1626,6 +1700,13 @@ int main(void) { cmocka_unit_test(test_slice_double_destroy), }; + const struct CMUnitTest slice_peek[] = { + cmocka_unit_test(test_slice_peek_valid_array), + cmocka_unit_test(test_slice_peek_invalid_array), + cmocka_unit_test(test_slice_peek_null_slice), + cmocka_unit_test(test_slice_peek_null_out), + }; + int rc = 0; rc += cmocka_run_group_tests(init, NULL, NULL); @@ -1646,6 +1727,7 @@ int main(void) { rc += cmocka_run_group_tests(slice_array, NULL, NULL); rc += cmocka_run_group_tests(slice_array_unsafe, NULL, NULL); rc += cmocka_run_group_tests(slice_destroy, NULL, NULL); + rc += cmocka_run_group_tests(slice_peek, NULL, NULL); return rc; }