summaryrefslogtreecommitdiff
path: root/cider-test.el
diff options
context:
space:
mode:
authorTianxiang Xiong <tianxiang.xiong@gmail.com>2018-03-17 21:57:29 -0700
committerBozhidar Batsov <bozhidar.batsov@gmail.com>2018-03-18 11:57:29 +0700
commit418f227e562d8dc0d1ef2e92065adaa4b44376c9 (patch)
treea3c222fec3e4be1f343f11c9bf3c00c92ab4dd30 /cider-test.el
parentef56ad6cc1908b7a2ea1a51d75a06d227fe02727 (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.el63
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."