racket/collects/tests/mzscheme/package.ss
2009-11-27 02:12:27 +00:00

253 lines
6.1 KiB
Scheme

(load-relative "loadtest.ss")
(require scheme/package)
(Section 'packages)
(define-syntax (test-pack-seq stx)
(syntax-case stx ()
[(_ result form ...)
(let loop ([forms #'(form ...)]
[pre null])
(syntax-case forms ()
[([#:fail expr exn?])
(with-syntax ([(form ...) (reverse pre)])
#`(test-pack-seq* (list (quote-syntax form) ...)
(quote-syntax [#:fail expr])
'expr
exn?))]
[(expr)
(with-syntax ([(form ...) (reverse pre)])
#`(test-pack-seq* (list (quote-syntax form) ...)
(quote-syntax expr)
'expr
result))]
[([#:fail expr exn?] . more)
#`(begin
#,(loop #'([#:fail expr exn?]) pre)
#,(loop #'more pre))]
[(form . more)
(loop #'more (cons #'form pre))]))]))
(define (fail? e)
(syntax-case e ()
[(#:fail e) #'e]
[_ #f]))
(define (fail-expr e)
(or (fail? e) e))
(define (test-pack-seq* forms expr q-expr result)
(let ([orig (current-namespace)])
;; top level
(let ([ns (make-base-namespace)])
(parameterize ([current-namespace ns])
(namespace-attach-module orig 'scheme/package)
(namespace-require '(for-syntax scheme/base))
(namespace-require 'scheme/package)
(for-each eval forms)
(if (fail? expr)
(err/rt-test (eval (fail-expr expr)) result)
(test result q-expr (eval expr)))))
;; let
(let ([ns (make-base-namespace)])
(parameterize ([current-namespace ns])
(namespace-attach-module orig 'scheme/package)
(namespace-require '(for-syntax scheme/base))
(namespace-require 'scheme/package)
(let ([e `(let () (begin . ,forms) ,(fail-expr expr))])
(if (fail? expr)
(err/rt-test (eval e) result)
(test result `(let ... ,q-expr) (eval e))))))
;; nested let
(let ([ns (make-base-namespace)])
(parameterize ([current-namespace ns])
(namespace-attach-module orig 'scheme/package)
(namespace-require '(for-syntax scheme/base))
(namespace-require 'scheme/package)
(let ([e (let loop ([forms forms])
(if (null? (cdr forms))
`(let () (begin . ,forms) ,(fail-expr expr))
`(let () ,(car forms)
,(loop (cdr forms)))))])
(if (fail? expr)
(err/rt-test (eval e) result)
(test result `(let ... ,q-expr) (eval e))))))
;; module
(let ([ns (make-base-namespace)])
(parameterize ([current-namespace ns])
(namespace-attach-module orig 'scheme/package)
(let ([m `(module m scheme/base
(require (for-syntax scheme/base)
scheme/package)
(begin . ,forms)
(define result ,(fail-expr expr))
(provide result))])
(if (fail? expr)
(err/rt-test (eval m) exn:fail:syntax?)
(begin
(eval m)
(test result `(module ... ,q-expr) (dynamic-require ''m 'result)))))))))
;; ----------------------------------------
(test-pack-seq
12
(define-package p (x)
(define y 5)
(define x 12))
[#:fail x exn:fail:contract:variable?]
(open-package p)
x
[#:fail y exn:fail:contract:variable?])
(test-pack-seq
13
(define-package p (q)
(define-package q (x)
(define y 8)
(define x 13)))
[#:fail x exn:fail:contract:variable?]
[#:fail (open-package q) exn:fail:syntax?]
(open-package p)
[#:fail x exn:fail:contract:variable?]
(open-package q)
x
[#:fail y exn:fail:contract:variable?])
(test-pack-seq
14
(define-package p (q)
(define-package q (r)
(define-package r (x)
(define x 14))))
[#:fail x exn:fail:contract:variable?]
[#:fail (open-package q) exn:fail:syntax?]
[#:fail (open-package r) exn:fail:syntax?]
(open-package p)
(open-package q)
(open-package r)
x)
(test-pack-seq
15
(define-package p (x)
(define x 15))
[#:fail x exn:fail:contract:variable?]
(define-package q #:all-defined
(open-package p))
[#:fail x exn:fail:contract:variable?]
(open-package q)
x)
(test-pack-seq
'(16 160)
(define-package p #:all-defined
(define x 16)
(define y 160))
(open-package p)
(list x y))
(test-pack-seq
170
(define-package p #:all-defined-except (x)
(define x 17)
(define y 170))
(open-package p)
[#:fail x exn:fail:contract:variable?]
y)
;; ----------------------------------------
(test-pack-seq
2
(define-package p (x)
(define* x 1)
(define* x 2))
(open-package p)
x)
(test-pack-seq
14
(define-package p (z)
(define* x (lambda () y))
(define z x)
(define* x 2)
(define y 14))
(open-package p)
(z))
(test-pack-seq
21
(define-package p (x)
(define* x (lambda () y))
(define* x2 0)
(define* x3 1)
(define* x4 1)
(define y 21))
(open-package p)
(x))
(test-pack-seq
'(2 1)
(define-package p (x y)
(define* x 1)
(define y x)
(define* x 2))
(open-package p)
(list x y))
(test-pack-seq
'(2 1)
(define-package p (x y)
(define* x 1)
(define y x)
(define* x 2))
(open-package p)
(list x y))
;; ----------------------------------------
(test-pack-seq
5
(define-package p1 #:all-defined
(define-package p2 ()
(define x 10))
(open-package p2))
(open-package p1)
[#:fail x exn:fail:contract:variable?]
5)
;; ----------------------------------------
(test-pack-seq
'(17 12)
(define-syntax-rule (mk id)
(begin
(define-package p (x)
(define x 17))
(open-package p)
(define id x)))
(define x 12)
(mk z)
(list z x))
;; ----------------------------------------
(test-pack-seq
10
(define-package p5 (q)
(define* x 10)
(define-syntax (y stx)
(syntax-case stx ()
[(_ z) #'(begin (define z x))]))
(define* x 12)
(define* z 13)
(y q))
(open-package p5)
q)
;; ----------------------------------------
(report-errs)