Function: ert--run-test-debugger

ert--run-test-debugger is a byte-compiled function defined in ert.el.gz.

Signature

(ert--run-test-debugger INFO ARGS)

Documentation

During a test run, debugger is bound to a closure that calls this function.

This function records failures and errors and either terminates the test silently or calls the interactive debugger, as appropriate.

INFO is the ert--test-execution-info corresponding to this test run. ARGS are the arguments to debugger.

Source Code

;; Defined in /usr/src/emacs/lisp/emacs-lisp/ert.el.gz
(defun ert--run-test-debugger (info args)
  "During a test run, `debugger' is bound to a closure that calls this function.

This function records failures and errors and either terminates
the test silently or calls the interactive debugger, as
appropriate.

INFO is the ert--test-execution-info corresponding to this test
run.  ARGS are the arguments to `debugger'."
  (cl-destructuring-bind (first-debugger-arg &rest more-debugger-args)
      args
    (cl-ecase first-debugger-arg
      ((lambda debug t exit nil)
       (apply (ert--test-execution-info-next-debugger info) args))
      (error
       (let* ((condition (car more-debugger-args))
              (type (cl-case (car condition)
                      ((quit) 'quit)
		      ((ert-test-skipped) 'skipped)
                      (otherwise 'failed)))
              ;; We store the backtrace in the result object for
              ;; `ert-results-pop-to-backtrace-for-test-at-point'.
              ;; This means we have to limit `print-level' and
              ;; `print-length' when printing result objects.  That
              ;; might not be worth while when we can also use
              ;; `ert-results-rerun-test-at-point-debugging-errors',
              ;; (i.e., when running interactively) but having the
              ;; backtrace ready for printing is important for batch
              ;; use.
              ;;
              ;; Grab the frames above the debugger.
              (backtrace (cdr (backtrace-get-frames debugger)))
              (infos (reverse ert--infos)))
         (setf (ert--test-execution-info-result info)
               (cl-ecase type
                 (quit
                  (make-ert-test-quit :condition condition
                                      :backtrace backtrace
                                      :infos infos))
                 (skipped
                  (make-ert-test-skipped :condition condition
                                        :backtrace backtrace
                                        :infos infos))
                 (failed
                  (make-ert-test-failed :condition condition
                                        :backtrace backtrace
                                        :infos infos))))
         ;; Work around Emacs's heuristic (in eval.c) for detecting
         ;; errors in the debugger.
         (cl-incf num-nonmacro-input-events)
         ;; FIXME: We should probably implement more fine-grained
         ;; control a la non-t `debug-on-error' here.
         (cond
          ((ert--test-execution-info-ert-debug-on-error info)
           (apply (ert--test-execution-info-next-debugger info) args))
          (t))
         (funcall (ert--test-execution-info-exit-continuation info)))))))