Update copyright notices for 2013.
[bpt/emacs.git] / test / automated / occur-tests.el
1 ;;; occur-tests.el --- Test suite for occur.
2
3 ;; Copyright (C) 2010-2013 Free Software Foundation, Inc.
4
5 ;; Author: Juri Linkov <juri@jurta.org>
6 ;; Keywords: matching, internal
7
8 ;; This file is part of GNU Emacs.
9
10 ;; GNU Emacs is free software: you can redistribute it and/or modify
11 ;; it under the terms of the GNU General Public License as published by
12 ;; the Free Software Foundation, either version 3 of the License, or
13 ;; (at your option) any later version.
14
15 ;; GNU Emacs is distributed in the hope that it will be useful,
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 ;; GNU General Public License for more details.
19
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
22
23 ;;; Code:
24
25 (require 'ert)
26
27 (defconst occur-tests
28 '(
29 ;; * Test one-line matches (at bob, eob, bol, eol).
30 ("x" 0 "\
31 xa
32 b
33 cx
34 xd
35 xex
36 fx
37 " "\
38 5 matches for \"x\" in buffer: *test-occur*
39 1:xa
40 3:cx
41 4:xd
42 5:xex
43 6:fx
44 ")
45 ;; * Test multi-line matches, this is the first test from
46 ;; http://lists.gnu.org/archive/html/emacs-devel/2005-06/msg01008.html
47 ;; where numbers are replaced with letters.
48 ("a\na" 0 "\
49 a
50 a
51 a
52 a
53 a
54 " "\
55 2 matches for \"a^Ja\" in buffer: *test-occur*
56 1:a
57 :a
58 3:a
59 :a
60 ")
61 ;; * Test multi-line matches, this is the second test from
62 ;; http://lists.gnu.org/archive/html/emacs-devel/2005-06/msg01008.html
63 ;; where numbers are replaced with letters.
64 ("a\nb" 0 "\
65 a
66 b
67 c
68 a
69 b
70 " "\
71 2 matches for \"a^Jb\" in buffer: *test-occur*
72 1:a
73 :b
74 4:a
75 :b
76 ")
77 ;; * Test line numbers for multi-line matches with empty last match line.
78 ("a\n" 0 "\
79 a
80
81 c
82 a
83
84 " "\
85 2 matches for \"a^J\" in buffer: *test-occur*
86 1:a
87 :
88 4:a
89 :
90 ")
91 ;; * Test multi-line matches with 3 match lines.
92 ("x\n.x\n" 0 "\
93 ax
94 bx
95 c
96 d
97 ex
98 fx
99 " "\
100 2 matches for \"x^J.x^J\" in buffer: *test-occur*
101 1:ax
102 :bx
103 :c
104 5:ex
105 :fx
106 :
107 ")
108 ;; * Test non-overlapping context lines with matches at bob/eob.
109 ("x" 1 "\
110 ax
111 b
112 c
113 d
114 ex
115 f
116 g
117 hx
118 " "\
119 3 matches for \"x\" in buffer: *test-occur*
120 1:ax
121 :b
122 -------
123 :d
124 5:ex
125 :f
126 -------
127 :g
128 8:hx
129 ")
130 ;; * Test non-overlapping context lines with matches not at bob/eob.
131 ("x" 1 "\
132 a
133 bx
134 c
135 d
136 ex
137 f
138 " "\
139 2 matches for \"x\" in buffer: *test-occur*
140 :a
141 2:bx
142 :c
143 -------
144 :d
145 5:ex
146 :f
147 ")
148 ;; * Test overlapping context lines with matches at bob/eob.
149 ("x" 2 "\
150 ax
151 bx
152 c
153 dx
154 e
155 f
156 gx
157 h
158 i
159 j
160 kx
161 " "\
162 5 matches for \"x\" in buffer: *test-occur*
163 1:ax
164 2:bx
165 :c
166 4:dx
167 :e
168 :f
169 7:gx
170 :h
171 :i
172 :j
173 11:kx
174 ")
175 ;; * Test overlapping context lines with matches not at bob/eob.
176 ("x" 2 "\
177 a
178 b
179 cx
180 d
181 e
182 f
183 gx
184 h
185 i
186 " "\
187 2 matches for \"x\" in buffer: *test-occur*
188 :a
189 :b
190 3:cx
191 :d
192 :e
193 :f
194 7:gx
195 :h
196 :i
197 ")
198 ;; * Test overlapping context lines with empty first and last line..
199 ("x" 2 "\
200
201 b
202 cx
203 d
204 e
205 f
206 gx
207 h
208
209 " "\
210 2 matches for \"x\" in buffer: *test-occur*
211 :
212 :b
213 3:cx
214 :d
215 :e
216 :f
217 7:gx
218 :h
219 :
220 ")
221 ;; * Test multi-line overlapping context lines.
222 ("x\n.x" 2 "\
223 ax
224 bx
225 c
226 d
227 ex
228 fx
229 g
230 h
231 i
232 jx
233 kx
234 " "\
235 3 matches for \"x^J.x\" in buffer: *test-occur*
236 1:ax
237 :bx
238 :c
239 :d
240 5:ex
241 :fx
242 :g
243 :h
244 :i
245 10:jx
246 :kx
247 ")
248 ;; * Test multi-line non-overlapping context lines.
249 ("x\n.x" 2 "\
250 ax
251 bx
252 c
253 d
254 e
255 f
256 gx
257 hx
258 " "\
259 2 matches for \"x^J.x\" in buffer: *test-occur*
260 1:ax
261 :bx
262 :c
263 :d
264 -------
265 :e
266 :f
267 7:gx
268 :hx
269 ")
270 ;; * Test non-overlapping negative (before-context) lines.
271 ("x" -2 "\
272 a
273 bx
274 c
275 d
276 e
277 fx
278 g
279 h
280 ix
281 " "\
282 3 matches for \"x\" in buffer: *test-occur*
283 :a
284 2:bx
285 -------
286 :d
287 :e
288 6:fx
289 -------
290 :g
291 :h
292 9:ix
293 ")
294 ;; * Test overlapping negative (before-context) lines.
295 ("x" -3 "\
296 a
297 bx
298 c
299 dx
300 e
301 f
302 gx
303 h
304 " "\
305 3 matches for \"x\" in buffer: *test-occur*
306 :a
307 2:bx
308 :c
309 4:dx
310 :e
311 :f
312 7:gx
313 ")
314
315 )
316 "List of tests for `occur'.
317 Each element has the format:
318 \(REGEXP NLINES INPUT-BUFFER-STRING OUTPUT-BUFFER-STRING).")
319
320 (defun occur-test-case (test)
321 (let ((regexp (nth 0 test))
322 (nlines (nth 1 test))
323 (input-buffer-string (nth 2 test))
324 (output-buffer-string (nth 3 test))
325 (temp-buffer (get-buffer-create " *test-occur*")))
326 (unwind-protect
327 (save-window-excursion
328 (with-current-buffer temp-buffer
329 (erase-buffer)
330 (insert input-buffer-string)
331 (occur regexp nlines)
332 (equal output-buffer-string
333 (with-current-buffer "*Occur*"
334 (buffer-string)))))
335 (and (buffer-name temp-buffer)
336 (kill-buffer temp-buffer)))))
337
338 (ert-deftest occur-tests ()
339 "Test the functionality of `occur'.
340 The test data is in the `occur-tests' constant."
341 (let ((occur-hook nil))
342 (dolist (test occur-tests)
343 (should (occur-test-case test)))))
344
345 (provide 'occur-tests)
346
347 ;;; occur-tests.el ends here