151 lines
4.5 KiB
Racket
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)))
|