compatibility/collects/tests/mzscheme/contracts.ss
Robby Findler 2d0af177ea ..
original commit: 938dae0cd7988d2daaebeca402ec7e8e2feb5fb1
2002-09-03 17:19:51 +00:00

462 lines
12 KiB
Scheme

(load-relative "loadtest.ss")
(require (lib "specs.ss" "framework")
(lib "class.ss"))
(SECTION 'contracts)
(let ()
;; test/spec-passed : symbol sexp -> void
;; tests a passing specification
(define (test/spec-passed name expression)
(test 'passed
eval
`(let () ,expression 'passed)))
;; test/spec-failed : symbol sexp string -> void
;; tests a failing specification with blame assigned to `blame'
(define (test/spec-failed name expression blame)
(define (failed-contract x)
(and (string? x)
(let ([m (regexp-match ": ([^ ]*) broke" x)])
(and m (cadr m)))))
(test blame
failed-contract
(eval
`(with-handlers ([(lambda (x) (and (not-break-exn? x) (exn? x)))
exn-message])
,expression
'failed/expected-exn-got-normal-termination))))
(test/spec-passed
'contract-flat1
'(contract not #f 'pos 'neg))
(test/spec-failed
'contract-flat2
'(contract not #t 'pos 'neg)
"pos")
(test/spec-passed
'contract-arrow-star0a
'(contract (->* (integer?) (integer?))
(lambda (x) x)
'pos
'neg))
(test/spec-failed
'contract-arrow-star0b
'((contract (->* (integer?) (integer?))
(lambda (x) x)
'pos
'neg)
#f)
"neg")
(test/spec-failed
'contract-arrow-star0c
'((contract (->* (integer?) (integer?))
(lambda (x) #f)
'pos
'neg)
1)
"pos")
(test/spec-passed
'contract-arrow-star1
'(let-values ([(a b) ((contract (->* (integer?) (integer? integer?))
(lambda (x) (values x x))
'pos
'neg)
2)])
1))
(test/spec-failed
'contract-arrow-star2
'((contract (->* (integer?) (integer? integer?))
(lambda (x) (values x x))
'pos
'neg)
#f)
"neg")
(test/spec-failed
'contract-arrow-star3
'((contract (->* (integer?) (integer? integer?))
(lambda (x) (values 1 #t))
'pos
'neg)
1)
"pos")
(test/spec-failed
'contract-arrow-star4
'((contract (->* (integer?) (integer? integer?))
(lambda (x) (values #t 1))
'pos
'neg)
1)
"pos")
(test/spec-passed
'contract-arrow-star5
'(let-values ([(a b) ((contract (->* (integer?)
(listof integer?)
(integer? integer?))
(lambda (x) (values x x))
'pos
'neg)
2)])
1))
(test/spec-failed
'contract-arrow-star6
'((contract (->* (integer?) (listof integer?) (integer? integer?))
(lambda (x) (values x x))
'pos
'neg)
#f)
"neg")
(test/spec-failed
'contract-arrow-star7
'((contract (->* (integer?) (listof integer?) (integer? integer?))
(lambda (x) (values 1 #t))
'pos
'neg)
1)
"pos")
(test/spec-failed
'contract-arrow-star8
'((contract (->* (integer?) (listof integer?) (integer? integer?))
(lambda (x) (values #t 1))
'pos
'neg)
1)
"pos")
(test/spec-passed
'contract-arrow-star9
'((contract (->* (integer?) (listof integer?) (integer?))
(lambda (x . y) 1)
'pos
'neg)
1 2))
(test/spec-failed
'contract-arrow-star10
'((contract (->* (integer?) (listof integer?) (integer?))
(lambda (x . y) 1)
'pos
'neg)
1 2 'bad)
"neg")
(test/spec-failed
'contract-d1
'(contract (integer? . ->d . (lambda (x) (lambda (y) (= x y))))
1
'pos
'neg)
"pos")
(test/spec-passed
'contract-d2
'(contract (integer? . ->d . (lambda (x) (lambda (y) (= x y))))
(lambda (x) x)
'pos
'neg))
(test/spec-failed
'contract-d2
'((contract (integer? . ->d . (lambda (x) (lambda (y) (= x y))))
(lambda (x) (+ x 1))
'pos
'neg)
2)
"pos")
(test/spec-passed
'contract-arrow1
'(contract (integer? . -> . integer?) (lambda (x) x) 'pos 'neg))
(test/spec-failed
'contract-arrow2
'(contract (integer? . -> . integer?) (lambda (x y) x) 'pos 'neg)
"pos")
(test/spec-failed
'contract-arrow3
'((contract (integer? . -> . integer?) (lambda (x) #f) 'pos 'neg) #t)
"neg")
(test/spec-failed
'contract-arrow4
'((contract (integer? . -> . integer?) (lambda (x) #f) 'pos 'neg) 1)
"pos")
(test/spec-passed
'contract-arrow-any1
'(contract (integer? . -> . any) (lambda (x) x) 'pos 'neg))
(test/spec-failed
'contract-arrow-any2
'(contract (integer? . -> . any) (lambda (x y) x) 'pos 'neg)
"pos")
(test/spec-failed
'contract-arrow-any3
'((contract (integer? . -> . any) (lambda (x) #f) 'pos 'neg) #t)
"neg")
(test/spec-passed
'contract-arrow-star-d1
'((contract (->d* (integer?) (lambda (arg) (lambda (res) (= arg res))))
(lambda (x) x)
'pos
'neg)
1))
(test/spec-passed
'contract-arrow-star-d2
'(let-values ([(a b)
((contract (->d* (integer?) (lambda (arg)
(values (lambda (res) (= arg res))
(lambda (res) (= arg res)))))
(lambda (x) (values x x))
'pos
'neg)
1)])
1))
(test/spec-failed
'contract-arrow-star-d3
'((contract (->d* (integer?) (lambda (arg)
(values (lambda (res) (= arg res))
(lambda (res) (= arg res)))))
(lambda (x) (values 1 2))
'pos
'neg)
2)
"pos")
(test/spec-failed
'contract-arrow-star-d4
'((contract (->d* (integer?) (lambda (arg)
(values (lambda (res) (= arg res))
(lambda (res) (= arg res)))))
(lambda (x) (values 2 1))
'pos
'neg)
2)
"pos")
(test/spec-passed
'contract-arrow-star-d5
'((contract (->d* ()
(listof integer?)
(lambda (arg) (lambda (res) (= arg res))))
(lambda (x) x)
'pos
'neg)
1))
(test/spec-passed
'contract-arrow-star-d6
'((contract (->d* ()
(listof integer?)
(lambda (arg)
(values (lambda (res) (= arg res))
(lambda (res) (= arg res)))))
(lambda (x) (values x x))
'pos
'neg)
1))
(test/spec-failed
'contract-arrow-star-d7
'((contract (->d* ()
(listof integer?)
(lambda (arg)
(values (lambda (res) (= arg res))
(lambda (res) (= arg res)))))
(lambda (x) (values 1 2))
'pos
'neg)
2)
"pos")
(test/spec-failed
'contract-arrow-star-d8
'((contract (->d* ()
(listof integer?)
(lambda (arg)
(values (lambda (res) (= arg res))
(lambda (res) (= arg res)))))
(lambda (x) (values 2 1))
'pos
'neg)
2)
"pos")
(test/spec-failed
'contract-case->1
'(contract (case-> (integer? integer? . -> . integer?) (integer? . -> . integer?))
(lambda (x) x)
'pos
'neg)
"pos")
(test/spec-failed
'contract-case->2
'((contract (case-> (integer? integer? . -> . integer?) (integer? . -> . integer?))
(case-lambda
[(x y) 'case1]
[(x) 'case2])
'pos
'neg)
1 2)
"pos")
(test/spec-failed
'contract-case->3
'((contract (case-> (integer? integer? . -> . integer?) (integer? . -> . integer?))
(case-lambda
[(x y) 'case1]
[(x) 'case2])
'pos
'neg)
1)
"pos")
(test/spec-failed
'contract-case->4
'((contract (case-> (integer? integer? . -> . integer?) (integer? . -> . integer?))
(case-lambda
[(x y) 'case1]
[(x) 'case2])
'pos
'neg)
'a 2)
"neg")
(test/spec-failed
'contract-case->5
'((contract (case-> (integer? integer? . -> . integer?) (integer? . -> . integer?))
(case-lambda
[(x y) 'case1]
[(x) 'case2])
'pos
'neg)
2 'a)
"neg")
(test/spec-failed
'contract-case->6
'((contract (case-> (integer? integer? . -> . integer?) (integer? . -> . integer?))
(case-lambda
[(x y) 'case1]
[(x) 'case2])
'pos
'neg)
#t)
"neg")
(test/spec-failed
'contract-d-protect-shared-state
'(let ([x 1])
((contract ((->d (lambda () (let ([pre-x x]) (lambda (res) (= x pre-x)))))
. -> .
(lambda (x) #t))
(lambda (thnk) (thnk))
'pos
'neg)
(lambda () (set! x 2))))
"neg")
(test/spec-failed
'combo1
'(let ([cf (contract (case->
((class? . ->d . (lambda (%) (lambda (x) #f))) . -> . void?)
((class? . ->d . (lambda (%) (lambda (x) #f))) boolean? . -> . void?))
(letrec ([c% (class object% (super-instantiate ()))]
[f
(case-lambda
[(class-maker) (f class-maker #t)]
[(class-maker b)
(class-maker c%)
(void)])])
f)
'pos
'neg)])
(cf (lambda (x%) 'going-to-be-bad)))
"neg")
(test/spec-failed
'union1
'(contract (union false?) #t 'pos 'neg)
"pos")
(test/spec-passed
'union2
'(contract (union false?) #f 'pos 'neg))
(test/spec-passed
'union3
'((contract (union (-> integer? integer?)) (lambda (x) x) 'pos 'neg) 1))
(test/spec-failed
'union4
'((contract (union (-> integer? integer?)) (lambda (x) x) 'pos 'neg) #f)
"neg")
(test/spec-failed
'union5
'((contract (union (-> integer? integer?)) (lambda (x) #f) 'pos 'neg) 1)
"pos")
(test/spec-passed
'union6
'(contract (union false? (-> integer? integer?)) #f 'pos 'neg))
(test/spec-passed
'union7
'((contract (union false? (-> integer? integer?)) (lambda (x) x) 'pos 'neg) 1))
(test/spec-passed
'define/contract1
'(let ()
(define/contract i integer? 1)
i))
(test/spec-failed
'define/contract2
'(let ()
(define/contract i integer? #t)
i)
"i")
(test/spec-failed
'define/contract3
'(let ()
(define/contract i (-> integer? integer?) (lambda (x) #t))
(i 1))
"i")
(test/spec-failed
'define/contract4
'(let ()
(define/contract i (-> integer? integer?) (lambda (x) 1))
(i #f))
"<<unknown>>")
(test/spec-failed
'define/contract5
'(let ()
(define/contract i (-> integer? integer?) (lambda (x) (i #t)))
(i 1))
"<<unknown>>"))
(report-errs)