lang/parser-test.rkt
#lang racket

(require "parser.rkt"
         rackunit)

(define (try str)
  (define sp (open-input-string str))
  (port-count-lines! sp)
  (with-handlers ((exn:fail:syntax? (λ (x) x)))
    (poppl-read sp)))

(check-equal?
 (try "Boolean x = false;\n=====\nwhen (x) { prompt(red,y,\"Done\"); }")
 '((decl Boolean x false) (when x (begin (prompt red y "Done")))))

(check-equal?
 (try "Boolean x = false;\n=====\nwhen (x or y) { prompt(blue,z,\"Done\"); }")
 '((decl Boolean x false) (when (or x y) (begin (prompt blue z "Done")))))

(check-equal?
 (try "Boolean x = false;\n=====\nif x then prompt(blue,z,\"Done\"); else prompt(green,z,\"Done\"); fi")
 '((decl Boolean x false) (if x (prompt blue z "Done") (prompt green z "Done"))))

(check-equal?
 (try "Boolean x = false;\n=====\nwhen (x or y) { if x then prompt(green,z,\"Done\"); else prompt(blue,z,\"Done\"); fi }")
 '((decl Boolean x false) (when (or x y) (begin (if x (prompt green z "Done") (prompt blue z "Done"))))))

(check-equal?
 (try "Boolean x = false;\n=====\nwhen (x or y) { prompt(blue,z,if x then \"Done\" else \"Undone\" fi); }")
 '((decl Boolean x false) 
   (when (or x y)
     (begin (prompt blue z (if x "Done" "Undone"))))))