hashtable-check.scm 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. ;tests for r6rs hashtables
  2. (define-test-suite r6rs-hashfun-tests)
  3. (define-test-suite r6rs-nexec-tests)
  4. (define-test-suite r6rs-hashtables-simple-tests)
  5. (define-test-suite r6rs-hashtables-extended-tests)
  6. (define-test-suite r6rs-hashtables-tests
  7. (r6rs-hashtables-simple-tests
  8. r6rs-hashfun-tests r6rs-hashtables-extended-tests r6rs-nexec-tests ))
  9. (define-test-case test-set!/ref/keys/entries/delete r6rs-hashtables-simple-tests
  10. (let ((hash-tab (make-eq-hashtable)))
  11. (hashtable-set! hash-tab 8 'lolo)
  12. (hashtable-set! hash-tab 88 'lala)
  13. (hashtable-set! hash-tab 888 'smily)
  14. (hashtable-set! hash-tab 8888 'rofl)
  15. (hashtable-set! hash-tab 88888 'blorf)
  16. (check (hashtable-keys hash-tab) => '#(88888 8888 888 88 8))
  17. (check (call-with-values
  18. (lambda () (hashtable-entries hash-tab))
  19. (lambda (a b) (list a b)))
  20. =>
  21. (list '#(88888 8888 888 88 8)
  22. '#(blorf rofl smily lala lolo)))
  23. (check (hashtable-ref hash-tab 8888 'noval) => 'rofl)
  24. (hashtable-delete! hash-tab 8888)
  25. (check (hashtable-ref hash-tab 8888 'noval) => 'noval)))
  26. (define-test-case create/copy/inspect/contains r6rs-hashtables-simple-tests
  27. (let ((hash-tab (make-hashtable string-hash string=?)))
  28. (hashtable-set! hash-tab "a" 'lolo)
  29. (hashtable-set! hash-tab "b" 'lala)
  30. (hashtable-set! hash-tab "c" 'smily)
  31. (hashtable-set! hash-tab "d" 'rofl)
  32. (hashtable-set! hash-tab "e" 'blorf)
  33. (check (hashtable-contains? hash-tab "a") => #t)
  34. (check (hashtable-contains? hash-tab "g") => #f)
  35. (check (hashtable-size hash-tab) => 5)
  36. (check (hashtable-mutable? hash-tab) => #t)
  37. (check (hashtable-equivalence-function hash-tab) => string=?)
  38. (check (hashtable-hash-function hash-tab) => string-hash)
  39. (let ((mutable-tab (hashtable-copy hash-tab #t)))
  40. (check (hashtable-size mutable-tab) => 5)
  41. (check (hashtable-mutable? mutable-tab) => #t)
  42. (check (hashtable-equivalence-function mutable-tab) => string=?)
  43. (check (hashtable-hash-function mutable-tab) => string-hash))
  44. (let ((immutable-tab (hashtable-copy hash-tab)))
  45. (check (hashtable-size immutable-tab) => 5)
  46. (check (hashtable-mutable? immutable-tab) => #f)
  47. (check (hashtable-equivalence-function immutable-tab) => string=?)
  48. (check (hashtable-hash-function immutable-tab) => string-hash))))
  49. (define-test-case test-set!/clear/update r6rs-hashtables-simple-tests
  50. (let ((hash-tab (make-eq-hashtable 100)))
  51. (hashtable-set! hash-tab 8 'lolo)
  52. (hashtable-set! hash-tab 88 'lala)
  53. (hashtable-set! hash-tab 888 'smily)
  54. (hashtable-set! hash-tab 8888 'rofl)
  55. (check (vector-length (hashtable-keys hash-tab)) => 4)
  56. (hashtable-clear! hash-tab)
  57. (check (vector-length (hashtable-keys hash-tab)) => 0)
  58. (hashtable-set! hash-tab 8 'lolo)
  59. (hashtable-set! hash-tab 88 'lala)
  60. (hashtable-set! hash-tab 888 'smily)
  61. (check (vector-length (hashtable-keys hash-tab)) => 3)
  62. (hashtable-clear! hash-tab 25)
  63. (check (vector-length (hashtable-keys hash-tab)) => 0)
  64. (hashtable-set! hash-tab 8 'lolo)
  65. (hashtable-set! hash-tab 880 'lala)
  66. (check (vector-length (hashtable-keys hash-tab)) => 2)
  67. (check (hashtable-size hash-tab) => 2)
  68. (hashtable-clear! hash-tab 10)
  69. (hashtable-set! hash-tab 8 'lolo)
  70. (hashtable-set! hash-tab 88 'lala)
  71. (hashtable-set! hash-tab 888 'smily)
  72. (check (hashtable-contains? hash-tab 888) => #t)
  73. (hashtable-update! hash-tab 8 (lambda (v) (list v (hashtable-keys hash-tab))) #f)
  74. (check (hashtable-ref hash-tab 8 'noval) => (list 'lolo '#(888 88 8)))))
  75. (define-test-case exception-test r6rs-hashtables-simple-tests
  76. (let ((hash-tab (make-hashtable string-hash string=?)))
  77. (hashtable-set! hash-tab "a" 'lolo)
  78. (hashtable-set! hash-tab "b" 'lala)
  79. (hashtable-set! hash-tab "c" 'smily)
  80. (let ((immutable-tab (hashtable-copy hash-tab)))
  81. (check-exception (hashtable-set! immutable-tab "d" 'rofl))
  82. (check-exception (hashtable-delete! immutable-tab "a"))
  83. (check-exception (hashtable-update! immutable-tab "a" (lambda (v) (list v)) 'no-default)))))
  84. ;; copied from tlc-table-tests
  85. ;; fill a table with objects, delete some, and retrieve them after one
  86. ;; collection
  87. (define max-table-size 1023)
  88. (define table-step 23)
  89. (define min-collect-times 2)
  90. (define max-collect-times 5)
  91. (define-test-case set-n/collect/delete-n/ref-n r6rs-nexec-tests
  92. (do-ec
  93. (:range size 1 max-table-size table-step)
  94. (let* ((table (make-eq-hashtable size))
  95. (n (* 3 size))
  96. (objs (list-ec (: i n) (cons i n)))
  97. (delobjs (list-ec (: i n) (cons (+ i max-table-size) n))))
  98. (do-ec
  99. (:list o delobjs)
  100. (hashtable-set! table o o))
  101. (collect)
  102. (do-ec
  103. (:list o objs)
  104. (hashtable-set! table o o))
  105. (collect)
  106. (do-ec
  107. (:list o delobjs)
  108. (check-that
  109. (hashtable-delete! table o) (opposite (is-false))))
  110. (collect)
  111. (do-ec
  112. (:list o delobjs)
  113. (check
  114. (hashtable-ref table o #f) => #f))
  115. (do-ec
  116. (:list o objs)
  117. (check (hashtable-ref table o #f) => o)))))
  118. (define-test-case immutable-extended r6rs-hashtables-extended-tests
  119. (let ((hash-tab (make-hashtable string-hash string=?)))
  120. (hashtable-set! hash-tab "a" 'lolo)
  121. (hashtable-set! hash-tab "b" 'lala)
  122. (hashtable-set! hash-tab "c" 'smily)
  123. (let ((hash-tab2 (make-hashtable string-hash string=?))
  124. (hash-tab3 (hashtable-copy hash-tab)))
  125. (hashtable-set! hash-tab2 "a2" 'lolo)
  126. (hashtable-set! hash-tab2 "b2" 'lala)
  127. (hashtable-set! hash-tab2 "c2" 'smily)
  128. (hashtable-set! hash-tab "a" hash-tab2)
  129. (hashtable-set! hash-tab "b" hash-tab3)
  130. (let ((hash-tab4 (hashtable-copy hash-tab)))
  131. (check-exception (hashtable-set! (hashtable-ref hash-tab "b" 'blah) "c" 'test))
  132. (check (begin
  133. (hashtable-set!
  134. (hashtable-ref hash-tab4 "a" 'blah)
  135. "a2" 'setit)
  136. (hashtable-ref hash-tab2 "a2" 'noval )) => 'setit)))))
  137. (define-test-case constructor-predicate r6rs-hashtables-simple-tests
  138. (check
  139. (hashtable? (make-hashtable symbol-hash eq? 11)) => #t))
  140. (define-test-case test-hashing r6rs-hashfun-tests
  141. (check (equal-hash "a") => (equal-hash (make-string 1 #\a)))
  142. (check (equal-hash 1024) => (equal-hash (expt 2 10)))
  143. (check (equal-hash '(1 2 3)) => (equal-hash (list 1 2 3)))
  144. (check (string-hash "a") => (string-hash (make-string 1 #\a)))
  145. (check (string-hash "aaaaa") => (string-hash (make-string 5 #\a)))
  146. (check (string-ci-hash "aAaAA") => (string-ci-hash (make-string 5 #\a)))
  147. (check (string-ci-hash "aAaAA") => (string-ci-hash (make-string 5 #\A)))
  148. (check (symbol-hash 'a) => (symbol-hash 'a)))