#include #include #include #include #include #include #include #include #include "arraylist.h" // INIT static void test_init_valid_parameters(void **state) { (void) state; ArrayList *arr = arraylist_init(64, sizeof(int)); assert_non_null(arr); arraylist_destroy(&arr); } static void test_init_zero_capacity(void **state) { (void) state; ArrayList *arr = arraylist_init(0, sizeof(int)); assert_null(arr); arraylist_destroy(&arr); } static void test_init_zero_elem_size(void **state) { (void) state; ArrayList *arr = arraylist_init(64, 0); assert_null(arr); arraylist_destroy(&arr); } static void test_init_large_capacity(void **state) { (void) state; ArrayList *arr = arraylist_init(SIZE_MAX, sizeof(int)); assert_null(arr); arraylist_destroy(&arr); } // DESTROY static void test_destroy_valid_array(void **state) { (void) state; ArrayList *arr = arraylist_init(64, sizeof(int)); assert_non_null(arr); arraylist_destroy(&arr); assert_null(arr); } static void test_destroy_null_array(void **state) { (void) state; ArrayList *arr = NULL; ArrayListErr err = arraylist_destroy(&arr); assert_null(arr); assert_uint_equal(err, ARRLIST_NULL_ARG); } static void test_destroy_double(void **state) { (void) state; ArrayList *arr = arraylist_init(64, sizeof(int)); assert_non_null(arr); ArrayListErr err = arraylist_destroy(&arr); assert_uint_equal(err, ARRLIST_OK); assert_null(arr); err = arraylist_destroy(&arr); assert_uint_equal(err, ARRLIST_NULL_ARG); assert_null(arr); } // State static void test_capacity_after_init(void **state) { (void) state; ArrayList *arr = arraylist_init(64, sizeof(int)); assert_non_null(arr); assert_uint_equal(arraylist_capacity(arr), 64); arraylist_destroy(&arr); } static void test_is_empty_after_init(void **state) { (void) state; ArrayList *arr = arraylist_init(64, sizeof(int)); assert_non_null(arr); assert_true(arraylist_is_empty(arr)); arraylist_destroy(&arr); } static void test_is_empty_after_push(void **state) { (void) state; ArrayList *arr = arraylist_init(64, sizeof(int)); assert_non_null(arr); int n = 8; assert_uint_equal(arraylist_push_back(arr, &n), ARRLIST_OK); assert_false(arraylist_is_empty(arr)); arraylist_destroy(&arr); } static void test_size_after_many_push(void **state) { (void) state; ArrayList *arr = arraylist_init(64, sizeof(int)); assert_non_null(arr); int n = 8; assert_uint_equal(arraylist_push_back(arr, &n), ARRLIST_OK); assert_uint_equal(arraylist_size(arr), 1); assert_uint_equal(arraylist_push_back(arr, &n), ARRLIST_OK); assert_uint_equal(arraylist_size(arr), 2); assert_uint_equal(arraylist_push_back(arr, &n), ARRLIST_OK); assert_uint_equal(arraylist_size(arr), 3); assert_uint_equal(arraylist_push_back(arr, &n), ARRLIST_OK); assert_uint_equal(arraylist_size(arr), 4); arraylist_destroy(&arr); } static void test_capacity_growth_on_push(void **state) { (void) state; ArrayList *arr = arraylist_init(2, sizeof(int)); assert_non_null(arr); int n = 8; assert_uint_equal(arraylist_push_back(arr, &n), ARRLIST_OK); assert_uint_equal(arraylist_capacity(arr), 2); assert_uint_equal(arraylist_push_back(arr, &n), ARRLIST_OK); assert_uint_equal(arraylist_capacity(arr), 2); assert_uint_equal(arraylist_push_back(arr, &n), ARRLIST_OK); assert_uint_equal(arraylist_capacity(arr), 4); arraylist_destroy(&arr); } static void test_capacity_shrink_on_pop(void **state) { (void) state; ArrayList *arr = arraylist_init(8, sizeof(int)); assert_non_null(arr); int n = 8; assert_uint_equal(arraylist_push_back(arr, &n), ARRLIST_OK); assert_uint_equal(arraylist_pop_back(arr, &n), ARRLIST_OK); assert_uint_equal(arraylist_capacity(arr), 4); arraylist_destroy(&arr); } // push_back static void test_push_back_single_element(void **state) { (void) state; ArrayList *arr = arraylist_init(64, sizeof(int)); assert_non_null(arr); int n = 8; assert_uint_equal(arraylist_push_back(arr, &n), ARRLIST_OK); assert_uint_equal(arraylist_size(arr), 1); int b; assert_uint_equal(arraylist_get(arr, 0, &b), ARRLIST_OK); assert_int_equal(b, 8); arraylist_destroy(&arr); } static void test_push_back_multiple_elements(void **state) { (void) state; ArrayList *arr = arraylist_init(64, sizeof(int)); assert_non_null(arr); int n = 8; assert_uint_equal(arraylist_push_back(arr, &n), ARRLIST_OK); assert_uint_equal(arraylist_size(arr), 1); n = 9; assert_uint_equal(arraylist_push_back(arr, &n), ARRLIST_OK); assert_uint_equal(arraylist_size(arr), 2); n = 10; assert_uint_equal(arraylist_push_back(arr, &n), ARRLIST_OK); assert_uint_equal(arraylist_size(arr), 3); n = 11; assert_uint_equal(arraylist_push_back(arr, &n), ARRLIST_OK); assert_uint_equal(arraylist_size(arr), 4); n = 12; assert_uint_equal(arraylist_push_back(arr, &n), ARRLIST_OK); assert_uint_equal(arraylist_size(arr), 5); int b; assert_uint_equal(arraylist_get(arr, 0, &b), ARRLIST_OK); assert_int_equal(b, 8); assert_uint_equal(arraylist_get(arr, 1, &b), ARRLIST_OK); assert_int_equal(b, 9); assert_uint_equal(arraylist_get(arr, 2, &b), ARRLIST_OK); assert_int_equal(b, 10); assert_uint_equal(arraylist_get(arr, 3, &b), ARRLIST_OK); assert_int_equal(b, 11); assert_uint_equal(arraylist_get(arr, 4, &b), ARRLIST_OK); assert_int_equal(b, 12); arraylist_destroy(&arr); } static void test_push_back_null_array(void **state) { (void) state; ArrayList *arr = NULL; int n = 8; assert_uint_equal(arraylist_push_back(arr, &n), ARRLIST_NULL_ARG); } static void test_push_back_null_data(void **state) { (void) state; ArrayList *arr = arraylist_init(64, sizeof(int)); assert_uint_equal(arraylist_push_back(arr, NULL), ARRLIST_NULL_ARG); arraylist_destroy(&arr); } // Push front static void test_push_front_single_element(void **state) { (void) state; ArrayList *arr = arraylist_init(64, sizeof(int)); assert_non_null(arr); int n = 8; int m; assert_uint_equal(arraylist_push_front(arr, &n), ARRLIST_OK); assert_uint_equal(arraylist_size(arr), 1); assert_uint_equal(arraylist_get(arr, 0, &m), ARRLIST_OK); assert_uint_equal(m, 8); arraylist_destroy(&arr); } static void test_push_front_multiple_elements(void **state) { (void) state; ArrayList *arr = arraylist_init(64, sizeof(int)); assert_non_null(arr); int n = 8; int m; for (size_t i = 0; i < 10; i++) { assert_uint_equal(arraylist_push_front(arr, &n), ARRLIST_OK); assert_uint_equal(arraylist_size(arr), i + 1); assert_uint_equal(arraylist_get(arr, 0, &m), ARRLIST_OK); assert_uint_equal(m, n); n++; } arraylist_destroy(&arr); } static void test_push_front_null_array(void **state) { (void) state; ArrayList *arr = NULL; int n = 8; assert_int_equal(arraylist_push_front(arr, &n), ARRLIST_NULL_ARG); } static void test_push_front_null_data(void **state) { (void) state; ArrayList *arr = arraylist_init(64, sizeof(int)); assert_non_null(arr); assert_int_equal(arraylist_push_front(arr, NULL), ARRLIST_NULL_ARG); arraylist_destroy(&arr); } // Insert static void test_insert_at_beginning(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); } int n = 8; int m; assert_uint_equal(arraylist_size(arr), 10); assert_uint_equal(arraylist_insert(arr, 0, &n), ARRLIST_OK); assert_uint_equal(arraylist_get(arr, 0, &m), ARRLIST_OK); assert_uint_equal(arraylist_size(arr), 11); assert_uint_equal(n, m); arraylist_destroy(&arr); } static void test_insert_at_middle(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); } int n = 8; int m; assert_uint_equal(arraylist_size(arr), 10); assert_uint_equal(arraylist_insert(arr, 5, &n), ARRLIST_OK); assert_uint_equal(arraylist_get(arr, 5, &m), ARRLIST_OK); assert_uint_equal(arraylist_size(arr), 11); assert_uint_equal(n, m); arraylist_destroy(&arr); } static void test_insert_at_end(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); } int n = 8; int m; assert_uint_equal(arraylist_size(arr), 10); assert_uint_equal(arraylist_insert(arr, 10, &n), ARRLIST_OK); assert_uint_equal(arraylist_get(arr, 10, &m), ARRLIST_OK); assert_uint_equal(arraylist_size(arr), 11); assert_uint_equal(n, m); arraylist_destroy(&arr); } static void test_insert_at_invalid_index(void **state) { (void) state; ArrayList *arr = arraylist_init(64, sizeof(int)); assert_non_null(arr); int n = 8; assert_uint_equal(arraylist_insert(arr, 80, &n), ARRLIST_OUT_OF_BOUNDS); arraylist_destroy(&arr); } static void test_insert_null_array(void **state) { (void) state; ArrayList *arr = NULL; int n = 8; assert_uint_equal(arraylist_insert(arr, 0, &n), ARRLIST_NULL_ARG); } static void test_insert_null_data(void **state) { (void) state; ArrayList *arr = arraylist_init(64, sizeof(int)); assert_non_null(arr); assert_uint_equal(arraylist_insert(arr, 0, NULL), ARRLIST_NULL_ARG); arraylist_destroy(&arr); } // Pop back static void test_pop_back_single_element(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); } int m; assert_uint_equal(arraylist_pop_back(arr, &m), ARRLIST_OK); assert_uint_equal(m, 9); arraylist_destroy(&arr); } static void test_pop_back_multiple_elements(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); } int m; for (int i = 9; i >= 5; i--) { assert_uint_equal(arraylist_pop_back(arr, &m), ARRLIST_OK); assert_uint_equal(arraylist_size(arr), i); assert_uint_equal(m, i); } arraylist_destroy(&arr); } static void test_pop_back_until_empty(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); } int m; for (int i = 9; i >= 0; i--) { assert_uint_equal(arraylist_pop_back(arr, &m), ARRLIST_OK); assert_uint_equal(arraylist_size(arr), i); assert_uint_equal(m, i); } assert_uint_equal(arraylist_pop_back(arr, &m), ARRLIST_EMPTY); arraylist_destroy(&arr); } static void test_pop_back_empty_array(void **state) { (void) state; ArrayList *arr = arraylist_init(64, sizeof(int)); assert_non_null(arr); int n; assert_uint_equal(arraylist_pop_back(arr, &n), ARRLIST_EMPTY); arraylist_destroy(&arr); } static void test_pop_back_null_array(void **state) { (void) state; ArrayList *arr = NULL; int n; assert_uint_equal(arraylist_pop_back(arr, &n), ARRLIST_NULL_ARG); } static void test_pop_back_null_out(void **state) { (void) state; ArrayList *arr = arraylist_init(64, sizeof(int)); assert_non_null(arr); int n = 8; assert_uint_equal(arraylist_push_back(arr, &n), ARRLIST_OK); assert_uint_equal(arraylist_pop_back(arr, NULL), ARRLIST_OK); arraylist_destroy(&arr); } // Pop front static void test_pop_front_single_element(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); } int m; assert_uint_equal(arraylist_pop_front(arr, &m), ARRLIST_OK); assert_uint_equal(m, 0); arraylist_destroy(&arr); } static void test_pop_front_multiple_elements(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); } int m; size_t size = arraylist_size(arr); for (int i = 0; i < 6; i++) { assert_uint_equal(arraylist_pop_front(arr, &m), ARRLIST_OK); assert_uint_equal(arraylist_size(arr), size - (i + 1)); assert_uint_equal(m, i); } arraylist_destroy(&arr); } static void test_pop_front_until_empty(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); } int m; size_t size = arraylist_size(arr); for (int i = 0; i < 10; i++) { assert_uint_equal(arraylist_pop_front(arr, &m), ARRLIST_OK); assert_uint_equal(arraylist_size(arr), size - (i + 1)); assert_uint_equal(m, i); } assert_uint_equal(arraylist_pop_front(arr, &m), ARRLIST_EMPTY); arraylist_destroy(&arr); } static void test_pop_front_empty_array(void **state) { (void) state; ArrayList *arr = arraylist_init(64, sizeof(int)); assert_non_null(arr); int n; assert_uint_equal(arraylist_pop_front(arr, &n), ARRLIST_EMPTY); arraylist_destroy(&arr); } static void test_pop_front_null_array(void **state) { (void) state; ArrayList *arr = NULL; int n; assert_uint_equal(arraylist_pop_front(arr, &n), ARRLIST_NULL_ARG); } static void test_pop_front_null_out(void **state) { (void) state; ArrayList *arr = arraylist_init(64, sizeof(int)); assert_non_null(arr); int n = 8; assert_uint_equal(arraylist_push_back(arr, &n), ARRLIST_OK); assert_uint_equal(arraylist_pop_front(arr, NULL), ARRLIST_OK); arraylist_destroy(&arr); } int main(void) { const struct CMUnitTest init[] = { cmocka_unit_test(test_init_valid_parameters), cmocka_unit_test(test_init_zero_capacity), cmocka_unit_test(test_init_zero_elem_size), cmocka_unit_test(test_init_large_capacity), }; const struct CMUnitTest destroy[] = { cmocka_unit_test(test_destroy_valid_array), cmocka_unit_test(test_destroy_null_array), cmocka_unit_test(test_destroy_double), }; const struct CMUnitTest state[] = { cmocka_unit_test(test_capacity_after_init), cmocka_unit_test(test_is_empty_after_init), cmocka_unit_test(test_is_empty_after_push), cmocka_unit_test(test_size_after_many_push), cmocka_unit_test(test_capacity_growth_on_push), cmocka_unit_test(test_capacity_shrink_on_pop), }; const struct CMUnitTest push_back[] = { cmocka_unit_test(test_push_back_single_element), cmocka_unit_test(test_push_back_multiple_elements), cmocka_unit_test(test_push_back_null_array), cmocka_unit_test(test_push_back_null_data), }; const struct CMUnitTest push_front[] = { cmocka_unit_test(test_push_front_single_element), cmocka_unit_test(test_push_front_multiple_elements), cmocka_unit_test(test_push_front_null_array), cmocka_unit_test(test_push_front_null_data), }; const struct CMUnitTest insert[] = { cmocka_unit_test(test_insert_at_beginning), cmocka_unit_test(test_insert_at_middle), cmocka_unit_test(test_insert_at_end), cmocka_unit_test(test_insert_at_invalid_index), cmocka_unit_test(test_insert_null_array), cmocka_unit_test(test_insert_null_data), }; const struct CMUnitTest pop_back[] = { cmocka_unit_test(test_pop_back_single_element), cmocka_unit_test(test_pop_back_multiple_elements), cmocka_unit_test(test_pop_back_until_empty), cmocka_unit_test(test_pop_back_empty_array), cmocka_unit_test(test_pop_back_null_array), cmocka_unit_test(test_pop_back_null_out), }; const struct CMUnitTest pop_front[] = { cmocka_unit_test(test_pop_front_single_element), cmocka_unit_test(test_pop_front_multiple_elements), cmocka_unit_test(test_pop_front_until_empty), cmocka_unit_test(test_pop_front_empty_array), cmocka_unit_test(test_pop_front_null_array), cmocka_unit_test(test_pop_front_null_out), }; int rc = 0; rc += cmocka_run_group_tests(init, NULL, NULL); rc += cmocka_run_group_tests(destroy, NULL, NULL); rc += cmocka_run_group_tests(state, NULL, NULL); rc += cmocka_run_group_tests(push_back, NULL, NULL); rc += cmocka_run_group_tests(push_front, NULL, NULL); rc += cmocka_run_group_tests(insert, NULL, NULL); rc += cmocka_run_group_tests(pop_back, NULL, NULL); rc += cmocka_run_group_tests(pop_front, NULL, NULL); return rc; }