(module testing-shared mzscheme
  (require (lib "contract.ss")
           "shared.ss"
           (lib "kerncase.ss" "syntax")
           (lib "file.ss"))
  
  (provide/contract [build-stx-with-highlight ((union (listof any/c) string?) ; input with one or more '(hilite ...) tags
                                               . -> .
                                               (listof syntax?))]) ; result
  
  (define (build-stx-with-highlight input)
    (let ([temp-file (make-temporary-file)])
      (call-with-output-file temp-file
        (lambda (port)
          (if (string? input)
              (display input port)
              (map (lambda (sexp) (write sexp port) (display #\space port)) input)))
        'truncate)
      (begin0
        (let ([file-port (open-input-file temp-file)])
          (let read-loop ([stx (read-syntax temp-file file-port)])
            (if (eof-object? stx)
                null
                (cons
                 (let stx-loop ([stx stx])
                   (syntax-case stx (hilite)
                     [(hilite x)
                      (syntax-property (stx-loop #`x) 'stepper-highlight #t)]
                     [(a . rest) (datum->syntax-object stx (cons (stx-loop #`a) (stx-loop #`rest)) stx stx)]
                     [else stx]))
                 (read-loop (read-syntax temp-file file-port))))))
        (delete-file temp-file))))
  
;  (require (lib "mz-testing.ss" "tests" "utils")
;           (lib "sexp-diff.ss" "tests" "utils"))
; (test `((define a 13) 14 15 #f 1)
;       map
;       syntax-object->datum
;       (build-stx-with-highlight `((define a 13)  14 15 #f 1)))
  
;      (let ([test-run (build-stx-with-highlight `((+ (hilite x) (hilite (+ (hilite 13) (a b))))))])
;        (test #t (lambda () (and (pair? test-run) (null? (cdr test-run)))))
;        (let ([test-stx (car test-run)])
;          (test `(+ x (+ 13 (a b)))
;                syntax-object->datum test-stx)
;          (test #f syntax-property test-stx 'stepper-highlight)
;          (test #t syntax-property (car (syntax-e (cdr (syntax-e test-stx)))) 'stepper-highlight)
;          (test #t syntax-property (syntax-case test-stx ()
;                                     [(+ x target)
;                                      #`target])
;                'stepper-highlight)
;          (test #t syntax-property (syntax-case test-stx (#%app)
;                                     [(+ x (a target d))
;                                      #`target])
;                'stepper-highlight)))
;  
;
;  
;   (let ([test-sexp `(+ (hilite x) (hilite (+ (hilite 13) (a b))))])
;     (test #t equal? test-sexp (syntax-object->hilite-datum (car (build-stx-with-highlight (list test-sexp))))))
  
  )
