GNU bug report logs -
#57150
29.0.50; [PATCH] Add test coverage for overlay modification hooks
Previous Next
Reported by: Matt Armstrong <matt <at> rfc20.org>
Date: Fri, 12 Aug 2022 04:34:01 UTC
Severity: normal
Tags: patch
Found in version 29.0.50
Fixed in version 29.1
Done: Lars Ingebrigtsen <larsi <at> gnus.org>
Bug is archived. No further changes may be made.
Full log
View this message in rfc822 format
[Message part 1 (text/plain, inline)]
Matt Armstrong <matt <at> rfc20.org> writes:
> I noticed there was no explicit test against the overlay modification
> hook boundary conditions. The attached patch adds some, which might
> be nice to have if a person (possibly me) someday optimizes overlay
> performance with a change in data structure.
>
> In writing this I was surprised to learn that the hooks do not behave
> differently if the overlay is `front-advance' or `rear-advance', so
> this is explicitly tested.
...follow up with a comment typo fix.
[0001-Add-test-coverage-for-overlay-modification-hooks.patch (text/x-diff, inline)]
From 372c894e8d33eb5271b6c19b2e2e2843197a7353 Mon Sep 17 00:00:00 2001
From: Matt Armstrong <matt <at> rfc20.org>
Date: Thu, 11 Aug 2022 21:11:36 -0700
Subject: [PATCH] Add test coverage for overlay modification hooks
* test/src/buffer-tests.el: (overlay-modification-hooks) new
ert-deftest.
---
test/src/buffer-tests.el | 67 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 67 insertions(+)
diff --git a/test/src/buffer-tests.el b/test/src/buffer-tests.el
index 3c6a9208ff..381d8618aa 100644
--- a/test/src/buffer-tests.el
+++ b/test/src/buffer-tests.el
@@ -22,6 +22,73 @@
(require 'ert)
(require 'ert-x)
(require 'cl-lib)
+(require 'pcase)
+
+(ert-deftest overlay-modification-hooks ()
+ "Test the `modification-hooks' overlay property.
+
+This also tests `insert-in-front-hooks' and `insert-behind-hooks'."
+ ;; Perform operation against the given needle (a position or string)
+ ;; and expect the `modification-hook', `insert-in-front-hooks' and
+ ;; `insert-behind-hooks' to be called with the given arguments. All
+ ;; tests are performed against the same fixed buffer and overlay.
+ (pcase-dolist (`(,operation
+ ,needle
+ ,expected-insert-in-front-calls
+ ,expected-modification-calls
+ ,expected-insert-behind-calls)
+ '((insert 1 nil nil nil)
+ (insert 2 ((nil 2 2) (t 2 3 0)) nil nil)
+ (insert 3 nil ((nil 3 3) (t 3 4 0)) nil)
+ (insert 4 nil nil ((nil 4 4) (t 4 5 0)))
+ (insert 5 nil nil nil)
+ (replace "1" nil nil nil)
+ (replace "2" nil ((nil 2 3) (t 2 3 1)) nil)
+ (replace "3" nil ((nil 3 4) (t 3 4 1)) nil)
+ (replace "4" nil nil nil)
+ (replace "12" nil ((nil 1 3) (t 1 2 2)) nil)
+ (replace "23" nil ((nil 2 4) (t 2 3 2)) nil)
+ (replace "34" nil ((nil 3 5) (t 3 4 2)) nil)
+ (replace "123" nil ((nil 1 4) (t 1 2 3)) nil)
+ (replace "234" nil ((nil 2 5) (t 2 3 3)) nil)
+ (replace "1234" nil ((nil 1 5) (t 1 2 4)) nil)))
+ ;; All three hooks ignore the overlay's `front-advance' and
+ ;; `rear-advance' option, so test both ways and expect the same
+ ;; result.
+ (dolist (advance '(nil t))
+ (with-temp-buffer
+ (insert "1234")
+ (let (modification-calls insert-in-front-calls insert-behind-calls
+ (overlay (make-overlay 2 4 nil advance advance)))
+ (overlay-put overlay
+ 'modification-hooks
+ (list (lambda (ov &rest args)
+ (should inhibit-modification-hooks)
+ (should (eq ov overlay))
+ (push args modification-calls))))
+ (overlay-put overlay
+ 'insert-in-front-hooks
+ (list (lambda (ov &rest args)
+ (should inhibit-modification-hooks)
+ (should (eq ov overlay))
+ (push args insert-in-front-calls))))
+ (overlay-put overlay
+ 'insert-behind-hooks
+ (list (lambda (ov &rest args)
+ (should inhibit-modification-hooks)
+ (should (eq ov overlay))
+ (push args insert-behind-calls))))
+ (pcase-exhaustive operation
+ (`insert (goto-char needle)
+ (insert "x"))
+ (`replace (goto-char (point-min))
+ (replace-string needle "x")))
+ (should (equal (reverse insert-in-front-calls)
+ expected-insert-in-front-calls))
+ (should (equal (reverse modification-calls)
+ expected-modification-calls))
+ (should (equal (reverse insert-behind-calls)
+ expected-insert-behind-calls)))))))
(ert-deftest overlay-modification-hooks-message-other-buf ()
"Test for bug#21824.
--
2.35.1
This bug report was last modified 2 years and 318 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.