Files
libvec/tests/test_char.c
T

105 lines
2.6 KiB
C

#include <assert.h>
#include <stdio.h>
#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;
}