PageRenderTime 57ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 1ms

/collects/tests/racket/contract-mzlib-test.rktl

http://github.com/gmarceau/PLT
Racket | 5143 lines | 23 code | 4 blank | 5116 comment | 1 complexity | b8b4a756178be458bb715034b688ede6 MD5 | raw file
Possible License(s): BSD-3-Clause, LGPL-2.1

Large files files are truncated, but you can click here to view the full file

  1. #|
  2. This file started out as a copy of contract-test.rktl.
  3. Its purpose is to try to ensure that the mzlib version
  4. of the contract library does not change over time.
  5. |#
  6. (load-relative "loadtest.rktl")
  7. (Section 'mzlib/contract)
  8. (parameterize ([error-print-width 200])
  9. (let ()
  10. (define contract-namespace
  11. (let ([n ((dynamic-require 'mzscheme 'make-namespace))])
  12. (parameterize ([current-namespace n])
  13. (namespace-require 'mzlib/contract)
  14. (namespace-require 'mzlib/class)
  15. (namespace-require 'mzlib/etc)
  16. (namespace-require '(only mzscheme force delay)))
  17. n))
  18. (define (contract-eval x)
  19. (parameterize ([current-namespace contract-namespace])
  20. (eval x)))
  21. (define-syntax (ctest stx)
  22. (syntax-case stx ()
  23. [(_ a ...)
  24. (syntax (contract-eval `(,test a ...)))]))
  25. (define (contract-error-test exp exn-ok?)
  26. (test #t
  27. 'contract-error-test
  28. (contract-eval `(with-handlers ((exn? (λ (x) (and (,exn-ok? x) #t)))) ,exp))))
  29. ;; test/spec-passed : symbol sexp -> void
  30. ;; tests a passing specification
  31. (define (test/spec-passed name expression)
  32. (printf "testing: ~s\n" name)
  33. (contract-eval
  34. `(,test
  35. (void)
  36. (let ([for-each-eval (lambda (l) (for-each eval l))]) for-each-eval)
  37. (list ',expression '(void))))
  38. (let/ec k
  39. (contract-eval
  40. `(,test (void)
  41. (let ([for-each-eval (lambda (l) (for-each (λ (x) (eval x)) l))])
  42. for-each-eval)
  43. (list ',(rewrite expression k) '(void))))))
  44. (define (test/spec-passed/result name expression result)
  45. (printf "testing: ~s\n" name)
  46. (contract-eval `(,test ',result eval ',expression))
  47. (let/ec k
  48. (contract-eval
  49. `(,test
  50. ',result
  51. eval
  52. ',(rewrite expression k)))))
  53. ;; rewrites `contract' to use opt/c. If there is a module definition in there, we skip that test.
  54. (define (rewrite exp k)
  55. (let loop ([exp exp])
  56. (cond
  57. [(null? exp) null]
  58. [(list? exp)
  59. (case (car exp)
  60. [(contract) `(contract (opt/c ,(loop (cadr exp))) ,@(map loop (cddr exp)))]
  61. [(module) (k #f)]
  62. [else (map loop exp)])]
  63. [(pair? exp) (cons (loop (car exp))
  64. (loop (cdr exp)))]
  65. [else exp])))
  66. (define (test/spec-failed name expression blame)
  67. (let ()
  68. (define (has-proper-blame? msg)
  69. (define reg
  70. (case blame
  71. [(pos) #rx"^self-contract violation"]
  72. [(neg) #rx"blaming neg"]
  73. [else (error 'test/spec-failed "unknown blame name ~s" blame)]))
  74. (regexp-match? reg msg))
  75. (printf "testing: ~s\n" name)
  76. (contract-eval
  77. `(,thunk-error-test
  78. (lambda () ,expression)
  79. (datum->syntax-object #'here ',expression)
  80. (lambda (exn)
  81. (and (exn? exn)
  82. (,has-proper-blame? (exn-message exn))))))
  83. (let/ec k
  84. (let ([rewritten (rewrite expression k)])
  85. (contract-eval
  86. `(,thunk-error-test
  87. (lambda () ,rewritten)
  88. (datum->syntax-object #'here ',rewritten)
  89. (lambda (exn)
  90. (and (exn? exn)
  91. (,has-proper-blame? (exn-message exn))))))))))
  92. (define (test/pos-blame name expression) (test/spec-failed name expression "pos"))
  93. (define (test/neg-blame name expression) (test/spec-failed name expression "neg"))
  94. (define (test/well-formed stx)
  95. (contract-eval
  96. `(,test (void)
  97. (let ([expand/ret-void (lambda (x) (expand x) (void))]) expand/ret-void)
  98. ,stx)))
  99. (define (test/no-error sexp)
  100. (contract-eval
  101. `(,test (void)
  102. eval
  103. '(begin ,sexp (void)))))
  104. (define (test-flat-contract contract pass fail)
  105. (define (run-three-tests contract)
  106. (let ([name (if (pair? contract)
  107. (car contract)
  108. contract)])
  109. (contract-eval `(,test #t flat-contract? ,contract))
  110. (test/spec-failed (format "~a fail" name)
  111. `(contract ,contract ',fail 'pos 'neg)
  112. "pos")
  113. (test/spec-passed/result
  114. (format "~a pass" name)
  115. `(contract ,contract ',pass 'pos 'neg)
  116. pass)))
  117. (run-three-tests contract)
  118. (let/ec k (run-three-tests (rewrite contract k))))
  119. (define-syntax (test-name stx)
  120. (syntax-case stx ()
  121. [(_ name contract)
  122. #'(do-name-test 'name 'contract)]))
  123. (define (do-name-test name contract-exp)
  124. (printf "~s\n" (list 'do-name-test name contract-exp))
  125. (contract-eval `(,test ,name contract-name ,contract-exp))
  126. (contract-eval `(,test ,name contract-name (opt/c ,contract-exp))))
  127. (test/spec-passed
  128. 'contract-flat1
  129. '(contract not #f 'pos 'neg))
  130. (test/pos-blame
  131. 'contract-flat2
  132. '(contract not #t 'pos 'neg))
  133. (test/no-error '(-> integer? integer?))
  134. (test/no-error '(-> (flat-contract integer?) (flat-contract integer?)))
  135. (test/no-error '(-> integer? any))
  136. (test/no-error '(-> (flat-contract integer?) any))
  137. (test/no-error '(->* (integer?) (integer?)))
  138. (test/no-error '(->* (integer?) integer? (integer?)))
  139. (test/no-error '(->* (integer?) integer? any))
  140. (test/no-error '(->* ((flat-contract integer?)) ((flat-contract integer?))))
  141. (test/no-error '(->* ((flat-contract integer?)) (flat-contract integer?) ((flat-contract integer?))))
  142. (test/no-error '(->* ((flat-contract integer?)) (flat-contract integer?) any))
  143. (test/no-error '(->d integer? (lambda (x) integer?)))
  144. (test/no-error '(->d (flat-contract integer?) (lambda (x) (flat-contract integer?))))
  145. (test/no-error '(->d* (integer?) (lambda (x) integer?)))
  146. (test/no-error '(->d* ((flat-contract integer?)) (lambda (x) (flat-contract integer?))))
  147. (test/no-error '(->d* (integer?) integer? (lambda (x . y) integer?)))
  148. (test/no-error '(->d* ((flat-contract integer?)) (flat-contract integer?) (lambda (x . y) (flat-contract integer?))))
  149. (test/no-error '(opt-> (integer?) (integer?) integer?))
  150. (test/no-error '(opt-> ((flat-contract integer?)) ((flat-contract integer?)) (flat-contract integer?)))
  151. (test/no-error '(opt-> ((flat-contract integer?)) ((flat-contract integer?)) any))
  152. (test/no-error '(opt->* (integer?) (integer?) (integer?)))
  153. (test/no-error '(opt->* ((flat-contract integer?)) ((flat-contract integer?)) ((flat-contract integer?))))
  154. (test/no-error '(opt->* (integer?) (integer?) any))
  155. (test/no-error '(opt->* ((flat-contract integer?)) ((flat-contract integer?)) any))
  156. (test/no-error '(unconstrained-domain-> number?))
  157. (test/no-error '(unconstrained-domain-> (flat-contract number?)))
  158. (test/no-error '(listof any/c))
  159. (test/no-error '(listof (lambda (x) #t)))
  160. (test/spec-passed/result 'any/c '(contract any/c 1 'pos 'neg) 1)
  161. (test/pos-blame 'none/c '(contract none/c 1 'pos 'neg))
  162. (test/spec-passed
  163. 'contract-arrow-star0a
  164. '(contract (->* (integer?) (integer?))
  165. (lambda (x) x)
  166. 'pos
  167. 'neg))
  168. (test/neg-blame
  169. 'contract-arrow-star0b
  170. '((contract (->* (integer?) (integer?))
  171. (lambda (x) x)
  172. 'pos
  173. 'neg)
  174. #f))
  175. (test/pos-blame
  176. 'contract-arrow-star0c
  177. '((contract (->* (integer?) (integer?))
  178. (lambda (x) #f)
  179. 'pos
  180. 'neg)
  181. 1))
  182. (test/spec-passed
  183. 'contract-arrow-star1
  184. '(let-values ([(a b) ((contract (->* (integer?) (integer? integer?))
  185. (lambda (x) (values x x))
  186. 'pos
  187. 'neg)
  188. 2)])
  189. 1))
  190. (test/neg-blame
  191. 'contract-arrow-star2
  192. '((contract (->* (integer?) (integer? integer?))
  193. (lambda (x) (values x x))
  194. 'pos
  195. 'neg)
  196. #f))
  197. (test/pos-blame
  198. 'contract-arrow-star3
  199. '((contract (->* (integer?) (integer? integer?))
  200. (lambda (x) (values 1 #t))
  201. 'pos
  202. 'neg)
  203. 1))
  204. (test/pos-blame
  205. 'contract-arrow-star4
  206. '((contract (->* (integer?) (integer? integer?))
  207. (lambda (x) (values #t 1))
  208. 'pos
  209. 'neg)
  210. 1))
  211. (test/spec-passed
  212. 'contract-arrow-star5
  213. '(let-values ([(a b) ((contract (->* (integer?)
  214. (listof integer?)
  215. (integer? integer?))
  216. (lambda (x . y) (values x x))
  217. 'pos
  218. 'neg)
  219. 2)])
  220. 1))
  221. (test/neg-blame
  222. 'contract-arrow-star6
  223. '((contract (->* (integer?) (listof integer?) (integer? integer?))
  224. (lambda (x . y) (values x x))
  225. 'pos
  226. 'neg)
  227. #f))
  228. (test/pos-blame
  229. 'contract-arrow-star7
  230. '((contract (->* (integer?) (listof integer?) (integer? integer?))
  231. (lambda (x . y) (values 1 #t))
  232. 'pos
  233. 'neg)
  234. 1))
  235. (test/pos-blame
  236. 'contract-arrow-star8
  237. '((contract (->* (integer?) (listof integer?) (integer? integer?))
  238. (lambda (x) (values #t 1))
  239. 'pos
  240. 'neg)
  241. 1))
  242. (test/spec-passed
  243. 'contract-arrow-star9
  244. '((contract (->* (integer?) (listof integer?) (integer?))
  245. (lambda (x . y) 1)
  246. 'pos
  247. 'neg)
  248. 1 2))
  249. (test/neg-blame
  250. 'contract-arrow-star10
  251. '((contract (->* (integer?) (listof integer?) (integer?))
  252. (lambda (x . y) 1)
  253. 'pos
  254. 'neg)
  255. 1 2 'bad))
  256. (test/spec-passed
  257. 'contract-arrow-star11
  258. '(let-values ([(a b) ((contract (->* (integer?)
  259. (listof integer?)
  260. any)
  261. (lambda (x . y) (values x x))
  262. 'pos
  263. 'neg)
  264. 2)])
  265. 1))
  266. (test/pos-blame
  267. 'contract-arrow-star11b
  268. '(let-values ([(a b) ((contract (->* (integer?)
  269. (listof integer?)
  270. any)
  271. (lambda (x) (values x x))
  272. 'pos
  273. 'neg)
  274. 2)])
  275. 1))
  276. (test/neg-blame
  277. 'contract-arrow-star12
  278. '((contract (->* (integer?) (listof integer?) any)
  279. (lambda (x . y) (values x x))
  280. 'pos
  281. 'neg)
  282. #f))
  283. (test/spec-passed
  284. 'contract-arrow-star13
  285. '((contract (->* (integer?) (listof integer?) any)
  286. (lambda (x . y) 1)
  287. 'pos
  288. 'neg)
  289. 1 2))
  290. (test/neg-blame
  291. 'contract-arrow-star14
  292. '((contract (->* (integer?) (listof integer?) any)
  293. (lambda (x . y) 1)
  294. 'pos
  295. 'neg)
  296. 1 2 'bad))
  297. (test/spec-passed
  298. 'contract-arrow-star15
  299. '(let-values ([(a b) ((contract (->* (integer?) any)
  300. (lambda (x) (values x x))
  301. 'pos
  302. 'neg)
  303. 2)])
  304. 1))
  305. (test/spec-passed
  306. 'contract-arrow-star16
  307. '((contract (->* (integer?) any)
  308. (lambda (x) x)
  309. 'pos
  310. 'neg)
  311. 2))
  312. (test/neg-blame
  313. 'contract-arrow-star17
  314. '((contract (->* (integer?) any)
  315. (lambda (x) (values x x))
  316. 'pos
  317. 'neg)
  318. #f))
  319. (test/pos-blame
  320. 'contract-arrow-star-arity-check1
  321. '(contract (->* (integer?) (listof integer?) (integer? integer?))
  322. (lambda (x) (values 1 #t))
  323. 'pos
  324. 'neg))
  325. (test/pos-blame
  326. 'contract-arrow-star-arity-check2
  327. '(contract (->* (integer?) (listof integer?) (integer? integer?))
  328. (lambda (x y) (values 1 #t))
  329. 'pos
  330. 'neg))
  331. (test/pos-blame
  332. 'contract-arrow-star-arity-check3
  333. '(contract (->* (integer?) (listof integer?) (integer? integer?))
  334. (case-lambda [(x y) #f] [(x y . z) #t])
  335. 'pos
  336. 'neg))
  337. (test/spec-passed
  338. 'contract-arrow-star-arity-check4
  339. '(contract (->* (integer?) (listof integer?) (integer? integer?))
  340. (case-lambda [(x y) #f] [(x y . z) #t] [(x) #f])
  341. 'pos
  342. 'neg))
  343. (test/spec-passed
  344. 'contract-arrow-values1
  345. '(let-values ([(a b) ((contract (-> integer? (values integer? integer?))
  346. (lambda (x) (values x x))
  347. 'pos
  348. 'neg)
  349. 2)])
  350. 1))
  351. (test/neg-blame
  352. 'contract-arrow-values2
  353. '((contract (-> integer? (values integer? integer?))
  354. (lambda (x) (values x x))
  355. 'pos
  356. 'neg)
  357. #f))
  358. (test/pos-blame
  359. 'contract-arrow-values3
  360. '((contract (-> integer? (values integer? integer?))
  361. (lambda (x) (values 1 #t))
  362. 'pos
  363. 'neg)
  364. 1))
  365. (test/pos-blame
  366. 'contract-arrow-values4
  367. '((contract (-> integer? (values integer? integer?))
  368. (lambda (x) (values #t 1))
  369. 'pos
  370. 'neg)
  371. 1))
  372. (test/pos-blame
  373. 'contract-d1
  374. '(contract (integer? . ->d . (lambda (x) (lambda (y) (= x y))))
  375. 1
  376. 'pos
  377. 'neg))
  378. (test/spec-passed
  379. 'contract-d2
  380. '(contract (integer? . ->d . (lambda (x) (lambda (y) (= x y))))
  381. (lambda (x) x)
  382. 'pos
  383. 'neg))
  384. (test/pos-blame
  385. 'contract-d2
  386. '((contract (integer? . ->d . (lambda (x) (lambda (y) (= x y))))
  387. (lambda (x) (+ x 1))
  388. 'pos
  389. 'neg)
  390. 2))
  391. (test/neg-blame
  392. 'contract-d3
  393. '((contract (integer? . ->d . (lambda (x) (let ([z (+ x 1)]) (lambda (y) (= z y)))))
  394. (lambda (x) (+ x 1))
  395. 'pos
  396. 'neg)
  397. "bad input"))
  398. (test/neg-blame
  399. 'contract-d4
  400. '((contract (integer? . ->d . (lambda (x) (lambda (y) (= (+ x 1) y))))
  401. (lambda (x) (+ x 1))
  402. 'pos
  403. 'neg)
  404. "bad input"))
  405. (test/spec-passed
  406. 'contract-arrow1
  407. '(contract (integer? . -> . integer?) (lambda (x) x) 'pos 'neg))
  408. ;; make sure we skip the optimizations
  409. (test/spec-passed
  410. 'contract-arrow1b
  411. '(contract (integer? integer? integer? integer? integer? integer? integer? integer? integer? integer? . -> . integer?)
  412. (lambda (x1 x2 x3 x4 x5 x6 x7 x8 x9 x10) x1) 'pos 'neg))
  413. (test/pos-blame
  414. 'contract-arrow2
  415. '(contract (integer? . -> . integer?) (lambda (x y) x) 'pos 'neg))
  416. (test/neg-blame
  417. 'contract-arrow3
  418. '((contract (integer? . -> . integer?) (lambda (x) #f) 'pos 'neg) #t))
  419. (test/pos-blame
  420. 'contract-arrow4
  421. '((contract (integer? . -> . integer?) (lambda (x) #f) 'pos 'neg) 1))
  422. (test/spec-passed
  423. 'contract-arrow-any1
  424. '(contract (integer? . -> . any) (lambda (x) x) 'pos 'neg))
  425. (test/pos-blame
  426. 'contract-arrow-any2
  427. '(contract (integer? . -> . any) (lambda (x y) x) 'pos 'neg))
  428. (test/neg-blame
  429. 'contract-arrow-any3
  430. '((contract (integer? . -> . any) (lambda (x) #f) 'pos 'neg) #t))
  431. (test/spec-passed
  432. 'contract-arrow-star-d1
  433. '((contract (->d* (integer?) (lambda (arg) (lambda (res) (= arg res))))
  434. (lambda (x) x)
  435. 'pos
  436. 'neg)
  437. 1))
  438. (test/spec-passed
  439. 'contract-arrow-star-d2
  440. '(let-values ([(a b)
  441. ((contract (->d* (integer?) (lambda (arg)
  442. (values (lambda (res) (= arg res))
  443. (lambda (res) (= arg res)))))
  444. (lambda (x) (values x x))
  445. 'pos
  446. 'neg)
  447. 1)])
  448. 1))
  449. (test/pos-blame
  450. 'contract-arrow-star-d3
  451. '((contract (->d* (integer?) (lambda (arg)
  452. (values (lambda (res) (= arg res))
  453. (lambda (res) (= arg res)))))
  454. (lambda (x) (values 1 2))
  455. 'pos
  456. 'neg)
  457. 2))
  458. (test/pos-blame
  459. 'contract-arrow-star-d4
  460. '((contract (->d* (integer?) (lambda (arg)
  461. (values (lambda (res) (= arg res))
  462. (lambda (res) (= arg res)))))
  463. (lambda (x) (values 2 1))
  464. 'pos
  465. 'neg)
  466. 2))
  467. (test/spec-passed
  468. 'contract-arrow-star-d5
  469. '((contract (->d* ()
  470. (listof integer?)
  471. (lambda args (lambda (res) (= (car args) res))))
  472. (lambda x (car x))
  473. 'pos
  474. 'neg)
  475. 1))
  476. (test/spec-passed
  477. 'contract-arrow-star-d6
  478. '((contract (->d* ()
  479. (listof integer?)
  480. (lambda args
  481. (values (lambda (res) (= (car args) res))
  482. (lambda (res) (= (car args) res)))))
  483. (lambda x (values (car x) (car x)))
  484. 'pos
  485. 'neg)
  486. 1))
  487. (test/pos-blame
  488. 'contract-arrow-star-d7
  489. '((contract (->d* ()
  490. (listof integer?)
  491. (lambda args
  492. (values (lambda (res) (= (car args) res))
  493. (lambda (res) (= (car args) res)))))
  494. (lambda x (values 1 2))
  495. 'pos
  496. 'neg)
  497. 2))
  498. (test/pos-blame
  499. 'contract-arrow-star-d8
  500. '((contract (->d* ()
  501. (listof integer?)
  502. (lambda args
  503. (values (lambda (res) (= (car args) res))
  504. (lambda (res) (= (car args) res)))))
  505. (lambda x (values 2 1))
  506. 'pos
  507. 'neg)
  508. 2))
  509. (test/pos-blame
  510. 'contract-arrow-star-d8
  511. '(contract (->d* ()
  512. (listof integer?)
  513. (lambda arg
  514. (values (lambda (res) (= (car arg) res))
  515. (lambda (res) (= (car arg) res)))))
  516. (lambda (x) (values 2 1))
  517. 'pos
  518. 'neg))
  519. (test/spec-passed
  520. 'and/c1
  521. '((contract (and/c (-> (<=/c 100) (<=/c 100))
  522. (-> (>=/c -100) (>=/c -100)))
  523. (λ (x) x)
  524. 'pos
  525. 'neg)
  526. 1))
  527. (test/neg-blame
  528. 'and/c2
  529. '((contract (and/c (-> (<=/c 100) (<=/c 100))
  530. (-> (>=/c -100) (>=/c -100)))
  531. (λ (x) x)
  532. 'pos
  533. 'neg)
  534. 200))
  535. (test/pos-blame
  536. 'and/c3
  537. '((contract (and/c (-> (<=/c 100) (<=/c 100))
  538. (-> (>=/c -100) (>=/c -100)))
  539. (λ (x) 200)
  540. 'pos
  541. 'neg)
  542. 1))
  543. (test/spec-passed
  544. '->r1
  545. '((contract (->r () number?) (lambda () 1) 'pos 'neg)))
  546. (test/spec-passed
  547. '->r2
  548. '((contract (->r ([x number?]) number?) (lambda (x) (+ x 1)) 'pos 'neg) 1))
  549. (test/pos-blame
  550. '->r3
  551. '((contract (->r () number?) 1 'pos 'neg)))
  552. (test/pos-blame
  553. '->r4
  554. '((contract (->r () number?) (lambda (x) x) 'pos 'neg)))
  555. (test/neg-blame
  556. '->r5
  557. '((contract (->r ([x number?]) any) (lambda (x) (+ x 1)) 'pos 'neg) #f))
  558. (test/pos-blame
  559. '->r6
  560. '((contract (->r ([x number?]) (<=/c x)) (lambda (x) (+ x 1)) 'pos 'neg) 1))
  561. (test/spec-passed
  562. '->r7
  563. '((contract (->r ([x number?] [y (<=/c x)]) (<=/c x)) (lambda (x y) (- x 1)) 'pos 'neg) 1 0))
  564. (test/neg-blame
  565. '->r8
  566. '((contract (->r ([x number?] [y (<=/c x)]) (<=/c x)) (lambda (x y) (+ x 1)) 'pos 'neg) 1 2))
  567. (test/spec-passed
  568. '->r9
  569. '((contract (->r ([y (<=/c x)] [x number?]) (<=/c x)) (lambda (y x) (- x 1)) 'pos 'neg) 1 2))
  570. (test/neg-blame
  571. '->r10
  572. '((contract (->r ([y (<=/c x)] [x number?]) (<=/c x)) (lambda (y x) (+ x 1)) 'pos 'neg) 1 0))
  573. (test/spec-passed
  574. '->r11
  575. '((contract (->r () rest any/c number?) (lambda x 1) 'pos 'neg)))
  576. (test/spec-passed
  577. '->r12
  578. '((contract (->r ([x number?]) rest any/c number?) (lambda (x . y) (+ x 1)) 'pos 'neg) 1))
  579. (test/pos-blame
  580. '->r13
  581. '((contract (->r () rest any/c number?) 1 'pos 'neg)))
  582. (test/pos-blame
  583. '->r14
  584. '((contract (->r () rest any/c number?) (lambda (x) x) 'pos 'neg)))
  585. (test/neg-blame
  586. '->r15
  587. '((contract (->r ([x number?]) rest any/c any) (lambda (x . y) (+ x 1)) 'pos 'neg) #f))
  588. (test/pos-blame
  589. '->r16
  590. '((contract (->r ([x number?]) rest any/c (<=/c x)) (lambda (x . y) (+ x 1)) 'pos 'neg) 1))
  591. (test/spec-passed
  592. '->r17
  593. '((contract (->r ([x number?] [y (<=/c x)]) rest any/c (<=/c x)) (lambda (x y . z) (- x 1)) 'pos 'neg) 1 0))
  594. (test/neg-blame
  595. '->r18
  596. '((contract (->r ([x number?] [y (<=/c x)]) rest any/c (<=/c x)) (lambda (x y . z) (+ x 1)) 'pos 'neg) 1 2))
  597. (test/spec-passed
  598. '->r19
  599. '((contract (->r ([y (<=/c x)] [x number?]) rest any/c (<=/c x)) (lambda (y x . z) (- x 1)) 'pos 'neg) 1 2))
  600. (test/neg-blame
  601. '->r20
  602. '((contract (->r ([y (<=/c x)] [x number?]) rest any/c (<=/c x)) (lambda (y x . z) (+ x 1)) 'pos 'neg) 1 0))
  603. (test/spec-passed
  604. '->r21
  605. '((contract (->r () rst (listof number?) any/c) (lambda w 1) 'pos 'neg) 1))
  606. (test/neg-blame
  607. '->r22
  608. '((contract (->r () rst (listof number?) any/c) (lambda w 1) 'pos 'neg) #f))
  609. (test/spec-passed
  610. '->r-any1
  611. '((contract (->r () any) (lambda () 1) 'pos 'neg)))
  612. (test/spec-passed
  613. '->r-any2
  614. '((contract (->r ([x number?]) any) (lambda (x) (+ x 1)) 'pos 'neg) 1))
  615. (test/pos-blame
  616. '->r-any3
  617. '((contract (->r () any) 1 'pos 'neg)))
  618. (test/pos-blame
  619. '->r-any4
  620. '((contract (->r () any) (lambda (x) x) 'pos 'neg)))
  621. (test/neg-blame
  622. '->r-any5
  623. '((contract (->r ([x number?]) any) (lambda (x) (+ x 1)) 'pos 'neg) #f))
  624. (test/spec-passed
  625. '->r-any6
  626. '((contract (->r ([x number?] [y (<=/c x)]) any) (lambda (x y) (- x 1)) 'pos 'neg) 1 0))
  627. (test/neg-blame
  628. '->r-any7
  629. '((contract (->r ([x number?] [y (<=/c x)]) any) (lambda (x y) (+ x 1)) 'pos 'neg) 1 2))
  630. (test/spec-passed
  631. '->r-any8
  632. '((contract (->r ([y (<=/c x)] [x number?]) any) (lambda (y x) (- x 1)) 'pos 'neg) 1 2))
  633. (test/neg-blame
  634. '->r-any9
  635. '((contract (->r ([y (<=/c x)] [x number?]) any) (lambda (y x) (+ x 1)) 'pos 'neg) 1 0))
  636. (test/spec-passed
  637. '->r-any10
  638. '((contract (->r () rest any/c any) (lambda x 1) 'pos 'neg)))
  639. (test/spec-passed
  640. '->r-any11
  641. '((contract (->r ([x number?]) rest any/c any) (lambda (x . y) (+ x 1)) 'pos 'neg) 1))
  642. (test/pos-blame
  643. '->r-any12
  644. '((contract (->r () rest any/c any) 1 'pos 'neg)))
  645. (test/pos-blame
  646. '->r-any13
  647. '((contract (->r () rest any/c any) (lambda (x) x) 'pos 'neg)))
  648. (test/neg-blame
  649. '->r-any14
  650. '((contract (->r ([x number?]) rest any/c any) (lambda (x . y) (+ x 1)) 'pos 'neg) #f))
  651. (test/spec-passed
  652. '->r-any15
  653. '((contract (->r ([x number?] [y (<=/c x)]) rest any/c any) (lambda (x y . z) (- x 1)) 'pos 'neg) 1 0))
  654. (test/neg-blame
  655. '->r-any16
  656. '((contract (->r ([x number?] [y (<=/c x)]) rest any/c any) (lambda (x y . z) (+ x 1)) 'pos 'neg) 1 2))
  657. (test/spec-passed
  658. '->r-any17
  659. '((contract (->r ([y (<=/c x)] [x number?]) rest any/c any) (lambda (y x . z) (- x 1)) 'pos 'neg) 1 2))
  660. (test/neg-blame
  661. '->r-any18
  662. '((contract (->r ([y (<=/c x)] [x number?]) rest any/c any) (lambda (y x . z) (+ x 1)) 'pos 'neg) 1 0))
  663. (test/spec-passed
  664. '->r-any19
  665. '((contract (->r () rst (listof number?) any) (lambda w 1) 'pos 'neg) 1))
  666. (test/neg-blame
  667. '->r-any20
  668. '((contract (->r () rst (listof number?) any) (lambda w 1) 'pos 'neg) #f))
  669. (test/spec-passed
  670. '->r-values1
  671. '((contract (->r () (values [x boolean?] [y number?])) (lambda () (values #t 1)) 'pos 'neg)))
  672. (test/spec-passed
  673. '->r-values2
  674. '((contract (->r ([x number?]) (values [x boolean?] [y number?])) (lambda (x) (values #t (+ x 1))) 'pos 'neg) 1))
  675. (test/pos-blame
  676. '->r-values3
  677. '((contract (->r () (values [x boolean?] [y number?])) 1 'pos 'neg)))
  678. (test/pos-blame
  679. '->r-values4
  680. '((contract (->r () (values [x boolean?] [y number?])) (lambda (x) x) 'pos 'neg)))
  681. (test/neg-blame
  682. '->r-values5
  683. '((contract (->r ([x number?]) (values [y boolean?] [z (<=/c x)])) (lambda (x) (+ x 1)) 'pos 'neg) #f))
  684. (test/pos-blame
  685. '->r-values6
  686. '((contract (->r ([x number?]) (values [y boolean?] [z (<=/c x)])) (lambda (x) (values #t (+ x 1))) 'pos 'neg) 1))
  687. (test/spec-passed
  688. '->r-values7
  689. '((contract (->r ([x number?] [y (<=/c x)]) (values [z boolean?] [w (<=/c x)]))
  690. (lambda (x y) (values #t (- x 1)))
  691. 'pos
  692. 'neg)
  693. 1
  694. 0))
  695. (test/neg-blame
  696. '->r-values8
  697. '((contract (->r ([x number?] [y (<=/c x)]) (values [z boolean?] [w (<=/c x)]))
  698. (lambda (x y) (values #f (+ x 1)))
  699. 'pos
  700. 'neg)
  701. 1
  702. 2))
  703. (test/spec-passed
  704. '->r-values9
  705. '((contract (->r ([y (<=/c x)] [x number?]) (values [z boolean?] [w (<=/c x)]))
  706. (lambda (y x) (values #f (- x 1)))
  707. 'pos
  708. 'neg)
  709. 1
  710. 2))
  711. (test/neg-blame
  712. '->r-values10
  713. '((contract (->r ([y (<=/c x)] [x number?]) (values [z boolean?] [w (<=/c x)]))
  714. (lambda (y x) (values #f (+ x 1))) 'pos 'neg)
  715. 1 0))
  716. (test/spec-passed
  717. '->r-values11
  718. '((contract (->r () rest any/c (values [z boolean?] [w number?])) (lambda x (values #f 1)) 'pos 'neg)))
  719. (test/spec-passed
  720. '->r-values12
  721. '((contract (->r ([x number?]) rest any/c (values [z boolean?] [w number?]))
  722. (lambda (x . y) (values #f (+ x 1)))
  723. 'pos
  724. 'neg)
  725. 1))
  726. (test/pos-blame
  727. '->r-values13
  728. '((contract (->r () rest any/c (values [z boolean?] [w number?])) 1 'pos 'neg)))
  729. (test/pos-blame
  730. '->r-values14
  731. '((contract (->r () rest any/c (values [z boolean?] [w number?])) (lambda (x) x) 'pos 'neg)))
  732. (test/neg-blame
  733. '->r-values15
  734. '((contract (->r ([x number?]) rest any/c (values [z boolean?] [w (<=/c x)]))
  735. (lambda (x . y) (+ x 1)) 'pos 'neg)
  736. #f))
  737. (test/pos-blame
  738. '->r-values16
  739. '((contract (->r ([x number?]) rest any/c (values [z boolean?] [w (<=/c x)]))
  740. (lambda (x . y) (values #f (+ x 1))) 'pos 'neg)
  741. 1))
  742. (test/spec-passed
  743. '->r-values17
  744. '((contract (->r ([x number?] [y (<=/c x)]) rest any/c (values [z boolean?] [w (<=/c x)]))
  745. (lambda (x y . z) (values #f (- x 1))) 'pos 'neg)
  746. 1 0))
  747. (test/neg-blame
  748. '->r-values18
  749. '((contract (->r ([x number?] [y (<=/c x)]) rest any/c (values [z boolean?] [w (<=/c x)]))
  750. (lambda (x y . z) (values #f (+ x 1))) 'pos 'neg)
  751. 1 2))
  752. (test/spec-passed
  753. '->r-values19
  754. '((contract (->r ([y (<=/c x)] [x number?]) rest any/c (values [z boolean?] [w (<=/c x)]))
  755. (lambda (y x . z) (values #f (- x 1))) 'pos 'neg)
  756. 1 2))
  757. (test/neg-blame
  758. '->r-values20
  759. '((contract (->r ([y (<=/c x)] [x number?]) rest any/c (values [z boolean?] [w (<=/c x)]))
  760. (lambda (y x . z) (values #f (+ x 1))) 'pos 'neg)
  761. 1 0))
  762. (test/spec-passed
  763. '->r-values21
  764. '((contract (->r () rst (listof number?) (values [z boolean?] [w any/c])) (lambda w (values #f 1)) 'pos 'neg) 1))
  765. (test/neg-blame
  766. '->r-values22
  767. '((contract (->r () rst (listof number?) (values [z boolean?] [w any/c])) (lambda w (values #f 1)) 'pos 'neg) #f))
  768. (test/spec-passed
  769. '->r-values23
  770. '((contract (->r () (values [x number?] [y (>=/c x)])) (lambda () (values 1 2)) 'pos 'neg)))
  771. (test/pos-blame
  772. '->r-values24
  773. '((contract (->r () (values [x number?] [y (>=/c x)])) (lambda () (values 2 1)) 'pos 'neg)))
  774. (test/spec-passed
  775. '->r-values25
  776. '((contract (->r ([x number?]) (values [z number?] [y (>=/c x)])) (lambda (x) (values 1 2)) 'pos 'neg) 1))
  777. (test/pos-blame
  778. '->r-values26
  779. '((contract (->r ([x number?]) (values [z number?] [y (>=/c x)])) (lambda (x) (values 2 1)) 'pos 'neg) 4))
  780. (test/spec-passed
  781. '->r1
  782. '((contract (->r () number?) (lambda () 1) 'pos 'neg)))
  783. (test/spec-passed
  784. '->r2
  785. '((contract (->r ([x number?]) number?) (lambda (x) (+ x 1)) 'pos 'neg) 1))
  786. (test/pos-blame
  787. '->r3
  788. '((contract (->r () number?) 1 'pos 'neg)))
  789. (test/pos-blame
  790. '->r4
  791. '((contract (->r () number?) (lambda (x) x) 'pos 'neg)))
  792. (test/neg-blame
  793. '->r5
  794. '((contract (->r ([x number?]) any) (lambda (x) (+ x 1)) 'pos 'neg) #f))
  795. (test/pos-blame
  796. '->r6
  797. '((contract (->r ([x number?]) (<=/c x)) (lambda (x) (+ x 1)) 'pos 'neg) 1))
  798. (test/spec-passed
  799. '->r7
  800. '((contract (->r ([x number?] [y (<=/c x)]) (<=/c x)) (lambda (x y) (- x 1)) 'pos 'neg) 1 0))
  801. (test/neg-blame
  802. '->r8
  803. '((contract (->r ([x number?] [y (<=/c x)]) (<=/c x)) (lambda (x y) (+ x 1)) 'pos 'neg) 1 2))
  804. (test/spec-passed
  805. '->r9
  806. '((contract (->r ([y (<=/c x)] [x number?]) (<=/c x)) (lambda (y x) (- x 1)) 'pos 'neg) 1 2))
  807. (test/neg-blame
  808. '->r10
  809. '((contract (->r ([y (<=/c x)] [x number?]) (<=/c x)) (lambda (y x) (+ x 1)) 'pos 'neg) 1 0))
  810. (test/spec-passed
  811. '->r11
  812. '((contract (->r () rest any/c number?) (lambda x 1) 'pos 'neg)))
  813. (test/spec-passed
  814. '->r12
  815. '((contract (->r ([x number?]) rest any/c number?) (lambda (x . y) (+ x 1)) 'pos 'neg) 1))
  816. (test/pos-blame
  817. '->r13
  818. '((contract (->r () rest any/c number?) 1 'pos 'neg)))
  819. (test/pos-blame
  820. '->r14
  821. '((contract (->r () rest any/c number?) (lambda (x) x) 'pos 'neg)))
  822. (test/neg-blame
  823. '->r15
  824. '((contract (->r ([x number?]) rest any/c any) (lambda (x . y) (+ x 1)) 'pos 'neg) #f))
  825. (test/pos-blame
  826. '->r16
  827. '((contract (->r ([x number?]) rest any/c (<=/c x)) (lambda (x . y) (+ x 1)) 'pos 'neg) 1))
  828. (test/spec-passed
  829. '->r17
  830. '((contract (->r ([x number?] [y (<=/c x)]) rest any/c (<=/c x)) (lambda (x y . z) (- x 1)) 'pos 'neg) 1 0))
  831. (test/neg-blame
  832. '->r18
  833. '((contract (->r ([x number?] [y (<=/c x)]) rest any/c (<=/c x)) (lambda (x y . z) (+ x 1)) 'pos 'neg) 1 2))
  834. (test/spec-passed
  835. '->r19
  836. '((contract (->r ([y (<=/c x)] [x number?]) rest any/c (<=/c x)) (lambda (y x . z) (- x 1)) 'pos 'neg) 1 2))
  837. (test/neg-blame
  838. '->r20
  839. '((contract (->r ([y (<=/c x)] [x number?]) rest any/c (<=/c x)) (lambda (y x . z) (+ x 1)) 'pos 'neg) 1 0))
  840. (test/spec-passed
  841. '->r21
  842. '((contract (->r () rst (listof number?) any/c) (lambda w 1) 'pos 'neg) 1))
  843. (test/neg-blame
  844. '->r22
  845. '((contract (->r () rst (listof number?) any/c) (lambda w 1) 'pos 'neg) #f))
  846. (test/spec-passed/result
  847. '->r23
  848. '((contract (->r ((i number?) (j (and/c number? (>=/c i)))) number?)
  849. (λ (i j) 1)
  850. 'pos
  851. 'neg)
  852. 1
  853. 2)
  854. 1)
  855. (test/spec-passed/result
  856. '->r24
  857. '((contract (->r ((i number?) (j (and/c number? (>=/c i)))) any)
  858. (λ (i j) 1)
  859. 'pos
  860. 'neg)
  861. 1
  862. 2)
  863. 1)
  864. (test/spec-passed/result
  865. '->r25
  866. '(call-with-values
  867. (λ ()
  868. ((contract (->r ((i number?) (j (and/c number? (>=/c i)))) (values [x number?] [y number?]))
  869. (λ (i j) (values 1 2))
  870. 'pos
  871. 'neg)
  872. 1
  873. 2))
  874. list)
  875. '(1 2))
  876. (test/spec-passed/result
  877. '->r26
  878. '((contract (->r ((i number?) (j (and/c number? (>=/c i)))) rest-args any/c number?)
  879. (λ (i j . z) 1)
  880. 'pos
  881. 'neg)
  882. 1
  883. 2)
  884. 1)
  885. (test/spec-passed/result
  886. '->r27
  887. '((contract (->r ((i number?) (j (and/c number? (>=/c i)))) rest-args any/c any)
  888. (λ (i j . z) 1)
  889. 'pos
  890. 'neg)
  891. 1
  892. 2)
  893. 1)
  894. (test/spec-passed/result
  895. '->r28
  896. '(call-with-values
  897. (λ ()
  898. ((contract (->r ((i number?) (j (and/c number? (>=/c i)))) rest-args any/c (values [x number?] [y number?]))
  899. (λ (i j . z) (values 1 2))
  900. 'pos
  901. 'neg)
  902. 1
  903. 2))
  904. list)
  905. '(1 2))
  906. (test/pos-blame
  907. '->pp1
  908. '((contract (->pp ([x number?]) (= x 1) number? result (= x 2))
  909. (λ (x) x)
  910. 'pos
  911. 'neg)
  912. 1))
  913. (test/neg-blame
  914. '->pp2
  915. '((contract (->pp ([x number?]) (= x 1) number? result (= x 2))
  916. (λ (x) x)
  917. 'pos
  918. 'neg)
  919. 2))
  920. (test/pos-blame
  921. '->pp3
  922. '((contract (->pp ([x number?]) (= x 1) number? result (= result 2))
  923. (λ (x) x)
  924. 'pos
  925. 'neg)
  926. 1))
  927. (test/spec-passed
  928. '->pp3.5
  929. '((contract (->pp ([x number?]) (= x 1) number? result (= result 2))
  930. (λ (x) 2)
  931. 'pos
  932. 'neg)
  933. 1))
  934. (test/neg-blame
  935. '->pp4
  936. '((contract (->pp ([x number?]) (= x 1) any)
  937. (λ (x) x)
  938. 'pos
  939. 'neg)
  940. 2))
  941. (test/neg-blame
  942. '->pp5
  943. '((contract (->pp ([x number?]) (= x 1) (values [x number?] [y number?]) (= x y 3))
  944. (λ (x) (values 4 5))
  945. 'pos
  946. 'neg)
  947. 2))
  948. (test/pos-blame
  949. '->pp6
  950. '((contract (->pp ([x number?]) (= x 1) (values [x number?] [y number?]) (= x y 3))
  951. (λ (x) (values 4 5))
  952. 'pos
  953. 'neg)
  954. 1))
  955. (test/pos-blame
  956. '->pp-r1
  957. '((contract (->pp-rest ([x number?]) rst any/c (= x 1) number? result (= x 2))
  958. (λ (x . rst) x)
  959. 'pos
  960. 'neg)
  961. 1))
  962. (test/neg-blame
  963. '->pp-r2
  964. '((contract (->pp-rest ([x number?]) rst any/c (= x 1) number? result (= x 2))
  965. (λ (x . rst) x)
  966. 'pos
  967. 'neg)
  968. 2))
  969. (test/pos-blame
  970. '->pp-r3
  971. '((contract (->pp-rest ([x number?]) rst any/c (= x 1) number? result (= result 2))
  972. (λ (x . rst) x)
  973. 'pos
  974. 'neg)
  975. 1))
  976. (test/spec-passed
  977. '->pp-r3.5
  978. '((contract (->pp-rest ([x number?]) rst any/c (= x 1) number? result (= result 2))
  979. (λ (x . rst) 2)
  980. 'pos
  981. 'neg)
  982. 1))
  983. (test/neg-blame
  984. '->pp-r4
  985. '((contract (->pp-rest ([x number?]) rst any/c (= x 1) any)
  986. (λ (x . rst) x)
  987. 'pos
  988. 'neg)
  989. 2))
  990. (test/neg-blame
  991. '->pp-r5
  992. '((contract (->pp-rest ([x number?]) rst any/c (= x 1) (values [x number?] [y number?]) (= x y 3))
  993. (λ (x . rst) (values 4 5))
  994. 'pos
  995. 'neg)
  996. 2))
  997. (test/pos-blame
  998. '->pp-r6
  999. '((contract (->pp-rest ([x number?]) rst any/c (= x 1) (values [x number?] [y number?]) (= x y 3))
  1000. (λ (x . rst) (values 4 5))
  1001. 'pos
  1002. 'neg)
  1003. 1))
  1004. (test/pos-blame
  1005. 'contract-case->0a
  1006. '(contract (case->)
  1007. (lambda (x) x)
  1008. 'pos
  1009. 'neg))
  1010. (test/pos-blame
  1011. 'contract-case->0b
  1012. '(contract (case->)
  1013. (lambda () 1)
  1014. 'pos
  1015. 'neg))
  1016. (test/pos-blame
  1017. 'contract-case->0c
  1018. '(contract (case->)
  1019. 1
  1020. 'pos
  1021. 'neg))
  1022. (test/spec-passed
  1023. 'contract-case->0d
  1024. '(contract (case->)
  1025. (case-lambda)
  1026. 'pos
  1027. 'neg))
  1028. (test/pos-blame
  1029. 'contract-case->1
  1030. '(contract (case-> (integer? integer? . -> . integer?) (integer? . -> . integer?))
  1031. (lambda (x) x)
  1032. 'pos
  1033. 'neg))
  1034. (test/pos-blame
  1035. 'contract-case->2
  1036. '((contract (case-> (integer? integer? . -> . integer?) (integer? . -> . integer?))
  1037. (case-lambda
  1038. [(x y) 'case1]
  1039. [(x) 'case2])
  1040. 'pos
  1041. 'neg)
  1042. 1 2))
  1043. (test/pos-blame
  1044. 'contract-case->3
  1045. '((contract (case-> (integer? integer? . -> . integer?) (integer? . -> . integer?))
  1046. (case-lambda
  1047. [(x y) 'case1]
  1048. [(x) 'case2])
  1049. 'pos
  1050. 'neg)
  1051. 1))
  1052. (test/neg-blame
  1053. 'contract-case->4
  1054. '((contract (case-> (integer? integer? . -> . integer?) (integer? . -> . integer?))
  1055. (case-lambda
  1056. [(x y) 'case1]
  1057. [(x) 'case2])
  1058. 'pos
  1059. 'neg)
  1060. 'a 2))
  1061. (test/neg-blame
  1062. 'contract-case->5
  1063. '((contract (case-> (integer? integer? . -> . integer?) (integer? . -> . integer?))
  1064. (case-lambda
  1065. [(x y) 'case1]
  1066. [(x) 'case2])
  1067. 'pos
  1068. 'neg)
  1069. 2 'a))
  1070. (test/neg-blame
  1071. 'contract-case->6
  1072. '((contract (case-> (integer? integer? . -> . integer?) (integer? . -> . integer?))
  1073. (case-lambda
  1074. [(x y) 'case1]
  1075. [(x) 'case2])
  1076. 'pos
  1077. 'neg)
  1078. #t))
  1079. (test/pos-blame
  1080. 'contract-case->7
  1081. '((contract (case-> (integer? integer? . -> . integer?) (->* (integer?) any/c (boolean?)))
  1082. (lambda x #\a)
  1083. 'pos
  1084. 'neg)
  1085. 1 2))
  1086. (test/pos-blame
  1087. 'contract-case->8
  1088. '((contract (case-> (integer? integer? . -> . integer?) (->* (integer?) any/c (boolean?)))
  1089. (lambda x #t)
  1090. 'pos
  1091. 'neg)
  1092. 1 2))
  1093. (test/spec-passed
  1094. 'contract-case->8
  1095. '((contract (case-> (integer? integer? . -> . integer?) (->* (integer?) any/c (boolean?)))
  1096. (lambda x 1)
  1097. 'pos
  1098. 'neg)
  1099. 1 2))
  1100. (test/spec-passed
  1101. 'contract-case->9
  1102. '((contract (case-> (->r ([x number?]) (<=/c x)))
  1103. (lambda (x) (- x 1))
  1104. 'pos
  1105. 'neg)
  1106. 1))
  1107. (test/spec-passed
  1108. 'contract-case->9b
  1109. '((contract (case-> (->r ([x number?]) (<=/c x)) (-> integer? integer? integer?))
  1110. (case-lambda
  1111. [(x) (- x 1)]
  1112. [(x y) x])
  1113. 'pos
  1114. 'neg)
  1115. 1))
  1116. (test/pos-blame
  1117. 'contract-case->10
  1118. '((contract (case-> (->r ([x number?]) (<=/c x)))
  1119. (lambda (x) (+ x 1))
  1120. 'pos
  1121. 'neg)
  1122. 1))
  1123. (test/pos-blame
  1124. 'contract-case->10b
  1125. '((contract (case-> (->r ([x number?]) (<=/c x)) (-> number? number? number?))
  1126. (case-lambda
  1127. [(x) (+ x 1)]
  1128. [(x y) x])
  1129. 'pos
  1130. 'neg)
  1131. 1))
  1132. (test/spec-passed/result
  1133. 'contract-case->11
  1134. '(let ([f
  1135. (contract (case-> (-> char?) (-> integer? boolean?) (-> symbol? input-port? string?))
  1136. (case-lambda
  1137. [() #\a]
  1138. [(x) (= x 0)]
  1139. [(sym port)
  1140. (string-append
  1141. (symbol->string sym)
  1142. (read port))])
  1143. 'pos
  1144. 'neg)])
  1145. (list (f)
  1146. (f 1)
  1147. (f 'x (open-input-string (format "~s" "string")))))
  1148. (list #\a #f "xstring"))
  1149. (test/neg-blame
  1150. 'contract-d-protect-shared-state
  1151. '(let ([x 1])
  1152. ((contract ((->d (lambda () (let ([pre-x x]) (lambda (res) (= x pre-x)))))
  1153. . -> .
  1154. (lambda (x) #t))
  1155. (lambda (thnk) (thnk))
  1156. 'pos
  1157. 'neg)
  1158. (lambda () (set! x 2)))))
  1159. #;
  1160. (test/neg-blame
  1161. 'combo1
  1162. '(let ([cf (contract (case->
  1163. ((class? . ->d . (lambda (%) (lambda (x) #f))) . -> . void?)
  1164. ((class? . ->d . (lambda (%) (lambda (x) #f))) boolean? . -> . void?))
  1165. (letrec ([c% (class object% (super-instantiate ()))]
  1166. [f
  1167. (case-lambda
  1168. [(class-maker) (f class-maker #t)]
  1169. [(class-maker b)
  1170. (class-maker c%)
  1171. (void)])])
  1172. f)
  1173. 'pos
  1174. 'neg)])
  1175. (cf (lambda (x%) 'going-to-be-bad))))
  1176. (test/spec-passed
  1177. 'unconstrained-domain->1
  1178. '(contract (unconstrained-domain-> number?) (λ (x) x) 'pos 'neg))
  1179. (test/pos-blame
  1180. 'unconstrained-domain->2
  1181. '(contract (unconstrained-domain-> number?) 1 'pos 'neg))
  1182. (test/spec-passed
  1183. 'unconstrained-domain->3
  1184. '((contract (unconstrained-domain-> number?) (λ (x) x) 'pos 'neg) 1))
  1185. (test/pos-blame
  1186. 'unconstrained-domain->4
  1187. '((contract (unconstrained-domain-> number?) (λ (x) x) 'pos 'neg) #f))
  1188. (test/spec-passed/result
  1189. 'unconstrained-domain->4
  1190. '((contract (->r ([size natural-number/c]
  1191. [proc (and/c (unconstrained-domain-> number?)
  1192. (λ (p) (procedure-arity-includes? p size)))])
  1193. number?)
  1194. (λ (i f) (apply f (build-list i add1)))
  1195. 'pos
  1196. 'neg)
  1197. 10 +)
  1198. 55)
  1199. (test/pos-blame
  1200. 'or/c1
  1201. '(contract (or/c false/c) #t 'pos 'neg))
  1202. (test/spec-passed
  1203. 'or/c2
  1204. '(contract (or/c false/c) #f 'pos 'neg))
  1205. (test/spec-passed
  1206. 'or/c3
  1207. '((contract (or/c (-> integer? integer?)) (lambda (x) x) 'pos 'neg) 1))
  1208. (test/neg-blame
  1209. 'or/c4
  1210. '((contract (or/c (-> integer? integer?)) (lambda (x) x) 'pos 'neg) #f))
  1211. (test/pos-blame
  1212. 'or/c5
  1213. '((contract (or/c (-> integer? integer?)) (lambda (x) #f) 'pos 'neg) 1))
  1214. (test/spec-passed
  1215. 'or/c6
  1216. '(contract (or/c false/c (-> integer? integer?)) #f 'pos 'neg))
  1217. (test/spec-passed
  1218. 'or/c7
  1219. '((contract (or/c false/c (-> integer? integer?)) (lambda (x) x) 'pos 'neg) 1))
  1220. (test/spec-passed/result
  1221. 'or/c8
  1222. '((contract ((or/c false/c (-> string?)) . -> . any)
  1223. (λ (y) y)
  1224. 'pos
  1225. 'neg)
  1226. #f)
  1227. #f)
  1228. (test/spec-passed/result
  1229. 'or/c9
  1230. '((contract (or/c (-> string?) (-> integer? integer?))
  1231. (λ () "x")
  1232. 'pos
  1233. 'neg))
  1234. "x")
  1235. (test/spec-passed/result
  1236. 'or/c10
  1237. '((contract (or/c (-> string?) (-> integer? integer?))
  1238. (λ (x) x)
  1239. 'pos
  1240. 'neg)
  1241. 1)
  1242. 1)
  1243. (test/pos-blame
  1244. 'or/c11
  1245. '(contract (or/c (-> string?) (-> integer? integer?))
  1246. 1
  1247. 'pos
  1248. 'neg))
  1249. (test/pos-blame
  1250. 'or/c12
  1251. '((contract (or/c (-> string?) (-> integer? integer?))
  1252. 1
  1253. 'pos
  1254. 'neg)
  1255. 'x))
  1256. (test/pos-blame
  1257. 'or/c13
  1258. '(contract (or/c not) #t 'pos 'neg))
  1259. (test/spec-passed
  1260. 'or/c14
  1261. '(contract (or/c not) #f 'pos 'neg))
  1262. (test/spec-passed/result
  1263. 'or/c-not-error-early
  1264. '(begin (or/c (-> integer? integer?) (-> boolean? boolean?))
  1265. 1)
  1266. 1)
  1267. (contract-error-test
  1268. #'(contract (or/c (-> integer? integer?) (-> boolean? boolean?))
  1269. (λ (x) x)
  1270. 'pos
  1271. 'neg)
  1272. exn:fail?)
  1273. (test/spec-passed/result
  1274. 'or/c-ordering
  1275. '(let ([x '()])
  1276. (contract (or/c (lambda (y) (set! x (cons 2 x)) #f) (lambda (y) (set! x (cons 1 x)) #t))
  1277. 'anything
  1278. 'pos
  1279. 'neg)
  1280. x)
  1281. '(1 2))
  1282. (test/spec-passed/result
  1283. 'or/c-ordering2
  1284. '(let ([x '()])
  1285. (contract (or/c (lambda (y) (set! x (cons 2 x)) #t) (lambda (y) (set! x (cons 1 x)) #t))
  1286. 'anything
  1287. 'pos
  1288. 'neg)
  1289. x)
  1290. '(2))
  1291. (test/spec-passed/result
  1292. 'and/c-ordering
  1293. '(let ([x '()])
  1294. (contract (and/c (lambda (y) (set! x (cons 2 x)) #t) (lambda (y) (set! x (cons 1 x)) #t))
  1295. 'anything
  1296. 'pos
  1297. 'neg)
  1298. x)
  1299. '(1 2))
  1300. (test/spec-passed/result
  1301. 'ho-and/c-ordering
  1302. '(let ([x '()])
  1303. ((contract (and/c (-> (lambda (y) (set! x (cons 1 x)) #t)
  1304. (lambda (y) (set! x (cons 2 x)) #t))
  1305. (-> (lambda (y) (set! x (cons 3 x)) #t)
  1306. (lambda (y) (set! x (cons 4 x)) #t)))
  1307. (λ (x) x)
  1308. 'pos
  1309. 'neg)
  1310. 1)
  1311. (reverse x))
  1312. '(3 1 2 4))
  1313. (test/neg-blame
  1314. 'parameter/c1
  1315. '((contract (parameter/c integer?)
  1316. (make-parameter 1)
  1317. 'pos 'neg)
  1318. #f))
  1319. (test/pos-blame
  1320. 'parameter/c1
  1321. '((contract (parameter/c integer?)
  1322. (make-parameter 'not-an-int)
  1323. 'pos 'neg)))
  1324. (test/spec-passed
  1325. 'define/contract1
  1326. '(let ()
  1327. (define/contract i integer? 1)
  1328. i))
  1329. (test/spec-failed
  1330. 'define/contract2
  1331. '(let ()
  1332. (define/contract i integer? #t)
  1333. i)
  1334. "i")
  1335. (test/spec-failed
  1336. 'define/contract3
  1337. '(let ()
  1338. (define/contract i (-> integer? integer?) (lambda (x) #t))
  1339. (i 1))
  1340. "i")
  1341. (test/spec-failed
  1342. 'define/contract4
  1343. '(let ()
  1344. (define/contract i (-> integer? integer?) (lambda (x) 1))
  1345. (i #f))
  1346. "<<unknown>>")
  1347. (test/spec-failed
  1348. 'define/contract5
  1349. '(let ()
  1350. (define/contract i (-> integer? integer?) (lambda (x) (i #t)))
  1351. (i 1))
  1352. "<<unknown>>")
  1353. (test/spec-passed
  1354. 'define/contract6
  1355. '(let ()
  1356. (define/contract contracted-func
  1357. (string? string? . -> . string?)
  1358. (lambda (label t)
  1359. t))
  1360. (contracted-func
  1361. "I'm a string constant with side effects"
  1362. "ans")))
  1363. (test/spec-passed
  1364. 'define/contract7
  1365. '(let ()
  1366. (eval '(module contract-test-suite-define1 mzscheme
  1367. (require mzlib/contract)
  1368. (define/contract x string? "a")
  1369. x))
  1370. (eval '(require 'contract-test-suite-define1))))
  1371. ;
  1372. ;
  1373. ;
  1374. ; ; ;
  1375. ; ;
  1376. ; ; ; ; ;
  1377. ; ;;; ; ;; ; ;;; ;;; ;;;; ;;; ;;; ; ;; ;;;; ; ; ;;; ;;; ;;;;
  1378. ; ; ; ;; ; ; ; ; ; ; ; ; ; ; ; ;; ; ; ;; ; ; ; ; ;
  1379. ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
  1380. ; ; ; ; ; ; ;;;;;; ; ; ;;;;;; ; ; ; ; ; ; ; ;;;; ; ;
  1381. ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
  1382. ; ; ; ;; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
  1383. ; ;;; ; ;; ; ;;;; ;;; ;; ;;; ;;; ; ; ;; ; ;;;;; ;;; ;;
  1384. ; ;
  1385. ; ;
  1386. ; ;;
  1387. (test/spec-passed
  1388. 'object-contract0
  1389. '(contract (object-contract)
  1390. (new object%)
  1391. 'pos
  1392. 'neg))
  1393. (test/pos-blame
  1394. 'object-contract/field1
  1395. '(contract (object-contract (field x integer?))
  1396. (new object%)
  1397. 'pos
  1398. 'neg))
  1399. (test/pos-blame
  1400. 'object-contract/field2
  1401. '(get-field
  1402. x
  1403. (contract (object-contract (field x integer?))
  1404. (new (class object% (field [x #t]) (super-new)))
  1405. 'pos
  1406. 'neg)))
  1407. (test/spec-passed/result
  1408. 'object-contract/field3
  1409. '(get-field
  1410. x
  1411. (contract (object-contract (field x integer?))
  1412. (new (class object% (field [x 12]) (super-new)))
  1413. 'pos
  1414. 'neg))
  1415. 12)
  1416. (test/pos-blame
  1417. 'object-contract/field4
  1418. '(get-field
  1419. y
  1420. (contract (object-contract (field x boolean?) (field y boolean?))
  1421. (new (class object% (field [x #t] [y 'x]) (super-new)))
  1422. 'pos
  1423. 'neg)))
  1424. (test/pos-blame
  1425. 'object-contract/field5
  1426. '(get-field
  1427. x
  1428. (contract (object-contract (field x symbol?) (field y symbol?))
  1429. (new (class object% (field [x #t] [y 'x]) (super-new)))
  1430. 'pos
  1431. 'neg)))
  1432. (test/spec-passed/result
  1433. 'object-contract/field6
  1434. '(let ([o (contract (object-contract [m (integer? . -> . integer?)])
  1435. (new (class object% (field [x 1]) (define/public (m y) x) (super-new)))
  1436. 'pos
  1437. 'neg)])
  1438. (list (send o m 2)
  1439. (send/apply o m '(2))
  1440. (let ([x '(2)]) (send o m . x))
  1441. (with-method ([mm (o m)])
  1442. (mm 2))
  1443. (send* o (m 3) (m 4))))
  1444. (list 1 1 1 1 1))
  1445. (test/spec-passed/result
  1446. 'object-contract/field7
  1447. '(let ([o (contract (object-contract)
  1448. (new (class object% (field [x 1]) (define/public (m y) x) (super-new)))
  1449. 'pos
  1450. 'neg)])
  1451. (list (send o m 2)
  1452. (send/apply o m '(2))
  1453. (let ([x '(2)]) (send o m . x))
  1454. (with-method ([mm (o m)])
  1455. (mm 2))
  1456. (send* o (m 3) (m 4))))
  1457. (list 1 1 1 1 1))
  1458. (tes…

Large files files are truncated, but you can click here to view the full file