462 lines
12 KiB
Scheme
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) |