52 lines
1.5 KiB
Racket
52 lines
1.5 KiB
Racket
#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))
|