PageRenderTime 68ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/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
  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. (test/spec-passed/result
  1459. 'object-contract/field8
  1460. '(let ([o (contract (object-contract [m (integer? . -> . integer?)])
  1461. (new (class object% (define x 6) (define/public (m y) x) (super-new)))
  1462. 'pos
  1463. 'neg)])
  1464. (list (send o m 2)
  1465. (send/apply o m '(2))
  1466. (let ([x '(2)]) (send o m . x))
  1467. (with-method ([mm (o m)])
  1468. (mm 2))
  1469. (send* o (m 3) (m 4))))
  1470. (list 6 6 6 6 6))
  1471. (test/spec-passed/result
  1472. 'object-contract/field9
  1473. '(let ([o (contract (object-contract)
  1474. (new (class object% (define x 6) (define/public (m y) x) (super-new)))
  1475. 'pos
  1476. 'neg)])
  1477. (list (send o m 2)
  1478. (send/apply o m '(2))
  1479. (let ([x '(2)]) (send o m . x))
  1480. (with-method ([mm (o m)])
  1481. (mm 2))
  1482. (send* o (m 3) (m 4))))
  1483. (list 6 6 6 6 6))
  1484. (test/spec-passed/result
  1485. 'object-contract/field10
  1486. '(send (contract (object-contract)
  1487. (new (class object% (define x 1) (define/public (m y) x) (super-new)))
  1488. 'pos
  1489. 'neg)
  1490. m
  1491. 2)
  1492. 1)
  1493. (test/spec-passed/result
  1494. 'object-contract->1
  1495. '(send
  1496. (contract (object-contract (m (integer? . -> . integer?)))
  1497. (new (class object% (define/public (m x) x) (super-new)))
  1498. 'pos
  1499. 'neg)
  1500. m
  1501. 1)
  1502. 1)
  1503. (test/pos-blame
  1504. 'object-contract->2
  1505. '(contract (object-contract (m (integer? . -> . integer?)))
  1506. (make-object object%)
  1507. 'pos
  1508. 'neg))
  1509. (test/neg-blame
  1510. 'object-contract->3
  1511. '(send
  1512. (contract (object-contract (m (integer? . -> . integer?)))
  1513. (make-object (class object% (define/public (m x) x) (super-instantiate ())))
  1514. 'pos
  1515. 'neg)
  1516. m
  1517. 'x))
  1518. (test/pos-blame
  1519. 'object-contract->4
  1520. '(send
  1521. (contract (object-contract (m (integer? . -> . integer?)))
  1522. (make-object (class object% (define/public (m x) 'x) (super-instantiate ())))
  1523. 'pos
  1524. 'neg)
  1525. m
  1526. 1))
  1527. (test/pos-blame
  1528. 'object-contract->5
  1529. '(contract (object-contract (m (integer? integer? . -> . integer?)))
  1530. (make-object (class object% (define/public (m x) 'x) (super-instantiate ())))
  1531. 'pos
  1532. 'neg))
  1533. (test/spec-passed/result
  1534. 'object-contract->6
  1535. '(send
  1536. (contract (object-contract (m (integer? . -> . any)))
  1537. (new (class object% (define/public (m x) x) (super-new)))
  1538. 'pos
  1539. 'neg)
  1540. m
  1541. 1)
  1542. 1)
  1543. (test/neg-blame
  1544. 'object-contract->7
  1545. '(send
  1546. (contract (object-contract (m (integer? . -> . any)))
  1547. (make-object (class object% (define/public (m x) x) (super-instantiate ())))
  1548. 'pos
  1549. 'neg)
  1550. m
  1551. 'x))
  1552. (test/spec-passed
  1553. 'object-contract->8
  1554. '(begin
  1555. (send
  1556. (contract (object-contract (m (integer? . -> . any)))
  1557. (make-object (class object% (define/public (m x) (values 1 2)) (super-instantiate ())))
  1558. 'pos
  1559. 'neg)
  1560. m
  1561. 1)
  1562. (void)))
  1563. (test/spec-passed
  1564. 'object-contract->9
  1565. '(begin
  1566. (send
  1567. (contract (object-contract (m (integer? . -> . any)))
  1568. (make-object (class object% (define/public (m x) (values)) (super-instantiate ())))
  1569. 'pos
  1570. 'neg)
  1571. m
  1572. 1)
  1573. (void)))
  1574. (test/spec-passed
  1575. 'object-contract->10
  1576. '(begin
  1577. (send (contract (object-contract (m (integer? . -> . (values integer? boolean?))))
  1578. (make-object (class object% (define/public (m x) (values 1 #t)) (super-instantiate ())))
  1579. 'pos
  1580. 'neg)
  1581. m 1)
  1582. (void)))
  1583. (test/neg-blame
  1584. 'object-contract->11
  1585. '(send
  1586. (contract (object-contract (m (integer? . -> . (values integer? boolean?))))
  1587. (make-object (class object% (define/public (m x) (values #t #t)) (super-instantiate ())))
  1588. 'pos
  1589. 'neg)
  1590. m
  1591. #f))
  1592. (test/pos-blame
  1593. 'object-contract->12
  1594. '(send
  1595. (contract (object-contract (m (integer? . -> . (values integer? boolean?))))
  1596. (make-object (class object% (define/public (m x) (values #t #t)) (super-instantiate ())))
  1597. 'pos
  1598. 'neg)
  1599. m
  1600. 1))
  1601. (test/pos-blame
  1602. 'object-contract->13
  1603. '(send (contract (object-contract (m (integer? . -> . (values integer? boolean?))))
  1604. (make-object (class object% (define/public (m x) (values #f #t)) (super-instantiate ())))
  1605. 'pos
  1606. 'neg)
  1607. m 1))
  1608. (test/pos-blame
  1609. 'object-contract->14
  1610. '(send (contract (object-contract (m (integer? . -> . (values integer? boolean?))))
  1611. (make-object (class object% (define/public (m x) (values 5 6)) (super-instantiate ())))
  1612. 'pos
  1613. 'neg)
  1614. m 1))
  1615. (test/pos-blame
  1616. 'object-contract-case->1
  1617. '(contract (object-contract (m (case-> (boolean? . -> . boolean?)
  1618. (integer? integer? . -> . integer?))))
  1619. (new object%)
  1620. 'pos
  1621. 'neg))
  1622. (test/pos-blame
  1623. 'object-contract-case->2
  1624. '(contract (object-contract (m (case-> (boolean? . -> . boolean?)
  1625. (integer? integer? . -> . integer?))))
  1626. (new (class object% (define/public (m x) x) (super-new)))
  1627. 'pos
  1628. 'neg))
  1629. (test/pos-blame
  1630. 'object-contract-case->3
  1631. '(contract (object-contract (m (case-> (boolean? . -> . boolean?)
  1632. (integer? integer? . -> . integer?))))
  1633. (new (class object% (define/public (m x y) x) (super-new)))
  1634. 'pos
  1635. 'neg))
  1636. (test/spec-passed
  1637. 'object-contract-case->4
  1638. '(contract (object-contract (m (case-> (boolean? . -> . boolean?)
  1639. (integer? integer? . -> . integer?))))
  1640. (new (class object%
  1641. (define/public m
  1642. (case-lambda
  1643. [(b) (not b)]
  1644. [(x y) (+ x y)]))
  1645. (super-new)))
  1646. 'pos
  1647. 'neg))
  1648. (test/spec-passed/result
  1649. 'object-contract-case->5
  1650. '(send (contract (object-contract (m (case-> (boolean? . -> . boolean?)
  1651. (integer? integer? . -> . integer?))))
  1652. (new (class object%
  1653. (define/public m
  1654. (case-lambda
  1655. [(b) (not b)]
  1656. [(x y) (+ x y)]))
  1657. (super-new)))
  1658. 'pos
  1659. 'neg)
  1660. m
  1661. #t)
  1662. #f)
  1663. (test/spec-passed/result
  1664. 'object-contract-case->6
  1665. '(send (contract (object-contract (m (case-> (boolean? . -> . boolean?)
  1666. (integer? integer? . -> . integer?))))
  1667. (new (class object%
  1668. (define/public m
  1669. (case-lambda
  1670. [(b) (not b)]
  1671. [(x y) (+ x y)]))
  1672. (super-new)))
  1673. 'pos
  1674. 'neg)
  1675. m
  1676. 3
  1677. 4)
  1678. 7)
  1679. (test/pos-blame
  1680. 'object-contract-opt->*1
  1681. '(contract (object-contract (m (opt->* (integer?) (symbol? boolean?) (number?))))
  1682. (new (class object%
  1683. (define/public m
  1684. (opt-lambda (x [y 'a])
  1685. x))
  1686. (super-new)))
  1687. 'pos
  1688. 'neg))
  1689. (test/pos-blame
  1690. 'object-contract-opt->*2
  1691. '(contract (object-contract (m (opt->* (integer?) (symbol? boolean?) (number?))))
  1692. (new (class object%
  1693. (define/public m
  1694. (opt-lambda (x y [z #t])
  1695. x))
  1696. (super-new)))
  1697. 'pos
  1698. 'neg))
  1699. (test/spec-passed
  1700. 'object-contract-opt->*3
  1701. '(contract (object-contract (m (opt->* (integer?) (symbol? boolean?) (number?))))
  1702. (new (class object%
  1703. (define/public m
  1704. (opt-lambda (x [y 'a] [z #t])
  1705. x))
  1706. (super-new)))
  1707. 'pos
  1708. 'neg))
  1709. (test/spec-passed/result
  1710. 'object-contract-opt->*4
  1711. '(send (contract (object-contract (m (opt->* (integer?) (symbol? boolean?) (number?))))
  1712. (new (class object%
  1713. (define/public m
  1714. (opt-lambda (x [y 'a] [z #t])
  1715. x))
  1716. (super-new)))
  1717. 'pos
  1718. 'neg)
  1719. m
  1720. 1)
  1721. 1)
  1722. (test/spec-passed/result
  1723. 'object-contract-opt->*5
  1724. '(send (contract (object-contract (m (opt->* (integer?) (symbol? boolean?) (number?))))
  1725. (new (class object%
  1726. (define/public m
  1727. (opt-lambda (x [y 'a] [z #t])
  1728. x))
  1729. (super-new)))
  1730. 'pos
  1731. 'neg)
  1732. m
  1733. 2
  1734. 'z)
  1735. 2)
  1736. (test/spec-passed/result
  1737. 'object-contract-opt->*7
  1738. '(send (contract (object-contract (m (opt->* (integer?) (symbol? boolean?) (number?))))
  1739. (new (class object%
  1740. (define/public m
  1741. (opt-lambda (x [y 'a] [z #t])
  1742. x))
  1743. (super-new)))
  1744. 'pos
  1745. 'neg)
  1746. m
  1747. 3
  1748. 'z
  1749. #f)
  1750. 3)
  1751. (test/neg-blame
  1752. 'object-contract-opt->*8
  1753. '(send (contract (object-contract (m (opt->* (integer?) (symbol? boolean?) (number?))))
  1754. (new (class object%
  1755. (define/public m
  1756. (opt-lambda (x [y 'a] [z #t])
  1757. x))
  1758. (super-new)))
  1759. 'pos
  1760. 'neg)
  1761. m
  1762. #f))
  1763. (test/neg-blame
  1764. 'object-contract-opt->*9
  1765. '(send (contract (object-contract (m (opt->* (integer?) (symbol? boolean?) (number?))))
  1766. (new (class object%
  1767. (define/public m
  1768. (opt-lambda (x [y 'a] [z #t])
  1769. x))
  1770. (super-new)))
  1771. 'pos
  1772. 'neg)
  1773. m
  1774. 2
  1775. 4))
  1776. (test/neg-blame
  1777. 'object-contract-opt->*10
  1778. '(send (contract (object-contract (m (opt->* (integer?) (symbol? boolean?) (number?))))
  1779. (new (class object%
  1780. (define/public m
  1781. (opt-lambda (x [y 'a] [z #t])
  1782. x))
  1783. (super-new)))
  1784. 'pos
  1785. 'neg)
  1786. m
  1787. 3
  1788. 'z
  1789. 'y))
  1790. (test/pos-blame
  1791. 'object-contract-opt->*11
  1792. '(send (contract (object-contract (m (opt->* (integer?) (symbol? boolean?) (number?))))
  1793. (new (class object%
  1794. (define/public m
  1795. (opt-lambda (x [y 'a] [z #t])
  1796. 'x))
  1797. (super-new)))
  1798. 'pos
  1799. 'neg)
  1800. m
  1801. 3
  1802. 'z
  1803. #f))
  1804. (test/spec-passed/result
  1805. 'object-contract-opt->*12
  1806. '(let-values ([(x y)
  1807. (send (contract (object-contract (m (opt->* (integer?) (symbol? boolean?) (number? symbol?))))
  1808. (new (class object%
  1809. (define/public m
  1810. (opt-lambda (x [y 'a] [z #t])
  1811. (values 1 'x)))
  1812. (super-new)))
  1813. 'pos
  1814. 'neg)
  1815. m
  1816. 3
  1817. 'z
  1818. #f)])
  1819. (cons x y))
  1820. (cons 1 'x))
  1821. (test/pos-blame
  1822. 'object-contract-opt->*13
  1823. '(send (contract (object-contract (m (opt->* (integer?) (symbol? boolean?) (number? symbol?))))
  1824. (new (class object%
  1825. (define/public m
  1826. (opt-lambda (x [y 'a] [z #t])
  1827. (values 'x 'x)))
  1828. (super-new)))
  1829. 'pos
  1830. 'neg)
  1831. m
  1832. 3
  1833. 'z
  1834. #f))
  1835. (test/pos-blame
  1836. 'object-contract-opt->*14
  1837. '(send (contract (object-contract (m (opt->* (integer?) (symbol? boolean?) (number? symbol?))))
  1838. (new (class object%
  1839. (define/public m
  1840. (opt-lambda (x [y 'a] [z #t])
  1841. (values 1 1)))
  1842. (super-new)))
  1843. 'pos
  1844. 'neg)
  1845. m
  1846. 3
  1847. 'z
  1848. #f))
  1849. (test/pos-blame
  1850. 'object-contract->*1
  1851. '(contract (object-contract (m (->* (integer?) (boolean?))))
  1852. (new (class object% (define/public (m x y) x) (super-new)))
  1853. 'pos
  1854. 'neg))
  1855. (test/neg-blame
  1856. 'object-contract->*2
  1857. '(send (contract (object-contract (m (->* (integer?) (boolean?))))
  1858. (new (class object% (define/public (m x) x) (super-new)))
  1859. 'pos
  1860. 'neg)
  1861. m #f))
  1862. (test/pos-blame
  1863. 'object-contract->*3
  1864. '(send (contract (object-contract (m (->* (integer?) (boolean?))))
  1865. (new (class object% (define/public (m x) x) (super-new)))
  1866. 'pos
  1867. 'neg)
  1868. m 1))
  1869. (test/spec-passed
  1870. 'object-contract->*4
  1871. '(send (contract (object-contract (m (->* (integer?) (boolean?))))
  1872. (new (class object% (define/public (m x) #f) (super-new)))
  1873. 'pos
  1874. 'neg)
  1875. m 1))
  1876. (test/pos-blame
  1877. 'object-contract->*5
  1878. '(contract (object-contract (m (->* (integer?) any/c (boolean?))))
  1879. (new (class object% (define/public (m x y . z) x) (super-new)))
  1880. 'pos
  1881. 'neg))
  1882. (test/neg-blame
  1883. 'object-contract->*6
  1884. '(send (contract (object-contract (m (->* (integer?) any/c (boolean?))))
  1885. (new (class object% (define/public (m x . z) x) (super-new)))
  1886. 'pos
  1887. 'neg)
  1888. m #t))
  1889. (test/pos-blame
  1890. 'object-contract->*7
  1891. '(send (contract (object-contract (m (->* (integer?) any/c (boolean?))))
  1892. (new (class object% (define/public (m x . z) 1) (super-new)))
  1893. 'pos
  1894. 'neg)
  1895. m 1))
  1896. (test/spec-passed
  1897. 'object-contract->*8
  1898. '(send (contract (object-contract (m (->* (integer?) any/c (boolean?))))
  1899. (new (class object% (define/public (m x . z) #f) (super-new)))
  1900. 'pos
  1901. 'neg)
  1902. m 1))
  1903. (test/spec-passed
  1904. 'object-contract->*9
  1905. '(send (contract (object-contract (m (->* () (listof number?) (boolean?))))
  1906. (new (class object% (define/public (m . z) #f) (super-new)))
  1907. 'pos
  1908. 'neg)
  1909. m 1 2 3))
  1910. (test/neg-blame
  1911. 'object-contract->*10
  1912. '(send (contract (object-contract (m (->* () (listof number?) (boolean?))))
  1913. (new (class object% (define/public (m . z) #f) (super-new)))
  1914. 'pos
  1915. 'neg)
  1916. m
  1917. #t))
  1918. (test/spec-passed
  1919. 'object-contract->d1
  1920. '(contract (object-contract (m (->d integer? (lambda (x) (lambda (y) (and (integer? y) (= y (+ x 1))))))))
  1921. (new (class object% (define/public (m x) 1) (super-new)))
  1922. 'pos
  1923. 'neg))
  1924. (test/neg-blame
  1925. 'object-contract->d2
  1926. '(send (contract (object-contract (m (->d integer? (lambda (x) (lambda (y) (and (integer? y) (= y (+ x 1))))))))
  1927. (new (class object% (define/public (m x) 1) (super-new)))
  1928. 'pos
  1929. 'neg)
  1930. m #f))
  1931. (test/pos-blame
  1932. 'object-contract->d3
  1933. '(send (contract (object-contract (m (->d integer? (lambda (x) (lambda (y) (and (integer? y) (= y (+ x 1))))))))
  1934. (new (class object% (define/public (m x) 1) (super-new)))
  1935. 'pos
  1936. 'neg)
  1937. m
  1938. 1))
  1939. (test/spec-passed
  1940. 'object-contract->d4
  1941. '(send (contract (object-contract (m (->d integer? (lambda (x) (lambda (y) (and (integer? y) (= y (+ x 1))))))))
  1942. (new (class object% (define/public (m x) 1) (super-new)))
  1943. 'pos
  1944. 'neg)
  1945. m
  1946. 0))
  1947. (test/spec-passed
  1948. 'object-contract->d*1
  1949. '(contract (object-contract (m (->d* (integer? integer?)
  1950. (lambda (x z) (lambda (y) (and (integer? y) (= y (+ x 1))))))))
  1951. (new (class object% (define/public (m x y) 1) (super-new)))
  1952. 'pos
  1953. 'neg))
  1954. (test/neg-blame
  1955. 'object-contract->d*2
  1956. '(send (contract (object-contract (m (->d* (integer? boolean?)
  1957. (lambda (x z) (lambda (y) (and (integer? y) (= y (+ x 1))))))))
  1958. (new (class object% (define/public (m x y) 1) (super-new)))
  1959. 'pos
  1960. 'neg)
  1961. m #f #f))
  1962. (test/neg-blame
  1963. 'object-contract->d*3
  1964. '(send (contract (object-contract (m (->d* (integer? boolean?)
  1965. (lambda (x z) (lambda (y) (and (integer? y) (= y (+ x 1))))))))
  1966. (new (class object% (define/public (m x y) 1) (super-new)))
  1967. 'pos
  1968. 'neg)
  1969. m 1 1))
  1970. (test/pos-blame
  1971. 'object-contract->d*4
  1972. '(send (contract (object-contract (m (->d* (integer? boolean?)
  1973. (lambda (x z) (lambda (y) (and (integer? y) (= y (+ x 1))))))))
  1974. (new (class object% (define/public (m x y) 1) (super-new)))
  1975. 'pos
  1976. 'neg)
  1977. m
  1978. 1
  1979. #t))
  1980. (test/spec-passed
  1981. 'object-contract->d*5
  1982. '(send (contract (object-contract (m (->d* (integer? boolean?)
  1983. (lambda (x z) (lambda (y) (and (integer? y) (= y (+ x 1))))))))
  1984. (new (class object% (define/public (m x y) 1) (super-new)))
  1985. 'pos
  1986. 'neg)
  1987. m
  1988. 0
  1989. #t))
  1990. (test/spec-passed
  1991. 'object-contract->d*6
  1992. '(contract (object-contract (m (->d* (integer? integer?)
  1993. any/c
  1994. (lambda (x z . rst) (lambda (y)
  1995. (= y (length rst)))))))
  1996. (new (class object% (define/public (m x y . z) 2) (super-new)))
  1997. 'pos
  1998. 'neg))
  1999. (test/neg-blame
  2000. 'object-contract->d*7
  2001. '(send (contract (object-contract (m (->d* (integer? boolean?)
  2002. any/c
  2003. (lambda (x z . rst) (lambda (y)
  2004. (= y (length rst)))))))
  2005. (new (class object% (define/public (m x y . z) 2) (super-new)))
  2006. 'pos
  2007. 'neg)
  2008. m 1 1))
  2009. (test/neg-blame
  2010. 'object-contract->d*8
  2011. '(send (contract (object-contract (m (->d* (integer? boolean?)
  2012. any/c
  2013. (lambda (x z . rst) (lambda (y)
  2014. (= y (length rst)))))))
  2015. (new (class object% (define/public (m x y . z) 2) (super-new)))
  2016. 'pos
  2017. 'neg)
  2018. m #t #t))
  2019. (test/neg-blame
  2020. 'object-contract->d*9
  2021. '(send (contract (object-contract (m (->d* (integer? boolean?)
  2022. (listof symbol?)
  2023. (lambda (x z . rst) (lambda (y)
  2024. (= y (length rst)))))))
  2025. (new (class object% (define/public (m x y . z) 2) (super-new)))
  2026. 'pos
  2027. 'neg)
  2028. m #t #t))
  2029. (test/neg-blame
  2030. 'object-contract->d*10
  2031. '(send (contract (object-contract (m (->d* (integer? boolean?)
  2032. (listof symbol?)
  2033. (lambda (x z . rst) (lambda (y)
  2034. (= y (length rst)))))))
  2035. (new (class object% (define/public (m x y . z) 2) (super-new)))
  2036. 'pos
  2037. 'neg)
  2038. m 1 #t #t))
  2039. (test/pos-blame
  2040. 'object-contract->d*11
  2041. '(send (contract (object-contract (m (->d* (integer? boolean?)
  2042. (listof symbol?)
  2043. (lambda (x z . rst) (lambda (y)
  2044. (= y (length rst)))))))
  2045. (new (class object% (define/public (m x y . z) 2) (super-new)))
  2046. 'pos
  2047. 'neg)
  2048. m 1 #t 'x))
  2049. (test/spec-passed
  2050. 'object-contract->d*12
  2051. '(send (contract (object-contract (m (->d* (integer? boolean?)
  2052. (listof symbol?)
  2053. (lambda (x z . rst) (lambda (y)
  2054. (= y (length rst)))))))
  2055. (new (class object% (define/public (m x y . z) 2) (super-new)))
  2056. 'pos
  2057. 'neg)
  2058. m 1 #t 'x 'y))
  2059. (test/spec-passed
  2060. 'object-contract-->r1
  2061. '(send (contract (object-contract (m (case-> (->r ([x number?]) (<=/c x)))))
  2062. (new (class object% (define/public m (lambda (x) (- x 1))) (super-new)))
  2063. 'pos
  2064. 'neg)
  2065. m
  2066. 1))
  2067. (test/spec-passed
  2068. 'object-contract-->r1b
  2069. '(send (contract (object-contract (m (case-> (->r ([x number?]) (<=/c x))
  2070. (-> integer? integer? integer?))))
  2071. (new (class object% (define/public m (case-lambda [(x) (- x 1)] [(x y) x])) (super-new)))
  2072. 'pos
  2073. 'neg)
  2074. m
  2075. 1))
  2076. (test/pos-blame
  2077. 'object-contract-->r2
  2078. '(send (contract (object-contract (m (case-> (->r ([x number?]) (<=/c x)))))
  2079. (new (class object% (define/public m (lambda (x) (+ x 1))) (super-new)))
  2080. 'pos
  2081. 'neg)
  2082. m
  2083. 1))
  2084. (test/pos-blame
  2085. 'object-contract-->r2b
  2086. '(send (contract (object-contract (m (case-> (->r ([x number?]) (<=/c x)) (-> integer? integer? integer?))))
  2087. (new (class object% (define/public m (case-lambda [(x) (+ x 1)] [(x y) y])) (super-new)))
  2088. 'pos
  2089. 'neg)
  2090. m
  2091. 1))
  2092. (test/spec-passed
  2093. 'object-contract-->r3
  2094. '(send (contract (object-contract (m (->r () rst (listof number?) any/c)))
  2095. (new (class object% (define/public m (lambda w 1)) (super-new)))
  2096. 'pos
  2097. 'neg)
  2098. m
  2099. 1))
  2100. (test/neg-blame
  2101. 'object-contract-->r4
  2102. '(send (contract (object-contract (m (->r () rst (listof number?) any/c)))
  2103. (new (class object% (define/public m (lambda w 1)) (super-new)))
  2104. 'pos
  2105. 'neg)
  2106. m
  2107. #f))
  2108. (test/spec-passed
  2109. 'object-contract-->r5
  2110. '(send (contract (object-contract (m (->r () any)))
  2111. (new (class object% (define/public m (lambda () 1)) (super-new)))
  2112. 'pos
  2113. 'neg)
  2114. m))
  2115. (test/spec-passed
  2116. 'object-contract-->r6
  2117. '(send (contract (object-contract (m (->r () (values [x number?] [y (>=/c x)]))))
  2118. (new (class object% (define/public m (lambda () (values 1 2))) (super-new)))
  2119. 'pos
  2120. 'neg)
  2121. m))
  2122. (test/pos-blame
  2123. 'object-contract-->r7
  2124. '(send (contract (object-contract (m (->r () (values [x number?] [y (>=/c x)]))))
  2125. (new (class object% (define/public m (lambda () (values 2 1))) (super-new)))
  2126. 'pos
  2127. 'neg)
  2128. m))
  2129. (test/neg-blame
  2130. 'object-contract-->r/this-1
  2131. '(send (contract (object-contract (m (->r ([x (and/c integer? (lambda (x) (= x (get-field f this))))])
  2132. any)))
  2133. (new (class object% (field [f 1]) (define/public m (lambda (x) 1)) (super-new)))
  2134. 'pos
  2135. 'neg)
  2136. m
  2137. 2))
  2138. (test/spec-passed
  2139. 'object-contract-->r/this-2
  2140. '(send (contract (object-contract (m (->r ([x (and/c integer? (lambda (x) (= x (get-field f this))))])
  2141. any)))
  2142. (new (class object% (field [f 1]) (define/public m (lambda (x) 1)) (super-new)))
  2143. 'pos
  2144. 'neg)
  2145. m
  2146. 1))
  2147. (test/neg-blame
  2148. 'object-contract-->r/this-3
  2149. '(send (contract (object-contract (m (->r ([x (and/c integer? (lambda (x) (= x (get-field f this))))])
  2150. rest-var any/c
  2151. any)))
  2152. (new (class object% (field [f 1]) (define/public m (lambda (x . rest) 1)) (super-new)))
  2153. 'pos
  2154. 'neg)
  2155. m
  2156. 2))
  2157. (test/spec-passed
  2158. 'object-contract-->r/this-4
  2159. '(send (contract (object-contract (m (->r ([x (and/c integer? (lambda (x) (= x (get-field f this))))])
  2160. rest-var any/c
  2161. any)))
  2162. (new (class object% (field [f 1]) (define/public m (lambda (x . rest) 1)) (super-new)))
  2163. 'pos
  2164. 'neg)
  2165. m
  2166. 1))
  2167. (test/spec-passed
  2168. 'object-contract-->pp1
  2169. '(send (contract (object-contract (m (case-> (->pp ([x number?]) #t (<=/c x) unused #t))))
  2170. (new (class object% (define/public m (lambda (x) (- x 1))) (super-new)))
  2171. 'pos
  2172. 'neg)
  2173. m
  2174. 1))
  2175. (test/spec-passed
  2176. 'object-contract-->pp1b
  2177. '(send (contract (object-contract (m (case-> (->pp ([x number?]) #t (<=/c x) unused #t)
  2178. (-> integer? integer? integer?))))
  2179. (new (class object%
  2180. (define/public m (case-lambda [(x) (- x 1)]
  2181. [(x y) y]))
  2182. (super-new)))
  2183. 'pos
  2184. 'neg)
  2185. m
  2186. 1))
  2187. (test/pos-blame
  2188. 'object-contract-->pp2
  2189. '(send (contract (object-contract (m (case-> (->pp ([x number?]) #t (<=/c x) unused #t))))
  2190. (new (class object% (define/public m (lambda (x) (+ x 1))) (super-new)))
  2191. 'pos
  2192. 'neg)
  2193. m
  2194. 1))
  2195. (test/pos-blame
  2196. 'object-contract-->pp2b
  2197. '(send (contract (object-contract (m (case-> (->pp ([x number?]) #t (<=/c x) unused #t)
  2198. (-> integer? integer? integer?))))
  2199. (new (class object%
  2200. (define/public m (case-lambda
  2201. [(x) (+ x 1)]
  2202. [(x y) x]))
  2203. (super-new)))
  2204. 'pos
  2205. 'neg)
  2206. m
  2207. 1))
  2208. (test/spec-passed
  2209. 'object-contract-->pp3
  2210. '(send (contract (object-contract (m (->pp-rest () rst (listof number?) #t any/c unused #t)))
  2211. (new (class object% (define/public m (lambda w 1)) (super-new)))
  2212. 'pos
  2213. 'neg)
  2214. m
  2215. 1))
  2216. (test/neg-blame
  2217. 'object-contract-->pp4
  2218. '(send (contract (object-contract (m (->pp-rest () rst (listof number?) #t any/c unused #t)))
  2219. (new (class object% (define/public m (lambda w 1)) (super-new)))
  2220. 'pos
  2221. 'neg)
  2222. m
  2223. #f))
  2224. (test/spec-passed
  2225. 'object-contract-->pp5
  2226. '(send (contract (object-contract (m (->pp () #t any)))
  2227. (new (class object% (define/public m (lambda () 1)) (super-new)))
  2228. 'pos
  2229. 'neg)
  2230. m))
  2231. (test/spec-passed
  2232. 'object-contract-->pp6
  2233. '(send (contract (object-contract (m (->pp () #t (values [x number?] [y (>=/c x)]) #t)))
  2234. (new (class object% (define/public m (lambda () (values 1 2))) (super-new)))
  2235. 'pos
  2236. 'neg)
  2237. m))
  2238. (test/pos-blame
  2239. 'object-contract-->pp7
  2240. '(send (contract (object-contract (m (->pp () #t (values [x number?] [y (>=/c x)]) #t)))
  2241. (new (class object% (define/public m (lambda () (values 2 1))) (super-new)))
  2242. 'pos
  2243. 'neg)
  2244. m))
  2245. (test/neg-blame
  2246. 'object-contract-->pp/this-1
  2247. '(send (contract (object-contract (m (->pp ()
  2248. (= 1 (get-field f this))
  2249. any/c
  2250. result-x
  2251. (= 2 (get-field f this)))))
  2252. (new (class object% (field [f 2]) (define/public m (lambda () (set! f 3))) (super-new)))
  2253. 'pos
  2254. 'neg)
  2255. m))
  2256. (test/pos-blame
  2257. 'object-contract-->pp/this-2
  2258. '(send (contract (object-contract (m (->pp ()
  2259. (= 1 (get-field f this))
  2260. any/c
  2261. result-x
  2262. (= 2 (get-field f this)))))
  2263. (new (class object% (field [f 1]) (define/public m (lambda () (set! f 3))) (super-new)))
  2264. 'pos
  2265. 'neg)
  2266. m))
  2267. (test/spec-passed
  2268. 'object-contract-->pp/this-3
  2269. '(send (contract (object-contract (m (->pp ()
  2270. (= 1 (get-field f this))
  2271. any/c
  2272. result-x
  2273. (= 2 (get-field f this)))))
  2274. (new (class object% (field [f 1]) (define/public m (lambda () (set! f 2))) (super-new)))
  2275. 'pos
  2276. 'neg)
  2277. m))
  2278. (test/neg-blame
  2279. 'object-contract-->pp/this-4
  2280. '(send (contract (object-contract (m (->pp-rest ()
  2281. rest-id
  2282. any/c
  2283. (= 1 (get-field f this))
  2284. any/c
  2285. result-x
  2286. (= 2 (get-field f this)))))
  2287. (new (class object% (field [f 2]) (define/public m (lambda args (set! f 3))) (super-new)))
  2288. 'pos
  2289. 'neg)
  2290. m))
  2291. (test/pos-blame
  2292. 'object-contract-->pp/this-5
  2293. '(send (contract (object-contract (m (->pp-rest ()
  2294. rest-id
  2295. any/c
  2296. (= 1 (get-field f this))
  2297. any/c
  2298. result-x
  2299. (= 2 (get-field f this)))))
  2300. (new (class object% (field [f 1]) (define/public m (lambda args (set! f 3))) (super-new)))
  2301. 'pos
  2302. 'neg)
  2303. m))
  2304. (test/spec-passed
  2305. 'object-contract-->pp/this-6
  2306. '(send (contract (object-contract (m (->pp-rest ()
  2307. rest-id
  2308. any/c
  2309. (= 1 (get-field f this))
  2310. any/c
  2311. result-x
  2312. (= 2 (get-field f this)))))
  2313. (new (class object% (field [f 1]) (define/public m (lambda args (set! f 2))) (super-new)))
  2314. 'pos
  2315. 'neg)
  2316. m))
  2317. (test/spec-passed/result
  2318. 'object-contract-drop-method1
  2319. '(send (contract (object-contract (m (-> integer? integer?)))
  2320. (new (class object% (define/public (m x) x) (define/public (n x) x) (super-new)))
  2321. 'pos
  2322. 'neg)
  2323. n 1)
  2324. 1)
  2325. (test/spec-passed/result
  2326. 'object-contract-drop-method2
  2327. '(let ([o (contract (object-contract (m (-> integer? integer?)))
  2328. (new (class object% (define/public (m x) x) (define/public (n x) x) (super-new)))
  2329. 'pos
  2330. 'neg)])
  2331. (with-method ([m (o m)]
  2332. [n (o n)])
  2333. (list (m 1) (n 2))))
  2334. '(1 2))
  2335. (test/spec-passed/result
  2336. 'object-contract-drop-field1
  2337. '(get-field g (contract (object-contract (field f integer?))
  2338. (new (class object% (field [f 1] [g 2]) (super-new)))
  2339. 'pos
  2340. 'neg))
  2341. 2)
  2342. (test/spec-passed/result
  2343. 'object-contract-drop-field2
  2344. '(field-bound? g (contract (object-contract (field f integer?))
  2345. (new (class object% (field [f 1] [g 2]) (super-new)))
  2346. 'pos
  2347. 'neg))
  2348. #t)
  2349. (test/spec-passed/result
  2350. 'object-contract-drop-field3
  2351. '(field-names
  2352. (contract (object-contract)
  2353. (new (class object% (field [g 2]) (super-new)))
  2354. 'pos
  2355. 'neg))
  2356. '(g))
  2357. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2358. ;;
  2359. ;; test error message has right format
  2360. ;;
  2361. (test/spec-passed/result
  2362. 'wrong-method-arity-error-message
  2363. '(with-handlers ([exn:fail? exn-message])
  2364. (send (contract (object-contract [m (integer? . -> . integer?)])
  2365. (new (class object% (define/public (m x) x) (super-new)))
  2366. 'pos
  2367. 'neg)
  2368. m
  2369. 1
  2370. 2))
  2371. "procedure m method: expects 1 argument, given 2: 1 2")
  2372. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2373. ;;
  2374. ;; tests object utilities to be sure wrappers work right
  2375. ;;
  2376. (let* ([o1 (contract-eval '(new object%))]
  2377. [o2 (contract-eval `(contract (object-contract) ,o1 'pos 'neg))])
  2378. (test #t (contract-eval 'object=?) o1 o1)
  2379. (test #f (contract-eval 'object=?) o1 (contract-eval '(new object%)))
  2380. (test #t (contract-eval 'object=?) o1 o2)
  2381. (test #t (contract-eval 'object=?) o2 o1)
  2382. (test #f (contract-eval 'object=?) (contract-eval '(new object%)) o2))
  2383. (ctest #t
  2384. method-in-interface?
  2385. 'm
  2386. (object-interface
  2387. (contract
  2388. (object-contract (m (integer? . -> . integer?)))
  2389. (new (class object% (define/public (m x) x) (super-new)))
  2390. 'pos
  2391. 'neg)))
  2392. (let* ([i<%> (contract-eval '(interface ()))]
  2393. [c% (contract-eval `(class* object% (,i<%>) (super-new)))]
  2394. [o (contract-eval `(new ,c%))])
  2395. (test #t (contract-eval 'is-a?) o i<%>)
  2396. (test #t (contract-eval 'is-a?) o c%)
  2397. (test #t (contract-eval 'is-a?) (contract-eval `(contract (object-contract) ,o 'pos 'neg)) i<%>)
  2398. (test #t (contract-eval 'is-a?) (contract-eval `(contract (object-contract) ,o 'pos 'neg)) c%))
  2399. (let ([c% (parameterize ([current-inspector (make-inspector)])
  2400. (contract-eval '(class object% (super-new))))])
  2401. (test (list c% #f)
  2402. 'object-info
  2403. (contract-eval
  2404. `(call-with-values
  2405. (lambda () (object-info (contract (object-contract) (new ,c%) 'pos 'neg)))
  2406. list))))
  2407. ;; object->vector tests
  2408. (let* ([obj
  2409. (parameterize ([current-inspector (make-inspector)])
  2410. (contract-eval '(new (class object% (field [x 1] [y 2]) (super-new)))))]
  2411. [vec (contract-eval `(object->vector ,obj))])
  2412. (test vec
  2413. (contract-eval 'object->vector)
  2414. (contract-eval
  2415. `(contract (object-contract (field x integer?) (field y integer?))
  2416. ,obj
  2417. 'pos
  2418. 'neg))))
  2419. ;
  2420. ;
  2421. ;
  2422. ; ; ; ;
  2423. ; ; ;
  2424. ; ; ; ;
  2425. ; ; ; ;; ;; ; ;; ;; ; ; ;;;; ;;; ; ;; ; ;;;
  2426. ; ; ;; ;; ; ;; ;; ; ; ; ; ; ; ;; ; ; ; ;
  2427. ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
  2428. ; ; ; ; ; ; ; ; ; ; ; ;;;; ; ; ; ;;;;;;
  2429. ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
  2430. ; ; ; ; ; ; ; ; ; ;; ; ; ; ;; ; ; ;
  2431. ; ; ; ; ; ; ; ; ;; ; ;; ;;;;; ; ;; ; ;;;;
  2432. ;
  2433. ;
  2434. ;
  2435. (test/pos-blame
  2436. 'immutable1
  2437. '(let ([ct (contract (listof (boolean? . -> . boolean?))
  2438. #f
  2439. 'pos
  2440. 'neg)])
  2441. ((car ct) 1)))
  2442. (test/neg-blame
  2443. 'immutable2
  2444. '(let ([ct (contract (listof (boolean? . -> . boolean?))
  2445. (list (lambda (x) x))
  2446. 'pos
  2447. 'neg)])
  2448. ((car ct) 1)))
  2449. (test/neg-blame
  2450. 'immutable3
  2451. '(let ([ct (contract (listof (number? . -> . boolean?))
  2452. (list (lambda (x) 1))
  2453. 'pos
  2454. 'neg)])
  2455. ((car ct) #f)))
  2456. (test/pos-blame
  2457. 'immutable4
  2458. '(let ([ct (contract (listof (number? . -> . boolean?))
  2459. (list (lambda (x) 1))
  2460. 'pos
  2461. 'neg)])
  2462. ((car ct) 1)))
  2463. (test/spec-passed
  2464. 'immutable5
  2465. '(let ([ct (contract (listof (number? . -> . boolean?))
  2466. (list (lambda (x) #t))
  2467. 'pos
  2468. 'neg)])
  2469. ((car ct) 1)))
  2470. (test/pos-blame
  2471. 'immutable6
  2472. '(contract (cons/c (boolean? . -> . boolean?) (boolean? . -> . boolean?))
  2473. #f
  2474. 'pos
  2475. 'neg))
  2476. (test/neg-blame
  2477. 'immutable8
  2478. '(let ([ct (contract (cons/c (number? . -> . boolean?) (number? . -> . boolean?))
  2479. (cons (lambda (x) 1) (lambda (x) 1))
  2480. 'pos
  2481. 'neg)])
  2482. ((car ct) #f)))
  2483. (test/neg-blame
  2484. 'immutable9
  2485. '(let ([ct (contract (cons/c (number? . -> . boolean?) (number? . -> . boolean?))
  2486. (cons (lambda (x) 1) (lambda (x) 1))
  2487. 'pos
  2488. 'neg)])
  2489. ((cdr ct) #f)))
  2490. (test/pos-blame
  2491. 'immutable10
  2492. '(let ([ct (contract (cons/c (number? . -> . boolean?) (number? . -> . boolean?))
  2493. (cons (lambda (x) 1) (lambda (x) 1))
  2494. 'pos
  2495. 'neg)])
  2496. ((car ct) 1)))
  2497. (test/pos-blame
  2498. 'immutable11
  2499. '(let ([ct (contract (cons/c (number? . -> . boolean?) (number? . -> . boolean?))
  2500. (cons (lambda (x) 1) (lambda (x) 1))
  2501. 'pos
  2502. 'neg)])
  2503. ((cdr ct) 1)))
  2504. (test/spec-passed
  2505. 'immutable12
  2506. '(let ([ct (contract (cons/c (number? . -> . boolean?) (number? . -> . boolean?))
  2507. (cons (lambda (x) #t) (lambda (x) #t))
  2508. 'pos
  2509. 'neg)])
  2510. ((car ct) 1)))
  2511. (test/spec-passed
  2512. 'immutable13
  2513. '(let ([ct (contract (cons/c (number? . -> . boolean?) (number? . -> . boolean?))
  2514. (cons (lambda (x) #t) (lambda (x) #t))
  2515. 'pos
  2516. 'neg)])
  2517. ((cdr ct) 1)))
  2518. (test/spec-passed/result
  2519. 'immutable14
  2520. '(contract (cons/c number? boolean?)
  2521. (cons 1 #t)
  2522. 'pos
  2523. 'neg)
  2524. (cons 1 #t))
  2525. (test/pos-blame
  2526. 'immutable15
  2527. '(contract (list/c (number? . -> . boolean?) (number? . -> . boolean?))
  2528. #f
  2529. 'pos
  2530. 'neg))
  2531. (test/pos-blame
  2532. 'immutable17
  2533. '(contract (list/c (number? . -> . boolean?) (number? . -> . boolean?))
  2534. (list (lambda (x) #t))
  2535. 'pos
  2536. 'neg))
  2537. (test/pos-blame
  2538. 'immutable18
  2539. '(contract (list/c (number? . -> . boolean?) (number? . -> . boolean?))
  2540. (list (lambda (x) #t) (lambda (x) #t) (lambda (x) #t))
  2541. 'pos
  2542. 'neg))
  2543. (test/spec-passed
  2544. 'immutable19
  2545. '(let ([ctc (contract (list/c (number? . -> . boolean?) (number? . -> . boolean?))
  2546. (list (lambda (x) #t) (lambda (x) #t))
  2547. 'pos
  2548. 'neg)])
  2549. (for-each (lambda (x) (x 1)) ctc)))
  2550. (test/pos-blame
  2551. 'vector-immutable1
  2552. '(contract (vector-immutableof (boolean? . -> . boolean?))
  2553. #f
  2554. 'pos
  2555. 'neg))
  2556. (test/pos-blame
  2557. 'vector-immutable2
  2558. '(contract (vector-immutableof (boolean? . -> . boolean?))
  2559. (vector (lambda (x) x))
  2560. 'pos
  2561. 'neg))
  2562. (test/neg-blame
  2563. 'vector-immutable3
  2564. '(let ([ct (contract (vector-immutableof (number? . -> . boolean?))
  2565. (vector->immutable-vector (vector (lambda (x) 1)))
  2566. 'pos
  2567. 'neg)])
  2568. ((vector-ref ct 0) #f)))
  2569. (test/pos-blame
  2570. 'vector-immutable4
  2571. '(let ([ct (contract (vector-immutableof (number? . -> . boolean?))
  2572. (vector->immutable-vector (vector (lambda (x) 1)))
  2573. 'pos
  2574. 'neg)])
  2575. ((vector-ref ct 0) 1)))
  2576. (test/spec-passed
  2577. 'vector-immutable5
  2578. '(let ([ct (contract (vector-immutableof (number? . -> . boolean?))
  2579. (vector->immutable-vector (vector (lambda (x) #t)))
  2580. 'pos
  2581. 'neg)])
  2582. ((vector-ref ct 0) 1)))
  2583. (test/pos-blame
  2584. 'vector-immutable6
  2585. '(contract (vector-immutable/c (number? . -> . boolean?) (number? . -> . boolean?))
  2586. #f
  2587. 'pos
  2588. 'neg))
  2589. (test/pos-blame
  2590. 'vector-immutable7
  2591. '(contract (vector-immutable/c (number? . -> . boolean?) (number? . -> . boolean?))
  2592. (vector (lambda (x) #t) (lambda (x) #t))
  2593. 'pos
  2594. 'neg))
  2595. (test/pos-blame
  2596. 'vector-immutable8
  2597. '(contract (vector-immutable/c (number? . -> . boolean?) (number? . -> . boolean?))
  2598. (vector->immutable-vector (vector (lambda (x) #t)))
  2599. 'pos
  2600. 'neg))
  2601. (test/pos-blame
  2602. 'vector-immutable9
  2603. '(contract (vector-immutable/c (number? . -> . boolean?) (number? . -> . boolean?))
  2604. (vector->immutable-vector (vector (lambda (x) #t) (lambda (x) #t) (lambda (x) #t)))
  2605. 'pos
  2606. 'neg))
  2607. (test/spec-passed
  2608. 'vector-immutable10
  2609. '(let ([ctc (contract (vector-immutable/c (number? . -> . boolean?) (number? . -> . boolean?))
  2610. (vector->immutable-vector (vector (lambda (x) #t) (lambda (x) #t)))
  2611. 'pos
  2612. 'neg)])
  2613. ((vector-ref ctc 0) 1)
  2614. ((vector-ref ctc 1) 1)))
  2615. (test/spec-passed/result
  2616. 'vector-immutable11
  2617. '(contract (vector-immutable/c number? boolean?)
  2618. (vector->immutable-vector (vector 1 #t))
  2619. 'pos
  2620. 'neg)
  2621. (vector->immutable-vector (vector 1 #t)))
  2622. (test/spec-passed/result
  2623. 'vector-immutable12
  2624. '(immutable? (contract (vector-immutable/c number? boolean?)
  2625. (vector->immutable-vector (vector 1 #t))
  2626. 'pos
  2627. 'neg))
  2628. #t)
  2629. (test/pos-blame
  2630. 'box-immutable1
  2631. '(contract (box-immutable/c (number? . -> . boolean?))
  2632. #f
  2633. 'pos
  2634. 'neg))
  2635. (test/pos-blame
  2636. 'box-immutable2
  2637. '(contract (box-immutable/c (number? . -> . boolean?))
  2638. (box (lambda (x) #t))
  2639. 'pos
  2640. 'neg))
  2641. (test/neg-blame
  2642. 'box-immutable3
  2643. '(let ([ctc (contract (box-immutable/c (number? . -> . boolean?))
  2644. (box-immutable (lambda (x) #t))
  2645. 'pos
  2646. 'neg)])
  2647. ((unbox ctc) #f)))
  2648. (test/pos-blame
  2649. 'box-immutable4
  2650. '(let ([ctc (contract (box-immutable/c (number? . -> . boolean?))
  2651. (box-immutable (lambda (x) 1))
  2652. 'pos
  2653. 'neg)])
  2654. ((unbox ctc) 1)))
  2655. (test/spec-passed
  2656. 'box-immutable5
  2657. '(let ([ctc (contract (box-immutable/c (number? . -> . boolean?))
  2658. (box-immutable (lambda (x) #t))
  2659. 'pos
  2660. 'neg)])
  2661. ((unbox ctc) 1)))
  2662. (test/spec-passed/result
  2663. 'box-immutable6
  2664. '(contract (box-immutable/c boolean?)
  2665. (box-immutable #t)
  2666. 'pos
  2667. 'neg)
  2668. (box-immutable #t))
  2669. (test/spec-passed/result
  2670. 'box-immutable7
  2671. '(immutable? (contract (box-immutable/c boolean?)
  2672. (box-immutable #t)
  2673. 'pos
  2674. 'neg))
  2675. #t)
  2676. (test/pos-blame
  2677. 'promise/c1
  2678. '(force (contract (promise/c boolean?)
  2679. (delay 1)
  2680. 'pos
  2681. 'neg)))
  2682. (test/spec-passed
  2683. 'promise/c2
  2684. '(force (contract (promise/c boolean?)
  2685. (delay #t)
  2686. 'pos
  2687. 'neg)))
  2688. (test/spec-passed/result
  2689. 'promise/c3
  2690. '(let ([x 0])
  2691. (contract (promise/c any/c)
  2692. (delay (set! x (+ x 1)))
  2693. 'pos
  2694. 'neg)
  2695. x)
  2696. 0)
  2697. (test/spec-passed/result
  2698. 'promise/c4
  2699. '(let ([x 0])
  2700. (force (contract (promise/c any/c)
  2701. (delay (set! x (+ x 1)))
  2702. 'pos
  2703. 'neg))
  2704. x)
  2705. 1)
  2706. (test/spec-passed/result
  2707. 'promise/c5
  2708. '(let ([x 0])
  2709. (let ([p (contract (promise/c any/c)
  2710. (delay (set! x (+ x 1)))
  2711. 'pos
  2712. 'neg)])
  2713. (force p)
  2714. (force p))
  2715. x)
  2716. 1)
  2717. (test/pos-blame
  2718. 'syntax/c1
  2719. '(contract (syntax/c boolean?)
  2720. #'x
  2721. 'pos
  2722. 'neg))
  2723. (test/spec-passed
  2724. 'syntax/c2
  2725. '(contract (syntax/c symbol?)
  2726. #'x
  2727. 'pos
  2728. 'neg))
  2729. (test/spec-passed
  2730. 'struct/c1
  2731. '(let ()
  2732. (define-struct s (a))
  2733. (contract (struct/c s integer?)
  2734. (make-s 1)
  2735. 'pos
  2736. 'neg)))
  2737. (test/pos-blame
  2738. 'struct/c2
  2739. '(let ()
  2740. (define-struct s (a))
  2741. (contract (struct/c s integer?)
  2742. (make-s #f)
  2743. 'pos
  2744. 'neg)))
  2745. (test/pos-blame
  2746. 'struct/c3
  2747. '(let ()
  2748. (define-struct s (a))
  2749. (contract (struct/c s integer?)
  2750. 1
  2751. 'pos
  2752. 'neg)))
  2753. (test/spec-passed
  2754. 'struct/c4
  2755. '(let ()
  2756. (define-struct s (a b))
  2757. (contract (struct/c s integer? (struct/c s integer? boolean?))
  2758. (make-s 1 (make-s 2 #t))
  2759. 'pos
  2760. 'neg)))
  2761. (test/pos-blame
  2762. 'struct/c5
  2763. '(let ()
  2764. (define-struct s (a b))
  2765. (contract (struct/c s integer? (struct/c s integer? boolean?))
  2766. (make-s 1 (make-s 2 3))
  2767. 'pos
  2768. 'neg)))
  2769. (test/spec-passed
  2770. 'recursive-contract1
  2771. '(letrec ([ctc (-> integer? (recursive-contract ctc))])
  2772. (letrec ([f (λ (x) f)])
  2773. ((((contract ctc f 'pos 'neg) 1) 2) 3))))
  2774. (test/neg-blame
  2775. 'recursive-contract2
  2776. '(letrec ([ctc (-> integer? (recursive-contract ctc))])
  2777. (letrec ([f (λ (x) f)])
  2778. ((contract ctc f 'pos 'neg) #f))))
  2779. (test/neg-blame
  2780. 'recursive-contract3
  2781. '(letrec ([ctc (-> integer? (recursive-contract ctc))])
  2782. (letrec ([f (λ (x) f)])
  2783. ((((contract ctc f 'pos 'neg) 1) 2) #f))))
  2784. (test/pos-blame
  2785. 'recursive-contract4
  2786. '(letrec ([ctc (-> integer? (recursive-contract ctc))])
  2787. (letrec ([c 0]
  2788. [f (λ (x)
  2789. (set! c (+ c 1))
  2790. (if (= c 2)
  2791. 'nope
  2792. f))])
  2793. ((((contract ctc f 'pos 'neg) 1) 2) 3))))
  2794. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2795. ;;
  2796. ;; define-contract-struct tests
  2797. ;;
  2798. (contract-eval '(define-contract-struct couple (hd tl)))
  2799. (test/spec-passed
  2800. 'd-c-s-match1
  2801. '(begin
  2802. (eval '(module d-c-s-match1 mzscheme
  2803. (require mzlib/contract
  2804. mzlib/match)
  2805. (define-contract-struct foo (bar baz))
  2806. (match (make-foo #t #f)
  2807. [($ foo bar baz) #t]
  2808. [_ #f])))
  2809. (eval '(require 'd-c-s-match1))))
  2810. (test/spec-passed/result
  2811. 'd-c-s-match2
  2812. '(begin
  2813. (eval '(module d-c-s-match2 mzscheme
  2814. (require mzlib/contract
  2815. mzlib/match)
  2816. (define-contract-struct foo (bar baz))
  2817. (provide d-c-s-match2-f1)
  2818. (define d-c-s-match2-f1
  2819. (match (make-foo 'first 'second)
  2820. [($ foo bar baz) (list bar baz)]
  2821. [_ #f]))))
  2822. (eval '(require 'd-c-s-match2))
  2823. (eval 'd-c-s-match2-f1))
  2824. '(first second))
  2825. (test/pos-blame 'd-c-s1
  2826. '(begin
  2827. (eval '(module d-c-s1 mzscheme
  2828. (require mzlib/contract)
  2829. (define-contract-struct couple (hd tl))
  2830. (contract (couple/c any/c any/c) 1 'pos 'neg)))
  2831. (eval '(require 'd-c-s1))))
  2832. (test/spec-passed 'd-c-s2
  2833. '(contract (couple/c any/c any/c) (make-couple 1 2) 'pos 'neg))
  2834. (test/spec-passed 'd-c-s3
  2835. '(contract (couple/c number? number?)
  2836. (make-couple 1 2)
  2837. 'pos 'neg))
  2838. (test/spec-passed 'd-c-s4
  2839. '(couple-hd
  2840. (contract (couple/c number? number?)
  2841. (make-couple 1 2)
  2842. 'pos 'neg)))
  2843. (test/spec-passed 'd-c-s5
  2844. '(couple-tl
  2845. (contract (couple/c number? number?)
  2846. (make-couple 1 2)
  2847. 'pos 'neg)))
  2848. (test/pos-blame
  2849. 'd-c-s6
  2850. '(couple-tl
  2851. (contract (couple/c number?
  2852. number?)
  2853. (make-couple #f 2)
  2854. 'pos 'neg)))
  2855. (test/pos-blame
  2856. 'd-c-s7
  2857. '(couple-hd
  2858. (contract (couple/c number? number?)
  2859. (make-couple #f 2)
  2860. 'pos 'neg)))
  2861. (test/pos-blame
  2862. 'd-c-s8
  2863. '(contract (couple/dc [hd any/c] [tl any/c])
  2864. 1
  2865. 'pos 'neg))
  2866. (test/pos-blame
  2867. 'd-c-s9
  2868. '(contract (couple/dc [hd () any/c] [tl () any/c])
  2869. 1
  2870. 'pos 'neg))
  2871. (test/spec-passed 'd-c-s10
  2872. '(contract (couple/dc [hd any/c] [tl any/c])
  2873. (make-couple 1 2)
  2874. 'pos 'neg))
  2875. (test/spec-passed 'd-c-s11
  2876. '(contract (couple/dc [hd () any/c] [tl () any/c])
  2877. (make-couple 1 2)
  2878. 'pos 'neg))
  2879. (test/spec-passed 'd-c-s12
  2880. '(contract (couple/dc [hd number?]
  2881. [tl number?])
  2882. (make-couple 1 2)
  2883. 'pos 'neg))
  2884. (test/spec-passed 'd-c-s13
  2885. '(couple-hd
  2886. (contract (couple/dc [hd number?]
  2887. [tl number?])
  2888. (make-couple 1 2)
  2889. 'pos 'neg)))
  2890. (test/spec-passed 'd-c-s14
  2891. '(couple-tl
  2892. (contract (couple/dc [hd number?]
  2893. [tl number?])
  2894. (make-couple 1 2)
  2895. 'pos 'neg)))
  2896. (test/pos-blame
  2897. 'd-c-s15
  2898. '(couple-hd
  2899. (contract (couple/dc [hd number?]
  2900. [tl number?])
  2901. (make-couple #f 2)
  2902. 'pos 'neg)))
  2903. (test/pos-blame
  2904. 'd-c-s16
  2905. '(couple-tl
  2906. (contract (couple/dc [hd number?]
  2907. [tl number?])
  2908. (make-couple #f 2)
  2909. 'pos 'neg)))
  2910. (test/spec-passed
  2911. 'd-c-s17
  2912. '(couple-hd
  2913. (contract (couple/dc [hd number?]
  2914. [tl (hd) (>=/c hd)])
  2915. (make-couple 1 2)
  2916. 'pos 'neg)))
  2917. (test/pos-blame
  2918. 'd-c-s18
  2919. '(couple-hd
  2920. (contract (couple/dc [hd number?]
  2921. [tl (hd) (>=/c hd)])
  2922. (make-couple 2 1)
  2923. 'pos 'neg)))
  2924. (test/spec-passed
  2925. 'd-c-s19
  2926. '(couple-tl
  2927. (couple-tl
  2928. (contract (couple/dc [hd number?]
  2929. [tl (hd)
  2930. (let ([hd1 hd])
  2931. (couple/dc [hd (>=/c hd1)]
  2932. [tl (hd) (>=/c hd)]))])
  2933. (make-couple 1 (make-couple 2 3))
  2934. 'pos 'neg))))
  2935. (test/pos-blame
  2936. 'd-c-s20
  2937. '(couple-tl
  2938. (couple-tl
  2939. (contract (couple/dc [hd number?]
  2940. [tl (hd)
  2941. (let ([hd1 hd])
  2942. (couple/dc [hd (>=/c hd1)]
  2943. [tl (hd) (>=/c hd1)]))])
  2944. (make-couple 1 (make-couple 2 0))
  2945. 'pos 'neg))))
  2946. (test/spec-passed
  2947. 'd-c-s21
  2948. '(couple-hd
  2949. (contract (couple/dc [hd number?]
  2950. [tl number?])
  2951. (contract (couple/dc [hd number?]
  2952. [tl number?])
  2953. (make-couple 1 2)
  2954. 'pos 'neg)
  2955. 'pos 'neg)))
  2956. (test/spec-passed
  2957. 'd-c-s22
  2958. '(couple-hd
  2959. (contract (couple/dc [hd (>=/c 0)]
  2960. [tl (>=/c 0)])
  2961. (contract (couple/dc [hd number?]
  2962. [tl number?])
  2963. (make-couple 1 2)
  2964. 'pos 'neg)
  2965. 'pos 'neg)))
  2966. (test/pos-blame
  2967. 'd-c-s23
  2968. '(couple-hd
  2969. (contract (couple/dc [hd (>=/c 0)]
  2970. [tl (>=/c 0)])
  2971. (contract (couple/dc [hd number?]
  2972. [tl number?])
  2973. (make-couple -1 2)
  2974. 'pos 'neg)
  2975. 'pos 'neg)))
  2976. (test/pos-blame
  2977. 'd-c-s24
  2978. '(couple-hd
  2979. (contract (couple/dc [hd number?]
  2980. [tl number?])
  2981. (contract (couple/dc [hd (>=/c 0)]
  2982. [tl (>=/c 0)])
  2983. (make-couple -1 2)
  2984. 'pos 'neg)
  2985. 'pos 'neg)))
  2986. (test/pos-blame
  2987. 'd-c-s25
  2988. '(couple-hd
  2989. (contract (couple/dc [hd number?]
  2990. [tl number?])
  2991. (contract (couple/dc [hd number?]
  2992. [tl number?])
  2993. (contract (couple/dc [hd (>=/c 0)]
  2994. [tl (>=/c 0)])
  2995. (make-couple -1 2)
  2996. 'pos 'neg)
  2997. 'pos 'neg)
  2998. 'pos 'neg)))
  2999. (test/pos-blame
  3000. 'd-c-s26
  3001. '(couple-hd
  3002. (contract (couple/dc [hd (>=/c 10)]
  3003. [tl (>=/c 10)])
  3004. (contract (couple/dc [hd positive?]
  3005. [tl positive?])
  3006. (contract (couple/dc [hd number?]
  3007. [tl number?])
  3008. (make-couple 1 2)
  3009. 'pos 'neg)
  3010. 'pos 'neg)
  3011. 'pos 'neg)))
  3012. ;; test caching
  3013. (test/spec-passed
  3014. 'd-c-s27
  3015. '(let ([ctc (couple/c any/c any/c)])
  3016. (couple-hd (contract ctc (contract ctc (make-couple 1 2) 'pos 'neg) 'pos 'neg))))
  3017. ;; make sure lazy really is lazy
  3018. (test/spec-passed
  3019. 'd-c-s28
  3020. '(contract (couple/c number? number?)
  3021. (make-couple #f #f)
  3022. 'pos 'neg))
  3023. (test/spec-passed
  3024. 'd-c-s29
  3025. '(couple-hd
  3026. (contract (couple/c (couple/c number? number?)
  3027. (couple/c number? number?))
  3028. (make-couple (make-couple #f #f)
  3029. (make-couple #f #f))
  3030. 'pos 'neg)))
  3031. (test/spec-passed
  3032. 'd-c-s30
  3033. '(couple-tl
  3034. (contract (couple/c (couple/c number? number?)
  3035. (couple/c number? number?))
  3036. (make-couple (make-couple #f #f)
  3037. (make-couple #f #f))
  3038. 'pos 'neg)))
  3039. ;; make sure second accesses work
  3040. (test/spec-passed/result
  3041. 'd-c-s31
  3042. '(let ([v (contract (couple/c number? number?)
  3043. (make-couple 1 2)
  3044. 'pos 'neg)])
  3045. (list (couple-hd v) (couple-hd v)))
  3046. (list 1 1))
  3047. (test/pos-blame
  3048. 'd-c-s32
  3049. '(let ([v (contract (couple/c number? boolean?)
  3050. (make-couple 1 2)
  3051. 'pos 'neg)])
  3052. (with-handlers ([void void]) (couple-hd v))
  3053. (couple-hd v)))
  3054. (test/pos-blame
  3055. 'd-c-s33
  3056. '(let ([v (contract (couple/c number? number?)
  3057. (make-couple 1 2)
  3058. 'pos 'neg)])
  3059. (couple-hd v)
  3060. (couple-hd v)
  3061. (couple-hd
  3062. (contract (couple/c boolean? boolean?)
  3063. v
  3064. 'pos 'neg))))
  3065. (contract-eval '(define-contract-struct single (a)))
  3066. ;; a related test to the above:
  3067. (test/spec-passed/result
  3068. 'd-c-s34
  3069. '(let ([v (contract (single/c number?) (make-single 1) 'pos 'neg)])
  3070. (single-a v)
  3071. (let ([v3 (contract (single/c number?) v 'pos 'neg)])
  3072. (single-a v3)))
  3073. 1)
  3074. ;; make sure the caching doesn't break the semantics
  3075. (test/pos-blame
  3076. 'd-c-s35
  3077. '(let ([v (contract (couple/c any/c
  3078. (couple/c any/c
  3079. (couple/c any/c
  3080. number?)))
  3081. (make-couple 1
  3082. (make-couple 2
  3083. (make-couple 3
  3084. #f)))
  3085. 'pos 'neg)])
  3086. (let* ([x (couple-tl v)]
  3087. [y (couple-tl x)])
  3088. (couple-hd (couple-tl x)))))
  3089. (test/spec-passed/result
  3090. 'd-c-s36
  3091. '(let ([x (make-couple 1 2)]
  3092. [y (make-couple 1 2)]
  3093. [c1 (couple/dc [hd any/c]
  3094. [tl (hd) any/c])]
  3095. [c2 (couple/c any/c any/c)])
  3096. (couple-hd (contract c1 x 'pos 'neg))
  3097. (couple-hd (contract c2 x 'pos 'neg))
  3098. (couple-hd (contract c2 y 'pos 'neg))
  3099. (couple-hd (contract c1 y 'pos 'neg)))
  3100. 1)
  3101. ;; make sure that define-contract-struct contracts can go at the top level
  3102. (test/spec-passed
  3103. 'd-c-s37
  3104. '(contract-stronger?
  3105. (couple/dc [hd any/c]
  3106. [tl (hd) any/c])
  3107. (couple/dc [hd any/c]
  3108. [tl (hd) any/c])))
  3109. ;; test functions inside structs
  3110. (test/spec-passed/result
  3111. 'd-c-s38
  3112. '(let ([x (make-couple (lambda (x) x) (lambda (x) x))]
  3113. [c (couple/dc [hd (-> integer? integer?)]
  3114. [tl (hd) any/c])])
  3115. ((couple-hd (contract c x 'pos 'neg)) 1))
  3116. 1)
  3117. (test/neg-blame
  3118. 'd-c-s39
  3119. '(let ([x (make-couple (lambda (x) x) (lambda (x) x))]
  3120. [c (couple/dc [hd (-> integer? integer?)]
  3121. [tl (hd) any/c])])
  3122. ((couple-hd (contract c x 'pos 'neg)) #f)))
  3123. (test/pos-blame
  3124. 'd-c-s40
  3125. '(let ([x (make-couple (lambda (x) #f) (lambda (x) #f))]
  3126. [c (couple/dc [hd (-> integer? integer?)]
  3127. [tl (hd) any/c])])
  3128. ((couple-hd (contract c x 'pos 'neg)) 1)))
  3129. (test/spec-passed/result
  3130. 'd-c-s41
  3131. '(let ([x (make-couple 5 (lambda (x) x))]
  3132. [c (couple/dc [hd number?]
  3133. [tl (hd) (-> (>=/c hd) (>=/c hd))])])
  3134. ((couple-tl (contract c x 'pos 'neg)) 6))
  3135. 6)
  3136. (test/pos-blame
  3137. 'd-c-s42
  3138. '(let ([x (make-couple 5 (lambda (x) -10))]
  3139. [c (couple/dc [hd number?]
  3140. [tl (hd) (-> (>=/c hd) (>=/c hd))])])
  3141. ((couple-tl (contract c x 'pos 'neg)) 6)))
  3142. (test/neg-blame
  3143. 'd-c-s42
  3144. '(let ([x (make-couple 5 (lambda (x) -10))]
  3145. [c (couple/dc [hd number?]
  3146. [tl (hd) (-> (>=/c hd) (>=/c hd))])])
  3147. ((couple-tl (contract c x 'pos 'neg)) -11)))
  3148. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3149. ;;
  3150. ;; testing define-opt/c
  3151. ;;
  3152. (contract-eval '(define-contract-struct node (val obj rank left right) (make-inspector)))
  3153. (contract-eval '(define (compute-rank n)
  3154. (if n
  3155. (node-rank n)
  3156. 0)))
  3157. (contract-eval '(define-opt/c (leftist-heap-greater-than/rank/opt n r)
  3158. (or/c not
  3159. (node/dc [val (>=/c n)]
  3160. [obj any/c]
  3161. [rank (<=/c r)]
  3162. [left (val) (leftist-heap-greater-than/rank/opt val +inf.0)]
  3163. [right (val left) (leftist-heap-greater-than/rank/opt val (compute-rank left))]))))
  3164. (contract-eval '(define leftist-heap/c (leftist-heap-greater-than/rank/opt -inf.0 +inf.0)))
  3165. (test/pos-blame 'd-o/c1 '(contract leftist-heap/c 2 'pos 'neg))
  3166. (test/spec-passed 'd-o/c2 '(contract leftist-heap/c (make-node 1 2 3 #f #f) 'pos 'neg))
  3167. (test/spec-passed 'd-o/c3 '(contract leftist-heap/c #f 'pos 'neg))
  3168. (test/spec-passed 'd-o/c4 '(contract leftist-heap/c (make-node 1 2 3 #f #f) 'pos 'neg))
  3169. (test/spec-passed/result 'd-o/c5
  3170. '(node? (contract leftist-heap/c (make-node 1 2 3 #f #f) 'pos 'neg))
  3171. #t)
  3172. (test/spec-passed/result 'd-o/c6 '(node-val (contract leftist-heap/c (make-node 1 2 3 #f #f) 'pos 'neg)) 1)
  3173. (test/spec-passed/result 'd-o/c7 '(node-obj (contract leftist-heap/c (make-node 1 2 3 #f #f) 'pos 'neg)) 2)
  3174. (test/spec-passed/result 'd-o/c8 '(node-rank (contract leftist-heap/c (make-node 1 2 3 #f #f) 'pos 'neg)) 3)
  3175. (test/spec-passed/result 'd-o/c9 '(node-left (contract leftist-heap/c (make-node 1 2 3 #f #f) 'pos 'neg)) #f)
  3176. (test/spec-passed/result 'd-o/c10 '(node-right (contract leftist-heap/c (make-node 1 2 3 #f #f) 'pos 'neg)) #f)
  3177. (test/spec-passed/result 'd-o/c11
  3178. '(node-val (contract leftist-heap/c
  3179. (contract leftist-heap/c
  3180. (make-node 1 2 3 #f #f)
  3181. 'pos 'neg)
  3182. 'pos 'neg))
  3183. 1)
  3184. (test/spec-passed/result 'd-o/c12
  3185. '(node-obj (contract leftist-heap/c
  3186. (contract leftist-heap/c
  3187. (make-node 1 2 3 #f #f)
  3188. 'pos 'neg)
  3189. 'pos 'neg))
  3190. 2)
  3191. (test/spec-passed/result 'd-o/c13
  3192. '(node-rank (contract leftist-heap/c
  3193. (contract leftist-heap/c
  3194. (make-node 1 2 3 #f #f)
  3195. 'pos 'neg)
  3196. 'pos 'neg))
  3197. 3)
  3198. (test/spec-passed/result 'd-o/c14
  3199. '(node-left (contract leftist-heap/c
  3200. (contract leftist-heap/c
  3201. (make-node 1 2 3 #f #f)
  3202. 'pos 'neg)
  3203. 'pos 'neg))
  3204. #f)
  3205. (test/spec-passed/result 'd-o/c15
  3206. '(node-right (contract leftist-heap/c
  3207. (contract leftist-heap/c
  3208. (make-node 1 2 3 #f #f)
  3209. 'pos 'neg)
  3210. 'pos 'neg))
  3211. #f)
  3212. (test/spec-passed/result 'd-o/c16
  3213. '(let ([h (contract leftist-heap/c (make-node 1 2 3 #f #f) 'pos 'neg)])
  3214. (node-val h)
  3215. (node-val h))
  3216. 1)
  3217. (test/spec-passed/result 'd-o/c17
  3218. '(let ([h (contract leftist-heap/c (make-node 1 2 3 #f #f) 'pos 'neg)])
  3219. (node-obj h)
  3220. (node-obj h))
  3221. 2)
  3222. (test/spec-passed/result 'd-o/c18
  3223. '(let ([h (contract leftist-heap/c (make-node 1 2 3 #f #f)'pos 'neg)])
  3224. (node-rank h)
  3225. (node-rank h))
  3226. 3)
  3227. (test/spec-passed/result 'd-o/c19
  3228. '(let ([h (contract leftist-heap/c (make-node 1 2 3 #f #f) 'pos 'neg)])
  3229. (node-left h)
  3230. (node-left h))
  3231. #f)
  3232. (test/spec-passed/result 'd-o/c20
  3233. '(let ([h (contract leftist-heap/c (make-node 1 2 3 #f #f) 'pos 'neg)])
  3234. (node-right h)
  3235. (node-right h))
  3236. #f)
  3237. (test/spec-passed/result 'd-o/c21
  3238. '(node-val
  3239. (node-right
  3240. (contract leftist-heap/c
  3241. (make-node 1 2 3
  3242. (make-node 7 8 9 #f #f)
  3243. (make-node 4 5 6 #f #f))
  3244. 'pos 'neg)))
  3245. 4)
  3246. (test/spec-passed/result 'd-o/c22
  3247. '(node-val
  3248. (node-left
  3249. (contract leftist-heap/c
  3250. (make-node 1 2 3
  3251. (make-node 7 8 9 #f #f)
  3252. (make-node 4 5 6 #f #f))
  3253. 'pos 'neg)))
  3254. 7)
  3255. (test/pos-blame 'd-o/c23
  3256. '(node-val
  3257. (node-right
  3258. (contract leftist-heap/c
  3259. (make-node 5 2 3
  3260. (make-node 7 8 9 #f #f)
  3261. (make-node 4 5 6 #f #f))
  3262. 'pos 'neg))))
  3263. (test/pos-blame 'd-o/c24
  3264. '(node-val
  3265. (node-left
  3266. (contract leftist-heap/c
  3267. (make-node 9 2 3
  3268. (make-node 7 8 9 #f #f)
  3269. (make-node 11 5 6 #f #f))
  3270. 'pos 'neg))))
  3271. (test/neg-blame 'd-o/c25
  3272. '((contract (-> leftist-heap/c any)
  3273. (λ (kh)
  3274. (node-val
  3275. (node-left
  3276. kh)))
  3277. 'pos 'neg)
  3278. (make-node 9 2 3
  3279. (make-node 7 8 9 #f #f)
  3280. (make-node 11 5 6 #f #f))))
  3281. (test/spec-passed/result
  3282. 'd-o/c26
  3283. '(let ([ai (λ (x) (contract leftist-heap/c x 'pos 'neg))])
  3284. (define (remove-min t) (merge (node-left t) (node-right t)))
  3285. (define (merge t1 t2)
  3286. (cond
  3287. [(not t1) t2]
  3288. [(not t2) t1]
  3289. [#t
  3290. (let ([t1-val (node-val t1)]
  3291. [t2-val (node-val t2)])
  3292. (cond
  3293. [(<= t1-val t2-val)
  3294. (pick t1-val
  3295. (node-obj t1)
  3296. (node-left t1)
  3297. (merge (node-right t1)
  3298. t2))]
  3299. [#t
  3300. (pick t2-val
  3301. (node-obj t2)
  3302. (node-left t2)
  3303. (merge t1
  3304. (node-right t2)))]))]))
  3305. (define (pick x obj a b)
  3306. (let ([ra (compute-rank a)]
  3307. [rb (compute-rank b)])
  3308. (cond
  3309. [(>= ra rb)
  3310. (make-node x obj (+ rb 1) a b)]
  3311. [#t
  3312. (make-node x obj (+ ra 1) b a)])))
  3313. (node-val
  3314. (remove-min (ai (make-node 137 'x 1
  3315. (ai (make-node 178 'y 1
  3316. (make-node 178 'z 1 #f #f)
  3317. #f))
  3318. #f)))))
  3319. 178)
  3320. ;;
  3321. ;; end of define-opt/c
  3322. ;;
  3323. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3324. ;; NOT YET RELEASED
  3325. #;
  3326. (test/pos-blame
  3327. 'd-c-s/attr-1
  3328. '(let ()
  3329. (define-contract-struct pr (x y))
  3330. (pr-x
  3331. (contract (pr/dc [x integer?]
  3332. [y integer?]
  3333. where
  3334. [x-val x]
  3335. [y-val y]
  3336. and
  3337. (= x-val y-val))
  3338. (make-pr 4 5)
  3339. 'pos
  3340. 'neg))))
  3341. ;; NOT YET RELEASED
  3342. #;
  3343. (test/spec-passed
  3344. 'd-c-s/attr-2
  3345. '(let ()
  3346. (define-contract-struct pr (x y))
  3347. (contract (pr/dc [x integer?]
  3348. [y integer?]
  3349. where
  3350. [x-val x]
  3351. [y-val y]
  3352. and
  3353. (= x-val y-val))
  3354. (make-pr 4 5)
  3355. 'pos
  3356. 'neg)))
  3357. ;; NOT YET RELEASED
  3358. #;
  3359. (let ()
  3360. (define-contract-struct node (n l r) (make-inspector))
  3361. (define (get-val n attr)
  3362. (if (null? n)
  3363. 1
  3364. (let ([h (synthesized-value n attr)])
  3365. (if (unknown? h)
  3366. h
  3367. (+ h 1)))))
  3368. (define (full-bbt lo hi)
  3369. (or/c null?
  3370. (node/dc [n (between/c lo hi)]
  3371. [l (n) (full-bbt lo n)]
  3372. [r (n) (full-bbt n hi)]
  3373. where
  3374. [lheight (get-val l lheight)]
  3375. [rheight (get-val r rheight)]
  3376. and
  3377. (<= 0 (- lheight rheight) 1))))
  3378. (define t (contract (full-bbt -inf.0 +inf.0)
  3379. (make-node 0
  3380. (make-node -1 null null)
  3381. (make-node 2
  3382. (make-node 1 null null)
  3383. (make-node 3 null null)))
  3384. 'pos
  3385. 'neg))
  3386. (test/spec-passed
  3387. 'd-c-s/attr-3
  3388. `(,node-l (,node-l ,t)))
  3389. (test/pos-blame
  3390. 'd-c-s/attr-4
  3391. `(,node-r (,node-r (,node-r ,t)))))
  3392. ;; NOT YET RELEASED
  3393. #|
  3394. need a test that will revisit a node a second time (when it already has a wrapper)
  3395. with a new parent. make sure the new parent is recorded in the parents field
  3396. so that propagation occurs.
  3397. |#
  3398. ;; test the predicate
  3399. (ctest #t couple? (contract (couple/c any/c any/c) (make-couple 1 2) 'pos 'neg))
  3400. (ctest #t couple? (make-couple 1 2))
  3401. (ctest #t couple? (contract (couple/dc [hd any/c] [tl (hd) any/c]) (make-couple 1 2) 'pos 'neg))
  3402. (ctest #f couple? 1)
  3403. (ctest #f couple? #f)
  3404. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3405. ;; ;;
  3406. ;; Flat Contract Tests ;;
  3407. ;; ;;
  3408. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3409. (ctest #t flat-contract? (or/c))
  3410. (ctest #t flat-contract? (or/c integer? (lambda (x) (> x 0))))
  3411. (ctest #t flat-contract? (or/c (flat-contract integer?) (flat-contract boolean?)))
  3412. (ctest #t flat-contract? (or/c integer? boolean?))
  3413. (test-flat-contract '(or/c (flat-contract integer?) char?) #\a #t)
  3414. (test-flat-contract '(or/c (flat-contract integer?) char?) 1 #t)
  3415. (ctest #t flat-contract? (and/c))
  3416. (ctest #t flat-contract? (and/c number? integer?))
  3417. (ctest #t flat-contract? (and/c (flat-contract number?)
  3418. (flat-contract integer?)))
  3419. (ctest #t flat-contract? (let ()
  3420. (define-struct s (a b))
  3421. (struct/c s any/c any/c)))
  3422. (test-flat-contract '(and/c number? integer?) 1 3/2)
  3423. (test-flat-contract '(not/c integer?) #t 1)
  3424. (test-flat-contract '(=/c 2) 2 3)
  3425. (test-flat-contract '(>=/c 5) 5 0)
  3426. (test-flat-contract '(<=/c 5) 5 10)
  3427. (test-flat-contract '(</c 5) 0 5)
  3428. (test-flat-contract '(>/c 5) 10 5)
  3429. (test-flat-contract '(integer-in 0 10) 0 11)
  3430. (test-flat-contract '(integer-in 0 10) 10 3/2)
  3431. (test-flat-contract '(integer-in 0 10) 1 1.0)
  3432. (test-flat-contract '(real-in 1 10) 3/2 20)
  3433. (test-flat-contract '(string/len 3) "ab" "abc")
  3434. (test-flat-contract 'natural-number/c 5 -1)
  3435. (test-flat-contract 'false/c #f #t)
  3436. (test/spec-passed 'any/c '(contract any/c 1 'pos 'neg))
  3437. (test-flat-contract 'printable/c (vector (cons 1 (box #f))) (lambda (x) x))
  3438. (test-flat-contract '(symbols 'a 'b 'c) 'a 'd)
  3439. (test-flat-contract '(one-of/c (expt 2 65)) (expt 2 65) 12)
  3440. (test-flat-contract '(one-of/c '#:x '#:z) '#:x '#:y)
  3441. (let ([c% (contract-eval '(class object% (super-new)))])
  3442. (test-flat-contract `(subclass?/c ,c%) c% (contract-eval `object%))
  3443. (test-flat-contract `(subclass?/c ,c%) (contract-eval `(class ,c%)) (contract-eval `(class object%))))
  3444. (let ([i<%> (contract-eval '(interface ()))])
  3445. (test-flat-contract `(implementation?/c ,i<%>)
  3446. (contract-eval `(class* object% (,i<%>) (super-new)))
  3447. (contract-eval 'object%))
  3448. (test-flat-contract `(implementation?/c ,i<%>)
  3449. (contract-eval `(class* object% (,i<%>) (super-new)))
  3450. #f))
  3451. (let ([i<%> (contract-eval '(interface ()))]
  3452. [c% (contract-eval '(class object% (super-new)))])
  3453. (test-flat-contract `(is-a?/c ,i<%>)
  3454. (contract-eval `(new (class* object% (,i<%>) (super-new))))
  3455. (contract-eval '(new object%)))
  3456. (test-flat-contract `(is-a?/c ,c%)
  3457. (contract-eval `(new ,c%))
  3458. (contract-eval '(new object%))))
  3459. (test-flat-contract '(listof boolean?) (list #t #f) (list #f 3 #t))
  3460. (test-flat-contract '(listof any/c) (list #t #f) 3)
  3461. (test-flat-contract '(vectorof boolean?) (vector #t #f) (vector #f 3 #t))
  3462. (test-flat-contract '(vectorof any/c) (vector #t #f) 3)
  3463. (test-flat-contract '(vector/c boolean? (flat-contract integer?)) (vector #t 1) (vector 1 #f))
  3464. (test-flat-contract '(vector/c boolean? (flat-contract integer?)) (vector #t 1) #f)
  3465. (test-flat-contract '(cons/c boolean? (flat-contract integer?)) (cons #t 1) (cons 1 #f))
  3466. (test-flat-contract '(cons/c boolean? (flat-contract integer?)) (cons #t 1) #f)
  3467. (test-flat-contract '(list/c boolean? (flat-contract integer?)) (list #t 1) (list 1 #f))
  3468. (test-flat-contract '(list/c boolean? (flat-contract integer?)) (list #t 1) #f)
  3469. (contract-eval '(define (a-predicate-that-wont-be-optimized x) (boolean? x)))
  3470. (test-flat-contract '(cons/c a-predicate-that-wont-be-optimized (flat-contract integer?)) (cons #t 1) (cons 1 #f))
  3471. (test-flat-contract '(cons/c a-predicate-that-wont-be-optimized (flat-contract integer?)) (cons #t 1) #f)
  3472. (test-flat-contract '(list/c a-predicate-that-wont-be-optimized (flat-contract integer?)) (list #t 1) (list 1 #f))
  3473. (test-flat-contract '(list/c a-predicate-that-wont-be-optimized (flat-contract integer?)) (list #t 1) #f)
  3474. (test-flat-contract '(box/c boolean?) (box #f) (box 1))
  3475. (test-flat-contract '(box/c (flat-contract boolean?)) (box #t) #f)
  3476. (test-flat-contract '(flat-rec-contract sexp (cons/c sexp sexp) number?) '(1 2 . 3) '(1 . #f))
  3477. (test-flat-contract '(flat-murec-contract ([even1 (or/c null? (cons/c number? even2))]
  3478. [even2 (cons/c number? even1)])
  3479. even1)
  3480. '(1 2 3 4)
  3481. '(1 2 3))
  3482. (test #t 'malformed-binder
  3483. (with-handlers ((exn? exn:fail:syntax?))
  3484. (contract-eval '(flat-murec-contract ([(x) y]) x))
  3485. 'no-err))
  3486. (test #t 'missing-body
  3487. (with-handlers ((exn? exn:fail:syntax?))
  3488. (contract-eval '(flat-murec-contract ([x y])))
  3489. 'no-err))
  3490. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3491. ;; ;;
  3492. ;; case-> arity checking tests ;;
  3493. ;; ;;
  3494. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3495. (test/well-formed '(case-> (-> integer? integer?)))
  3496. (test/well-formed '(case-> (-> integer? integer?) (-> integer? integer? integer?)))
  3497. (test/well-formed '(case-> (-> integer? integer?) (-> integer? integer? any)))
  3498. (test/well-formed '(case-> (-> integer? any) (-> integer? integer? any)))
  3499. (test/well-formed '(case-> (->d (lambda x any/c)) (-> integer? integer?)))
  3500. (test/well-formed '(case-> (->* (any/c any/c) (integer?)) (-> integer? integer?)))
  3501. (test/well-formed '(case-> (->* (any/c any/c) any/c (integer?)) (-> integer? integer?)))
  3502. (test/well-formed '(case-> (->* (any/c any/c) any/c any) (-> integer? integer?)))
  3503. (test/well-formed '(case-> (->d* (any/c any/c) (lambda x any/c)) (-> integer? integer?)))
  3504. (test/well-formed '(case-> (->d* (any/c any/c) any/c (lambda x any/c)) (-> integer? integer?)))
  3505. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3506. ;; ;;
  3507. ;; Inferred Name Tests ;;
  3508. ;; ;;
  3509. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3510. (contract-eval
  3511. '(module contract-test-suite-inferred-name1 mzscheme
  3512. (require mzlib/contract)
  3513. (define contract-inferred-name-test-contract (-> integer? any))
  3514. (define (contract-inferred-name-test x) #t)
  3515. (provide/contract (contract-inferred-name-test contract-inferred-name-test-contract))
  3516. (define (contract-inferred-name-test2 x) x)
  3517. (provide/contract (contract-inferred-name-test2 (-> number? number?)))
  3518. (define (contract-inferred-name-test2b x) (values x x))
  3519. (provide/contract (contract-inferred-name-test2b (-> number? (values number? number?))))
  3520. (define (contract-inferred-name-test3 x . y) x)
  3521. (provide/contract (contract-inferred-name-test3 (->* (number?) (listof number?) (number?))))
  3522. (define contract-inferred-name-test4
  3523. (case-lambda [(x) x]
  3524. [(x y) x]))
  3525. (provide/contract (contract-inferred-name-test4 (case-> (->* (number?) (number?))
  3526. (-> integer? integer? integer?))))
  3527. (define contract-inferred-name-test5 (case-lambda [(x) x] [(x y) x]))
  3528. (provide/contract (contract-inferred-name-test5 (case-> (-> number? number?)
  3529. (-> number? number? number?))))
  3530. (define contract-inferred-name-test6 (case-lambda [(x) x]
  3531. [(x y) y]))
  3532. (provide/contract (contract-inferred-name-test6 (opt-> (number?) (number?) number?)))
  3533. (define contract-inferred-name-test7 (case-lambda [(x) (values x x)]
  3534. [(x y) (values y y)]))
  3535. (provide/contract (contract-inferred-name-test7 (opt->* (number?) (number?) (number? number?))))))
  3536. (contract-eval '(require 'contract-test-suite-inferred-name1))
  3537. ;; (eval '(test 'contract-inferred-name-test object-name contract-inferred-name-test)) ;; this one can't be made to pass, sadly.
  3538. (test 'contract-inferred-name-test2 object-name (contract-eval 'contract-inferred-name-test2))
  3539. (test 'contract-inferred-name-test2b object-name (contract-eval 'contract-inferred-name-test2b))
  3540. (test 'contract-inferred-name-test3 object-name (contract-eval 'contract-inferred-name-test3))
  3541. (test 'contract-inferred-name-test4 object-name (contract-eval 'contract-inferred-name-test4))
  3542. (test 'contract-inferred-name-test5 object-name (contract-eval 'contract-inferred-name-test5))
  3543. (test 'contract-inferred-name-test6 object-name (contract-eval 'contract-inferred-name-test6))
  3544. (test 'contract-inferred-name-test7 object-name (contract-eval 'contract-inferred-name-test7))
  3545. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3546. ;; ;;
  3547. ;; Contract Name Tests ;;
  3548. ;; ;;
  3549. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3550. (test-name 'integer? (flat-contract integer?))
  3551. (test-name 'boolean? (flat-contract boolean?))
  3552. (test-name 'char? (flat-contract char?))
  3553. (test-name 'any/c any/c)
  3554. (test-name '(-> integer? integer?) (-> integer? integer?))
  3555. (test-name '(-> integer? any) (-> integer? any))
  3556. (test-name '(-> integer? (values boolean? char?)) (-> integer? (values boolean? char?)))
  3557. (test-name '(-> integer? boolean? (values char? any/c)) (->* (integer? boolean?) (char? any/c)))
  3558. (test-name '(-> integer? boolean? any) (->* (integer? boolean?) any))
  3559. (test-name '(->* (integer?) boolean? (char? any/c)) (->* (integer?) boolean? (char? any/c)))
  3560. (test-name '(->* (integer? char?) boolean? any) (->* (integer? char?) boolean? any))
  3561. (test-name '(->d integer? boolean? ...) (->d integer? boolean? (lambda (x y) char?)))
  3562. (test-name '(->d* (integer? boolean?) ...) (->d* (integer? boolean?) (lambda (x y) char?)))
  3563. (test-name '(->d* (integer? boolean?) any/c ...) (->d* (integer? boolean?) any/c (lambda (x y . z) char?)))
  3564. (test-name '(->r ((x ...)) ...) (->r ((x number?)) number?))
  3565. (test-name '(->r ((x ...) (y ...) (z ...)) ...) (->r ((x number?) (y boolean?) (z pair?)) number?))
  3566. (test-name '(->r ((x ...) (y ...) (z ...)) rest-x ... ...)
  3567. (->r ((x number?) (y boolean?) (z pair?)) rest-x any/c number?))
  3568. (test-name '(->pp ((x ...)) ...) (->pp ((x number?)) #t number? blech #t))
  3569. (test-name '(->r ((x ...)) ...) (case-> (->r ((x number?)) number?)))
  3570. (test-name '(case-> (->r ((x ...)) ...) (-> integer? integer? integer?))
  3571. (case-> (->r ((x number?)) number?) (-> integer? integer? integer?)))
  3572. (test-name '(->r ((x ...) (y ...) (z ...)) ...)
  3573. (case-> (->r ((x number?) (y boolean?) (z pair?)) number?)))
  3574. (test-name '(case-> (->r ((x ...) (y ...) (z ...)) ...)
  3575. (-> integer? integer? integer?))
  3576. (case-> (->r ((x number?) (y boolean?) (z pair?)) number?)
  3577. (-> integer? integer? integer?)))
  3578. (test-name '(case->) (case->))
  3579. (test-name '(case-> (-> integer? integer?) (-> integer? integer? integer?))
  3580. (case-> (-> integer? integer?) (-> integer? integer? integer?)))
  3581. (test-name '(unconstrained-domain-> number?) (unconstrained-domain-> number?))
  3582. (test-name '(or/c) (or/c))
  3583. (test-name '(or/c integer? gt0?) (or/c integer? (let ([gt0? (lambda (x) (> x 0))]) gt0?)))
  3584. (test-name '(or/c integer? boolean?)
  3585. (or/c (flat-contract integer?)
  3586. (flat-contract boolean?)))
  3587. (test-name '(or/c integer? boolean?)
  3588. (or/c integer? boolean?))
  3589. (test-name '(or/c (-> (>=/c 5) (>=/c 5)) boolean?)
  3590. (or/c (-> (>=/c 5) (>=/c 5)) boolean?))
  3591. (test-name '(or/c (-> (>=/c 5) (>=/c 5)) boolean?)
  3592. (or/c boolean? (-> (>=/c 5) (>=/c 5))))
  3593. (test-name '(or/c (-> (>=/c 5) (>=/c 5))
  3594. (-> (<=/c 5) (<=/c 5) (<=/c 5)))
  3595. (or/c (-> (>=/c 5) (>=/c 5))
  3596. (-> (<=/c 5) (<=/c 5) (<=/c 5))))
  3597. (test-name '(or/c boolean?
  3598. (-> (>=/c 5) (>=/c 5))
  3599. (-> (<=/c 5) (<=/c 5) (<=/c 5)))
  3600. (or/c boolean?
  3601. (-> (>=/c 5) (>=/c 5))
  3602. (-> (<=/c 5) (<=/c 5) (<=/c 5))))
  3603. (test-name 'any/c (and/c))
  3604. (test-name '(and/c any/c) (and/c any/c))
  3605. (test-name '(and/c any/c any/c) (and/c any/c any/c))
  3606. (test-name '(and/c number? integer?) (and/c number? integer?))
  3607. (test-name '(and/c number? integer?) (and/c (flat-contract number?)
  3608. (flat-contract integer?)))
  3609. (test-name '(and/c number? (-> integer? integer?)) (and/c number? (-> integer? integer?)))
  3610. (test-name '(and/c (-> boolean? boolean?) (-> integer? integer?)) (and/c (-> boolean? boolean?) (-> integer? integer?)))
  3611. (test-name '(not/c integer?) (not/c integer?))
  3612. (test-name '(=/c 5) (=/c 5))
  3613. (test-name '(>=/c 5) (>=/c 5))
  3614. (test-name '(<=/c 5) (<=/c 5))
  3615. (test-name '(</c 5) (</c 5))
  3616. (test-name '(>/c 5) (>/c 5))
  3617. (test-name '(between/c 5 6) (between/c 5 6))
  3618. (test-name '(integer-in 0 10) (integer-in 0 10))
  3619. (test-name '(between/c 1 10) (real-in 1 10))
  3620. (test-name '(string-len/c 3) (string/len 3))
  3621. (test-name 'natural-number/c natural-number/c)
  3622. (test-name #f false/c)
  3623. (test-name 'printable/c printable/c)
  3624. (test-name '(symbols 'a 'b 'c) (symbols 'a 'b 'c))
  3625. (test-name '(one-of/c 1 2 3) (one-of/c 1 2 3))
  3626. (test-name '(one-of/c '() 'x 1 #f #\a (void) (letrec ([x x]) x))
  3627. (one-of/c '() 'x 1 #f #\a (void) (letrec ([x x]) x)))
  3628. (test-name '(subclass?/c class:c%)
  3629. (let ([c% (class object% (super-new))]) (subclass?/c c%)))
  3630. (test-name '(implementation?/c interface:i<%>)
  3631. (let ([i<%> (interface ())])
  3632. (implementation?/c i<%>)))
  3633. (test-name '(is-a?/c interface:i<%>)
  3634. (let ([i<%> (interface ())])
  3635. (is-a?/c i<%>)))
  3636. (test-name '(is-a?/c class:c%)
  3637. (let ([i<%> (interface ())]
  3638. [c% (class object% (super-new))])
  3639. (is-a?/c c%)))
  3640. (test-name '(listof boolean?) (listof boolean?))
  3641. (test-name '(listof any/c) (listof any/c))
  3642. (test-name '(listof boolean?) (listof boolean?))
  3643. (test-name '(listof any/c) (listof any/c))
  3644. (test-name '(listof boolean?) (listof boolean?))
  3645. (test-name '(listof (-> boolean? boolean?)) (listof (-> boolean? boolean?)))
  3646. (test-name '(vectorof boolean?) (vectorof boolean?))
  3647. (test-name '(vectorof any/c) (vectorof any/c))
  3648. (test-name '(vector/c boolean? integer?) (vector/c boolean? integer?))
  3649. (test-name '(vector/c boolean? integer?) (vector/c boolean? (flat-contract integer?)))
  3650. (test-name '(cons/c boolean? integer?) (cons/c boolean? (flat-contract integer?)))
  3651. (test-name '(cons/c boolean? integer?) (cons/c boolean? (flat-contract integer?)))
  3652. (test-name '(list/c boolean? integer?) (list/c boolean? (flat-contract integer?)))
  3653. (test-name '(list/c boolean? integer?) (list/c boolean? (flat-contract integer?)))
  3654. (test-name '(cons/c boolean? integer?) (cons/c boolean? (flat-contract integer?)))
  3655. (test-name '(cons/c boolean? integer?) (cons/c boolean? (flat-contract integer?)))
  3656. (test-name '(cons/c boolean? integer?) (cons/c boolean? (flat-contract integer?)))
  3657. (test-name '(cons/c (-> boolean? boolean?) integer?) (cons/c (-> boolean? boolean?) integer?))
  3658. (test-name '(list/c boolean? integer?)
  3659. (list/c boolean? (flat-contract integer?)))
  3660. (test-name '(list/c boolean? integer?)
  3661. (list/c boolean? (flat-contract integer?)))
  3662. (test-name '(list/c boolean? integer?)
  3663. (list/c boolean? (flat-contract integer?)))
  3664. (test-name '(list/c (-> boolean? boolean?) integer?)
  3665. (list/c (-> boolean? boolean?) integer?))
  3666. (test-name '(parameter/c integer?) (parameter/c integer?))
  3667. (test-name '(box/c boolean?) (box/c boolean?))
  3668. (test-name '(box/c boolean?) (box/c (flat-contract boolean?)))
  3669. (test-name 'the-name (flat-rec-contract the-name))
  3670. (test-name '(object-contract) (object-contract))
  3671. (test-name '(object-contract (field x integer?)) (object-contract (field x integer?)))
  3672. (test-name '(object-contract (m (-> integer? integer?)))
  3673. (object-contract (m (-> integer? integer?))))
  3674. (test-name '(object-contract (m (-> integer? any)))
  3675. (object-contract (m (-> integer? any))))
  3676. (test-name '(object-contract (m (-> integer? (values integer? integer?))))
  3677. (object-contract (m (-> integer? (values integer? integer?)))))
  3678. (test-name '(object-contract (m (case-> (-> integer? integer? integer?)
  3679. (-> integer? (values integer? integer?)))))
  3680. (object-contract (m (case->
  3681. (-> integer? integer? integer?)
  3682. (-> integer? (values integer? integer?))))))
  3683. (test-name
  3684. '(object-contract (m (case-> (-> integer? symbol?)
  3685. (-> integer? boolean? symbol?)
  3686. (-> integer? boolean? number? symbol?))))
  3687. (object-contract (m (opt->* (integer?) (boolean? number?) (symbol?)))))
  3688. (test-name
  3689. '(object-contract (m (case-> (-> integer? symbol?)
  3690. (-> integer? boolean? symbol?)
  3691. (-> integer? boolean? number? symbol?))))
  3692. (object-contract (m (opt-> (integer?) (boolean? number?) symbol?))))
  3693. (test-name
  3694. '(object-contract (m (case-> (-> integer? any)
  3695. (-> integer? boolean? any)
  3696. (-> integer? boolean? number? any))))
  3697. (object-contract (m (opt->* (integer?) (boolean? number?) any))))
  3698. (test-name
  3699. '(object-contract (m (case-> (-> integer? (values symbol? boolean?))
  3700. (-> integer? boolean? (values symbol? boolean?)))))
  3701. (object-contract (m (opt->* (integer?) (boolean?) (symbol? boolean?)))))
  3702. (test-name '(object-contract (m (->r ((x ...)) ...))) (object-contract (m (->r ((x number?)) number?))))
  3703. (test-name '(object-contract (m (->r ((x ...) (y ...) (z ...)) ...)))
  3704. (object-contract (m (->r ((x number?) (y boolean?) (z pair?)) number?))))
  3705. (test-name '(object-contract (m (->r ((x ...) (y ...) (z ...)) rest-x ... ...)))
  3706. (object-contract (m (->r ((x number?) (y boolean?) (z pair?)) rest-x any/c number?))))
  3707. (test-name '(promise/c any/c) (promise/c any/c))
  3708. (test-name '(syntax/c any/c) (syntax/c any/c))
  3709. (test-name '(struct/c st integer?)
  3710. (let ()
  3711. (define-struct st (a))
  3712. (struct/c st integer?)))
  3713. (test-name '(recursive-contract (box/c boolean?)) (recursive-contract (box/c boolean?)))
  3714. (test-name '(recursive-contract x) (let ([x (box/c boolean?)]) (recursive-contract x)))
  3715. (test-name '(couple/c any/c any/c)
  3716. (couple/c any/c any/c))
  3717. (test-name '(couple/c any/c any/c)
  3718. (couple/dc [hd any/c] [tl any/c]))
  3719. (test-name '(couple/dc [hd any/c] [tl ...])
  3720. (couple/dc [hd any/c] [tl (hd) any/c]))
  3721. ;; NOT YET RELEASED
  3722. #;
  3723. (test-name '(pr/dc [x integer?]
  3724. [y integer?]
  3725. where
  3726. [x-val ...]
  3727. [y-val ...]
  3728. and
  3729. ...)
  3730. (let ()
  3731. (define-contract-struct pr (x y))
  3732. (pr/dc [x integer?]
  3733. [y integer?]
  3734. where
  3735. [x-val x]
  3736. [y-val y]
  3737. and
  3738. (= x-val y-val))))
  3739. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3740. ;;
  3741. ;; stronger tests
  3742. ;;
  3743. (ctest #t contract-stronger? any/c any/c)
  3744. (ctest #t contract-stronger? (between/c 1 3) (between/c 0 4))
  3745. (ctest #f contract-stronger? (between/c 0 4) (between/c 1 3))
  3746. (ctest #t contract-stronger? (>=/c 3) (>=/c 2))
  3747. (ctest #f contract-stronger? (>=/c 2) (>=/c 3))
  3748. (ctest #f contract-stronger? (<=/c 3) (<=/c 2))
  3749. (ctest #t contract-stronger? (<=/c 2) (<=/c 3))
  3750. (ctest #f contract-stronger? (recursive-contract (<=/c 2)) (recursive-contract (<=/c 3)))
  3751. (ctest #f contract-stronger? (recursive-contract (<=/c 3)) (recursive-contract (<=/c 2)))
  3752. (let ([f (contract-eval '(λ (x) (recursive-contract (<=/c x))))])
  3753. (test #t (contract-eval 'contract-stronger?) (contract-eval `(,f 1)) (contract-eval `(,f 1))))
  3754. (ctest #t contract-stronger? (-> integer? integer?) (-> integer? integer?))
  3755. (ctest #f contract-stronger? (-> boolean? boolean?) (-> integer? integer?))
  3756. (ctest #t contract-stronger? (-> (>=/c 3) (>=/c 3)) (-> (>=/c 4) (>=/c 3)))
  3757. (ctest #f contract-stronger? (-> (>=/c 4) (>=/c 3)) (-> (>=/c 3) (>=/c 3)))
  3758. (ctest #t contract-stronger? (-> (>=/c 3) (>=/c 3)) (-> (>=/c 3) (>=/c 2)))
  3759. (ctest #f contract-stronger? (-> (>=/c 3) (>=/c 2)) (-> (>=/c 3) (>=/c 3)))
  3760. (ctest #f contract-stronger? (-> (>=/c 2)) (-> (>=/c 3) (>=/c 3)))
  3761. (ctest #t contract-stronger? (or/c null? any/c) (or/c null? any/c))
  3762. (ctest #f contract-stronger? (or/c null? any/c) (or/c boolean? any/c))
  3763. (ctest #t contract-stronger? (or/c null? boolean?) (or/c null? boolean?))
  3764. (ctest #f contract-stronger? (or/c null? boolean?) (or/c boolean? null?))
  3765. (ctest #t contract-stronger? (or/c null? (-> integer? integer?)) (or/c null? (-> integer? integer?)))
  3766. (ctest #f contract-stronger? (or/c null? (-> boolean? boolean?)) (or/c null? (-> integer? integer?)))
  3767. (ctest #t contract-stronger? number? number?)
  3768. (ctest #f contract-stronger? boolean? number?)
  3769. (ctest #t contract-stronger? (parameter/c (between/c 0 5)) (parameter/c (between/c 0 5)))
  3770. (ctest #f contract-stronger? (parameter/c (between/c 0 5)) (parameter/c (between/c 1 4)))
  3771. (ctest #f contract-stronger? (parameter/c (between/c 1 4)) (parameter/c (between/c 0 5)))
  3772. (ctest #t contract-stronger? (symbols 'x 'y) (symbols 'x 'y 'z))
  3773. (ctest #f contract-stronger? (symbols 'x 'y 'z) (symbols 'x 'y))
  3774. (ctest #t contract-stronger? (symbols 'x 'y) (symbols 'z 'x 'y))
  3775. (ctest #f contract-stronger? (symbols 'z 'x 'y) (symbols 'x 'y))
  3776. (ctest #t contract-stronger? (one-of/c (expt 2 100)) (one-of/c (expt 2 100) 12))
  3777. (ctest #t contract-stronger?
  3778. (or/c (-> (>=/c 3) (>=/c 3)) (-> string?))
  3779. (or/c (-> (>=/c 4) (>=/c 3)) (-> string?)))
  3780. (ctest #f contract-stronger?
  3781. (or/c (-> string?) (-> integer? integer?))
  3782. (or/c (-> string?) (-> any/c integer?)))
  3783. (ctest #f contract-stronger?
  3784. (or/c (-> string?) (-> any/c integer?))
  3785. (or/c (-> string?) (-> integer? integer?)))
  3786. (ctest #t contract-stronger?
  3787. (or/c (-> string?) (-> integer? integer?) integer? boolean?)
  3788. (or/c (-> string?) (-> integer? integer?) integer? boolean?))
  3789. (ctest #f contract-stronger?
  3790. (or/c (-> string?) (-> integer? integer?) integer? char?)
  3791. (or/c (-> string?) (-> integer? integer?) integer? boolean?))
  3792. (ctest #f contract-stronger?
  3793. (or/c (-> string?) (-> integer? integer?) integer?)
  3794. (or/c (-> string?) (-> integer? integer?) integer? boolean?))
  3795. (ctest #f contract-stronger?
  3796. (or/c (-> string?) (-> integer? integer?) integer?)
  3797. (or/c (-> integer? integer?) integer?))
  3798. (contract-eval
  3799. `(let ()
  3800. (define (non-zero? x) (not (zero? x)))
  3801. (define list-of-numbers
  3802. (or/c null?
  3803. (couple/c number?
  3804. (recursive-contract list-of-numbers))))
  3805. (define (short-list/less-than n)
  3806. (or/c null?
  3807. (couple/c (<=/c n)
  3808. (or/c null?
  3809. (couple/c (<=/c n)
  3810. any/c)))))
  3811. (define (short-sorted-list/less-than n)
  3812. (or/c null?
  3813. (couple/dc
  3814. [hd (<=/c n)]
  3815. [tl (hd) (or/c null?
  3816. (couple/c (<=/c hd)
  3817. any/c))])))
  3818. (define (sorted-list/less-than n)
  3819. (or/c null?
  3820. (couple/dc
  3821. [hd (<=/c n)]
  3822. [tl (hd) (sorted-list/less-than hd)])))
  3823. ;; for some reason, the `n' makes it harder to optimize. without it, this test isn't as good a test
  3824. (define (closure-comparison-test n)
  3825. (couple/dc
  3826. [hd any/c]
  3827. [tl (hd) any/c]))
  3828. (,test #t contract-stronger? (couple/c any/c any/c) (couple/c any/c any/c))
  3829. (,test #f contract-stronger? (couple/c (>=/c 2) (>=/c 3)) (couple/c (>=/c 4) (>=/c 5)))
  3830. (,test #t contract-stronger? (couple/c (>=/c 4) (>=/c 5)) (couple/c (>=/c 2) (>=/c 3)))
  3831. (,test #f contract-stronger? (couple/c (>=/c 1) (>=/c 5)) (couple/c (>=/c 5) (>=/c 1)))
  3832. (let ([ctc (couple/dc [hd any/c] [tl (hd) any/c])])
  3833. (,test #t contract-stronger? ctc ctc))
  3834. (let ([ctc (couple/dc [hd any/c] [tl (hd) (<=/c hd)])])
  3835. (,test #t contract-stronger? ctc ctc))
  3836. (,test #t contract-stronger? list-of-numbers list-of-numbers)
  3837. (,test #t contract-stronger? (short-list/less-than 4) (short-list/less-than 5))
  3838. (,test #f contract-stronger? (short-list/less-than 5) (short-list/less-than 4))
  3839. (,test #t contract-stronger? (short-sorted-list/less-than 4) (short-sorted-list/less-than 5))
  3840. (,test #f contract-stronger? (short-sorted-list/less-than 5) (short-sorted-list/less-than 4))
  3841. (,test #t contract-stronger? (sorted-list/less-than 4) (sorted-list/less-than 5))
  3842. (,test #f contract-stronger? (sorted-list/less-than 5) (sorted-list/less-than 4))
  3843. (,test #t contract-stronger? (closure-comparison-test 4) (closure-comparison-test 5))))
  3844. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3845. ;;
  3846. ;; first-order tests
  3847. ;;
  3848. (ctest #t contract-first-order-passes? (flat-contract integer?) 1)
  3849. (ctest #f contract-first-order-passes? (flat-contract integer?) 'x)
  3850. (ctest #t contract-first-order-passes? (flat-contract boolean?) #t)
  3851. (ctest #f contract-first-order-passes? (flat-contract boolean?) 'x)
  3852. (ctest #t contract-first-order-passes? any/c 1)
  3853. (ctest #t contract-first-order-passes? any/c #t)
  3854. (ctest #t contract-first-order-passes? (-> integer? integer?) (λ (x) #t))
  3855. (ctest #f contract-first-order-passes? (-> integer? integer?) (λ (x y) #t))
  3856. (ctest #f contract-first-order-passes? (-> integer? integer?) 'x)
  3857. (ctest #t contract-first-order-passes? (-> integer? boolean? integer?) (λ (x y) #t))
  3858. (ctest #f contract-first-order-passes? (-> integer? boolean? integer?) (λ (x) #t))
  3859. (ctest #f contract-first-order-passes? (-> integer? boolean? integer?) (λ (x y z) #t))
  3860. (ctest #t contract-first-order-passes? (->* (integer?) boolean? (char? any/c)) (λ (x . y) #f))
  3861. (ctest #f contract-first-order-passes? (->* (integer?) boolean? (char? any/c)) (λ (x y . z) #f))
  3862. (ctest #f contract-first-order-passes? (->* (integer?) boolean? (char? any/c)) (λ (x) #f))
  3863. (ctest #t contract-first-order-passes? (->* (integer?) boolean? (char? any/c)) (λ x #f))
  3864. (ctest #t contract-first-order-passes? (->d integer? boolean? (lambda (x y) char?)) (λ (x y) x))
  3865. (ctest #f contract-first-order-passes? (->d integer? boolean? (lambda (x y) char?)) (λ (x) x))
  3866. (ctest #f contract-first-order-passes? (->d integer? boolean? (lambda (x y) char?)) (λ (x y z) x))
  3867. (ctest #t contract-first-order-passes? (listof integer?) (list 1))
  3868. (ctest #f contract-first-order-passes? (listof integer?) #f)
  3869. (ctest #t contract-first-order-passes? (vector-immutableof integer?) (vector->immutable-vector (vector 1)))
  3870. (ctest #f contract-first-order-passes? (vector-immutableof integer?) 'x)
  3871. (ctest #f contract-first-order-passes? (vector-immutableof integer?) '())
  3872. (ctest #t contract-first-order-passes? (promise/c integer?) (delay 1))
  3873. (ctest #f contract-first-order-passes? (promise/c integer?) 1)
  3874. (ctest #t contract-first-order-passes? (->d* (integer? boolean?) (lambda (x y) char?)) (λ (x y) #t))
  3875. (ctest #f contract-first-order-passes? (->d* (integer? boolean?) (lambda (x y) char?)) (λ (x) #t))
  3876. (ctest #f contract-first-order-passes? (->d* (integer? boolean?) (lambda (x y) char?)) (λ (x y z) #t))
  3877. (ctest #t contract-first-order-passes?
  3878. (->d* (integer? boolean?) any/c (lambda (x y . z) char?))
  3879. (λ (x y . z) z))
  3880. (ctest #t contract-first-order-passes?
  3881. (->d* (integer? boolean?) any/c (lambda (x y . z) char?))
  3882. (λ (y . z) z))
  3883. (ctest #t contract-first-order-passes?
  3884. (->d* (integer? boolean?) any/c (lambda (x y . z) char?))
  3885. (λ z z))
  3886. (ctest #f contract-first-order-passes?
  3887. (->d* (integer? boolean?) any/c (lambda (x y . z) char?))
  3888. (λ (x y z . w) 1))
  3889. (ctest #f contract-first-order-passes?
  3890. (->d* (integer? boolean?) any/c (lambda (x y . z) char?))
  3891. (λ (x y) 1))
  3892. (ctest #t contract-first-order-passes? (->r ((x number?)) number?) (λ (x) 1))
  3893. (ctest #f contract-first-order-passes? (->r ((x number?)) number?) (λ (x y) 1))
  3894. (ctest #f contract-first-order-passes? (->r ((x number?)) number?) (λ () 1))
  3895. (ctest #t contract-first-order-passes? (->r ((x number?)) number?) (λ args 1))
  3896. (ctest #t contract-first-order-passes? (->pp ((x number?)) #t number? blech #t) (λ (x) 1))
  3897. (ctest #f contract-first-order-passes? (->pp ((x number?)) #t number? blech #t) (λ () 1))
  3898. (ctest #t contract-first-order-passes? (->pp ((x number?)) #t number? blech #t) (λ (x . y) 1))
  3899. (ctest #f contract-first-order-passes?
  3900. (case-> (-> integer? integer?)
  3901. (-> integer? integer? integer?))
  3902. (λ () 1))
  3903. (ctest #f contract-first-order-passes?
  3904. (case-> (-> integer? integer?)
  3905. (-> integer? integer? integer?))
  3906. (λ (x) 1))
  3907. (ctest #f contract-first-order-passes?
  3908. (case-> (-> integer? integer?)
  3909. (-> integer? integer? integer?))
  3910. (λ (x y) 1))
  3911. (ctest #f contract-first-order-passes?
  3912. (case->)
  3913. 1)
  3914. (ctest #t contract-first-order-passes?
  3915. (case->)
  3916. (case-lambda))
  3917. (ctest #t contract-first-order-passes?
  3918. (case-> (-> integer? integer?)
  3919. (-> integer? integer? integer?))
  3920. (case-lambda [(x) x] [(x y) x]))
  3921. (ctest #t contract-first-order-passes?
  3922. (case-> (-> integer? integer?)
  3923. (-> integer? integer? integer?))
  3924. (case-lambda [() 1] [(x) x] [(x y) x]))
  3925. (ctest #t contract-first-order-passes?
  3926. (case-> (-> integer? integer?)
  3927. (-> integer? integer? integer?))
  3928. (case-lambda [() 1] [(x) x] [(x y) x] [(x y z) x]))
  3929. (ctest #t contract-first-order-passes? (and/c (-> positive? positive?) (-> integer? integer?)) (λ (x) x))
  3930. (ctest #t contract-first-order-passes? (and/c (-> positive? positive?) (-> integer? integer?)) values)
  3931. (ctest #f contract-first-order-passes? (and/c (-> integer?) (-> integer? integer?)) (λ (x) x))
  3932. (ctest #t contract-first-order-passes?
  3933. (cons/c boolean? (-> integer? integer?))
  3934. (list* #t (λ (x) x)))
  3935. (ctest #f contract-first-order-passes?
  3936. (cons/c boolean? (-> integer? integer?))
  3937. (list* 1 2))
  3938. (ctest #f contract-first-order-passes? (flat-rec-contract the-name) 1)
  3939. (ctest #f contract-first-order-passes?
  3940. (object-contract (m (-> integer? integer?)))
  3941. (new object%))
  3942. (ctest #f contract-first-order-passes?
  3943. (object-contract (m (-> integer? integer?)))
  3944. 1)
  3945. (ctest #t contract-first-order-passes?
  3946. (couple/c any/c any/c)
  3947. (make-couple 1 2))
  3948. (ctest #f contract-first-order-passes?
  3949. (couple/c any/c any/c)
  3950. 2)
  3951. (ctest #t contract-first-order-passes?
  3952. (couple/dc [hd any/c] [tl any/c])
  3953. (make-couple 1 2))
  3954. (ctest #f contract-first-order-passes?
  3955. (couple/dc [hd any/c] [tl any/c])
  3956. 1)
  3957. (ctest #t contract-first-order-passes?
  3958. (couple/dc [hd any/c] [tl (hd) any/c])
  3959. (make-couple 1 2))
  3960. (ctest #f contract-first-order-passes?
  3961. (couple/dc [hd any/c] [tl (hd) any/c])
  3962. 1)
  3963. (ctest #t contract-first-order-passes? (or/c (-> (>=/c 5) (>=/c 5)) boolean?) #t)
  3964. (ctest #t contract-first-order-passes? (or/c (-> (>=/c 5) (>=/c 5)) boolean?) (λ (x) x))
  3965. (ctest #f contract-first-order-passes? (or/c (-> (>=/c 5) (>=/c 5)) boolean?) 'x)
  3966. (ctest #t contract-first-order-passes?
  3967. (or/c (-> integer? integer? integer?)
  3968. (-> integer? integer?))
  3969. (λ (x) x))
  3970. (ctest #t contract-first-order-passes?
  3971. (or/c (-> integer? integer? integer?)
  3972. (-> integer? integer?))
  3973. (λ (x y) x))
  3974. (ctest #f contract-first-order-passes?
  3975. (or/c (-> integer? integer? integer?)
  3976. (-> integer? integer?))
  3977. (λ () x))
  3978. (ctest #f contract-first-order-passes?
  3979. (or/c (-> integer? integer? integer?)
  3980. (-> integer? integer?))
  3981. 1)
  3982. (test-name '(or/c) (or/c))
  3983. (test-name '(or/c integer? gt0?) (or/c integer? (let ([gt0? (lambda (x) (> x 0))]) gt0?)))
  3984. (test-name '(or/c integer? boolean?)
  3985. (or/c (flat-contract integer?)
  3986. (flat-contract boolean?)))
  3987. (test-name '(or/c (-> (>=/c 5) (>=/c 5)) boolean?)
  3988. (or/c (-> (>=/c 5) (>=/c 5)) boolean?))
  3989. (test-name '(or/c (-> (>=/c 5) (>=/c 5)) boolean?)
  3990. (or/c boolean? (-> (>=/c 5) (>=/c 5))))
  3991. (ctest 1
  3992. length
  3993. (let ([f (contract (-> integer? any)
  3994. (lambda (x)
  3995. (with-continuation-mark 'x 'x
  3996. (continuation-mark-set->list (current-continuation-marks) 'x)))
  3997. 'pos
  3998. 'neg)])
  3999. (with-continuation-mark 'x 'x
  4000. (f 1))))
  4001. (ctest 2
  4002. length
  4003. (let ([f (contract (-> integer? list?)
  4004. (lambda (x)
  4005. (with-continuation-mark 'x 'x
  4006. (continuation-mark-set->list (current-continuation-marks) 'x)))
  4007. 'pos
  4008. 'neg)])
  4009. (with-continuation-mark 'x 'x
  4010. (f 1))))
  4011. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  4012. ;;
  4013. ;; provide/contract tests
  4014. ;; (at the end, because they are slow w/out .zo files)
  4015. ;;
  4016. (test/spec-passed
  4017. 'provide/contract1
  4018. '(let ()
  4019. (eval '(module contract-test-suite1 mzscheme
  4020. (require mzlib/contract)
  4021. (define x 1)
  4022. (provide/contract (x integer?))))
  4023. (eval '(require 'contract-test-suite1))
  4024. (eval 'x)))
  4025. (test/spec-passed
  4026. 'provide/contract2
  4027. '(let ()
  4028. (eval '(module contract-test-suite2 mzscheme
  4029. (require mzlib/contract)
  4030. (provide/contract)))
  4031. (eval '(require 'contract-test-suite2))))
  4032. (test/spec-failed
  4033. 'provide/contract3
  4034. '(let ()
  4035. (eval '(module contract-test-suite3 mzscheme
  4036. (require mzlib/contract)
  4037. (define x #f)
  4038. (provide/contract (x integer?))))
  4039. (eval '(require 'contract-test-suite3))
  4040. (eval 'x))
  4041. "'contract-test-suite3")
  4042. (test/spec-passed
  4043. 'provide/contract4
  4044. '(begin
  4045. (eval '(module contract-test-suite4 mzscheme
  4046. (require mzlib/contract)
  4047. (define-struct s (a))
  4048. (provide/contract (struct s ((a any/c))))))
  4049. (eval '(require 'contract-test-suite4))
  4050. (eval '(list (make-s 1)
  4051. (s-a (make-s 1))
  4052. (s? (make-s 1))
  4053. (set-s-a! (make-s 1) 2)))))
  4054. (test/spec-passed
  4055. 'provide/contract4-b
  4056. '(begin
  4057. (eval '(module contract-test-suite4-b mzscheme
  4058. (require mzlib/contract)
  4059. (define-struct s (a))
  4060. (provide/contract (struct s ((a any/c))))))
  4061. (eval '(require 'contract-test-suite4-b))
  4062. (eval '(list (make-s 1)
  4063. (s-a (make-s 1))
  4064. (s? (make-s 1))))))
  4065. (test/spec-passed/result
  4066. 'provide/contract4-c
  4067. '(begin
  4068. (eval '(module contract-test-suite4-c mzscheme
  4069. (require mzlib/contract)
  4070. (define-struct s (a b))
  4071. (provide/contract (struct s ((a any/c) (b any/c))))))
  4072. (eval '(require 'contract-test-suite4-c))
  4073. (eval '(let ([an-s (make-s 1 2)])
  4074. (list (s-a an-s)
  4075. (s-b an-s)
  4076. (begin (set-s-a! an-s 3)
  4077. (s-a an-s))
  4078. (begin (set-s-b! an-s 4)
  4079. (s-b an-s))))))
  4080. (list 1 2 3 4))
  4081. (test/spec-passed
  4082. 'provide/contract5
  4083. '(begin
  4084. (eval '(module contract-test-suite5 mzscheme
  4085. (require mzlib/contract)
  4086. (define-struct s (a))
  4087. (define-struct t (a))
  4088. (provide/contract (struct s ((a any/c)))
  4089. (struct t ((a any/c))))))
  4090. (eval '(require 'contract-test-suite5))
  4091. (eval '(list (make-s 1)
  4092. (s-a (make-s 1))
  4093. (s? (make-s 1))
  4094. (make-t 1)
  4095. (t-a (make-t 1))
  4096. (t? (make-t 1))))))
  4097. (test/spec-passed
  4098. 'provide/contract6
  4099. '(begin
  4100. (eval '(module contract-test-suite6 mzscheme
  4101. (require mzlib/contract)
  4102. (define-struct s (a))
  4103. (provide/contract (struct s ((a any/c))))))
  4104. (eval '(require 'contract-test-suite6))
  4105. (eval '(define-struct (t s) ()))))
  4106. (test/spec-passed
  4107. 'provide/contract6b
  4108. '(begin
  4109. (eval '(module contract-test-suite6b mzscheme
  4110. (require mzlib/contract)
  4111. (define-struct s_ (a))
  4112. (provide/contract (struct s_ ((a any/c))))))
  4113. (eval '(require 'contract-test-suite6b))
  4114. (eval '(module contract-test-suite6b2 mzscheme
  4115. (require 'contract-test-suite6b)
  4116. (require mzlib/contract)
  4117. (define-struct (t_ s_) (b))
  4118. (provide s_-a)
  4119. (provide/contract (struct (t_ s_) ((a any/c) (b any/c))))))
  4120. (eval '(require 'contract-test-suite6b2))
  4121. (eval '(define-struct (u_ t_) ()))
  4122. (eval '(s_-a (make-u_ 1 2)))))
  4123. (test/spec-passed
  4124. 'provide/contract7
  4125. '(begin
  4126. (eval '(module contract-test-suite7 mzscheme
  4127. (require mzlib/contract)
  4128. (define-struct s (a b))
  4129. (define-struct (t s) (c d))
  4130. (provide/contract
  4131. (struct s ((a any/c) (b any/c)))
  4132. (struct (t s) ((a any/c) (b any/c) (c any/c) (d any/c))))))
  4133. (eval '(require 'contract-test-suite7))
  4134. (eval '(let ([x (make-t 1 2 3 4)])
  4135. (s-a x)
  4136. (s-b x)
  4137. (t-c x)
  4138. (t-d x)
  4139. (void)))))
  4140. (test/spec-passed
  4141. 'provide/contract8
  4142. '(begin
  4143. (eval '(module contract-test-suite8 mzscheme
  4144. (require mzlib/contract)
  4145. (define-struct i-s (contents))
  4146. (define (w-f-s? x) #t)
  4147. (provide/contract
  4148. (struct i-s ((contents (flat-named-contract "integer-set-list" w-f-s?)))))))
  4149. (eval '(require 'contract-test-suite8))
  4150. (eval '(i-s-contents (make-i-s 1)))))
  4151. (test/spec-passed
  4152. 'provide/contract9
  4153. '(begin
  4154. (eval '(module contract-test-suite9 mzscheme
  4155. (require mzlib/contract)
  4156. (define the-internal-name 1)
  4157. (provide/contract (rename the-internal-name the-external-name integer?))
  4158. (+ the-internal-name 1)))
  4159. (eval '(require 'contract-test-suite9))
  4160. (eval '(+ the-external-name 1))))
  4161. (test/spec-passed
  4162. 'provide/contract10
  4163. '(begin
  4164. (eval '(module pc10-m mzscheme
  4165. (require mzlib/contract)
  4166. (define-struct s (a b) (make-inspector))
  4167. (provide/contract (struct s ((a number?) (b number?))))))
  4168. (eval '(module pc10-n mzscheme
  4169. (require mzlib/struct
  4170. 'pc10-m)
  4171. (print-struct #t)
  4172. (copy-struct s
  4173. (make-s 1 2)
  4174. [s-a 3])))
  4175. (eval '(require 'pc10-n))))
  4176. (test/spec-passed
  4177. 'provide/contract11
  4178. '(begin
  4179. (eval '(module pc11-m mzscheme
  4180. (require mzlib/contract)
  4181. (define x 1)
  4182. (provide/contract [rename x y integer?]
  4183. [rename x z integer?])))
  4184. (eval '(module pc11-n mzscheme
  4185. (require 'pc11-m)
  4186. (+ y z)))
  4187. (eval '(require 'pc11-n))))
  4188. ;; this test is broken, not sure why
  4189. #|
  4190. (test/spec-failed
  4191. 'provide/contract11b
  4192. '(parameterize ([current-namespace (make-namespace)])
  4193. (eval '(module pc11b-m mzscheme
  4194. (require mzlib/contract)
  4195. (define-struct s (a b) (make-inspector))
  4196. (provide/contract (struct s ((a number?) (b number?))))))
  4197. (eval '(module pc11b-n mzscheme
  4198. (require mzlib/struct
  4199. m)
  4200. (print-struct #t)
  4201. (copy-struct s
  4202. (make-s 1 2)
  4203. [s-a #f])))
  4204. (eval '(require 'pc11b-n)))
  4205. "'n")
  4206. |#
  4207. (test/spec-passed
  4208. 'provide/contract12
  4209. '(begin
  4210. (eval '(module pc12-m mzscheme
  4211. (require mzlib/contract)
  4212. (define-struct (exn2 exn) ())
  4213. (provide/contract (struct (exn2 exn) ((message any/c) (continuation-marks any/c))))))
  4214. (eval '(require 'pc12-m))))
  4215. (test/spec-passed/result
  4216. 'provide/contract13
  4217. '(begin
  4218. (eval '(module pc13-common-msg-structs mzscheme
  4219. (require mzlib/contract)
  4220. (define-struct register (name type) (make-inspector))
  4221. (provide/contract (struct register ([name any/c] [type any/c])))))
  4222. (eval '(require 'pc13-common-msg-structs))
  4223. (eval '(require (lib "plt-match.rkt")))
  4224. (eval '(match (make-register 1 2)
  4225. [(struct register (name type))
  4226. (list name type)])))
  4227. (list 1 2))
  4228. (test/spec-passed
  4229. 'provide/contract14
  4230. '(begin
  4231. (eval '(module pc14-test1 mzscheme
  4232. (require mzlib/contract)
  4233. (define-struct type (flags))
  4234. (define-struct (type:ptr type) (type))
  4235. (provide/contract
  4236. (struct type
  4237. ([flags (listof string?)]))
  4238. (struct (type:ptr type)
  4239. ([flags (listof string?)] [type type?])))))
  4240. (eval '(module pc14-test2 mzscheme
  4241. (require mzlib/plt-match)
  4242. (require 'pc14-test1)
  4243. (match (make-type:ptr '() (make-type '()))
  4244. [(struct type:ptr (flags type)) #f])))
  4245. (eval '(require 'pc14-test2))))
  4246. ;; make sure unbound identifier exception is raised.
  4247. (contract-error-test
  4248. #'(begin
  4249. (eval '(module pos mzscheme
  4250. (require mzlib/contract)
  4251. (provide/contract [i any/c]))))
  4252. exn:fail:syntax?)
  4253. ;; provide/contract should signal errors without requiring a reference to the variable
  4254. ;; this test is bogus, because provide/contract'd variables can be set!'d.
  4255. (test/spec-failed
  4256. 'provide/contract15
  4257. '(begin
  4258. (eval '(module pos mzscheme
  4259. (require mzlib/contract)
  4260. (define i #f)
  4261. (provide/contract [i integer?])))
  4262. (eval '(require 'pos)))
  4263. "'pos")
  4264. ;; this is really a positive violation, but name the module `neg' just for an addl test
  4265. (test/spec-failed
  4266. 'provide/contract16
  4267. '(begin
  4268. (eval '(module neg mzscheme
  4269. (require mzlib/contract)
  4270. (define i #f)
  4271. (provide/contract [i integer?])))
  4272. (eval '(require 'neg)))
  4273. "'neg")
  4274. ;; this test doesn't pass yet ... waiting for support from define-struct
  4275. #;
  4276. (test/neg-blame
  4277. 'provide/contract17
  4278. '(begin
  4279. (eval '(module pos mzscheme
  4280. (require mzlib/contract)
  4281. (define-struct s (a))
  4282. (provide/contract [struct s ((a integer?))])))
  4283. (eval '(module neg mzscheme
  4284. (require 'pos)
  4285. (define-struct (t s) ())
  4286. (make-t #f)))
  4287. (eval '(require 'neg))))
  4288. (test/spec-passed
  4289. 'provide/contract18
  4290. '(begin
  4291. (eval '(module pc18-pos mzscheme
  4292. (require mzlib/contract)
  4293. (define-struct s ())
  4294. (provide/contract [struct s ()])))
  4295. (eval '(require 'pc18-pos))
  4296. (eval '(make-s))))
  4297. (test/spec-passed/result
  4298. 'provide/contract19
  4299. '(begin
  4300. (eval '(module pc19-a mzscheme
  4301. (require mzlib/contract)
  4302. (define-struct a (x))
  4303. (provide/contract [struct a ([x number?])])))
  4304. (eval '(module pc19-b mzscheme
  4305. (require 'pc19-a
  4306. mzlib/contract)
  4307. (define-struct (b a) (y))
  4308. (provide/contract [struct (b a) ([x number?] [y number?])])))
  4309. (eval '(module pc19-c mzscheme
  4310. (require 'pc19-b
  4311. mzlib/contract)
  4312. (define-struct (c b) (z))
  4313. (provide/contract [struct (c b) ([x number?] [y number?] [z number?])])))
  4314. (eval' (module pc19-d mzscheme
  4315. (require 'pc19-a 'pc19-c)
  4316. (define pc19-ans (a-x (make-c 1 2 3)))
  4317. (provide pc19-ans)))
  4318. (eval '(require 'pc19-d))
  4319. (eval 'pc19-ans))
  4320. 1)
  4321. ;; test that unit & contract don't collide over the name `struct'
  4322. (test/spec-passed
  4323. 'provide/contract20
  4324. '(eval '(module tmp mzscheme
  4325. (require mzlib/contract
  4326. mzlib/unit)
  4327. (define-struct s (a b))
  4328. (provide/contract
  4329. [struct s ([a number?]
  4330. [b symbol?])]))))
  4331. (test/spec-passed
  4332. 'provide/contract21
  4333. '(begin
  4334. (eval '(module provide/contract21a mzscheme
  4335. (require mzlib/contract)
  4336. (provide/contract [f integer?])
  4337. (define f 1)))
  4338. (eval '(module provide/contract21b mzscheme
  4339. (require (for-syntax 'provide/contract21a)
  4340. (for-syntax mzscheme))
  4341. (define-syntax (unit-body stx)
  4342. f f
  4343. #'1)))))
  4344. (test/spec-passed
  4345. 'provide/contract22
  4346. '(begin
  4347. (eval '(module provide/contract22a mzscheme
  4348. (require mzlib/contract)
  4349. (provide/contract [make-bound-identifier-mapping integer?])
  4350. (define make-bound-identifier-mapping 1)))
  4351. (eval '(module provide/contract22b mzscheme
  4352. (require (for-syntax 'provide/contract22a)
  4353. (for-syntax mzscheme))
  4354. (define-syntax (unit-body stx)
  4355. make-bound-identifier-mapping)
  4356. (define-syntax (f stx)
  4357. make-bound-identifier-mapping)))))
  4358. (test/spec-passed
  4359. 'provide/contract23
  4360. '(begin
  4361. (eval '(module provide/contract23a mzscheme
  4362. (require mzlib/contract)
  4363. (provide/contract [f integer?])
  4364. (define f 3)))
  4365. (eval '(module provide/contract23b mzscheme
  4366. (require 'provide/contract23a)
  4367. (#%expression f)
  4368. f))
  4369. (eval '(require 'provide/contract23b))))
  4370. (test/spec-passed
  4371. 'provide/contract24
  4372. '(begin
  4373. (eval '(module provide/contract24 mzscheme
  4374. (require (prefix c: mzlib/contract))
  4375. (c:case-> (c:-> integer? integer?)
  4376. (c:-> integer? integer? integer?))))))
  4377. ;; tests that contracts pick up the #%app from the context
  4378. ;; instead of always using the mzscheme #%app.
  4379. (test/spec-passed
  4380. 'provide/contract25
  4381. '(begin
  4382. (eval '(module provide/contract25a mzscheme
  4383. (require mzlib/contract)
  4384. (provide/contract [seventeen integer?])
  4385. (define seventeen 17)))
  4386. (eval '(module provide/contract25b mzscheme
  4387. (require 'provide/contract25a)
  4388. (let-syntax ([#%app (syntax-rules ()
  4389. [(#%app e ...) (list e ...)])])
  4390. (seventeen 18))))
  4391. (eval '(require 'provide/contract25b))))
  4392. (test/spec-passed/result
  4393. 'provide/contract26
  4394. '(begin
  4395. (eval '(module provide/contract26 mzscheme
  4396. (require mzlib/contract)
  4397. (define-struct pc26-s (a))
  4398. (provide/contract (struct pc26-s ((a integer?))))))
  4399. (eval '(require 'provide/contract26))
  4400. (eval '(pc26-s-a (make-pc26-s 1))))
  4401. 1)
  4402. (contract-error-test
  4403. #'(begin
  4404. (eval '(module pce1-bug mzscheme
  4405. (require mzlib/contract)
  4406. (define the-defined-variable1 'five)
  4407. (provide/contract [the-defined-variable1 number?])))
  4408. (eval '(require 'pce1-bug)))
  4409. (λ (x)
  4410. (and (exn? x)
  4411. (regexp-match #rx"the-defined-variable1:" (exn-message x)))))
  4412. (contract-error-test
  4413. #'(begin
  4414. (eval '(module pce2-bug mzscheme
  4415. (require mzlib/contract)
  4416. (define the-defined-variable2 values)
  4417. (provide/contract [the-defined-variable2 (-> number? any)])))
  4418. (eval '(require 'pce2-bug))
  4419. (eval '(the-defined-variable2 #f)))
  4420. (λ (x)
  4421. (and (exn? x)
  4422. (regexp-match #rx"the-defined-variable2:" (exn-message x)))))
  4423. (contract-error-test
  4424. #'(begin
  4425. (eval '(module pce3-bug mzscheme
  4426. (require mzlib/contract)
  4427. (define the-defined-variable3 (λ (x) #f))
  4428. (provide/contract [the-defined-variable3 (-> any/c number?)])))
  4429. (eval '(require 'pce3-bug))
  4430. (eval '(the-defined-variable3 #f)))
  4431. (λ (x)
  4432. (and (exn? x)
  4433. (regexp-match #rx"the-defined-variable3:" (exn-message x)))))
  4434. (contract-error-test
  4435. #'(begin
  4436. (eval '(module pce4-bug mzscheme
  4437. (require mzlib/contract)
  4438. (define the-defined-variable4 (λ (x) #f))
  4439. (provide/contract [the-defined-variable4 (-> any/c number?)])))
  4440. (eval '(require 'pce4-bug))
  4441. (eval '((if #t the-defined-variable4 the-defined-variable4) #f)))
  4442. (λ (x)
  4443. (and (exn? x)
  4444. (regexp-match #rx"the-defined-variable4:" (exn-message x)))))
  4445. (contract-error-test
  4446. #'(begin
  4447. (eval '(module pce5-bug mzscheme
  4448. (require mzlib/contract)
  4449. (define-struct bad (a b))
  4450. (provide/contract
  4451. [struct bad ((string? a) (string? b))])))
  4452. (eval '(require 'pce5-bug)))
  4453. (λ (x)
  4454. (and (exn? x)
  4455. (regexp-match #rx"expected field name to be b, but found string?" (exn-message x)))))
  4456. (contract-error-test
  4457. #'(begin
  4458. (eval '(module pce6-bug mzscheme
  4459. (require mzlib/contract)
  4460. (define-struct bad-parent (a))
  4461. (define-struct (bad bad-parent) (b))
  4462. (provide/contract
  4463. [struct bad ((a string?) (string? b))])))
  4464. (eval '(require 'pce6-bug)))
  4465. (λ (x)
  4466. (and (exn? x)
  4467. (regexp-match #rx"expected field name to be b, but found string?" (exn-message x)))))
  4468. (contract-eval
  4469. `(,test
  4470. 'pos
  4471. (compose blame-positive exn:fail:contract:blame-object)
  4472. (with-handlers ((void values)) (contract not #t 'pos 'neg))))
  4473. (report-errs)
  4474. ))