58 lines
2.0 KiB
Racket
58 lines
2.0 KiB
Racket
#lang racket/base
|
|
|
|
(require rackunit
|
|
racket/string
|
|
racket/file
|
|
racket/system)
|
|
|
|
(provide check-js-equal?
|
|
check-js-contains?
|
|
check-js-matches?
|
|
node-available?
|
|
run-js/trimmed)
|
|
|
|
(define-check (check-js-equal? actual expected)
|
|
(check-equal? actual expected))
|
|
|
|
(define-check (check-js-contains? actual needle)
|
|
(check-true (string-contains? actual needle)
|
|
(format "expected generated JavaScript to contain ~s, got:\n~a" needle actual)))
|
|
|
|
(define-check (check-js-matches? actual pattern)
|
|
(check-true (regexp-match? pattern actual)
|
|
(format "expected generated JavaScript to match ~s, got:\n~a" pattern actual)))
|
|
|
|
(define (node-available?)
|
|
(and (find-executable-path "node") #t))
|
|
|
|
(define (run-js/trimmed program)
|
|
(define node (find-executable-path "node"))
|
|
(unless node
|
|
(error 'run-js/trimmed "node is not available"))
|
|
(define source-path (make-temporary-file "js-maker-test-~a.js"))
|
|
(define out-path (make-temporary-file "js-maker-test-out-~a.txt"))
|
|
(define err-path (make-temporary-file "js-maker-test-err-~a.txt"))
|
|
(dynamic-wind
|
|
void
|
|
(lambda ()
|
|
(call-with-output-file source-path #:exists 'truncate
|
|
(lambda (out) (display program out)))
|
|
(define exit-code
|
|
(call-with-output-file out-path #:exists 'truncate
|
|
(lambda (out)
|
|
(call-with-output-file err-path #:exists 'truncate
|
|
(lambda (err)
|
|
(parameterize ([current-output-port out]
|
|
[current-error-port err])
|
|
(system*/exit-code node source-path)))))))
|
|
(define stdout (file->string out-path))
|
|
(define stderr (file->string err-path))
|
|
(unless (zero? exit-code)
|
|
(error 'run-js/trimmed
|
|
"node failed with exit code ~a\nstdout:\n~a\nstderr:\n~a\nprogram:\n~a"
|
|
exit-code stdout stderr program))
|
|
(string-trim stdout))
|
|
(lambda ()
|
|
(for ([path (list source-path out-path err-path)])
|
|
(with-handlers ([exn:fail? void]) (delete-file path))))))
|