Files
gemigreerd-js-maker/testing/jsmaker-test-framework.rkt
T
2026-06-08 12:55:08 +02:00

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))))))