racket/collects/tests/mzscheme/module-reader.ss
Eli Barzilay 7d6bc32ed9 * Extended syntax/module-reader to deal with many more situations
using keywords, and allowing arbitrary code in the reader module
* Added tests for the new functionality
* Used the new stuff for the r5rs, r6rs, and honu readers

svn: r11495
2008-08-31 06:25:41 +00:00

74 lines
2.4 KiB
Scheme

(load-relative "loadtest.ss")
(Section 'module-reader)
;; ----------------------------------------
;; plain version
(module r0 syntax/module-reader scheme/base)
;; using a simple wrapper to get a case-insensitive reader
(module r1 syntax/module-reader scheme/base
#:wrapper1 (lambda (t) (parameterize ([read-case-sensitive #f]) (t))))
;; using the more general wrapper to get a case-insensitive reader
(module r2 syntax/module-reader scheme/base
#:wrapper2 (lambda (in r) (parameterize ([read-case-sensitive #f]) (r in))))
;; using explicit case-insensitive read/-syntax versions
(module r3 syntax/module-reader scheme/base
#:read (wrap read) #:read-syntax (wrap read-syntax)
(define ((wrap reader) . args)
(parameterize ([read-case-sensitive #f]) (apply reader args))))
;; add something to the result
(module r4 syntax/module-reader zzz
#:wrapper1 (lambda (t) (cons 'foo (t))))
;; same as above, but do it properly, if a syntax or a datum is needed
(module r5 syntax/module-reader zzz
#:wrapper1 (lambda (t stx?) (cons (if stx? #'foo 'foo) (t))))
;; make an empty module, after reading the contents
(module r6 syntax/module-reader zzz
#:wrapper1 (lambda (t) '()))
;; fake input port to get an empty module
(module r7 syntax/module-reader zzz
#:wrapper2 (lambda (in rd) (rd (open-input-string ""))))
;; forget about the input -- just return a fixed empty input module
(module r8 syntax/module-reader whatever
#:wrapper2 (lambda (in rd)
(if (syntax? (rd in)) #'(module page zzz) '(module page zzz))))
(define (from-string read str)
(parameterize ([read-accept-reader #t])
(read (open-input-string str))))
(define (test-both str result)
(for ([read (list read
;; same as `read', but using read-syntax
(lambda (in) (syntax->datum (read-syntax #f in))))])
(test result from-string read str)))
(test-both "#reader 'r0 (define FoO #:bAr)"
'(module page scheme/base (define FoO #:bAr)))
(for ([mod '(r1 r2 r3)])
(test-both (format "#reader '~a (define FoO #:bAr)" mod)
'(module page scheme/base (define foo #:bar))))
(test-both "#reader 'r4 (define foo #:bar)"
'(module page zzz foo (define foo #:bar)))
(test-both "#reader 'r5 (define foo #:bar)"
'(module page zzz foo (define foo #:bar)))
(test-both "#reader 'r6 (define foo #:bar)"
'(module page zzz))
;; ----------------------------------------
(report-errs)