
* Make each test file runnable using `module+'. * Make the space tests not print anything (unless they fail, of course). * Make the `first-class?' case even "more first class" by defining their and/or as functions. (Doesn't make a real difference for this test, but nice to test more of the language.)
48 lines
1.5 KiB
Racket
48 lines
1.5 KiB
Racket
#lang racket/base
|
|
|
|
(require tests/eli-tester)
|
|
|
|
;; tests for space safety, especially for `or' and `and'
|
|
(provide space-tests)
|
|
(module+ main (space-tests))
|
|
(define (space-tests)
|
|
(define (one-test first-class?)
|
|
(collect-garbage)
|
|
(define mem (current-memory-use))
|
|
(define t
|
|
(thread
|
|
(lambda ()
|
|
(parameterize ([current-namespace (make-base-namespace)])
|
|
(eval
|
|
`(module loop lazy
|
|
(let ()
|
|
(define (list-from n)
|
|
(if (= n 500000)
|
|
empty
|
|
(cons n (list-from (add1 n)))))
|
|
,@(if first-class?
|
|
`((define (my-or x y) (or x y))
|
|
(define (my-and x y) (and x y)))
|
|
'())
|
|
(define (has-negative? l)
|
|
(,(if first-class? 'my-and 'and)
|
|
(pair? l)
|
|
(,(if first-class? 'my-or 'or)
|
|
(negative? (car l))
|
|
(has-negative? (rest l)))))
|
|
(! (has-negative? (list-from 0))))))
|
|
(parameterize ([current-output-port (open-output-bytes)])
|
|
(eval `(require 'loop)))))))
|
|
(thread (lambda ()
|
|
(let loop ()
|
|
(sleep 0.2)
|
|
(unless ((current-memory-use) . < . (* 10 mem))
|
|
(eprintf "too much memory!")
|
|
(kill-thread t))
|
|
(when (thread-running? t)
|
|
(loop)))))
|
|
(sync t)
|
|
(void))
|
|
(one-test #f)
|
|
(one-test #t))
|