annotate lisp/emacs-lisp/ert-x.el @ 112201:c5917804ecad

Add ERT, a tool for automated testing in Emacs Lisp. * Makefile.in, configure.in, doc/misc/Makefile.in, doc/misc/makefile.w32-in: Add ERT. Make "make check" run tests in test/automated. * doc/misc/ert.texi, lisp/emacs-lisp/ert.el, lisp/emacs-lisp/ert-x.el: New files. * test/automated: New directory.
author Christian Ohler <ohler@gnu.org>
date Thu, 13 Jan 2011 03:08:24 +1100
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
112201
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
1 ;;; ert-x.el --- Staging area for experimental extensions to ERT
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
2
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
3 ;; Copyright (C) 2008, 2010, 2011 Free Software Foundation, Inc.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
4
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
5 ;; Author: Lennart Borgman (lennart O borgman A gmail O com)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
6 ;; Author: Christian Ohler <ohler@gnu.org>
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
7
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
8 ;; This file is part of GNU Emacs.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
9
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
10 ;; This program is free software: you can redistribute it and/or
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
11 ;; modify it under the terms of the GNU General Public License as
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
12 ;; published by the Free Software Foundation, either version 3 of the
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
13 ;; License, or (at your option) any later version.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
14 ;;
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
15 ;; This program is distributed in the hope that it will be useful, but
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
16 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
18 ;; General Public License for more details.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
19 ;;
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
20 ;; You should have received a copy of the GNU General Public License
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
21 ;; along with this program. If not, see `http://www.gnu.org/licenses/'.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
22
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
23 ;;; Commentary:
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
24
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
25 ;; This file includes some extra helper functions to use while writing
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
26 ;; automated tests with ERT. These have been proposed as extensions
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
27 ;; to ERT but are not mature yet and likely to change.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
28
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
29 ;;; Code:
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
30
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
31 (eval-when-compile
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
32 (require 'cl))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
33 (require 'ert)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
34
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
35
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
36 ;;; Test buffers.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
37
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
38 (defun ert--text-button (string &rest properties)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
39 "Return a string containing STRING as a text button with PROPERTIES.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
40
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
41 See `make-text-button'."
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
42 (with-temp-buffer
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
43 (insert string)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
44 (apply #'make-text-button (point-min) (point-max) properties)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
45 (buffer-string)))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
46
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
47 (defun ert--format-test-buffer-name (base-name)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
48 "Compute a test buffer name based on BASE-NAME.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
49
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
50 Helper function for `ert--test-buffers'."
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
51 (format "*Test buffer (%s)%s*"
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
52 (or (and (ert-running-test)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
53 (ert-test-name (ert-running-test)))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
54 "<anonymous test>")
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
55 (if base-name
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
56 (format ": %s" base-name)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
57 "")))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
58
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
59 (defvar ert--test-buffers (make-hash-table :weakness t)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
60 "Table of all test buffers. Keys are the buffer objects, values are t.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
61
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
62 The main use of this table is for `ert-kill-all-test-buffers'.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
63 Not all buffers in this table are necessarily live, but all live
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
64 test buffers are in this table.")
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
65
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
66 (define-button-type 'ert--test-buffer-button
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
67 'action #'ert--test-buffer-button-action
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
68 'help-echo "mouse-2, RET: Pop to test buffer")
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
69
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
70 (defun ert--test-buffer-button-action (button)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
71 "Pop to the test buffer that BUTTON is associated with."
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
72 (pop-to-buffer (button-get button 'ert--test-buffer)))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
73
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
74 (defun ert--call-with-test-buffer (ert--base-name ert--thunk)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
75 "Helper function for `ert-with-test-buffer'.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
76
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
77 Create a test buffer with a name based on ERT--BASE-NAME and run
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
78 ERT--THUNK with that buffer as current."
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
79 (let* ((ert--buffer (generate-new-buffer
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
80 (ert--format-test-buffer-name ert--base-name)))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
81 (ert--button (ert--text-button (buffer-name ert--buffer)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
82 :type 'ert--test-buffer-button
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
83 'ert--test-buffer ert--buffer)))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
84 (puthash ert--buffer 't ert--test-buffers)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
85 ;; We don't use `unwind-protect' here since we want to kill the
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
86 ;; buffer only on success.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
87 (prog1 (with-current-buffer ert--buffer
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
88 (ert-info (ert--button :prefix "Buffer: ")
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
89 (funcall ert--thunk)))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
90 (kill-buffer ert--buffer)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
91 (remhash ert--buffer ert--test-buffers))))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
92
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
93 (defmacro* ert-with-test-buffer ((&key ((:name name-form)))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
94 &body body)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
95 "Create a test buffer and run BODY in that buffer.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
96
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
97 To be used in ERT tests. If BODY finishes successfully, the test
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
98 buffer is killed; if there is an error, the test buffer is kept
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
99 around on error for further inspection. Its name is derived from
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
100 the name of the test and the result of NAME-FORM."
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
101 (declare (debug ((form) body))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
102 (indent 1))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
103 `(ert--call-with-test-buffer ,name-form (lambda () ,@body)))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
104
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
105 ;; We use these `put' forms in addition to the (declare (indent)) in
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
106 ;; the defmacro form since the `declare' alone does not lead to
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
107 ;; correct indentation before the .el/.elc file is loaded.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
108 ;; Autoloading these `put' forms solves this.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
109 ;;;###autoload
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
110 (progn
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
111 ;; TODO(ohler): Figure out what these mean and make sure they are correct.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
112 (put 'ert-with-test-buffer 'lisp-indent-function 1))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
113
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
114 ;;;###autoload
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
115 (defun ert-kill-all-test-buffers ()
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
116 "Kill all test buffers that are still live."
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
117 (interactive)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
118 (let ((count 0))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
119 (maphash (lambda (buffer dummy)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
120 (when (or (not (buffer-live-p buffer))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
121 (kill-buffer buffer))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
122 (incf count)))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
123 ert--test-buffers)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
124 (message "%s out of %s test buffers killed"
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
125 count (hash-table-count ert--test-buffers)))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
126 ;; It could be that some test buffers were actually kept alive
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
127 ;; (e.g., due to `kill-buffer-query-functions'). I'm not sure what
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
128 ;; to do about this. For now, let's just forget them.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
129 (clrhash ert--test-buffers)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
130 nil)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
131
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
132
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
133 ;;; Simulate commands.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
134
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
135 (defun ert-simulate-command (command)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
136 ;; FIXME: add unread-events
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
137 "Simulate calling COMMAND the way the Emacs command loop would call it.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
138
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
139 This effectively executes
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
140
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
141 \(apply (car COMMAND) (cdr COMMAND)\)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
142
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
143 and returns the same value, but additionally runs hooks like
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
144 `pre-command-hook' and `post-command-hook', and sets variables
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
145 like `this-command' and `last-command'.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
146
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
147 COMMAND should be a list where the car is the command symbol and
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
148 the rest are arguments to the command.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
149
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
150 NOTE: Since the command is not called by `call-interactively'
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
151 test for `called-interactively' in the command will fail."
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
152 (assert (listp command) t)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
153 (assert (commandp (car command)) t)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
154 (assert (not unread-command-events) t)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
155 (let (return-value)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
156 ;; For the order of things here see command_loop_1 in keyboard.c.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
157 ;;
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
158 ;; The command loop will reset the command-related variables so
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
159 ;; there is no reason to let-bind them. They are set here,
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
160 ;; however, to be able to test several commands in a row and how
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
161 ;; they affect each other.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
162 (setq deactivate-mark nil
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
163 this-original-command (car command)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
164 ;; remap through active keymaps
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
165 this-command (or (command-remapping this-original-command)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
166 this-original-command))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
167 (run-hooks 'pre-command-hook)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
168 (setq return-value (apply (car command) (cdr command)))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
169 (run-hooks 'post-command-hook)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
170 (when deferred-action-list
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
171 (run-hooks 'deferred-action-function))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
172 (setq real-last-command (car command)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
173 last-command this-command)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
174 (when (boundp 'last-repeatable-command)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
175 (setq last-repeatable-command real-last-command))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
176 (when (and deactivate-mark transient-mark-mode) (deactivate-mark))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
177 (assert (not unread-command-events) t)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
178 return-value))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
179
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
180 (defun ert-run-idle-timers ()
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
181 "Run all idle timers (from `timer-idle-list')."
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
182 (dolist (timer (copy-sequence timer-idle-list))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
183 (timer-event-handler timer)))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
184
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
185
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
186 ;;; Miscellaneous utilities.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
187
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
188 (defun ert-filter-string (s &rest regexps)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
189 "Return a copy of S with all matches of REGEXPS removed.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
190
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
191 Elements of REGEXPS may also be two-element lists \(REGEXP
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
192 SUBEXP\), where SUBEXP is the number of a subexpression in
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
193 REGEXP. In that case, only that subexpression will be removed
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
194 rather than the entire match."
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
195 ;; Use a temporary buffer since replace-match copies strings, which
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
196 ;; would lead to N^2 runtime.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
197 (with-temp-buffer
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
198 (insert s)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
199 (dolist (x regexps)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
200 (destructuring-bind (regexp subexp) (if (listp x) x `(,x nil))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
201 (goto-char (point-min))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
202 (while (re-search-forward regexp nil t)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
203 (replace-match "" t t nil subexp))))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
204 (buffer-string)))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
205
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
206
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
207 (defun ert-propertized-string (&rest args)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
208 "Return a string with properties as specified by ARGS.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
209
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
210 ARGS is a list of strings and plists. The strings in ARGS are
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
211 concatenated to produce an output string. In the output string,
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
212 each string from ARGS will be have the preceding plist as its
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
213 property list, or no properties if there is no plist before it.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
214
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
215 As a simple example,
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
216
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
217 \(ert-propertized-string \"foo \" '(face italic) \"bar\" \" baz\" nil \
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
218 \" quux\"\)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
219
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
220 would return the string \"foo bar baz quux\" where the substring
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
221 \"bar baz\" has a `face' property with the value `italic'.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
222
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
223 None of the ARGS are modified, but the return value may share
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
224 structure with the plists in ARGS."
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
225 (with-temp-buffer
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
226 (loop with current-plist = nil
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
227 for x in args do
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
228 (etypecase x
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
229 (string (let ((begin (point)))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
230 (insert x)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
231 (set-text-properties begin (point) current-plist)))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
232 (list (unless (zerop (mod (length x) 2))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
233 (error "Odd number of args in plist: %S" x))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
234 (setq current-plist x))))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
235 (buffer-string)))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
236
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
237
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
238 (defun ert-call-with-buffer-renamed (buffer-name thunk)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
239 "Protect the buffer named BUFFER-NAME from side-effects and run THUNK.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
240
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
241 Renames the buffer BUFFER-NAME to a new temporary name, creates a
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
242 new buffer named BUFFER-NAME, executes THUNK, kills the new
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
243 buffer, and renames the original buffer back to BUFFER-NAME.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
244
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
245 This is useful if THUNK has undesirable side-effects on an Emacs
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
246 buffer with a fixed name such as *Messages*."
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
247 (lexical-let ((new-buffer-name (generate-new-buffer-name
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
248 (format "%s orig buffer" buffer-name))))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
249 (with-current-buffer (get-buffer-create buffer-name)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
250 (rename-buffer new-buffer-name))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
251 (unwind-protect
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
252 (progn
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
253 (get-buffer-create buffer-name)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
254 (funcall thunk))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
255 (when (get-buffer buffer-name)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
256 (kill-buffer buffer-name))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
257 (with-current-buffer new-buffer-name
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
258 (rename-buffer buffer-name)))))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
259
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
260 (defmacro* ert-with-buffer-renamed ((buffer-name-form) &body body)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
261 "Protect the buffer named BUFFER-NAME from side-effects and run BODY.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
262
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
263 See `ert-call-with-buffer-renamed' for details."
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
264 (declare (indent 1))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
265 `(ert-call-with-buffer-renamed ,buffer-name-form (lambda () ,@body)))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
266
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
267
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
268 (defun ert-buffer-string-reindented (&optional buffer)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
269 "Return the contents of BUFFER after reindentation.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
270
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
271 BUFFER defaults to current buffer. Does not modify BUFFER."
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
272 (with-current-buffer (or buffer (current-buffer))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
273 (let ((clone nil))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
274 (unwind-protect
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
275 (progn
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
276 ;; `clone-buffer' doesn't work if `buffer-file-name' is non-nil.
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
277 (let ((buffer-file-name nil))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
278 (setq clone (clone-buffer)))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
279 (with-current-buffer clone
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
280 (let ((inhibit-read-only t))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
281 (indent-region (point-min) (point-max)))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
282 (buffer-string)))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
283 (when clone
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
284 (let ((kill-buffer-query-functions nil))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
285 (kill-buffer clone)))))))
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
286
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
287
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
288 (provide 'ert-x)
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
289
c5917804ecad Add ERT, a tool for automated testing in Emacs Lisp.
Christian Ohler <ohler@gnu.org>
parents:
diff changeset
290 ;;; ert-x.el ends here