[plt-scheme] module access from test cases file
On Jan 15, Noel Welsh wrote:
>
> On Thu, Jan 15, 2009 at 8:56 AM, Sigrid Keydana <keydana at gmx.de> wrote:
> > I would like to keep my test cases in a file separate from the
> > main application, but this seems to mean I have to export all
> > tested functions from the module (with provide), which I don't
> > need/want to otherwise.
>
> See require/expose in SchemeUnit. Or just provide all the
> definitions you want. People will only program to the documented
> API so really it isn't worth worrying about.
Even better for test cases is to use the sandbox library. For
example:
(require scheme/sandbox)
(define e (make-module-evaluator (string->path "...your file...")))
(e '...some-expression...)
Some notes:
* `make-module-evaluator' is suited for cases where you have some code
that is a module, and you want to get an evaluator in that context.
The result is an evaluator function that is very similar to a
drscheme repl in the `Module' language.
* The reason for the `string->path' is that giving it a string will
try to evaluate the string as containing the source for a module.
* The sandbox is very secure by default -- it is intended to be
convenient for running random code. So in the above, the module
code will not be allowed to access the filesystem, the network, and
a number of other restriction. It is also common to want a sandbox
for trusted code -- especially in testing code you usually will want
the convenience of the sandboxed evaluator, but without the
restrictions.
In the current svn version (which will turn to a new release
shortly) there is a convenient utility for this:
(define e
(call-with-trusted-sandbox-configuration
(lambda ()
(make-module-evaluator (string->path "...your file...")))))
* Finally, you can go to an even less sandboxed environment using
`module->namespace'. For example:
(require (file "...your file..."))
(define e
(let ([ns (module->namespace '(file "...your file..."))])
(lambda (expr) (eval expr ns))))
(e '...some-expression...)
This is, very roughly, the core of the sandbox library -- which
takes care of a bunch of other considerations. (It is also how the
`require/expose' form that Noel mentioned works.)
--
((lambda (x) (x x)) (lambda (x) (x x))) Eli Barzilay:
http://www.barzilay.org/ Maze is Life!