! Copyright 2007, 2008 Ryan Murphy, Slava Pestov ! See http://factorcode.org/license.txt for BSD license. USING: arrays kernel math namespaces tools.test heaps heaps.private math.parser random assocs sequences sorting accessors math.order ; IN: heaps.tests [ heap-pop ] must-fail [ heap-pop ] must-fail [ t ] [ heap-empty? ] unit-test [ f ] [ 1 t pick heap-push heap-empty? ] unit-test [ t ] [ heap-empty? ] unit-test [ f ] [ 1 t pick heap-push heap-empty? ] unit-test ! Binary Min Heap { 1 2 3 4 5 6 } [ 0 left 0 right 1 left 1 right 2 left 2 right ] unit-test { t } [ t 5 f t 3 f T{ min-heap } heap-compare ] unit-test { f } [ t 5 f t 3 f T{ max-heap } heap-compare ] unit-test [ t 2 ] [ 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 [ t 1 ] [ 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 [ t 400 ] [ 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 [ 0 ] [ heap-size ] unit-test [ 1 ] [ t 1 pick heap-push heap-size ] unit-test : heap-sort ( alist -- keys ) [ heap-push-all ] keep heap-pop-all ; : random-alist ( n -- alist ) iota [ drop 32 random-bits dup number>string ] H{ } map>assoc ; : test-heap-sort ( n -- ? ) random-alist dup >alist sort-keys swap heap-sort = ; 14 [ [ t ] swap [ 2^ test-heap-sort ] curry unit-test ] each-integer : test-entry-indices ( n -- ? ) random-alist [ heap-push-all ] keep data>> dup length iota swap [ index>> ] map sequence= ; 14 [ [ t ] swap [ 2^ test-entry-indices ] curry unit-test ] each-integer : sort-entries ( entries -- entries' ) [ key>> ] sort-with ; : delete-test ( n -- obj1 obj2 ) [ random-alist [ heap-push-all ] keep dup data>> clone swap ] keep 3 /i [ 2dup [ delete-random ] dip heap-delete ] times data>> [ [ key>> ] map ] bi@ [ natural-sort ] bi@ ; 11 [ [ t ] swap [ 2^ delete-test sequence= ] curry unit-test ] each-integer