(library (ubik inversion-lists tests)
(export)
(import (rnrs base)
(srfi n78)
(ubik inversion-lists))
(define (i-list-sum i-list)
(let loop ((cursor (inversion-list-cursor i-list))
(sum 0))
(if (inversion-list-cursor-at-end? cursor)
sum
(loop (inversion-list-cursor-next i-list cursor)
(+ (inversion-list-cursor-ref cursor)
sum)))))
(check (inversion-list-member? 5 (make-empty-inversion-list 0 1000)) => #f)
(check (inversion-list-member? 5 (number->inversion-list 0 1000 5)) => #t)
(check (inversion-list-member? 4 (number->inversion-list 0 1000 5)) => #f)
(check (inversion-list-member? 6 (number->inversion-list 0 1000 5)) => #f)
(check (inversion-list-member? 6 (range->inversion-list 0 1000 500 1000)) => #f)
(check (inversion-list-member? 499 (range->inversion-list 0 1000 500 1000)) => #f)
(check (inversion-list-member? 500 (range->inversion-list 0 1000 500 1000)) => #t)
(check (inversion-list-member? 1000 (range->inversion-list 0 1000 500 1000)) => #t)
(check
(inversion-list-complement
(inversion-list-complement
(range->inversion-list 0 1000 5 10)))
(=> inversion-list=?)
(range->inversion-list 0 1000 5 10))
(check
(inversion-list-complement
(inversion-list-complement
(range->inversion-list 0 1000 0 1000)))
(=> inversion-list=?)
(range->inversion-list 0 1000 0 1000))
(check
(inversion-list-union (range->inversion-list 0 1000 5 10)
(range->inversion-list 0 1000 20 30))
(=> inversion-list=?)
(ranges->inversion-list 0 1000 '(5 . 10) '(20 . 30)))
(check
(inversion-list-union (range->inversion-list 0 1000 5 10)
(range->inversion-list 0 1000 7 8))
(=> inversion-list=?)
(range->inversion-list 0 1000 5 10))
(check
(inversion-list-union (range->inversion-list 0 1000 5 10)
(range->inversion-list 0 1000 7 15))
(=> inversion-list=?)
(range->inversion-list 0 1000 5 15))
(check
(inversion-list-union (range->inversion-list 0 1000 500 1000)
(range->inversion-list 0 1000 0 500))
(=> inversion-list=?)
(range->inversion-list 0 1000 0 1000))
(check
(inversion-list-intersection (range->inversion-list 0 1000 5 10)
(range->inversion-list 0 1000 20 30))
(=> inversion-list=?)
(make-empty-inversion-list 0 1000))
(check
(inversion-list-intersection (range->inversion-list 0 1000 5 10)
(range->inversion-list 0 1000 7 8))
(=> inversion-list=?)
(range->inversion-list 0 1000 7 8))
(check
(inversion-list-intersection (range->inversion-list 0 1000 5 10)
(range->inversion-list 0 1000 7 15))
(=> inversion-list=?)
(range->inversion-list 0 1000 7 10))
(check
(inversion-list-intersection (range->inversion-list 0 1000 500 1000)
(range->inversion-list 0 1000 0 501))
(=> inversion-list=?)
(range->inversion-list 0 1000 500 501))
(check
(inversion-list-intersection (range->inversion-list 0 1000 500 1000)
(range->inversion-list 0 1000 501 505))
(=> inversion-list=?)
(range->inversion-list 0 1000 501 505))
(check
(inversion-list-adjoin (range->inversion-list 0 1000 0 999) 999)
(=> inversion-list=?)
(range->inversion-list 0 1000 0 1000))
(check
(inversion-list-remove (range->inversion-list 0 1000 0 1000) 999)
(=> inversion-list=?)
(range->inversion-list 0 1000 0 999))
(check
(inversion-list-size
(ranges->inversion-list 0 1000 '(5 . 10) '(15 . 20) '(500 . 1000)))
=> 510)
(check
(inversion-list-copy
(ranges->inversion-list 0 1000 '(5 . 10) '(15 . 20) '(500 . 1000)))
(=> inversion-list=?)
(ranges->inversion-list 0 1000 '(5 . 10) '(15 . 20) '(500 . 1000)))
(check
(inversion-list-fold/done?
(lambda (n sum)
(+ n sum))
0
(lambda (sum)
(> sum 250000))
(ranges->inversion-list 0 1000 '(5 . 10) '(15 . 20) '(500 . 1000)))
=>
250781)
(check
(i-list-sum (ranges->inversion-list 0 1000 '(5 . 10) '(15 . 20) '(500 . 1000)))
=> 374870)
(check
(inversion-list-hash (ranges->inversion-list 0 1000 '(5 . 10) '(15 . 20) '(500 . 1000)) 1031)
(=> (lambda (x y) (not (= x y))))
(inversion-list-hash (ranges->inversion-list 0 1000 '(5 . 10) '(500 . 1000)) 1031))
(check-report)
)