Skip to content

Instantly share code, notes, and snippets.

@hugoduncan
Last active December 11, 2015 21:19
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hugoduncan/4662037 to your computer and use it in GitHub Desktop.
Save hugoduncan/4662037 to your computer and use it in GitHub Desktop.
Examine failed test using ediff to compare actual and expected results
(defvar clojure-test-ediff-buffers nil)
(defun clojure-test-ediff-cleanup ()
"A function for ediff-cleanup-hook, to cleanup the temporary ediff buffers"
(mapc #'kill-buffer clojure-test-ediff-buffers))
(defconst re1
"Expected \\(?:.\\|\n\\)*, got (not ([^ ]+ \\(\"\\(?:.\\|\n\\)+\"\\) \\(\"\\(?:.\\|\n\\)+\"\\)))"
"Match predicate on strings test")
(defconst re2
"Expected \\(?:.\\|\n\\)*, got (not ([^ ]+ \\(\\(?:.\\|\n\\)+\\) \\(\\(?:.\\|\n\\)+\\)))"
"Match predicate test")
(defconst re3 "Expected \\(\\(?:.\\|\n\\)+\\), got \\(\\(?:.\\|\n\\)+\\)"
"Match general test")
(defun clojure-test-ediff-result ()
"Show the result of the test under point as an ediff"
(interactive)
(let ((overlay (find-if (lambda (o) (overlay-get o 'message))
(overlays-at (point)))))
(if overlay
(let* ((m (overlay-get overlay 'message))
(f (or (string-match re1 m)
(string-match re2 m)
(string-match re3 m))))
(message m)
(if f
(let ((exp-buffer (generate-new-buffer " *expected*"))
(act-buffer (generate-new-buffer " *actual*")))
(with-current-buffer exp-buffer
(insert (match-string-no-properties 1 m)))
(with-current-buffer act-buffer
(insert (match-string-no-properties 2 m)))
(setq clojure-test-ediff-buffers
(list (buffer-name exp-buffer) (buffer-name act-buffer)))
(ediff-buffers
(buffer-name exp-buffer) (buffer-name act-buffer)))
(message "Error, regex failed to match"))))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment