GNU bug report logs - #65851
29.1.50; `ert-simulate-command' and non-local exits

Previous Next

Package: emacs;

Reported by: Sebastian Miele <iota <at> whxvd.name>

Date: Sun, 10 Sep 2023 10:18:01 UTC

Severity: normal

Found in version 29.1.50

To reply to this bug, email your comments to 65851 AT debbugs.gnu.org.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#65851; Package emacs. (Sun, 10 Sep 2023 10:18:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Sebastian Miele <iota <at> whxvd.name>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Sun, 10 Sep 2023 10:18:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Sebastian Miele <iota <at> whxvd.name>
To: bug-gnu-emacs <at> gnu.org
Subject: 29.1.50; `ert-simulate-command' and non-local exits
Date: Sun, 10 Sep 2023 11:49:07 +0200
In GNU Emacs 29.1.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version
 3.24.38, cairo version 1.17.8) of 2023-09-06 built on huette

When a command exits non-locally (e.g., by calling `user-error'), the
command loop seems to still do what `ert-simulate-command' in that case
currently does not (e.g., run `post-command-hook', and set
`last-command').

At the moment, the Emacs sources have less than 40 uses of
`ert-simulate-command'.  None of them seems to be wrapped in anything
like `(should-error …)'.  So this has not become an issue in Emacs
testing so far.

Also, in the tests I am currently writing, I could live without
`ert-simulate-command' handling non-local exits like the command loop
does, because I do not need `ert-simulate-command' in that particular
cases.

I do not really know the details of what the command loop actually does.

But wouldn't something like the following be more "in line" with what
the command loop does?

diff --git a/lisp/emacs-lisp/ert-x.el b/lisp/emacs-lisp/ert-x.el
index 98a017c8a8e..e7c670b27c9 100644
--- a/lisp/emacs-lisp/ert-x.el
+++ b/lisp/emacs-lisp/ert-x.el
@@ -173,28 +173,26 @@ ert-simulate-command
   (cl-assert (listp command) t)
   (cl-assert (commandp (car command)) t)
   (cl-assert (not unread-command-events) t)
-  (let (return-value)
-    ;; For the order of things here see command_loop_1 in keyboard.c.
-    ;;
-    ;; The command loop will reset the command-related variables so
-    ;; there is no reason to let-bind them. They are set here,
-    ;; however, to be able to test several commands in a row and how
-    ;; they affect each other.
-    (setq deactivate-mark nil
-          this-original-command (car command)
-          ;; remap through active keymaps
-          this-command (or (command-remapping this-original-command)
-                           this-original-command))
-    (run-hooks 'pre-command-hook)
-    (setq return-value (apply (car command) (cdr command)))
+  ;; For the order of things here see command_loop_1 in keyboard.c.
+  ;;
+  ;; The command loop will reset the command-related variables so
+  ;; there is no reason to let-bind them. They are set here,
+  ;; however, to be able to test several commands in a row and how
+  ;; they affect each other.
+  (setq deactivate-mark nil
+        this-original-command (car command)
+        ;; remap through active keymaps
+        this-command (or (command-remapping this-original-command)
+                         this-original-command))
+  (run-hooks 'pre-command-hook)
+  (unwind-protect (apply (car command) (cdr command))
     (run-hooks 'post-command-hook)
     (setq real-last-command (car command)
           last-command this-command)
     (when (boundp 'last-repeatable-command)
       (setq last-repeatable-command real-last-command))
     (when (and deactivate-mark transient-mark-mode) (deactivate-mark))
-    (cl-assert (not unread-command-events) t)
-    return-value))
+    (cl-assert (not unread-command-events) t)))
 
 (defmacro ert-simulate-keys (keys &rest body)
   "Execute BODY with KEYS as pseudo-interactive input."




This bug report was last modified 1 year and 78 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.