#lang racket/base (require rackunit "../main.rkt" "jsmaker-test-framework.rkt") (provide program-tests) (define ordinary-let-program (string-append (js (define (ordinary-let x) (let ([x 1] [y x]) (return y)))) "console.log(ordinary_let(99));\n")) (define sequential-let-program (string-append (js (define (sequential-let x) (let* ([x 1] [y x]) (return y)))) "console.log(sequential_let(99));\n")) (define named-let-program (string-append (js (define (sum-to n) (let loop ([i 0] [acc 0]) (if (> i n) (return acc) (loop (+ i 1) (+ acc i)))))) "console.log(sum_to(10));\n")) (define program-tests (test-suite "generated JavaScript program behavior" (test-case "ordinary let uses parallel Racket binding semantics" (check-js-contains? ordinary-let-program "const") (check-js-contains? ordinary-let-program "let x") (when (node-available?) (check-equal? (run-js/trimmed ordinary-let-program) "99"))) (test-case "let* uses sequential binding semantics" (when (node-available?) (check-equal? (run-js/trimmed sequential-let-program) "1"))) (test-case "named let compiles to a while loop with parallel updates" (check-js-contains? named-let-program "while (true)") (check-js-contains? named-let-program "continue;") (when (node-available?) (check-equal? (run-js/trimmed named-let-program) "55"))))) (module+ test (require rackunit/text-ui) (run-tests program-tests))