trivial/test/vector-pass.rkt
2016-03-02 13:21:00 -05:00

145 lines
3.7 KiB
Racket

#lang typed/racket/base
(module+ test
(require
trivial/math
trivial/vector
typed/rackunit)
(require/typed (for-template trivial/vector)
(parse-vector-length (-> Syntax (Option Natural))))
;; -- parse-vector-length
;; --- '#
(check-equal?
(parse-vector-length #'#())
0)
; (check-equal?
; (parse-vector-length #`#,'#(1 2))
; 2)
(check-equal?
(parse-vector-length #'#(1 2 3 4))
4)
(check-equal?
(parse-vector-length #'#(a b c e s aue d al))
8)
;; --- vector
(check-equal?
(parse-vector-length #'(vector))
0)
(check-equal?
(parse-vector-length #'(vector 0 1))
2)
;; --- make-vector
(check-equal?
(parse-vector-length #'(make-vector -1 1))
#f)
(check-equal?
(parse-vector-length #'(make-vector 0 8))
0)
(check-equal?
(parse-vector-length #'(make-vector 3 3))
3)
(check-equal?
(parse-vector-length #'(make-vector 99))
99)
;; --- build-vector
(check-equal?
;; Type error
(parse-vector-length #'(build-vector -1))
#f)
(check-equal?
(parse-vector-length #'(build-vector 0 (lambda (x) x)))
0)
(check-equal?
(parse-vector-length #'(build-vector 3 (lambda (x) 8)))
3)
(check-equal?
(parse-vector-length #'(build-vector 61 add1))
61)
;; -- vector-length:
(check-equal?
(vector-length: '#()) 0)
(check-equal?
(vector-length: (vector 1 2 2)) 3)
(check-equal?
(ann (-: (vector-length: (vector 5 5 5 5 5)) 4)
One)
1)
(let-vector: ([v1 (vector 2 3 4)]
[v2 (vector 4 3 2)])
(check-equal?
(ann (+: 1 (-: (*: 5 (vector-length: v1)) (+: (*: 4 3) (vector-length: v2))))
One)
1))
(let ()
(define-vector: v1 (vector 2 3 4))
(define-vector: v2 (vector 4 3 2))
(check-equal?
(ann (*: 5 (-: (vector-length: v1) (*: 1 1 (vector-length: v2) 1)))
Zero)
0))
;(test-suite "vector-ref:"
(test-case "vector/length ref"
(check-equal? (vector-ref: (vector 1) 0) 1))
(test-case "vector/length ref, via let"
(let-vector: ([v (vector 2)])
(check-equal? (vector-ref: v 0) 2)))
(test-case "vector/length ref, via define"
(define-vector: v (vector "a" "bee" "sea"))
(check-equal? (vector-ref: v 2) "sea"))
(test-case "plain vector ref"
(check-equal?
((lambda (v) (vector-ref: v 3)) (vector 8 2 19 3 0))
3))
(test-case "higher-order vector ref"
(check-exn exn:fail:contract?
(lambda ()
((lambda ([f : (-> (Vectorof Any) Natural Any)])
(f (vector 0 1 2) 10)) vector-ref:))))
(test-case "2-level ref"
(let-vector: ([v1 (vector 'X)])
(let-vector: ([v2 (vector v1)])
(check-equal? (vector-ref: (vector-ref: v2 0) 0) 'X))))
;)
;(test-suite "vector-set!:"
(test-case "vector/length set!"
(check-equal? (vector-set!: (vector 1) 0 8) (void)))
(test-case "vector/length set!, via let"
(let-vector: ([v (vector 2)])
(vector-set! v 0 3)
(check-equal? (vector-ref: v 0) 3)))
(test-case "vector/length set, via define"
(define-vector: v (vector "a" "bee" "sea"))
(vector-set! v 1 "bye")
(check-equal? (vector-ref: v 1) "bye"))
(test-case "plain vector set"
(check-equal?
((lambda (v) (vector-set!: v 3 4) (vector-ref: v 3)) (vector 8 2 19 3 0))
4))
(test-case "higher-order vector set"
(check-exn exn:fail:contract?
(lambda ()
((lambda ([f : (-> (Vectorof Any) Natural Any Void)])
(f (vector 0 1 2) 10 9)) vector-set!:))))
;)
;; -- define-vector:
(let ()
(define-vector: v (vector 1 1 2 2))
(check-equal? (vector-ref: v 0) 1))
;; -- let-vector:
)