--- test-suite/tests/hash.test.1.8.3 2008-01-12 04:52:45.000000000 -0500 +++ test-suite/tests/hash.test 2008-01-12 06:27:05.000000000 -0500 @@ -63,6 +63,205 @@ (pass-if (= 0 (hashq noop 1)))) ;;; +;;; make-hash-table +;;; + +(with-test-prefix + "make-hash-table, hash-table?" + (pass-if-exception "make-hash-table -1" exception:out-of-range + (make-hash-table -1)) + (pass-if (hash-table? (make-hash-table 0))) ;; default + (pass-if (not (hash-table? 'not-a-hash-table))) + (pass-if (equal? "#" + (with-output-to-string + (lambda () (write (make-hash-table 100))))))) + +;;; +;;; usual set and reference +;;; + +(with-test-prefix + "hash-set and hash-ref" + + ;; auto-resizing + (pass-if (let ((table (make-hash-table 1))) ;;actually makes size 31 + (hash-set! table 'one 1) + (hash-set! table 'two #t) + (hash-set! table 'three #t) + (hash-set! table 'four #t) + (hash-set! table 'five #t) + (hash-set! table 'six #t) + (hash-set! table 'seven #t) + (hash-set! table 'eight #t) + (hash-set! table 'nine 9) + (hash-set! table 'ten #t) + (hash-set! table 'eleven #t) + (hash-set! table 'twelve #t) + (hash-set! table 'thirteen #t) + (hash-set! table 'fourteen #t) + (hash-set! table 'fifteen #t) + (hash-set! table 'sixteen #t) + (hash-set! table 'seventeen #t) + (hash-set! table 18 #t) + (hash-set! table 19 #t) + (hash-set! table 20 #t) + (hash-set! table 21 #t) + (hash-set! table 22 #t) + (hash-set! table 23 #t) + (hash-set! table 24 #t) + (hash-set! table 25 #t) + (hash-set! table 26 #t) + (hash-set! table 27 #t) + (hash-set! table 28 #t) + (hash-set! table 29 #t) + (hash-set! table 30 'thirty) + (hash-set! table 31 #t) + (hash-set! table 32 #t) + (hash-set! table 33 'thirty-three) + (hash-set! table 34 #t) + (hash-set! table 35 #t) + (hash-set! table 'foo 'bar) + (and (equal? 1 (hash-ref table 'one)) + (equal? 9 (hash-ref table 'nine)) + (equal? 'thirty (hash-ref table 30)) + (equal? 'thirty-three (hash-ref table 33)) + (equal? 'bar (hash-ref table 'foo)) + (equal? "#" + (with-output-to-string (lambda () (write table))))))) + + ;; 1 and 1 are equal? and eqv? and eq? + (pass-if (equal? 'foo + (let ((table (make-hash-table))) + (hash-set! table 1 'foo) + (hash-ref table 1)))) + (pass-if (equal? 'foo + (let ((table (make-hash-table))) + (hashv-set! table 1 'foo) + (hashv-ref table 1)))) + (pass-if (equal? 'foo + (let ((table (make-hash-table))) + (hashq-set! table 1 'foo) + (hashq-ref table 1)))) + + ;; 1/2 and 2/4 are equal? and eqv? but not eq? + (pass-if (equal? 'foo + (let ((table (make-hash-table))) + (hash-set! table 1/2 'foo) + (hash-ref table 2/4)))) + (pass-if (equal? 'foo + (let ((table (make-hash-table))) + (hashv-set! table 1/2 'foo) + (hashv-ref table 2/4)))) + (pass-if (equal? #f + (let ((table (make-hash-table))) + (hashq-set! table 1/2 'foo) + (hashq-ref table 2/4)))) + + ;; (list 1 2) is equal? but not eqv? or eq? to another (list 1 2) + (pass-if (equal? 'foo + (let ((table (make-hash-table))) + (hash-set! table (list 1 2) 'foo) + (hash-ref table (list 1 2))))) + (pass-if (equal? #f + (let ((table (make-hash-table))) + (hashv-set! table (list 1 2) 'foo) + (hashv-ref table (list 1 2))))) + (pass-if (equal? #f + (let ((table (make-hash-table))) + (hashq-set! table (list 1 2) 'foo) + (hashq-ref table (list 1 2))))) + + ;; ref default argument + (pass-if (equal? 'bar + (let ((table (make-hash-table))) + (hash-ref table 'foo 'bar)))) + (pass-if (equal? 'bar + (let ((table (make-hash-table))) + (hashv-ref table 'foo 'bar)))) + (pass-if (equal? 'bar + (let ((table (make-hash-table))) + (hashq-ref table 'foo 'bar)))) + (pass-if (equal? 'bar + (let ((table (make-hash-table))) + (hashx-ref hash equal? table 'foo 'bar)))) + + ;; wrong type argument + (pass-if-exception "(hash-ref 'not-a-table 'key)" exception:wrong-type-arg + (hash-ref 'not-a-table 'key)) + ) + +;;; +;;; hashx +;;; + +(with-test-prefix + "auto-resizing hashx" + ;; auto-resizing + (pass-if (let ((table (make-hash-table 1))) ;;actually makes size 31 + (hashx-set! hash assoc table 1/2 'equal) + (hashx-set! hashv assv table 1/3 'eqv) + (hashx-set! hashq assq table 4 'eq) + (hashx-set! hash assoc table 1/5 'equal) + (hashx-set! hashv assv table 1/6 'eqv) + (hashx-set! hashq assq table 7 'eq) + (hashx-set! hash assoc table 1/8 'equal) + (hashx-set! hashv assv table 1/9 'eqv) + (hashx-set! hashq assq table 10 'eq) + (hashx-set! hash assoc table 1/11 'equal) + (hashx-set! hashv assv table 1/12 'eqv) + (hashx-set! hashq assq table 13 'eq) + (hashx-set! hash assoc table 1/14 'equal) + (hashx-set! hashv assv table 1/15 'eqv) + (hashx-set! hashq assq table 16 'eq) + (hashx-set! hash assoc table 1/17 'equal) + (hashx-set! hashv assv table 1/18 'eqv) + (hashx-set! hashq assq table 19 'eq) + (hashx-set! hash assoc table 1/20 'equal) + (hashx-set! hashv assv table 1/21 'eqv) + (hashx-set! hashq assq table 22 'eq) + (hashx-set! hash assoc table 1/23 'equal) + (hashx-set! hashv assv table 1/24 'eqv) + (hashx-set! hashq assq table 25 'eq) + (hashx-set! hash assoc table 1/26 'equal) + (hashx-set! hashv assv table 1/27 'eqv) + (hashx-set! hashq assq table 28 'eq) + (hashx-set! hash assoc table 1/29 'equal) + (hashx-set! hashv assv table 1/30 'eqv) + (hashx-set! hashq assq table 31 'eq) + (hashx-set! hash assoc table 1/32 'equal) + (hashx-set! hashv assv table 1/33 'eqv) + (hashx-set! hashq assq table 34 'eq) + (and (equal? 'equal (hash-ref table 2/4)) + (equal? 'eqv (hashv-ref table 2/6)) + (equal? 'eq (hashq-ref table 4)) + (equal? 'equal (hashx-ref hash equal? table 2/64)) + (equal? 'eqv (hashx-ref hashv eqv? table 2/66)) + (equal? 'eq (hashx-ref hashq eq? table 34)) + (equal? "#" + (with-output-to-string (lambda () (write table)))))))) + +(with-test-prefix + "hashx" + (pass-if (let ((table (make-hash-table))) + (hashx-set! (lambda (k v) 1) (lambda (a b) #t) table 'foo 'bar) + (equal? + 'bar (hashx-ref (lambda (k v) 1) (lambda (a b) #t) table 'baz)))) + (pass-if (let ((table (make-hash-table))) + (hashx-set! (lambda (k v) 1) equal? table 'foo 'bar) + (equal? + 'bar (hashx-ref (lambda (k v) 1) equal? table 'baz)))) + (pass-if (let ((table (make-hash-table 31))) + (hashx-set! (lambda (k v) 1) equal? table 'foo 'bar) + (equal? #f + (hashx-ref (lambda (k v) 2) equal? table 'foo)))) + (pass-if (let ((table (make-hash-table))) + (hashx-set! hash equal? table 'foo 'bar) + (equal? #f + (hashx-ref hash (lambda (a b) #f) table 'foo))))) + + + +;;; ;;; hashx-remove! ;;; (with-test-prefix "hashx-remove!"