tconc-queue-check.scm 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: Marcus Crestani
  3. (define-test-suite tconc-queue-tests)
  4. (define max-queue-size 999)
  5. (define (check-raises-assertion-violation thunk source)
  6. (call-with-current-continuation
  7. (lambda (esc)
  8. (with-exception-handler
  9. (lambda (c)
  10. (esc
  11. (call-with-values
  12. (lambda () (decode-condition c))
  13. (lambda (type who message more-stuff)
  14. (check type => 'assertion-violation)
  15. (check who => source)))))
  16. (lambda ()
  17. (thunk)
  18. (check #f => 'should-never-reach-this-point))))))
  19. (define-test-case constructor-predicate tconc-queue-tests
  20. (check-that
  21. (tconc-queue? (make-tconc-queue))
  22. (is-true)))
  23. (define-test-case empty tconc-queue-tests
  24. (check-that
  25. (tconc-queue-empty? (make-tconc-queue))
  26. (is-true)))
  27. (define-test-case non-empty tconc-queue-tests
  28. (let ((q (make-tconc-queue)))
  29. (tconc-queue-enqueue! q 23)
  30. (check-that
  31. (tconc-queue-empty? q)
  32. (is-false))))
  33. (define-test-case dequeue-empty tconc-queue-tests
  34. (let ((q (make-tconc-queue)))
  35. (check-raises-assertion-violation
  36. (lambda () (tconc-queue-dequeue! q))
  37. 'tconc-queue-dequeue)))
  38. (define-test-case peek-empty tconc-queue-tests
  39. (let ((q (make-tconc-queue)))
  40. (check-raises-assertion-violation
  41. (lambda () (tconc-queue-peek q))
  42. 'tconc-queue-peek)))
  43. (define-test-case size tconc-queue-tests
  44. (do-ec
  45. (:range n 0 max-queue-size)
  46. (let ((q (make-tconc-queue)))
  47. (do-ec
  48. (:range m 0 n)
  49. (tconc-queue-enqueue! q m))
  50. (check (tconc-queue-size q) => n)
  51. (check-that (tconc-queue? q) (is-true)))))
  52. (define-test-case dequeue-1 tconc-queue-tests
  53. (let ((q (make-tconc-queue)))
  54. (tconc-queue-enqueue! q 23)
  55. (check-that (tconc-queue? q) (is-true))
  56. (check (tconc-queue-peek q) => 23)
  57. (check (tconc-queue-dequeue! q) => 23)
  58. (check-that (tconc-queue? q) (is-true))))
  59. (define-test-case dequeue-2 tconc-queue-tests
  60. (let ((q (make-tconc-queue)))
  61. (tconc-queue-enqueue! q 23)
  62. (check-that (tconc-queue? q) (is-true))
  63. (tconc-queue-enqueue! q 42)
  64. (check-that (tconc-queue? q) (is-true))
  65. (check (tconc-queue-peek q) => 23)
  66. (check (tconc-queue-dequeue! q) => 23)
  67. (check-that (tconc-queue? q) (is-true))
  68. (check (tconc-queue-peek q) => 42)
  69. (check (tconc-queue-dequeue! q) => 42)
  70. (check-that (tconc-queue? q) (is-true))))
  71. (define-test-case en/dequeue-2 tconc-queue-tests
  72. (let ((q (make-tconc-queue)))
  73. (tconc-queue-enqueue! q 23)
  74. (check (tconc-queue-peek q) => 23)
  75. (check (tconc-queue-dequeue! q) => 23)
  76. (tconc-queue-enqueue! q 42)
  77. (check (tconc-queue-peek q) => 42)
  78. (check (tconc-queue-dequeue! q) => 42)))
  79. (define-test-case en/dequeue-3 tconc-queue-tests
  80. (let ((q (make-tconc-queue)))
  81. (tconc-queue-enqueue! q 23)
  82. (check-that (tconc-queue? q) (is-true))
  83. (tconc-queue-enqueue! q 65)
  84. (check-that (tconc-queue? q) (is-true))
  85. (check (tconc-queue-peek q) => 23)
  86. (check (tconc-queue-dequeue! q) => 23)
  87. (check (tconc-queue-peek q) => 65)
  88. (check (tconc-queue-dequeue! q) => 65)
  89. (tconc-queue-enqueue! q 42)
  90. (check-that (tconc-queue? q) (is-true))
  91. (check (tconc-queue-peek q) => 42)
  92. (check (tconc-queue-dequeue! q) => 42)))
  93. (define-test-case enqueue-n/dequeue-n tconc-queue-tests
  94. (do-ec
  95. (:range n 0 max-queue-size)
  96. (let ((q (make-tconc-queue)))
  97. (do-ec
  98. (:range m 0 n)
  99. (begin
  100. (tconc-queue-enqueue! q m)
  101. (check (tconc-queue-peek q) => 0)))
  102. (check-that (tconc-queue? q) (is-true))
  103. (check (tconc-queue-size q) => n)
  104. (do-ec
  105. (:range m 0 n)
  106. (begin
  107. (check (tconc-queue-peek q) => m)
  108. (check (tconc-queue-dequeue! q) => m)))
  109. (check-that (tconc-queue? q) (is-true))
  110. (check (tconc-queue-size q) => 0)
  111. (check-raises-assertion-violation
  112. (lambda () (tconc-queue-peek q))
  113. 'tconc-queue-peek)
  114. (check-raises-assertion-violation
  115. (lambda () (tconc-queue-dequeue! q))
  116. 'tconc-queue-dequeue))))
  117. (define-test-case en/dequeue-n tconc-queue-tests
  118. (do-ec
  119. (:range n 0 max-queue-size)
  120. (let ((q (make-tconc-queue)))
  121. (do-ec
  122. (:range m 0 n)
  123. (begin
  124. (tconc-queue-enqueue! q m)
  125. (check (tconc-queue-size q) => 1)
  126. (check-that (tconc-queue? q) (is-true))
  127. (check (tconc-queue-peek q) => m)
  128. (check (tconc-queue-dequeue! q) => m)
  129. (check-that (tconc-queue? q) (is-true))
  130. (check (tconc-queue-size q) => 0)))
  131. (check-raises-assertion-violation
  132. (lambda () (tconc-queue-peek q))
  133. 'tconc-queue-peek)
  134. (check-raises-assertion-violation
  135. (lambda () (tconc-queue-dequeue! q))
  136. 'tconc-queue-dequeue))))
  137. (define-test-case en/clear/dequeue-n tconc-queue-tests
  138. (let ((q (make-tconc-queue)))
  139. (do-ec
  140. (:range n 0 max-queue-size)
  141. (begin
  142. (tconc-queue-clear! q)
  143. (check-that (tconc-queue-empty? q) (is-true))
  144. (do-ec
  145. (:range m 0 n)
  146. (begin
  147. (tconc-queue-enqueue! q m)
  148. (check (tconc-queue-size q) => 1)
  149. (check-that (tconc-queue? q) (is-true))
  150. (check (tconc-queue-peek q) => m)
  151. (check (tconc-queue-dequeue! q) => m)
  152. (check-that (tconc-queue? q) (is-true))
  153. (check (tconc-queue-size q) => 0)))
  154. (check-raises-assertion-violation
  155. (lambda () (tconc-queue-peek q))
  156. 'tconc-queue-peek)
  157. (check-raises-assertion-violation
  158. (lambda () (tconc-queue-dequeue! q))
  159. 'tconc-queue-dequeue)))))