inversion-list-check.scm 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: Mike Sperber
  3. (define-test-suite inversion-lists-tests)
  4. (define-test-case creation/membership inversion-lists-tests
  5. (check-that (inversion-list-member? 5 (make-empty-inversion-list 0 1000)) (is-false))
  6. (check (inversion-list-member? 5 (number->inversion-list 0 1000 5)))
  7. (check-that (inversion-list-member? 4 (number->inversion-list 0 1000 5)) (is-false))
  8. (check-that (inversion-list-member? 6 (number->inversion-list 0 1000 5)) (is-false))
  9. (check-that (inversion-list-member? 6 (range->inversion-list 0 1000 500 1000)) (is-false))
  10. (check-that (inversion-list-member? 499 (range->inversion-list 0 1000 500 1000)) (is-false))
  11. (check (inversion-list-member? 500 (range->inversion-list 0 1000 500 1000)))
  12. (check (inversion-list-member? 1000 (range->inversion-list 0 1000 500 1000))))
  13. (define-test-case complement/1 inversion-lists-tests
  14. (check-that
  15. (inversion-list-complement
  16. (inversion-list-complement
  17. (range->inversion-list 0 1000 5 10)))
  18. (is inversion-list=?
  19. (range->inversion-list 0 1000 5 10))))
  20. (define-test-case complement/2 inversion-lists-tests
  21. (check-that
  22. (inversion-list-complement
  23. (inversion-list-complement
  24. (range->inversion-list 0 1000 0 1000)))
  25. (is inversion-list=?
  26. (range->inversion-list 0 1000 0 1000))))
  27. (define-test-case union/1 inversion-lists-tests
  28. (check-that
  29. (inversion-list-union (range->inversion-list 0 1000 5 10)
  30. (range->inversion-list 0 1000 20 30))
  31. (is inversion-list=?
  32. (ranges->inversion-list 0 1000 '(5 . 10) '(20 . 30)))))
  33. (define-test-case union/2 inversion-lists-tests
  34. (check-that
  35. (inversion-list-union (range->inversion-list 0 1000 5 10)
  36. (range->inversion-list 0 1000 7 8))
  37. (is inversion-list=?
  38. (range->inversion-list 0 1000 5 10))))
  39. (define-test-case union/3 inversion-lists-tests
  40. (check-that
  41. (inversion-list-union (range->inversion-list 0 1000 5 10)
  42. (range->inversion-list 0 1000 7 15))
  43. (is inversion-list=?
  44. (range->inversion-list 0 1000 5 15))))
  45. (define-test-case union/4 inversion-lists-tests
  46. (check-that
  47. (inversion-list-union (range->inversion-list 0 1000 500 1000)
  48. (range->inversion-list 0 1000 0 500))
  49. (is inversion-list=?
  50. (range->inversion-list 0 1000 0 1000))))
  51. (define-test-case intersection/1 inversion-lists-tests
  52. (check-that
  53. (inversion-list-intersection (range->inversion-list 0 1000 5 10)
  54. (range->inversion-list 0 1000 20 30))
  55. (is inversion-list=?
  56. (make-empty-inversion-list 0 1000))))
  57. (define-test-case intersection/2 inversion-lists-tests
  58. (check-that
  59. (inversion-list-intersection (range->inversion-list 0 1000 5 10)
  60. (range->inversion-list 0 1000 7 8))
  61. (is inversion-list=?
  62. (range->inversion-list 0 1000 7 8))))
  63. (define-test-case intersection/3 inversion-lists-tests
  64. (check-that
  65. (inversion-list-intersection (range->inversion-list 0 1000 5 10)
  66. (range->inversion-list 0 1000 7 15))
  67. (is inversion-list=?
  68. (range->inversion-list 0 1000 7 10))))
  69. (define-test-case intersection/4 inversion-lists-tests
  70. (check-that
  71. (inversion-list-intersection (range->inversion-list 0 1000 500 1000)
  72. (range->inversion-list 0 1000 0 501))
  73. (is inversion-list=?
  74. (range->inversion-list 0 1000 500 501))))
  75. (define-test-case intersection/5 inversion-lists-tests
  76. (check-that
  77. (inversion-list-intersection (range->inversion-list 0 1000 500 1000)
  78. (range->inversion-list 0 1000 501 505))
  79. (is inversion-list=?
  80. (range->inversion-list 0 1000 501 505))))
  81. (define-test-case adjoin inversion-lists-tests
  82. (check-that
  83. (inversion-list-adjoin (range->inversion-list 0 1000 0 999) 999)
  84. (is inversion-list=?
  85. (range->inversion-list 0 1000 0 1000))))
  86. (define-test-case remove inversion-lists-tests
  87. (check-that
  88. (inversion-list-remove (range->inversion-list 0 1000 0 1000) 999)
  89. (is inversion-list=?
  90. (range->inversion-list 0 1000 0 999))))
  91. (define-test-case size inversion-lists-tests
  92. (check
  93. (inversion-list-size
  94. (ranges->inversion-list 0 1000 '(5 . 10) '(15 . 20) '(500 . 1000)))
  95. => 510))
  96. (define-test-case copy inversion-lists-tests
  97. (check-that
  98. (inversion-list-copy
  99. (ranges->inversion-list 0 1000 '(5 . 10) '(15 . 20) '(500 . 1000)))
  100. (is inversion-list=?
  101. (ranges->inversion-list 0 1000 '(5 . 10) '(15 . 20) '(500 . 1000)))))
  102. (define-test-case fold/done? inversion-lists-tests
  103. (check
  104. (inversion-list-fold/done?
  105. (lambda (n sum)
  106. (+ n sum))
  107. 0
  108. (lambda (sum)
  109. (> sum 250000))
  110. (ranges->inversion-list 0 1000 '(5 . 10) '(15 . 20) '(500 . 1000)))
  111. =>
  112. 250781))
  113. (define (i-list-sum i-list)
  114. (let loop ((cursor (inversion-list-cursor i-list))
  115. (sum 0))
  116. (if (inversion-list-cursor-at-end? cursor)
  117. sum
  118. (loop (inversion-list-cursor-next i-list cursor)
  119. (+ (inversion-list-cursor-ref cursor)
  120. sum)))))
  121. (define-test-case cursor inversion-lists-tests
  122. (check
  123. (i-list-sum (ranges->inversion-list 0 1000 '(5 . 10) '(15 . 20) '(500 . 1000)))
  124. => 374870))
  125. (define-test-case hash inversion-lists-tests
  126. (check-that
  127. (inversion-list-hash (ranges->inversion-list 0 1000 '(5 . 10) '(15 . 20) '(500 . 1000)) 1031)
  128. (opposite (is =
  129. (inversion-list-hash (ranges->inversion-list 0 1000 '(5 . 10) '(500 . 1000)) 1031)))))