(define-library (srfi 128 test) (export run-tests) (import (scheme base) (srfi 128) (chibi test)) (begin (define degenerate-comparator (make-comparator (lambda (x) #t) equal? #f #f)) (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 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 (test-group "comparators/min-max" (test 5 (comparator-max real-comparator 1 5 3 2 -2)) (test -2 (comparator-min real-comparator 1 5 3 2 -2)) (test 5 (comparator-max-in-list real-comparator '(1 5 3 2 -2))) (test -2 (comparator-min-in-list real-comparator '(1 5 3 2 -2))) ) ; end comparators/min-max (test-group "comparators/variables" ;; Most of the variables have been tested above. (test-assert (=? char-comparator #\C #\C)) (test-assert (=? char-ci-comparator #\c #\C)) (test-assert (=? string-comparator "ABC" "ABC")) (test-assert (=? string-ci-comparator "abc" "ABC")) (test-assert (=? eq-comparator 32 32)) (test-assert (=? eqv-comparator 32 32)) (test-assert (=? equal-comparator "ABC" "ABC")) ) ; end comparators/variables )))) ; end comparators