diff --git a/test/vector-fail.rkt b/test/vector-fail.rkt new file mode 100644 index 0000000..8e2fbc7 --- /dev/null +++ b/test/vector-fail.rkt @@ -0,0 +1,33 @@ +#lang racket/base + +(define (expr->typed-module expr) + #`(module t typed/racket/base + (require trivial/vector) + #,expr)) + +(define TEST-CASE* (map expr->typed-module '( + (vector-ref: (vector 1) 3) + + (let-vector: ([v (vector 1 2 3)]) + (vector-ref: v 3)) + + (let () + (define-vector: v (vector 3 4)) + (vector-ref: v 9)) + +))) + +;; ----------------------------------------------------------------------------- + +(module+ test + (require + rackunit) + + (define (vector-eval stx) + (lambda () ;; For `check-exn` + (compile-syntax stx))) + + (for ([rkt (in-list TEST-CASE*)]) + (check-exn #rx"vector::|Type Checker" + (vector-eval rkt))) +) diff --git a/test/vector-pass.rkt b/test/vector-pass.rkt index 7dc3501..c4168fe 100644 --- a/test/vector-pass.rkt +++ b/test/vector-pass.rkt @@ -81,6 +81,29 @@ Zero) 0)) + ;; -- 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:)))) + ;; -- define-vector: (let () (define-vector: v (vector 1 1 2 2)) diff --git a/vector.rkt b/vector.rkt index 3649de3..fdc3c38 100644 --- a/vector.rkt +++ b/vector.rkt @@ -67,7 +67,7 @@ [(_ e* ...) #'(let e* ...)])) -(define-for-syntax (vector-ref-error v i reason) +(define-for-syntax (vector-ref-error v i) (raise-argument-error errloc-key (format "Index out-of-bounds: ~a" i)