70 lines
1.5 KiB
Racket
70 lines
1.5 KiB
Racket
#lang racket
|
|
(require rackunit
|
|
data/heap)
|
|
|
|
(define (mkheap) (vector->heap <= (vector 6 2 4 10 8)))
|
|
|
|
(test-equal? "heap->vector"
|
|
(heap->vector (mkheap))
|
|
'#(2 4 6 8 10))
|
|
|
|
(test-equal? "heap-add! min"
|
|
(let ([h (mkheap)])
|
|
(heap-add! h 0)
|
|
(heap->vector h))
|
|
'#(0 2 4 6 8 10))
|
|
|
|
(test-equal? "heap-add! mid"
|
|
(let ([h (mkheap)])
|
|
(heap-add! h 5)
|
|
(heap->vector h))
|
|
'#(2 4 5 6 8 10))
|
|
|
|
(test-equal? "heap-add! multi"
|
|
(let ([h (mkheap)])
|
|
(heap-add! h 0 5 12)
|
|
(heap->vector h))
|
|
'#(0 2 4 5 6 8 10 12))
|
|
|
|
(test-equal? "heap-remove-min!"
|
|
(let ([h (mkheap)])
|
|
(heap-remove-min! h)
|
|
(heap->vector h))
|
|
'#(4 6 8 10))
|
|
|
|
(define (rand-test range count1 count2 count3)
|
|
(let ([h (make-heap <=)]
|
|
[xs null]) ;; mutated
|
|
(define (fill! count)
|
|
(for ([i (in-range count)])
|
|
(let ([x (random range)])
|
|
(heap-add! h x)
|
|
(set! xs (cons x xs))))
|
|
(set! xs (sort xs <)))
|
|
|
|
(fill! count1)
|
|
|
|
;; check equal (non-destructive)
|
|
(check-equal? (vector->list (heap->vector h))
|
|
xs)
|
|
|
|
(for ([i (in-range count2)])
|
|
(let ([xl (car xs)]
|
|
[xh (heap-min h)])
|
|
(set! xs (cdr xs))
|
|
(heap-remove-min! h)))
|
|
|
|
(fill! count3)
|
|
|
|
(for ([x (in-list xs)])
|
|
(check-equal? (heap-min h) x)
|
|
(heap-remove-min! h))
|
|
|
|
(check-equal? (heap-count h) 0)))
|
|
|
|
(test-case "heap random sparse"
|
|
(rand-test 1000 100 50 100))
|
|
|
|
(test-case "heap random dense"
|
|
(rand-test 20 100 50 100))
|