(define-library (srfi 128 test) (export run-tests) (import (scheme base) (srfi 128) (chibi test)) (begin (define default-comparator (make-default-comparator)) (define real-comparator (make-comparator real? = < number-hash)) (define degenerate-comparator (make-comparator (lambda (x) #t) equal? #f #f)) (define boolean-comparator (make-comparator boolean? eq? (lambda (x y) (and (not x) y)) boolean-hash)) (define bool-pair-comparator (make-pair-comparator boolean-comparator boolean-comparator)) (define num-list-comparator (make-list-comparator real-comparator list? null? car cdr)) (define num-vector-comparator (make-vector-comparator real-comparator vector? vector-length vector-ref)) (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))))))) (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)) (define list-qua-vector-comparator (make-vector-comparator default-comparator list? length list-ref)) (define eq-comparator (make-eq-comparator)) (define eqv-comparator (make-eqv-comparator)) (define equal-comparator (make-equal-comparator)) (define symbol-comparator (make-comparator symbol? eq? (lambda (a b) (stringstring a) (symbol->string b))) symbol-hash)) (define (run-tests) (test-group "srfi-128: comparators" (test '#(2 3 4) (vector-cdr '#(1 2 3 4))) (test '#() (vector-cdr '#(1))) (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 (test-group "comparators/bound-salt" (test-assert (exact-integer? (hash-bound))) (test-assert (exact-integer? (hash-salt))) (test-assert (< (hash-salt) (hash-bound))) #; (test (hash-salt) (fake-salt-hash #t)) ; no such thing as fake-salt-hash ) ; end comparators/bound-salt )))) ; end comparators