diff --git a/collects/rackunit/private/check.rkt b/collects/rackunit/private/check.rkt index 148d33f262..f4bb83db56 100644 --- a/collects/rackunit/private/check.rkt +++ b/collects/rackunit/private/check.rkt @@ -2,7 +2,6 @@ (require (for-syntax racket/base "location.rkt") - srfi/1 "base.rkt" "check-info.rkt" "format.rkt" @@ -34,39 +33,50 @@ check-not-equal? fail) + +(define USE-ERROR-HANDLER? #f) + +;; default-check-handler : exn -> any +(define (default-check-handler e) + (let ([out (open-output-string)]) + ;;(display "check failed\n" out) + (parameterize ((current-output-port out)) + (display-delimiter) + (cond [(exn:test:check? e) + (display-failure) + (newline) + (display-check-info-stack + (exn:test:check-stack e))] + [(exn? e) + (display-error) + (newline) + (display-exn e)]) + (display-delimiter)) + (cond [USE-ERROR-HANDLER? + ((error-display-handler) (get-output-string out) + ;; So that DrRacket won't recognize exn:fail:syntax, etc + (make-exn (exn-message exn) (exn-continuation-marks exn)))] + [else + (display (get-output-string out) (current-error-port))]))) + ;; parameter current-check-handler : (-> exn any) (define current-check-handler (make-parameter - (lambda (e) - (cond - [(exn:test:check? e) - (display-delimiter) - (display-failure)(newline) - (display-check-info-stack - (exn:test:check-stack e)) - (display-delimiter)] - [(exn? e) - (display-delimiter) - (display-error)(newline) - (display-exn e) - (display-delimiter)])) + default-check-handler (lambda (v) (if (procedure? v) v (raise-type-error 'current-check-handler "procedure" v))))) ;; check-around : ( -> a) -> a -(define check-around - (lambda (thunk) - (with-handlers - ([exn? (current-check-handler)]) - (thunk)))) +(define (check-around thunk) + (with-handlers ([exn? (current-check-handler)]) + (thunk))) ;; top-level-check-around : ( -> a) -> a -(define top-level-check-around - (lambda (thunk) - (check-around thunk) - (void))) +(define (top-level-check-around thunk) + (check-around thunk) + (void)) ;; parameter current-check-around : (( -> a) -> a) (define current-check-around diff --git a/collects/rackunit/private/test-case.rkt b/collects/rackunit/private/test-case.rkt index ff1f578f22..36f18b2965 100644 --- a/collects/rackunit/private/test-case.rkt +++ b/collects/rackunit/private/test-case.rkt @@ -16,47 +16,52 @@ after around) +(define USE-ERROR-HANDLER? #f) + (define current-test-name (make-parameter #f (lambda (v) (if (string? v) v - (raise-mismatch-error - 'current-test-name - "string?" - v))))) + (raise-type-error 'current-test-name "string" v))))) ;; test-case-around : ( -> a) -> a ;; ;; Run a test-case immediately, printing information on failure -(define test-case-around - (lambda (thunk) - (with-handlers - ([exn:test:check? - (lambda (e) - (display-delimiter) - (display-test-name (current-test-name)) - (display-failure)(newline) - (display-check-info-stack (exn:test:check-stack e)) - (display-delimiter))] - [exn? - (lambda (e) - (display-delimiter) - (display-test-name (current-test-name)) - (display-error)(newline) - (display-exn e) - (display-delimiter))]) - (thunk)))) - +(define (default-test-case-around thunk) + (with-handlers ([exn? default-test-case-handler]) + (thunk))) + +;; default-test-case-handler : exn -> any +(define (default-test-case-handler e) + (let ([out (open-output-string)]) + ;;(display "test case failed\n" out) + (parameterize ((current-output-port out)) + (display-delimiter) + (display-test-name (current-test-name)) + (cond [(exn:test:check? e) + (display-failure)(newline) + (display-check-info-stack (exn:test:check-stack e))] + [(exn? e) + (display-error)(newline) + (display-exn e)]) + (display-delimiter)) + (cond [USE-ERROR-HANDLER? + ((error-display-handler) (get-output-string out) + ;; So that DrRacket won't recognize exn:fail:syntax, etc + (make-exn (exn-message e) (exn-continuation-marks e)))] + [else + (display (get-output-string out) (current-error-port))]))) + (define current-test-case-around (make-parameter - test-case-around + default-test-case-around (lambda (v) (if (procedure? v) v - (raise-type-error 'current-test-case-around "procedure" v))))) - + (raise-type-error 'current-test-case-around "procedure" v))))) + (define-syntax (test-begin stx) (syntax-case stx () [(_ expr ...) @@ -66,6 +71,7 @@ (parameterize ([current-check-handler raise] [current-check-around check-around]) + (void) expr ...))))] [_ (raise-syntax-error @@ -73,7 +79,6 @@ "Correct form is (test-begin expr ...)" stx)])) - (define-syntax test-case (syntax-rules () [(test-case name expr ...) @@ -81,7 +86,6 @@ ([current-test-name name]) (test-begin expr ...))])) - (define-syntax before (syntax-rules () ((_ before-e expr1 expr2 ...) @@ -132,4 +136,3 @@ "Incorrect use of around macro. Correct format is (around before-expr expr1 expr2 ... after-expr)" 'around '(error ...))))) -