diff options
| author | Craig Jennings <c@cjennings.net> | 2026-05-25 15:11:04 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-05-25 15:11:04 -0500 |
| commit | b007a9b808d3cf360d03f3d7597119c2fe2cd6e8 (patch) | |
| tree | 0a890f19804f7e9ed01d682d4855689432c2a147 /tests | |
| parent | fda029f8f96d9ce7ac8276ceb3475cd9a3bbe797 (diff) | |
| download | dotemacs-b007a9b808d3cf360d03f3d7597119c2fe2cd6e8.tar.gz dotemacs-b007a9b808d3cf360d03f3d7597119c2fe2cd6e8.zip | |
fix(latex): make PDF-viewer selection idempotent
cj/--latex-select-pdf-viewer runs on every LaTeX-mode buffer and was blindly pushing an (output-pdf VIEWER) entry onto TeX-view-program-selection, so each LaTeX buffer opened in a session stacked another duplicate. The head still won, so the viewer worked, but the list grew and the docstring's idempotency claim was false. I drop any existing output-pdf entry before consing the chosen viewer, which also makes "wins over any default" actually true.
Added a test file (the module had none) covering selection, preference order, the PDF-Tools fallback, idempotency, and default override, with executable-find mocked so the run doesn't depend on which viewers are installed.
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/test-latex-config.el | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/tests/test-latex-config.el b/tests/test-latex-config.el new file mode 100644 index 00000000..cb8aaeca --- /dev/null +++ b/tests/test-latex-config.el @@ -0,0 +1,84 @@ +;;; test-latex-config.el --- Tests for latex-config PDF viewer selection -*- lexical-binding: t; -*- + +;;; Commentary: +;; latex-config picks the first available external PDF viewer and pushes it +;; onto `TeX-view-program-selection' for output-pdf. These tests exercise +;; `cj/--latex-select-pdf-viewer' with `executable-find' mocked, so they don't +;; depend on which viewers happen to be installed on the test machine. + +;;; Code: + +(require 'ert) +(require 'cl-lib) +(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory)) + +;; Declare special so the let-bindings below are dynamic, matching the global +;; valued `defvar' AUCTeX's tex.el provides at runtime. Without it the module's +;; file-local `(defvar TeX-view-program-selection)' does not reach a test's let. +(defvar TeX-view-program-selection nil) + +(require 'latex-config) + +(defun test-latex--with-available (available thunk) + "Run THUNK with `executable-find' returning non-nil only for AVAILABLE names." + (cl-letf (((symbol-function 'executable-find) + (lambda (cmd &rest _) + (and (member cmd available) (concat "/usr/bin/" cmd))))) + (funcall thunk))) + +(ert-deftest test-latex-config-select-pdf-viewer-picks-available () + "Normal: selects the available external viewer for output-pdf." + (let ((TeX-view-program-selection nil)) + (test-latex--with-available + '("zathura") + (lambda () (cj/--latex-select-pdf-viewer))) + (should (equal (assq 'output-pdf TeX-view-program-selection) + '(output-pdf "Zathura"))))) + +(ert-deftest test-latex-config-select-pdf-viewer-honors-preference-order () + "Normal: picks the first candidate in preference order when several exist." + (let ((TeX-view-program-selection nil)) + ;; both available; evince precedes okular in the candidate list + (test-latex--with-available + '("okular" "evince") + (lambda () (cj/--latex-select-pdf-viewer))) + (should (equal (assq 'output-pdf TeX-view-program-selection) + '(output-pdf "Evince"))))) + +(ert-deftest test-latex-config-select-pdf-viewer-falls-back-to-pdf-tools () + "Boundary: no external viewer on PATH falls back to PDF Tools." + (let ((TeX-view-program-selection nil)) + (test-latex--with-available + '() + (lambda () (cj/--latex-select-pdf-viewer))) + (should (equal (assq 'output-pdf TeX-view-program-selection) + '(output-pdf "PDF Tools"))))) + +(ert-deftest test-latex-config-select-pdf-viewer-idempotent () + "Boundary: re-running leaves exactly one output-pdf entry." + (let ((TeX-view-program-selection nil)) + (test-latex--with-available + '("zathura") + (lambda () + (cj/--latex-select-pdf-viewer) + (cj/--latex-select-pdf-viewer) + (cj/--latex-select-pdf-viewer))) + (should (= 1 (cl-count 'output-pdf TeX-view-program-selection :key #'car))) + (should (equal (assq 'output-pdf TeX-view-program-selection) + '(output-pdf "Zathura"))))) + +(ert-deftest test-latex-config-select-pdf-viewer-overrides-existing-default () + "Boundary: an existing output-pdf default is replaced, not stacked." + (let ((TeX-view-program-selection '((output-pdf "Evince") (output-dvi "xdvi")))) + (test-latex--with-available + '("zathura") + (lambda () (cj/--latex-select-pdf-viewer))) + (should (= 1 (cl-count 'output-pdf TeX-view-program-selection :key #'car))) + (should (equal (assq 'output-pdf TeX-view-program-selection) + '(output-pdf "Zathura"))) + ;; an unrelated output type survives the replacement + (should (equal (assq 'output-dvi TeX-view-program-selection) + '(output-dvi "xdvi"))))) + +(provide 'test-latex-config) +;;; test-latex-config.el ends here |
