1 ! Copyright 2007, 2008 Ryan Murphy, Slava Pestov
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: arrays kernel math namespaces tools.test
4 heaps heaps.private math.parser random assocs sequences sorting
5 accessors math.order locals ;
8 [ <min-heap> heap-pop ] must-fail
9 [ <max-heap> heap-pop ] must-fail
11 { t } [ <min-heap> heap-empty? ] unit-test
12 { f } [ <min-heap> 1 t pick heap-push heap-empty? ] unit-test
13 { t } [ <max-heap> heap-empty? ] unit-test
14 { f } [ <max-heap> 1 t pick heap-push heap-empty? ] unit-test
17 { 1 2 3 4 5 6 } [ 0 left 0 right 1 left 1 right 2 left 2 right ] unit-test
18 { t } [ t 5 f <entry> t 3 f <entry> T{ min-heap } heap-compare ] unit-test
19 { f } [ t 5 f <entry> t 3 f <entry> T{ max-heap } heap-compare ] unit-test
21 { t 2 } [ <min-heap> t 300 pick heap-push t 200 pick heap-push t 400 pick heap-push t 3 pick heap-push t 2 pick heap-push heap-pop ] unit-test
23 { t 1 } [ <min-heap> t 300 pick heap-push t 200 pick heap-push t 400 pick heap-push t 3 pick heap-push t 2 pick heap-push t 1 pick heap-push heap-pop ] unit-test
25 { t 400 } [ <max-heap> t 300 pick heap-push t 200 pick heap-push t 400 pick heap-push t 3 pick heap-push t 2 pick heap-push t 1 pick heap-push heap-pop ] unit-test
27 { 0 } [ <max-heap> heap-size ] unit-test
28 { 1 } [ <max-heap> t 1 pick heap-push heap-size ] unit-test
30 : heap-sort ( alist heap -- keys )
31 [ heap-push-all ] keep heap-pop-all ;
33 : random-alist ( n -- alist )
35 drop 32 random-bits dup number>string
36 ] H{ } map>assoc >alist ;
38 :: test-heap-sort ( n heap reverse? -- ? )
40 [ sort-keys reverse? [ reverse ] when ] keep
43 : test-minheap-sort ( n -- ? )
44 <min-heap> f test-heap-sort ;
46 : test-maxheap-sort ( n -- ? )
47 <max-heap> t test-heap-sort ;
50 [ t ] swap [ 2^ <min-heap> f test-heap-sort ] curry unit-test
54 [ t ] swap [ 2^ <max-heap> t test-heap-sort ] curry unit-test
57 : test-entry-indices ( n -- ? )
59 <min-heap> [ heap-push-all ] keep
60 data>> dup length iota swap [ index>> ] map sequence= ;
63 [ t ] swap [ 2^ test-entry-indices ] curry unit-test
66 : sort-entries ( entries -- entries' )
69 : delete-test ( n -- obj1 obj2 )
72 <min-heap> [ heap-push-all ] keep
74 ] keep 3 /i [ 2dup [ delete-random ] dip heap-delete ] times
77 [ natural-sort ] bi@ ;
80 [ t ] swap [ 2^ delete-test sequence= ] curry unit-test