racket/collects/tests/data/gvector.rkt
2012-01-30 16:14:22 -07:00

151 lines
4.5 KiB
Racket

#lang racket/base
(require data/gvector
racket/dict
rackunit)
(test-equal? "gvector"
(gvector->vector (gvector 1 2 3))
'#(1 2 3))
(test-equal? "gvector-add! (one)"
(gvector->vector
(let ([gv (make-gvector)])
(for ([x '(1 2 3)])
(gvector-add! gv x))
gv))
'#(1 2 3))
(test-equal? "gvector-add! (multi)"
(gvector->vector
(let ([gv (make-gvector)])
(gvector-add! gv 1 2 3)
gv))
'#(1 2 3))
(test-equal? "gvector-ref"
(let ([gv (gvector 1 2 3)])
;; 3 valid refs + 1 not-found
(for/list ([index '(0 1 2 3)])
(gvector-ref gv index #f)))
'(1 2 3 #f))
(test-equal? "gvector-set! (in range)"
(let ([gv (gvector 1 2 3)])
(gvector-set! gv 1 'apple)
(gvector->vector gv))
'#(1 apple 3))
(test-equal? "gvector-set! as add"
(let ([gv (gvector 1 2 3)])
(gvector-set! gv 3 4)
(gvector->vector gv))
'#(1 2 3 4))
(test-equal? "gvector-remove! at end"
(let ([gv (gvector 1 2 3)])
(gvector-remove! gv 2)
(gvector->vector gv))
'#(1 2))
(test-equal? "gvector-remove! at beginning"
(let ([gv (gvector 1 2 3)])
(gvector-remove! gv 0)
(gvector->vector gv))
'#(2 3))
(test-equal? "gvector-remove-last!"
(let ([gv (gvector 1 2 3)])
(check-equal? (gvector-remove-last! gv) 3)
(check-equal? (gvector-remove-last! gv) 2)
(check-equal? (gvector-remove-last! gv) 1)
(gvector->vector gv))
'#())
(test-equal? "gvector-add and gvector-remove-last!"
(let ([gv (gvector)])
(gvector-add! gv 'rock)
(gvector-add! gv 'paper)
(check-equal? (gvector-remove-last! gv) 'paper)
(gvector-add! gv 'scissor)
(check-equal? (gvector-remove-last! gv) 'scissor)
(check-equal? (gvector-remove-last! gv) 'rock)
(gvector->vector gv))
'#())
(test-equal? "gvector-count"
(gvector-count (gvector 1 2 3))
3)
(test-equal? "gvector-count / add"
(let ([gv (gvector 1 2 3)])
(gvector-add! gv 4 5 6)
(gvector-count gv))
6)
(test-equal? "in-gvector"
(let ([gv (gvector 1 2 3)])
(for/list ([x (in-gvector gv)]) x))
'(1 2 3))
(test-equal? "in-gvector expression form"
(let* ([gv (gvector 1 2 3)]
[gv-sequence (in-gvector gv)])
(for/list ([x gv-sequence]) x))
'(1 2 3))
(test-equal? "gvector as sequence"
(let ([gv (gvector 1 2 3)])
(for/list ([x gv]) x))
'(1 2 3))
(test-equal? "for/gvector"
(gvector->vector (for/gvector ([x '(1 2 3)]) x))
'#(1 2 3))
(test-case "gvector, lots of adds"
(let ([gv (make-gvector)])
(for ([x (in-range 0 1000)])
(gvector-add! gv x))
(for ([x (in-range 0 1000)])
(check-equal? (gvector-ref gv x) x))
(check-equal? (gvector-count gv) 1000)))
(test-equal? "gvector, dict-map"
(dict-map (gvector 1 2 3) list)
'((0 1) (1 2) (2 3)))
(test-equal? "gvector, dict-ref"
(dict-ref (gvector 1 2 3) 0)
1)
(test-equal? "gvector, dict-ref out of range"
(dict-ref (gvector 1 2 3) 5 #f)
#f)
(test-equal? "gvector, equals, empty"
(gvector)
(make-gvector #:capacity 50))
(test-case "gvector, equals"
(let ([g1 (make-gvector)]
[g2 (make-gvector)])
(for ([x (in-range 1000)])
(check-equal? g1 g2)
(check-equal? (equal-hash-code g1) (equal-hash-code g2))
(gvector-add! g1 x)
(gvector-add! g2 x))))
(test-case "gvector, equals, w cycles"
(let ([g1 (make-gvector)]
[g2 (make-gvector)])
(for ([x (in-range 10)])
(check-equal? g1 g2)
(check-equal? (equal-hash-code g1) (equal-hash-code g2))
(gvector-add! g1 (if (zero? (modulo x 2)) g1 g2))
(gvector-add! g2 (if (zero? (modulo x 3)) g1 g2)))))
(test-case "gvector, not equal, same length"
(check-not-equal? (gvector 1) (gvector 2)))
(test-case "gvector, not equal, extension"
(check-not-equal? (gvector 1) (gvector 1 2)))