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