branch: elpa/buttercup commit ef7b730c0c6b0f45716bf473f90a1530aa587ec0 Author: Jorgen Schaefer <cont...@jorgenschaefer.de> Commit: Jorgen Schaefer <cont...@jorgenschaefer.de>
Various improvements of the batch reporter. --- buttercup-test.el | 2 +- buttercup.el | 62 ++++++++++++++++++++++++++++++++++++++----------------- 2 files changed, 44 insertions(+), 20 deletions(-) diff --git a/buttercup-test.el b/buttercup-test.el index 9d8bd4d..ec5068e 100644 --- a/buttercup-test.el +++ b/buttercup-test.el @@ -565,7 +565,7 @@ (expect 'buttercup--print :to-have-been-called-with - "%s%s\n" + "%s%s" " " "spec")) diff --git a/buttercup.el b/buttercup.el index e82950e..ce23743 100644 --- a/buttercup.el +++ b/buttercup.el @@ -632,7 +632,8 @@ current directory." (defun buttercup-run () (if buttercup-suites - (progn + (let ((print-escape-newlines t) + (print-escape-nonascii t)) (funcall buttercup-reporter 'buttercup-started buttercup-suites) (mapc #'buttercup--run-suite buttercup-suites) (funcall buttercup-reporter 'buttercup-done buttercup-suites)) @@ -710,9 +711,16 @@ suite-done -- A suite has finished. The argument is the spec. buttercup-done -- All suites have run, the test run is over.") +(defvar buttercup-reporter-batch--start-time nil + "The time the last batch report started.") + +(defvar buttercup-reporter-batch--failures nil + "List of failed specs of the current batch report.") + (defun buttercup-reporter-batch (event arg) (pcase event (`buttercup-started + (setq buttercup-reporter-batch--start-time (float-time)) (buttercup--print "Running %s specs.\n\n" (buttercup-suites-total-specs-defined arg))) @@ -724,38 +732,55 @@ buttercup-done -- All suites have run, the test run is over.") (`spec-started (let ((level (length (buttercup-spec-parents arg)))) - (buttercup--print "%s%s\n" + (buttercup--print "%s%s" (make-string (* 2 level) ?\s) (buttercup-spec-description arg)))) (`spec-done (cond ((eq (buttercup-spec-status arg) 'passed) - t) + (buttercup--print "\n")) ((eq (buttercup-spec-status arg) 'failed) - (let ((description (buttercup-spec-failure-description arg)) - (stack (buttercup-spec-failure-stack arg))) - (when stack - (buttercup--print "\nTraceback (most recent call last):\n") - (dolist (frame stack) - (buttercup--print " %S\n" (cdr frame)))) - (if (stringp description) - (buttercup--print "FAILED: %s\n" - (buttercup-spec-failure-description arg)) - (buttercup--print "%S: %S\n\n" (car err) (cdr err))) - (buttercup--print "\n"))) + (buttercup--print " FAILED\n") + (setq buttercup-reporter-batch--failures + (append buttercup-reporter-batch--failures + (list arg)))) (t - (buttercup--print "??? %S\n" (buttercup-spec-status arg))))) + (error "Unknown spec status %s" (buttercup-spec-status arg))))) (`suite-done (when (= 0 (length (buttercup-suite-parents arg))) (buttercup--print "\n"))) (`buttercup-done - (buttercup--print "Ran %s specs, %s failed.\n" + (dolist (failed buttercup-reporter-batch--failures) + (let ((description (buttercup-spec-failure-description failed)) + (stack (buttercup-spec-failure-stack failed))) + (buttercup--print "%s\n" (make-string 40 ?=)) + (buttercup--print "%s\n" (buttercup-spec-full-name failed)) + (when stack + (buttercup--print "\nTraceback (most recent call last):\n") + (dolist (frame stack) + (let ((line (format " %S" (cdr frame)))) + (when (> (length line) 79) + (setq line (concat (substring line 0 76) + "..."))) + (buttercup--print "%s\n" line)))) + (cond + ((stringp description) + (buttercup--print "FAILED: %s\n" description)) + ((eq (car description) 'error) + (buttercup--print "%S: %S\n\n" + (car description) + (cadr description))) + (t + (buttercup--print "FAILED: %S\n" description))) + (buttercup--print "\n"))) + (buttercup--print "Ran %s specs, %s failed, in %.1f seconds.\n" (buttercup-suites-total-specs-defined arg) (buttercup-suites-total-specs-failed arg) - ) + (- (float-time) + buttercup-reporter-batch--start-time)) (when (> (buttercup-suites-total-specs-failed arg) 0) (error ""))) @@ -763,8 +788,7 @@ buttercup-done -- All suites have run, the test run is over.") (error "Unknown event %s" event)))) (defun buttercup--print (fmt &rest args) - (let ((print-escape-newlines t)) - (princ (apply #'format fmt args)))) + (send-string-to-terminal (apply #'format fmt args))) ;;;;;;;;;;;;; ;;; Utilities