aboutsummaryrefslogtreecommitdiffstats
path: root/test/src/buffer-tests.el
diff options
context:
space:
mode:
authorAndreas Politz2019-12-05 23:10:32 -0500
committerStefan Monnier2019-12-05 23:10:32 -0500
commitbcf4201d4c85afcc729104e492a14db00c3c5903 (patch)
treef1670796ecad7749b029187b612b9fb3c397f080 /test/src/buffer-tests.el
parent4c933077157ba409d645f4649c8a3a8e534d53d5 (diff)
downloademacs-bcf4201d4c85afcc729104e492a14db00c3c5903.tar.gz
emacs-bcf4201d4c85afcc729104e492a14db00c3c5903.zip
* test/src/buffer-tests.el: Add loads of overlay tests
Taken from the `feature/noverlay` branch. Suggested by Vladimir Kazanov <vekazanov@gmail.com>.
Diffstat (limited to 'test/src/buffer-tests.el')
-rw-r--r--test/src/buffer-tests.el1219
1 files changed, 1219 insertions, 0 deletions
diff --git a/test/src/buffer-tests.el b/test/src/buffer-tests.el
index 845d41f9d60..4ab99c131d0 100644
--- a/test/src/buffer-tests.el
+++ b/test/src/buffer-tests.el
@@ -20,6 +20,7 @@
20;;; Code: 20;;; Code:
21 21
22(require 'ert) 22(require 'ert)
23(eval-when-compile (require 'cl-lib))
23 24
24(ert-deftest overlay-modification-hooks-message-other-buf () 25(ert-deftest overlay-modification-hooks-message-other-buf ()
25 "Test for bug#21824. 26 "Test for bug#21824.
@@ -94,4 +95,1222 @@ with parameters from the *Messages* buffer modification."
94 (insert "toto") 95 (insert "toto")
95 (move-overlay ol (point-min) (point-min))))) 96 (move-overlay ol (point-min) (point-min)))))
96 97
98
99;; +==========================================================================+
100;; | Overlay test setup
101;; +==========================================================================+
102
103(eval-when-compile
104 (defun buffer-tests--make-test-name (fn x y)
105 (intern (format "buffer-tests--%s-%s-%s" fn x y))))
106
107(defun buffer-tests--unmake-test-name (symbol)
108 (let ((name (if (stringp symbol) symbol (symbol-name symbol))))
109 (when (string-match "\\`buffer-tests--\\(.*\\)-\\(.*\\)-\\(.*\\)\\'" name)
110 (list (match-string 1 name)
111 (match-string 2 name)
112 (match-string 3 name)))))
113
114(defmacro deftest-make-overlay-1 (id args)
115 (declare (indent 1))
116 `(ert-deftest ,(buffer-tests--make-test-name 'make-overlay 1 id) ()
117 (with-temp-buffer
118 (should ,(cons 'make-overlay args)))))
119
120(defmacro deftest-make-overlay-2 (id args condition)
121 (declare (indent 1))
122 `(ert-deftest ,(buffer-tests--make-test-name 'make-overlay 2 id) ()
123 (with-temp-buffer
124 (should-error
125 ,(cons 'make-overlay args)
126 :type ',condition
127 :exclude-subtypes t))))
128
129(defmacro deftest-overlay-start/end-1 (id start-end-args start-end-should)
130 (declare (indent 1))
131 (cl-destructuring-bind (start end sstart send)
132 (append start-end-args start-end-should)
133 `(ert-deftest ,(buffer-tests--make-test-name 'overlay-start/end 1 id) ()
134 (with-temp-buffer
135 (insert (make-string 9 ?\n))
136 (let ((ov (make-overlay ,start ,end)))
137 (should (equal ,sstart (overlay-start ov)))
138 (should (equal ,send (overlay-end ov))))))))
139
140(defmacro deftest-overlay-buffer-1 (id arg-expr should-expr)
141 (declare (indent 1))
142 `(ert-deftest ,(buffer-tests--make-test-name 'overlay-buffer 1 id) ()
143 (with-temp-buffer
144 (should (equal (overlay-buffer (make-overlay 1 1 ,arg-expr))
145 ,should-expr)))))
146
147(defmacro deftest-overlayp-1 (id arg-expr should-expr)
148 (declare (indent 1))
149 `(ert-deftest ,(buffer-tests--make-test-name 'overlay-buffer 1 id) ()
150 (with-temp-buffer
151 (should (equal ,should-expr (overlayp ,arg-expr))))))
152
153(defmacro deftest-next-overlay-change-1 (id pos result &rest ov-tuple)
154 `(ert-deftest ,(buffer-tests--make-test-name 'next-overlay-change 1 id) ()
155 (let ((tuple (copy-sequence ',ov-tuple)))
156 (with-temp-buffer
157 (insert (make-string (max 100 (if tuple
158 (apply #'max
159 (mapcar
160 (lambda (m) (apply #'max m))
161 tuple))
162 0))
163 ?\n))
164 (dolist (tup tuple)
165 (make-overlay (car tup) (cadr tup)))
166 (should (equal (next-overlay-change ,pos)
167 ,result))))))
168
169(defmacro deftest-previous-overlay-change-1 (id pos result &rest ov-tuple)
170 `(ert-deftest ,(buffer-tests--make-test-name 'previous-overlay-change 1 id) ()
171 (let ((tuple ',ov-tuple))
172 (with-temp-buffer
173 (insert (make-string (max 100 (if tuple
174 (apply #'max
175 (mapcar
176 (lambda (m) (apply #'max m))
177 tuple))
178 0))
179 ?\n))
180 (dolist (tup tuple)
181 (make-overlay (car tup) (cadr tup)))
182 (should (equal (previous-overlay-change ,pos)
183 ,result))))))
184
185(defmacro deftest-overlays-at-1 (id pos result &rest ov-triple)
186 `(ert-deftest ,(buffer-tests--make-test-name 'overlays-at 1 id) ()
187 (let ((pos* ,pos))
188 (with-temp-buffer
189 (insert (make-string 100 ?\s))
190 (should-not (memq nil ',result))
191 (dolist (v ',ov-triple)
192 (cl-destructuring-bind (tag start end)
193 v
194 (overlay-put (make-overlay start end) 'tag tag)))
195 (let ((ovl (overlays-at pos*)))
196 (should (equal (length ovl) (length ',result)))
197 (dolist (ov ovl)
198 (should (memq (overlay-get ov 'tag) ',result))))))))
199
200(defmacro deftest-overlays-in-1 (id beg end result &rest ov-triple)
201 `(ert-deftest ,(buffer-tests--make-test-name 'overlays-in 1 id) ()
202 (let ((beg* ,beg)
203 (end* ,end))
204 (with-temp-buffer
205 (insert (make-string 100 ?\s))
206 (should-not (memq nil ',result))
207 (dolist (v ',ov-triple)
208 (cl-destructuring-bind (tag start end)
209 v
210 (overlay-put (make-overlay start end) 'tag tag)))
211 (let ((ovl (overlays-in beg* end*)))
212 (should (equal (length ovl) (length ',result)))
213 (dolist (ov ovl)
214 (should (memq (overlay-get ov 'tag) ',result))))))))
215
216(defmacro test-with-overlay-in-buffer (symbol-beg-end-fa-ra &rest body)
217 (declare (indent 1))
218 (cl-destructuring-bind (symbol beg end &optional fa ra)
219 symbol-beg-end-fa-ra
220 `(with-temp-buffer
221 (insert (make-string (max 1000 (1- ,end)) ?\s))
222 (goto-char 1)
223 (let ((,symbol (make-overlay ,beg ,end nil ,fa ,ra)))
224 ,@body))))
225
226(defmacro deftest-overlays-equal-1 (id result ov1-args ov2-args)
227 `(ert-deftest ,(buffer-tests--make-test-name 'overlays-equal 1 id) ()
228 (cl-flet ((create-overlay (args)
229 (cl-destructuring-bind (start end &optional fa ra
230 &rest properties)
231 args
232 (let ((ov (make-overlay start end nil fa ra)))
233 (while properties
234 (overlay-put ov (pop properties) (pop properties)))
235 ov))))
236 (with-temp-buffer
237 (insert (make-string 1024 ?\s))
238 (should (,(if result 'identity 'not)
239 (equal (create-overlay ',ov1-args)
240 (create-overlay ',ov2-args))))))))
241
242
243(defun buffer-tests--find-ert-test (name)
244 (let ((test (buffer-tests--unmake-test-name name)))
245 (or (and test
246 (cl-destructuring-bind (fn x y)
247 test
248 (let ((regexp (format "deftest-%s-%s +%s" fn x y)))
249 (re-search-forward regexp nil t))))
250 (let ((find-function-regexp-alist
251 (cl-remove #'buffer-tests--find-ert-test
252 find-function-regexp-alist :key #'cdr)))
253 (find-function-do-it name 'ert-deftest
254 #'switch-to-buffer-other-window)))))
255
256(add-to-list 'find-function-regexp-alist
257 `(ert-deftest . ,#'buffer-tests--find-ert-test))
258
259
260;; +==========================================================================+
261;; | make-overlay
262;; +==========================================================================+
263
264;; Test if making an overlay succeeds.
265(deftest-make-overlay-1 A (1 1))
266(deftest-make-overlay-1 B (7 26))
267(deftest-make-overlay-1 C (29 7))
268(deftest-make-overlay-1 D (most-positive-fixnum 1))
269(deftest-make-overlay-1 E (most-negative-fixnum 1))
270(deftest-make-overlay-1 F (1 most-positive-fixnum))
271(deftest-make-overlay-1 G (1 most-negative-fixnum))
272(deftest-make-overlay-1 H (1 1 nil t))
273(deftest-make-overlay-1 I (1 1 nil nil))
274(deftest-make-overlay-1 J (1 1 nil nil nil))
275(deftest-make-overlay-1 K (1 1 nil nil t))
276(deftest-make-overlay-1 L (1 1 nil t t))
277(deftest-make-overlay-1 M (1 1 nil "yes" "yes"))
278
279;; Test if trying to make an overlay signals conditions.
280(deftest-make-overlay-2 A () wrong-number-of-arguments)
281(deftest-make-overlay-2 B (1) wrong-number-of-arguments)
282(deftest-make-overlay-2 C (1 2 3 4 5 6) wrong-number-of-arguments)
283(deftest-make-overlay-2 D ("1") wrong-number-of-arguments)
284(deftest-make-overlay-2 E ("1" "2") wrong-type-argument)
285(deftest-make-overlay-2 F (1 2 "b") wrong-type-argument)
286(deftest-make-overlay-2 G (1 2 3.14) wrong-type-argument)
287(deftest-make-overlay-2 H (3.14 3) wrong-type-argument)
288(deftest-make-overlay-2 I (1 [1]) wrong-type-argument)
289(deftest-make-overlay-2 J (1 1 (with-temp-buffer
290 (current-buffer)))
291 error)
292
293
294;; +==========================================================================+
295;; | overlay-start/end
296;; +==========================================================================+
297
298;; Test if the overlays return proper positions. point-max of the
299;; buffer will equal 10. ARG RESULT
300(deftest-overlay-start/end-1 A (1 1) (1 1))
301(deftest-overlay-start/end-1 B (2 7) (2 7))
302(deftest-overlay-start/end-1 C (7 2) (2 7))
303(deftest-overlay-start/end-1 D (1 10) (1 10))
304(deftest-overlay-start/end-1 E (1 11) (1 10))
305(deftest-overlay-start/end-1 F (1 most-positive-fixnum) (1 10))
306(deftest-overlay-start/end-1 G (most-positive-fixnum 1) (1 10))
307(deftest-overlay-start/end-1 H (most-positive-fixnum most-positive-fixnum)
308 (10 10))
309(deftest-overlay-start/end-1 I (100 11) (10 10))
310(deftest-overlay-start/end-1 J (11 100) (10 10))
311(deftest-overlay-start/end-1 K (0 1) (1 1))
312(deftest-overlay-start/end-1 L (1 0) (1 1))
313(deftest-overlay-start/end-1 M (0 0) (1 1))
314
315(ert-deftest test-overlay-start/end-2 ()
316 (should-not (overlay-start (with-temp-buffer (make-overlay 1 1))))
317 (should-not (overlay-end (with-temp-buffer (make-overlay 1 1)))))
318
319
320;; +==========================================================================+
321;; | overlay-buffer
322;; +==========================================================================+
323
324;; Test if overlay-buffer returns appropriate values.
325(deftest-overlay-buffer-1 A (current-buffer) (current-buffer))
326(deftest-overlay-buffer-1 B nil (current-buffer))
327(ert-deftest test-overlay-buffer-1-C ()
328 (should-error (make-overlay
329 1 1 (with-temp-buffer (current-buffer)))))
330
331
332;; +==========================================================================+
333;; | overlayp
334;; +==========================================================================+
335
336;; Check the overlay predicate.
337(deftest-overlayp-1 A (make-overlay 1 1) t)
338(deftest-overlayp-1 B (with-temp-buffer (make-overlay 1 1)) t)
339(deftest-overlayp-1 C nil nil)
340(deftest-overlayp-1 D 'symbol nil)
341(deftest-overlayp-1 E "string" nil)
342(deftest-overlayp-1 F 42 nil)
343(deftest-overlayp-1 G [1 2] nil)
344(deftest-overlayp-1 H (symbol-function 'car) nil)
345(deftest-overlayp-1 I float-pi nil)
346(deftest-overlayp-1 J (cons 1 2) nil)
347(deftest-overlayp-1 K (make-hash-table) nil)
348(deftest-overlayp-1 L (symbol-function 'ert-deftest) nil)
349(deftest-overlayp-1 M (current-buffer) nil)
350(deftest-overlayp-1 N (selected-window) nil)
351(deftest-overlayp-1 O (selected-frame) nil)
352
353
354;; +==========================================================================+
355;; | overlay equality
356;; +==========================================================================+
357
358(deftest-overlays-equal-1 A t (1 1) (1 1))
359(deftest-overlays-equal-1 B t (5 10) (5 10))
360(deftest-overlays-equal-1 C nil (5 11) (5 10))
361(deftest-overlays-equal-1 D t (10 20 t) (10 20))
362(deftest-overlays-equal-1 E t (10 20 nil t) (10 20))
363(deftest-overlays-equal-1 F t (10 20 t t) (10 20 nil t))
364(deftest-overlays-equal-1 G t (10 20 t t) (10 20 t nil))
365(deftest-overlays-equal-1 H t (10 20 nil nil foo 42) (10 20 nil nil foo 42))
366(deftest-overlays-equal-1 I nil (10 20 nil nil foo 42) (10 20 nil nil foo 43))
367
368
369;; +==========================================================================+
370;; | overlay-lists
371;; +==========================================================================+
372
373;; Check whether overlay-lists returns something sensible.
374(ert-deftest test-overlay-lists-1 ()
375 (with-temp-buffer
376 (should (equal (cons nil nil) (overlay-lists)))
377 (dotimes (i 10) (make-overlay 1 i))
378 (should (listp (car (overlay-lists))))
379 (should (listp (cdr (overlay-lists))))
380 (let ((list (append (car (overlay-lists))
381 (cdr (overlay-lists)))))
382 (should (= 10 (length list)))
383 (should (seq-every-p #'overlayp list)))))
384
385
386;; +==========================================================================+
387;; | overlay-put/get/properties
388;; +==========================================================================+
389
390;; Test if overlay-put properties can be retrieved by overlay-get and
391;; overlay-properties.
392(ert-deftest test-overlay-props-1 ()
393 (with-temp-buffer
394 (let* ((keys '(:k1 :k2 :k3))
395 (values '(1 "v2" v3))
396 (ov (make-overlay 1 1))
397 (n (length keys)))
398 (should (equal (length keys) (length values)))
399 (should (null (overlay-properties ov)))
400 ;; Insert keys and values.
401 (dotimes (i n)
402 (should (equal (overlay-put ov (nth i keys) (nth i values))
403 (nth i values))))
404 ;; Compare with what overlay-get says.
405 (dotimes (i n)
406 (should (equal (overlay-get ov (nth i keys))
407 (nth i values))))
408 ;; Test if overlay-properties is a superset.
409 (dotimes (i n)
410 (should (equal (plist-get (overlay-properties ov)
411 (nth i keys))
412 (nth i values))))
413 ;; Check if overlay-properties is a subset.
414 (should (= (length (overlay-properties ov)) (* n 2))))))
415
416
417;; +==========================================================================+
418;; | next-overlay-change
419;; +==========================================================================+
420
421;; Test if next-overlay-change returns RESULT if called with POS in a
422;; buffer with overlays corresponding to OVS and point-max >= 100.
423;; (POS RESULT &rest OVS)
424;; 0 overlays
425(deftest-next-overlay-change-1 A (point-min) (point-max))
426(deftest-next-overlay-change-1 B (point-max) (point-max))
427;; 1 non-empty overlay
428(deftest-next-overlay-change-1 C 1 10 (10 20))
429(deftest-next-overlay-change-1 D 10 20 (10 20))
430(deftest-next-overlay-change-1 E 15 20 (10 20))
431(deftest-next-overlay-change-1 F 20 (point-max) (10 20))
432(deftest-next-overlay-change-1 G 30 (point-max) (10 20))
433;; 1 empty overlay
434(deftest-next-overlay-change-1 H 1 10 (10 10))
435(deftest-next-overlay-change-1 I 10 (point-max) (10 10))
436(deftest-next-overlay-change-1 J 20 (point-max) (10 10))
437;; 2 non-empty, non-intersecting
438(deftest-next-overlay-change-1 D 10 20 (20 30) (40 50))
439(deftest-next-overlay-change-1 E 35 40 (20 30) (40 50))
440(deftest-next-overlay-change-1 F 60 (point-max) (20 30) (40 50))
441(deftest-next-overlay-change-1 G 30 40 (20 30) (40 50))
442(deftest-next-overlay-change-1 H 50 (point-max) (20 30) (40 50))
443;; 2 non-empty, intersecting
444(deftest-next-overlay-change-1 I 10 20 (20 30) (25 35))
445(deftest-next-overlay-change-1 J 20 25 (20 30) (25 35))
446(deftest-next-overlay-change-1 K 23 25 (20 30) (25 35))
447(deftest-next-overlay-change-1 L 25 30 (20 30) (25 35))
448(deftest-next-overlay-change-1 M 28 30 (20 30) (25 35))
449(deftest-next-overlay-change-1 N 30 35 (20 30) (25 35))
450(deftest-next-overlay-change-1 O 35 (point-max) (20 30) (25 35))
451(deftest-next-overlay-change-1 P 50 (point-max) (20 30) (25 35))
452;; 2 non-empty, continuous
453(deftest-next-overlay-change-1 Q 10 20 (20 30) (30 40))
454(deftest-next-overlay-change-1 R 20 30 (20 30) (30 40))
455(deftest-next-overlay-change-1 S 25 30 (20 30) (30 40))
456(deftest-next-overlay-change-1 T 30 40 (20 30) (30 40))
457(deftest-next-overlay-change-1 U 35 40 (20 30) (30 40))
458(deftest-next-overlay-change-1 V 40 (point-max) (20 30) (30 40))
459(deftest-next-overlay-change-1 W 50 (point-max) (20 30) (30 40))
460;; 1 empty, 1 non-empty, non-in
461(deftest-next-overlay-change-1 a 10 20 (20 20) (30 40))
462(deftest-next-overlay-change-1 b 20 30 (20 30) (30 40))
463(deftest-next-overlay-change-1 c 25 30 (20 30) (30 40))
464(deftest-next-overlay-change-1 d 30 40 (20 30) (30 40))
465(deftest-next-overlay-change-1 e 35 40 (20 30) (30 40))
466(deftest-next-overlay-change-1 f 40 (point-max) (20 30) (30 40))
467(deftest-next-overlay-change-1 g 50 (point-max) (20 30) (30 40))
468;; 1 empty, 1 non-empty, intersecting at begin
469(deftest-next-overlay-change-1 h 10 20 (20 20) (20 30))
470(deftest-next-overlay-change-1 i 20 30 (20 20) (20 30))
471(deftest-next-overlay-change-1 j 25 30 (20 20) (20 30))
472(deftest-next-overlay-change-1 k 30 (point-max) (20 20) (20 30))
473(deftest-next-overlay-change-1 l 40 (point-max) (20 20) (20 30))
474;; 1 empty, 1 non-empty, intersecting at end
475(deftest-next-overlay-change-1 h 10 20 (30 30) (20 30))
476(deftest-next-overlay-change-1 i 20 30 (30 30) (20 30))
477(deftest-next-overlay-change-1 j 25 30 (30 30) (20 30))
478(deftest-next-overlay-change-1 k 30 (point-max) (20 20) (20 30))
479(deftest-next-overlay-change-1 l 40 (point-max) (20 20) (20 30))
480;; 1 empty, 1 non-empty, intersecting in the middle
481(deftest-next-overlay-change-1 m 10 20 (25 25) (20 30))
482(deftest-next-overlay-change-1 n 20 25 (25 25) (20 30))
483(deftest-next-overlay-change-1 o 25 30 (25 25) (20 30))
484(deftest-next-overlay-change-1 p 30 (point-max) (25 25) (20 30))
485(deftest-next-overlay-change-1 q 40 (point-max) (25 25) (20 30))
486;; 2 empty, intersecting
487(deftest-next-overlay-change-1 r 10 20 (20 20) (20 20))
488(deftest-next-overlay-change-1 s 20 (point-max) (20 20) (20 20))
489(deftest-next-overlay-change-1 t 30 (point-max) (20 20) (20 20))
490;; 2 empty, non-intersecting
491(deftest-next-overlay-change-1 u 10 20 (20 20) (30 30))
492(deftest-next-overlay-change-1 v 20 30 (20 20) (30 30))
493(deftest-next-overlay-change-1 w 25 30 (20 20) (30 30))
494(deftest-next-overlay-change-1 x 30 (point-max) (20 20) (30 30))
495(deftest-next-overlay-change-1 y 50 (point-max) (20 20) (30 30))
496;; 10 random
497(deftest-next-overlay-change-1 aa 1 5
498 (58 66) (41 10) (9 67) (28 88) (27 43)
499 (24 27) (48 36) (5 90) (61 9))
500(deftest-next-overlay-change-1 ab (point-max) (point-max)
501 (58 66) (41 10) (9 67) (28 88) (27 43)
502 (24 27) (48 36) (5 90) (61 9))
503(deftest-next-overlay-change-1 ac 67 88
504 (58 66) (41 10) (9 67) (28 88) (27 43)
505 (24 27) (48 36) (5 90) (61 9))
506
507
508;; +==========================================================================+
509;; | previous-overlay-change.
510;; +==========================================================================+
511
512;; Same for previous-overlay-change.
513;; 1 non-empty overlay
514(deftest-previous-overlay-change-1 A (point-max) 1)
515(deftest-previous-overlay-change-1 B 1 1)
516(deftest-previous-overlay-change-1 C 1 1 (10 20))
517(deftest-previous-overlay-change-1 D 10 1 (10 20))
518(deftest-previous-overlay-change-1 E 15 10 (10 20))
519(deftest-previous-overlay-change-1 F 20 10 (10 20))
520(deftest-previous-overlay-change-1 G 30 20 (10 20))
521;; 1 empty overlay
522(deftest-previous-overlay-change-1 H 1 1 (10 10))
523(deftest-previous-overlay-change-1 I 10 1 (10 10))
524(deftest-previous-overlay-change-1 J 20 10 (10 10))
525;; 2 non-empty, non-intersecting
526(deftest-previous-overlay-change-1 D 10 1 (20 30) (40 50))
527(deftest-previous-overlay-change-1 E 35 30 (20 30) (40 50))
528(deftest-previous-overlay-change-1 F 60 50 (20 30) (40 50))
529(deftest-previous-overlay-change-1 G 30 20 (20 30) (40 50))
530(deftest-previous-overlay-change-1 H 50 40 (20 30) (40 50))
531;; 2 non-empty, intersecting
532(deftest-previous-overlay-change-1 I 10 1 (20 30) (25 35))
533(deftest-previous-overlay-change-1 J 20 1 (20 30) (25 35))
534(deftest-previous-overlay-change-1 K 23 20 (20 30) (25 35))
535(deftest-previous-overlay-change-1 L 25 20 (20 30) (25 35))
536(deftest-previous-overlay-change-1 M 28 25 (20 30) (25 35))
537(deftest-previous-overlay-change-1 N 30 25 (20 30) (25 35))
538(deftest-previous-overlay-change-1 O 35 30 (20 30) (25 35))
539(deftest-previous-overlay-change-1 P 50 35 (20 30) (25 35))
540;; 2 non-empty, continuous
541(deftest-previous-overlay-change-1 Q 10 1 (20 30) (30 40))
542(deftest-previous-overlay-change-1 R 20 1 (20 30) (30 40))
543(deftest-previous-overlay-change-1 S 25 20 (20 30) (30 40))
544(deftest-previous-overlay-change-1 T 30 20 (20 30) (30 40))
545(deftest-previous-overlay-change-1 U 35 30 (20 30) (30 40))
546(deftest-previous-overlay-change-1 V 40 30 (20 30) (30 40))
547(deftest-previous-overlay-change-1 W 50 40 (20 30) (30 40))
548;; 1 empty, 1 non-empty, non-intersecting
549(deftest-previous-overlay-change-1 a 10 1 (20 20) (30 40))
550(deftest-previous-overlay-change-1 b 20 1 (20 30) (30 40))
551(deftest-previous-overlay-change-1 c 25 20 (20 30) (30 40))
552(deftest-previous-overlay-change-1 d 30 20 (20 30) (30 40))
553(deftest-previous-overlay-change-1 e 35 30 (20 30) (30 40))
554(deftest-previous-overlay-change-1 f 40 30 (20 30) (30 40))
555(deftest-previous-overlay-change-1 g 50 40 (20 30) (30 40))
556;; 1 empty, 1 non-empty, intersecting at begin
557(deftest-previous-overlay-change-1 h 10 1 (20 20) (20 30))
558(deftest-previous-overlay-change-1 i 20 1 (20 20) (20 30))
559(deftest-previous-overlay-change-1 j 25 20 (20 20) (20 30))
560(deftest-previous-overlay-change-1 k 30 20 (20 20) (20 30))
561(deftest-previous-overlay-change-1 l 40 30 (20 20) (20 30))
562;; 1 empty, 1 non-empty, intersecting at end
563(deftest-previous-overlay-change-1 m 10 1 (30 30) (20 30))
564(deftest-previous-overlay-change-1 n 20 1 (30 30) (20 30))
565(deftest-previous-overlay-change-1 o 25 20 (30 30) (20 30))
566(deftest-previous-overlay-change-1 p 30 20 (20 20) (20 30))
567(deftest-previous-overlay-change-1 q 40 30 (20 20) (20 30))
568;; 1 empty, 1 non-empty, intersectig in the middle
569(deftest-previous-overlay-change-1 r 10 1 (25 25) (20 30))
570(deftest-previous-overlay-change-1 s 20 1 (25 25) (20 30))
571(deftest-previous-overlay-change-1 t 25 20 (25 25) (20 30))
572(deftest-previous-overlay-change-1 u 30 25 (25 25) (20 30))
573(deftest-previous-overlay-change-1 v 40 30 (25 25) (20 30))
574;; 2 empty, intersecting
575(deftest-previous-overlay-change-1 w 10 1 (20 20) (20 20))
576(deftest-previous-overlay-change-1 x 20 1 (20 20) (20 20))
577(deftest-previous-overlay-change-1 y 30 20 (20 20) (20 20))
578;; 2 empty, non-intersecting
579(deftest-previous-overlay-change-1 z 10 1 (20 20) (30 30))
580(deftest-previous-overlay-change-1 aa 20 1 (20 20) (30 30))
581(deftest-previous-overlay-change-1 ab 25 20 (20 20) (30 30))
582(deftest-previous-overlay-change-1 ac 30 20 (20 20) (30 30))
583(deftest-previous-overlay-change-1 ad 50 30 (20 20) (30 30))
584;; 10 random
585(deftest-previous-overlay-change-1 ae 100 90
586 (58 66) (41 10) (9 67) (28 88) (27 43)
587 (24 27) (48 36) (5 90) (61 9))
588(deftest-previous-overlay-change-1 af (point-min) (point-min)
589 (58 66) (41 10) (9 67) (28 88) (27 43)
590 (24 27) (48 36) (5 90) (61 9))
591(deftest-previous-overlay-change-1 ag 29 28
592 (58 66) (41 10) (9 67) (28 88) (27 43)
593 (24 27) (48 36) (5 90) (61 9))
594
595
596;; +==========================================================================+
597;; | overlays-at
598;; +==========================================================================+
599
600
601;; Test whether overlay-at returns RESULT at POS after overlays OVL were
602;; created in a buffer. POS RES OVL
603(deftest-overlays-at-1 A 1 ())
604;; 1 overlay
605(deftest-overlays-at-1 B 10 (a) (a 10 20))
606(deftest-overlays-at-1 C 15 (a) (a 10 20))
607(deftest-overlays-at-1 D 19 (a) (a 10 20))
608(deftest-overlays-at-1 E 20 () (a 10 20))
609(deftest-overlays-at-1 F 1 () (a 10 20))
610
611;; 2 non-empty overlays non-intersecting
612(deftest-overlays-at-1 G 1 () (a 10 20) (b 30 40))
613(deftest-overlays-at-1 H 10 (a) (a 10 20) (b 30 40))
614(deftest-overlays-at-1 I 15 (a) (a 10 20) (b 30 40))
615(deftest-overlays-at-1 K 20 () (a 10 20) (b 30 40))
616(deftest-overlays-at-1 L 25 () (a 10 20) (b 30 40))
617(deftest-overlays-at-1 M 30 (b) (a 10 20) (b 30 40))
618(deftest-overlays-at-1 N 35 (b) (a 10 20) (b 30 40))
619(deftest-overlays-at-1 O 40 () (a 10 20) (b 30 40))
620(deftest-overlays-at-1 P 50 () (a 10 20) (b 30 40))
621
622;; 2 non-empty overlays intersecting
623(deftest-overlays-at-1 G 1 () (a 10 30) (b 20 40))
624(deftest-overlays-at-1 H 10 (a) (a 10 30) (b 20 40))
625(deftest-overlays-at-1 I 15 (a) (a 10 30) (b 20 40))
626(deftest-overlays-at-1 K 20 (a b) (a 10 30) (b 20 40))
627(deftest-overlays-at-1 L 25 (a b) (a 10 30) (b 20 40))
628(deftest-overlays-at-1 M 30 (b) (a 10 30) (b 20 40))
629(deftest-overlays-at-1 N 35 (b) (a 10 30) (b 20 40))
630(deftest-overlays-at-1 O 40 () (a 10 30) (b 20 40))
631(deftest-overlays-at-1 P 50 () (a 10 30) (b 20 40))
632
633;; 2 non-empty overlays continuous
634(deftest-overlays-at-1 G 1 () (a 10 20) (b 20 30))
635(deftest-overlays-at-1 H 10 (a) (a 10 20) (b 20 30))
636(deftest-overlays-at-1 I 15 (a) (a 10 20) (b 20 30))
637(deftest-overlays-at-1 K 20 (b) (a 10 20) (b 20 30))
638(deftest-overlays-at-1 L 25 (b) (a 10 20) (b 20 30))
639(deftest-overlays-at-1 M 30 () (a 10 20) (b 20 30))
640
641;; overlays-at never returns empty overlays.
642(deftest-overlays-at-1 N 1 (a) (a 1 60) (c 1 1) (b 30 30) (d 50 50))
643(deftest-overlays-at-1 O 20 (a) (a 1 60) (c 1 1) (b 30 30) (d 50 50))
644(deftest-overlays-at-1 P 30 (a) (a 1 60) (c 1 1) (b 30 30) (d 50 50))
645(deftest-overlays-at-1 Q 40 (a) (a 1 60) (c 1 1) (b 30 30) (d 50 50))
646(deftest-overlays-at-1 R 50 (a) (a 1 60) (c 1 1) (b 30 30) (d 50 50))
647(deftest-overlays-at-1 S 60 () (a 1 60) (c 1 1) (b 30 30) (d 50 50))
648
649;; behaviour at point-min and point-max
650(ert-deftest test-overlays-at-2 ()
651 (cl-macrolet ((should-length (n list)
652 `(should (= ,n (length ,list)))))
653 (with-temp-buffer
654 (insert (make-string 100 ?\s))
655 (make-overlay 1 (point-max))
656 (make-overlay 10 10)
657 (make-overlay 20 20)
658 (make-overlay (point-max) (point-max))
659 (should-length 1 (overlays-at 1))
660 (should-length 1 (overlays-at 10))
661 (should-length 1 (overlays-at 20))
662 (should-length 0 (overlays-at (point-max)))
663 (narrow-to-region 10 20)
664 (should-length 1 (overlays-at (point-min)))
665 (should-length 1 (overlays-at 15))
666 (should-length 1 (overlays-at (point-max))))))
667
668
669;; +==========================================================================+
670;; | overlay-in
671;; +==========================================================================+
672
673
674;; Test whether overlays-in returns RES in BEG,END after overlays OVL were
675;; created in a buffer.
676
677(deftest-overlays-in-1 A 1 (point-max) ());;POS RES OVL
678;; 1 overlay
679(deftest-overlays-in-1 B 1 10 () (a 10 20))
680(deftest-overlays-in-1 C 5 10 () (a 10 20))
681(deftest-overlays-in-1 D 5 15 (a) (a 10 20))
682(deftest-overlays-in-1 E 10 15 (a) (a 10 20))
683(deftest-overlays-in-1 F 10 20 (a) (a 10 20))
684(deftest-overlays-in-1 G 15 20 (a) (a 10 20))
685(deftest-overlays-in-1 H 15 25 (a) (a 10 20))
686(deftest-overlays-in-1 I 20 25 () (a 10 20))
687(deftest-overlays-in-1 J 30 50 () (a 10 20))
688
689;; 2 non-empty overlays non-intersecting
690(deftest-overlays-in-1 K 1 5 () (a 10 20) (b 30 40))
691(deftest-overlays-in-1 L 5 10 () (a 10 20) (b 30 40))
692(deftest-overlays-in-1 M 5 15 (a) (a 10 20) (b 30 40))
693(deftest-overlays-in-1 N 10 15 (a) (a 10 20) (b 30 40))
694(deftest-overlays-in-1 O 15 20 (a) (a 10 20) (b 30 40))
695(deftest-overlays-in-1 P 15 25 (a) (a 10 20) (b 30 40))
696(deftest-overlays-in-1 Q 20 25 () (a 10 20) (b 30 40))
697(deftest-overlays-in-1 R 20 30 () (a 10 20) (b 30 40))
698(deftest-overlays-in-1 S 25 30 () (a 10 20) (b 30 40))
699(deftest-overlays-in-1 T 25 35 (b) (a 10 20) (b 30 40))
700(deftest-overlays-in-1 U 30 35 (b) (a 10 20) (b 30 40))
701(deftest-overlays-in-1 V 40 50 () (a 10 20) (b 30 40))
702(deftest-overlays-in-1 W 50 60 () (a 10 20) (b 30 40))
703(deftest-overlays-in-1 X 1 50 (a b) (a 10 20) (b 30 40))
704(deftest-overlays-in-1 Y 10 40 (a b) (a 10 20) (b 30 40))
705(deftest-overlays-in-1 Z 10 41 (a b) (a 10 20) (b 30 40))
706
707;; 2 non-empty overlays intersecting
708(deftest-overlays-in-1 a 1 5 () (a 10 30) (b 20 40))
709(deftest-overlays-in-1 b 5 10 () (a 10 30) (b 20 40))
710(deftest-overlays-in-1 c 5 15 (a) (a 10 30) (b 20 40))
711(deftest-overlays-in-1 d 10 15 (a) (a 10 30) (b 20 40))
712(deftest-overlays-in-1 e 10 20 (a) (a 10 30) (b 20 40))
713(deftest-overlays-in-1 f 15 20 (a) (a 10 30) (b 20 40))
714(deftest-overlays-in-1 g 20 30 (a b) (a 10 30) (b 20 40))
715(deftest-overlays-in-1 h 20 40 (a b) (a 10 30) (b 20 40))
716(deftest-overlays-in-1 i 25 30 (a b) (a 10 30) (b 20 40))
717(deftest-overlays-in-1 j 30 30 (b) (a 10 30) (b 20 40))
718(deftest-overlays-in-1 k 30 35 (b) (a 10 30) (b 20 40))
719(deftest-overlays-in-1 l 35 40 (b) (a 10 30) (b 20 40))
720(deftest-overlays-in-1 m 40 45 () (a 10 30) (b 20 40))
721(deftest-overlays-in-1 n 41 45 () (a 10 30) (b 20 40))
722(deftest-overlays-in-1 o 50 60 () (a 10 30) (b 20 40))
723
724;; 2 non-empty overlays continuous
725(deftest-overlays-in-1 p 1 5 () (a 10 20) (b 20 30))
726(deftest-overlays-in-1 q 5 10 () (a 10 20) (b 20 30))
727(deftest-overlays-in-1 r 15 20 (a) (a 10 20) (b 20 30))
728(deftest-overlays-in-1 s 15 25 (a b) (a 10 20) (b 20 30))
729(deftest-overlays-in-1 t 20 25 (b) (a 10 20) (b 20 30))
730(deftest-overlays-in-1 u 25 30 (b) (a 10 20) (b 20 30))
731(deftest-overlays-in-1 v 29 35 (b) (a 10 20) (b 20 30))
732(deftest-overlays-in-1 w 30 35 () (a 10 20) (b 20 30))
733(deftest-overlays-in-1 x 35 50 () (a 10 20) (b 20 30))
734(deftest-overlays-in-1 y 1 50 (a b) (a 10 20) (b 20 30))
735(deftest-overlays-in-1 z 15 50 (a b) (a 10 20) (b 20 30))
736(deftest-overlays-in-1 aa 1 25 (a b) (a 10 20) (b 20 30))
737
738;; 1 empty overlay
739(deftest-overlays-in-1 ab 1 10 () (a 10 10))
740(deftest-overlays-in-1 ac 10 10 (a) (a 10 10))
741(deftest-overlays-in-1 ad 9 10 () (a 10 10))
742(deftest-overlays-in-1 ae 9 11 (a) (a 10 10))
743(deftest-overlays-in-1 af 10 11 (a) (a 10 10))
744
745
746;; behaviour at point-max
747(ert-deftest test-overlays-in-2 ()
748 (cl-macrolet ((should-length (n list)
749 `(should (= ,n (length ,list)))))
750 (with-temp-buffer
751 (insert (make-string 100 ?\s))
752 (make-overlay (point-max) (point-max))
753 (make-overlay 50 50)
754 (should-length 1 (overlays-in 50 50))
755 (should-length 2 (overlays-in 1 (point-max)))
756 (should-length 1 (overlays-in (point-max) (point-max)))
757 (narrow-to-region 1 50)
758 (should-length 0 (overlays-in 1 (point-max)))
759 (should-length 1 (overlays-in (point-max) (point-max))))))
760
761
762;; +==========================================================================+
763;; | overlay-recenter
764;; +==========================================================================+
765
766;; This function is a noop in the overlay tree branch.
767(ert-deftest test-overlay-recenter ()
768 (with-temp-buffer
769 (should-not (overlay-recenter 1))
770 (insert (make-string 100 ?\s))
771 (dotimes (i 10)
772 (make-overlay i (1+ i))
773 (should-not (overlay-recenter i)))))
774
775
776;; +==========================================================================+
777;; | move-overlay
778;; +==========================================================================+
779
780;; buffer nil with live overlay
781(ert-deftest test-move-overlay-1 ()
782 (test-with-overlay-in-buffer (ov 1 100)
783 (move-overlay ov 50 60)
784 (should (= 50 (overlay-start ov)))
785 (should (= 60 (overlay-end ov)))
786 (should (eq (current-buffer) (overlay-buffer ov)))))
787
788;; buffer nil, dead overlay
789(ert-deftest test-move-overlay-2 ()
790 (with-temp-buffer
791 (let ((ov (test-with-overlay-in-buffer (ov 1 100) ov)))
792 (insert (make-string 100 ?\s))
793 (move-overlay ov 50 60)
794 (should (= 50 (overlay-start ov)))
795 (should (= 60 (overlay-end ov)))
796 (should (eq (current-buffer) (overlay-buffer ov))))))
797
798;; buffer non-nil, live overlay
799(ert-deftest test-move-overlay-3 ()
800 (test-with-overlay-in-buffer (ov 10 100)
801 (with-temp-buffer
802 (move-overlay ov 1 1 (current-buffer))
803 (should (= 1 (overlay-start ov)))
804 (should (= 1 (overlay-end ov)))
805 (should (eq (current-buffer) (overlay-buffer ov))))
806 (should-not (overlay-start ov))
807 (should-not (overlay-end ov))
808 (should-not (overlay-buffer ov))))
809
810;; buffer non-nil, dead overlay
811(ert-deftest test-move-overlay-4 ()
812 (let ((ov (test-with-overlay-in-buffer (ov 1 1) ov)))
813 (with-temp-buffer
814 (move-overlay ov 1 1 (current-buffer))
815 (should (= 1 (overlay-start ov)))
816 (should (= 1 (overlay-end ov)))
817 (should (eq (current-buffer) (overlay-buffer ov))))
818 (should-not (overlay-start ov))
819 (should-not (overlay-end ov))
820 (should-not (overlay-buffer ov))))
821
822;; +==========================================================================+
823;; | delete-(all-)overlay
824;; +==========================================================================+
825
826;; delete live overlay
827(ert-deftest test-delete-overlay-1 ()
828 (test-with-overlay-in-buffer (ov 10 100)
829 (should (buffer-live-p (overlay-buffer ov)))
830 (delete-overlay ov)
831 (should-not (overlay-start ov))
832 (should-not (overlay-end ov))
833 (should-not (overlay-buffer ov))))
834
835;; delete dead overlay
836(ert-deftest test-delete-overlay-2 ()
837 (let ((ov (test-with-overlay-in-buffer (ov 10 100) ov)))
838 (should-not (overlay-start ov))
839 (should-not (overlay-end ov))
840 (should-not (overlay-buffer ov))
841 (should-not (delete-overlay ov))
842 (should-not (overlay-start ov))
843 (should-not (overlay-end ov))
844 (should-not (overlay-buffer ov))))
845
846(ert-deftest test-delete-all-overlay-1 ()
847 (with-temp-buffer
848 (should-not (delete-all-overlays))
849 (should-not (delete-all-overlays (current-buffer)))
850 (insert (make-string 100 ?\s))
851 (dotimes (i 10) (make-overlay i (1+ i)))
852 (should-not (delete-all-overlays (current-buffer)))
853 (should-not (delete-all-overlays))))
854
855
856;; +==========================================================================+
857;; | get-char-property(-and-overlay)
858;; +==========================================================================+
859
860;; FIXME: TBD
861
862
863;; +==========================================================================+
864;; | Moving by insertions
865;; +==========================================================================+
866
867(defmacro deftest-moving-insert-1 (id beg-end insert sbeg-send fa ra)
868 (cl-destructuring-bind (beg end ipos ilen sbeg send fa ra)
869 (append beg-end insert sbeg-send (list fa ra) nil)
870 `(ert-deftest ,(buffer-tests--make-test-name 'moving-insert 1 id) ()
871 (test-with-overlay-in-buffer (ov ,beg ,end ,fa ,ra)
872 (should (= ,beg (overlay-start ov)))
873 (should (= ,end (overlay-end ov)))
874 (goto-char ,ipos)
875 (insert (make-string ,ilen ?x))
876 (should (= ,sbeg (overlay-start ov)))
877 (should (= ,send (overlay-end ov)))))))
878
879;; non-empty, no fa, no ra
880;; -------------------- OV INS RESULT
881(deftest-moving-insert-1 A (10 20) (15 3) (10 23) nil nil)
882(deftest-moving-insert-1 B (10 20) (20 4) (10 20) nil nil)
883(deftest-moving-insert-1 C (10 20) (5 5) (15 25) nil nil)
884(deftest-moving-insert-1 D (10 20) (10 3) (10 23) nil nil)
885(deftest-moving-insert-1 E (10 20) (20 4) (10 20) nil nil)
886
887;; non-empty no fa, ra
888(deftest-moving-insert-1 F (10 20) (15 3) (10 23) nil t)
889(deftest-moving-insert-1 G (10 20) (20 4) (10 24) nil t)
890(deftest-moving-insert-1 H (10 20) (5 5) (15 25) nil t)
891(deftest-moving-insert-1 I (10 20) (10 3) (10 23) nil t)
892(deftest-moving-insert-1 J (10 20) (20 4) (10 24) nil t)
893
894;; non-empty, fa, no r
895(deftest-moving-insert-1 K (10 20) (15 3) (10 23) t nil)
896(deftest-moving-insert-1 L (10 20) (20 4) (10 20) t nil)
897(deftest-moving-insert-1 M (10 20) (5 5) (15 25) t nil)
898(deftest-moving-insert-1 N (10 20) (10 3) (13 23) t nil)
899(deftest-moving-insert-1 O (10 20) (20 4) (10 20) t nil)
900
901;; This used to fail.
902(ert-deftest test-moving-insert-2-a ()
903 (with-temp-buffer
904 (insert (make-string 1 ?.))
905 (let ((ov (make-overlay 1 1 nil t nil)))
906 (insert "()")
907 (should (= 1 (overlay-end ov))))))
908
909;; non-empty, fa, ra
910(deftest-moving-insert-1 P (10 20) (15 3) (10 23) t t)
911(deftest-moving-insert-1 Q (10 20) (20 4) (10 24) t t)
912(deftest-moving-insert-1 R (10 20) (5 5) (15 25) t t)
913(deftest-moving-insert-1 S (10 20) (10 3) (13 23) t t)
914(deftest-moving-insert-1 T (10 20) (20 4) (10 24) t t)
915
916;; empty, no fa, no ra
917(deftest-moving-insert-1 U (15 15) (20 4) (15 15) nil nil)
918(deftest-moving-insert-1 V (15 15) (5 5) (20 20) nil nil)
919(deftest-moving-insert-1 W (15 15) (15 3) (15 15) nil nil)
920
921;; empty no fa, ra
922(deftest-moving-insert-1 X (15 15) (20 4) (15 15) nil t)
923(deftest-moving-insert-1 Y (15 15) (5 5) (20 20) nil t)
924(deftest-moving-insert-1 Z (15 15) (15 3) (15 18) nil t)
925
926;; empty, fa, no ra
927(deftest-moving-insert-1 a (15 15) (20 4) (15 15) t nil)
928(deftest-moving-insert-1 b (15 15) (5 5) (20 20) t nil)
929(deftest-moving-insert-1 c (15 15) (15 3) (15 15) t nil)
930
931;; empty, fa, ra
932(deftest-moving-insert-1 d (15 15) (20 4) (15 15) t t)
933(deftest-moving-insert-1 e (15 15) (5 5) (20 20) t t)
934(deftest-moving-insert-1 f (15 15) (15 3) (18 18) t t)
935
936;; Try to trigger a pathological case where the tree could become
937;; unordered due to an insert operation.
938
939(ert-deftest test-moving-insert-2 ()
940 (with-temp-buffer
941 (insert (make-string 1000 ?x))
942 (let ((root (make-overlay 50 75 nil nil 'rear-advance))
943 (left (make-overlay 25 50 nil 'front-advance 'rear-advance))
944 (right (make-overlay 75 100 nil nil nil)))
945 ;; [50] <--- start
946 ;; / \
947 ;; (25) (75)
948 (delete-region 25 75)
949 ;; [25]
950 ;; / \
951 ;; (25) (25)
952 (should (= 25 (overlay-start root)))
953 (should (= 25 (overlay-end root)))
954 (should (= 25 (overlay-start left)))
955 (should (= 25 (overlay-end left)))
956 (should (= 25 (overlay-start right)))
957 (should (= 50 (overlay-end right)))
958 ;; Inserting at start should make left advance while right and
959 ;; root stay, thus we would have left > right .
960 (goto-char 25)
961 (insert (make-string 25 ?x))
962 ;; [25]
963 ;; / \
964 ;; (50) (25)
965 (should (= 25 (overlay-start root)))
966 (should (= 50 (overlay-end root)))
967 (should (= 50 (overlay-start left)))
968 (should (= 50 (overlay-end left)))
969 (should (= 25 (overlay-start right)))
970 (should (= 75 (overlay-end right)))
971 ;; Try to detect the error, by removing left. The should fail
972 ;; an eassert, since it won't be found by a reular tree
973 ;; traversal - in theory.
974 (delete-overlay left)
975 (should (= 2 (length (overlays-in 1 (point-max))))))))
976
977
978
979;; +==========================================================================+
980;; | Moving by deletions
981;; +==========================================================================+
982
983(defmacro deftest-moving-delete-1 (id beg-end delete sbeg-send fa ra)
984 (cl-destructuring-bind (beg end dpos dlen sbeg send fa ra)
985 (append beg-end delete sbeg-send (list fa ra) nil)
986 `(ert-deftest ,(buffer-tests--make-test-name 'moving-delete 1 id) ()
987 (test-with-overlay-in-buffer (ov ,beg ,end ,fa ,ra)
988 (should (= ,beg (overlay-start ov)))
989 (should (= ,end (overlay-end ov)))
990 (delete-region ,dpos (+ ,dpos ,dlen))
991 (should (= ,sbeg (overlay-start ov)))
992 (should (= ,send (overlay-end ov)))))))
993
994;; non-empty, no fa, no ra
995;; -------------------- OV DEL RESULT
996(deftest-moving-delete-1 A (10 20) (15 3) (10 17) nil nil)
997(deftest-moving-delete-1 B (10 20) (20 4) (10 20) nil nil)
998(deftest-moving-delete-1 C (10 20) (5 5) (5 15) nil nil)
999(deftest-moving-delete-1 D (10 20) (10 3) (10 17) nil nil)
1000(deftest-moving-delete-1 E (10 20) (20 4) (10 20) nil nil)
1001
1002;; non-empty no fa, ra
1003(deftest-moving-delete-1 F (10 20) (15 3) (10 17) nil t)
1004(deftest-moving-delete-1 G (10 20) (20 4) (10 20) nil t)
1005(deftest-moving-delete-1 H (10 20) (5 5) (5 15) nil t)
1006(deftest-moving-delete-1 I (10 20) (10 3) (10 17) nil t)
1007(deftest-moving-delete-1 J (10 20) (20 4) (10 20) nil t)
1008
1009;; non-empty, fa, no ra
1010(deftest-moving-delete-1 K (10 20) (15 3) (10 17) t nil)
1011(deftest-moving-delete-1 L (10 20) (20 4) (10 20) t nil)
1012(deftest-moving-delete-1 M (10 20) (5 5) (5 15) t nil)
1013(deftest-moving-delete-1 N (10 20) (10 3) (10 17) t nil)
1014(deftest-moving-delete-1 O (10 20) (20 4) (10 20) t nil)
1015
1016;; non-empty, fa, ra
1017(deftest-moving-delete-1 P (10 20) (15 3) (10 17) t t)
1018(deftest-moving-delete-1 Q (10 20) (20 4) (10 20) t t)
1019(deftest-moving-delete-1 R (10 20) (5 5) (5 15) t t)
1020(deftest-moving-delete-1 S (10 20) (10 3) (10 17) t t)
1021(deftest-moving-delete-1 T (10 20) (20 4) (10 20) t t)
1022
1023;; empty, no fa, no ra
1024(deftest-moving-delete-1 U (15 15) (20 4) (15 15) nil nil)
1025(deftest-moving-delete-1 V (15 15) (5 5) (10 10) nil nil)
1026(deftest-moving-delete-1 W (15 15) (15 3) (15 15) nil nil)
1027
1028;; empty no fa, ra
1029(deftest-moving-delete-1 X (15 15) (20 4) (15 15) nil t)
1030(deftest-moving-delete-1 Y (15 15) (5 5) (10 10) nil t)
1031(deftest-moving-delete-1 Z (15 15) (15 3) (15 15) nil t)
1032
1033;; empty, fa, no ra
1034(deftest-moving-delete-1 a (15 15) (20 4) (15 15) t nil)
1035(deftest-moving-delete-1 b (15 15) (5 5) (10 10) t nil)
1036(deftest-moving-delete-1 c (15 15) (15 3) (15 15) t nil)
1037
1038;; empty, fa, ra
1039(deftest-moving-delete-1 d (15 15) (20 4) (15 15) t t)
1040(deftest-moving-delete-1 e (15 15) (5 5) (10 10) t t)
1041(deftest-moving-delete-1 f (15 15) (15 3) (15 15) t t)
1042
1043
1044;; +==========================================================================+
1045;; | make-indirect-buffer
1046;; +==========================================================================+
1047
1048;; Check if overlays are cloned/seperate from indirect buffer.
1049(ert-deftest test-make-indirect-buffer-1 ()
1050 (with-temp-buffer
1051 (dotimes (_ 10) (make-overlay 1 1))
1052 (let (indirect clone)
1053 (unwind-protect
1054 (progn
1055 (setq indirect (make-indirect-buffer
1056 (current-buffer) "indirect"))
1057 (with-current-buffer indirect
1058 (should-not (overlays-in (point-min) (point-max)))
1059 (dotimes (_ 20) (make-overlay 1 1))
1060 (should (= 20 (length (overlays-in (point-min) (point-max)))))
1061 (delete-all-overlays)
1062 (should-not (overlays-in (point-min) (point-max))))
1063 (should (= 10 (length (overlays-in (point-min) (point-max)))))
1064 (setq clone (make-indirect-buffer
1065 (current-buffer) "clone" 'clone))
1066 (with-current-buffer clone
1067 (should (= 10 (length (overlays-in (point-min) (point-max)))))
1068 (dotimes (_ 30) (make-overlay 1 1))
1069 (should (= 40 (length (overlays-in (point-min) (point-max))))))
1070 ;; back in temp buffer
1071 (should (= 10 (length (overlays-in (point-min) (point-max)))))
1072 (with-current-buffer clone
1073 (mapc #'delete-overlay
1074 (seq-take (overlays-in (point-min) (point-max)) 10))
1075 (should (= 30 (length (overlays-in (point-min) (point-max))))))
1076 (should (= 10 (length (overlays-in (point-min) (point-max)))))
1077 (delete-all-overlays)
1078 (with-current-buffer clone
1079 (should (= 30 (length (overlays-in (point-min) (point-max)))))))
1080 (when (buffer-live-p clone)
1081 (kill-buffer clone))
1082 (when (buffer-live-p indirect)
1083 (kill-buffer indirect))))))
1084
1085
1086
1087;; +==========================================================================+
1088;; | buffer-swap-text
1089;; +==========================================================================+
1090
1091(defmacro buffer-tests--with-temp-buffers (vars &rest body)
1092 (declare (indent 1) (debug (sexp &rest form)))
1093 (if (null vars)
1094 `(progn ,@body)
1095 `(with-temp-buffer
1096 (let ((,(car vars) (current-buffer)))
1097 (buffer-tests--with-temp-buffers ,(cdr vars) ,@body)))))
1098
1099;; basic
1100(ert-deftest test-buffer-swap-text-1 ()
1101 (buffer-tests--with-temp-buffers (buffer other)
1102 (with-current-buffer buffer
1103 (let ((ov (make-overlay 1 1)))
1104 (buffer-swap-text other)
1105 (should-not (overlays-in 1 1))
1106 (with-current-buffer other
1107 (should (overlays-in 1 1))
1108 (should (eq ov (car (overlays-in 1 1)))))))))
1109
1110;; properties
1111(ert-deftest test-buffer-swap-text-1 ()
1112 (buffer-tests--with-temp-buffers (buffer other)
1113 (with-current-buffer other
1114 (overlay-put (make-overlay 1 1) 'buffer 'other))
1115 (with-current-buffer buffer
1116 (overlay-put (make-overlay 1 1) 'buffer 'buffer)
1117 (buffer-swap-text other)
1118 (should (= 1 (length (overlays-in 1 1))))
1119 (should (eq (overlay-get (car (overlays-in 1 1)) 'buffer) 'other)))
1120 (with-current-buffer other
1121 (should (= 1 (length (overlays-in 1 1))))
1122 (should (eq (overlay-get (car (overlays-in 1 1)) 'buffer) 'buffer)))))
1123
1124
1125;; +==========================================================================+
1126;; | priorities
1127;; +==========================================================================+
1128
1129(ert-deftest test-overlay-priorities-1 ()
1130 (with-temp-buffer
1131 (insert " ")
1132 (dotimes (i 10)
1133 (let ((ov (make-overlay 1 2)))
1134 (overlay-put ov 'priority i)
1135 (overlay-put ov 'value i)))
1136 (should (eq 9 (get-char-property 1 'value)))))
1137
1138(ert-deftest test-overlay-priorities-2 ()
1139 (with-temp-buffer
1140 (insert " ")
1141 (dotimes (j 10)
1142 (let* ((i (- 9 j))
1143 (ov (make-overlay 1 2)))
1144 (overlay-put ov 'priority i)
1145 (overlay-put ov 'value i)))
1146 (should (eq 9 (get-char-property 1 'value)))))
1147
1148
1149;; +==========================================================================+
1150;; | Other
1151;; +==========================================================================+
1152
1153(defun test-overlay-regions ()
1154 (sort (mapcar (lambda (ov)
1155 (cons (overlay-start ov)
1156 (overlay-end ov)))
1157 (overlays-in (point-min)
1158 (point-max)))
1159 (lambda (o1 o2)
1160 (or (< (car o1) (car o2))
1161 (and (= (car o1) (car o2))
1162 (< (cdr o1) (cdr o2)))))))
1163
1164;; This test used to fail.
1165(ert-deftest overlay-complex-delete-with-offset ()
1166 (with-temp-buffer
1167 (let (todelete)
1168 (insert (make-string 1000 ?\s))
1169 (make-overlay 1 2 nil t nil)
1170 (make-overlay 2 3 nil t nil)
1171 (make-overlay 3 4 nil t nil)
1172 (make-overlay 4 5 nil t nil)
1173 (setq todelete (make-overlay 280 287 nil t nil))
1174 (make-overlay 265 275 nil t nil)
1175 (make-overlay 329 386 nil t nil)
1176 (make-overlay 386 390 nil t nil)
1177 (goto-char 50)
1178 (delete-char 50)
1179 (goto-char 1)
1180 (delete-char 2)
1181 (delete-overlay todelete)
1182 (should (equal (test-overlay-regions)
1183 '((1 . 1) (1 . 1) (1 . 2) (2 . 3) (213 . 223) (277 . 334) (334 . 338)))))))
1184
1185;; This test used to fail.
1186(ert-deftest overlay-complex-insert-1 ()
1187 (with-temp-buffer
1188 (insert " ")
1189 (make-overlay 8 11 nil nil t)
1190 (make-overlay 2 7 nil nil nil)
1191 (make-overlay 2 4 nil t nil)
1192 (goto-char 1)
1193 (insert " ")
1194 (should (equal (test-overlay-regions)
1195 '((7 . 9)
1196 (7 . 12)
1197 (13 . 16))))))
1198
1199;; This test used to fail.
1200(ert-deftest overlay-complex-insert-2 ()
1201 (with-temp-buffer
1202 (insert (make-string 100 ?\s))
1203 (make-overlay 77 7 nil nil t)
1204 (make-overlay 21 53 nil t t)
1205 (make-overlay 84 14 nil nil nil)
1206 (make-overlay 38 69 nil t nil)
1207 (make-overlay 93 15 nil nil t)
1208 (make-overlay 73 48 nil t t)
1209 (make-overlay 96 51 nil t t)
1210 (make-overlay 6 43 nil t t)
1211 (make-overlay 15 100 nil t t)
1212 (make-overlay 22 17 nil nil nil)
1213 (make-overlay 72 45 nil t nil)
1214 (make-overlay 2 74 nil nil t)
1215 (make-overlay 15 29 nil t t)
1216 (make-overlay 17 34 nil t t)
1217 (make-overlay 101 66 nil t nil)
1218 (make-overlay 94 24 nil nil nil)
1219 (goto-char 78)
1220 (insert " ")
1221 (narrow-to-region 47 19)
1222 (goto-char 46)
1223 (widen)
1224 (narrow-to-region 13 3)
1225 (goto-char 9)
1226 (delete-char 0)
1227 (goto-char 11)
1228 (insert " ")
1229 (goto-char 3)
1230 (insert " ")
1231 (goto-char 8)
1232 (insert " ")
1233 (goto-char 26)
1234 (insert " ")
1235 (goto-char 14)
1236 (widen)
1237 (narrow-to-region 71 35)
1238 (should
1239 (equal (test-overlay-regions)
1240 '((2 . 104)
1241 (23 . 73)
1242 (24 . 107)
1243 (44 . 125)
1244 (45 . 59)
1245 (45 . 134)
1246 (45 . 141)
1247 (47 . 52)
1248 (47 . 64)
1249 (51 . 83)
1250 (54 . 135)
1251 (68 . 99))))))
1252
1253(ert-deftest test-overlay-multibyte-transition-1 ()
1254 (with-temp-buffer
1255 (set-buffer-multibyte t)
1256 (insert "ääää")
1257 ;; aeaeaeae
1258 ;; 1 2 3 4 5
1259 ;; 123456789
1260 (let ((nonempty-bob (make-overlay 1 2))
1261 (empty-bob (make-overlay 1 1))
1262 (empty (make-overlay 2 2))
1263 (nonempty (make-overlay 2 4))
1264 (nonempty-eob (make-overlay 4 5))
1265 (empty-eob (make-overlay 5 5)))
1266 (set-buffer-multibyte nil)
1267 (cl-macrolet
1268 ((ovshould (ov begin end)
1269 `(should (equal (list (overlay-start ,ov) (overlay-end ,ov))
1270 (list ,begin ,end)))))
1271 (ovshould nonempty-bob 1 3)
1272 (ovshould empty-bob 1 1)
1273 (ovshould empty 3 3)
1274 (ovshould nonempty 3 7)
1275 (ovshould nonempty-eob 7 9)
1276 (ovshould empty-eob 9 9)))))
1277
1278(ert-deftest test-overlay-multibyte-transition-2 ()
1279 (with-temp-buffer
1280 (set-buffer-multibyte t)
1281 (insert "ääää")
1282 (set-buffer-multibyte nil)
1283 ;; aeaeaeae
1284 ;; 1 2 3 4 5
1285 ;; 123456789
1286 (let ((nonempty-bob-end (make-overlay 1 2))
1287 (nonempty-bob-beg (make-overlay 1 3))
1288 (empty-bob (make-overlay 1 1))
1289 (empty-beg (make-overlay 3 3))
1290 (empty-end (make-overlay 2 2))
1291 (nonempty-beg-beg (make-overlay 3 7))
1292 (nonempty-beg-end (make-overlay 3 8))
1293 (nonempty-end-beg (make-overlay 4 7))
1294 (nonempty-end-end (make-overlay 4 8))
1295 (nonempty-eob-beg (make-overlay 5 9))
1296 (nonempty-eob-end (make-overlay 6 9))
1297 (empty-eob (make-overlay 9 9)))
1298 (set-buffer-multibyte t)
1299 (cl-macrolet
1300 ((ovshould (ov begin end)
1301 `(should (equal (list (overlay-start ,ov) (overlay-end ,ov))
1302 (list ,begin ,end)))))
1303 (ovshould nonempty-bob-end 1 2)
1304 (ovshould nonempty-bob-beg 1 2)
1305 (ovshould empty-bob 1 1)
1306 (ovshould empty-beg 2 2)
1307 (ovshould empty-end 2 2)
1308 (ovshould nonempty-beg-beg 2 4)
1309 (ovshould nonempty-beg-end 2 5)
1310 (ovshould nonempty-end-beg 3 4)
1311 (ovshould nonempty-end-end 3 5)
1312 (ovshould nonempty-eob-beg 3 5)
1313 (ovshould nonempty-eob-end 4 5)
1314 (ovshould empty-eob 5 5)))))
1315
97;;; buffer-tests.el ends here 1316;;; buffer-tests.el ends here