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