diff options
author | Tianxiang Xiong <tianxiang.xiong@gmail.com> | 2018-03-17 21:57:29 -0700 |
---|---|---|
committer | Bozhidar Batsov <bozhidar.batsov@gmail.com> | 2018-03-18 11:57:29 +0700 |
commit | 418f227e562d8dc0d1ef2e92065adaa4b44376c9 (patch) | |
tree | a3c222fec3e4be1f343f11c9bf3c00c92ab4dd30 /cider-test.el | |
parent | ef56ad6cc1908b7a2ea1a51d75a06d227fe02727 (diff) |
[Fix #2240] `cider-test-ediff` values properly (#2241)
Fix #2240
Always diff eval'ed expected value against first eval'ed actual value.
Diffstat (limited to 'cider-test.el')
-rw-r--r-- | cider-test.el | 63 |
1 files changed, 38 insertions, 25 deletions
diff --git a/cider-test.el b/cider-test.el index aa3a649c..cb6e08a4 100644 --- a/cider-test.el +++ b/cider-test.el @@ -305,35 +305,48 @@ prompt and whether to use a new window. Similar to `cider-find-var'." (defvar cider-test-ediff-buffers nil "The expected/actual buffers used to display diff.") +(defun cider-test--extract-from-actual (actual n) + "Extract form N from ACTUAL, ignoring outermost not. + +ACTUAL is a string like \"(not (= 3 4))\", of the sort returned by +clojure.test. + +N = 1 => 3, N = 2 => 4, etc." + (with-temp-buffer + (insert actual) + (clojure-mode) + (goto-char (point-min)) + (re-search-forward "(" nil t 2) + (clojure-forward-logical-sexp n) + (forward-whitespace 1) + (let ((beg (point))) + (clojure-forward-logical-sexp) + (buffer-substring beg (point))))) + (defun cider-test-ediff () "Show diff of the expected vs actual value for the test at point. With the actual value, the outermost '(not ...)' s-expression is removed." (interactive) - (let ((expected (get-text-property (point) 'expected)) - (actual (get-text-property (point) 'actual))) - (if (and expected actual) - (let ((expected-buffer (generate-new-buffer " *expected*")) - (actual-buffer (generate-new-buffer " *actual*"))) - (with-current-buffer expected-buffer - (insert expected) - (clojure-mode)) - (with-current-buffer actual-buffer - (insert actual) - (goto-char (point-min)) - (forward-char) - (forward-sexp) - (forward-whitespace 1) - (let ((beg (point))) - (forward-sexp) - (let ((actual* (buffer-substring beg (point)))) - (erase-buffer) - (insert actual*))) - (clojure-mode)) - (apply 'ediff-buffers - (setq cider-test-ediff-buffers - (list (buffer-name expected-buffer) - (buffer-name actual-buffer))))) - (message "No test failure at point")))) + (let* ((expected-buffer (generate-new-buffer " *expected*")) + (actual-buffer (generate-new-buffer " *actual*")) + (diffs (get-text-property (point) 'diffs)) + (actual* (get-text-property (point) 'actual)) + (expected (cond (diffs (get-text-property (point) 'expected)) + (actual* (cider-test--extract-from-actual actual* 1)))) + (actual (cond (diffs (caar diffs)) + (actual* (cider-test--extract-from-actual actual* 2))))) + (if (not (and expected actual)) + (message "No test failure at point") + (with-current-buffer expected-buffer + (insert expected) + (clojure-mode)) + (with-current-buffer actual-buffer + (insert actual) + (clojure-mode)) + (apply #'ediff-buffers + (setq cider-test-ediff-buffers + (list (buffer-name expected-buffer) + (buffer-name actual-buffer))))))) (defun cider-test-ediff-cleanup () "Cleanup expected/actual buffers used for diff." |