Carp/test/heap.carp

234 lines
7.2 KiB
Plaintext

(use Heap)
(load "Test.carp")
(use Test)
(deftest test
(let-do [arr [1 3 4 2 6 1]
exp [1 2 1 3 6 4]]
(MinHeap.heapify! &arr)
(assert-equal test
&exp
&arr
"MinHeap.heapify! works 1"))
(let-do [arr [1 1 2 3 6 4]
exp [1 1 2 3 6 4 4]]
(MinHeap.push! &arr 4)
(assert-equal test
&exp
&arr
"MinHeap.push! works I"))
(let-do [arr [1 1 2 3 6 4]
exp [0 1 1 3 6 4 2]]
(MinHeap.push! &arr 0)
(assert-equal test
&exp
&arr
"MinHeap.push! works II"))
(let-do [arr [1 1 2 3 6 4]
exp []
one (MinHeap.pop! &arr)
one2 (MinHeap.pop! &arr)
two (MinHeap.pop! &arr)
three (MinHeap.pop! &arr)
four (MinHeap.pop! &arr)
six (MinHeap.pop! &arr)]
(assert-equal test
&exp
&arr
"MinHeap.pop! works as expected"))
; walk through MaxHeap.heapify! checking each step.
(let-do [arr [20 0 10 21 11]
exp [20 0 10 21 11]]
(MaxHeap.push-up! &arr 1)
(assert-equal test
&arr
&exp
"MaxHeap.push-up! works 1"))
(let-do [arr [20 0 10 21 11]
exp [20 0 10 21 11]]
(MaxHeap.push-up! &arr 2)
(assert-equal test
&arr
&exp
"MaxHeap.push-up! works 2"))
(let-do [arr [20 0 10 21 11]
exp [21 20 10 0 11]]
(MaxHeap.push-up! &arr 3)
(assert-equal test
&arr
&exp
"MaxHeap.push-up! works 3"))
(let-do [arr [21 20 10 0 11]
exp [21 20 10 0 11]]
(MaxHeap.push-up! &arr 4)
(assert-equal test
&arr
&exp
"MaxHeap.push-up! works 4"))
(let-do [arr [1 3 4 2 6 1]
exp [6 4 3 1 2 1]]
(MaxHeap.heapify! &arr)
(assert-equal test
&exp
&arr
"MaxHeap.heapify! works 1"))
(let-do [arr [20 0 10]
exp [20 0 10]]
(MaxHeap.heapify! &arr)
(assert-equal test
&arr
&exp
"MaxHeap.Heapify works 2"))
(let-do [arr [20 0 10 21]
exp [21 20 10 0]]
(MaxHeap.heapify! &arr)
(assert-equal test
&arr
&exp
"MaxHeap.Heapify 3 works"))
(let-do [arr [20 0 10 21 11]
exp [21 20 10 0 11]]
(MaxHeap.heapify! &arr)
(assert-equal test
&arr
&exp
"MaxHeap.Heapify 4 works"))
; check that push-down-until! ignored the trailing elements (100, 200, 300)
; and considers both children (right child max)
(let-do [arr [3 4 6 2 1 1 100 200 300]
exp [6 4 3 2 1 1 100 200 300]]
(MaxHeap.push-down-until! &arr 0 5)
(assert-equal test
&exp
&arr
"MaxHeap.push-down-until! works I (right)"))
; check that push-down-until! ignored the trailing elements (100, 200, 300)
; and considers both children (left child max)
(let-do [arr [3 6 4 2 1 1 100 200 300]
exp [6 3 4 2 1 1 100 200 300]]
(MaxHeap.push-down-until! &arr 0 5)
(assert-equal test
&exp
&arr
"MaxHeap.push-down-until! works II (left)"))
(let-do [arr [1 3 4 2 6 1]
exp [1 1 2 3 4 6]]
(HeapSort.sort! &arr)
(assert-equal test
&exp
&arr
"HeapSort.sort! works"))
(let-do [res (HeapSort.sort [1 3 4 2 6 1])
exp [1 1 2 3 4 6]]
(assert-equal test
&exp
&res
"HeapSort.sort works"))
(let-do [arr [1 3 4 2 6 1]
exp [1 1 2 3 4 6]
res (HeapSort.sorted &arr)]
(assert-equal test
&exp
&res
"HeapSort.sorted works"))
; Check that HeapSort.sorted does not modify input array
(let-do [arr [1 3 4 2 6 1]
exp [1 1 2 3 4 6]
_ (HeapSort.sorted &arr)]
(assert-equal test
&arr
&[1 3 4 2 6 1]
"HeapSort.sorted does not modify array"))
; walk through HeapSort.sort! step by step
(let-do [arr [1 3 4 2 6 1]
exp [6 4 3 1 2 1]]
(MaxHeap.heapify! &arr)
(assert-equal test
&exp
&arr
"MaxHeap.heapify! works 2"))
(let-do [arr [6 4 3 2 1 1]
exp [1 4 3 2 1 6]]
(Array.swap! &arr 0 (- (Array.length &arr) 1))
(assert-equal test
&exp
&arr
"swap works"))
(let-do [arr [1 4 3 2 1 6]
exp [4 2 3 1 1 6]]
(MaxHeap.push-down-until! &arr 0 (- (Array.length &arr) 1))
(assert-equal test
&exp
&arr
"push down until works"))
(let-do [arr [4 2 3 1 1 6]
exp [1 2 3 1 4 6]]
(Array.swap! &arr 0 (- (Array.length &arr) 2))
(assert-equal test
&exp
&arr
"swap 2 works"))
(let-do [arr [1 2 3 1 4 6]
exp [3 2 1 1 4 6]]
(MaxHeap.push-down-until! &arr 0 (- (Array.length &arr) 2))
(assert-equal test
&exp
&arr
"push down until 2 works"))
(let-do [arr [3 2 1 1 4 6]
exp [1 2 1 3 4 6]]
(Array.swap! &arr 0 (- (Array.length &arr) 3))
(assert-equal test
&exp
&arr
"swap 3 works"))
(let-do [arr [1 2 1 3 4 6]
exp [2 1 1 3 4 6]]
(MaxHeap.push-down-until! &arr 0 (- (Array.length &arr) 3))
(assert-equal test
&exp
&arr
"push down 3 works"))
(let-do [arr [2 1 1 3 4 6]
exp [1 1 2 3 4 6]]
(Array.swap! &arr 0 (- (Array.length &arr) 4))
(assert-equal test
&exp
&arr
"swap 4 works"))
; minimal case from bug #343
(let-do [arr [20 0 10 21 11 1 2 22 12 24 23 13 3 14 4 25 5 15 16 6 17 7 8 18 19 9]
exp (Array.range-or-default 0 25 1)]
(Array.sort! &arr)
(assert-equal test
&exp
&arr
"Heapsort.sorted bug #343"))
)