Fix elisp-tests-with-temp-buffer compilation

* test/lisp/emacs-lisp/lisp-tests.el (elisp-tests-with-temp-buffer):
Don't refer to the =!NAME= as "markers" since they produce variables
with just plain positions, not marker objects.  Explicitly specify
that CONTENTS is evaluated at compile time.  Don't re-evaluate
CONTENTS at runtime.  Fix debug specification.  Suppress warnings due
to BODY not using =!NAME= variables.
(elisp-test-point-position-regex): Rename from
`elisp-test-point-marker-regex'.
(mark-defun-test-buffer): Wrap in `eval-and-compile'.
This commit is contained in:
Noam Postavsky 2017-04-27 17:13:33 -04:00 committed by Marcin Borkowski
parent 0397f85c6f
commit cb8fcbc3cb

View file

@ -306,46 +306,46 @@
;;; Helpers
(defvar elisp-test-point-marker-regex "=!\\([a-zA-Z0-9-]+\\)="
"A regexp matching placeholders for point position for
`elisp-tests-with-temp-buffer'.")
(eval-and-compile
(defvar elisp-test-point-position-regex "=!\\([a-zA-Z0-9-]+\\)="
"A regexp matching placeholders for point position for
`elisp-tests-with-temp-buffer'."))
;; Copied and heavily modified from `python-tests-with-temp-buffer'
(defmacro elisp-tests-with-temp-buffer (contents &rest body)
"Create an `emacs-lisp-mode' enabled temp buffer with CONTENTS.
BODY is the code to be executed within the temp buffer. Point is
always located at the beginning of buffer. Special markers of
the form =!NAME= in CONTENTS are removed, and a for each one
a variable called NAME is bound to the position of such
a marker."
(declare (indent 1) (debug t))
`(with-temp-buffer
(emacs-lisp-mode)
(insert ,contents)
(goto-char (point-min))
(while (re-search-forward elisp-test-point-marker-regex nil t)
(delete-region (match-beginning 0)
(match-end 0)))
(goto-char (point-min))
,(let (marker-list)
(with-temp-buffer
(insert (cond ((symbolp contents)
(symbol-value contents))
(t contents)))
(goto-char (point-min))
(while (re-search-forward elisp-test-point-marker-regex nil t)
(push (list (intern (match-string-no-properties 1))
(match-beginning 0))
marker-list)
(delete-region (match-beginning 0)
(match-end 0))))
`(let ,marker-list
,@body))))
always located at the beginning of buffer. CONTENTS is an
expression that must evaluate to a string at compile time. Words
of the form =!NAME= in CONTENTS are removed, and a for each one a
variable called NAME is bound to the position of the word's
start."
(declare (indent 1) (debug (def-form body)))
(let* ((var-pos nil)
(text (with-temp-buffer
(insert (eval contents))
(goto-char (point-min))
(while (re-search-forward elisp-test-point-position-regex nil t)
(push (list (intern (match-string-no-properties 1))
(match-beginning 0))
var-pos)
(delete-region (match-beginning 0)
(match-end 0)))
(buffer-string))))
`(with-temp-buffer
(emacs-lisp-mode)
(insert ,text)
(goto-char (point-min))
(let ,var-pos
;; Let the =!POSITION= variables be ignorable.
,@(mapcar (lambda (v-p) `(ignore ,(car v-p))) var-pos)
,@body))))
;;; mark-defun
(defvar mark-defun-test-buffer
";; Comment header
(eval-and-compile
(defvar mark-defun-test-buffer
";; Comment header
=!before-1=
\(defun func-1 (arg)
=!inside-1=\"docstring\"
@ -365,7 +365,7 @@ a marker."
=!after-4=
;; end
"
"Test buffer for `mark-defun'.")
"Test buffer for `mark-defun'."))
(ert-deftest mark-defun-no-arg-region-inactive ()
"Test `mark-defun' with no prefix argument and inactive