ert-x: Move window selection logic to its own macro

* lisp/emacs-lisp/ert-x.el (ert-with-buffer-selected): New macro to
temporarily display a buffer in a selected window and evaluate a body.
(ert-with-test-buffer-selected): Use the new macro.
* test/lisp/whitespace-tests.el
(ert-test-with-buffer-selected/current)
(ert-test-with-buffer-selected/selected)
(ert-test-with-buffer-selected/nil-buffer)
(ert-test-with-buffer-selected/modification-hooks)
(ert-test-with-buffer-selected/read-only)
(ert-test-with-buffer-selected/return-value): Add tests.
(Bug#60189)
This commit is contained in:
Richard Hansen 2022-12-17 18:51:33 -05:00 committed by Eli Zaretskii
parent 823c49cea8
commit 286c48137f
2 changed files with 55 additions and 10 deletions

View file

@ -102,25 +102,36 @@ the name of the test and the result of NAME-FORM."
(indent 1)) (indent 1))
`(ert--call-with-test-buffer ,name-form (lambda () ,@body))) `(ert--call-with-test-buffer ,name-form (lambda () ,@body)))
(cl-defmacro ert-with-test-buffer-selected ((&key name) (cl-defmacro ert-with-buffer-selected (buffer-or-name &body body)
&body body) "Display a buffer in a temporary selected window and run BODY.
"Create a test buffer, switch to it, and run BODY.
This extends `ert-with-test-buffer' by displaying the test If BUFFER-OR-NAME is nil, the current buffer is used.
buffer (whose name is derived from NAME) in a temporary window.
The temporary window becomes the `selected-window' before BODY is The buffer is made the current buffer, and the temporary window
evaluated. The modification hooks `before-change-functions' and becomes the `selected-window', before BODY is evaluated. The
modification hooks `before-change-functions' and
`after-change-functions' are not inhibited during the evaluation `after-change-functions' are not inhibited during the evaluation
of BODY, which makes it easier to use `execute-kbd-macro' to of BODY, which makes it easier to use `execute-kbd-macro' to
simulate user interaction. The window configuration is restored simulate user interaction. The window configuration is restored
before returning, even if BODY exits nonlocally. The return before returning, even if BODY exits nonlocally. The return
value is the last form in BODY." value is the last form in BODY."
(declare (debug ((":name" form) body)) (indent 1)) (declare (debug (form body)) (indent 1))
`(ert-with-test-buffer (:name ,name) `(save-window-excursion
(save-window-excursion (with-current-buffer (or ,buffer-or-name (current-buffer))
(with-selected-window (display-buffer (current-buffer)) (with-selected-window (display-buffer (current-buffer))
,@body)))) ,@body))))
(cl-defmacro ert-with-test-buffer-selected ((&key name) &body body)
"Create a test buffer, switch to it, and run BODY.
This combines `ert-with-test-buffer' and
`ert-with-buffer-selected'. The return value is the last form in
BODY."
(declare (debug ((":name" form) body)) (indent 1))
`(ert-with-test-buffer (:name ,name)
(ert-with-buffer-selected (current-buffer)
,@body)))
;;;###autoload ;;;###autoload
(defun ert-kill-all-test-buffers () (defun ert-kill-all-test-buffers ()
"Kill all test buffers that are still live." "Kill all test buffers that are still live."

View file

@ -82,6 +82,40 @@
(should-not (buffer-live-p buffer-1)) (should-not (buffer-live-p buffer-1))
(should (buffer-live-p buffer-2)))))) (should (buffer-live-p buffer-2))))))
(ert-deftest ert-test-with-buffer-selected/current ()
(let ((origbuf (current-buffer)))
(ert-with-test-buffer ()
(let ((buf (current-buffer)))
(should (not (eq buf origbuf)))
(with-current-buffer origbuf
(ert-with-buffer-selected buf
(should (eq (current-buffer) buf))))))))
(ert-deftest ert-test-with-buffer-selected/selected ()
(ert-with-test-buffer ()
(ert-with-buffer-selected (current-buffer)
(should (eq (window-buffer) (current-buffer))))))
(ert-deftest ert-test-with-buffer-selected/nil-buffer ()
(ert-with-test-buffer ()
(let ((buf (current-buffer)))
(ert-with-buffer-selected nil
(should (eq (window-buffer) buf))))))
(ert-deftest ert-test-with-buffer-selected/modification-hooks ()
(ert-with-test-buffer ()
(ert-with-buffer-selected (current-buffer)
(should (null inhibit-modification-hooks)))))
(ert-deftest ert-test-with-buffer-selected/read-only ()
(ert-with-test-buffer ()
(ert-with-buffer-selected (current-buffer)
(should (null inhibit-read-only))
(should (null buffer-read-only)))))
(ert-deftest ert-test-with-buffer-selected/return-value ()
(should (equal (ert-with-buffer-selected nil "foo") "foo")))
(ert-deftest ert-test-with-test-buffer-selected/selected () (ert-deftest ert-test-with-test-buffer-selected/selected ()
(ert-with-test-buffer-selected () (ert-with-test-buffer-selected ()
(should (eq (window-buffer) (current-buffer))))) (should (eq (window-buffer) (current-buffer)))))