]> git.eshelyaron.com Git - emacs.git/commitdiff
Add elisp-tests-with-temp-buffer, a new testing macro
authorMarcin Borkowski <mbork@mbork.pl>
Tue, 14 Feb 2017 10:30:36 +0000 (11:30 +0100)
committerMarcin Borkowski <mbork@mbork.pl>
Tue, 9 May 2017 12:26:08 +0000 (14:26 +0200)
* test/lisp/emacs-lisp/lisp-tests.el
(elisp-test-point-marker-regex) New variable.
(elisp-tests-with-temp-buffer): New macro to help test functions
moving the point and/or mark.

test/lisp/emacs-lisp/lisp-tests.el

index 8cba7fc526ac608ab21b5c8e9db22c30aecaea3a..f6039f78eb1cbaa1523ad555127e864ce424cdc8 100644 (file)
@@ -5,6 +5,7 @@
 ;; Author: Aaron S. Hawley <aaron.s.hawley@gmail.com>
 ;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
 ;; Author: Daniel Colascione <dancol@dancol.org>
+;; Author: Marcin Borkowski <mbork@mbork.pl>
 ;; Keywords: internal
 
 ;; GNU Emacs is free software: you can redistribute it and/or modify
   ;;   abcdefghijklmnopqrstuv
   i f a scan-error)
 
+;;; Helpers
+
+(defvar elisp-test-point-marker-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))))
+
 (provide 'lisp-tests)
 ;;; lisp-tests.el ends here