105 lines
2.6 KiB
C
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;
|
|
}
|