branch: elpa/pdf-tools
commit 804d183c59c7804f94fab652658fa7d4c4fd6ca0
Author: Vedang Manerikar <[email protected]>
Commit: Vedang Manerikar <[email protected]>

    fix(pdf-view): replace obsolete registerv-make with cl-defstruct
    
    The registerv-make function was deprecated in Emacs 27.1. Replace it
    with a proper cl-defstruct (pdf-view-register) and cl-defmethod
    implementations for register-val-jump-to, register-val-describe,
    and register-val-insert.
    
    Add tests for the register API used by pdf-view:
    - pdf-view-registerv-make-creates-register: verifies register creation
    - pdf-view-register-val-insert: verifies insert method works
    - pdf-view-position-to-register-stores-position: verifies store/retrieve
    
    Fixes: #333
---
 lisp/pdf-view.el      | 40 +++++++++++++++++++++++++---------------
 test/pdf-view-test.el | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 73 insertions(+), 15 deletions(-)

diff --git a/lisp/pdf-view.el b/lisp/pdf-view.el
index eabcce49396..620e5269d77 100644
--- a/lisp/pdf-view.el
+++ b/lisp/pdf-view.el
@@ -1843,21 +1843,22 @@ works only with bookmarks created by
       (pdf-view-bookmark-jump-handler bmk)
       (run-hooks 'bookmark-after-jump-hook))))
 
-(defun pdf-view-registerv-make ()
-  "Create a PDF register entry of the current position."
-  (registerv-make
-   (pdf-view-bookmark-make-record nil t t)
-   :print-func 'pdf-view-registerv-print-func
-   :jump-func 'pdf-view-bookmark-jump
-   :insert-func (lambda (bmk)
-                  (insert (format "%S" bmk)))))
-
-(defun pdf-view-registerv-print-func (bmk)
-  "Print a textual representation of bookmark BMK.
-
-This function is used as the `:print-func' property with
-`registerv-make'."
-  (let* ((file (bookmark-prop-get bmk 'filename))
+;; Register support using cl-defstruct (replaces obsolete registerv-make)
+(cl-defstruct (pdf-view-register
+               (:constructor nil)
+               (:constructor pdf-view-register--make (bookmark))
+               (:copier nil))
+  "A PDF position register entry."
+  bookmark)
+
+(cl-defmethod register-val-jump-to ((val pdf-view-register) _arg)
+  "Jump to the PDF position stored in VAL."
+  (pdf-view-bookmark-jump (pdf-view-register-bookmark val)))
+
+(cl-defmethod register-val-describe ((val pdf-view-register) _verbose)
+  "Print a description of the PDF position stored in VAL."
+  (let* ((bmk (pdf-view-register-bookmark val))
+         (file (bookmark-prop-get bmk 'filename))
          (buffer (find-buffer-visiting file))
          (page (bookmark-prop-get bmk 'page))
          (origin (bookmark-prop-get bmk 'origin)))
@@ -1870,6 +1871,15 @@ This function is used as the `:print-func' property with
                        (round (* 100 (cdr origin)))
                      0)))))
 
+(cl-defmethod register-val-insert ((val pdf-view-register))
+  "Insert the PDF bookmark stored in VAL."
+  (insert (format "%S" (pdf-view-register-bookmark val))))
+
+(defun pdf-view-registerv-make ()
+  "Create a PDF register entry of the current position."
+  (pdf-view-register--make
+   (pdf-view-bookmark-make-record nil t t)))
+
 (defmacro pdf-view-with-register-alist (&rest body)
   "Setup the proper binding for `register-alist' in BODY.
 
diff --git a/test/pdf-view-test.el b/test/pdf-view-test.el
index 58f6be5afc5..4a4a74be749 100644
--- a/test/pdf-view-test.el
+++ b/test/pdf-view-test.el
@@ -3,6 +3,54 @@
 (require 'pdf-view)
 (require 'ert)
 
+;; Tests for pdf-view-register struct and cl-defmethod implementations.
+;; These tests use mock bookmark data because the actual 
pdf-view-registerv-make
+;; function requires a window context which isn't available in batch mode.
+
+(ert-deftest pdf-view-register-struct-creation ()
+  "Test that pdf-view-register struct can be created."
+  (let* ((mock-bookmark '("test.pdf"
+                          (filename . "/path/to/test.pdf")
+                          (page . 1)
+                          (origin . (0.0 . 0.0))
+                          (handler . pdf-view-bookmark-jump-handler)))
+         (reg (pdf-view-register--make mock-bookmark)))
+    ;; Should return non-nil
+    (should reg)
+    ;; Should be a pdf-view-register struct
+    (should (pdf-view-register-p reg))
+    ;; Should store the bookmark
+    (should (equal (pdf-view-register-bookmark reg) mock-bookmark))))
+
+(ert-deftest pdf-view-register-val-describe ()
+  "Test that register-val-describe works for PDF register entries."
+  (let* ((mock-bookmark '("test.pdf"
+                          (filename . "/path/to/test.pdf")
+                          (page . 5)
+                          (origin . (0.0 . 0.5))
+                          (handler . pdf-view-bookmark-jump-handler)))
+         (reg (pdf-view-register--make mock-bookmark)))
+    ;; register-val-describe should return a non-empty string
+    (should (stringp
+             (with-output-to-string
+               (register-val-describe reg nil))))
+    ;; The description should mention the page number
+    (should (string-match-p "page 5"
+             (with-output-to-string
+               (register-val-describe reg nil))))))
+
+(ert-deftest pdf-view-register-val-insert ()
+  "Test that register-val-insert works for PDF register entries."
+  (let* ((mock-bookmark '("test.pdf"
+                          (filename . "/path/to/test.pdf")
+                          (page . 1)
+                          (handler . pdf-view-bookmark-jump-handler)))
+         (reg (pdf-view-register--make mock-bookmark)))
+    ;; register-val-insert should insert text without error
+    (with-temp-buffer
+      (register-val-insert reg)
+      (should (> (buffer-size) 0)))))
+
 (ert-deftest pdf-view-handle-archived-file ()
   :expected-result :failed
   (skip-unless (executable-find "gzip"))

Reply via email to