(use test) (use comparators) (load "r7rs-shim.scm") (define (print x) (display x) (newline)) (test-group "comparators" (define (vector-cdr vec) (let* ((len (vector-length vec)) (result (make-vector (- len 1)))) (let loop ((n 1)) (cond ((= n len) result) (else (vector-set! result (- n 1) (vector-ref vec n)) (loop (+ n 1))))))) (test '#(2 3 4) (vector-cdr '#(1 2 3 4))) (test '#() (vector-cdr '#(1))) (print "default-comparator") (define default-comparator (make-default-comparator)) (print "real-comparator") (define real-comparator (make-comparator real? = < number-hash)) (print "degenerate comparator") (define degenerate-comparator (make-comparator (lambda (x) #t) equal? #f #f)) (print "boolean comparator") (define boolean-comparator (make-comparator boolean? eq? (lambda (x y) (and (not x) y)) boolean-hash)) (print "bool-pair-comparator") (define bool-pair-comparator (make-pair-comparator boolean-comparator boolean-comparator)) (print "num-list-comparator") (define num-list-comparator (make-list-comparator real-comparator list? null? car cdr)) (print "num-vector-comparator") (define num-vector-comparator (make-vector-comparator real-comparator vector? vector-length vector-ref)) (print "vector-qua-list comparator") (define vector-qua-list-comparator (make-list-comparator real-comparator vector? (lambda (vec) (= 0 (vector-length vec))) (lambda (vec) (vector-ref vec 0)) vector-cdr)) (print "list-qua-vector-comparator") (define list-qua-vector-comparator (make-vector-comparator default-comparator list? length list-ref)) (print "eq-comparator") (define eq-comparator (make-eq-comparator)) (print "eqv-comparator") (define eqv-comparator (make-eqv-comparator)) (print "equal-comparator") (define equal-comparator (make-equal-comparator)) (print "symbol-comparator") (define symbol-comparator (make-comparator symbol? eq? (lambda (a b) (stringstring a) (symbol->string b))) symbol-hash)) (test-group "comparators/predicates" (test-assert (comparator? real-comparator)) (test-assert (not (comparator? =))) (test-assert (comparator-ordered? real-comparator)) (test-assert (comparator-hashable? real-comparator)) (test-assert (not (comparator-ordered? degenerate-comparator))) (test-assert (not (comparator-hashable? degenerate-comparator))) ) ; end comparators/predicates (test-group "comparators/constructors" (test-assert (=? boolean-comparator #t #t)) (test-assert (not (=? boolean-comparator #t #f))) (test-assert (? real-comparator 4.0 3.0 2)) (test-assert (<=? real-comparator 2.0 2 3.0)) (test-assert (>=? real-comparator 3 3.0 2)) (test-assert (not (=? real-comparator 1 2 3))) (test-assert (not (? real-comparator 1 2 3))) (test-assert (not (<=? real-comparator 4 3 3))) (test-assert (not (>=? real-comparator 3 4 4.0))) ) ; end comparators/comparison (test-group "comparators/syntax" (test 'less (comparator-if<=> real-comparator 1 2 'less 'equal 'greater)) (test 'equal (comparator-if<=> real-comparator 1 1 'less 'equal 'greater)) (test 'greater (comparator-if<=> real-comparator 2 1 'less 'equal 'greater)) (test 'less (comparator-if<=> "1" "2" 'less 'equal 'greater)) (test 'equal (comparator-if<=> "1" "1" 'less 'equal 'greater)) (test 'greater (comparator-if<=> "2" "1" 'less 'equal 'greater)) ) ; end comparators/syntax ) ; end comparators (test-exit)