253 lines
6.1 KiB
Scheme
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)
|