LCOV - code coverage report
Current view: top level - src/tests - stack.c (source / functions) Hit Total Coverage
Test: passgen-test.info Lines: 186 186 100.0 %
Date: 2024-11-29 06:05:05 Functions: 19 19 100.0 %

          Line data    Source code
       1             : #include "passgen/container/stack.h"
       2             : #include "tests.h"
       3             : #include <stdlib.h>
       4             : 
       5           1 : test_result test_stack_init(void) {
       6             :     passgen_stack stack;
       7           1 :     passgen_stack_init(&stack, sizeof(size_t));
       8           1 :     passgen_stack_free(&stack);
       9           1 :     return test_ok;
      10             : }
      11             : 
      12           1 : test_result test_stack_push_one(void) {
      13             :     passgen_stack stack;
      14           1 :     passgen_stack_init(&stack, sizeof(size_t));
      15           1 :     assert_eq(stack.len, 0);
      16             : 
      17           1 :     size_t value = 2;
      18           1 :     size_t *value_ptr = passgen_stack_push(&stack, &value);
      19           1 :     assert(value_ptr);
      20           1 :     assert_eq(value, *value_ptr);
      21           1 :     assert_eq(stack.len, 1);
      22             : 
      23           1 :     passgen_stack_free(&stack);
      24           1 :     return test_ok;
      25             : }
      26             : 
      27           1 : test_result test_stack_push_multiple(void) {
      28             :     passgen_stack stack;
      29           1 :     passgen_stack_init(&stack, sizeof(size_t));
      30             : 
      31             :     size_t value;
      32             :     size_t *value_ptr;
      33             : 
      34           1 :     value = 1;
      35           1 :     value_ptr = passgen_stack_push(&stack, &value);
      36           1 :     assert(value_ptr);
      37           1 :     assert_eq(value, *value_ptr);
      38           1 :     assert_eq(stack.len, 1);
      39             : 
      40           1 :     value = 2;
      41           1 :     value_ptr = passgen_stack_push(&stack, NULL);
      42           1 :     assert(value_ptr);
      43           1 :     *value_ptr = value;
      44           1 :     assert_eq(value, *value_ptr);
      45           1 :     assert_eq(stack.len, 2);
      46             : 
      47           1 :     value = 3;
      48           1 :     value_ptr = passgen_stack_push(&stack, &value);
      49           1 :     assert(value_ptr);
      50           1 :     assert_eq(value, *value_ptr);
      51           1 :     assert_eq(stack.len, 3);
      52             : 
      53           1 :     passgen_stack_free(&stack);
      54           1 :     return test_ok;
      55             : }
      56             : 
      57           1 : test_result test_stack_push_bin_size(void) {
      58             :     passgen_stack stack;
      59           1 :     passgen_stack_init(&stack, sizeof(size_t));
      60             : 
      61          33 :     for(size_t i = 0; i < stack.bin_size; i++) {
      62          32 :         assert_eq(stack.len, i);
      63          32 :         size_t *value_ptr = passgen_stack_push(&stack, &i);
      64          32 :         assert(value_ptr);
      65          32 :         assert_eq(i, *value_ptr);
      66             :     }
      67             : 
      68           1 :     passgen_stack_free(&stack);
      69           1 :     return test_ok;
      70             : }
      71             : 
      72           1 : test_result test_stack_push_many(void) {
      73             :     passgen_stack stack;
      74           1 :     passgen_stack_init(&stack, sizeof(size_t));
      75           1 :     size_t len_max = 7 * stack.bin_size - 3;
      76             : 
      77         222 :     for(size_t i = 0; i < len_max; i++) {
      78         221 :         assert_eq(stack.len, i);
      79         221 :         size_t *value_ptr = passgen_stack_push(&stack, &i);
      80         221 :         assert(value_ptr);
      81         221 :         assert_eq(i, *value_ptr);
      82             :     }
      83             : 
      84           1 :     assert_eq(stack.len, len_max);
      85           1 :     passgen_stack_free(&stack);
      86           1 :     return test_ok;
      87             : }
      88             : 
      89           1 : test_result test_stack_get_one(void) {
      90             :     passgen_stack stack;
      91           1 :     passgen_stack_init(&stack, sizeof(size_t));
      92             :     size_t *value_ptr;
      93           1 :     size_t value = 1;
      94             : 
      95           1 :     value_ptr = passgen_stack_push(&stack, &value);
      96           1 :     assert(value_ptr);
      97           1 :     assert_eq(value, *value_ptr);
      98             : 
      99           1 :     value_ptr = passgen_stack_get(&stack, 0);
     100           1 :     assert(value_ptr);
     101           1 :     assert_eq(value, *value_ptr);
     102             : 
     103           1 :     passgen_stack_free(&stack);
     104           1 :     return test_ok;
     105             : }
     106             : 
     107           1 : test_result test_stack_get_two(void) {
     108             :     passgen_stack stack;
     109           1 :     passgen_stack_init(&stack, sizeof(size_t));
     110             :     size_t *value_ptr;
     111           1 :     size_t value = 1;
     112             : 
     113           1 :     value_ptr = passgen_stack_push(&stack, &value);
     114           1 :     assert(value_ptr);
     115           1 :     assert_eq(value, *value_ptr);
     116             : 
     117           1 :     value = 2;
     118           1 :     value_ptr = passgen_stack_push(&stack, &value);
     119           1 :     assert(value_ptr);
     120           1 :     assert_eq(value, *value_ptr);
     121             : 
     122           1 :     value_ptr = passgen_stack_get(&stack, 0);
     123           1 :     assert(value_ptr);
     124           1 :     assert_eq(1, *value_ptr);
     125             : 
     126           1 :     value_ptr = passgen_stack_get(&stack, 1);
     127           1 :     assert(value_ptr);
     128           1 :     assert_eq(2, *value_ptr);
     129             : 
     130           1 :     passgen_stack_free(&stack);
     131           1 :     return test_ok;
     132             : }
     133             : 
     134           1 : test_result test_stack_get_many(void) {
     135             :     passgen_stack stack;
     136           1 :     passgen_stack_init(&stack, sizeof(size_t));
     137           1 :     size_t max_len = 7 * stack.bin_size - 3;
     138             : 
     139         222 :     for(size_t i = 0; i < max_len; i++) {
     140         221 :         size_t *value_ptr = passgen_stack_push(&stack, &i);
     141         221 :         assert(value_ptr);
     142         221 :         assert_eq(i, *value_ptr);
     143             :     }
     144             : 
     145         222 :     for(size_t i = 0; i < stack.len; i++) {
     146         221 :         size_t *value_ptr = passgen_stack_get(&stack, i);
     147         221 :         assert(value_ptr);
     148         221 :         assert_eq(i, *value_ptr);
     149             :     }
     150             : 
     151           1 :     passgen_stack_free(&stack);
     152           1 :     return test_ok;
     153             : }
     154             : 
     155           1 : test_result test_stack_top_empty(void) {
     156             :     passgen_stack stack;
     157           1 :     passgen_stack_init(&stack, sizeof(size_t));
     158             : 
     159           1 :     assert(!passgen_stack_top(&stack));
     160             : 
     161           1 :     passgen_stack_free(&stack);
     162           1 :     return test_ok;
     163             : }
     164             : 
     165           1 : test_result test_stack_top_one(void) {
     166             :     passgen_stack stack;
     167           1 :     passgen_stack_init(&stack, sizeof(size_t));
     168             : 
     169           1 :     size_t value = 1;
     170             :     size_t *value_ptr;
     171             : 
     172           1 :     value_ptr = passgen_stack_push(&stack, &value);
     173           1 :     assert(value_ptr);
     174           1 :     assert_eq(value, *value_ptr);
     175             : 
     176             :     // should return the exact same pointer as push did
     177           1 :     assert_eq(value_ptr, passgen_stack_top(&stack));
     178             : 
     179           1 :     passgen_stack_free(&stack);
     180           1 :     return test_ok;
     181             : }
     182             : 
     183           1 : test_result test_stack_top_many(void) {
     184             :     passgen_stack stack;
     185           1 :     passgen_stack_init(&stack, sizeof(size_t));
     186           1 :     size_t len_max = 8 * stack.bin_size;
     187             : 
     188         257 :     for(size_t i = 0; i < len_max; i++) {
     189         256 :         size_t *value_ptr = passgen_stack_push(&stack, &i);
     190         256 :         assert(value_ptr);
     191         256 :         assert_eq(i, *value_ptr);
     192         256 :         assert_eq(value_ptr, passgen_stack_top(&stack));
     193             :     }
     194             : 
     195           1 :     passgen_stack_free(&stack);
     196           1 :     return test_ok;
     197             : }
     198             : 
     199         254 : void element_free(void *data) {
     200         254 :     void **real_data = data;
     201         254 :     free(*real_data);
     202         254 : }
     203             : 
     204           1 : test_result test_stack_foreach_empty(void) {
     205             :     passgen_stack stack;
     206           1 :     passgen_stack_init(&stack, sizeof(size_t));
     207           1 :     passgen_stack_foreach(&stack, element_free);
     208           1 :     passgen_stack_free(&stack);
     209           1 :     return test_ok;
     210             : }
     211             : 
     212           1 : test_result test_stack_foreach_one(void) {
     213             :     passgen_stack stack;
     214           1 :     passgen_stack_init(&stack, sizeof(void *));
     215           1 :     void *data = malloc(255);
     216           1 :     passgen_stack_push(&stack, &data);
     217           1 :     passgen_stack_foreach(&stack, element_free);
     218           1 :     passgen_stack_free(&stack);
     219           1 :     return test_ok;
     220             : }
     221             : 
     222           1 : test_result test_stack_foreach_many(void) {
     223             :     passgen_stack stack;
     224           1 :     passgen_stack_init(&stack, sizeof(void *));
     225           1 :     size_t max_len = 8 * stack.bin_size - 3;
     226             : 
     227         254 :     for(size_t i = 0; i < max_len; i++) {
     228         253 :         void *data = malloc(255);
     229         253 :         passgen_stack_push(&stack, &data);
     230             :     }
     231             : 
     232           1 :     passgen_stack_foreach(&stack, element_free);
     233           1 :     passgen_stack_free(&stack);
     234           1 :     return test_ok;
     235             : }
     236             : 
     237           1 : test_result test_stack_pop_empty(void) {
     238             :     passgen_stack stack;
     239           1 :     passgen_stack_init(&stack, sizeof(size_t));
     240             : 
     241             :     size_t value;
     242           1 :     assert_eq(passgen_stack_pop(&stack, &value), NULL);
     243             : 
     244           1 :     passgen_stack_free(&stack);
     245           1 :     return test_ok;
     246             : }
     247             : 
     248           1 : test_result test_stack_pop_one(void) {
     249             :     passgen_stack stack;
     250           1 :     passgen_stack_init(&stack, sizeof(size_t));
     251             : 
     252           1 :     size_t value = 1;
     253           1 :     passgen_stack_push(&stack, &value);
     254             : 
     255           1 :     size_t top = 0;
     256           1 :     assert_eq(passgen_stack_pop(&stack, &top), &top);
     257           1 :     assert_eq(top, value);
     258             : 
     259           1 :     passgen_stack_free(&stack);
     260           1 :     return test_ok;
     261             : }
     262             : 
     263           1 : test_result test_stack_pop_some(void) {
     264             :     passgen_stack stack;
     265           1 :     passgen_stack_init(&stack, sizeof(size_t));
     266             : 
     267          33 :     for(size_t i = 0; i < stack.bin_size; i++) {
     268          32 :         size_t *value = passgen_stack_push(&stack, &i);
     269          32 :         assert(value);
     270          32 :         assert_eq(*value, i);
     271             :     }
     272             : 
     273          33 :     for(size_t i = 0; i < stack.bin_size; i++) {
     274             :         size_t value;
     275          32 :         size_t *ret = passgen_stack_pop(&stack, &value);
     276          32 :         assert_eq(ret, &value);
     277          32 :         assert_eq(value, stack.len);
     278             :     }
     279             : 
     280           1 :     assert_eq(stack.len, 0);
     281             : 
     282           1 :     passgen_stack_free(&stack);
     283           1 :     return test_ok;
     284             : }
     285             : 
     286           1 : test_result test_stack_pop_many(void) {
     287             :     passgen_stack stack;
     288           1 :     passgen_stack_init(&stack, sizeof(size_t));
     289           1 :     size_t max_len = 7 * stack.bin_size - 3;
     290             : 
     291         222 :     for(size_t i = 0; i < max_len; i++) {
     292         221 :         size_t *value = passgen_stack_push(&stack, &i);
     293         221 :         assert(value);
     294         221 :         assert_eq(*value, i);
     295             :     }
     296             : 
     297         222 :     for(size_t i = 0; i < max_len; i++) {
     298             :         size_t value;
     299         221 :         size_t *ret = passgen_stack_pop(&stack, &value);
     300         221 :         assert_eq(ret, &value);
     301         221 :         assert_eq(value, stack.len);
     302             :     }
     303             : 
     304           1 :     assert_eq(stack.len, 0);
     305             : 
     306           1 :     passgen_stack_free(&stack);
     307           1 :     return test_ok;
     308             : }

Generated by: LCOV version 1.14