test_vecdeque.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. #include "common.h"
  2. #include <assert.h>
  3. #include "util/vecdeque.h"
  4. #define pr(pv) \
  5. ({ \
  6. fprintf(stderr, "cap=%lu origin=%lu size=%lu\n", (pv)->cap, (pv)->origin, (pv)->size); \
  7. for (size_t i = 0; i < (pv)->cap; ++i) \
  8. fprintf(stderr, "%d ", (pv)->data[i]); \
  9. fprintf(stderr, "\n"); \
  10. })
  11. static void test_vecdeque_push_pop(void) {
  12. struct SC_VECDEQUE(int) vdq = SC_VECDEQUE_INITIALIZER;
  13. assert(sc_vecdeque_is_empty(&vdq));
  14. assert(sc_vecdeque_size(&vdq) == 0);
  15. bool ok = sc_vecdeque_push(&vdq, 5);
  16. assert(ok);
  17. assert(sc_vecdeque_size(&vdq) == 1);
  18. ok = sc_vecdeque_push(&vdq, 12);
  19. assert(ok);
  20. assert(sc_vecdeque_size(&vdq) == 2);
  21. int v = sc_vecdeque_pop(&vdq);
  22. assert(v == 5);
  23. assert(sc_vecdeque_size(&vdq) == 1);
  24. ok = sc_vecdeque_push(&vdq, 7);
  25. assert(ok);
  26. assert(sc_vecdeque_size(&vdq) == 2);
  27. int *p = sc_vecdeque_popref(&vdq);
  28. assert(p);
  29. assert(*p == 12);
  30. assert(sc_vecdeque_size(&vdq) == 1);
  31. v = sc_vecdeque_pop(&vdq);
  32. assert(v == 7);
  33. assert(sc_vecdeque_size(&vdq) == 0);
  34. assert(sc_vecdeque_is_empty(&vdq));
  35. sc_vecdeque_destroy(&vdq);
  36. }
  37. static void test_vecdeque_reserve(void) {
  38. struct SC_VECDEQUE(int) vdq = SC_VECDEQUE_INITIALIZER;
  39. bool ok = sc_vecdeque_reserve(&vdq, 20);
  40. assert(ok);
  41. assert(vdq.cap == 20);
  42. assert(sc_vecdeque_size(&vdq) == 0);
  43. for (size_t i = 0; i < 20; ++i) {
  44. ok = sc_vecdeque_push(&vdq, i);
  45. assert(ok);
  46. }
  47. assert(sc_vecdeque_size(&vdq) == 20);
  48. // It is now full
  49. for (int i = 0; i < 5; ++i) {
  50. int v = sc_vecdeque_pop(&vdq);
  51. assert(v == i);
  52. }
  53. assert(sc_vecdeque_size(&vdq) == 15);
  54. for (int i = 20; i < 25; ++i) {
  55. ok = sc_vecdeque_push(&vdq, i);
  56. assert(ok);
  57. }
  58. assert(sc_vecdeque_size(&vdq) == 20);
  59. assert(vdq.cap == 20);
  60. // Now, the content wraps around the ring buffer:
  61. // 20 21 22 23 24 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
  62. // ^
  63. // origin
  64. // It is now full, let's reserve some space
  65. ok = sc_vecdeque_reserve(&vdq, 30);
  66. assert(ok);
  67. assert(vdq.cap == 30);
  68. assert(sc_vecdeque_size(&vdq) == 20);
  69. for (int i = 0; i < 20; ++i) {
  70. // We should retrieve the items we inserted in order
  71. int v = sc_vecdeque_pop(&vdq);
  72. assert(v == i + 5);
  73. }
  74. assert(sc_vecdeque_size(&vdq) == 0);
  75. sc_vecdeque_destroy(&vdq);
  76. }
  77. static void test_vecdeque_grow(void) {
  78. struct SC_VECDEQUE(int) vdq = SC_VECDEQUE_INITIALIZER;
  79. bool ok = sc_vecdeque_reserve(&vdq, 20);
  80. assert(ok);
  81. assert(vdq.cap == 20);
  82. assert(sc_vecdeque_size(&vdq) == 0);
  83. for (int i = 0; i < 500; ++i) {
  84. ok = sc_vecdeque_push(&vdq, i);
  85. assert(ok);
  86. }
  87. assert(sc_vecdeque_size(&vdq) == 500);
  88. for (int i = 0; i < 100; ++i) {
  89. int v = sc_vecdeque_pop(&vdq);
  90. assert(v == i);
  91. }
  92. assert(sc_vecdeque_size(&vdq) == 400);
  93. for (int i = 500; i < 1000; ++i) {
  94. ok = sc_vecdeque_push(&vdq, i);
  95. assert(ok);
  96. }
  97. assert(sc_vecdeque_size(&vdq) == 900);
  98. for (int i = 100; i < 1000; ++i) {
  99. int v = sc_vecdeque_pop(&vdq);
  100. assert(v == i);
  101. }
  102. assert(sc_vecdeque_size(&vdq) == 0);
  103. sc_vecdeque_destroy(&vdq);
  104. }
  105. static void test_vecdeque_push_hole(void) {
  106. struct SC_VECDEQUE(int) vdq = SC_VECDEQUE_INITIALIZER;
  107. bool ok = sc_vecdeque_reserve(&vdq, 20);
  108. assert(ok);
  109. assert(vdq.cap == 20);
  110. assert(sc_vecdeque_size(&vdq) == 0);
  111. for (int i = 0; i < 20; ++i) {
  112. int *p = sc_vecdeque_push_hole(&vdq);
  113. assert(p);
  114. *p = i * 10;
  115. }
  116. assert(sc_vecdeque_size(&vdq) == 20);
  117. for (int i = 0; i < 10; ++i) {
  118. int v = sc_vecdeque_pop(&vdq);
  119. assert(v == i * 10);
  120. }
  121. assert(sc_vecdeque_size(&vdq) == 10);
  122. for (int i = 20; i < 30; ++i) {
  123. int *p = sc_vecdeque_push_hole(&vdq);
  124. assert(p);
  125. *p = i * 10;
  126. }
  127. assert(sc_vecdeque_size(&vdq) == 20);
  128. for (int i = 10; i < 30; ++i) {
  129. int v = sc_vecdeque_pop(&vdq);
  130. assert(v == i * 10);
  131. }
  132. assert(sc_vecdeque_size(&vdq) == 0);
  133. sc_vecdeque_destroy(&vdq);
  134. }
  135. int main(int argc, char *argv[]) {
  136. (void) argc;
  137. (void) argv;
  138. test_vecdeque_push_pop();
  139. test_vecdeque_reserve();
  140. test_vecdeque_grow();
  141. test_vecdeque_push_hole();
  142. return 0;
  143. }