#lang racket
(require "private/drracket-test-util.rkt")

#|

This test checks to see if the code that htdp-lang.rkt injects
into the teaching languages relies only on modules that are
shared between drracket's and the teaching languages's namespace.

In practice when this test fails it means that some code in
langs/htdp-lang.rkt has something like #'(f) for some function
f that is intended to be eval'd in the teaching languages and 
it should instead have #'(#%plain-app f). In that case, this
test fails because the #'(f) is reall #'(#%app f) which uses
the application form from racket/base and that #%app macro
is not there in the teaching languages (since the modules
implementing it are not being shared, you get a different instance
of that macro, tho; one that triggers an error).

Of course, other (similar) things can go wrong, too.

|#

(define things-to-try
  (list '(check-expect 1 1)
        '(check-within 1 1.01 2)
        '(check-error (car))
        '(check-error (error 'x "y") "x: y")
        '(check-member-of 1 2 3 1 4)
        '(check-range 1 0 2)))

(define first-line-output (format "All ~a tests passed!" (length things-to-try)))

(define (go)
  (fire-up-drscheme-and-run-tests
   (λ ()
     (putenv "PLTDRHTDPNOCOMPILED" "yes")
     (define drs-frame (wait-for-drscheme-frame))
     (set-language-level! '("How to Design Programs" "Beginning Student"))
     (clear-definitions drs-frame)
     (for ([exp (in-list things-to-try)])
       (insert-in-definitions drs-frame (format "~s\n" exp)))
     (do-execute drs-frame)
     (let ([output (fetch-output drs-frame)])
       (cond
         [(equal? output first-line-output)
          (try-interaction-test drs-frame)]
         [else
          (fprintf (current-error-port)
                   "teaching-lang-sharing-modules.rkt: got bad output from execute: ~s"
                   output)])))))

(define (try-interaction-test drs-frame)
  (type-in-interactions drs-frame "1\n")
  (wait-for-computation drs-frame)
  (let ([interactions-output (fetch-output drs-frame)])
    (unless (equal? interactions-output (format "~a\n> 1\n1" first-line-output))
      (error 'teaching-language-sharing-modules.rkt
             "got bad output from interaction: ~s\n" 
             interactions-output))))

(go)
