inversion-list-check.scm 5.1 KB

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