#include #include #include "char/char.h" #include "utils/utils.h" static void test_empty_vector_underflows(void) { printf("[RUN] Testing empty vector boundaries & underflows...\n"); err_t err = ERR_T_INIT; _VecCharInternal vec = VEC_INIT; // 1. Pop back on an empty container must not underflow size_t (0 - 1) _vec_char_pop_back(&vec, &err); assert((err.flags & ERR_SIZE_ZERO) != 0 || err.flags != 0); // 2. Reading back/end of an empty container err = (err_t)ERR_T_INIT; _vec_char_back(&vec, &err); assert(err.flags != 0); // 3. Reserving 0 capacity err = (err_t)ERR_T_INIT; _vec_char_reserve(&vec, 0, &err); assert((err.flags & ERR_SIZE_ZERO) != 0); _vec_char_delete(&vec, &err); printf("[PASS] Empty vector boundaries handled.\n"); } static void test_push_growth_and_shrink(void) { printf("[RUN] Testing push, capacity growth, and indexing...\n"); err_t err = ERR_T_INIT; _VecCharInternal vec = VEC_INIT; // Push elements to trigger initial malloc then realloc for (char c = 'a'; c <= 'z'; c++) { _vec_char_push_back(&vec, c, &err); assert(err.flags == 0); } assert(vec._internal_size == 26); assert(vec._internal_capacity >= 26); // Verify boundary indexing assert(_vec_char_front(&vec, &err) == 'a'); assert(_vec_char_back(&vec, &err) == 'z'); // Index out of bounds check err = (err_t)ERR_T_INIT; _vec_char_at(&vec, 26, &err); assert(err.flags != 0); // Shrink to fit verification err = (err_t)ERR_T_INIT; _vec_char_shrink_to_fit(&vec, &err); assert(vec._internal_capacity == 26); _vec_char_delete(&vec, &err); printf("[PASS] Growth and indexing passed.\n"); } static void test_range_insert_and_erase(void) { printf("[RUN] Testing range insertions and erasures...\n"); err_t err = ERR_T_INIT; _VecCharInternal vec = VEC_INIT; _vec_char_push_back(&vec, 'A', &err); _vec_char_push_back(&vec, 'B', &err); _vec_char_push_back(&vec, 'E', &err); // Single insert between 'B' and 'E' at index 2 _vec_char_insert(&vec, 2, 'C', &err); assert(vec._internal_size == 4); assert(*_vec_char_at(&vec, 2, &err) == 'C'); // Erase test _vec_char_erase(&vec, 2, &err); assert(vec._internal_size == 3); assert(*_vec_char_at(&vec, 2, &err) == 'E'); // Inverted range check: iter_end <= iter_start must report error err = (err_t)ERR_T_INIT; _vec_char_erase(&vec, 2, 1, &err); assert(err.flags != 0); _vec_char_delete(&vec, &err); printf("[PASS] Range insert and erase passed.\n"); } int main(void) { test_empty_vector_underflows(); test_push_growth_and_shrink(); test_range_insert_and_erase(); printf("\nAll char vector edge-case tests passed cleanly!\n"); return 0; }