396 lines
15 KiB
Scheme
396 lines
15 KiB
Scheme
|
|
(load-relative "loadtest.ss")
|
|
|
|
(Section 'module)
|
|
|
|
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
(module n mzscheme
|
|
(define n 'n)
|
|
(define-struct s (field1 field2))
|
|
(provide n
|
|
(struct s (field1 field2))
|
|
(rename n m)))
|
|
|
|
(require 'n)
|
|
(test 'n 'required-n n)
|
|
(test 'n 'required-n m)
|
|
|
|
(test 's-field1 object-name s-field1)
|
|
(test 's-field2 object-name s-field2)
|
|
(test 'set-s-field1! object-name set-s-field1!)
|
|
(test 'set-s-field2! object-name set-s-field2!)
|
|
(test 's? object-name s?)
|
|
(test 7 s-field1 (make-s 7 8))
|
|
(test 8 s-field2 (make-s 7 8))
|
|
(define an-s (make-s 7 8))
|
|
(test (void) set-s-field1! an-s 12)
|
|
(test (void) set-s-field2! an-s 13)
|
|
(test 12 s-field1 an-s)
|
|
(test 13 s-field2 an-s)
|
|
|
|
(syntax-test #'(set! n 10))
|
|
(syntax-test #'(set! m 10))
|
|
(syntax-test #'(set! make-s 10))
|
|
|
|
(syntax-test #'(module))
|
|
(syntax-test #'(module m))
|
|
(syntax-test #'(module 5 mzscheme))
|
|
|
|
(syntax-test #'(module m 5))
|
|
|
|
(syntax-test #'(module m mzscheme . 1))
|
|
|
|
(syntax-test #'(#%module-begin))
|
|
(syntax-test #'(+ (#%module-begin) 2))
|
|
|
|
(syntax-test #'(module n+ mzscheme (#%module-begin (#%module-begin (define n+ 'n+) (provide n+)))))
|
|
(syntax-test #'(module n+ mzscheme (define n+ 'n+) (#%module-begin (provide n+))))
|
|
(syntax-test #'(module n+ mzscheme (define n+ 'n+) (#%module-begin) (provide n+)))
|
|
(syntax-test #'(module n+ mzscheme (#%module-begin) (define n+ 'n+) (provide n+)))
|
|
(module n+ mzscheme (#%module-begin (define n+ 'n+) (provide n+)))
|
|
|
|
(syntax-test #'(provide))
|
|
(syntax-test #'(provide . x))
|
|
(syntax-test #'(provide y . x))
|
|
(syntax-test #'(module m mzscheme (define x 10) (provide . x)))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide y . x)))
|
|
(syntax-test #'(module m mzscheme (define x 10) (provide 1)))
|
|
(syntax-test #'(module m mzscheme (define x 10) (provide "bad")))
|
|
(syntax-test #'(module m mzscheme (define x 10) (provide not-here)))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide x (rename y x))))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide x z)))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide x y (rename x y))))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide (rename))))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide (rename x))))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide (rename x y z))))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide (rename not-here x))))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide (rename x 1))))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide (rename 1 x))))
|
|
(syntax-test #'(module m mzscheme (define-struct x (y)) (provide (struct))))
|
|
(syntax-test #'(module m mzscheme (define-struct x (y)) (provide (struct . x))))
|
|
(syntax-test #'(module m mzscheme (define-struct x (y)) (provide (struct x))))
|
|
(syntax-test #'(module m mzscheme (define-struct x (y)) (provide (struct x (y) z))))
|
|
(syntax-test #'(module m mzscheme (define-struct x (y)) (provide (struct x (y) . z))))
|
|
(syntax-test #'(module m mzscheme (define-struct x (y)) (provide (struct 1 ()))))
|
|
(syntax-test #'(module m mzscheme (define-struct x (y)) (provide (struct x (1)))))
|
|
(syntax-test #'(module m mzscheme (define-struct x (y)) (provide (struct x (y . 1)))))
|
|
;; (syntax-test #'(module m mzscheme (define-struct x (y)) (provide (struct x (y y)))))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide (all-from))))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide (all-from . mzscheme))))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide (all-from 1))))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide (all-from xxxx))))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide (all-from mzscheme x))))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide (all-from-except))))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide (all-from-except . mzscheme))))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide (all-from-except 1))))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide (all-from-except mzscheme + . -))))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide (all-from-except mzscheme 1))))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide (all-from-except xxxx +))))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide (all-from-except mzscheme no))))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide (all-from-except mzscheme + no))))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide (all-defined x))))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide (all-defined . x))))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide (all-defined 1))))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide (all-defined-except . x))))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide (all-defined-except 1))))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide (all-defined-except x 1))))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define y 11) (provide (all-defined-except no))))
|
|
|
|
(syntax-test #'(require . x))
|
|
(syntax-test #'(require m . x))
|
|
(syntax-test #'(module m mzscheme (require n . x)))
|
|
(syntax-test #'(module m mzscheme (require (prefix))))
|
|
(syntax-test #'(module m mzscheme (require (prefix n))))
|
|
(syntax-test #'(module m mzscheme (require (prefix . pre:))))
|
|
(syntax-test #'(module m mzscheme (require (prefix pre: . n))))
|
|
(syntax-test #'(module m mzscheme (require (prefix 1 n))))
|
|
(syntax-test #'(module m mzscheme (require (prefix pre: n more))))
|
|
(syntax-test #'(module m mzscheme (require (prefix pre: n . more))))
|
|
(syntax-test #'(module m mzscheme (require (all-except))))
|
|
(syntax-test #'(module m mzscheme (require (all-except . n))))
|
|
(syntax-test #'(module m mzscheme (require (all-except n 1))))
|
|
(syntax-test #'(module m mzscheme (require (all-except n . n))))
|
|
(syntax-test #'(module m mzscheme (require (rename))))
|
|
(syntax-test #'(module m mzscheme (require (rename . n))))
|
|
(syntax-test #'(module m mzscheme (require (rename n))))
|
|
(syntax-test #'(module m mzscheme (require (rename n . n))))
|
|
(syntax-test #'(module m mzscheme (require (rename n n))))
|
|
(syntax-test #'(module m mzscheme (require (rename n n . m))))
|
|
(syntax-test #'(module m mzscheme (require (rename n 1 m))))
|
|
(syntax-test #'(module m mzscheme (require (rename n n 1))))
|
|
(syntax-test #'(module m mzscheme (require (rename n n not-there))))
|
|
(syntax-test #'(module m mzscheme (require (rename n n m extra))))
|
|
|
|
(syntax-test #'(module m mzscheme (require mzscheme) (define car 5)))
|
|
(syntax-test #'(module m mzscheme (define x 6) (define x 5)))
|
|
(syntax-test #'(module m mzscheme (define x 10) (define-syntax x 10)))
|
|
(syntax-test #'(module m mzscheme (define-syntax x 10) (define x 10)))
|
|
|
|
;; Cyclic re-def of n:
|
|
(syntax-test #'(module n n 10))
|
|
|
|
;; It's now ok to shadow the initial import:
|
|
(module _shadow_ mzscheme
|
|
(define car 5)
|
|
(provide car))
|
|
|
|
(test 5 dynamic-require ''_shadow_ 'car)
|
|
|
|
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;; Check namespace-attach-module:
|
|
|
|
(let* ([n (make-empty-namespace)]
|
|
[l null]
|
|
[here (lambda (v)
|
|
(set! l (cons v l)))])
|
|
(namespace-attach-module (current-namespace) 'scheme/base n)
|
|
(namespace-attach-module (current-namespace) 'mzscheme n)
|
|
(parameterize ([current-namespace n])
|
|
(namespace-require 'mzscheme)
|
|
(eval `(module a mzscheme
|
|
(define a 1)
|
|
(,here 'a)
|
|
(provide a)))
|
|
(test null values l)
|
|
(eval `(module b mzscheme
|
|
(require-for-template 'a)
|
|
(define b 1)
|
|
(,here 'b)
|
|
(provide b)))
|
|
(test null values l)
|
|
(eval `(module c mzscheme
|
|
(require-for-template 'b)
|
|
(define c 1)
|
|
(,here 'c)
|
|
(provide c)))
|
|
(test null values l)
|
|
(eval `(module d mzscheme
|
|
(require-for-syntax 'c)
|
|
(define d 1)
|
|
(,here 'd)
|
|
(provide d)))
|
|
(test '(c) values l)
|
|
(eval `(module e mzscheme
|
|
(require-for-syntax 'd)
|
|
(define e 1)
|
|
(,here 'e)
|
|
(provide e)))
|
|
(test '(d c b c) values l)
|
|
(eval `(module f mzscheme
|
|
(,here 'f)
|
|
(require 'b 'e)))
|
|
(test '(d c b d c b c) values l)
|
|
(eval `(require 'f))
|
|
(let ([finished '(f b e a d c b d c b d c b c)])
|
|
(test finished values l)
|
|
(namespace-attach-module n ''f)
|
|
(test finished values l)
|
|
(parameterize ([current-namespace (make-empty-namespace)])
|
|
(namespace-attach-module n ''f)
|
|
(test finished values l)
|
|
(namespace-require 'scheme/base)
|
|
(eval `(require 'a))
|
|
(eval `(require 'f))
|
|
(test finished values l)))))
|
|
|
|
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;; Check redundant import and re-provide
|
|
|
|
(module m_cr mzscheme
|
|
(provide x_cr y_cr z_cr w_cr)
|
|
(define x_cr 12)
|
|
(define y_cr 14)
|
|
(define z_cr 16)
|
|
(define w_cr 18))
|
|
|
|
(syntax-test #'(module n_cr mzscheme
|
|
(require 'm_cr)
|
|
(provide (all-from-except 'm_cr no-such-var))))
|
|
(syntax-test #'(module n_cr mzscheme
|
|
(require 'm_cr)
|
|
(provide (all-from-except 'm_cr cons))))
|
|
|
|
(module n_cr mzscheme
|
|
(require 'm_cr)
|
|
(provide (all-from-except 'm_cr x_cr)))
|
|
|
|
(module p_cr mzscheme
|
|
(require 'n_cr 'm_cr)
|
|
(provide (all-from 'm_cr)))
|
|
|
|
(require 'p_cr)
|
|
(test 14 values y_cr)
|
|
|
|
(module p2_cr mzscheme
|
|
(require 'm_cr 'n_cr)
|
|
(provide (all-from 'm_cr)))
|
|
|
|
(require 'p2_cr)
|
|
(test 16 values z_cr)
|
|
|
|
(module p3_cr mzscheme
|
|
(require 'm_cr 'n_cr)
|
|
(provide (all-from 'n_cr)))
|
|
|
|
(require 'p3_cr)
|
|
(test 18 values w_cr)
|
|
|
|
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;; Test proper bindings for `#%module-begin'
|
|
|
|
(test (void) eval
|
|
'(begin
|
|
(module mod_beg2 mzscheme
|
|
(provide (all-from-except mzscheme #%module-begin))
|
|
(provide (rename mb #%module-begin))
|
|
(define-syntax (mb stx)
|
|
(syntax-case stx ()
|
|
[(_ . forms)
|
|
#`(#%plain-module-begin
|
|
#,(datum->syntax-object stx '(require-for-syntax mzscheme))
|
|
. forms)])))
|
|
(module m 'mod_beg2
|
|
3)))
|
|
|
|
|
|
(test (void) eval
|
|
'(begin
|
|
(module mod_beg2 mzscheme
|
|
(provide (all-from-except mzscheme #%module-begin))
|
|
(provide (rename mb #%module-begin))
|
|
(define-syntax (mb stx)
|
|
(syntax-case stx ()
|
|
[(_ . forms)
|
|
#`(#%plain-module-begin
|
|
#,(datum->syntax-object stx '(require-for-syntax mzscheme))
|
|
. forms)])))
|
|
(module m 'mod_beg2
|
|
3 4)))
|
|
|
|
(test (void) eval
|
|
'(begin
|
|
(module mod_beg2 mzscheme
|
|
(provide (all-from-except mzscheme #%module-begin))
|
|
(provide (rename mb #%module-begin))
|
|
(define-syntax (mb stx)
|
|
(syntax-case stx ()
|
|
[(mb . forms)
|
|
#`(#%plain-module-begin
|
|
#,(datum->syntax-object #'mb '(require-for-syntax mzscheme))
|
|
. forms)])))
|
|
(module m 'mod_beg2
|
|
3)))
|
|
|
|
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
(let ([f1 "tmp1.ss"]
|
|
[f2 "tmp2.ss"]
|
|
[exn:fail-cycle? (lambda (exn)
|
|
(and (exn:fail? exn)
|
|
(regexp-match? #rx"cycle" (exn-message exn))))])
|
|
(with-output-to-file f1
|
|
#:exists 'truncate/replace
|
|
(lambda ()
|
|
(write `(module tmp1 mzscheme (require ,f2)))))
|
|
(with-output-to-file f2
|
|
#:exists 'truncate/replace
|
|
(lambda ()
|
|
(write `(module tmp2 mzscheme (require ,f1)))))
|
|
(err/rt-test (dynamic-require (build-path (current-directory) f1) #f) exn:fail-cycle?)
|
|
(err/rt-test (dynamic-require (build-path (current-directory) f2) #f) exn:fail-cycle?)
|
|
(delete-file f1)
|
|
(delete-file f2))
|
|
|
|
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
(test #t module-path? "hello")
|
|
(test #t module-path? "hello.ss")
|
|
(test #f module-path? "hello*ss")
|
|
(test #f module-path? "foo.ss/hello")
|
|
(test #f module-path? "foo/")
|
|
(test #f module-path? "a/foo/")
|
|
(test #f module-path? "/foo.ss")
|
|
(test #f module-path? "/a/foo.ss")
|
|
(test #f module-path? "a/foo.ss/b")
|
|
(test #t module-path? "a/_/b")
|
|
(test #t module-path? "a/0123456789+-_/b.---")
|
|
(test #t module-path? "../foo.ss")
|
|
(test #t module-path? "x/../foo.ss")
|
|
(test #t module-path? "x/./foo.ss")
|
|
(test #t module-path? "x/.")
|
|
(test #t module-path? "x/..")
|
|
|
|
(test #t module-path? 'hello)
|
|
(test #f module-path? 'hello/)
|
|
(test #f module-path? 'hello.ss)
|
|
(test #f module-path? 'hello/a.ss)
|
|
(test #f module-path? '/hello/a.ss)
|
|
(test #f module-path? '/hello)
|
|
(test #f module-path? '/a/hello)
|
|
(test #f module-path? 'a//hello)
|
|
(test #f module-path? '../hello)
|
|
(test #f module-path? './hello)
|
|
(test #f module-path? 'a/../hello)
|
|
(test #f module-path? 'b/./hello)
|
|
(test #f module-path? 'b/*/hello)
|
|
|
|
(test #t module-path? '(lib "hello"))
|
|
(test #f module-path? '(lib "hello/"))
|
|
(test #f module-path? '(lib "hello/../b"))
|
|
(test #t module-path? '(lib "hello/a"))
|
|
(test #t module-path? '(lib "hello/a.ss"))
|
|
(test #f module-path? '(lib "hello.bb/a.ss"))
|
|
(test #f module-path? '(lib "/hello/a.ss"))
|
|
(test #t module-path? '(lib "hello/a.ss" "ack"))
|
|
(test #t module-path? '(lib "hello/a.ss" "ack" "bar"))
|
|
(test #t module-path? '(lib "hello/a.ss" "ack/bar"))
|
|
(test #f module-path? '(lib "hello/a.ss" "ack/"))
|
|
(test #f module-path? '(lib "hello/a.ss" "ack" "/bar"))
|
|
(test #f module-path? '(lib "hello/a.ss" "ack" ".."))
|
|
(test #f module-path? '(lib "hello/a.ss" "ack" bar))
|
|
(test #f module-path? '(lib "hello/a.ss" . bar))
|
|
(test #f module-path? '(lib . "hello/a.ss"))
|
|
(test #f module-path? '(lib))
|
|
|
|
(test #f module-path? '(planet))
|
|
(test #f module-path? '(planet robby))
|
|
(test #t module-path? '(planet robby/redex))
|
|
(test #f module-path? '(planet robby/redex/))
|
|
(test #f module-path? '(planet robby/redex/foo/))
|
|
(test #f module-path? '(planet /robby/redex/foo))
|
|
(test #f module-path? '(planet robby/redex.plt/foo))
|
|
(test #f module-path? '(planet robby/redex/foo.ss))
|
|
(test #f module-path? '(planet robby/redex/foo.ss/bar))
|
|
(test #f module-path? '(planet robby/../foo))
|
|
(test #t module-path? '(planet robby/redex/foo))
|
|
(test #t module-path? '(planet robby/redex/foo/bar))
|
|
(test #t module-path? '(planet robby/redex:7/foo))
|
|
(test #t module-path? '(planet robby/redex:7))
|
|
(test #t module-path? '(planet robby/redex:7:8/foo))
|
|
(test #t module-path? '(planet robby/redex:7:<=8/foo))
|
|
(test #t module-path? '(planet robby/redex:7:>=8/foo))
|
|
(test #t module-path? '(planet robby/redex:7:8-9/foo))
|
|
(test #t module-path? '(planet robby/redex:7:8-9))
|
|
(test #t module-path? '(planet robby/redex:700:800-00900/foo))
|
|
(test #f module-path? '(planet robby/redex:=7/foo))
|
|
(test #f module-path? '(planet robby/redex::8/foo))
|
|
(test #f module-path? '(planet robby/redex:7:/foo))
|
|
(test #f module-path? '(planet robby/redex.plt:7:8/foo))
|
|
(test #f module-path? '(planet robby/redex:a/foo))
|
|
(test #f module-path? '(planet robby/redex:7:a/foo))
|
|
(test #f module-path? '(planet robby/redex:7:a-10/foo))
|
|
(test #f module-path? '(planet robby/redex:7:10-a/foo))
|
|
|
|
(test #f module-path? '(planet "foo.ss"))
|
|
(test #t module-path? '(planet "foo.ss" ("robby" "redex.plt")))
|
|
(test #f module-path? '(planet "../foo.ss" ("robby" "redex.plt")))
|
|
(test #t module-path? '(planet "foo.ss" ("robby" "redex.plt" (7 8))))
|
|
(test #t module-path? '(planet "foo.ss" ("robby" "redex.plt" 7 8)))
|
|
(test #t module-path? '(planet "foo.ss" ("robby" "redex.plt" 7 (= 8))))
|
|
(test #t module-path? '(planet "foo.ss" ("robby" "redex.plt") "sub" "deeper"))
|
|
|
|
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
(report-errs)
|