From 424e1f2a3eb59b97462c5e15ef13b80c66f4ba1b Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Sun, 10 Apr 2022 10:28:39 +0200 Subject: feat: added tests --- src/stack-array.c | 106 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 74 insertions(+), 32 deletions(-) diff --git a/src/stack-array.c b/src/stack-array.c index 5f4ba41..a36de7b 100644 --- a/src/stack-array.c +++ b/src/stack-array.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -23,37 +24,53 @@ stack_init(struct stack *stack) } /* -->8-- */ -/* --8<-- stack2_push */ -bool -stack_push(struct stack *stack, T data) +/* --8<-- stack2_grow_if_needed */ +static bool +stack_grow_if_needed(struct stack *stack) { - if ( stack->array == NULL ) { - if ( (stack->array = malloc(10 * sizeof *stack->array)) != NULL ) { - stack->sz = 10; - stack->p = 0; + if ( stack->p == stack->sz ) { + if ( stack->array == NULL ) { + static const size_t initial_size = 10; + + if ( (stack->array = reallocarray(NULL, initial_size, sizeof stack->array[0])) != NULL ) { + stack->sz = initial_size; + stack->p = 0; + } + else { + ERROR("out of memory"); + return false; + } } else { - ERROR("out of memory"); - return false; + const size_t new_size = stack->sz * 3 / 2; + + T *new_array; + + if ( (new_array = reallocarray(stack->array, new_size, sizeof stack->array[0])) != NULL ) { + stack->array = new_array; + stack->sz = new_size; + } + else { + ERROR("out of memory"); + return false; + } } } + return true; +} +/* -->8-- */ - if ( stack->p == stack->sz ) { - size_t new_sz; - T * new_array; +/* --8<-- stack2_push */ +bool +stack_push(struct stack *stack, T data) +{ + bool success = stack_grow_if_needed(stack); - if ( (new_array = realloc(stack->array, (new_sz = (stack->sz * 3 / 2)) * sizeof *stack->array)) != NULL ) { - stack->array = new_array; - stack->sz = new_sz; - } - else { - ERROR("out of memory"); - return false; - } + if ( success ) { + stack->array[stack->p++] = data; } - stack->array[stack->p++] = data; - return true; + return success; } /* -->8-- */ @@ -90,26 +107,51 @@ stack_free(struct stack *stack) } /* -->8-- */ -int -main() +void +test_stack(void) { struct stack stack[1]; stack_init(stack); - for ( int i = 0; i != 20; ++i ) + assert(stack_empty(stack) == true); + + for ( int i = 0; i != 5; ++i ) stack_push(stack, i); - while ( !stack_empty(stack) ) { - int i; + assert(stack_empty(stack) == false); - if ( stack_pop(stack, &i) ) - printf("%d\n", i); - else - ERROR("this shouldn't happen!"); - } + T i; + assert(stack_pop(stack, &i) == true); + assert(i == 4); + assert(stack_pop(stack, &i) == true); + assert(i == 3); + assert(stack_pop(stack, &i) == true); + assert(i == 2); + assert(stack_pop(stack, &i) == true); + assert(i == 1); + assert(stack_pop(stack, &i) == true); + assert(i == 0); + + assert(stack_pop(stack, &i) == false); + + assert(stack_empty(stack) == true); + + assert(stack[0].sz == 10); + assert(stack[0].p == 0); + + for ( int i = 0; i != 23; ++i ) + stack_push(stack, i); + + assert(stack[0].sz == 33); + assert(stack[0].p == 23); stack_free(stack); +} +int +main() +{ + test_stack(); return EXIT_SUCCESS; } -- cgit v1.3