5732 lines
207 KiB
Scheme
5732 lines
207 KiB
Scheme
(load-relative "loadtest.ss")
|
|
(Section 'contract)
|
|
|
|
(parameterize ([error-print-width 200])
|
|
(let ()
|
|
|
|
(define contract-namespace
|
|
(let ([n (make-base-namespace)])
|
|
(parameterize ([current-namespace n])
|
|
(namespace-require '(for-syntax scheme/base))
|
|
(namespace-require '(for-template scheme/base))
|
|
(namespace-require 'scheme/contract)
|
|
(namespace-require '(only scheme/private/contract-arrow procedure-accepts-and-more?))
|
|
(namespace-require 'scheme/class)
|
|
(namespace-require 'scheme/promise))
|
|
n))
|
|
|
|
(define (contract-eval x)
|
|
(parameterize ([current-namespace contract-namespace])
|
|
(eval x)))
|
|
|
|
(define-syntax (ctest stx)
|
|
(syntax-case stx ()
|
|
[(_ a ...)
|
|
(syntax (contract-eval `(,test a ...)))]))
|
|
|
|
(define (contract-error-test exp exn-ok?)
|
|
(test #t
|
|
'contract-error-test
|
|
(contract-eval `(with-handlers ((exn? (λ (x) (and (,exn-ok? x) #t)))) ,exp))))
|
|
|
|
;; test/spec-passed : symbol sexp -> void
|
|
;; tests a passing specification
|
|
(define (test/spec-passed name expression)
|
|
(printf "testing: ~s\n" name)
|
|
(contract-eval
|
|
`(,test
|
|
(void)
|
|
(let ([for-each-eval (lambda (l) (for-each eval l))]) for-each-eval)
|
|
(list ',expression '(void))))
|
|
(let/ec k
|
|
(contract-eval
|
|
`(,test (void)
|
|
(let ([for-each-eval (lambda (l) (for-each (λ (x) (eval x)) l))])
|
|
for-each-eval)
|
|
(list ',(rewrite expression k) '(void))))))
|
|
|
|
(define (test/spec-passed/result name expression result)
|
|
(printf "testing: ~s\n" name)
|
|
(contract-eval `(,test ',result eval ',expression))
|
|
(let/ec k
|
|
(contract-eval
|
|
`(,test
|
|
',result
|
|
eval
|
|
',(rewrite expression k)))))
|
|
|
|
;; rewrites `contract' to use opt/c. If there is a module definition in there, we skip that test.
|
|
(define (rewrite exp k)
|
|
(let loop ([exp exp])
|
|
(cond
|
|
[(null? exp) null]
|
|
[(list? exp)
|
|
(case (car exp)
|
|
[(contract) `(contract (opt/c ,(loop (cadr exp))) ,@(map loop (cddr exp)))]
|
|
[(module) (k #f)]
|
|
[else (map loop exp)])]
|
|
[(pair? exp) (cons (loop (car exp))
|
|
(loop (cdr exp)))]
|
|
[else exp])))
|
|
|
|
(define (test/spec-failed name expression blame)
|
|
(let ()
|
|
(define (has-proper-blame? msg)
|
|
(equal?
|
|
blame
|
|
(cond
|
|
[(regexp-match #rx"(^| )([^ ]*) broke" msg)
|
|
=>
|
|
(λ (x) (caddr x))]
|
|
[else (format "no blame in error message: \"~a\"" msg)])))
|
|
(printf "testing: ~s\n" name)
|
|
(contract-eval
|
|
`(,thunk-error-test
|
|
(lambda () ,expression)
|
|
(datum->syntax #'here ',expression)
|
|
(lambda (exn)
|
|
(and (exn? exn)
|
|
(,has-proper-blame? (exn-message exn))))))
|
|
(let/ec k
|
|
(let ([rewritten (rewrite expression k)])
|
|
(contract-eval
|
|
`(,thunk-error-test
|
|
(lambda () ,rewritten)
|
|
(datum->syntax #'here ',rewritten)
|
|
(lambda (exn)
|
|
(and (exn? exn)
|
|
(,has-proper-blame? (exn-message exn))))))))))
|
|
|
|
(define (test/pos-blame name expression) (test/spec-failed name expression "pos"))
|
|
(define (test/neg-blame name expression) (test/spec-failed name expression "neg"))
|
|
|
|
(define (test/well-formed stx)
|
|
(contract-eval
|
|
`(,test (void)
|
|
(let ([expand/ret-void (lambda (x) (expand x) (void))]) expand/ret-void)
|
|
,stx)))
|
|
|
|
(define (test/no-error sexp)
|
|
(contract-eval
|
|
`(,test (void)
|
|
eval
|
|
'(begin ,sexp (void)))))
|
|
|
|
(define (test-flat-contract contract pass fail)
|
|
(define (run-three-tests contract)
|
|
(let ([name (if (pair? contract)
|
|
(car contract)
|
|
contract)])
|
|
(contract-eval `(,test #t flat-contract? ,contract))
|
|
(test/spec-failed (format "~a fail" name)
|
|
`(contract ,contract ',fail 'pos 'neg)
|
|
"pos")
|
|
(test/spec-passed/result
|
|
(format "~a pass" name)
|
|
`(contract ,contract ',pass 'pos 'neg)
|
|
pass)))
|
|
(run-three-tests contract)
|
|
(let/ec k (run-three-tests (rewrite contract k))))
|
|
|
|
(define-syntax (test-name stx)
|
|
(syntax-case stx ()
|
|
[(_ name contract)
|
|
#'(do-name-test 'name 'contract)]))
|
|
|
|
(define (do-name-test name contract-exp)
|
|
(printf "~s\n" (list 'do-name-test name contract-exp))
|
|
(contract-eval `(,test ,name contract-name ,contract-exp))
|
|
(contract-eval `(,test ,name contract-name (opt/c ,contract-exp))))
|
|
|
|
(test/spec-passed
|
|
'contract-flat1
|
|
'(contract not #f 'pos 'neg))
|
|
|
|
(test/pos-blame
|
|
'contract-flat2
|
|
'(contract not #t 'pos 'neg))
|
|
|
|
|
|
;
|
|
;
|
|
;
|
|
; ; ; ;;
|
|
; ;; ;; ;;
|
|
; ;;;;; ;;;; ;;;; ;;; ;;;;; ;;;;; ;;; ;;; ;;;; ;;;; ;;;;; ;;;;; ;;;; ;;;; ;;;
|
|
; ;;;;;; ;;;;;; ;;;;;;;;; ;;;;;; ;;;;;; ;;;;;;; ;;;; ;;;; ;;;;;; ;;;;;; ;;;; ;;;;;; ;;;;;;;;;
|
|
; ;;;;;;; ;;;;;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;; ;;;; ;;;; ;;;;;;; ;;;; ;;;; ;;;;;;;; ;;;; ;;;;
|
|
; ;;;; ;;;; ;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;;; ;;;; ;;;;
|
|
; ;;;;;;; ;;;;;;;; ;;;; ;;;; ;;;; ;;;;; ;;;; ;;;; ;;;; ;;;;;;; ;;;;; ;;;; ;;;;;;;; ;;;; ;;;;
|
|
; ;;;;;; ;;;;;; ;;;; ;;;; ;;;;;; ;;;;; ;;;; ;;;;;;;;; ;;;;;; ;;;;; ;;;; ;;;;;; ;;;; ;;;;
|
|
; ;;;;; ;;;; ;;;; ;;;; ;;;;; ;;;; ;;;; ;;; ;;;; ;;;;; ;;;; ;;;; ;;;; ;;;; ;;;;
|
|
;
|
|
;
|
|
;
|
|
|
|
|
|
(test/no-error '(-> integer? integer?))
|
|
(test/no-error '(-> (flat-contract integer?) (flat-contract integer?)))
|
|
(test/no-error '(-> integer? any))
|
|
(test/no-error '(-> (flat-contract integer?) any))
|
|
|
|
(test/no-error '(->* (integer?) () (values integer?)))
|
|
(test/no-error '(->* (integer?) () #:rest integer? integer?))
|
|
(test/no-error '(->* (integer?) () #:rest integer? any))
|
|
(test/no-error '(->* ((flat-contract integer?)) () (flat-contract integer?)))
|
|
(test/no-error '(->* ((flat-contract integer?)) () #:rest (flat-contract integer?) (flat-contract integer?)))
|
|
(test/no-error '(->* ((flat-contract integer?)) () #:rest (flat-contract integer?)
|
|
(values (flat-contract integer?) (flat-contract boolean?))))
|
|
(test/no-error '(->* ((flat-contract integer?)) () #:rest (flat-contract integer?) any))
|
|
|
|
(test/no-error '(->d ([x integer?]) ([y integer?]) any))
|
|
(test/no-error '(->d ([x integer?]) ([y integer?]) (values [a number?] [b boolean?])))
|
|
(test/no-error '(->d ([x integer?] #:z [z integer?]) ([y integer?] #:w [w integer?]) (range boolean?)))
|
|
(test/no-error '(->d ([x integer?] #:z [z integer?]) ([y integer?] #:w [w integer?]) #:rest rest any/c (range boolean?)))
|
|
|
|
(test/no-error '(unconstrained-domain-> number?))
|
|
(test/no-error '(unconstrained-domain-> (flat-contract number?)))
|
|
|
|
(test/no-error '(listof any/c))
|
|
(test/no-error '(listof (lambda (x) #t)))
|
|
|
|
|
|
|
|
;
|
|
;
|
|
;
|
|
; ;;;;
|
|
; ;;;;;;
|
|
; ;;;;;;; ;;;; ;;; ;;; ;;; ;;; ;; ;;;; ;;; ;;;; ;;;; ;;; ;;;
|
|
; ;;;;;;;; ;;;;;;;;; ;;; ;;;; ;;;;; ;;;;;;;;; ;;;;;; ;;;;;;;;; ;;;;;
|
|
; ;;;; ;;;; ;;;; ;;;;;; ;;; ;;; ;;;; ;;;; ;;;;;;;; ;;;; ;;;; ;;;; ;;
|
|
; ;;;;;;; ;;;; ;;;; ;;;;;; ;;;;;;; ;;;; ;;;; ;;;; ;;; ;;;; ;;;; ;;;;;;;
|
|
; ;; ;;;; ;;;; ;;;; ;;;;; ;;; ;;;; ;;;; ;;;; ;;;;;;;; ;;;; ;;;; ;;;;;
|
|
; ;;;;;;;; ;;;; ;;;; ;;;; ;;;;;;;;; ;;;; ;;;; ;;;;;; ;;;; ;;;; ;;;;;;
|
|
; ;; ;;;; ;;;; ;;;; ;;;; ;;;; ;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;;;;
|
|
; ;;;;
|
|
; ;;;;
|
|
;
|
|
|
|
|
|
(test/spec-passed/result 'any/c '(contract any/c 1 'pos 'neg) 1)
|
|
(test/pos-blame 'none/c '(contract none/c 1 'pos 'neg))
|
|
|
|
|
|
;
|
|
;
|
|
;
|
|
; ;;;
|
|
; ; ; ;;; ;
|
|
; ;;; ;;;;;;;;;
|
|
; ;;;; ;;;;;;;
|
|
; ;;; ;;;;;;;
|
|
; ;;;;; ;;; ;;;;;;;;;
|
|
; ;;;;; ;;;; ; ;;; ;
|
|
; ;;; ;;;
|
|
; ;
|
|
;
|
|
;
|
|
;
|
|
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-star0a
|
|
'(contract (->* (integer?) () integer?)
|
|
(lambda (x) x)
|
|
'pos
|
|
'neg))
|
|
|
|
(test/neg-blame
|
|
'contract-arrow-star0b
|
|
'((contract (->* (integer?) () integer?)
|
|
(lambda (x) x)
|
|
'pos
|
|
'neg)
|
|
#f))
|
|
|
|
(test/pos-blame
|
|
'contract-arrow-star0c
|
|
'((contract (->* (integer?) () integer?)
|
|
(lambda (x) #f)
|
|
'pos
|
|
'neg)
|
|
1))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-star1
|
|
'(let-values ([(a b) ((contract (->* (integer?) () (values integer? integer?))
|
|
(lambda (x) (values x x))
|
|
'pos
|
|
'neg)
|
|
2)])
|
|
1))
|
|
|
|
(test/neg-blame
|
|
'contract-arrow-star2
|
|
'((contract (->* (integer?) () (values integer? integer?))
|
|
(lambda (x) (values x x))
|
|
'pos
|
|
'neg)
|
|
#f))
|
|
|
|
(test/pos-blame
|
|
'contract-arrow-star3
|
|
'((contract (->* (integer?) () (values integer? integer?))
|
|
(lambda (x) (values 1 #t))
|
|
'pos
|
|
'neg)
|
|
1))
|
|
|
|
(test/pos-blame
|
|
'contract-arrow-star4
|
|
'((contract (->* (integer?) () (values integer? integer?))
|
|
(lambda (x) (values #t 1))
|
|
'pos
|
|
'neg)
|
|
1))
|
|
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-star5
|
|
'(let-values ([(a b) ((contract (->* (integer?) ()
|
|
#:rest (listof integer?)
|
|
(values integer? integer?))
|
|
(lambda (x . y) (values x x))
|
|
'pos
|
|
'neg)
|
|
2)])
|
|
1))
|
|
|
|
(test/neg-blame
|
|
'contract-arrow-star6
|
|
'((contract (->* (integer?) () #:rest (listof integer?) (values integer? integer?))
|
|
(lambda (x . y) (values x x))
|
|
'pos
|
|
'neg)
|
|
#f))
|
|
|
|
(test/pos-blame
|
|
'contract-arrow-star7
|
|
'((contract (->* (integer?) () #:rest (listof integer?) (values integer? integer?))
|
|
(lambda (x . y) (values 1 #t))
|
|
'pos
|
|
'neg)
|
|
1))
|
|
|
|
(test/pos-blame
|
|
'contract-arrow-star8
|
|
'((contract (->* (integer?) () #:rest (listof integer?) (values integer? integer?))
|
|
(lambda (x) (values #t 1))
|
|
'pos
|
|
'neg)
|
|
1))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-star9
|
|
'((contract (->* (integer?) () #:rest (listof integer?) integer?)
|
|
(lambda (x . y) 1)
|
|
'pos
|
|
'neg)
|
|
1 2))
|
|
|
|
(test/neg-blame
|
|
'contract-arrow-star10
|
|
'((contract (->* (integer?) () #:rest (listof integer?) integer?)
|
|
(lambda (x . y) 1)
|
|
'pos
|
|
'neg)
|
|
1 2 'bad))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-star11
|
|
'(let-values ([(a b) ((contract (->* (integer?) ()
|
|
#:rest (listof integer?)
|
|
any)
|
|
(lambda (x . y) (values x x))
|
|
'pos
|
|
'neg)
|
|
2)])
|
|
1))
|
|
|
|
(test/pos-blame
|
|
'contract-arrow-star11b
|
|
'(let-values ([(a b) ((contract (->* (integer?) ()
|
|
#:rest (listof integer?)
|
|
any)
|
|
(lambda (x) (values x x))
|
|
'pos
|
|
'neg)
|
|
2)])
|
|
1))
|
|
|
|
(test/neg-blame
|
|
'contract-arrow-star12
|
|
'((contract (->* (integer?) () #:rest (listof integer?) any)
|
|
(lambda (x . y) (values x x))
|
|
'pos
|
|
'neg)
|
|
#f))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-star13
|
|
'((contract (->* (integer?) () #:rest (listof integer?) any)
|
|
(lambda (x . y) 1)
|
|
'pos
|
|
'neg)
|
|
1 2))
|
|
|
|
(test/neg-blame
|
|
'contract-arrow-star14
|
|
'((contract (->* (integer?) () #:rest (listof integer?) any)
|
|
(lambda (x . y) 1)
|
|
'pos
|
|
'neg)
|
|
1 2 'bad))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-star15
|
|
'(let-values ([(a b) ((contract (->* (integer?) () any)
|
|
(lambda (x) (values x x))
|
|
'pos
|
|
'neg)
|
|
2)])
|
|
1))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-star16
|
|
'((contract (->* (integer?) () any)
|
|
(lambda (x) x)
|
|
'pos
|
|
'neg)
|
|
2))
|
|
|
|
(test/neg-blame
|
|
'contract-arrow-star17
|
|
'((contract (->* (integer?) () any)
|
|
(lambda (x) (values x x))
|
|
'pos
|
|
'neg)
|
|
#f))
|
|
|
|
(test/pos-blame
|
|
'contract-arrow-star-arity-check1
|
|
'(contract (->* (integer?) () #:rest (listof integer?) (values integer? integer?))
|
|
(lambda (x) (values 1 #t))
|
|
'pos
|
|
'neg))
|
|
|
|
(test/pos-blame
|
|
'contract-arrow-star-arity-check2
|
|
'(contract (->* (integer?) () #:rest (listof integer?) (values integer? integer?))
|
|
(lambda (x y) (values 1 #t))
|
|
'pos
|
|
'neg))
|
|
|
|
(test/pos-blame
|
|
'contract-arrow-star-arity-check3
|
|
'(contract (->* (integer?) () #:rest (listof integer?) (values integer? integer?))
|
|
(case-lambda [(x y) #f] [(x y . z) #t])
|
|
'pos
|
|
'neg))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-star-arity-check4
|
|
'(contract (->* (integer?) () #:rest (listof integer?) (values integer? integer?))
|
|
(case-lambda [(x y) #f] [(x y . z) #t] [(x) #f])
|
|
'pos
|
|
'neg))
|
|
|
|
(test/pos-blame
|
|
'contract-arrow-star-keyword1
|
|
'(contract (->* (integer?) () #:rest (listof integer?) (values integer?))
|
|
(λ (x #:y y . args) x)
|
|
'pos
|
|
'neg))
|
|
|
|
(test/pos-blame
|
|
'contract-arrow-star-keyword2
|
|
'(contract (->* (integer?) () #:rest (listof integer?) any)
|
|
(λ (x #:y y . args) x)
|
|
'pos
|
|
'neg))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-star-keyword3
|
|
'(contract (->* (integer? #:y integer?) () #:rest (listof integer?) (values integer? integer?))
|
|
(λ (x #:y y . args) x)
|
|
'pos
|
|
'neg))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-star-keyword4
|
|
'(contract (->* (integer? #:y integer?) () #:rest (listof integer?) any)
|
|
(λ (x #:y y . args) x)
|
|
'pos
|
|
'neg))
|
|
|
|
(test/neg-blame
|
|
'contract-arrow-star-keyword5
|
|
'((contract (->* (integer? #:y integer?) () #:rest (listof integer?) (values integer? integer?))
|
|
(λ (x #:y y . args) x)
|
|
'pos
|
|
'neg)
|
|
1 #:y #t))
|
|
|
|
(test/neg-blame
|
|
'contract-arrow-star-keyword6
|
|
'((contract (->* (integer? #:y integer?) () #:rest (listof integer?) any)
|
|
(λ (x #:y y . args) x)
|
|
'pos
|
|
'neg)
|
|
1 #:y #t))
|
|
|
|
(test/neg-blame
|
|
'contract-arrow-star-keyword7
|
|
'((contract (->* (integer? #:y integer?) () #:rest (listof integer?) (values integer? integer?))
|
|
(λ (x #:y y . args) x)
|
|
'pos
|
|
'neg)
|
|
#t #:y 1))
|
|
|
|
(test/neg-blame
|
|
'contract-arrow-star-keyword8
|
|
'((contract (->* (integer? #:y integer?) () #:rest (listof integer?) any)
|
|
(λ (x #:y y . args) x)
|
|
'pos
|
|
'neg)
|
|
#t #:y 1))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-star-keyword9
|
|
'((contract (->* (integer? #:y integer?) () #:rest (listof integer?) (values integer? integer?))
|
|
(λ (x #:y y . args) (values x x))
|
|
'pos
|
|
'neg)
|
|
2 #:y 1))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-star-keyword10
|
|
'((contract (->* (integer? #:y integer?) () #:rest (listof integer?) any)
|
|
(λ (x #:y y . args) (values x x))
|
|
'pos
|
|
'neg)
|
|
2 #:y 1))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-star-optional1
|
|
'(contract (->* (#:x boolean?) (#:y string? #:z char? integer?) any)
|
|
(λ (#:x x #:y [s "s"] #:z [c #\c] [i 5])
|
|
(list x s c i))
|
|
'pos 'neg))
|
|
|
|
(test/pos-blame
|
|
'contract-arrow-star-optional2
|
|
'(contract (->* (#:x boolean?) (#:y string? #:z char? integer?) any)
|
|
(λ (#:x x #:z [c #\c] [i 5])
|
|
(list x s c i))
|
|
'pos 'neg))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-star-optional3
|
|
'(contract (->* (#:x boolean?) (#:z char? integer?) any)
|
|
(λ (#:x x #:y [s "s"] #:z [c #\c] [i 5])
|
|
(list x s c i))
|
|
'pos 'neg))
|
|
|
|
(test/pos-blame
|
|
'contract-arrow-star-optional4
|
|
'(contract (->* (#:x boolean?) (#:y string? #:z char? integer?) any)
|
|
(λ (#:x x #:y [s "s"] #:z [c #\c])
|
|
(list x s c i))
|
|
'pos 'neg))
|
|
|
|
(test/spec-passed/result
|
|
'contract-arrow-star-optional5
|
|
'((contract (->* (#:x boolean?) (#:y string? #:z char? integer?) any)
|
|
(λ (#:x x #:y [s "s"] #:z [c #\c] [i 5])
|
|
(list x s c i))
|
|
'pos 'neg)
|
|
#:x #t #:y "" #:z #\d 6)
|
|
'(#t "" #\d 6))
|
|
|
|
(test/spec-passed/result
|
|
'contract-arrow-star-optional6
|
|
'((contract (->* (#:x boolean?) (#:y string? #:z char? integer?) any)
|
|
(λ (#:x x #:y [s "s"] #:z [c #\c] [i 5])
|
|
(list x s c i))
|
|
'pos 'neg)
|
|
#:x #t)
|
|
'(#t "s" #\c 5))
|
|
|
|
(test/neg-blame
|
|
'contract-arrow-star-optional7
|
|
'((contract (->* (#:x boolean?) (#:y string? #:z char? integer?) any)
|
|
(λ (#:x x #:y [s "s"] #:z [c #\c] [i 5])
|
|
(list x s c i))
|
|
'pos 'neg)
|
|
#:x #t #:y 'x #:z #\d 6))
|
|
|
|
(test/neg-blame
|
|
'contract-arrow-star-optional8
|
|
'((contract (->* (#:x boolean?) (#:y string? #:z char? integer?) any)
|
|
(λ (#:x x #:y [s "s"] #:z [c #\c] [i 5])
|
|
(list x s c i))
|
|
'pos 'neg)
|
|
#:x #t #:y "" #:z 'x 6))
|
|
|
|
(test/neg-blame
|
|
'contract-arrow-star-optional9
|
|
'((contract (->* (#:x boolean?) (#:y string? #:z char? integer?) any)
|
|
(λ (#:x x #:y [s "s"] #:z [c #\c] [i 5])
|
|
(list x s c i))
|
|
'pos 'neg)
|
|
#:x #t #:y "" #:z #\d 'x))
|
|
|
|
(test/pos-blame
|
|
'contract-arrow-star-optional10
|
|
'(contract (->* (#:x boolean?) (#:y string?) any)
|
|
(λ (#:x [x #f] #:y s)
|
|
(list x s c i))
|
|
'pos 'neg))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-star-optional11
|
|
'(contract (->* (#:x boolean?) (#:y string? #:z char? integer?) (list/c boolean? string? char? integer?))
|
|
(λ (#:x x #:y [s "s"] #:z [c #\c] [i 5])
|
|
(list x s c i))
|
|
'pos 'neg))
|
|
|
|
(test/pos-blame
|
|
'contract-arrow-star-optional12
|
|
'(contract (->* (#:x boolean?) (#:y string? #:z char? integer?) (list/c boolean? string? char? integer?))
|
|
(λ (#:x x #:z [c #\c] [i 5])
|
|
(list x s c i))
|
|
'pos 'neg))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-star-optional13
|
|
'(contract (->* (#:x boolean?) (#:z char? integer?) (list/c boolean? string? char? integer?))
|
|
(λ (#:x x #:y [s "s"] #:z [c #\c] [i 5])
|
|
(list x s c i))
|
|
'pos 'neg))
|
|
|
|
(test/pos-blame
|
|
'contract-arrow-star-optional14
|
|
'(contract (->* (#:x boolean?) (#:y string? #:z char? integer?) (list/c boolean? string? char? integer?))
|
|
(λ (#:x x #:y [s "s"] #:z [c #\c])
|
|
(list x s c i))
|
|
'pos 'neg))
|
|
|
|
(test/spec-passed/result
|
|
'contract-arrow-star-optional15
|
|
'((contract (->* (#:x boolean?) (#:y string? #:z char? integer?) (list/c boolean? string? char? integer?))
|
|
(λ (#:x x #:y [s "s"] #:z [c #\c] [i 5])
|
|
(list x s c i))
|
|
'pos 'neg)
|
|
#:x #t #:y "" #:z #\d 6)
|
|
'(#t "" #\d 6))
|
|
|
|
(test/spec-passed/result
|
|
'contract-arrow-star-optional16
|
|
'((contract (->* (#:x boolean?) (#:y string? #:z char? integer?) (list/c boolean? string? char? integer?))
|
|
(λ (#:x x #:y [s "s"] #:z [c #\c] [i 5])
|
|
(list x s c i))
|
|
'pos 'neg)
|
|
#:x #t)
|
|
'(#t "s" #\c 5))
|
|
|
|
(test/neg-blame
|
|
'contract-arrow-star-optional17
|
|
'((contract (->* (#:x boolean?) (#:y string? #:z char? integer?) (list/c boolean? string? char? integer?))
|
|
(λ (#:x x #:y [s "s"] #:z [c #\c] [i 5])
|
|
(list x s c i))
|
|
'pos 'neg)
|
|
#:x #t #:y 'x #:z #\d 6))
|
|
|
|
(test/neg-blame
|
|
'contract-arrow-star-optional18
|
|
'((contract (->* (#:x boolean?) (#:y string? #:z char? integer?) (list/c boolean? string? char? integer?))
|
|
(λ (#:x x #:y [s "s"] #:z [c #\c] [i 5])
|
|
(list x s c i))
|
|
'pos 'neg)
|
|
#:x #t #:y "" #:z 'x 6))
|
|
|
|
(test/neg-blame
|
|
'contract-arrow-star-optional19
|
|
'((contract (->* (#:x boolean?) (#:y string? #:z char? integer?) (list/c boolean? string? char? integer?))
|
|
(λ (#:x x #:y [s "s"] #:z [c #\c] [i 5])
|
|
(list x s c i))
|
|
'pos 'neg)
|
|
#:x #t #:y "" #:z #\d 'x))
|
|
|
|
(test/pos-blame
|
|
'contract-arrow-star-optional20
|
|
'(contract (->* (#:x boolean?) (#:y string?) (list/c boolean? string? char? integer?))
|
|
(λ (#:x [x #f] #:y s)
|
|
(list x s c i))
|
|
'pos 'neg))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-star-optional21
|
|
'((contract (->* () () (values))
|
|
(λ () (values))
|
|
'pos 'neg)))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-star-optional22
|
|
'((contract (->* () () (values integer? char?))
|
|
(λ () (values 1 #\c))
|
|
'pos 'neg)))
|
|
|
|
(test/pos-blame
|
|
'contract-arrow-star-optional23
|
|
'((contract (->* () () (values integer? char?))
|
|
(λ () (values 1 2))
|
|
'pos 'neg)))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-star-keyword-ordering
|
|
'((contract (->* (integer? #:x boolean?) (string? #:y char?) any)
|
|
(λ (x #:x b [s ""] #:y [c #\c])
|
|
(list x b s c))
|
|
'pos
|
|
'neg)
|
|
1 "zz" #:x #f #:y #\d))
|
|
|
|
|
|
;
|
|
;
|
|
;
|
|
;
|
|
; ;
|
|
; ;;;
|
|
; ;;;;
|
|
; ;;;
|
|
; ;;;;; ;;;
|
|
; ;;;;; ;;;;
|
|
; ;;;
|
|
; ;
|
|
;
|
|
;
|
|
;
|
|
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-values1
|
|
'(let-values ([(a b) ((contract (-> integer? (values integer? integer?))
|
|
(lambda (x) (values x x))
|
|
'pos
|
|
'neg)
|
|
2)])
|
|
1))
|
|
|
|
(test/neg-blame
|
|
'contract-arrow-values2
|
|
'((contract (-> integer? (values integer? integer?))
|
|
(lambda (x) (values x x))
|
|
'pos
|
|
'neg)
|
|
#f))
|
|
|
|
(test/pos-blame
|
|
'contract-arrow-values3
|
|
'((contract (-> integer? (values integer? integer?))
|
|
(lambda (x) (values 1 #t))
|
|
'pos
|
|
'neg)
|
|
1))
|
|
|
|
(test/pos-blame
|
|
'contract-arrow-values4
|
|
'((contract (-> integer? (values integer? integer?))
|
|
(lambda (x) (values #t 1))
|
|
'pos
|
|
'neg)
|
|
1))
|
|
|
|
(test/pos-blame
|
|
'contract-arrow-keyword1
|
|
'(contract (-> integer? any)
|
|
(λ (x #:y y) x)
|
|
'pos
|
|
'neg))
|
|
|
|
(test/pos-blame
|
|
'contract-arrow-keyword1b
|
|
'(contract (-> integer? #:y integer? any)
|
|
(λ (x) x)
|
|
'pos
|
|
'neg))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-keyword2
|
|
'(contract (-> integer? #:y boolean? any)
|
|
(λ (x #:y y) x)
|
|
'pos
|
|
'neg))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-keyword2b
|
|
'(contract (-> #:x boolean? #:y boolean? any)
|
|
(λ (#:x x #:y y) x)
|
|
'pos
|
|
'neg))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-keyword2c
|
|
'(contract (-> #:y boolean? #:x boolean? any)
|
|
(λ (#:x x #:y y) x)
|
|
'pos
|
|
'neg))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-keyword2d
|
|
'(contract (-> #:y boolean? #:x boolean? any)
|
|
(λ (#:y y #:x x) x)
|
|
'pos
|
|
'neg))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-keyword2e
|
|
'(contract (-> #:x boolean? #:y boolean? any)
|
|
(λ (#:y y #:x x) x)
|
|
'pos
|
|
'neg))
|
|
|
|
(test/neg-blame
|
|
'contract-arrow-keyword3
|
|
'((contract (-> integer? #:y boolean? any)
|
|
(λ (x #:y y) x)
|
|
'pos
|
|
'neg)
|
|
1 #:y 1))
|
|
|
|
(test/neg-blame
|
|
'contract-arrow-keyword4
|
|
'((contract (-> integer? #:y boolean? any)
|
|
(λ (x #:y y) x)
|
|
'pos
|
|
'neg)
|
|
#t #:y #t))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-keyword5
|
|
'((contract (-> integer? #:y boolean? any)
|
|
(λ (x #:y y) x)
|
|
'pos
|
|
'neg)
|
|
1 #:y #t))
|
|
|
|
(test/pos-blame
|
|
'contract-arrow-keyword6
|
|
'(contract (-> integer? integer?)
|
|
(λ (x #:y y) x)
|
|
'pos
|
|
'neg))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-keyword7
|
|
'(contract (-> integer? #:y boolean? integer?)
|
|
(λ (x #:y y) x)
|
|
'pos
|
|
'neg))
|
|
|
|
(test/neg-blame
|
|
'contract-arrow-keyword8
|
|
'((contract (-> integer? #:y boolean? integer?)
|
|
(λ (x #:y y) x)
|
|
'pos
|
|
'neg)
|
|
1 #:y 1))
|
|
|
|
(test/neg-blame
|
|
'contract-arrow-keyword9
|
|
'((contract (-> integer? #:y boolean? integer?)
|
|
(λ (x #:y y) x)
|
|
'pos
|
|
'neg)
|
|
#t #:y #t))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-keyword10
|
|
'((contract (-> integer? #:y boolean? integer?)
|
|
(λ (x #:y y) x)
|
|
'pos
|
|
'neg)
|
|
1 #:y #t))
|
|
|
|
(test/pos-blame
|
|
'contract-arrow-keyword11
|
|
'(contract (-> integer? (values integer? integer?))
|
|
(λ (x #:y y) x)
|
|
'pos
|
|
'neg))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-keyword12
|
|
'(contract (-> integer? #:y boolean? (values integer? integer?))
|
|
(λ (x #:y y) x)
|
|
'pos
|
|
'neg))
|
|
|
|
(test/neg-blame
|
|
'contract-arrow-keyword13
|
|
'((contract (-> integer? #:y boolean? (values integer? integer?))
|
|
(λ (x #:y y) x)
|
|
'pos
|
|
'neg)
|
|
1 #:y 1))
|
|
|
|
(test/neg-blame
|
|
'contract-arrow-keyword14
|
|
'((contract (-> integer? #:y boolean? (values integer? integer?))
|
|
(λ (x #:y y) x)
|
|
'pos
|
|
'neg)
|
|
#t #:y #t))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-keyword15
|
|
'((contract (-> integer? #:y boolean? (values integer? integer?))
|
|
(λ (x #:y y) (values x x))
|
|
'pos
|
|
'neg)
|
|
1 #:y #t))
|
|
|
|
(test/spec-passed
|
|
'contract-arrow1
|
|
'(contract (integer? . -> . integer?) (lambda (x) x) 'pos 'neg))
|
|
|
|
;; make sure we skip the optimizations
|
|
(test/spec-passed
|
|
'contract-arrow1b
|
|
'(contract (integer? integer? integer? integer? integer? integer? integer? integer? integer? integer? . -> . integer?)
|
|
(lambda (x1 x2 x3 x4 x5 x6 x7 x8 x9 x10) x1) 'pos 'neg))
|
|
|
|
(test/pos-blame
|
|
'contract-arrow2
|
|
'(contract (integer? . -> . integer?) (lambda (x y) x) 'pos 'neg))
|
|
|
|
(test/neg-blame
|
|
'contract-arrow3
|
|
'((contract (integer? . -> . integer?) (lambda (x) #f) 'pos 'neg) #t))
|
|
|
|
(test/pos-blame
|
|
'contract-arrow4
|
|
'((contract (integer? . -> . integer?) (lambda (x) #f) 'pos 'neg) 1))
|
|
|
|
|
|
(test/spec-passed
|
|
'contract-arrow-any1
|
|
'(contract (integer? . -> . any) (lambda (x) x) 'pos 'neg))
|
|
|
|
(test/pos-blame
|
|
'contract-arrow-any2
|
|
'(contract (integer? . -> . any) (lambda (x y) x) 'pos 'neg))
|
|
|
|
(test/neg-blame
|
|
'contract-arrow-any3
|
|
'((contract (integer? . -> . any) (lambda (x) #f) 'pos 'neg) #t))
|
|
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;
|
|
;; procedure accepts-and-more
|
|
;;
|
|
|
|
(ctest #t procedure-accepts-and-more? (lambda (x . y) 1) 3)
|
|
(ctest #t procedure-accepts-and-more? (lambda (x . y) 1) 2)
|
|
(ctest #t procedure-accepts-and-more? (lambda (x . y) 1) 1)
|
|
(ctest #f procedure-accepts-and-more? (lambda (x . y) 1) 0)
|
|
|
|
(ctest #t procedure-accepts-and-more? (case-lambda [(x . y) 1] [(y) 1]) 3)
|
|
(ctest #t procedure-accepts-and-more? (case-lambda [(x . y) 1] [(y) 1]) 2)
|
|
(ctest #t procedure-accepts-and-more? (case-lambda [(x . y) 1] [(y) 1]) 1)
|
|
(ctest #f procedure-accepts-and-more? (case-lambda [(x . y) 1] [(y) 1]) 0)
|
|
|
|
(ctest #t procedure-accepts-and-more? (case-lambda [(x y . z) 1] [(x) 1]) 2)
|
|
(ctest #t procedure-accepts-and-more? (case-lambda [(x y . z) 1] [(x) 1]) 1)
|
|
(ctest #f procedure-accepts-and-more? (case-lambda [(x y . z) 1] [(x) 1]) 0)
|
|
|
|
|
|
;
|
|
;
|
|
;
|
|
; ;;;;
|
|
; ; ;;;;
|
|
; ;;; ;;;;;;;
|
|
; ;;;; ;;;;;;;;
|
|
; ;;; ;;;;;;;;;
|
|
; ;;;;; ;;; ;;;; ;;;;
|
|
; ;;;;; ;;;; ;;;;;;;;;
|
|
; ;;; ;;;;;;;;
|
|
; ; ;;;;;;;
|
|
;
|
|
;
|
|
;
|
|
|
|
(test/spec-passed
|
|
'->d1
|
|
'((contract (->d () () [x number?]) (lambda () 1) 'pos 'neg)))
|
|
|
|
(test/spec-passed
|
|
'->d2
|
|
'((contract (->d ([x number?]) () (values [r number?])) (lambda (x) (+ x 1)) 'pos 'neg) 1))
|
|
|
|
(test/pos-blame
|
|
'->d3
|
|
'((contract (->d () () [r number?]) 1 'pos 'neg)))
|
|
|
|
(test/pos-blame
|
|
'->d4
|
|
'((contract (->d () () [r number?]) (lambda (x) x) 'pos 'neg)))
|
|
|
|
(test/neg-blame
|
|
'->d5
|
|
'((contract (->d ([x number?]) () any) (lambda (x) (+ x 1)) 'pos 'neg) #f))
|
|
|
|
(test/pos-blame
|
|
'->d6
|
|
'((contract (->d ([x number?]) () [r (<=/c x)]) (lambda (x) (+ x 1)) 'pos 'neg) 1))
|
|
|
|
(test/spec-passed
|
|
'->d7
|
|
'((contract (->d ([x number?] [y (<=/c x)]) () [r (<=/c x)]) (lambda (x y) (- x 1)) 'pos 'neg) 1 0))
|
|
|
|
(test/neg-blame
|
|
'->d8
|
|
'((contract (->d ([x number?] [y (<=/c x)]) () [r (<=/c x)]) (lambda (x y) (+ x 1)) 'pos 'neg) 1 2))
|
|
|
|
(test/spec-passed
|
|
'->d9
|
|
'((contract (->d ([y (<=/c x)] [x number?]) () [r (<=/c x)]) (lambda (y x) (- x 1)) 'pos 'neg) 1 2))
|
|
|
|
(test/neg-blame
|
|
'->d10
|
|
'((contract (->d ([y (<=/c x)] [x number?]) () [r (<=/c x)]) (lambda (y x) (+ x 1)) 'pos 'neg) 1 0))
|
|
|
|
(test/spec-passed
|
|
'->d11
|
|
'((contract (->d () () #:rest rest any/c [r number?]) (lambda x 1) 'pos 'neg)))
|
|
|
|
(test/spec-passed
|
|
'->d12
|
|
'((contract (->d ([x number?]) () #:rest rest any/c [r number?]) (lambda (x . y) (+ x 1)) 'pos 'neg) 1))
|
|
|
|
(test/pos-blame
|
|
'->d13
|
|
'((contract (->d () () #:rest rest any/c [r number?]) 1 'pos 'neg)))
|
|
|
|
(test/pos-blame
|
|
'->d14
|
|
'((contract (->d () () #:rest rest any/c [r number?]) (lambda (x) x) 'pos 'neg)))
|
|
|
|
(test/neg-blame
|
|
'->d15
|
|
'((contract (->d ([x number?]) () #:rest rest any/c any) (lambda (x . y) (+ x 1)) 'pos 'neg) #f))
|
|
|
|
(test/pos-blame
|
|
'->d16
|
|
'((contract (->d ([x number?]) () #:rest rest any/c [r (<=/c x)]) (lambda (x . y) (+ x 1)) 'pos 'neg) 1))
|
|
|
|
(test/spec-passed
|
|
'->d17
|
|
'((contract (->d ([x number?] [y (<=/c x)]) () #:rest rest any/c [r (<=/c x)]) (lambda (x y . z) (- x 1)) 'pos 'neg) 1 0))
|
|
|
|
(test/neg-blame
|
|
'->d18
|
|
'((contract (->d ([x number?] [y (<=/c x)]) () #:rest rest any/c [r (<=/c x)]) (lambda (x y . z) (+ x 1)) 'pos 'neg) 1 2))
|
|
|
|
(test/spec-passed
|
|
'->d19
|
|
'((contract (->d ([y (<=/c x)] [x number?]) () #:rest rest any/c [r (<=/c x)]) (lambda (y x . z) (- x 1)) 'pos 'neg) 1 2))
|
|
|
|
(test/neg-blame
|
|
'->d20
|
|
'((contract (->d ([y (<=/c x)] [x number?]) () #:rest rest any/c [r (<=/c x)]) (lambda (y x . z) (+ x 1)) 'pos 'neg) 1 0))
|
|
|
|
(test/spec-passed
|
|
'->d21
|
|
'((contract (->d () () #:rest rst (listof number?) [r any/c]) (lambda w 1) 'pos 'neg) 1))
|
|
|
|
(test/neg-blame
|
|
'->d22
|
|
'((contract (->d () () #:rest rst (listof number?) [r any/c]) (lambda w 1) 'pos 'neg) #f))
|
|
|
|
(test/spec-passed
|
|
'->d-any1
|
|
'((contract (->d () () any) (lambda () 1) 'pos 'neg)))
|
|
|
|
(test/spec-passed
|
|
'->d-any2
|
|
'((contract (->d ([x number?]) () any) (lambda (x) (+ x 1)) 'pos 'neg) 1))
|
|
|
|
(test/pos-blame
|
|
'->d-any3
|
|
'((contract (->d () () any) 1 'pos 'neg)))
|
|
|
|
(test/pos-blame
|
|
'->d-any4
|
|
'((contract (->d () () any) (lambda (x) x) 'pos 'neg)))
|
|
|
|
(test/neg-blame
|
|
'->d-any5
|
|
'((contract (->d ([x number?]) () any) (lambda (x) (+ x 1)) 'pos 'neg) #f))
|
|
|
|
(test/spec-passed
|
|
'->d-any6
|
|
'((contract (->d ([x number?] [y (<=/c x)]) () any) (lambda (x y) (- x 1)) 'pos 'neg) 1 0))
|
|
|
|
(test/neg-blame
|
|
'->d-any7
|
|
'((contract (->d ([x number?] [y (<=/c x)]) () any) (lambda (x y) (+ x 1)) 'pos 'neg) 1 2))
|
|
|
|
(test/spec-passed
|
|
'->d-any8
|
|
'((contract (->d ([y (<=/c x)] [x number?]) () any) (lambda (y x) (- x 1)) 'pos 'neg) 1 2))
|
|
|
|
(test/neg-blame
|
|
'->d-any9
|
|
'((contract (->d ([y (<=/c x)] [x number?]) () any) (lambda (y x) (+ x 1)) 'pos 'neg) 1 0))
|
|
|
|
(test/spec-passed
|
|
'->d-any10
|
|
'((contract (->d () () #:rest rest any/c any) (lambda x 1) 'pos 'neg)))
|
|
|
|
(test/spec-passed
|
|
'->d-any11
|
|
'((contract (->d ([x number?]) () #:rest rest any/c any) (lambda (x . y) (+ x 1)) 'pos 'neg) 1))
|
|
|
|
(test/pos-blame
|
|
'->d-any12
|
|
'((contract (->d () () #:rest rest any/c any) 1 'pos 'neg)))
|
|
|
|
(test/pos-blame
|
|
'->d-any13
|
|
'((contract (->d () () #:rest rest any/c any) (lambda (x) x) 'pos 'neg)))
|
|
|
|
(test/neg-blame
|
|
'->d-any14
|
|
'((contract (->d ([x number?]) () #:rest rest any/c any) (lambda (x . y) (+ x 1)) 'pos 'neg) #f))
|
|
|
|
(test/spec-passed
|
|
'->d-any15
|
|
'((contract (->d ([x number?] [y (<=/c x)]) () #:rest rest any/c any) (lambda (x y . z) (- x 1)) 'pos 'neg) 1 0))
|
|
|
|
(test/neg-blame
|
|
'->d-any16
|
|
'((contract (->d ([x number?] [y (<=/c x)]) () #:rest rest any/c any) (lambda (x y . z) (+ x 1)) 'pos 'neg) 1 2))
|
|
|
|
(test/spec-passed
|
|
'->d-any17
|
|
'((contract (->d ([y (<=/c x)] [x number?]) () #:rest rest any/c any) (lambda (y x . z) (- x 1)) 'pos 'neg) 1 2))
|
|
|
|
(test/neg-blame
|
|
'->d-any18
|
|
'((contract (->d ([y (<=/c x)] [x number?]) () #:rest rest any/c any) (lambda (y x . z) (+ x 1)) 'pos 'neg) 1 0))
|
|
|
|
(test/spec-passed
|
|
'->d-any19
|
|
'((contract (->d () () #:rest rst (listof number?) any) (lambda w 1) 'pos 'neg) 1))
|
|
|
|
(test/neg-blame
|
|
'->d-any20
|
|
'((contract (->d () () #:rest rst (listof number?) any) (lambda w 1) 'pos 'neg) #f))
|
|
|
|
(test/spec-passed
|
|
'->d-values1
|
|
'((contract (->d () () (values [x boolean?] [y number?])) (lambda () (values #t 1)) 'pos 'neg)))
|
|
|
|
(test/spec-passed
|
|
'->d-values2
|
|
'((contract (->d ([x number?]) () (values [z boolean?] [y number?])) (lambda (x) (values #t (+ x 1))) 'pos 'neg) 1))
|
|
|
|
(test/pos-blame
|
|
'->d-values3
|
|
'((contract (->d () () (values [x boolean?] [y number?])) 1 'pos 'neg)))
|
|
|
|
(test/pos-blame
|
|
'->d-values4
|
|
'((contract (->d () () (values [x boolean?] [y number?])) (lambda (x) x) 'pos 'neg)))
|
|
|
|
(test/neg-blame
|
|
'->d-values5
|
|
'((contract (->d ([x number?]) () (values [y boolean?] [z (<=/c x)])) (lambda (x) (+ x 1)) 'pos 'neg) #f))
|
|
|
|
(test/pos-blame
|
|
'->d-values6
|
|
'((contract (->d ([x number?]) () (values [y boolean?] [z (<=/c x)])) (lambda (x) (values #t (+ x 1))) 'pos 'neg) 1))
|
|
|
|
(test/spec-passed
|
|
'->d-values7
|
|
'((contract (->d ([x number?] [y (<=/c x)]) () (values [z boolean?] [w (<=/c x)]))
|
|
(lambda (x y) (values #t (- x 1)))
|
|
'pos
|
|
'neg)
|
|
1
|
|
0))
|
|
|
|
(test/neg-blame
|
|
'->d-values8
|
|
'((contract (->d ([x number?] [y (<=/c x)]) () (values [z boolean?] [w (<=/c x)]))
|
|
(lambda (x y) (values #f (+ x 1)))
|
|
'pos
|
|
'neg)
|
|
1
|
|
2))
|
|
|
|
(test/spec-passed
|
|
'->d-values9
|
|
'((contract (->d ([y (<=/c x)] [x number?]) () (values [z boolean?] [w (<=/c x)]))
|
|
(lambda (y x) (values #f (- x 1)))
|
|
'pos
|
|
'neg)
|
|
1
|
|
2))
|
|
|
|
(test/neg-blame
|
|
'->d-values10
|
|
'((contract (->d ([y (<=/c x)] [x number?]) () (values [z boolean?] [w (<=/c x)]))
|
|
(lambda (y x) (values #f (+ x 1))) 'pos 'neg)
|
|
1 0))
|
|
|
|
(test/spec-passed
|
|
'->d-values11
|
|
'((contract (->d () () #:rest rest any/c (values [z boolean?] [w number?])) (lambda x (values #f 1)) 'pos 'neg)))
|
|
|
|
(test/spec-passed
|
|
'->d-values12
|
|
'((contract (->d ([x number?]) () #:rest rest any/c (values [z boolean?] [w number?]))
|
|
(lambda (x . y) (values #f (+ x 1)))
|
|
'pos
|
|
'neg)
|
|
1))
|
|
|
|
(test/pos-blame
|
|
'->d-values13
|
|
'((contract (->d () () #:rest rest any/c (values [z boolean?] [w number?])) 1 'pos 'neg)))
|
|
|
|
(test/pos-blame
|
|
'->d-values14
|
|
'((contract (->d () () #:rest rest any/c (values [z boolean?] [w number?])) (lambda (x) x) 'pos 'neg)))
|
|
|
|
(test/neg-blame
|
|
'->d-values15
|
|
'((contract (->d ([x number?]) () #:rest rest any/c (values [z boolean?] [w (<=/c x)]))
|
|
(lambda (x . y) (+ x 1)) 'pos 'neg)
|
|
#f))
|
|
|
|
(test/pos-blame
|
|
'->d-values16
|
|
'((contract (->d ([x number?]) () #:rest rest any/c (values [z boolean?] [w (<=/c x)]))
|
|
(lambda (x . y) (values #f (+ x 1))) 'pos 'neg)
|
|
1))
|
|
|
|
(test/spec-passed
|
|
'->d-values17
|
|
'((contract (->d ([x number?] [y (<=/c x)]) () #:rest rest any/c (values [z boolean?] [w (<=/c x)]))
|
|
(lambda (x y . z) (values #f (- x 1))) 'pos 'neg)
|
|
1 0))
|
|
|
|
(test/neg-blame
|
|
'->d-values18
|
|
'((contract (->d ([x number?] [y (<=/c x)]) () #:rest rest any/c (values [z boolean?] [w (<=/c x)]))
|
|
(lambda (x y . z) (values #f (+ x 1))) 'pos 'neg)
|
|
1 2))
|
|
|
|
(test/spec-passed
|
|
'->d-values19
|
|
'((contract (->d ([y (<=/c x)] [x number?]) () #:rest rest any/c (values [z boolean?] [w (<=/c x)]))
|
|
(lambda (y x . z) (values #f (- x 1))) 'pos 'neg)
|
|
1 2))
|
|
|
|
(test/neg-blame
|
|
'->d-values20
|
|
'((contract (->d ([y (<=/c x)] [x number?]) () #:rest rest any/c (values [z boolean?] [w (<=/c x)]))
|
|
(lambda (y x . z) (values #f (+ x 1))) 'pos 'neg)
|
|
1 0))
|
|
|
|
(test/spec-passed
|
|
'->d-values21
|
|
'((contract (->d () () #:rest rst (listof number?) (values [z boolean?] [w any/c])) (lambda w (values #f 1)) 'pos 'neg) 1))
|
|
|
|
(test/neg-blame
|
|
'->d-values22
|
|
'((contract (->d () () #:rest rst (listof number?) (values [z boolean?] [w any/c])) (lambda w (values #f 1)) 'pos 'neg) #f))
|
|
|
|
(test/spec-passed
|
|
'->d-values23
|
|
'((contract (->d () () (values [x number?] [y (>=/c x)])) (lambda () (values 1 2)) 'pos 'neg)))
|
|
|
|
(test/pos-blame
|
|
'->d-values24
|
|
'((contract (->d () () (values [x number?] [y (>=/c x)])) (lambda () (values 2 1)) 'pos 'neg)))
|
|
|
|
(test/spec-passed
|
|
'->d-values25
|
|
'((contract (->d ([x number?]) () (values [z number?] [y (>=/c x)])) (lambda (x) (values 1 2)) 'pos 'neg) 1))
|
|
|
|
(test/pos-blame
|
|
'->d-values26
|
|
'((contract (->d ([x number?]) () (values [z number?] [y (>=/c x)])) (lambda (x) (values 2 1)) 'pos 'neg) 4))
|
|
|
|
(test/spec-passed/result
|
|
'->d23
|
|
'((contract (->d ((i number?) (j (and/c number? (>=/c i)))) () [r number?])
|
|
(λ (i j) 1)
|
|
'pos
|
|
'neg)
|
|
1
|
|
2)
|
|
1)
|
|
|
|
(test/spec-passed/result
|
|
'->d24
|
|
'((contract (->d ((i number?) (j (and/c number? (>=/c i)))) () any)
|
|
(λ (i j) 1)
|
|
'pos
|
|
'neg)
|
|
1
|
|
2)
|
|
1)
|
|
|
|
(test/spec-passed/result
|
|
'->d25
|
|
'(call-with-values
|
|
(λ ()
|
|
((contract (->d ((i number?) (j (and/c number? (>=/c i)))) () (values [x number?] [y number?]))
|
|
(λ (i j) (values 1 2))
|
|
'pos
|
|
'neg)
|
|
1
|
|
2))
|
|
list)
|
|
'(1 2))
|
|
|
|
(test/spec-passed/result
|
|
'->d26
|
|
'((contract (->d ((i number?) (j (and/c number? (>=/c i)))) () #:rest rest-args any/c [r number?])
|
|
(λ (i j . z) 1)
|
|
'pos
|
|
'neg)
|
|
1
|
|
2)
|
|
1)
|
|
|
|
(test/spec-passed/result
|
|
'->d27
|
|
'((contract (->d ((i number?) (j (and/c number? (>=/c i)))) () #:rest rest-args any/c any)
|
|
(λ (i j . z) 1)
|
|
'pos
|
|
'neg)
|
|
1
|
|
2)
|
|
1)
|
|
|
|
(test/spec-passed/result
|
|
'->d28
|
|
'(call-with-values
|
|
(λ ()
|
|
((contract (->d ((i number?) (j (and/c number? (>=/c i)))) () #:rest rest-args any/c (values [x number?] [y number?]))
|
|
(λ (i j . z) (values 1 2))
|
|
'pos
|
|
'neg)
|
|
1
|
|
2))
|
|
list)
|
|
'(1 2))
|
|
|
|
(test/neg-blame
|
|
'->d30
|
|
'((contract (->d ([x number?]) () #:rest rst number? any)
|
|
(λ (x . rst) (values 4 5))
|
|
'pos
|
|
'neg)))
|
|
|
|
(test/pos-blame
|
|
'->d-arity1
|
|
'(contract (->d ([x number?]) () any) (λ () 1) 'pos 'neg))
|
|
|
|
(test/pos-blame
|
|
'->d-arity2
|
|
'(contract (->d ([x number?]) () any) (λ (x #:y y) 1) 'pos 'neg))
|
|
|
|
(test/spec-passed
|
|
'->d-arity3
|
|
'(contract (->d ([x number?] #:y [y integer?]) () any) (λ (x #:y y) 1) 'pos 'neg))
|
|
|
|
(test/pos-blame
|
|
'->d-arity4
|
|
'(contract (->d () ([x integer?]) any) (λ (x) 1) 'pos 'neg))
|
|
|
|
(test/pos-blame
|
|
'->d-arity5
|
|
'(contract (->d () ([x integer?]) any) (λ () 1) 'pos 'neg))
|
|
|
|
(test/spec-passed
|
|
'->d-arity6
|
|
'(contract (->d () ([x integer?]) any) (λ ([x 1]) 1) 'pos 'neg))
|
|
|
|
(test/pos-blame
|
|
'->d-arity7
|
|
'(contract (->d () (#:x [x integer?]) any) (λ ([x 1]) 1) 'pos 'neg))
|
|
|
|
(test/pos-blame
|
|
'->d-arity8
|
|
'(contract (->d () (#:x [x integer?]) any) (λ () 1) 'pos 'neg))
|
|
|
|
(test/pos-blame
|
|
'->d-arity8
|
|
'(contract (->d () (#:x [x integer?]) any) (λ (#:x x) 1) 'pos 'neg))
|
|
|
|
(test/spec-passed
|
|
'->d-arity10
|
|
'(contract (->d () (#:x [x integer?]) any) (λ (#:x [x 1]) 1) 'pos 'neg))
|
|
|
|
(test/pos-blame
|
|
'->d-pp1
|
|
'((contract (->d ([x number?]) () #:pre-cond (= x 1) [result number?] #:post-cond (= x 2))
|
|
(λ (x) x)
|
|
'pos
|
|
'neg)
|
|
1))
|
|
|
|
(test/neg-blame
|
|
'->d-pp2
|
|
'((contract (->d ([x number?]) () #:pre-cond (= x 1) [result number?] #:post-cond (= x 2))
|
|
(λ (x) x)
|
|
'pos
|
|
'neg)
|
|
2))
|
|
|
|
(test/pos-blame
|
|
'->d-pp3
|
|
'((contract (->d ([x number?]) () #:pre-cond (= x 1) [result number?] #:post-cond (= result 2))
|
|
(λ (x) x)
|
|
'pos
|
|
'neg)
|
|
1))
|
|
|
|
(test/spec-passed
|
|
'->d-pp3.5
|
|
'((contract (->d ([x number?]) () #:pre-cond (= x 1) [result number?] #:post-cond (= result 2))
|
|
(λ (x) 2)
|
|
'pos
|
|
'neg)
|
|
1))
|
|
|
|
(test/neg-blame
|
|
'->d-pp4
|
|
'((contract (->d ([x number?]) () #:pre-cond (= x 1) any)
|
|
(λ (x) x)
|
|
'pos
|
|
'neg)
|
|
2))
|
|
|
|
(test/neg-blame
|
|
'->d-pp5
|
|
'((contract (->d ([x number?]) () #:pre-cond (= x 1) (values [z number?] [y number?]) #:post-cond (= x y z 3))
|
|
(λ (x) (values 4 5))
|
|
'pos
|
|
'neg)
|
|
2))
|
|
|
|
(test/pos-blame
|
|
'->d-pp6
|
|
'((contract (->d ([x number?]) () #:pre-cond (= x 1) (values [z number?] [y number?]) #:post-cond (= z y 3))
|
|
(λ (x) (values 4 5))
|
|
'pos
|
|
'neg)
|
|
1))
|
|
|
|
(test/pos-blame
|
|
'->d-pp-r1
|
|
'((contract (->d ([x number?]) () #:rest rst any/c #:pre-cond (= x 1) [result number?] #:post-cond (= x 2))
|
|
(λ (x . rst) x)
|
|
'pos
|
|
'neg)
|
|
1))
|
|
|
|
(test/neg-blame
|
|
'->d-pp-r2
|
|
'((contract (->d ([x number?]) () #:rest rst any/c #:pre-cond (= x 1) [result number?] #:post-cond (= x 2))
|
|
(λ (x . rst) x)
|
|
'pos
|
|
'neg)
|
|
2))
|
|
|
|
(test/pos-blame
|
|
'->d-pp-r3
|
|
'((contract (->d ([x number?]) () #:rest rst any/c #:pre-cond (= x 1) [result number?] #:post-cond (= result 2))
|
|
(λ (x . rst) x)
|
|
'pos
|
|
'neg)
|
|
1))
|
|
|
|
(test/spec-passed
|
|
'->d-pp-r3.5
|
|
'((contract (->d ([x number?]) () #:rest rst any/c #:pre-cond (= x 1) [result number?] #:post-cond (= result 2))
|
|
(λ (x . rst) 2)
|
|
'pos
|
|
'neg)
|
|
1))
|
|
|
|
(test/neg-blame
|
|
'->d-pp-r4
|
|
'((contract (->d ([x number?]) () #:rest rst any/c #:pre-cond (= x 1) any)
|
|
(λ (x . rst) x)
|
|
'pos
|
|
'neg)
|
|
2))
|
|
|
|
(test/neg-blame
|
|
'->d-pp-r5
|
|
'((contract (->d ([x number?]) () #:rest rst any/c #:pre-cond (= x 1) (values [z number?] [y number?]) #:post-cond (= x y z 3))
|
|
(λ (x . rst) (values 4 5))
|
|
'pos
|
|
'neg)
|
|
2))
|
|
|
|
(test/pos-blame
|
|
'->d-pp-r6
|
|
'((contract (->d ([x number?]) () #:rest rst any/c #:pre-cond (= x 1) (values [z number?] [y number?]) #:post-cond (= z x y 3))
|
|
(λ (x . rst) (values 4 5))
|
|
'pos
|
|
'neg)
|
|
1))
|
|
|
|
(test/neg-blame
|
|
'->d-protect-shared-state
|
|
'(let ([x 1])
|
|
((contract (let ([save #f])
|
|
(-> (->d () () #:pre-cond (set! save x) [range any/c] #:post-cond (= save x))
|
|
any))
|
|
(λ (t) (t))
|
|
'pos
|
|
'neg)
|
|
(lambda () (set! x 2)))))
|
|
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;
|
|
;; make sure the variables are all bound properly
|
|
;;
|
|
|
|
(test/spec-passed
|
|
'->d-binding1
|
|
'((contract (->d ([x number?]) () #:rest rest any/c [range any/c] #:post-cond (equal? rest '(2 3 4)))
|
|
(λ (x . y) y)
|
|
'pos
|
|
'neg)
|
|
1 2 3 4))
|
|
|
|
(test/spec-passed
|
|
'->d-binding2
|
|
'((contract (->d ([x number?]) () #:rest rest any/c [range any/c] #:post-cond (equal? x 1))
|
|
(λ (x . y) y)
|
|
'pos
|
|
'neg)
|
|
1 2 3 4))
|
|
|
|
(test/spec-passed
|
|
'->d-binding3
|
|
'(let ([p 'p]
|
|
[q 'q]
|
|
[r 'r])
|
|
((contract (->d ([x number?] [y number?] #:z [z number?] #:w [w number?])
|
|
([a number?] [b number?] #:c [c number?] #:d [d number?])
|
|
#:rest rest any/c
|
|
#:pre-cond (equal? (list x y z w a b c d rest p q r)
|
|
(list 1 2 3 4 5 6 7 8 '(z) 'p 'q 'r))
|
|
(values [p number?] [q number?] [r number?]))
|
|
(λ (x y #:z z #:w w [a 101] [b 102] #:c [c 103] #:d [d 104] . rest)
|
|
(values 11 12 13))
|
|
'pos
|
|
'neg)
|
|
1 2 #:z 3 #:w 4 5 6 #:c 7 #:d 8 'z)))
|
|
|
|
(test/spec-passed
|
|
'->d-binding4
|
|
'((contract (->d ([x number?] [y number?] #:z [z number?] #:w [w number?])
|
|
([a number?] [b number?] #:c [c number?] #:d [d number?])
|
|
#:rest rest any/c
|
|
(values [p number?] [q number?] [r number?])
|
|
#:post-cond (equal? (list x y z w a b c d rest p q r)
|
|
(list 1 2 3 4 5 6 7 8 '(z) 11 12 13)))
|
|
(λ (x y #:z z #:w w [a 101] [b 102] #:c [c 103] #:d [d 104] . rest)
|
|
(values 11 12 13))
|
|
'pos
|
|
'neg)
|
|
1 2 #:z 3 #:w 4 5 6 #:c 7 #:d 8 'z))
|
|
|
|
(test/spec-passed
|
|
'->d-binding5
|
|
'(let ([p 'p]
|
|
[q 'q]
|
|
[r 'r])
|
|
((contract (->d ([x number?] [y number?] #:z [z number?] #:w [w number?])
|
|
([a number?] [b number?] #:c [c number?] #:d [d number?])
|
|
#:rest rest any/c
|
|
#:pre-cond (equal? (list x y z w a b c d rest p q r)
|
|
(list 1 2 3 4
|
|
the-unsupplied-arg the-unsupplied-arg the-unsupplied-arg the-unsupplied-arg
|
|
'() 'p 'q 'r))
|
|
(values [p number?] [q number?] [r number?]))
|
|
(λ (x y #:z z #:w w [a 101] [b 102] #:c [c 103] #:d [d 104] . rest)
|
|
(values 11 12 13))
|
|
'pos
|
|
'neg)
|
|
1 2 #:z 3 #:w 4)))
|
|
|
|
(test/spec-passed
|
|
'->d-binding6
|
|
'((contract (->d ([x number?] [y number?] #:z [z number?] #:w [w number?])
|
|
([a number?] [b number?] #:c [c number?] #:d [d number?])
|
|
#:rest rest any/c
|
|
(values [p number?] [q number?] [r number?])
|
|
#:post-cond (equal? (list x y z w a b c d rest p q r)
|
|
(list 1 2 3 4
|
|
the-unsupplied-arg the-unsupplied-arg the-unsupplied-arg the-unsupplied-arg
|
|
'() 11 12 13)))
|
|
(λ (x y #:z z #:w w [a 101] [b 102] #:c [c 103] #:d [d 104] . rest)
|
|
(values 11 12 13))
|
|
'pos
|
|
'neg)
|
|
1 2 #:z 3 #:w 4))
|
|
|
|
;; test that the rest parameter is right when there aren't enough arguments to even make it to the rest parameter
|
|
(test/spec-passed
|
|
'->d-binding7
|
|
'((contract (->d ()
|
|
([a number?])
|
|
#:rest rest any/c
|
|
any
|
|
#:post-cond (equal? (list a rest) (list the-unsupplied-arg '())))
|
|
(λ ([a 1] . rest) 1)
|
|
'pos
|
|
'neg)))
|
|
|
|
(test/pos-blame
|
|
'->d-underscore1
|
|
'((contract (->d ([b (box/c integer?)])
|
|
()
|
|
[_ (let ([old (unbox b)])
|
|
(and/c
|
|
void?
|
|
(λ (new)
|
|
(printf "old ~a new ~a\n" old (unbox b))
|
|
(= old (unbox b)))))])
|
|
(λ (b)
|
|
(set-box! b (+ (unbox b) 1)))
|
|
'pos
|
|
'neg)
|
|
(box 1)))
|
|
|
|
(test/spec-passed/result
|
|
'->d-underscore2
|
|
'(let ([x '()])
|
|
((contract (->d () () [_ (begin (set! x (cons 'ctc x)) any/c)])
|
|
(λ () (set! x (cons 'body x)))
|
|
'pos
|
|
'neg))
|
|
x)
|
|
'(body ctc))
|
|
|
|
(test/spec-passed/result
|
|
'->d-underscore3
|
|
'(let ([x '()])
|
|
((contract (->d () () [res (begin (set! x (cons 'ctc x)) any/c)])
|
|
(λ () (set! x (cons 'body x)))
|
|
'pos
|
|
'neg))
|
|
x)
|
|
'(ctc body))
|
|
|
|
(test/spec-passed/result
|
|
'->d-underscore4
|
|
'((contract (->d ([str any/c]) () #:rest rest (listof any/c) [_ any/c])
|
|
(λ (x . y) (cons x y))
|
|
'pos 'neg)
|
|
1 2 3)
|
|
'(1 2 3))
|
|
|
|
(test/spec-passed/result
|
|
'->d-underscore5
|
|
'((contract (->d ([str any/c]) () #:rest rest (listof any/c) [_ any/c])
|
|
(λ (x . y) (cons x y))
|
|
'pos 'neg)
|
|
1 2 3 4 5)
|
|
'(1 2 3 4 5))
|
|
|
|
;
|
|
;
|
|
;
|
|
;
|
|
; ;
|
|
; ;;;;; ;;;;;;; ;;;;; ;;; ;;;
|
|
; ;;;;;; ;;;;;;;; ;;;;;; ;;;;; ;;;;
|
|
; ;;;;;;; ;;;; ;;;; ;;;; ;; ;;;
|
|
; ;;;; ;;;;;;; ;;;; ;;;;;;; ;;;;; ;;;
|
|
; ;;;;;;; ;; ;;;; ;;;; ;;;;; ;;;;; ;;;;
|
|
; ;;;;;; ;;;;;;;; ;;;;;; ;;;;;; ;;;
|
|
; ;;;;; ;; ;;;; ;;;;; ;;;; ;
|
|
;
|
|
;
|
|
;
|
|
|
|
|
|
(test/spec-passed
|
|
'contract-case->0a
|
|
'(contract (case->)
|
|
(lambda (x) x)
|
|
'pos
|
|
'neg))
|
|
|
|
(test/spec-passed
|
|
'contract-case->0b
|
|
'(contract (case->)
|
|
(lambda () 1)
|
|
'pos
|
|
'neg))
|
|
|
|
(test/pos-blame
|
|
'contract-case->0c
|
|
'(contract (case->)
|
|
1
|
|
'pos
|
|
'neg))
|
|
|
|
(test/spec-passed
|
|
'contract-case->0d
|
|
'(contract (case->)
|
|
(case-lambda)
|
|
'pos
|
|
'neg))
|
|
|
|
|
|
(test/pos-blame
|
|
'contract-case->1
|
|
'(contract (case-> (integer? integer? . -> . integer?) (integer? . -> . integer?))
|
|
(lambda (x) x)
|
|
'pos
|
|
'neg))
|
|
|
|
(test/pos-blame
|
|
'contract-case->2
|
|
'((contract (case-> (integer? integer? . -> . integer?) (integer? . -> . integer?))
|
|
(case-lambda
|
|
[(x y) 'case1]
|
|
[(x) 'case2])
|
|
'pos
|
|
'neg)
|
|
1 2))
|
|
|
|
(test/pos-blame
|
|
'contract-case->3
|
|
'((contract (case-> (integer? integer? . -> . integer?) (integer? . -> . integer?))
|
|
(case-lambda
|
|
[(x y) 'case1]
|
|
[(x) 'case2])
|
|
'pos
|
|
'neg)
|
|
1))
|
|
|
|
(test/neg-blame
|
|
'contract-case->4
|
|
'((contract (case-> (integer? integer? . -> . integer?) (integer? . -> . integer?))
|
|
(case-lambda
|
|
[(x y) 'case1]
|
|
[(x) 'case2])
|
|
'pos
|
|
'neg)
|
|
'a 2))
|
|
|
|
(test/neg-blame
|
|
'contract-case->5
|
|
'((contract (case-> (integer? integer? . -> . integer?) (integer? . -> . integer?))
|
|
(case-lambda
|
|
[(x y) 'case1]
|
|
[(x) 'case2])
|
|
'pos
|
|
'neg)
|
|
2 'a))
|
|
|
|
(test/neg-blame
|
|
'contract-case->6
|
|
'((contract (case-> (integer? integer? . -> . integer?) (integer? . -> . integer?))
|
|
(case-lambda
|
|
[(x y) 'case1]
|
|
[(x) 'case2])
|
|
'pos
|
|
'neg)
|
|
#t))
|
|
|
|
(test/pos-blame
|
|
'contract-case->7
|
|
'((contract (case-> (integer? integer? . -> . integer?) (-> integer? #:rest any/c boolean?))
|
|
(lambda x #\a)
|
|
'pos
|
|
'neg)
|
|
1 2))
|
|
|
|
|
|
(test/pos-blame
|
|
'contract-case->8
|
|
'((contract (case-> (integer? integer? . -> . integer?) (-> integer? #:rest any/c boolean?))
|
|
(lambda x #t)
|
|
'pos
|
|
'neg)
|
|
1 2))
|
|
|
|
(test/spec-passed
|
|
'contract-case->8
|
|
'((contract (case-> (integer? integer? . -> . integer?) (-> integer? #:rest any/c boolean?))
|
|
(lambda x 1)
|
|
'pos
|
|
'neg)
|
|
1 2))
|
|
|
|
(test/spec-passed/result
|
|
'contract-case->9
|
|
'((contract (case-> (-> integer? any))
|
|
(lambda (x) 1)
|
|
'pos
|
|
'neg)
|
|
1)
|
|
1)
|
|
|
|
(test/neg-blame
|
|
'contract-case->10
|
|
'((contract (case-> (-> integer? any))
|
|
(lambda (x) 1)
|
|
'pos
|
|
'neg)
|
|
#f))
|
|
|
|
(test/pos-blame
|
|
'contract-case->11
|
|
'(contract (case-> (-> integer? any) (-> integer? integer? any))
|
|
(lambda (x) 1)
|
|
'pos
|
|
'neg))
|
|
|
|
(test/neg-blame
|
|
'contract-case->12
|
|
'((contract (case-> (-> integer? any) (-> integer? integer? any))
|
|
(case-lambda [(x) 1] [(x y) 1])
|
|
'pos
|
|
'neg)
|
|
#f))
|
|
|
|
(test/spec-passed/result
|
|
'contract-case->13
|
|
'((contract (case-> (-> integer? any) (-> integer? integer? any))
|
|
(case-lambda [(x) 1] [(x y) 1])
|
|
'pos
|
|
'neg)
|
|
1)
|
|
1)
|
|
|
|
(test/spec-passed/result
|
|
'contract-case->14
|
|
'(let ([f
|
|
(contract (case-> (-> char?) (-> integer? boolean?) (-> symbol? input-port? string?))
|
|
(case-lambda
|
|
[() #\a]
|
|
[(x) (= x 0)]
|
|
[(sym port)
|
|
(string-append
|
|
(symbol->string sym)
|
|
(read port))])
|
|
'pos
|
|
'neg)])
|
|
(list (f)
|
|
(f 1)
|
|
(f 'x (open-input-string (format "~s" "string")))))
|
|
(list #\a #f "xstring"))
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;; ;;
|
|
;; case-> arity checking tests ;;
|
|
;; ;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
(test/well-formed '(case-> (-> integer? integer?)))
|
|
(test/well-formed '(case-> (-> integer? integer?) (-> integer? integer? integer?)))
|
|
(test/well-formed '(case-> (-> integer? integer?) (-> integer? integer? any)))
|
|
(test/well-formed '(case-> (-> integer? any) (-> integer? integer? any)))
|
|
|
|
;
|
|
;
|
|
;
|
|
; ; ;; ;;;;
|
|
; ;; ;; ;;;;
|
|
; ;;;; ;;;; ;;;; ;;; ;;;;; ;;;; ;;;; ;;; ;;;;; ;;;;; ;;; ;;; ;;;;;;; ;;;; ;;; ;;; ;;;;;;;
|
|
; ;;;; ;;;; ;;;;;;;;; ;;;;;; ;;;;;; ;;;;;;;;; ;;;;;; ;;;;;; ;;;;;;; ;;;;;;;; ;;;; ;;;;;;;;; ;;;;; ;;;;;;;;
|
|
; ;;;; ;;;; ;;;; ;;;; ;;;;;;; ;;;;;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;; ;;;; ;;;; ;;;; ;;;; ;;;; ;; ;;;;;;;;;
|
|
; ;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;;;;;;; ;;;; ;;;; ;;;; ;;;;;;; ;;;; ;;;;
|
|
; ;;;; ;;;; ;;;; ;;;; ;;;;;;; ;;;;;;;; ;;;; ;;;; ;;;; ;;;;; ;;;; ;; ;;;; ;;;; ;;;; ;;;; ;;;;; ;;;;;;;;;
|
|
; ;;;;;;;;; ;;;; ;;;; ;;;;;; ;;;;;; ;;;; ;;;; ;;;;;; ;;;;; ;;;; ;;;;;;;; ;;;; ;;;; ;;;; ;;;;;; ;;;;;;;;
|
|
; ;;; ;;;; ;;;; ;;;; ;;;;; ;;;; ;;;; ;;;; ;;;;; ;;;; ;;;; ;; ;;;; ;;;; ;;;; ;;;; ;;;; ;;;;;;;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
; ;;;; ;;
|
|
; ;;;; ;; ;
|
|
; ;;;;;;; ;;;; ;;;;;;; ;;;; ;;;;;;; ;;;; ;;; ;;;
|
|
; ;;;;;;;; ;;;;;; ;;;;;;;;;;;;; ;;;;;;;; ;;;; ;;;;;;;;; ;;;;
|
|
; ;;;;;;;;; ;;;;;;;; ;;;; ;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;;;
|
|
; ;;;; ;;;; ;;;; ;;; ;;;; ;;; ;;;; ;;;;;;; ;;;; ;;;; ;;;; ;;;;; ;;;
|
|
; ;;;;;;;;; ;;;;;;;; ;;;; ;;; ;;;; ;; ;;;; ;;;; ;;;; ;;;; ;;;;; ;;;;
|
|
; ;;;;;;;; ;;;;;; ;;;; ;;; ;;;; ;;;;;;;; ;;;; ;;;; ;;;; ;;;
|
|
; ;;;;;;; ;;;; ;;;; ;;; ;;;; ;; ;;;; ;;;; ;;;; ;;;; ;
|
|
;
|
|
;
|
|
;
|
|
|
|
|
|
(test/spec-passed
|
|
'unconstrained-domain->1
|
|
'(contract (unconstrained-domain-> number?) (λ (x) x) 'pos 'neg))
|
|
(test/pos-blame
|
|
'unconstrained-domain->2
|
|
'(contract (unconstrained-domain-> number?) 1 'pos 'neg))
|
|
(test/spec-passed
|
|
'unconstrained-domain->3
|
|
'((contract (unconstrained-domain-> number?) (λ (x) x) 'pos 'neg) 1))
|
|
(test/pos-blame
|
|
'unconstrained-domain->4
|
|
'((contract (unconstrained-domain-> number?) (λ (x) x) 'pos 'neg) #f))
|
|
|
|
(test/spec-passed/result
|
|
'unconstrained-domain->5
|
|
'((contract (->d ([size natural-number/c]
|
|
[proc (and/c (unconstrained-domain-> number?)
|
|
(λ (p) (procedure-arity-includes? p size)))])
|
|
()
|
|
[range number?])
|
|
(λ (i f) (apply f (build-list i add1)))
|
|
'pos
|
|
'neg)
|
|
10 +)
|
|
55)
|
|
|
|
;
|
|
;
|
|
;
|
|
; ;;
|
|
; ;;
|
|
; ;;;; ;;; ;;; ;; ;;;;;
|
|
; ;;;;;; ;;;;;;; ;; ;;;;;;
|
|
; ;;;;;;;; ;;;; ;; ;;;;;;;;;
|
|
; ;;;; ;;; ;;;; ;; ;;;;
|
|
; ;;;;;;;; ;;;; ;; ;;;;;;;
|
|
; ;;;;;; ;;;; ;; ;;;;;;
|
|
; ;;;; ;;;; ;; ;;;;;
|
|
; ;;
|
|
;
|
|
;
|
|
|
|
|
|
(test/pos-blame
|
|
'or/c1
|
|
'(contract (or/c false/c) #t 'pos 'neg))
|
|
|
|
(test/spec-passed
|
|
'or/c2
|
|
'(contract (or/c false/c) #f 'pos 'neg))
|
|
|
|
(test/spec-passed
|
|
'or/c3
|
|
'((contract (or/c (-> integer? integer?)) (lambda (x) x) 'pos 'neg) 1))
|
|
|
|
(test/neg-blame
|
|
'or/c4
|
|
'((contract (or/c (-> integer? integer?)) (lambda (x) x) 'pos 'neg) #f))
|
|
|
|
(test/pos-blame
|
|
'or/c5
|
|
'((contract (or/c (-> integer? integer?)) (lambda (x) #f) 'pos 'neg) 1))
|
|
|
|
(test/spec-passed
|
|
'or/c6
|
|
'(contract (or/c false/c (-> integer? integer?)) #f 'pos 'neg))
|
|
|
|
(test/spec-passed
|
|
'or/c7
|
|
'((contract (or/c false/c (-> integer? integer?)) (lambda (x) x) 'pos 'neg) 1))
|
|
|
|
(test/spec-passed/result
|
|
'or/c8
|
|
'((contract ((or/c false/c (-> string?)) . -> . any)
|
|
(λ (y) y)
|
|
'pos
|
|
'neg)
|
|
#f)
|
|
#f)
|
|
|
|
(test/spec-passed/result
|
|
'or/c9
|
|
'((contract (or/c (-> string?) (-> integer? integer?))
|
|
(λ () "x")
|
|
'pos
|
|
'neg))
|
|
"x")
|
|
|
|
(test/spec-passed/result
|
|
'or/c10
|
|
'((contract (or/c (-> string?) (-> integer? integer?))
|
|
(λ (x) x)
|
|
'pos
|
|
'neg)
|
|
1)
|
|
1)
|
|
|
|
(test/pos-blame
|
|
'or/c11
|
|
'(contract (or/c (-> string?) (-> integer? integer?))
|
|
1
|
|
'pos
|
|
'neg))
|
|
|
|
(test/pos-blame
|
|
'or/c12
|
|
'((contract (or/c (-> string?) (-> integer? integer?))
|
|
1
|
|
'pos
|
|
'neg)
|
|
'x))
|
|
|
|
(test/pos-blame
|
|
'or/c13
|
|
'(contract (or/c not) #t 'pos 'neg))
|
|
|
|
(test/spec-passed
|
|
'or/c14
|
|
'(contract (or/c not) #f 'pos 'neg))
|
|
|
|
(test/spec-passed/result
|
|
'or/c-not-error-early
|
|
'(begin (or/c (-> integer? integer?) (-> boolean? boolean?))
|
|
1)
|
|
1)
|
|
|
|
(contract-error-test
|
|
#'(contract (or/c (-> integer? integer?) (-> boolean? boolean?))
|
|
(λ (x) x)
|
|
'pos
|
|
'neg)
|
|
exn:fail?)
|
|
|
|
(test/spec-passed/result
|
|
'or/c-ordering
|
|
'(let ([x '()])
|
|
(contract (or/c (lambda (y) (set! x (cons 2 x)) #f) (lambda (y) (set! x (cons 1 x)) #t))
|
|
'anything
|
|
'pos
|
|
'neg)
|
|
x)
|
|
'(1 2))
|
|
|
|
(test/spec-passed/result
|
|
'or/c-ordering2
|
|
'(let ([x '()])
|
|
(contract (or/c (lambda (y) (set! x (cons 2 x)) #t) (lambda (y) (set! x (cons 1 x)) #t))
|
|
'anything
|
|
'pos
|
|
'neg)
|
|
x)
|
|
'(2))
|
|
|
|
|
|
;
|
|
;
|
|
;
|
|
; ;;;; ;;
|
|
; ;;;; ;;
|
|
; ;;;;;;; ;;;; ;;; ;;;;;;; ;; ;;;;;
|
|
; ;;;;;;;; ;;;;;;;;; ;;;;;;;; ;; ;;;;;;
|
|
; ;;;; ;;;; ;;;; ;;;;;;;;; ;;;;;;;;;
|
|
; ;;;;;;; ;;;; ;;;; ;;;; ;;;; ;; ;;;;
|
|
; ;; ;;;; ;;;; ;;;; ;;;;;;;;; ;; ;;;;;;;
|
|
; ;;;;;;;; ;;;; ;;;; ;;;;;;;; ;; ;;;;;;
|
|
; ;; ;;;; ;;;; ;;;; ;;;;;;; ;; ;;;;;
|
|
; ;;
|
|
;
|
|
;
|
|
|
|
(test/spec-passed
|
|
'and/c1
|
|
'((contract (and/c (-> (<=/c 100) (<=/c 100))
|
|
(-> (>=/c -100) (>=/c -100)))
|
|
(λ (x) x)
|
|
'pos
|
|
'neg)
|
|
1))
|
|
|
|
(test/neg-blame
|
|
'and/c2
|
|
'((contract (and/c (-> (<=/c 100) (<=/c 100))
|
|
(-> (>=/c -100) (>=/c -100)))
|
|
(λ (x) x)
|
|
'pos
|
|
'neg)
|
|
200))
|
|
|
|
(test/pos-blame
|
|
'and/c3
|
|
'((contract (and/c (-> (<=/c 100) (<=/c 100))
|
|
(-> (>=/c -100) (>=/c -100)))
|
|
(λ (x) 200)
|
|
'pos
|
|
'neg)
|
|
1))
|
|
|
|
|
|
|
|
|
|
(test/spec-passed/result
|
|
'and/c-ordering
|
|
'(let ([x '()])
|
|
(contract (and/c (lambda (y) (set! x (cons 2 x)) #t) (lambda (y) (set! x (cons 1 x)) #t))
|
|
'anything
|
|
'pos
|
|
'neg)
|
|
x)
|
|
'(1 2))
|
|
|
|
(test/spec-passed/result
|
|
'ho-and/c-ordering
|
|
'(let ([x '()])
|
|
((contract (and/c (-> (lambda (y) (set! x (cons 1 x)) #t)
|
|
(lambda (y) (set! x (cons 2 x)) #t))
|
|
(-> (lambda (y) (set! x (cons 3 x)) #t)
|
|
(lambda (y) (set! x (cons 4 x)) #t)))
|
|
(λ (x) x)
|
|
'pos
|
|
'neg)
|
|
1)
|
|
x)
|
|
(reverse '(1 3 4 2)))
|
|
|
|
|
|
;
|
|
;
|
|
;
|
|
; ; ;;
|
|
; ;; ;;
|
|
; ;;;;;;; ;;;;;;; ;;; ;;; ;;;;;;; ;;;;;;; ;;;; ;;; ;;;;; ;;; ;;; ;;; ;; ;;;;;
|
|
; ;;;;;;;; ;;;;;;;; ;;;;;;; ;;;;;;;; ;;;;;;;;;;;;; ;;;;; ;;;;;; ;;;;; ;;;;;;; ;; ;;;;;;
|
|
; ;;;;;;;;; ;;;; ;;;; ;; ;;;; ;;;; ;;; ;;;; ;;;; ;; ;;;; ;;;; ;; ;;;; ;; ;;;;;;;;;
|
|
; ;;;; ;;;; ;;;;;;; ;;;; ;;;;;;; ;;;; ;;; ;;;; ;;;;;;; ;;;; ;;;;;;; ;;;; ;; ;;;;
|
|
; ;;;;;;;;; ;; ;;;; ;;;; ;; ;;;; ;;;; ;;; ;;;; ;;;;; ;;;;; ;;;;; ;;;; ;; ;;;;;;;
|
|
; ;;;;;;;; ;;;;;;;; ;;;; ;;;;;;;; ;;;; ;;; ;;;; ;;;;;; ;;;;; ;;;;;; ;;;; ;; ;;;;;;
|
|
; ;;;;;;; ;; ;;;; ;;;; ;; ;;;; ;;;; ;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;; ;;;;;
|
|
; ;;;; ;;
|
|
; ;;;;
|
|
;
|
|
|
|
|
|
(test/neg-blame
|
|
'parameter/c1
|
|
'((contract (parameter/c integer?)
|
|
(make-parameter 1)
|
|
'pos 'neg)
|
|
#f))
|
|
|
|
(test/pos-blame
|
|
'parameter/c1
|
|
'((contract (parameter/c integer?)
|
|
(make-parameter 'not-an-int)
|
|
'pos 'neg)))
|
|
|
|
|
|
|
|
;
|
|
;
|
|
;
|
|
; ;;;; ;; ; ; ;
|
|
; ;;;; ;; ;; ;; ;;
|
|
; ;;;; ;;;;;;; ;;; ;;;;; ;;;;; ;;;;; ;;;; ;;;; ;;; ;;;;; ;;; ;;; ;;;;;;; ;;;;; ;;;;;
|
|
; ;;;;;; ;;;;;;;; ;;;; ;;;;; ;;;;;; ;;;;;; ;;;;;; ;;;;;; ;;;;;;;;; ;;;;;; ;;;;;;; ;;;;;;;; ;;;;;; ;;;;;;
|
|
; ;;;;;;;; ;;;;;;;;; ;;;; ;;;; ;; ;;;;;;; ;;;; ;;;;;;; ;;;;;;;; ;;;; ;;;; ;;;; ;;;; ;; ;;;; ;;;;;;; ;;;;
|
|
; ;;;; ;;; ;;;; ;;;; ;;;; ;;;;;;; ;;;; ;;;; ;;;;;;;;; ;;;; ;;; ;;;; ;;;; ;;;; ;;;; ;;;;;;; ;;;; ;;;;
|
|
; ;;;;;;;; ;;;;;;;;; ;;;; ;;;;; ;;;;;;; ;;;;; ;;;;;;;;;;;; ;;;;;;;; ;;;; ;;;; ;;;;; ;;;; ;; ;;;; ;;;;;;; ;;;;;
|
|
; ;;;;;; ;;;;;;;; ;;;; ;;;;;; ;;;;;; ;;;;; ;;;;;; ;;;;;; ;;;; ;;;; ;;;;; ;;;; ;;;;;;;; ;;;;;; ;;;;;
|
|
; ;;;; ;;;;;;; ;;;;; ;;;; ;;;;; ;;;; ;;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;; ;;;; ;;;;; ;;;;
|
|
; ;;;;;
|
|
; ;;;;
|
|
;
|
|
|
|
|
|
(test/spec-passed
|
|
'object-contract0
|
|
'(contract (object-contract)
|
|
(new object%)
|
|
'pos
|
|
'neg))
|
|
|
|
(test/pos-blame
|
|
'object-contract/field1
|
|
'(contract (object-contract (field x integer?))
|
|
(new object%)
|
|
'pos
|
|
'neg))
|
|
|
|
(test/pos-blame
|
|
'object-contract/field2
|
|
'(contract (object-contract (field x integer?))
|
|
(new (class object% (field [x #t]) (super-new)))
|
|
'pos
|
|
'neg))
|
|
|
|
(test/spec-passed/result
|
|
'object-contract/field3
|
|
'(get-field
|
|
x
|
|
(contract (object-contract (field x integer?))
|
|
(new (class object% (field [x 12]) (super-new)))
|
|
'pos
|
|
'neg))
|
|
12)
|
|
|
|
(test/pos-blame
|
|
'object-contract/field4
|
|
'(contract (object-contract (field x boolean?) (field y boolean?))
|
|
(new (class object% (field [x #t] [y 'x]) (super-new)))
|
|
'pos
|
|
'neg))
|
|
|
|
(test/pos-blame
|
|
'object-contract/field5
|
|
'(contract (object-contract (field x symbol?) (field y symbol?))
|
|
(new (class object% (field [x #t] [y 'x]) (super-new)))
|
|
'pos
|
|
'neg))
|
|
|
|
(test/spec-passed/result
|
|
'object-contract/field6
|
|
'(let ([o (contract (object-contract [m (integer? . -> . integer?)])
|
|
(new (class object% (field [x 1]) (define/public (m y) x) (super-new)))
|
|
'pos
|
|
'neg)])
|
|
(list (send o m 2)
|
|
(send/apply o m '(2))
|
|
(let ([x '(2)]) (send o m . x))
|
|
(with-method ([mm (o m)])
|
|
(mm 2))
|
|
(send* o (m 3) (m 4))))
|
|
(list 1 1 1 1 1))
|
|
|
|
(test/spec-passed/result
|
|
'object-contract/field7
|
|
'(let ([o (contract (object-contract)
|
|
(new (class object% (field [x 1]) (define/public (m y) x) (super-new)))
|
|
'pos
|
|
'neg)])
|
|
(list (send o m 2)
|
|
(send/apply o m '(2))
|
|
(let ([x '(2)]) (send o m . x))
|
|
(with-method ([mm (o m)])
|
|
(mm 2))
|
|
(send* o (m 3) (m 4))))
|
|
(list 1 1 1 1 1))
|
|
|
|
(test/spec-passed/result
|
|
'object-contract/field8
|
|
'(let ([o (contract (object-contract [m (integer? . -> . integer?)])
|
|
(new (class object% (define x 6) (define/public (m y) x) (super-new)))
|
|
'pos
|
|
'neg)])
|
|
(list (send o m 2)
|
|
(send/apply o m '(2))
|
|
(let ([x '(2)]) (send o m . x))
|
|
(with-method ([mm (o m)])
|
|
(mm 2))
|
|
(send* o (m 3) (m 4))))
|
|
(list 6 6 6 6 6))
|
|
|
|
(test/spec-passed/result
|
|
'object-contract/field9
|
|
'(let ([o (contract (object-contract)
|
|
(new (class object% (define x 6) (define/public (m y) x) (super-new)))
|
|
'pos
|
|
'neg)])
|
|
(list (send o m 2)
|
|
(send/apply o m '(2))
|
|
(let ([x '(2)]) (send o m . x))
|
|
(with-method ([mm (o m)])
|
|
(mm 2))
|
|
(send* o (m 3) (m 4))))
|
|
(list 6 6 6 6 6))
|
|
|
|
(test/spec-passed/result
|
|
'object-contract/field10
|
|
'(send (contract (object-contract)
|
|
(new (class object% (define x 1) (define/public (m y) x) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
2)
|
|
1)
|
|
|
|
(test/spec-passed/result
|
|
'object-contract->1
|
|
'(send
|
|
(contract (object-contract (m (integer? . -> . integer?)))
|
|
(new (class object% (define/public (m x) x) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
1)
|
|
1)
|
|
|
|
(test/pos-blame
|
|
'object-contract->2
|
|
'(contract (object-contract (m (integer? . -> . integer?)))
|
|
(make-object object%)
|
|
'pos
|
|
'neg))
|
|
|
|
(test/neg-blame
|
|
'object-contract->3
|
|
'(send
|
|
(contract (object-contract (m (integer? . -> . integer?)))
|
|
(make-object (class object% (define/public (m x) x) (super-instantiate ())))
|
|
'pos
|
|
'neg)
|
|
m
|
|
'x))
|
|
|
|
(test/pos-blame
|
|
'object-contract->4
|
|
'(send
|
|
(contract (object-contract (m (integer? . -> . integer?)))
|
|
(make-object (class object% (define/public (m x) 'x) (super-instantiate ())))
|
|
'pos
|
|
'neg)
|
|
m
|
|
1))
|
|
|
|
(test/pos-blame
|
|
'object-contract->5
|
|
'(contract (object-contract (m (integer? integer? . -> . integer?)))
|
|
(make-object (class object% (define/public (m x) 'x) (super-instantiate ())))
|
|
'pos
|
|
'neg))
|
|
|
|
(test/spec-passed/result
|
|
'object-contract->6
|
|
'(send
|
|
(contract (object-contract (m (integer? . -> . any)))
|
|
(new (class object% (define/public (m x) x) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
1)
|
|
1)
|
|
|
|
(test/neg-blame
|
|
'object-contract->7
|
|
'(send
|
|
(contract (object-contract (m (integer? . -> . any)))
|
|
(make-object (class object% (define/public (m x) x) (super-instantiate ())))
|
|
'pos
|
|
'neg)
|
|
m
|
|
'x))
|
|
|
|
(test/spec-passed
|
|
'object-contract->8
|
|
'(begin
|
|
(send
|
|
(contract (object-contract (m (integer? . -> . any)))
|
|
(make-object (class object% (define/public (m x) (values 1 2)) (super-instantiate ())))
|
|
'pos
|
|
'neg)
|
|
m
|
|
1)
|
|
(void)))
|
|
|
|
(test/spec-passed
|
|
'object-contract->9
|
|
'(begin
|
|
(send
|
|
(contract (object-contract (m (integer? . -> . any)))
|
|
(make-object (class object% (define/public (m x) (values)) (super-instantiate ())))
|
|
'pos
|
|
'neg)
|
|
m
|
|
1)
|
|
(void)))
|
|
|
|
(test/spec-passed
|
|
'object-contract->10
|
|
'(begin
|
|
(send (contract (object-contract (m (integer? . -> . (values integer? boolean?))))
|
|
(make-object (class object% (define/public (m x) (values 1 #t)) (super-instantiate ())))
|
|
'pos
|
|
'neg)
|
|
m 1)
|
|
(void)))
|
|
|
|
(test/neg-blame
|
|
'object-contract->11
|
|
'(send
|
|
(contract (object-contract (m (integer? . -> . (values integer? boolean?))))
|
|
(make-object (class object% (define/public (m x) (values #t #t)) (super-instantiate ())))
|
|
'pos
|
|
'neg)
|
|
m
|
|
#f))
|
|
|
|
(test/pos-blame
|
|
'object-contract->12
|
|
'(send
|
|
(contract (object-contract (m (integer? . -> . (values integer? boolean?))))
|
|
(make-object (class object% (define/public (m x) (values #t #t)) (super-instantiate ())))
|
|
'pos
|
|
'neg)
|
|
m
|
|
1))
|
|
|
|
(test/pos-blame
|
|
'object-contract->13
|
|
'(send (contract (object-contract (m (integer? . -> . (values integer? boolean?))))
|
|
(make-object (class object% (define/public (m x) (values #f #t)) (super-instantiate ())))
|
|
'pos
|
|
'neg)
|
|
m 1))
|
|
|
|
(test/pos-blame
|
|
'object-contract->14
|
|
'(send (contract (object-contract (m (integer? . -> . (values integer? boolean?))))
|
|
(make-object (class object% (define/public (m x) (values 5 6)) (super-instantiate ())))
|
|
'pos
|
|
'neg)
|
|
m 1))
|
|
|
|
(test/pos-blame
|
|
'object-contract-case->1
|
|
'(contract (object-contract (m (case-> (boolean? . -> . boolean?)
|
|
(integer? integer? . -> . integer?))))
|
|
(new object%)
|
|
'pos
|
|
'neg))
|
|
|
|
(test/pos-blame
|
|
'object-contract-case->2
|
|
'(contract (object-contract (m (case-> (boolean? . -> . boolean?)
|
|
(integer? integer? . -> . integer?))))
|
|
(new (class object% (define/public (m x) x) (super-new)))
|
|
'pos
|
|
'neg))
|
|
|
|
(test/pos-blame
|
|
'object-contract-case->3
|
|
'(contract (object-contract (m (case-> (boolean? . -> . boolean?)
|
|
(integer? integer? . -> . integer?))))
|
|
(new (class object% (define/public (m x y) x) (super-new)))
|
|
'pos
|
|
'neg))
|
|
|
|
(test/spec-passed
|
|
'object-contract-case->4
|
|
'(contract (object-contract (m (case-> (boolean? . -> . boolean?)
|
|
(integer? integer? . -> . integer?))))
|
|
(new (class object%
|
|
(define/public m
|
|
(case-lambda
|
|
[(b) (not b)]
|
|
[(x y) (+ x y)]))
|
|
(super-new)))
|
|
'pos
|
|
'neg))
|
|
|
|
(test/spec-passed/result
|
|
'object-contract-case->5
|
|
'(send (contract (object-contract (m (case-> (boolean? . -> . boolean?)
|
|
(integer? integer? . -> . integer?))))
|
|
(new (class object%
|
|
(define/public m
|
|
(case-lambda
|
|
[(b) (not b)]
|
|
[(x y) (+ x y)]))
|
|
(super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
#t)
|
|
#f)
|
|
|
|
(test/spec-passed/result
|
|
'object-contract-case->6
|
|
'(send (contract (object-contract (m (case-> (boolean? . -> . boolean?)
|
|
(integer? integer? . -> . integer?))))
|
|
(new (class object%
|
|
(define/public m
|
|
(case-lambda
|
|
[(b) (not b)]
|
|
[(x y) (+ x y)]))
|
|
(super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
3
|
|
4)
|
|
7)
|
|
|
|
(test/pos-blame
|
|
'object-contract->*1
|
|
'(contract (object-contract (m (->* (integer?) (symbol? boolean?) number?)))
|
|
(new (class object%
|
|
(define/public m
|
|
(lambda (x [y 'a])
|
|
x))
|
|
(super-new)))
|
|
'pos
|
|
'neg))
|
|
|
|
(test/pos-blame
|
|
'object-contract->*2
|
|
'(contract (object-contract (m (->* (integer?) (symbol? boolean?) number?)))
|
|
(new (class object%
|
|
(define/public m
|
|
(lambda (x y [z #t])
|
|
x))
|
|
(super-new)))
|
|
'pos
|
|
'neg))
|
|
|
|
(test/spec-passed
|
|
'object-contract->*3
|
|
'(contract (object-contract (m (->* (integer?) (symbol? boolean?) number?)))
|
|
(new (class object%
|
|
(define/public m
|
|
(lambda (x [y 'a] [z #t])
|
|
x))
|
|
(super-new)))
|
|
'pos
|
|
'neg))
|
|
|
|
(test/spec-passed/result
|
|
'object-contract->*4
|
|
'(send (contract (object-contract (m (->* (integer?) (symbol? boolean?) number?)))
|
|
(new (class object%
|
|
(define/public m
|
|
(lambda (x [y 'a] [z #t])
|
|
x))
|
|
(super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
1)
|
|
1)
|
|
|
|
(test/spec-passed/result
|
|
'object-contract->*5
|
|
'(send (contract (object-contract (m (->* (integer?) (symbol? boolean?) number?)))
|
|
(new (class object%
|
|
(define/public m
|
|
(lambda (x [y 'a] [z #t])
|
|
x))
|
|
(super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
2
|
|
'z)
|
|
2)
|
|
|
|
(test/spec-passed/result
|
|
'object-contract->*7
|
|
'(send (contract (object-contract (m (->* (integer?) (symbol? boolean?) number?)))
|
|
(new (class object%
|
|
(define/public m
|
|
(lambda (x [y 'a] [z #t])
|
|
x))
|
|
(super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
3
|
|
'z
|
|
#f)
|
|
3)
|
|
|
|
(test/neg-blame
|
|
'object-contract->*8
|
|
'(send (contract (object-contract (m (->* (integer?) (symbol? boolean?) number?)))
|
|
(new (class object%
|
|
(define/public m
|
|
(lambda (x [y 'a] [z #t])
|
|
x))
|
|
(super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
#f))
|
|
|
|
(test/neg-blame
|
|
'object-contract->*9
|
|
'(send (contract (object-contract (m (->* (integer?) (symbol? boolean?) number?)))
|
|
(new (class object%
|
|
(define/public m
|
|
(lambda (x [y 'a] [z #t])
|
|
x))
|
|
(super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
2
|
|
4))
|
|
|
|
(test/neg-blame
|
|
'object-contract->*10
|
|
'(send (contract (object-contract (m (->* (integer?) (symbol? boolean?) number?)))
|
|
(new (class object%
|
|
(define/public m
|
|
(lambda (x [y 'a] [z #t])
|
|
x))
|
|
(super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
3
|
|
'z
|
|
'y))
|
|
|
|
(test/pos-blame
|
|
'object-contract->*11
|
|
'(send (contract (object-contract (m (->* (integer?) (symbol? boolean?) number?)))
|
|
(new (class object%
|
|
(define/public m
|
|
(lambda (x [y 'a] [z #t])
|
|
'x))
|
|
(super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
3
|
|
'z
|
|
#f))
|
|
|
|
(test/spec-passed/result
|
|
'object-contract->*12
|
|
'(let-values ([(x y)
|
|
(send (contract (object-contract (m (->* (integer?) (symbol? boolean?) (values number? symbol?))))
|
|
(new (class object%
|
|
(define/public m
|
|
(lambda (x [y 'a] [z #t])
|
|
(values 1 'x)))
|
|
(super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
3
|
|
'z
|
|
#f)])
|
|
(cons x y))
|
|
(cons 1 'x))
|
|
|
|
(test/pos-blame
|
|
'object-contract->*13
|
|
'(send (contract (object-contract (m (->* (integer?) (symbol? boolean?) (values number? symbol?))))
|
|
(new (class object%
|
|
(define/public m
|
|
(lambda (x [y 'a] [z #t])
|
|
(values 'x 'x)))
|
|
(super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
3
|
|
'z
|
|
#f))
|
|
|
|
(test/pos-blame
|
|
'object-contract->*14
|
|
'(send (contract (object-contract (m (->* (integer?) (symbol? boolean?) (values number? symbol?))))
|
|
(new (class object%
|
|
(define/public m
|
|
(lambda (x [y 'a] [z #t])
|
|
(values 1 1)))
|
|
(super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
3
|
|
'z
|
|
#f))
|
|
|
|
(test/pos-blame
|
|
'object-contract->*1
|
|
'(contract (object-contract (m (-> integer? boolean?)))
|
|
(new (class object% (define/public (m x y) x) (super-new)))
|
|
'pos
|
|
'neg))
|
|
|
|
(test/neg-blame
|
|
'object-contract->*2
|
|
'(send (contract (object-contract (m (-> integer? boolean?)))
|
|
(new (class object% (define/public (m x) x) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m #f))
|
|
|
|
(test/pos-blame
|
|
'object-contract->*3
|
|
'(send (contract (object-contract (m (-> integer? boolean?)))
|
|
(new (class object% (define/public (m x) x) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m 1))
|
|
|
|
(test/spec-passed
|
|
'object-contract->*4
|
|
'(send (contract (object-contract (m (-> integer? boolean?)))
|
|
(new (class object% (define/public (m x) #f) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m 1))
|
|
|
|
(test/pos-blame
|
|
'object-contract->*5
|
|
'(contract (object-contract (m (->* (integer?) () #:rest any/c boolean?)))
|
|
(new (class object% (define/public (m x y . z) x) (super-new)))
|
|
'pos
|
|
'neg))
|
|
|
|
(test/neg-blame
|
|
'object-contract->*6
|
|
'(send (contract (object-contract (m (->* (integer?) () #:rest any/c boolean?)))
|
|
(new (class object% (define/public (m x . z) x) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m #t))
|
|
|
|
(test/pos-blame
|
|
'object-contract->*7
|
|
'(send (contract (object-contract (m (->* (integer?) () #:rest any/c boolean?)))
|
|
(new (class object% (define/public (m x . z) 1) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m 1))
|
|
|
|
(test/spec-passed
|
|
'object-contract->*8
|
|
'(send (contract (object-contract (m (->* (integer?) () #:rest any/c boolean?)))
|
|
(new (class object% (define/public (m x . z) #f) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m 1))
|
|
|
|
(test/spec-passed
|
|
'object-contract->*9
|
|
'(send (contract (object-contract (m (->* () () #:rest (listof number?) boolean?)))
|
|
(new (class object% (define/public (m . z) #f) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m 1 2 3))
|
|
|
|
(test/neg-blame
|
|
'object-contract->*10
|
|
'(send (contract (object-contract (m (->* () () #:rest (listof number?) boolean?)))
|
|
(new (class object% (define/public (m . z) #f) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
#t))
|
|
|
|
(test/spec-passed
|
|
'object-contract-->d1
|
|
'(send (contract (object-contract (m (->d ([x number?]) () [range (<=/c x)])))
|
|
(new (class object% (define/public m (lambda (x) (- x 1))) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
1))
|
|
|
|
(test/spec-passed
|
|
'object-contract-->d1b
|
|
'(send (contract (object-contract (m (->d ([x number?]) () [range (<=/c x)])))
|
|
(new (class object% (define/public m (lambda (x) (- x 1))) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
1))
|
|
|
|
(test/pos-blame
|
|
'object-contract-->d2
|
|
'(send (contract (object-contract (m (->d ([x number?]) () [range (<=/c x)])))
|
|
(new (class object% (define/public m (lambda (x) (+ x 1))) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
1))
|
|
|
|
(test/pos-blame
|
|
'object-contract-->d2b
|
|
'(send (contract (object-contract (m (->d ([x number?]) () [range (<=/c x)])))
|
|
(new (class object% (define/public m (lambda (x) (+ x 1))) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
1))
|
|
|
|
(test/spec-passed
|
|
'object-contract-->d3
|
|
'(send (contract (object-contract (m (->d () () #:rest rst (listof number?) [range any/c])))
|
|
(new (class object% (define/public m (lambda w 1)) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
1))
|
|
|
|
(test/neg-blame
|
|
'object-contract-->d4
|
|
'(send (contract (object-contract (m (->d () () #:rest rst (listof number?) [range any/c])))
|
|
(new (class object% (define/public m (lambda w 1)) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
#f))
|
|
|
|
(test/spec-passed
|
|
'object-contract-->d5
|
|
'(send (contract (object-contract (m (->d () () any)))
|
|
(new (class object% (define/public m (lambda () 1)) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m))
|
|
|
|
(test/spec-passed
|
|
'object-contract-->d6
|
|
'(send (contract (object-contract (m (->d () () (values [x number?] [y (>=/c x)]))))
|
|
(new (class object% (define/public m (lambda () (values 1 2))) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m))
|
|
|
|
(test/pos-blame
|
|
'object-contract-->d7
|
|
'(send (contract (object-contract (m (->d () () (values [x number?] [y (>=/c x)]))))
|
|
(new (class object% (define/public m (lambda () (values 2 1))) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m))
|
|
|
|
(test/neg-blame
|
|
'object-contract-->d/this-1
|
|
'(send (contract (object-contract (m (->d ([x (and/c integer? (lambda (x) (= x (get-field f this))))])
|
|
()
|
|
any)))
|
|
(new (class object% (field [f 1]) (define/public m (lambda (x) 1)) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
2))
|
|
|
|
(test/spec-passed
|
|
'object-contract-->d/this-2
|
|
'(send (contract (object-contract (m (->d ([x (and/c integer? (lambda (x) (= x (get-field f this))))])
|
|
()
|
|
any)))
|
|
(new (class object% (field [f 1]) (define/public m (lambda (x) 1)) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
1))
|
|
|
|
(test/neg-blame
|
|
'object-contract-->d/this-3
|
|
'(send (contract (object-contract (m (->d ([x (and/c integer? (lambda (x) (= x (get-field f this))))])
|
|
()
|
|
#:rest rest-var any/c
|
|
any)))
|
|
(new (class object% (field [f 1]) (define/public m (lambda (x . rest) 1)) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
2))
|
|
|
|
(test/spec-passed
|
|
'object-contract-->d/this-4
|
|
'(send (contract (object-contract (m (->d ([x (and/c integer? (lambda (x) (= x (get-field f this))))])
|
|
()
|
|
#:rest rest-var any/c
|
|
any)))
|
|
(new (class object% (field [f 1]) (define/public m (lambda (x . rest) 1)) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
1))
|
|
|
|
(test/spec-passed
|
|
'object-contract-->pp1
|
|
'(send (contract (object-contract (m (->d ([x number?]) () #:pre-cond #t [unused (<=/c x)] #:post-cond #t)))
|
|
(new (class object% (define/public m (lambda (x) (- x 1))) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
1))
|
|
|
|
(test/spec-passed
|
|
'object-contract-->pp1b
|
|
'(send (contract (object-contract (m (->d ([x number?]) () #:pre-cond #t [unused (<=/c x)] #:post-cond #t)))
|
|
(new (class object%
|
|
(define/public m (case-lambda [(x) (- x 1)]
|
|
[(x y) y]))
|
|
(super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
1))
|
|
|
|
(test/pos-blame
|
|
'object-contract-->pp2
|
|
'(send (contract (object-contract (m (->d ([x number?]) () #:pre-cond #t [unused (<=/c x)] #:post-cond #t)))
|
|
(new (class object% (define/public m (lambda (x) (+ x 1))) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
1))
|
|
|
|
(test/pos-blame
|
|
'object-contract-->pp2b
|
|
'(send (contract (object-contract (m (->d ([x number?]) () #:pre-cond #t [unused (<=/c x)] #:post-cond #t)))
|
|
(new (class object%
|
|
(define/public m (case-lambda [(x) (+ x 1)]))
|
|
(super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
1))
|
|
|
|
(test/spec-passed
|
|
'object-contract-->pp3
|
|
'(send (contract (object-contract (m (->d () () #:rest rst (listof number?) #:pre-cond #t [unused any/c] #:post-cond #t)))
|
|
(new (class object% (define/public m (lambda w 1)) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
1))
|
|
|
|
(test/neg-blame
|
|
'object-contract-->pp4
|
|
'(send (contract (object-contract (m (->d () () #:rest rst (listof number?) #:pre-cond #t [unused any/c] #:post-cond #t)))
|
|
(new (class object% (define/public m (lambda w 1)) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
#f))
|
|
|
|
(test/spec-passed
|
|
'object-contract-->pp5
|
|
'(send (contract (object-contract (m (->d () () #:pre-cond #t any)))
|
|
(new (class object% (define/public m (lambda () 1)) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m))
|
|
|
|
(test/spec-passed
|
|
'object-contract-->pp6
|
|
'(send (contract (object-contract (m (->d () () #:pre-cond #t (values [x number?] [y (>=/c x)]) #:post-cond #t)))
|
|
(new (class object% (define/public m (lambda () (values 1 2))) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m))
|
|
|
|
(test/pos-blame
|
|
'object-contract-->pp7
|
|
'(send (contract (object-contract (m (->d () () #:pre-cond #t (values [x number?] [y (>=/c x)]) #:post-cond #t)))
|
|
(new (class object% (define/public m (lambda () (values 2 1))) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m))
|
|
|
|
(test/neg-blame
|
|
'object-contract-->pp/this-1
|
|
'(send (contract (object-contract (m (->d ()
|
|
()
|
|
#:pre-cond (= 1 (get-field f this))
|
|
[result-x any/c]
|
|
#:post-cond (= 2 (get-field f this)))))
|
|
(new (class object% (field [f 2]) (define/public m (lambda () (set! f 3))) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m))
|
|
|
|
(test/pos-blame
|
|
'object-contract-->pp/this-2
|
|
'(send (contract (object-contract (m (->d () ()
|
|
#:pre-cond (= 1 (get-field f this))
|
|
[result-x any/c]
|
|
#:post-cond (= 2 (get-field f this)))))
|
|
(new (class object% (field [f 1]) (define/public m (lambda () (set! f 3))) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m))
|
|
|
|
(test/spec-passed
|
|
'object-contract-->pp/this-3
|
|
'(send (contract (object-contract (m (->d () ()
|
|
#:pre-cond (= 1 (get-field f this))
|
|
[result-x any/c]
|
|
#:post-cond (= 2 (get-field f this)))))
|
|
(new (class object% (field [f 1]) (define/public m (lambda () (set! f 2))) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m))
|
|
|
|
(test/neg-blame
|
|
'object-contract-->pp/this-4
|
|
'(send (contract (object-contract (m (->d () ()
|
|
#:rest rest-id any/c
|
|
#:pre-cond (= 1 (get-field f this))
|
|
[result-x any/c]
|
|
#:post-cond (= 2 (get-field f this)))))
|
|
(new (class object% (field [f 2]) (define/public m (lambda args (set! f 3))) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m))
|
|
|
|
(test/pos-blame
|
|
'object-contract-->pp/this-5
|
|
'(send (contract (object-contract (m (->d () ()
|
|
#:rest rest-id any/c
|
|
#:pre-cond (= 1 (get-field f this))
|
|
[result-x any/c]
|
|
#:post-cond (= 2 (get-field f this)))))
|
|
(new (class object% (field [f 1]) (define/public m (lambda args (set! f 3))) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m))
|
|
|
|
(test/spec-passed
|
|
'object-contract-->pp/this-6
|
|
'(send (contract (object-contract (m (->d () ()
|
|
#:rest rest-id any/c
|
|
#:pre-cond (= 1 (get-field f this))
|
|
[result-x any/c]
|
|
#:post-cond (= 2 (get-field f this)))))
|
|
(new (class object% (field [f 1]) (define/public m (lambda args (set! f 2))) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m))
|
|
|
|
(test/spec-passed/result
|
|
'object-contract-drop-method1
|
|
'(send (contract (object-contract (m (-> integer? integer?)))
|
|
(new (class object% (define/public (m x) x) (define/public (n x) x) (super-new)))
|
|
'pos
|
|
'neg)
|
|
n 1)
|
|
1)
|
|
|
|
(test/spec-passed/result
|
|
'object-contract-drop-method2
|
|
'(let ([o (contract (object-contract (m (-> integer? integer?)))
|
|
(new (class object% (define/public (m x) x) (define/public (n x) x) (super-new)))
|
|
'pos
|
|
'neg)])
|
|
(with-method ([m (o m)]
|
|
[n (o n)])
|
|
(list (m 1) (n 2))))
|
|
'(1 2))
|
|
|
|
(test/spec-passed/result
|
|
'object-contract-drop-field1
|
|
'(get-field g (contract (object-contract (field f integer?))
|
|
(new (class object% (field [f 1] [g 2]) (super-new)))
|
|
'pos
|
|
'neg))
|
|
2)
|
|
|
|
(test/spec-passed/result
|
|
'object-contract-drop-field2
|
|
'(field-bound? g (contract (object-contract (field f integer?))
|
|
(new (class object% (field [f 1] [g 2]) (super-new)))
|
|
'pos
|
|
'neg))
|
|
#t)
|
|
|
|
(test/spec-passed/result
|
|
'object-contract-drop-field3
|
|
'(field-names
|
|
(contract (object-contract)
|
|
(new (class object% (field [g 2]) (super-new)))
|
|
'pos
|
|
'neg))
|
|
'(g))
|
|
|
|
|
|
(test/spec-passed/result
|
|
'object-contract-ho-method1
|
|
'(send (contract (object-contract (m (-> (-> integer? integer?) integer?)))
|
|
(new (class object% (define/public (m f) (f 1)) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
(λ (x) x))
|
|
1)
|
|
|
|
(test/spec-passed/result
|
|
'object-contract-ho-method2
|
|
'(send (contract (object-contract (m (-> (->* (integer?) () integer?) integer?)))
|
|
(new (class object% (define/public (m f) (f 1)) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
(λ (x) x))
|
|
1)
|
|
|
|
(test/spec-passed/result
|
|
'object-contract-ho-method3
|
|
'(send (contract (object-contract (m (-> (->d ([x integer?]) () [r integer?]) integer?)))
|
|
(new (class object% (define/public (m f) (f 1)) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
(λ (x) x))
|
|
1)
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;
|
|
;; test error message has right format
|
|
;;
|
|
|
|
(test/spec-passed/result
|
|
'wrong-method-arity-error-message
|
|
'(with-handlers ([exn:fail? exn-message])
|
|
(send (contract (object-contract [m (integer? . -> . integer?)])
|
|
(new (class object% (define/public (m x) x) (super-new)))
|
|
'pos
|
|
'neg)
|
|
m
|
|
1
|
|
2))
|
|
"procedure m method: expects 1 argument, given 2: 1 2")
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;
|
|
;; tests object utilities to be sure wrappers work right
|
|
;;
|
|
|
|
(let* ([o1 (contract-eval '(new object%))]
|
|
[o2 (contract-eval `(contract (object-contract) ,o1 'pos 'neg))])
|
|
(test #t (contract-eval 'object=?) o1 o1)
|
|
(test #f (contract-eval 'object=?) o1 (contract-eval '(new object%)))
|
|
(test #t (contract-eval 'object=?) o1 o2)
|
|
(test #t (contract-eval 'object=?) o2 o1)
|
|
(test #f (contract-eval 'object=?) (contract-eval '(new object%)) o2))
|
|
|
|
(ctest #t
|
|
method-in-interface?
|
|
'm
|
|
(object-interface
|
|
(contract
|
|
(object-contract (m (integer? . -> . integer?)))
|
|
(new (class object% (define/public (m x) x) (super-new)))
|
|
'pos
|
|
'neg)))
|
|
|
|
(let* ([i<%> (contract-eval '(interface ()))]
|
|
[c% (contract-eval `(class* object% (,i<%>) (super-new)))]
|
|
[o (contract-eval `(new ,c%))])
|
|
(test #t (contract-eval 'is-a?) o i<%>)
|
|
(test #t (contract-eval 'is-a?) o c%)
|
|
(test #t (contract-eval 'is-a?) (contract-eval `(contract (object-contract) ,o 'pos 'neg)) i<%>)
|
|
(test #t (contract-eval 'is-a?) (contract-eval `(contract (object-contract) ,o 'pos 'neg)) c%))
|
|
|
|
(let ([c% (parameterize ([current-inspector (make-inspector)])
|
|
(contract-eval '(class object% (super-new))))])
|
|
(test (list c% #f)
|
|
'object-info
|
|
(contract-eval
|
|
`(call-with-values
|
|
(lambda () (object-info (contract (object-contract) (new ,c%) 'pos 'neg)))
|
|
list))))
|
|
|
|
;; object->vector tests
|
|
(let* ([obj
|
|
(parameterize ([current-inspector (make-inspector)])
|
|
(contract-eval '(new (class object% (field [x 1] [y 2]) (super-new)))))]
|
|
[vec (contract-eval `(object->vector ,obj))])
|
|
(test vec
|
|
(contract-eval 'object->vector)
|
|
(contract-eval
|
|
`(contract (object-contract (field x integer?) (field y integer?))
|
|
,obj
|
|
'pos
|
|
'neg))))
|
|
|
|
|
|
;
|
|
;
|
|
;
|
|
; ;; ; ;;;; ;;;;
|
|
; ;; ;; ;;;; ;;;;
|
|
; ;;;;;;; ;;;; ;;;;;;; ;;;; ;;;; ;;;; ;;;;; ;;;;;;; ;;;;;;; ;;;; ;;;
|
|
; ;;;; ;;;;;;;;;;;;; ;;;;;;;;;;;;; ;;;; ;;;; ;;;;;; ;;;;;;;; ;;;;;;;; ;;;; ;;;;;
|
|
; ;;;; ;;;; ;;; ;;;; ;;;; ;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;;;;;;;;; ;;;; ;;;; ;;
|
|
; ;;;; ;;;; ;;; ;;;; ;;;; ;;; ;;;; ;;;; ;;;; ;;;; ;;;;;;; ;;;; ;;;; ;;;; ;;;;;;;
|
|
; ;;;; ;;;; ;;; ;;;; ;;;; ;;; ;;;; ;;;; ;;;; ;;;;; ;; ;;;; ;;;;;;;;; ;;;; ;;;;;
|
|
; ;;;; ;;;; ;;; ;;;; ;;;; ;;; ;;;; ;;;;;;;;; ;;;;; ;;;;;;;; ;;;;;;;; ;;;; ;;;;;;
|
|
; ;;;; ;;;; ;;; ;;;; ;;;; ;;; ;;;; ;;; ;;;; ;;;; ;; ;;;; ;;;;;;; ;;;; ;;;;
|
|
;
|
|
;
|
|
;
|
|
|
|
|
|
(test/pos-blame
|
|
'immutable1
|
|
'(let ([ct (contract (listof (boolean? . -> . boolean?))
|
|
#f
|
|
'pos
|
|
'neg)])
|
|
((car ct) 1)))
|
|
|
|
(test/neg-blame
|
|
'immutable2
|
|
'(let ([ct (contract (listof (boolean? . -> . boolean?))
|
|
(list (lambda (x) x))
|
|
'pos
|
|
'neg)])
|
|
((car ct) 1)))
|
|
|
|
(test/neg-blame
|
|
'immutable3
|
|
'(let ([ct (contract (listof (number? . -> . boolean?))
|
|
(list (lambda (x) 1))
|
|
'pos
|
|
'neg)])
|
|
((car ct) #f)))
|
|
|
|
(test/pos-blame
|
|
'immutable4
|
|
'(let ([ct (contract (listof (number? . -> . boolean?))
|
|
(list (lambda (x) 1))
|
|
'pos
|
|
'neg)])
|
|
((car ct) 1)))
|
|
|
|
(test/spec-passed
|
|
'immutable5
|
|
'(let ([ct (contract (listof (number? . -> . boolean?))
|
|
(list (lambda (x) #t))
|
|
'pos
|
|
'neg)])
|
|
((car ct) 1)))
|
|
|
|
|
|
(test/pos-blame
|
|
'immutable6
|
|
'(contract (cons/c (boolean? . -> . boolean?) (boolean? . -> . boolean?))
|
|
#f
|
|
'pos
|
|
'neg))
|
|
|
|
(test/neg-blame
|
|
'immutable8
|
|
'(let ([ct (contract (cons/c (number? . -> . boolean?) (number? . -> . boolean?))
|
|
(cons (lambda (x) 1) (lambda (x) 1))
|
|
'pos
|
|
'neg)])
|
|
((car ct) #f)))
|
|
|
|
(test/neg-blame
|
|
'immutable9
|
|
'(let ([ct (contract (cons/c (number? . -> . boolean?) (number? . -> . boolean?))
|
|
(cons (lambda (x) 1) (lambda (x) 1))
|
|
'pos
|
|
'neg)])
|
|
((cdr ct) #f)))
|
|
|
|
(test/pos-blame
|
|
'immutable10
|
|
'(let ([ct (contract (cons/c (number? . -> . boolean?) (number? . -> . boolean?))
|
|
(cons (lambda (x) 1) (lambda (x) 1))
|
|
'pos
|
|
'neg)])
|
|
((car ct) 1)))
|
|
|
|
(test/pos-blame
|
|
'immutable11
|
|
'(let ([ct (contract (cons/c (number? . -> . boolean?) (number? . -> . boolean?))
|
|
(cons (lambda (x) 1) (lambda (x) 1))
|
|
'pos
|
|
'neg)])
|
|
((cdr ct) 1)))
|
|
|
|
(test/spec-passed
|
|
'immutable12
|
|
'(let ([ct (contract (cons/c (number? . -> . boolean?) (number? . -> . boolean?))
|
|
(cons (lambda (x) #t) (lambda (x) #t))
|
|
'pos
|
|
'neg)])
|
|
((car ct) 1)))
|
|
|
|
(test/spec-passed
|
|
'immutable13
|
|
'(let ([ct (contract (cons/c (number? . -> . boolean?) (number? . -> . boolean?))
|
|
(cons (lambda (x) #t) (lambda (x) #t))
|
|
'pos
|
|
'neg)])
|
|
((cdr ct) 1)))
|
|
|
|
(test/spec-passed/result
|
|
'immutable14
|
|
'(contract (cons/c number? boolean?)
|
|
(cons 1 #t)
|
|
'pos
|
|
'neg)
|
|
(cons 1 #t))
|
|
|
|
(test/pos-blame
|
|
'immutable15
|
|
'(contract (list/c (number? . -> . boolean?) (number? . -> . boolean?))
|
|
#f
|
|
'pos
|
|
'neg))
|
|
|
|
(test/pos-blame
|
|
'immutable17
|
|
'(contract (list/c (number? . -> . boolean?) (number? . -> . boolean?))
|
|
(list (lambda (x) #t))
|
|
'pos
|
|
'neg))
|
|
|
|
(test/pos-blame
|
|
'immutable18
|
|
'(contract (list/c (number? . -> . boolean?) (number? . -> . boolean?))
|
|
(list (lambda (x) #t) (lambda (x) #t) (lambda (x) #t))
|
|
'pos
|
|
'neg))
|
|
|
|
(test/spec-passed
|
|
'immutable19
|
|
'(let ([ctc (contract (list/c (number? . -> . boolean?) (number? . -> . boolean?))
|
|
(list (lambda (x) #t) (lambda (x) #t))
|
|
'pos
|
|
'neg)])
|
|
(for-each (lambda (x) (x 1)) ctc)))
|
|
|
|
(test/pos-blame
|
|
'vector-immutable1
|
|
'(contract (vector-immutableof (boolean? . -> . boolean?))
|
|
#f
|
|
'pos
|
|
'neg))
|
|
|
|
(test/pos-blame
|
|
'vector-immutable2
|
|
'(contract (vector-immutableof (boolean? . -> . boolean?))
|
|
(vector (lambda (x) x))
|
|
'pos
|
|
'neg))
|
|
|
|
(test/neg-blame
|
|
'vector-immutable3
|
|
'(let ([ct (contract (vector-immutableof (number? . -> . boolean?))
|
|
(vector->immutable-vector (vector (lambda (x) 1)))
|
|
'pos
|
|
'neg)])
|
|
((vector-ref ct 0) #f)))
|
|
|
|
(test/pos-blame
|
|
'vector-immutable4
|
|
'(let ([ct (contract (vector-immutableof (number? . -> . boolean?))
|
|
(vector->immutable-vector (vector (lambda (x) 1)))
|
|
'pos
|
|
'neg)])
|
|
((vector-ref ct 0) 1)))
|
|
|
|
(test/spec-passed
|
|
'vector-immutable5
|
|
'(let ([ct (contract (vector-immutableof (number? . -> . boolean?))
|
|
(vector->immutable-vector (vector (lambda (x) #t)))
|
|
'pos
|
|
'neg)])
|
|
((vector-ref ct 0) 1)))
|
|
|
|
(test/pos-blame
|
|
'vector-immutable6
|
|
'(contract (vector-immutable/c (number? . -> . boolean?) (number? . -> . boolean?))
|
|
#f
|
|
'pos
|
|
'neg))
|
|
|
|
(test/pos-blame
|
|
'vector-immutable7
|
|
'(contract (vector-immutable/c (number? . -> . boolean?) (number? . -> . boolean?))
|
|
(vector (lambda (x) #t) (lambda (x) #t))
|
|
'pos
|
|
'neg))
|
|
|
|
(test/pos-blame
|
|
'vector-immutable8
|
|
'(contract (vector-immutable/c (number? . -> . boolean?) (number? . -> . boolean?))
|
|
(vector->immutable-vector (vector (lambda (x) #t)))
|
|
'pos
|
|
'neg))
|
|
|
|
(test/pos-blame
|
|
'vector-immutable9
|
|
'(contract (vector-immutable/c (number? . -> . boolean?) (number? . -> . boolean?))
|
|
(vector->immutable-vector (vector (lambda (x) #t) (lambda (x) #t) (lambda (x) #t)))
|
|
'pos
|
|
'neg))
|
|
|
|
(test/spec-passed
|
|
'vector-immutable10
|
|
'(let ([ctc (contract (vector-immutable/c (number? . -> . boolean?) (number? . -> . boolean?))
|
|
(vector->immutable-vector (vector (lambda (x) #t) (lambda (x) #t)))
|
|
'pos
|
|
'neg)])
|
|
((vector-ref ctc 0) 1)
|
|
((vector-ref ctc 1) 1)))
|
|
|
|
(test/spec-passed/result
|
|
'vector-immutable11
|
|
'(contract (vector-immutable/c number? boolean?)
|
|
(vector->immutable-vector (vector 1 #t))
|
|
'pos
|
|
'neg)
|
|
(vector->immutable-vector (vector 1 #t)))
|
|
|
|
(test/spec-passed/result
|
|
'vector-immutable12
|
|
'(immutable? (contract (vector-immutable/c number? boolean?)
|
|
(vector->immutable-vector (vector 1 #t))
|
|
'pos
|
|
'neg))
|
|
#t)
|
|
|
|
(test/pos-blame
|
|
'box-immutable1
|
|
'(contract (box-immutable/c (number? . -> . boolean?))
|
|
#f
|
|
'pos
|
|
'neg))
|
|
|
|
(test/pos-blame
|
|
'box-immutable2
|
|
'(contract (box-immutable/c (number? . -> . boolean?))
|
|
(box (lambda (x) #t))
|
|
'pos
|
|
'neg))
|
|
|
|
(test/neg-blame
|
|
'box-immutable3
|
|
'(let ([ctc (contract (box-immutable/c (number? . -> . boolean?))
|
|
(box-immutable (lambda (x) #t))
|
|
'pos
|
|
'neg)])
|
|
((unbox ctc) #f)))
|
|
|
|
(test/pos-blame
|
|
'box-immutable4
|
|
'(let ([ctc (contract (box-immutable/c (number? . -> . boolean?))
|
|
(box-immutable (lambda (x) 1))
|
|
'pos
|
|
'neg)])
|
|
((unbox ctc) 1)))
|
|
|
|
(test/spec-passed
|
|
'box-immutable5
|
|
'(let ([ctc (contract (box-immutable/c (number? . -> . boolean?))
|
|
(box-immutable (lambda (x) #t))
|
|
'pos
|
|
'neg)])
|
|
((unbox ctc) 1)))
|
|
|
|
(test/spec-passed/result
|
|
'box-immutable6
|
|
'(contract (box-immutable/c boolean?)
|
|
(box-immutable #t)
|
|
'pos
|
|
'neg)
|
|
(box-immutable #t))
|
|
|
|
(test/spec-passed/result
|
|
'box-immutable7
|
|
'(immutable? (contract (box-immutable/c boolean?)
|
|
(box-immutable #t)
|
|
'pos
|
|
'neg))
|
|
#t)
|
|
|
|
|
|
;
|
|
;
|
|
;
|
|
; ;; ;;
|
|
; ;; ;;
|
|
; ;;;;;;; ;;; ;;; ;;;; ;;;;;;; ;;;; ;;;;; ;;; ;; ;;;;;
|
|
; ;;;;;;;; ;;;;;;; ;;;;;; ;;;;;;;;;;;;; ;;;; ;;;;;; ;;;;; ;; ;;;;;;
|
|
; ;;;;;;;;; ;;;; ;; ;;;;;;;; ;;;; ;;; ;;;; ;;;; ;;;; ;;;; ;; ;;;;;;;;;
|
|
; ;;;; ;;;; ;;;; ;;;; ;;; ;;;; ;;; ;;;; ;;;; ;;;; ;;;;;;; ;; ;;;;
|
|
; ;;;;;;;;; ;;;; ;;;;;;;; ;;;; ;;; ;;;; ;;;; ;;;; ;;;;; ;; ;;;;;;;
|
|
; ;;;;;;;; ;;;; ;;;;;; ;;;; ;;; ;;;; ;;;; ;;;;;; ;;;;;; ;; ;;;;;;
|
|
; ;;;;;;; ;;;; ;;;; ;;;; ;;; ;;;; ;;;; ;;;;; ;;;; ;; ;;;;;
|
|
; ;;;; ;;
|
|
; ;;;;
|
|
;
|
|
|
|
|
|
(test/pos-blame
|
|
'promise/c1
|
|
'(force (contract (promise/c boolean?)
|
|
(delay 1)
|
|
'pos
|
|
'neg)))
|
|
|
|
(test/spec-passed
|
|
'promise/c2
|
|
'(force (contract (promise/c boolean?)
|
|
(delay #t)
|
|
'pos
|
|
'neg)))
|
|
|
|
(test/spec-passed/result
|
|
'promise/c3
|
|
'(let ([x 0])
|
|
(contract (promise/c any/c)
|
|
(delay (set! x (+ x 1)))
|
|
'pos
|
|
'neg)
|
|
x)
|
|
0)
|
|
|
|
(test/spec-passed/result
|
|
'promise/c4
|
|
'(let ([x 0])
|
|
(force (contract (promise/c any/c)
|
|
(delay (set! x (+ x 1)))
|
|
'pos
|
|
'neg))
|
|
x)
|
|
1)
|
|
|
|
(test/spec-passed/result
|
|
'promise/c5
|
|
'(let ([x 0])
|
|
(let ([p (contract (promise/c any/c)
|
|
(delay (set! x (+ x 1)))
|
|
'pos
|
|
'neg)])
|
|
(force p)
|
|
(force p))
|
|
x)
|
|
1)
|
|
|
|
|
|
|
|
;
|
|
;
|
|
;
|
|
; ; ;;
|
|
; ;; ;;
|
|
; ;;;;; ;;; ;;; ;;;; ;;; ;;;;; ;;;;;;; ;;;; ;;;; ;; ;;;;;
|
|
; ;;;;;; ;;; ;;;; ;;;;;;;;; ;;;;;; ;;;;;;;; ;;; ;;; ;; ;;;;;;
|
|
; ;;;; ;;;;;; ;;;; ;;;; ;;;; ;;;; ;;;;;;; ;;;;;;;;;
|
|
; ;;;; ;;;;;; ;;;; ;;;; ;;;; ;;;;;;; ;;;;; ;; ;;;;
|
|
; ;;;; ;;;;; ;;;; ;;;; ;;;;; ;; ;;;; ;;;;;;; ;; ;;;;;;;
|
|
; ;;;;;; ;;;; ;;;; ;;;; ;;;;; ;;;;;;;; ;;; ;;; ;; ;;;;;;
|
|
; ;;;;; ;;;; ;;;; ;;;; ;;;; ;; ;;;; ;;;; ;;;; ;; ;;;;;
|
|
; ;;;; ;;
|
|
; ;;;;
|
|
;
|
|
|
|
|
|
(test/pos-blame
|
|
'syntax/c1
|
|
'(contract (syntax/c boolean?)
|
|
#'x
|
|
'pos
|
|
'neg))
|
|
|
|
(test/spec-passed
|
|
'syntax/c2
|
|
'(contract (syntax/c symbol?)
|
|
#'x
|
|
'pos
|
|
'neg))
|
|
|
|
|
|
;
|
|
;
|
|
;
|
|
; ; ; ;;
|
|
; ;; ;; ;;
|
|
; ;;;;; ;;;;; ;;; ;;; ;;;; ;;;; ;;;;; ;;;;; ;; ;;;;;
|
|
; ;;;;;; ;;;;;; ;;;;;;; ;;;; ;;;; ;;;;;; ;;;;;; ;; ;;;;;;
|
|
; ;;;; ;;;; ;;;; ;; ;;;; ;;;; ;;;;;;; ;;;; ;;;;;;;;;
|
|
; ;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;; ;;;;
|
|
; ;;;; ;;;;; ;;;; ;;;; ;;;; ;;;;;;; ;;;;; ;; ;;;;;;;
|
|
; ;;;;;; ;;;;; ;;;; ;;;;;;;;; ;;;;;; ;;;;; ;; ;;;;;;
|
|
; ;;;;; ;;;; ;;;; ;;; ;;;; ;;;;; ;;;; ;; ;;;;;
|
|
; ;;
|
|
;
|
|
;
|
|
|
|
|
|
(test/spec-passed
|
|
'struct/c1
|
|
'(let ()
|
|
(define-struct s (a))
|
|
(contract (struct/c s integer?)
|
|
(make-s 1)
|
|
'pos
|
|
'neg)))
|
|
|
|
(test/pos-blame
|
|
'struct/c2
|
|
'(let ()
|
|
(define-struct s (a))
|
|
(contract (struct/c s integer?)
|
|
(make-s #f)
|
|
'pos
|
|
'neg)))
|
|
|
|
(test/pos-blame
|
|
'struct/c3
|
|
'(let ()
|
|
(define-struct s (a))
|
|
(contract (struct/c s integer?)
|
|
1
|
|
'pos
|
|
'neg)))
|
|
|
|
(test/spec-passed
|
|
'struct/c4
|
|
'(let ()
|
|
(define-struct s (a b))
|
|
(contract (struct/c s integer? (struct/c s integer? boolean?))
|
|
(make-s 1 (make-s 2 #t))
|
|
'pos
|
|
'neg)))
|
|
|
|
(test/pos-blame
|
|
'struct/c5
|
|
'(let ()
|
|
(define-struct s (a b))
|
|
(contract (struct/c s integer? (struct/c s integer? boolean?))
|
|
(make-s 1 (make-s 2 3))
|
|
'pos
|
|
'neg)))
|
|
|
|
|
|
;
|
|
;
|
|
;
|
|
; ;;
|
|
; ;;
|
|
; ;;; ;;; ;;; ;;;;; ;;;; ;;;; ;;; ;;; ;;;;; ;;; ;;; ;;;
|
|
; ;;;;;;; ;;;;; ;;;;;; ;;;; ;;;; ;;;;;;; ;;;;;; ;;;; ;;; ;;; ;;;;;
|
|
; ;;;; ;; ;;;; ;; ;;;;;;; ;;;; ;;;; ;;;; ;; ;;;; ;;;; ;;;;;; ;;;; ;;
|
|
; ;;;; ;;;;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;;;;;; ;;;;;;; ;;;;;
|
|
; ;;;; ;;;;; ;;;;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;;;;;; ;;;;; ;;;;;
|
|
; ;;;; ;;;;;; ;;;;;; ;;;;;;;;; ;;;; ;;;;;; ;;;; ;;;; ;;;;;;
|
|
; ;;;; ;;;; ;;;;; ;;; ;;;; ;;;; ;;;;; ;;;; ;;;; ;;;;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
; ; ;
|
|
; ;; ;;
|
|
; ;;;;; ;;;; ;;;; ;;; ;;;;; ;;; ;;; ;;;;;;; ;;;;; ;;;;;
|
|
; ;;;;;; ;;;;;; ;;;;;;;;; ;;;;;; ;;;;;;; ;;;;;;;; ;;;;;; ;;;;;;
|
|
; ;;;;;;; ;;;;;;;; ;;;; ;;;; ;;;; ;;;; ;; ;;;; ;;;;;;; ;;;;
|
|
; ;;;; ;;;; ;;; ;;;; ;;;; ;;;; ;;;; ;;;;;;; ;;;; ;;;;
|
|
; ;;;;;;; ;;;;;;;; ;;;; ;;;; ;;;;; ;;;; ;; ;;;; ;;;;;;; ;;;;;
|
|
; ;;;;;; ;;;;;; ;;;; ;;;; ;;;;; ;;;; ;;;;;;;; ;;;;;; ;;;;;
|
|
; ;;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;; ;;;; ;;;;; ;;;;
|
|
;
|
|
;
|
|
;
|
|
|
|
|
|
(test/spec-passed
|
|
'recursive-contract1
|
|
'(letrec ([ctc (-> integer? (recursive-contract ctc))])
|
|
(letrec ([f (λ (x) f)])
|
|
((((contract ctc f 'pos 'neg) 1) 2) 3))))
|
|
|
|
(test/neg-blame
|
|
'recursive-contract2
|
|
'(letrec ([ctc (-> integer? (recursive-contract ctc))])
|
|
(letrec ([f (λ (x) f)])
|
|
((contract ctc f 'pos 'neg) #f))))
|
|
|
|
(test/neg-blame
|
|
'recursive-contract3
|
|
'(letrec ([ctc (-> integer? (recursive-contract ctc))])
|
|
(letrec ([f (λ (x) f)])
|
|
((((contract ctc f 'pos 'neg) 1) 2) #f))))
|
|
|
|
(test/pos-blame
|
|
'recursive-contract4
|
|
'(letrec ([ctc (-> integer? (recursive-contract ctc))])
|
|
(letrec ([c 0]
|
|
[f (λ (x)
|
|
(set! c (+ c 1))
|
|
(if (= c 2)
|
|
'nope
|
|
f))])
|
|
((((contract ctc f 'pos 'neg) 1) 2) 3))))
|
|
|
|
|
|
|
|
;
|
|
;
|
|
;
|
|
; ;;;; ;;; ;;
|
|
; ;;;; ;;;; ;;
|
|
; ;;;;;;; ;;; ;;;;; ;;;; ;;; ;;;
|
|
; ;;;;;;;; ;;;;; ;;;; ;;;; ;;;;;;;;; ;;;;;
|
|
; ;;;;;;;;; ;;;; ;; ;;;;;; ;;;; ;;;; ;;;; ;;;; ;;
|
|
; ;;;; ;;;; ;;;;;;; ;;;;;; ;;;; ;;;; ;;;; ;;;;;;; ;;;;;
|
|
; ;;;;;;;;; ;;;;; ;;;; ;;;; ;;;; ;;;; ;;;;; ;;;;;
|
|
; ;;;;;;;; ;;;;;; ;;;; ;;;; ;;;; ;;;; ;;;;;;
|
|
; ;;;;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;;;;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
; ; ;
|
|
; ;; ;;
|
|
; ;;;;; ;;;; ;;;; ;;; ;;;;; ;;; ;;; ;;;;;;; ;;;;; ;;;;;
|
|
; ;;;;;; ;;;;;; ;;;;;;;;; ;;;;;; ;;;;;;; ;;;;;;;; ;;;;;; ;;;;;;
|
|
; ;;;;;;; ;;;;;;;; ;;;; ;;;; ;;;; ;;;; ;; ;;;; ;;;;;;; ;;;;
|
|
; ;;;; ;;;; ;;; ;;;; ;;;; ;;;; ;;;; ;;;;;;; ;;;; ;;;; ;;;;;
|
|
; ;;;;;;; ;;;;;;;; ;;;; ;;;; ;;;;; ;;;; ;; ;;;; ;;;;;;; ;;;;; ;;;;;
|
|
; ;;;;;; ;;;;;; ;;;; ;;;; ;;;;; ;;;; ;;;;;;;; ;;;;;; ;;;;;
|
|
; ;;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;; ;;;; ;;;;; ;;;;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
; ; ;
|
|
; ;; ;;
|
|
; ;;;;; ;;;;; ;;; ;;; ;;;; ;;;; ;;;;; ;;;;;
|
|
; ;;;;;; ;;;;;; ;;;;;;; ;;;; ;;;; ;;;;;; ;;;;;;
|
|
; ;;;; ;;;; ;;;; ;; ;;;; ;;;; ;;;;;;; ;;;;
|
|
; ;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;;;;
|
|
; ;;;; ;;;;; ;;;; ;;;; ;;;; ;;;;;;; ;;;;;
|
|
; ;;;;;; ;;;;; ;;;; ;;;;;;;;; ;;;;;; ;;;;;
|
|
; ;;;;; ;;;; ;;;; ;;; ;;;; ;;;;; ;;;;
|
|
;
|
|
;
|
|
;
|
|
|
|
|
|
(contract-eval '(define-contract-struct couple (hd tl)))
|
|
|
|
(test/spec-passed
|
|
'd-c-s-match1
|
|
'(begin
|
|
(eval '(module d-c-s-match1 scheme/base
|
|
(require scheme/contract
|
|
mzlib/match)
|
|
|
|
(define-contract-struct foo (bar baz))
|
|
|
|
(match (make-foo #t #f)
|
|
[($ foo bar baz) #t]
|
|
[_ #f])))
|
|
(eval '(require 'd-c-s-match1))))
|
|
|
|
(test/spec-passed/result
|
|
'd-c-s-match2
|
|
'(begin
|
|
(eval '(module d-c-s-match2 scheme/base
|
|
(require scheme/contract
|
|
mzlib/match)
|
|
|
|
(define-contract-struct foo (bar baz))
|
|
|
|
(provide d-c-s-match2-f1)
|
|
(define d-c-s-match2-f1
|
|
(match (make-foo 'first 'second)
|
|
[($ foo bar baz) (list bar baz)]
|
|
[_ #f]))))
|
|
(eval '(require 'd-c-s-match2))
|
|
(eval 'd-c-s-match2-f1))
|
|
'(first second))
|
|
|
|
(test/spec-passed/result
|
|
'd-c-s-match3
|
|
'(begin
|
|
(eval '(module d-c-s-match3-a scheme/base
|
|
|
|
(require scheme/contract)
|
|
|
|
(define-struct super (a b c) #:transparent)
|
|
(define-struct (sub super) () #:transparent)
|
|
|
|
(provide/contract
|
|
[struct super ([a number?] [b number?] [c number?])]
|
|
[struct (sub super) ([a number?] [b number?] [c number?])])))
|
|
(eval '(module d-c-s-match3-b scheme/base
|
|
(require scheme/match)
|
|
|
|
(require 'd-c-s-match3-a)
|
|
|
|
(provide d-c-s-match3-ans)
|
|
(define d-c-s-match3-ans
|
|
(match (make-sub 1 2 3)
|
|
[(struct sub (a b c))
|
|
(list a b c)]))))
|
|
(eval '(require 'd-c-s-match3-b))
|
|
(eval 'd-c-s-match3-ans))
|
|
'(1 2 3))
|
|
|
|
(test/pos-blame 'd-c-s1
|
|
'(begin
|
|
(eval '(module d-c-s1 scheme/base
|
|
(require scheme/contract)
|
|
(define-contract-struct couple (hd tl))
|
|
(contract (couple/c any/c any/c) 1 'pos 'neg)))
|
|
(eval '(require 'd-c-s1))))
|
|
|
|
(test/spec-passed 'd-c-s2
|
|
'(contract (couple/c any/c any/c) (make-couple 1 2) 'pos 'neg))
|
|
(test/spec-passed 'd-c-s3
|
|
'(contract (couple/c number? number?)
|
|
(make-couple 1 2)
|
|
'pos 'neg))
|
|
(test/spec-passed 'd-c-s4
|
|
'(couple-hd
|
|
(contract (couple/c number? number?)
|
|
(make-couple 1 2)
|
|
'pos 'neg)))
|
|
(test/spec-passed 'd-c-s5
|
|
'(couple-tl
|
|
(contract (couple/c number? number?)
|
|
(make-couple 1 2)
|
|
'pos 'neg)))
|
|
|
|
|
|
(test/pos-blame
|
|
'd-c-s6
|
|
'(couple-tl
|
|
(contract (couple/c number?
|
|
number?)
|
|
(make-couple #f 2)
|
|
'pos 'neg)))
|
|
(test/pos-blame
|
|
'd-c-s7
|
|
'(couple-hd
|
|
(contract (couple/c number? number?)
|
|
(make-couple #f 2)
|
|
'pos 'neg)))
|
|
|
|
(test/pos-blame
|
|
'd-c-s8
|
|
'(contract (couple/dc [hd any/c] [tl any/c])
|
|
1
|
|
'pos 'neg))
|
|
|
|
(test/pos-blame
|
|
'd-c-s9
|
|
'(contract (couple/dc [hd () any/c] [tl () any/c])
|
|
1
|
|
'pos 'neg))
|
|
|
|
|
|
(test/spec-passed 'd-c-s10
|
|
'(contract (couple/dc [hd any/c] [tl any/c])
|
|
(make-couple 1 2)
|
|
'pos 'neg))
|
|
(test/spec-passed 'd-c-s11
|
|
'(contract (couple/dc [hd () any/c] [tl () any/c])
|
|
(make-couple 1 2)
|
|
'pos 'neg))
|
|
|
|
(test/spec-passed 'd-c-s12
|
|
'(contract (couple/dc [hd number?]
|
|
[tl number?])
|
|
(make-couple 1 2)
|
|
'pos 'neg))
|
|
(test/spec-passed 'd-c-s13
|
|
'(couple-hd
|
|
(contract (couple/dc [hd number?]
|
|
[tl number?])
|
|
(make-couple 1 2)
|
|
'pos 'neg)))
|
|
(test/spec-passed 'd-c-s14
|
|
'(couple-tl
|
|
(contract (couple/dc [hd number?]
|
|
[tl number?])
|
|
(make-couple 1 2)
|
|
'pos 'neg)))
|
|
|
|
|
|
(test/pos-blame
|
|
'd-c-s15
|
|
'(couple-hd
|
|
(contract (couple/dc [hd number?]
|
|
[tl number?])
|
|
(make-couple #f 2)
|
|
'pos 'neg)))
|
|
|
|
(test/pos-blame
|
|
'd-c-s16
|
|
'(couple-tl
|
|
(contract (couple/dc [hd number?]
|
|
[tl number?])
|
|
(make-couple #f 2)
|
|
'pos 'neg)))
|
|
|
|
(test/spec-passed
|
|
'd-c-s17
|
|
'(couple-hd
|
|
(contract (couple/dc [hd number?]
|
|
[tl (hd) (>=/c hd)])
|
|
(make-couple 1 2)
|
|
'pos 'neg)))
|
|
|
|
(test/pos-blame
|
|
'd-c-s18
|
|
'(couple-hd
|
|
(contract (couple/dc [hd number?]
|
|
[tl (hd) (>=/c hd)])
|
|
(make-couple 2 1)
|
|
'pos 'neg)))
|
|
|
|
(test/spec-passed
|
|
'd-c-s19
|
|
'(couple-tl
|
|
(couple-tl
|
|
(contract (couple/dc [hd number?]
|
|
[tl (hd)
|
|
(let ([hd1 hd])
|
|
(couple/dc [hd (>=/c hd1)]
|
|
[tl (hd) (>=/c hd)]))])
|
|
(make-couple 1 (make-couple 2 3))
|
|
'pos 'neg))))
|
|
|
|
(test/pos-blame
|
|
'd-c-s20
|
|
'(couple-tl
|
|
(couple-tl
|
|
(contract (couple/dc [hd number?]
|
|
[tl (hd)
|
|
(let ([hd1 hd])
|
|
(couple/dc [hd (>=/c hd1)]
|
|
[tl (hd) (>=/c hd1)]))])
|
|
(make-couple 1 (make-couple 2 0))
|
|
'pos 'neg))))
|
|
|
|
(test/spec-passed
|
|
'd-c-s21
|
|
'(couple-hd
|
|
(contract (couple/dc [hd number?]
|
|
[tl number?])
|
|
(contract (couple/dc [hd number?]
|
|
[tl number?])
|
|
(make-couple 1 2)
|
|
'pos 'neg)
|
|
'pos 'neg)))
|
|
|
|
(test/spec-passed
|
|
'd-c-s22
|
|
'(couple-hd
|
|
(contract (couple/dc [hd (>=/c 0)]
|
|
[tl (>=/c 0)])
|
|
(contract (couple/dc [hd number?]
|
|
[tl number?])
|
|
(make-couple 1 2)
|
|
'pos 'neg)
|
|
'pos 'neg)))
|
|
|
|
(test/pos-blame
|
|
'd-c-s23
|
|
'(couple-hd
|
|
(contract (couple/dc [hd (>=/c 0)]
|
|
[tl (>=/c 0)])
|
|
(contract (couple/dc [hd number?]
|
|
[tl number?])
|
|
(make-couple -1 2)
|
|
'pos 'neg)
|
|
'pos 'neg)))
|
|
|
|
(test/pos-blame
|
|
'd-c-s24
|
|
'(couple-hd
|
|
(contract (couple/dc [hd number?]
|
|
[tl number?])
|
|
(contract (couple/dc [hd (>=/c 0)]
|
|
[tl (>=/c 0)])
|
|
(make-couple -1 2)
|
|
'pos 'neg)
|
|
'pos 'neg)))
|
|
|
|
(test/pos-blame
|
|
'd-c-s25
|
|
'(couple-hd
|
|
(contract (couple/dc [hd number?]
|
|
[tl number?])
|
|
(contract (couple/dc [hd number?]
|
|
[tl number?])
|
|
(contract (couple/dc [hd (>=/c 0)]
|
|
[tl (>=/c 0)])
|
|
(make-couple -1 2)
|
|
'pos 'neg)
|
|
'pos 'neg)
|
|
'pos 'neg)))
|
|
|
|
(test/pos-blame
|
|
'd-c-s26
|
|
'(couple-hd
|
|
(contract (couple/dc [hd (>=/c 10)]
|
|
[tl (>=/c 10)])
|
|
(contract (couple/dc [hd positive?]
|
|
[tl positive?])
|
|
(contract (couple/dc [hd number?]
|
|
[tl number?])
|
|
(make-couple 1 2)
|
|
'pos 'neg)
|
|
'pos 'neg)
|
|
'pos 'neg)))
|
|
|
|
|
|
;; test caching
|
|
(test/spec-passed
|
|
'd-c-s27
|
|
'(let ([ctc (couple/c any/c any/c)])
|
|
(couple-hd (contract ctc (contract ctc (make-couple 1 2) 'pos 'neg) 'pos 'neg))))
|
|
|
|
;; make sure lazy really is lazy
|
|
(test/spec-passed
|
|
'd-c-s28
|
|
'(contract (couple/c number? number?)
|
|
(make-couple #f #f)
|
|
'pos 'neg))
|
|
|
|
(test/spec-passed
|
|
'd-c-s29
|
|
'(couple-hd
|
|
(contract (couple/c (couple/c number? number?)
|
|
(couple/c number? number?))
|
|
(make-couple (make-couple #f #f)
|
|
(make-couple #f #f))
|
|
'pos 'neg)))
|
|
|
|
(test/spec-passed
|
|
'd-c-s30
|
|
'(couple-tl
|
|
(contract (couple/c (couple/c number? number?)
|
|
(couple/c number? number?))
|
|
(make-couple (make-couple #f #f)
|
|
(make-couple #f #f))
|
|
'pos 'neg)))
|
|
|
|
;; make sure second accesses work
|
|
(test/spec-passed/result
|
|
'd-c-s31
|
|
'(let ([v (contract (couple/c number? number?)
|
|
(make-couple 1 2)
|
|
'pos 'neg)])
|
|
(list (couple-hd v) (couple-hd v)))
|
|
(list 1 1))
|
|
|
|
(test/pos-blame
|
|
'd-c-s32
|
|
'(let ([v (contract (couple/c number? boolean?)
|
|
(make-couple 1 2)
|
|
'pos 'neg)])
|
|
(with-handlers ([void void]) (couple-hd v))
|
|
(couple-hd v)))
|
|
|
|
(test/pos-blame
|
|
'd-c-s33
|
|
'(let ([v (contract (couple/c number? number?)
|
|
(make-couple 1 2)
|
|
'pos 'neg)])
|
|
(couple-hd v)
|
|
(couple-hd v)
|
|
(couple-hd
|
|
(contract (couple/c boolean? boolean?)
|
|
v
|
|
'pos 'neg))))
|
|
|
|
(contract-eval '(define-contract-struct single (a)))
|
|
;; a related test to the above:
|
|
(test/spec-passed/result
|
|
'd-c-s34
|
|
'(let ([v (contract (single/c number?) (make-single 1) 'pos 'neg)])
|
|
(single-a v)
|
|
(let ([v3 (contract (single/c number?) v 'pos 'neg)])
|
|
(single-a v3)))
|
|
1)
|
|
|
|
;; make sure the caching doesn't break the semantics
|
|
(test/pos-blame
|
|
'd-c-s35
|
|
'(let ([v (contract (couple/c any/c
|
|
(couple/c any/c
|
|
(couple/c any/c
|
|
number?)))
|
|
(make-couple 1
|
|
(make-couple 2
|
|
(make-couple 3
|
|
#f)))
|
|
'pos 'neg)])
|
|
(let* ([x (couple-tl v)]
|
|
[y (couple-tl x)])
|
|
(couple-hd (couple-tl x)))))
|
|
|
|
(test/spec-passed/result
|
|
'd-c-s36
|
|
'(let ([x (make-couple 1 2)]
|
|
[y (make-couple 1 2)]
|
|
[c1 (couple/dc [hd any/c]
|
|
[tl (hd) any/c])]
|
|
[c2 (couple/c any/c any/c)])
|
|
(couple-hd (contract c1 x 'pos 'neg))
|
|
(couple-hd (contract c2 x 'pos 'neg))
|
|
(couple-hd (contract c2 y 'pos 'neg))
|
|
(couple-hd (contract c1 y 'pos 'neg)))
|
|
1)
|
|
|
|
;; make sure that define-contract-struct contracts can go at the top level
|
|
(test/spec-passed
|
|
'd-c-s37
|
|
'(contract-stronger?
|
|
(couple/dc [hd any/c]
|
|
[tl (hd) any/c])
|
|
(couple/dc [hd any/c]
|
|
[tl (hd) any/c])))
|
|
|
|
;; test functions inside structs
|
|
|
|
(test/spec-passed/result
|
|
'd-c-s38
|
|
'(let ([x (make-couple (lambda (x) x) (lambda (x) x))]
|
|
[c (couple/dc [hd (-> integer? integer?)]
|
|
[tl (hd) any/c])])
|
|
((couple-hd (contract c x 'pos 'neg)) 1))
|
|
1)
|
|
|
|
(test/neg-blame
|
|
'd-c-s39
|
|
'(let ([x (make-couple (lambda (x) x) (lambda (x) x))]
|
|
[c (couple/dc [hd (-> integer? integer?)]
|
|
[tl (hd) any/c])])
|
|
((couple-hd (contract c x 'pos 'neg)) #f)))
|
|
|
|
(test/pos-blame
|
|
'd-c-s40
|
|
'(let ([x (make-couple (lambda (x) #f) (lambda (x) #f))]
|
|
[c (couple/dc [hd (-> integer? integer?)]
|
|
[tl (hd) any/c])])
|
|
((couple-hd (contract c x 'pos 'neg)) 1)))
|
|
|
|
(test/spec-passed/result
|
|
'd-c-s41
|
|
'(let ([x (make-couple 5 (lambda (x) x))]
|
|
[c (couple/dc [hd number?]
|
|
[tl (hd) (-> (>=/c hd) (>=/c hd))])])
|
|
((couple-tl (contract c x 'pos 'neg)) 6))
|
|
6)
|
|
|
|
(test/pos-blame
|
|
'd-c-s42
|
|
'(let ([x (make-couple 5 (lambda (x) -10))]
|
|
[c (couple/dc [hd number?]
|
|
[tl (hd) (-> (>=/c hd) (>=/c hd))])])
|
|
((couple-tl (contract c x 'pos 'neg)) 6)))
|
|
|
|
(test/neg-blame
|
|
'd-c-s42
|
|
'(let ([x (make-couple 5 (lambda (x) -10))]
|
|
[c (couple/dc [hd number?]
|
|
[tl (hd) (-> (>=/c hd) (>=/c hd))])])
|
|
((couple-tl (contract c x 'pos 'neg)) -11)))
|
|
|
|
|
|
;
|
|
;
|
|
;
|
|
; ;;;; ;;; ;; ; ;;
|
|
; ;;;; ;;;; ;; ;; ;;
|
|
; ;;;;;;; ;;; ;;;;; ;;;; ;;; ;;; ;;;; ;;;;;;; ;;;;; ;; ;;;;;
|
|
; ;;;;;;;; ;;;;; ;;;; ;;;; ;;;;;;;;; ;;;;; ;;;;;; ;;;;;;;; ;;;;;; ;; ;;;;;;
|
|
; ;;;;;;;;; ;;;; ;; ;;;;;; ;;;; ;;;; ;;;; ;;;; ;; ;;;;;;;; ;;;;;;;;; ;;;; ;;;;;;;;;
|
|
; ;;;; ;;;; ;;;;;;; ;;;;;; ;;;; ;;;; ;;;; ;;;;;;; ;;;;;;;;; ;;; ;;;; ;;;; ;;;; ;; ;;;;
|
|
; ;;;;;;;;; ;;;;; ;;;; ;;;; ;;;; ;;;; ;;;;; ;;;;;;;;;;;;; ;;;;;;;;; ;;;;; ;; ;;;;;;;
|
|
; ;;;;;;;; ;;;;;; ;;;; ;;;; ;;;; ;;;; ;;;;;; ;;;;;; ;;;;;;;; ;;;;; ;; ;;;;;;
|
|
; ;;;;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;;;;;;; ;;;; ;; ;;;;;
|
|
; ;;;; ;;
|
|
; ;;;;
|
|
;
|
|
|
|
|
|
(contract-eval '(define-contract-struct node (val obj rank left right) (make-inspector)))
|
|
(contract-eval '(define (compute-rank n)
|
|
(cond
|
|
[(not n) 0]
|
|
[else (node-rank n)])))
|
|
|
|
(contract-eval '(define-opt/c (leftist-heap-greater-than/rank/opt n r)
|
|
(or/c not
|
|
(node/dc [val (>=/c n)]
|
|
[obj any/c]
|
|
[rank (<=/c r)]
|
|
[left (val) (leftist-heap-greater-than/rank/opt val +inf.0)]
|
|
[right (val left) (leftist-heap-greater-than/rank/opt val (compute-rank left))]))))
|
|
|
|
(contract-eval '(define leftist-heap/c (leftist-heap-greater-than/rank/opt -inf.0 +inf.0)))
|
|
|
|
(test/pos-blame 'd-o/c1 '(contract leftist-heap/c 2 'pos 'neg))
|
|
|
|
|
|
(test/spec-passed 'd-o/c2 '(contract leftist-heap/c (make-node 1 2 3 #f #f) 'pos 'neg))
|
|
(test/spec-passed 'd-o/c3 '(contract leftist-heap/c #f 'pos 'neg))
|
|
(test/spec-passed 'd-o/c4 '(contract leftist-heap/c (make-node 1 2 3 #f #f) 'pos 'neg))
|
|
(test/spec-passed/result 'd-o/c5
|
|
'(node? (contract leftist-heap/c (make-node 1 2 3 #f #f) 'pos 'neg))
|
|
#t)
|
|
|
|
(test/spec-passed/result 'd-o/c6 '(node-val (contract leftist-heap/c (make-node 1 2 3 #f #f) 'pos 'neg)) 1)
|
|
(test/spec-passed/result 'd-o/c7 '(node-obj (contract leftist-heap/c (make-node 1 2 3 #f #f) 'pos 'neg)) 2)
|
|
(test/spec-passed/result 'd-o/c8 '(node-rank (contract leftist-heap/c (make-node 1 2 3 #f #f) 'pos 'neg)) 3)
|
|
(test/spec-passed/result 'd-o/c9 '(node-left (contract leftist-heap/c (make-node 1 2 3 #f #f) 'pos 'neg)) #f)
|
|
(test/spec-passed/result 'd-o/c10 '(node-right (contract leftist-heap/c (make-node 1 2 3 #f #f) 'pos 'neg)) #f)
|
|
|
|
(test/spec-passed/result 'd-o/c11
|
|
'(node-val (contract leftist-heap/c
|
|
(contract leftist-heap/c
|
|
(make-node 1 2 3 #f #f)
|
|
'pos 'neg)
|
|
'pos 'neg))
|
|
1)
|
|
(test/spec-passed/result 'd-o/c12
|
|
'(node-obj (contract leftist-heap/c
|
|
(contract leftist-heap/c
|
|
(make-node 1 2 3 #f #f)
|
|
'pos 'neg)
|
|
'pos 'neg))
|
|
2)
|
|
(test/spec-passed/result 'd-o/c13
|
|
'(node-rank (contract leftist-heap/c
|
|
(contract leftist-heap/c
|
|
(make-node 1 2 3 #f #f)
|
|
'pos 'neg)
|
|
'pos 'neg))
|
|
3)
|
|
(test/spec-passed/result 'd-o/c14
|
|
'(node-left (contract leftist-heap/c
|
|
(contract leftist-heap/c
|
|
(make-node 1 2 3 #f #f)
|
|
'pos 'neg)
|
|
'pos 'neg))
|
|
#f)
|
|
(test/spec-passed/result 'd-o/c15
|
|
'(node-right (contract leftist-heap/c
|
|
(contract leftist-heap/c
|
|
(make-node 1 2 3 #f #f)
|
|
'pos 'neg)
|
|
'pos 'neg))
|
|
#f)
|
|
|
|
(test/spec-passed/result 'd-o/c16
|
|
'(let ([h (contract leftist-heap/c (make-node 1 2 3 #f #f) 'pos 'neg)])
|
|
(node-val h)
|
|
(node-val h))
|
|
1)
|
|
(test/spec-passed/result 'd-o/c17
|
|
'(let ([h (contract leftist-heap/c (make-node 1 2 3 #f #f) 'pos 'neg)])
|
|
(node-obj h)
|
|
(node-obj h))
|
|
2)
|
|
|
|
(test/spec-passed/result 'd-o/c18
|
|
'(let ([h (contract leftist-heap/c (make-node 1 2 3 #f #f)'pos 'neg)])
|
|
(node-rank h)
|
|
(node-rank h))
|
|
3)
|
|
(test/spec-passed/result 'd-o/c19
|
|
'(let ([h (contract leftist-heap/c (make-node 1 2 3 #f #f) 'pos 'neg)])
|
|
(node-left h)
|
|
(node-left h))
|
|
#f)
|
|
(test/spec-passed/result 'd-o/c20
|
|
'(let ([h (contract leftist-heap/c (make-node 1 2 3 #f #f) 'pos 'neg)])
|
|
(node-right h)
|
|
(node-right h))
|
|
#f)
|
|
|
|
(test/spec-passed/result 'd-o/c21
|
|
'(node-val
|
|
(node-right
|
|
(contract leftist-heap/c
|
|
(make-node 1 2 3
|
|
(make-node 7 8 9 #f #f)
|
|
(make-node 4 5 6 #f #f))
|
|
'pos 'neg)))
|
|
4)
|
|
(test/spec-passed/result 'd-o/c22
|
|
'(node-val
|
|
(node-left
|
|
(contract leftist-heap/c
|
|
(make-node 1 2 3
|
|
(make-node 7 8 9 #f #f)
|
|
(make-node 4 5 6 #f #f))
|
|
'pos 'neg)))
|
|
7)
|
|
|
|
(test/pos-blame 'd-o/c23
|
|
'(node-val
|
|
(node-right
|
|
(contract leftist-heap/c
|
|
(make-node 5 2 3
|
|
(make-node 7 8 9 #f #f)
|
|
(make-node 4 5 6 #f #f))
|
|
'pos 'neg))))
|
|
|
|
(test/pos-blame 'd-o/c24
|
|
'(node-val
|
|
(node-left
|
|
(contract leftist-heap/c
|
|
(make-node 9 2 3
|
|
(make-node 7 8 9 #f #f)
|
|
(make-node 11 5 6 #f #f))
|
|
'pos 'neg))))
|
|
|
|
(test/neg-blame 'd-o/c25
|
|
'((contract (-> leftist-heap/c any)
|
|
(λ (kh)
|
|
(node-val
|
|
(node-left
|
|
kh)))
|
|
'pos 'neg)
|
|
(make-node 9 2 3
|
|
(make-node 7 8 9 #f #f)
|
|
(make-node 11 5 6 #f #f))))
|
|
|
|
|
|
|
|
(test/spec-passed/result
|
|
'd-o/c26
|
|
'(let ([ai (λ (x) (contract leftist-heap/c x 'pos 'neg))])
|
|
(define (remove-min t) (merge (node-left t) (node-right t)))
|
|
|
|
(define (merge t1 t2)
|
|
(cond
|
|
[(not t1) t2]
|
|
[(not t2) t1]
|
|
[else
|
|
(let ([t1-val (node-val t1)]
|
|
[t2-val (node-val t2)])
|
|
(cond
|
|
[(<= t1-val t2-val)
|
|
(pick t1-val
|
|
(node-obj t1)
|
|
(node-left t1)
|
|
(merge (node-right t1)
|
|
t2))]
|
|
[else
|
|
(pick t2-val
|
|
(node-obj t2)
|
|
(node-left t2)
|
|
(merge t1
|
|
(node-right t2)))]))]))
|
|
|
|
(define (pick x obj a b)
|
|
(let ([ra (compute-rank a)]
|
|
[rb (compute-rank b)])
|
|
(cond
|
|
[(>= ra rb)
|
|
(make-node x obj (+ rb 1) a b)]
|
|
[else
|
|
(make-node x obj (+ ra 1) b a)])))
|
|
(node-val
|
|
(remove-min (ai (make-node 137 'x 1
|
|
(ai (make-node 178 'y 1
|
|
(make-node 178 'z 1 #f #f)
|
|
#f))
|
|
#f)))))
|
|
178)
|
|
|
|
;;
|
|
;; end of define-opt/c
|
|
;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
;; NOT YET RELEASED
|
|
#;
|
|
(test/pos-blame
|
|
'd-c-s/attr-1
|
|
'(let ()
|
|
(define-contract-struct pr (x y))
|
|
(pr-x
|
|
(contract (pr/dc [x integer?]
|
|
[y integer?]
|
|
where
|
|
[x-val x]
|
|
[y-val y]
|
|
and
|
|
(= x-val y-val))
|
|
(make-pr 4 5)
|
|
'pos
|
|
'neg))))
|
|
|
|
;; NOT YET RELEASED
|
|
#;
|
|
(test/spec-passed
|
|
'd-c-s/attr-2
|
|
'(let ()
|
|
(define-contract-struct pr (x y))
|
|
(contract (pr/dc [x integer?]
|
|
[y integer?]
|
|
where
|
|
[x-val x]
|
|
[y-val y]
|
|
and
|
|
(= x-val y-val))
|
|
(make-pr 4 5)
|
|
'pos
|
|
'neg)))
|
|
|
|
;; NOT YET RELEASED
|
|
#;
|
|
(let ()
|
|
(define-contract-struct node (n l r) (make-inspector))
|
|
|
|
(define (get-val n attr)
|
|
(if (null? n)
|
|
1
|
|
(let ([h (synthesized-value n attr)])
|
|
(if (unknown? h)
|
|
h
|
|
(+ h 1)))))
|
|
|
|
(define (full-bbt lo hi)
|
|
(or/c null?
|
|
(node/dc [n (between/c lo hi)]
|
|
[l (n) (full-bbt lo n)]
|
|
[r (n) (full-bbt n hi)]
|
|
|
|
where
|
|
[lheight (get-val l lheight)]
|
|
[rheight (get-val r rheight)]
|
|
|
|
and
|
|
(<= 0 (- lheight rheight) 1))))
|
|
|
|
(define t (contract (full-bbt -inf.0 +inf.0)
|
|
(make-node 0
|
|
(make-node -1 null null)
|
|
(make-node 2
|
|
(make-node 1 null null)
|
|
(make-node 3 null null)))
|
|
'pos
|
|
'neg))
|
|
(test/spec-passed
|
|
'd-c-s/attr-3
|
|
`(,node-l (,node-l ,t)))
|
|
|
|
(test/pos-blame
|
|
'd-c-s/attr-4
|
|
`(,node-r (,node-r (,node-r ,t)))))
|
|
|
|
;; NOT YET RELEASED
|
|
#|
|
|
|
|
need a test that will revisit a node a second time (when it already has a wrapper)
|
|
with a new parent. make sure the new parent is recorded in the parents field
|
|
so that propagation occurs.
|
|
|
|
|#
|
|
|
|
|
|
;; test the predicate
|
|
(ctest #t couple? (contract (couple/c any/c any/c) (make-couple 1 2) 'pos 'neg))
|
|
(ctest #t couple? (make-couple 1 2))
|
|
(ctest #t couple? (contract (couple/dc [hd any/c] [tl (hd) any/c]) (make-couple 1 2) 'pos 'neg))
|
|
(ctest #f couple? 1)
|
|
(ctest #f couple? #f)
|
|
|
|
|
|
;
|
|
;
|
|
;
|
|
; ;;; ;;;; ; ; ; ;;;
|
|
; ;;;; ;;;; ;; ;; ;; ;;;;;
|
|
; ;;;;; ;;;; ;;;;;;; ;;;;; ;;;;; ;;;; ;;;; ;;; ;;;;; ;;; ;;; ;;;;;;; ;;;;; ;;;;; ;;;;;;
|
|
; ;;;; ;;;; ;;;;;;;; ;;;;;; ;;;;;; ;;;;;; ;;;;;;;;; ;;;;;; ;;;;;;; ;;;;;;;; ;;;;;; ;;;;;; ;;;
|
|
; ;;;;;; ;;;; ;;;; ;;;; ;;;;;;; ;;;;;;;; ;;;; ;;;; ;;;; ;;;; ;; ;;;; ;;;;;;; ;;;; ;;
|
|
; ;;;;;; ;;;; ;;;;;;; ;;;; ;;;;;;;;; ;;;; ;;; ;;;; ;;;; ;;;; ;;;; ;;;;;;; ;;;; ;;;; ;
|
|
; ;;;; ;;;; ;; ;;;; ;;;;; ;;;;;;;;;;;; ;;;;;;;; ;;;; ;;;; ;;;;; ;;;; ;; ;;;; ;;;;;;; ;;;;; ;;;
|
|
; ;;;; ;;;; ;;;;;;;; ;;;;; ;;;;;; ;;;;;; ;;;; ;;;; ;;;;; ;;;; ;;;;;;;; ;;;;;; ;;;;; ;;;
|
|
; ;;;; ;;;; ;; ;;;; ;;;; ;;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;; ;;;; ;;;;; ;;;; ;;;
|
|
;
|
|
;
|
|
;
|
|
|
|
|
|
|
|
(ctest #t flat-contract? (or/c))
|
|
(ctest #t flat-contract? (or/c integer? (lambda (x) (> x 0))))
|
|
(ctest #t flat-contract? (or/c (flat-contract integer?) (flat-contract boolean?)))
|
|
(ctest #t flat-contract? (or/c integer? boolean?))
|
|
(test-flat-contract '(or/c (flat-contract integer?) char?) #\a #t)
|
|
(test-flat-contract '(or/c (flat-contract integer?) char?) 1 #t)
|
|
|
|
(ctest #t flat-contract? (and/c))
|
|
(ctest #t flat-contract? (and/c number? integer?))
|
|
(ctest #t flat-contract? (and/c (flat-contract number?)
|
|
(flat-contract integer?)))
|
|
(ctest #t flat-contract? (let ()
|
|
(define-struct s (a b))
|
|
(struct/c s any/c any/c)))
|
|
|
|
(test-flat-contract '(and/c number? integer?) 1 3/2)
|
|
|
|
(test-flat-contract '(not/c integer?) #t 1)
|
|
(test-flat-contract '(=/c 2) 2 3)
|
|
(test-flat-contract '(>=/c 5) 5 0)
|
|
(test-flat-contract '(<=/c 5) 5 10)
|
|
(test-flat-contract '(</c 5) 0 5)
|
|
(test-flat-contract '(>/c 5) 10 5)
|
|
(test-flat-contract '(integer-in 0 10) 0 11)
|
|
(test-flat-contract '(integer-in 0 10) 10 3/2)
|
|
(test-flat-contract '(integer-in 0 10) 1 1.0)
|
|
(test-flat-contract '(real-in 1 10) 3/2 20)
|
|
(test-flat-contract '(string-len/c 3) "ab" "abc")
|
|
(test-flat-contract 'natural-number/c 5 -1)
|
|
(test-flat-contract 'false/c #f #t)
|
|
(test/spec-passed 'any/c '(contract any/c 1 'pos 'neg))
|
|
(test-flat-contract 'printable/c (vector (cons 1 (box #f))) (lambda (x) x))
|
|
(test-flat-contract '(symbols 'a 'b 'c) 'a 'd)
|
|
(test-flat-contract '(one-of/c (expt 2 65)) (expt 2 65) 12)
|
|
(test-flat-contract '(one-of/c '#:x '#:z) '#:x '#:y)
|
|
|
|
(let ([c% (contract-eval '(class object% (super-new)))])
|
|
(test-flat-contract `(subclass?/c ,c%) c% (contract-eval `object%))
|
|
(test-flat-contract `(subclass?/c ,c%) (contract-eval `(class ,c%)) (contract-eval `(class object%))))
|
|
|
|
(let ([i<%> (contract-eval '(interface ()))])
|
|
(test-flat-contract `(implementation?/c ,i<%>)
|
|
(contract-eval `(class* object% (,i<%>) (super-new)))
|
|
(contract-eval 'object%))
|
|
(test-flat-contract `(implementation?/c ,i<%>)
|
|
(contract-eval `(class* object% (,i<%>) (super-new)))
|
|
#f))
|
|
|
|
(let ([i<%> (contract-eval '(interface ()))]
|
|
[c% (contract-eval '(class object% (super-new)))])
|
|
(test-flat-contract `(is-a?/c ,i<%>)
|
|
(contract-eval `(new (class* object% (,i<%>) (super-new))))
|
|
(contract-eval '(new object%)))
|
|
(test-flat-contract `(is-a?/c ,c%)
|
|
(contract-eval `(new ,c%))
|
|
(contract-eval '(new object%))))
|
|
|
|
(test-flat-contract '(listof boolean?) (list #t #f) (list #f 3 #t))
|
|
(test-flat-contract '(listof any/c) (list #t #f) 3)
|
|
|
|
(test-flat-contract '(vectorof boolean?) (vector #t #f) (vector #f 3 #t))
|
|
(test-flat-contract '(vectorof any/c) (vector #t #f) 3)
|
|
|
|
(test-flat-contract '(vector/c boolean? (flat-contract integer?)) (vector #t 1) (vector 1 #f))
|
|
(test-flat-contract '(vector/c boolean? (flat-contract integer?)) (vector #t 1) #f)
|
|
|
|
(test-flat-contract '(cons/c boolean? (flat-contract integer?)) (cons #t 1) (cons 1 #f))
|
|
(test-flat-contract '(cons/c boolean? (flat-contract integer?)) (cons #t 1) #f)
|
|
(test-flat-contract '(list/c boolean? (flat-contract integer?)) (list #t 1) (list 1 #f))
|
|
(test-flat-contract '(list/c boolean? (flat-contract integer?)) (list #t 1) #f)
|
|
|
|
(contract-eval '(define (a-predicate-that-wont-be-optimized x) (boolean? x)))
|
|
(test-flat-contract '(cons/c a-predicate-that-wont-be-optimized (flat-contract integer?)) (cons #t 1) (cons 1 #f))
|
|
(test-flat-contract '(cons/c a-predicate-that-wont-be-optimized (flat-contract integer?)) (cons #t 1) #f)
|
|
(test-flat-contract '(list/c a-predicate-that-wont-be-optimized (flat-contract integer?)) (list #t 1) (list 1 #f))
|
|
(test-flat-contract '(list/c a-predicate-that-wont-be-optimized (flat-contract integer?)) (list #t 1) #f)
|
|
|
|
(test-flat-contract '(box/c boolean?) (box #f) (box 1))
|
|
(test-flat-contract '(box/c (flat-contract boolean?)) (box #t) #f)
|
|
|
|
(test-flat-contract '(flat-rec-contract sexp (cons/c sexp sexp) number?) '(1 2 . 3) '(1 . #f))
|
|
(test-flat-contract '(flat-murec-contract ([even1 (or/c null? (cons/c number? even2))]
|
|
[even2 (cons/c number? even1)])
|
|
even1)
|
|
'(1 2 3 4)
|
|
'(1 2 3))
|
|
(test #t 'malformed-binder
|
|
(with-handlers ((exn? exn:fail:syntax?))
|
|
(contract-eval '(flat-murec-contract ([(x) y]) x))
|
|
'no-err))
|
|
(test #t 'missing-body
|
|
(with-handlers ((exn? exn:fail:syntax?))
|
|
(contract-eval '(flat-murec-contract ([x y])))
|
|
'no-err))
|
|
|
|
|
|
;
|
|
;
|
|
;
|
|
; ;; ;;; ;;;;
|
|
; ;; ;;;; ;;;;
|
|
; ;;;; ;;; ;;;;; ;;; ;;; ;;; ;;; ;;; ;;; ;;;;;;; ;;;; ;;; ;;;;;;; ;;;;;;; ;;;; ;;;
|
|
; ;;;; ;;;;;;;;; ;;;; ;;;;; ;;;;;;; ;;;;;;; ;;;;; ;;;;;;;; ;;;;;;;;; ;;;;;;;; ;;;;;;;;;;;;; ;;;;;
|
|
; ;;;; ;;;; ;;;; ;;;;;; ;;;; ;; ;;;; ;; ;;;; ;; ;;;; ;; ;;;;;;;;; ;;;; ;;;; ;;;; ;;;; ;;; ;;;; ;;;; ;;
|
|
; ;;;; ;;;; ;;;; ;;;;;; ;;;;;;; ;;;; ;;;; ;;;;;;; ;;;; ;;;; ;;;; ;;;; ;;;;;;; ;;;; ;;; ;;;; ;;;;;;;
|
|
; ;;;; ;;;; ;;;; ;;;; ;;;;; ;;;; ;;;; ;;;;; ;;;;;;;;; ;;;; ;;;; ;; ;;;; ;;;; ;;; ;;;; ;;;;;
|
|
; ;;;; ;;;; ;;;; ;;;; ;;;;;; ;;;; ;;;; ;;;;;; ;;;;;;;; ;;;; ;;;; ;;;;;;;; ;;;; ;;; ;;;; ;;;;;;
|
|
; ;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;;;;;;; ;;;; ;;;; ;; ;;;; ;;;; ;;; ;;;; ;;;;
|
|
;
|
|
;
|
|
;
|
|
|
|
(contract-eval
|
|
'(module contract-test-suite-inferred-name1 scheme/base
|
|
(require scheme/contract)
|
|
(define contract-inferred-name-test-contract (-> integer? any))
|
|
(define (contract-inferred-name-test x) #t)
|
|
(provide/contract (contract-inferred-name-test contract-inferred-name-test-contract))
|
|
|
|
(define (contract-inferred-name-test2 x) x)
|
|
(provide/contract (contract-inferred-name-test2 (-> number? number?)))
|
|
|
|
(define (contract-inferred-name-test2b x) (values x x))
|
|
(provide/contract (contract-inferred-name-test2b (-> number? (values number? number?))))
|
|
|
|
(define (contract-inferred-name-test3 x . y) x)
|
|
(provide/contract (contract-inferred-name-test3 (->* (number?) () #:rest (listof number?) number?)))
|
|
|
|
(define (contract-inferred-name-test4) 7)
|
|
(provide/contract (contract-inferred-name-test4 (->d () () any)))
|
|
|
|
))
|
|
(contract-eval '(require 'contract-test-suite-inferred-name1))
|
|
;; (eval '(test 'contract-inferred-name-test object-name contract-inferred-name-test)) ;; this one can't be made to pass, sadly.
|
|
(test 'contract-inferred-name-test2 object-name (contract-eval 'contract-inferred-name-test2))
|
|
(test 'contract-inferred-name-test2b object-name (contract-eval 'contract-inferred-name-test2b))
|
|
(test 'contract-inferred-name-test3 object-name (contract-eval 'contract-inferred-name-test3))
|
|
(test 'contract-inferred-name-test4 object-name (contract-eval 'contract-inferred-name-test4))
|
|
|
|
|
|
|
|
;
|
|
;
|
|
;
|
|
; ; ;
|
|
; ;; ;;
|
|
; ;;;;; ;;;; ;;;; ;;; ;;;;; ;;; ;;; ;;;;;;; ;;;;; ;;;;; ;;;; ;;; ;;;;;;; ;;;;;;; ;;;; ;;;
|
|
; ;;;;;; ;;;;;; ;;;;;;;;; ;;;;;; ;;;;;;; ;;;;;;;; ;;;;;; ;;;;;; ;;;;;;;;; ;;;;;;;; ;;;;;;;;;;;;; ;;;;;
|
|
; ;;;;;;; ;;;;;;;; ;;;; ;;;; ;;;; ;;;; ;; ;;;; ;;;;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;;; ;;;; ;;;; ;;
|
|
; ;;;; ;;;; ;;; ;;;; ;;;; ;;;; ;;;; ;;;;;;; ;;;; ;;;; ;;;;;;;;; ;;;; ;;;;;;; ;;;; ;;; ;;;; ;;;;;;;
|
|
; ;;;;;;; ;;;;;;;; ;;;; ;;;; ;;;;; ;;;; ;; ;;;; ;;;;;;; ;;;;; ;;;;;;;;; ;;;; ;; ;;;; ;;;; ;;; ;;;; ;;;;;
|
|
; ;;;;;; ;;;;;; ;;;; ;;;; ;;;;; ;;;; ;;;;;;;; ;;;;;; ;;;;; ;;;; ;;;; ;;;;;;;; ;;;; ;;; ;;;; ;;;;;;
|
|
; ;;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;; ;;;; ;;;;; ;;;; ;;;; ;;;; ;; ;;;; ;;;; ;;; ;;;; ;;;;
|
|
;
|
|
;
|
|
;
|
|
|
|
|
|
(test-name 'integer? (flat-contract integer?))
|
|
(test-name 'boolean? (flat-contract boolean?))
|
|
(test-name 'char? (flat-contract char?))
|
|
(test-name 'any/c any/c)
|
|
|
|
(test-name '(-> integer? integer?) (-> integer? integer?))
|
|
(test-name '(-> integer? any) (-> integer? any))
|
|
(test-name '(-> integer? (values boolean? char?)) (-> integer? (values boolean? char?)))
|
|
(test-name '(-> integer? boolean? (values char? any/c)) (->* (integer? boolean?) () (values char? any/c)))
|
|
(test-name '(-> integer? boolean? any) (->* (integer? boolean?) () any))
|
|
(test-name '(-> integer? boolean? #:x string? any) (-> integer? #:x string? boolean? any))
|
|
|
|
(test-name '(->* (integer?) (string?) #:rest any/c (values char? any/c))
|
|
(->* (integer?) (string?) #:rest any/c (values char? any/c)))
|
|
(test-name '(->* (integer? char?) (boolean?) any) (->* (integer? char?) (boolean?) any))
|
|
(test-name '(->* (integer? char? #:z string?) (integer?) any) (->* (#:z string? integer? char?) (integer?) any))
|
|
(test-name '(->* (integer? char? #:z string?) (boolean? #:i number?) any) (->* (#:z string? integer? char?) (boolean? #:i number?) any))
|
|
(test-name '(->* (integer? char? #:z string?) (boolean? #:i number?) #:rest (listof integer?) any)
|
|
(->* (#:z string? integer? char?) (boolean? #:i number?) #:rest (listof integer?) any))
|
|
(test-name '(->* (integer? char? #:z string?) (boolean? #:i number?) (values number? boolean? symbol?))
|
|
(->* (#:z string? integer? char?) (boolean? #:i number?) (values number? boolean? symbol?)))
|
|
(test-name '(->* (integer? char? #:z string?) (boolean? #:i number?) #:rest (listof integer?) (values number? boolean? symbol?))
|
|
(->* (#:z string? integer? char?) (boolean? #:i number?) #:rest (listof integer?) (values number? boolean? symbol?)))
|
|
|
|
(test-name '(->d () () any) (->d () () any))
|
|
(test-name '(->d ([x ...] #:y [y ...]) ([z ...] #:w [w ...]) any) (->d ([x integer?] #:y [y integer?]) ([z integer?] #:w [w integer?]) any))
|
|
(test-name '(->d () () (values [x ...] [y ...])) (->d () () (values [x number?] [y number?])))
|
|
(test-name '(->d () () [x ...]) (->d () () [q number?]))
|
|
(test-name '(->d () () #:pre-cond ... [x ...]) (->d () () #:pre-cond #t [q number?]))
|
|
(test-name '(->d () () #:pre-cond ... [x ...] #:post-cond ...) (->d () () #:pre-cond #t [q number?] #:post-cond #t))
|
|
(test-name '(->d () () [x ...] #:post-cond ...) (->d () () [q number?] #:post-cond #t))
|
|
|
|
(test-name '(case->) (case->))
|
|
(test-name '(case-> (-> integer? any) (-> boolean? boolean? any) (-> char? char? char? any))
|
|
(case-> (-> integer? any) (-> boolean? boolean? any) (-> char? char? char? any)))
|
|
(test-name '(case-> (-> integer? integer?) (-> integer? integer? integer?))
|
|
(case-> (-> integer? integer?) (-> integer? integer? integer?)))
|
|
(test-name '(case-> (-> integer? #:rest any/c any)) (case-> (-> integer? #:rest any/c any)))
|
|
(test-name '(case-> (-> integer? #:rest any/c (values boolean? char? number?)))
|
|
(case-> (-> integer? #:rest any/c (values boolean? char? number?))))
|
|
(test-name '(case-> (-> integer? (values))) (case-> (-> integer? (values))))
|
|
|
|
(test-name '(unconstrained-domain-> number?) (unconstrained-domain-> number?))
|
|
|
|
(test-name '(or/c) (or/c))
|
|
(test-name '(or/c integer? gt0?) (or/c integer? (let ([gt0? (lambda (x) (> x 0))]) gt0?)))
|
|
(test-name '(or/c integer? boolean?)
|
|
(or/c (flat-contract integer?)
|
|
(flat-contract boolean?)))
|
|
(test-name '(or/c integer? boolean?)
|
|
(or/c integer? boolean?))
|
|
(test-name '(or/c (-> (>=/c 5) (>=/c 5)) boolean?)
|
|
(or/c (-> (>=/c 5) (>=/c 5)) boolean?))
|
|
(test-name '(or/c (-> (>=/c 5) (>=/c 5)) boolean?)
|
|
(or/c boolean? (-> (>=/c 5) (>=/c 5))))
|
|
(test-name '(or/c (-> (>=/c 5) (>=/c 5))
|
|
(-> (<=/c 5) (<=/c 5) (<=/c 5)))
|
|
(or/c (-> (>=/c 5) (>=/c 5))
|
|
(-> (<=/c 5) (<=/c 5) (<=/c 5))))
|
|
(test-name '(or/c boolean?
|
|
(-> (>=/c 5) (>=/c 5))
|
|
(-> (<=/c 5) (<=/c 5) (<=/c 5)))
|
|
(or/c boolean?
|
|
(-> (>=/c 5) (>=/c 5))
|
|
(-> (<=/c 5) (<=/c 5) (<=/c 5))))
|
|
|
|
(test-name 'any/c (and/c))
|
|
(test-name '(and/c any/c) (and/c any/c))
|
|
(test-name '(and/c any/c any/c) (and/c any/c any/c))
|
|
(test-name '(and/c number? integer?) (and/c number? integer?))
|
|
(test-name '(and/c number? integer?) (and/c (flat-contract number?)
|
|
(flat-contract integer?)))
|
|
(test-name '(and/c number? (-> integer? integer?)) (and/c number? (-> integer? integer?)))
|
|
(test-name '(and/c (-> boolean? boolean?) (-> integer? integer?)) (and/c (-> boolean? boolean?) (-> integer? integer?)))
|
|
|
|
(test-name '(not/c integer?) (not/c integer?))
|
|
(test-name '(=/c 5) (=/c 5))
|
|
(test-name '(>=/c 5) (>=/c 5))
|
|
(test-name '(<=/c 5) (<=/c 5))
|
|
(test-name '(</c 5) (</c 5))
|
|
(test-name '(>/c 5) (>/c 5))
|
|
(test-name '(between/c 5 6) (between/c 5 6))
|
|
(test-name '(integer-in 0 10) (integer-in 0 10))
|
|
(test-name '(real-in 1 10) (real-in 1 10))
|
|
(test-name '(string-len/c 3) (string-len/c 3))
|
|
(test-name 'natural-number/c natural-number/c)
|
|
(test-name 'false/c false/c)
|
|
(test-name 'printable/c printable/c)
|
|
(test-name '(symbols 'a 'b 'c) (symbols 'a 'b 'c))
|
|
(test-name '(one-of/c 1 2 3) (one-of/c 1 2 3))
|
|
(test-name '(one-of/c '() 'x 1 #f #\a (void) (letrec ([x x]) x))
|
|
(one-of/c '() 'x 1 #f #\a (void) (letrec ([x x]) x)))
|
|
|
|
(test-name '(subclass?/c class:c%)
|
|
(let ([c% (class object% (super-new))]) (subclass?/c c%)))
|
|
|
|
(test-name '(implementation?/c interface:i<%>)
|
|
(let ([i<%> (interface ())])
|
|
(implementation?/c i<%>)))
|
|
|
|
(test-name '(is-a?/c interface:i<%>)
|
|
(let ([i<%> (interface ())])
|
|
(is-a?/c i<%>)))
|
|
(test-name '(is-a?/c class:c%)
|
|
(let ([i<%> (interface ())]
|
|
[c% (class object% (super-new))])
|
|
(is-a?/c c%)))
|
|
|
|
(test-name '(listof boolean?) (listof boolean?))
|
|
(test-name '(listof any/c) (listof any/c))
|
|
(test-name '(listof boolean?) (listof boolean?))
|
|
(test-name '(listof any/c) (listof any/c))
|
|
(test-name '(listof boolean?) (listof boolean?))
|
|
(test-name '(listof (-> boolean? boolean?)) (listof (-> boolean? boolean?)))
|
|
|
|
(test-name '(vectorof boolean?) (vectorof boolean?))
|
|
(test-name '(vectorof any/c) (vectorof any/c))
|
|
|
|
(test-name '(vector/c boolean? integer?) (vector/c boolean? integer?))
|
|
(test-name '(vector/c boolean? integer?) (vector/c boolean? (flat-contract integer?)))
|
|
|
|
(test-name '(cons/c boolean? integer?) (cons/c boolean? (flat-contract integer?)))
|
|
(test-name '(cons/c boolean? integer?) (cons/c boolean? (flat-contract integer?)))
|
|
(test-name '(cons/c boolean? (cons/c integer? null?)) (list/c boolean? (flat-contract integer?)))
|
|
(test-name '(cons/c boolean? (cons/c integer? null?)) (list/c boolean? (flat-contract integer?)))
|
|
|
|
(test-name '(cons/c boolean? integer?) (cons/c boolean? (flat-contract integer?)))
|
|
(test-name '(cons/c boolean? integer?) (cons/c boolean? (flat-contract integer?)))
|
|
(test-name '(cons/c boolean? integer?) (cons/c boolean? (flat-contract integer?)))
|
|
(test-name '(cons/c (-> boolean? boolean?) integer?) (cons/c (-> boolean? boolean?) integer?))
|
|
|
|
(test-name '(cons/c boolean? (cons/c integer? null?))
|
|
(list/c boolean? (flat-contract integer?)))
|
|
(test-name '(cons/c boolean? (cons/c integer? null?))
|
|
(list/c boolean? (flat-contract integer?)))
|
|
(test-name '(cons/c boolean? (cons/c integer? null?))
|
|
(list/c boolean? (flat-contract integer?)))
|
|
(test-name '(cons/c (-> boolean? boolean?) (cons/c integer? null?))
|
|
(list/c (-> boolean? boolean?) integer?))
|
|
|
|
(test-name '(parameter/c integer?) (parameter/c integer?))
|
|
|
|
(test-name '(box/c boolean?) (box/c boolean?))
|
|
(test-name '(box/c boolean?) (box/c (flat-contract boolean?)))
|
|
(test-name 'the-name (flat-rec-contract the-name))
|
|
|
|
(test-name '(object-contract) (object-contract))
|
|
(test-name '(object-contract (field x integer?)) (object-contract (field x integer?)))
|
|
(test-name '(object-contract (m (-> integer? integer?)))
|
|
(object-contract (m (-> integer? integer?))))
|
|
(test-name '(object-contract (m (-> integer? any)))
|
|
(object-contract (m (-> integer? any))))
|
|
(test-name '(object-contract (m (-> integer? (values integer? integer?))))
|
|
(object-contract (m (-> integer? (values integer? integer?)))))
|
|
(test-name '(object-contract (m (case-> (-> integer? integer? integer?)
|
|
(-> integer? (values integer? integer?)))))
|
|
(object-contract (m (case->
|
|
(-> integer? integer? integer?)
|
|
(-> integer? (values integer? integer?))))))
|
|
(test-name
|
|
'(object-contract (m (->* (integer?) (boolean? number?) symbol?)))
|
|
(object-contract (m (->* (integer?) (boolean? number?) symbol?))))
|
|
|
|
(test-name '(object-contract (m (->d ((x ...)) () (y ...)))) (object-contract (m (->d ((x number?)) () [result number?]))))
|
|
(test-name '(object-contract (m (->d ((x ...) (y ...) (z ...)) () [w ...])))
|
|
(object-contract (m (->d ((x number?) (y boolean?) (z pair?)) () [result number?]))))
|
|
(test-name '(object-contract (m (->d ((x ...) (y ...) (z ...)) () #:rest w ... [x0 ...])))
|
|
(object-contract (m (->d ((x number?) (y boolean?) (z pair?)) () #:rest rest-x any/c [result number?]))))
|
|
|
|
(test-name '(promise/c any/c) (promise/c any/c))
|
|
(test-name '(syntax/c any/c) (syntax/c any/c))
|
|
(test-name '(struct/c st integer?)
|
|
(let ()
|
|
(define-struct st (a))
|
|
(struct/c st integer?)))
|
|
|
|
(test-name '(recursive-contract (box/c boolean?)) (recursive-contract (box/c boolean?)))
|
|
(test-name '(recursive-contract x) (let ([x (box/c boolean?)]) (recursive-contract x)))
|
|
|
|
(test-name '(couple/c any/c any/c)
|
|
(couple/c any/c any/c))
|
|
(test-name '(couple/c any/c any/c)
|
|
(couple/dc [hd any/c] [tl any/c]))
|
|
(test-name '(couple/dc [hd any/c] [tl ...])
|
|
(couple/dc [hd any/c] [tl (hd) any/c]))
|
|
|
|
;; NOT YET RELEASED
|
|
#;
|
|
(test-name '(pr/dc [x integer?]
|
|
[y integer?]
|
|
where
|
|
[x-val ...]
|
|
[y-val ...]
|
|
and
|
|
...)
|
|
(let ()
|
|
(define-contract-struct pr (x y))
|
|
(pr/dc [x integer?]
|
|
[y integer?]
|
|
where
|
|
[x-val x]
|
|
[y-val y]
|
|
and
|
|
(= x-val y-val))))
|
|
|
|
|
|
;
|
|
;
|
|
;
|
|
; ;
|
|
; ;;
|
|
; ;;;;; ;;;;; ;;; ;;; ;;;; ;;;; ;;; ;;;;;;; ;;; ;;; ;;;
|
|
; ;;;;;; ;;;;;; ;;;;;;; ;;;;;; ;;;;;;;;; ;;;;;;;; ;;;;; ;;;;;;;
|
|
; ;;;; ;;;; ;;;; ;; ;;;;;;;; ;;;; ;;;; ;;; ;;;; ;;;; ;; ;;;; ;;
|
|
; ;;;; ;;;; ;;;; ;;;; ;;; ;;;; ;;;; ;;;;;;;; ;;;;;;; ;;;;
|
|
; ;;;; ;;;;; ;;;; ;;;;;;;; ;;;; ;;;; ;;;;;;; ;;;;; ;;;;
|
|
; ;;;;;; ;;;;; ;;;; ;;;;;; ;;;; ;;;; ; ;;;; ;;;;;; ;;;;
|
|
; ;;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;;;;;;;; ;;;; ;;;;
|
|
; ;;;;;;;;
|
|
; ;;;;;;
|
|
;
|
|
|
|
(ctest #t contract-stronger? any/c any/c)
|
|
(ctest #t contract-stronger? (between/c 1 3) (between/c 0 4))
|
|
(ctest #f contract-stronger? (between/c 0 4) (between/c 1 3))
|
|
(ctest #t contract-stronger? (>=/c 3) (>=/c 2))
|
|
(ctest #f contract-stronger? (>=/c 2) (>=/c 3))
|
|
(ctest #f contract-stronger? (<=/c 3) (<=/c 2))
|
|
(ctest #t contract-stronger? (<=/c 2) (<=/c 3))
|
|
(ctest #f contract-stronger? (recursive-contract (<=/c 2)) (recursive-contract (<=/c 3)))
|
|
(ctest #f contract-stronger? (recursive-contract (<=/c 3)) (recursive-contract (<=/c 2)))
|
|
(let ([f (contract-eval '(λ (x) (recursive-contract (<=/c x))))])
|
|
(test #t (contract-eval 'contract-stronger?) (contract-eval `(,f 1)) (contract-eval `(,f 1))))
|
|
(ctest #t contract-stronger? (-> integer? integer?) (-> integer? integer?))
|
|
(ctest #f contract-stronger? (-> boolean? boolean?) (-> integer? integer?))
|
|
(ctest #t contract-stronger? (-> (>=/c 3) (>=/c 3)) (-> (>=/c 4) (>=/c 3)))
|
|
(ctest #f contract-stronger? (-> (>=/c 4) (>=/c 3)) (-> (>=/c 3) (>=/c 3)))
|
|
(ctest #t contract-stronger? (-> (>=/c 3) (>=/c 3)) (-> (>=/c 3) (>=/c 2)))
|
|
(ctest #f contract-stronger? (-> (>=/c 3) (>=/c 2)) (-> (>=/c 3) (>=/c 3)))
|
|
(ctest #f contract-stronger? (-> (>=/c 2)) (-> (>=/c 3) (>=/c 3)))
|
|
(ctest #f contract-stronger? (-> integer? #:x integer? integer?) (-> integer? #:y integer? integer?))
|
|
(ctest #f contract-stronger? (-> integer? #:y integer? integer?) (-> integer? #:x integer? integer?))
|
|
(ctest #t contract-stronger? (-> integer? #:x integer? integer?) (-> integer? #:x integer? integer?))
|
|
(ctest #t contract-stronger? (-> #:x (>=/c 3) (>=/c 3)) (-> #:x (>=/c 3) (>=/c 2)))
|
|
|
|
(let ([c (contract-eval '(->* () () any))])
|
|
(test #t (contract-eval 'contract-stronger?) c c))
|
|
(let ([c (contract-eval '(->d () () any))])
|
|
(test #t (contract-eval 'contract-stronger?) c c))
|
|
|
|
(ctest #t contract-stronger? (or/c null? any/c) (or/c null? any/c))
|
|
(ctest #f contract-stronger? (or/c null? any/c) (or/c boolean? any/c))
|
|
(ctest #t contract-stronger? (or/c null? boolean?) (or/c null? boolean?))
|
|
(ctest #f contract-stronger? (or/c null? boolean?) (or/c boolean? null?))
|
|
(ctest #t contract-stronger? (or/c null? (-> integer? integer?)) (or/c null? (-> integer? integer?)))
|
|
(ctest #f contract-stronger? (or/c null? (-> boolean? boolean?)) (or/c null? (-> integer? integer?)))
|
|
|
|
(ctest #t contract-stronger? number? number?)
|
|
(ctest #f contract-stronger? boolean? number?)
|
|
|
|
(ctest #t contract-stronger? (parameter/c (between/c 0 5)) (parameter/c (between/c 0 5)))
|
|
(ctest #f contract-stronger? (parameter/c (between/c 0 5)) (parameter/c (between/c 1 4)))
|
|
(ctest #f contract-stronger? (parameter/c (between/c 1 4)) (parameter/c (between/c 0 5)))
|
|
|
|
(ctest #t contract-stronger? (symbols 'x 'y) (symbols 'x 'y 'z))
|
|
(ctest #f contract-stronger? (symbols 'x 'y 'z) (symbols 'x 'y))
|
|
(ctest #t contract-stronger? (symbols 'x 'y) (symbols 'z 'x 'y))
|
|
(ctest #f contract-stronger? (symbols 'z 'x 'y) (symbols 'x 'y))
|
|
(ctest #t contract-stronger? (one-of/c (expt 2 100)) (one-of/c (expt 2 100) 12))
|
|
|
|
(ctest #t contract-stronger?
|
|
(or/c (-> (>=/c 3) (>=/c 3)) (-> string?))
|
|
(or/c (-> (>=/c 4) (>=/c 3)) (-> string?)))
|
|
(ctest #f contract-stronger?
|
|
(or/c (-> string?) (-> integer? integer?))
|
|
(or/c (-> string?) (-> any/c integer?)))
|
|
(ctest #f contract-stronger?
|
|
(or/c (-> string?) (-> any/c integer?))
|
|
(or/c (-> string?) (-> integer? integer?)))
|
|
(ctest #t contract-stronger?
|
|
(or/c (-> string?) (-> integer? integer?) integer? boolean?)
|
|
(or/c (-> string?) (-> integer? integer?) integer? boolean?))
|
|
(ctest #f contract-stronger?
|
|
(or/c (-> string?) (-> integer? integer?) integer? char?)
|
|
(or/c (-> string?) (-> integer? integer?) integer? boolean?))
|
|
(ctest #f contract-stronger?
|
|
(or/c (-> string?) (-> integer? integer?) integer?)
|
|
(or/c (-> string?) (-> integer? integer?) integer? boolean?))
|
|
(ctest #f contract-stronger?
|
|
(or/c (-> string?) (-> integer? integer?) integer?)
|
|
(or/c (-> integer? integer?) integer?))
|
|
|
|
(contract-eval
|
|
`(let ()
|
|
(define (non-zero? x) (not (zero? x)))
|
|
(define list-of-numbers
|
|
(or/c null?
|
|
(couple/c number?
|
|
(recursive-contract list-of-numbers))))
|
|
(define (short-list/less-than n)
|
|
(or/c null?
|
|
(couple/c (<=/c n)
|
|
(or/c null?
|
|
(couple/c (<=/c n)
|
|
any/c)))))
|
|
(define (short-sorted-list/less-than n)
|
|
(or/c null?
|
|
(couple/dc
|
|
[hd (<=/c n)]
|
|
[tl (hd) (or/c null?
|
|
(couple/c (<=/c hd)
|
|
any/c))])))
|
|
|
|
(define (sorted-list/less-than n)
|
|
(or/c null?
|
|
(couple/dc
|
|
[hd (<=/c n)]
|
|
[tl (hd) (sorted-list/less-than hd)])))
|
|
|
|
;; for some reason, the `n' makes it harder to optimize. without it, this test isn't as good a test
|
|
(define (closure-comparison-test n)
|
|
(couple/dc
|
|
[hd any/c]
|
|
[tl (hd) any/c]))
|
|
|
|
(,test #t contract-stronger? (couple/c any/c any/c) (couple/c any/c any/c))
|
|
(,test #f contract-stronger? (couple/c (>=/c 2) (>=/c 3)) (couple/c (>=/c 4) (>=/c 5)))
|
|
(,test #t contract-stronger? (couple/c (>=/c 4) (>=/c 5)) (couple/c (>=/c 2) (>=/c 3)))
|
|
(,test #f contract-stronger? (couple/c (>=/c 1) (>=/c 5)) (couple/c (>=/c 5) (>=/c 1)))
|
|
(let ([ctc (couple/dc [hd any/c] [tl (hd) any/c])])
|
|
(,test #t contract-stronger? ctc ctc))
|
|
(let ([ctc (couple/dc [hd any/c] [tl (hd) (<=/c hd)])])
|
|
(,test #t contract-stronger? ctc ctc))
|
|
(,test #t contract-stronger? list-of-numbers list-of-numbers)
|
|
(,test #t contract-stronger? (short-list/less-than 4) (short-list/less-than 5))
|
|
(,test #f contract-stronger? (short-list/less-than 5) (short-list/less-than 4))
|
|
(,test #t contract-stronger? (short-sorted-list/less-than 4) (short-sorted-list/less-than 5))
|
|
(,test #f contract-stronger? (short-sorted-list/less-than 5) (short-sorted-list/less-than 4))
|
|
(,test #t contract-stronger? (sorted-list/less-than 4) (sorted-list/less-than 5))
|
|
(,test #f contract-stronger? (sorted-list/less-than 5) (sorted-list/less-than 4))
|
|
(,test #t contract-stronger? (closure-comparison-test 4) (closure-comparison-test 5))))
|
|
|
|
|
|
|
|
;
|
|
;
|
|
;
|
|
; ;;; ;; ; ;;;;
|
|
; ;;;; ;; ;; ;;;;
|
|
; ;;;;; ;;; ;;; ;;;;; ;;;;; ;;;; ;;; ;;; ;;;;;;; ;;; ;;; ;;;
|
|
; ;;;; ;;;; ;;;;;;; ;;;;;; ;;;;;; ;;;;;; ;;;;;;; ;;;;;;;; ;;;;; ;;;;;;;
|
|
; ;;;;;; ;;;; ;;;; ;; ;;;; ;;;; ;;;;;;;; ;;;; ;; ;;;;;;;;; ;;;; ;; ;;;; ;;
|
|
; ;;;;;; ;;;; ;;;; ;;;; ;;;; ;;;;;;;;; ;;; ;;;; ;;;; ;;;; ;;;;;;; ;;;;
|
|
; ;;;; ;;;; ;;;; ;;;; ;;;;; ;;;;;;;;;;;;; ;;;; ;;;;;;;;; ;;;;; ;;;;
|
|
; ;;;; ;;;; ;;;; ;;;;;; ;;;;; ;;;;;; ;;;; ;;;;;;;; ;;;;;; ;;;;
|
|
; ;;;; ;;;; ;;;; ;;;;; ;;;; ;;;; ;;;; ;;;;;;; ;;;; ;;;;
|
|
;
|
|
;
|
|
;
|
|
|
|
(ctest #t contract-first-order-passes? (flat-contract integer?) 1)
|
|
(ctest #f contract-first-order-passes? (flat-contract integer?) 'x)
|
|
(ctest #t contract-first-order-passes? (flat-contract boolean?) #t)
|
|
(ctest #f contract-first-order-passes? (flat-contract boolean?) 'x)
|
|
(ctest #t contract-first-order-passes? any/c 1)
|
|
(ctest #t contract-first-order-passes? any/c #t)
|
|
(ctest #t contract-first-order-passes? (-> integer? integer?) (λ (x) #t))
|
|
(ctest #f contract-first-order-passes? (-> integer? integer?) (λ (x y) #t))
|
|
(ctest #f contract-first-order-passes? (-> integer? integer?) 'x)
|
|
(ctest #t contract-first-order-passes? (-> integer? boolean? integer?) (λ (x y) #t))
|
|
(ctest #f contract-first-order-passes? (-> integer? boolean? integer?) (λ (x) #t))
|
|
(ctest #f contract-first-order-passes? (-> integer? boolean? integer?) (λ (x y z) #t))
|
|
(ctest #f contract-first-order-passes? (-> integer? boolean? #:x integer? integer?) (λ (x y) #t))
|
|
(ctest #t contract-first-order-passes? (-> integer? boolean? #:x integer? integer?) (λ (x y #:x z) #t))
|
|
|
|
(ctest #t contract-first-order-passes? (->* (integer?) () #:rest any/c (values char? any/c)) (λ (x . y) #f))
|
|
(ctest #f contract-first-order-passes? (->* (integer?) () #:rest any/c (values char? any/c)) (λ (x y . z) #f))
|
|
(ctest #f contract-first-order-passes? (->* (integer?) () #:rest any/c (values char? any/c)) (λ (x) #f))
|
|
(ctest #t contract-first-order-passes? (->* (integer?) () #:rest any/c (values char? any/c)) (λ x #f))
|
|
|
|
(ctest #t contract-first-order-passes? (listof integer?) (list 1))
|
|
(ctest #f contract-first-order-passes? (listof integer?) #f)
|
|
|
|
(ctest #t contract-first-order-passes? (vector-immutableof integer?) (vector->immutable-vector (vector 1)))
|
|
(ctest #f contract-first-order-passes? (vector-immutableof integer?) 'x)
|
|
(ctest #f contract-first-order-passes? (vector-immutableof integer?) '())
|
|
|
|
(ctest #t contract-first-order-passes? (promise/c integer?) (delay 1))
|
|
(ctest #f contract-first-order-passes? (promise/c integer?) 1)
|
|
|
|
(ctest #t contract-first-order-passes? (and/c (-> positive? positive?) (-> integer? integer?)) (λ (x) x))
|
|
(ctest #t contract-first-order-passes? (and/c (-> positive? positive?) (-> integer? integer?)) values)
|
|
(ctest #f contract-first-order-passes? (and/c (-> integer?) (-> integer? integer?)) (λ (x) x))
|
|
|
|
(ctest #t contract-first-order-passes?
|
|
(cons/c boolean? (-> integer? integer?))
|
|
(list* #t (λ (x) x)))
|
|
(ctest #t contract-first-order-passes?
|
|
(cons/c boolean? (-> integer? integer?))
|
|
(list* 1 2))
|
|
|
|
(ctest #f contract-first-order-passes? (flat-rec-contract the-name) 1)
|
|
|
|
(ctest #t contract-first-order-passes?
|
|
(couple/c any/c any/c)
|
|
(make-couple 1 2))
|
|
|
|
(ctest #f contract-first-order-passes?
|
|
(couple/c any/c any/c)
|
|
2)
|
|
|
|
(ctest #t contract-first-order-passes?
|
|
(couple/dc [hd any/c] [tl any/c])
|
|
(make-couple 1 2))
|
|
|
|
(ctest #f contract-first-order-passes?
|
|
(couple/dc [hd any/c] [tl any/c])
|
|
1)
|
|
|
|
(ctest #t contract-first-order-passes?
|
|
(couple/dc [hd any/c] [tl (hd) any/c])
|
|
(make-couple 1 2))
|
|
|
|
(ctest #f contract-first-order-passes?
|
|
(couple/dc [hd any/c] [tl (hd) any/c])
|
|
1)
|
|
|
|
(ctest #t contract-first-order-passes? (or/c (-> (>=/c 5) (>=/c 5)) boolean?) #t)
|
|
(ctest #t contract-first-order-passes? (or/c (-> (>=/c 5) (>=/c 5)) boolean?) (λ (x) x))
|
|
(ctest #f contract-first-order-passes? (or/c (-> (>=/c 5) (>=/c 5)) boolean?) 'x)
|
|
|
|
(ctest #t contract-first-order-passes?
|
|
(or/c (-> integer? integer? integer?)
|
|
(-> integer? integer?))
|
|
(λ (x) x))
|
|
(ctest #t contract-first-order-passes?
|
|
(or/c (-> integer? integer? integer?)
|
|
(-> integer? integer?))
|
|
(λ (x y) x))
|
|
(ctest #f contract-first-order-passes?
|
|
(or/c (-> integer? integer? integer?)
|
|
(-> integer? integer?))
|
|
(λ () x))
|
|
(ctest #f contract-first-order-passes?
|
|
(or/c (-> integer? integer? integer?)
|
|
(-> integer? integer?))
|
|
1)
|
|
|
|
(test-name '(or/c) (or/c))
|
|
(test-name '(or/c integer? gt0?) (or/c integer? (let ([gt0? (lambda (x) (> x 0))]) gt0?)))
|
|
(test-name '(or/c integer? boolean?)
|
|
(or/c (flat-contract integer?)
|
|
(flat-contract boolean?)))
|
|
(test-name '(or/c (-> (>=/c 5) (>=/c 5)) boolean?)
|
|
(or/c (-> (>=/c 5) (>=/c 5)) boolean?))
|
|
(test-name '(or/c (-> (>=/c 5) (>=/c 5)) boolean?)
|
|
(or/c boolean? (-> (>=/c 5) (>=/c 5))))
|
|
|
|
|
|
(ctest 1
|
|
length
|
|
(let ([f (contract (-> integer? any)
|
|
(lambda (x)
|
|
(with-continuation-mark 'x 'x
|
|
(continuation-mark-set->list (current-continuation-marks) 'x)))
|
|
'pos
|
|
'neg)])
|
|
(with-continuation-mark 'x 'x
|
|
(f 1))))
|
|
|
|
(ctest 2
|
|
length
|
|
(let ([f (contract (-> integer? list?)
|
|
(lambda (x)
|
|
(with-continuation-mark 'x 'x
|
|
(continuation-mark-set->list (current-continuation-marks) 'x)))
|
|
'pos
|
|
'neg)])
|
|
(with-continuation-mark 'x 'x
|
|
(f 1))))
|
|
|
|
;
|
|
;
|
|
;
|
|
; ;; ;;;; ;;
|
|
; ;; ;;;; ;;
|
|
; ;;;;;;; ;;; ;;; ;;;; ;;; ;;; ;;;;;;; ;;; ;;
|
|
; ;;;;;;;; ;;;;;;; ;;;;;; ;;; ;;; ;;;; ;;;;;;;; ;;;;; ;;
|
|
; ;;;;;;;;; ;;;; ;; ;;;;;;;; ;;;;;; ;;;; ;;;;;;;;; ;;;; ;; ;;
|
|
; ;;;; ;;;; ;;;; ;;;; ;;; ;;;;;; ;;;; ;;;; ;;;; ;;;;;;; ;;
|
|
; ;;;;;;;;; ;;;; ;;;;;;;; ;;;;;; ;;;; ;;;;;;;;; ;;;;; ;;
|
|
; ;;;;;;;; ;;;; ;;;;;; ;;;; ;;;; ;;;;;;;; ;;;;;; ;;
|
|
; ;;;;;;; ;;;; ;;;; ;;;; ;;;; ;;;;;;; ;;;; ;;
|
|
; ;;;; ;;
|
|
; ;;;;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
; ; ;
|
|
; ;; ;;
|
|
; ;;;;; ;;;; ;;;; ;;; ;;;;; ;;; ;;; ;;;;;;; ;;;;; ;;;;;
|
|
; ;;;;;; ;;;;;; ;;;;;;;;; ;;;;;; ;;;;;;; ;;;;;;;; ;;;;;; ;;;;;;
|
|
; ;;;;;;; ;;;;;;;; ;;;; ;;;; ;;;; ;;;; ;; ;;;; ;;;;;;; ;;;;
|
|
; ;;;; ;;;; ;;; ;;;; ;;;; ;;;; ;;;; ;;;;;;; ;;;; ;;;;
|
|
; ;;;;;;; ;;;;;;;; ;;;; ;;;; ;;;;; ;;;; ;; ;;;; ;;;;;;; ;;;;;
|
|
; ;;;;;; ;;;;;; ;;;; ;;;; ;;;;; ;;;; ;;;;;;;; ;;;;;; ;;;;;
|
|
; ;;;;; ;;;; ;;;; ;;;; ;;;; ;;;; ;; ;;;; ;;;;; ;;;;
|
|
;
|
|
;
|
|
;
|
|
|
|
;;
|
|
;; (at the end, becuase they are slow w/out .zo files)
|
|
;;
|
|
|
|
(test/spec-passed
|
|
'provide/contract1
|
|
'(let ()
|
|
(eval '(module contract-test-suite1 scheme/base
|
|
(require scheme/contract)
|
|
(define x 1)
|
|
(provide/contract (x integer?))))
|
|
(eval '(require 'contract-test-suite1))
|
|
(eval 'x)))
|
|
|
|
(test/spec-passed
|
|
'provide/contract2
|
|
'(let ()
|
|
(eval '(module contract-test-suite2 scheme/base
|
|
(require scheme/contract)
|
|
(provide/contract)))
|
|
(eval '(require 'contract-test-suite2))))
|
|
|
|
(test/spec-failed
|
|
'provide/contract3
|
|
'(let ()
|
|
(eval '(module contract-test-suite3 scheme/base
|
|
(require scheme/contract)
|
|
(define x #f)
|
|
(provide/contract (x integer?))))
|
|
(eval '(require 'contract-test-suite3))
|
|
(eval 'x))
|
|
"'contract-test-suite3")
|
|
|
|
(test/spec-passed
|
|
'provide/contract4
|
|
'(begin
|
|
(eval '(module contract-test-suite4 scheme/base
|
|
(require scheme/contract)
|
|
(define-struct s (a) #:mutable)
|
|
(provide/contract (struct s ((a any/c))))))
|
|
(eval '(require 'contract-test-suite4))
|
|
(eval '(list (make-s 1)
|
|
(s-a (make-s 1))
|
|
(s? (make-s 1))
|
|
(set-s-a! (make-s 1) 2)))))
|
|
|
|
(test/spec-passed
|
|
'provide/contract4-b
|
|
'(begin
|
|
(eval '(module contract-test-suite4-b scheme/base
|
|
(require scheme/contract)
|
|
(define-struct s (a))
|
|
(provide/contract (struct s ((a any/c))))))
|
|
(eval '(require 'contract-test-suite4-b))
|
|
(eval '(list (make-s 1)
|
|
(s-a (make-s 1))
|
|
(s? (make-s 1))))))
|
|
|
|
(test/spec-passed/result
|
|
'provide/contract4-c
|
|
'(begin
|
|
(eval '(module contract-test-suite4-c scheme/base
|
|
(require scheme/contract)
|
|
(define-struct s (a b) #:mutable)
|
|
(provide/contract (struct s ((a any/c) (b any/c))))))
|
|
(eval '(require 'contract-test-suite4-c))
|
|
(eval '(let ([an-s (make-s 1 2)])
|
|
(list (s-a an-s)
|
|
(s-b an-s)
|
|
(begin (set-s-a! an-s 3)
|
|
(s-a an-s))
|
|
(begin (set-s-b! an-s 4)
|
|
(s-b an-s))))))
|
|
|
|
(list 1 2 3 4))
|
|
|
|
(test/spec-passed
|
|
'provide/contract5
|
|
'(begin
|
|
(eval '(module contract-test-suite5 scheme/base
|
|
(require scheme/contract)
|
|
(define-struct s (a))
|
|
(define-struct t (a))
|
|
(provide/contract (struct s ((a any/c)))
|
|
(struct t ((a any/c))))))
|
|
(eval '(require 'contract-test-suite5))
|
|
(eval '(list (make-s 1)
|
|
(s-a (make-s 1))
|
|
(s? (make-s 1))
|
|
(make-t 1)
|
|
(t-a (make-t 1))
|
|
(t? (make-t 1))))))
|
|
|
|
(test/spec-passed
|
|
'provide/contract6
|
|
'(begin
|
|
(eval '(module contract-test-suite6 scheme/base
|
|
(require scheme/contract)
|
|
(define-struct s (a))
|
|
(provide/contract (struct s ((a any/c))))))
|
|
(eval '(require 'contract-test-suite6))
|
|
(eval '(define-struct (t s) ()))))
|
|
|
|
(test/spec-passed
|
|
'provide/contract6b
|
|
'(begin
|
|
(eval '(module contract-test-suite6b scheme/base
|
|
(require scheme/contract)
|
|
(define-struct s_ (a))
|
|
(provide/contract (struct s_ ((a any/c))))))
|
|
(eval '(require 'contract-test-suite6b))
|
|
(eval '(module contract-test-suite6b2 scheme/base
|
|
(require 'contract-test-suite6b)
|
|
(require scheme/contract)
|
|
(define-struct (t_ s_) (b))
|
|
(provide s_-a)
|
|
(provide/contract (struct (t_ s_) ((a any/c) (b any/c))))))
|
|
(eval '(require 'contract-test-suite6b2))
|
|
(eval '(define-struct (u_ t_) ()))
|
|
(eval '(s_-a (make-u_ 1 2)))))
|
|
|
|
(test/spec-passed
|
|
'provide/contract7
|
|
'(begin
|
|
(eval '(module contract-test-suite7 scheme/base
|
|
(require scheme/contract)
|
|
(define-struct s (a b))
|
|
(define-struct (t s) (c d))
|
|
(provide/contract
|
|
(struct s ((a any/c) (b any/c)))
|
|
(struct (t s) ((a any/c) (b any/c) (c any/c) (d any/c))))))
|
|
(eval '(require 'contract-test-suite7))
|
|
(eval '(let ([x (make-t 1 2 3 4)])
|
|
(s-a x)
|
|
(s-b x)
|
|
(t-c x)
|
|
(t-d x)
|
|
(void)))))
|
|
|
|
(test/spec-passed
|
|
'provide/contract8
|
|
'(begin
|
|
(eval '(module contract-test-suite8 scheme/base
|
|
(require scheme/contract)
|
|
(define-struct i-s (contents))
|
|
(define (w-f-s? x) #t)
|
|
(provide/contract
|
|
(struct i-s ((contents (flat-named-contract "integer-set-list" w-f-s?)))))))
|
|
(eval '(require 'contract-test-suite8))
|
|
(eval '(i-s-contents (make-i-s 1)))))
|
|
|
|
(test/spec-passed
|
|
'provide/contract9
|
|
'(begin
|
|
(eval '(module contract-test-suite9 scheme/base
|
|
(require scheme/contract)
|
|
(define the-internal-name 1)
|
|
(provide/contract (rename the-internal-name the-external-name integer?))
|
|
(+ the-internal-name 1)))
|
|
(eval '(require 'contract-test-suite9))
|
|
(eval '(+ the-external-name 1))))
|
|
|
|
(test/spec-passed
|
|
'provide/contract10
|
|
'(begin
|
|
(eval '(module pc10-m scheme/base
|
|
(require scheme/contract)
|
|
(define-struct s (a b) #:inspector (make-inspector))
|
|
(provide/contract (struct s ((a number?) (b number?))))))
|
|
(eval '(module pc10-n scheme/base
|
|
(require mzlib/struct
|
|
'pc10-m)
|
|
(print-struct #t)
|
|
(copy-struct s
|
|
(make-s 1 2)
|
|
[s-a 3])))
|
|
(eval '(require 'pc10-n))))
|
|
|
|
(test/spec-passed
|
|
'provide/contract11
|
|
'(begin
|
|
(eval '(module pc11-m scheme/base
|
|
(require scheme/contract)
|
|
(define x 1)
|
|
(provide/contract [rename x y integer?]
|
|
[rename x z integer?])))
|
|
(eval '(module pc11-n scheme/base
|
|
(require 'pc11-m)
|
|
(+ y z)))
|
|
(eval '(require 'pc11-n))))
|
|
|
|
;; this test is broken, not sure why
|
|
#|
|
|
(test/spec-failed
|
|
'provide/contract11b
|
|
'(parameterize ([current-namespace (make-namespace)])
|
|
(eval '(module pc11b-m scheme/base
|
|
(require scheme/contract)
|
|
(define-struct s (a b) #:inspector (make-inspector))
|
|
(provide/contract (struct s ((a number?) (b number?))))))
|
|
(eval '(module pc11b-n scheme/base
|
|
(require mzlib/struct
|
|
m)
|
|
(print-struct #t)
|
|
(copy-struct s
|
|
(make-s 1 2)
|
|
[s-a #f])))
|
|
(eval '(require 'pc11b-n)))
|
|
'n)
|
|
|#
|
|
|
|
(test/spec-passed
|
|
'provide/contract12
|
|
'(begin
|
|
(eval '(module pc12-m scheme/base
|
|
(require scheme/contract)
|
|
(define-struct (exn2 exn) ())
|
|
(provide/contract (struct (exn2 exn) ((message any/c) (continuation-marks any/c))))))
|
|
(eval '(require 'pc12-m))))
|
|
|
|
(test/spec-passed/result
|
|
'provide/contract13
|
|
'(begin
|
|
(eval '(module pc13-common-msg-structs scheme/base
|
|
(require scheme/contract)
|
|
(define-struct register (name type) #:inspector (make-inspector))
|
|
(provide/contract (struct register ([name any/c] [type any/c])))))
|
|
|
|
(eval '(require 'pc13-common-msg-structs))
|
|
(eval '(require (lib "plt-match.ss")))
|
|
(eval '(match (make-register 1 2)
|
|
[(struct register (name type))
|
|
(list name type)])))
|
|
(list 1 2))
|
|
|
|
(test/spec-passed
|
|
'provide/contract14
|
|
'(begin
|
|
(eval '(module pc14-test1 scheme/base
|
|
(require scheme/contract)
|
|
|
|
(define-struct type (flags))
|
|
(define-struct (type:ptr type) (type))
|
|
|
|
(provide/contract
|
|
(struct type
|
|
([flags (listof string?)]))
|
|
|
|
(struct (type:ptr type)
|
|
([flags (listof string?)] [type type?])))))
|
|
|
|
(eval '(module pc14-test2 scheme/base
|
|
(require mzlib/plt-match)
|
|
(require 'pc14-test1)
|
|
(match (make-type:ptr '() (make-type '()))
|
|
[(struct type:ptr (flags type)) #f])))
|
|
(eval '(require 'pc14-test2))))
|
|
|
|
;; make sure unbound identifier exception is raised.
|
|
(contract-error-test
|
|
#'(begin
|
|
(eval '(module pos scheme/base
|
|
(require scheme/contract)
|
|
(provide/contract [i any/c]))))
|
|
exn:fail:syntax?)
|
|
|
|
;; provide/contract should signal errors without requiring a reference to the variable
|
|
;; this test is bogus, because provide/contract'd variables can be set!'d.
|
|
(test/spec-failed
|
|
'provide/contract15
|
|
'(begin
|
|
(eval '(module pos scheme/base
|
|
(require scheme/contract)
|
|
(define i #f)
|
|
(provide/contract [i integer?])))
|
|
(eval '(require 'pos)))
|
|
"'pos")
|
|
|
|
;; this is really a positive violation, but name the module `neg' just for an addl test
|
|
(test/spec-failed
|
|
'provide/contract16
|
|
'(begin
|
|
(eval '(module neg scheme/base
|
|
(require scheme/contract)
|
|
(define i #f)
|
|
(provide/contract [i integer?])))
|
|
(eval '(require 'neg)))
|
|
"'neg")
|
|
|
|
;; this test doesn't pass yet ... waiting for support from define-struct
|
|
|
|
#;
|
|
(test/neg-blame
|
|
'provide/contract17
|
|
'(begin
|
|
(eval '(module pos scheme/base
|
|
(require scheme/contract)
|
|
(define-struct s (a))
|
|
(provide/contract [struct s ((a integer?))])))
|
|
(eval '(module neg scheme/base
|
|
(require 'pos)
|
|
(define-struct (t s) ())
|
|
(make-t #f)))
|
|
(eval '(require 'neg))))
|
|
|
|
(test/spec-passed
|
|
'provide/contract18
|
|
'(begin
|
|
(eval '(module pc18-pos scheme/base
|
|
(require scheme/contract)
|
|
(define-struct s ())
|
|
(provide/contract [struct s ()])))
|
|
(eval '(require 'pc18-pos))
|
|
(eval '(make-s))))
|
|
|
|
(test/spec-passed/result
|
|
'provide/contract19
|
|
'(begin
|
|
(eval '(module pc19-a scheme/base
|
|
(require scheme/contract)
|
|
(define-struct a (x))
|
|
(provide/contract [struct a ([x number?])])))
|
|
|
|
(eval '(module pc19-b scheme/base
|
|
(require 'pc19-a
|
|
scheme/contract)
|
|
(define-struct (b a) (y))
|
|
(provide/contract [struct (b a) ([x number?] [y number?])])))
|
|
|
|
(eval '(module pc19-c scheme/base
|
|
(require 'pc19-b
|
|
scheme/contract)
|
|
|
|
(define-struct (c b) (z))
|
|
(provide/contract [struct (c b) ([x number?] [y number?] [z number?])])))
|
|
|
|
(eval' (module pc19-d scheme/base
|
|
(require 'pc19-a 'pc19-c)
|
|
(define pc19-ans (a-x (make-c 1 2 3)))
|
|
(provide pc19-ans)))
|
|
|
|
(eval '(require 'pc19-d))
|
|
(eval 'pc19-ans))
|
|
1)
|
|
|
|
;; test that unit & contract don't collide over the name `struct'
|
|
(test/spec-passed
|
|
'provide/contract20
|
|
'(eval '(module tmp scheme/base
|
|
(require scheme/contract
|
|
mzlib/unit)
|
|
|
|
(define-struct s (a b))
|
|
|
|
(provide/contract
|
|
[struct s ([a number?]
|
|
[b symbol?])]))))
|
|
|
|
(test/spec-passed
|
|
'provide/contract21
|
|
'(begin
|
|
(eval '(module provide/contract21a scheme/base
|
|
(require scheme/contract)
|
|
(provide/contract [f integer?])
|
|
(define f 1)))
|
|
(eval '(module provide/contract21b scheme/base
|
|
(require (for-syntax 'provide/contract21a)
|
|
(for-syntax scheme/base))
|
|
(define-syntax (unit-body stx)
|
|
f f
|
|
#'1)))))
|
|
|
|
(test/spec-passed
|
|
'provide/contract22
|
|
'(begin
|
|
(eval '(module provide/contract22a scheme/base
|
|
(require scheme/contract)
|
|
(provide/contract [make-bound-identifier-mapping integer?])
|
|
(define make-bound-identifier-mapping 1)))
|
|
(eval '(module provide/contract22b scheme/base
|
|
(require (for-syntax 'provide/contract22a)
|
|
(for-syntax scheme/base))
|
|
|
|
(define-syntax (unit-body stx)
|
|
make-bound-identifier-mapping)
|
|
|
|
(define-syntax (f stx)
|
|
make-bound-identifier-mapping)))))
|
|
|
|
(test/spec-passed
|
|
'provide/contract23
|
|
'(begin
|
|
(eval '(module provide/contract23a scheme/base
|
|
(require scheme/contract)
|
|
(provide/contract [f integer?])
|
|
(define f 3)))
|
|
|
|
(eval '(module provide/contract23b scheme/base
|
|
(require 'provide/contract23a)
|
|
(#%expression f)
|
|
f))
|
|
|
|
(eval '(require 'provide/contract23b))))
|
|
|
|
#|
|
|
(test/spec-passed
|
|
'provide/contract24
|
|
'(begin
|
|
(eval '(module provide/contract24 scheme/base
|
|
(require (prefix-in c: scheme/contract))
|
|
(c:case-> (c:-> integer? integer?)
|
|
(c:-> integer? integer? integer?))))))
|
|
|#
|
|
|
|
;; tests that contracts pick up the #%app from the context
|
|
;; instead of always using the scheme/base #%app.
|
|
(test/spec-passed
|
|
'provide/contract25
|
|
'(begin
|
|
(eval '(module provide/contract25a scheme/base
|
|
(require scheme/contract)
|
|
(provide/contract [seventeen integer?])
|
|
(define seventeen 17)))
|
|
(eval '(module provide/contract25b scheme/base
|
|
(require 'provide/contract25a)
|
|
(let-syntax ([#%app (syntax-rules ()
|
|
[(#%app e ...) (list e ...)])])
|
|
(seventeen 18))))
|
|
(eval '(require 'provide/contract25b))))
|
|
|
|
(test/spec-passed/result
|
|
'provide/contract26
|
|
'(begin
|
|
(eval '(module provide/contract26 scheme/base
|
|
(require scheme/contract)
|
|
(define-struct pc26-s (a))
|
|
(provide/contract (struct pc26-s ((a integer?))))))
|
|
(eval '(require 'provide/contract26))
|
|
(eval '(pc26-s-a (make-pc26-s 1))))
|
|
1)
|
|
|
|
(test/spec-passed/result
|
|
'provide/contract27
|
|
'(begin
|
|
(eval '(module provide/contract27a scheme/base
|
|
(require scheme/contract)
|
|
(define-struct person (name) #:transparent)
|
|
(provide/contract (struct person ([name string?])))))
|
|
(eval '(module provide/contract27b scheme/base
|
|
(require 'provide/contract27a)
|
|
(provide (struct-out person))))
|
|
(eval '(module provide/contract27c scheme/base
|
|
(require 'provide/contract27b)
|
|
(define provide/contract27ans (person-name (make-person "me")))
|
|
(provide provide/contract27ans)))
|
|
(eval '(require 'provide/contract27c))
|
|
(eval 'provide/contract27ans))
|
|
"me")
|
|
|
|
#;
|
|
(test/spec-passed/result
|
|
'provide/contract28
|
|
'(begin
|
|
(eval '(module provide/contract28-m1 scheme/base
|
|
(require scheme/contract)
|
|
(define-struct repair () #:transparent)
|
|
(provide/contract [struct repair ()])))
|
|
(eval '(module provide/contract28-m2 scheme/base
|
|
(require 'provide/contract28-m1 scheme/contract)
|
|
(provide/contract [struct repair ()])))
|
|
(eval '(module provide/contract28-m3 scheme/base
|
|
(require 'provide/contract28-m2)
|
|
(provide provide/contract28-res)
|
|
(define provide/contract28-res (repair? (make-repair)))))
|
|
(eval '(require 'provide/contract28-m3))
|
|
(eval 'provide/contract28-res))
|
|
#t)
|
|
|
|
#;
|
|
(test/spec-passed/result
|
|
'provide/contract29
|
|
'(begin
|
|
(eval '(module provide/contract29-m1 scheme/base
|
|
(require scheme/contract)
|
|
(define-struct q (a b))
|
|
(define-struct (repair q) (c d) #:transparent)
|
|
(provide/contract [struct repair ([a integer?] [b integer?] [c integer?] [d integer?])])))
|
|
(eval '(module provide/contract29-m2 scheme/base
|
|
(require 'provide/contract29-m1 scheme/contract)
|
|
(provide/contract [struct repair ([a integer?] [b integer?] [c integer?] [d integer?])])))
|
|
(eval '(module provide/contract29-m3 scheme/base
|
|
(require 'provide/contract29-m2)
|
|
(provide provide/contract29-res)
|
|
(define provide/contract29-res (list (repair? (make-repair 1 2 3 4))
|
|
(repair-c (make-repair 1 2 3 4))))))
|
|
(eval '(require 'provide/contract29-m3))
|
|
(eval 'provide/contract29-res))
|
|
(list #t 3))
|
|
|
|
(contract-error-test
|
|
#'(begin
|
|
(eval '(module pce1-bug scheme/base
|
|
(require scheme/contract)
|
|
(define the-defined-variable1 'five)
|
|
(provide/contract [the-defined-variable1 number?])))
|
|
(eval '(require 'pce1-bug)))
|
|
(λ (x)
|
|
(and (exn? x)
|
|
(regexp-match #rx"on the-defined-variable1" (exn-message x)))))
|
|
|
|
(contract-error-test
|
|
#'(begin
|
|
(eval '(module pce2-bug scheme/base
|
|
(require scheme/contract)
|
|
(define the-defined-variable2 values)
|
|
(provide/contract [the-defined-variable2 (-> number? any)])))
|
|
(eval '(require 'pce2-bug))
|
|
(eval '(the-defined-variable2 #f)))
|
|
(λ (x)
|
|
(and (exn? x)
|
|
(regexp-match #rx"on the-defined-variable2" (exn-message x)))))
|
|
|
|
(contract-error-test
|
|
#'(begin
|
|
(eval '(module pce3-bug scheme/base
|
|
(require scheme/contract)
|
|
(define the-defined-variable3 (λ (x) #f))
|
|
(provide/contract [the-defined-variable3 (-> any/c number?)])))
|
|
(eval '(require 'pce3-bug))
|
|
(eval '(the-defined-variable3 #f)))
|
|
(λ (x)
|
|
(and (exn? x)
|
|
(regexp-match #rx"on the-defined-variable3" (exn-message x)))))
|
|
|
|
(contract-error-test
|
|
#'(begin
|
|
(eval '(module pce4-bug scheme/base
|
|
(require scheme/contract)
|
|
(define the-defined-variable4 (λ (x) #f))
|
|
(provide/contract [the-defined-variable4 (-> any/c number?)])))
|
|
(eval '(require 'pce4-bug))
|
|
(eval '((if #t the-defined-variable4 the-defined-variable4) #f)))
|
|
(λ (x)
|
|
(and (exn? x)
|
|
(regexp-match #rx"on the-defined-variable4" (exn-message x)))))
|
|
|
|
(contract-error-test
|
|
#'(begin
|
|
(eval '(module pce5-bug scheme/base
|
|
(require scheme/contract)
|
|
|
|
(define-struct bad (a b))
|
|
|
|
(provide/contract
|
|
[struct bad ((string? a) (string? b))])))
|
|
(eval '(require 'pce5-bug)))
|
|
(λ (x)
|
|
(and (exn? x)
|
|
(regexp-match #rx"expected field name to be b, but found string?" (exn-message x)))))
|
|
|
|
(contract-error-test
|
|
#'(begin
|
|
(eval '(module pce6-bug scheme/base
|
|
(require scheme/contract)
|
|
|
|
(define-struct bad-parent (a))
|
|
(define-struct (bad bad-parent) (b))
|
|
|
|
(provide/contract
|
|
[struct bad ((a string?) (string? b))])))
|
|
(eval '(require 'pce6-bug)))
|
|
(λ (x)
|
|
(and (exn? x)
|
|
(regexp-match #rx"expected field name to be b, but found string?" (exn-message x)))))
|
|
|
|
(contract-eval `(,test 'pos guilty-party (with-handlers ((void values)) (contract not #t 'pos 'neg))))
|
|
|
|
(report-errs)
|
|
|
|
))
|