aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-07-06 08:43:03 -0500
committerCraig Jennings <c@cjennings.net>2026-07-06 08:43:03 -0500
commit648c150f6e4e89c9c04158795da1ab13370d7f73 (patch)
tree442f9349e0904a4c00cb57c076e13f1152614fe5 /tests
parentf613bd63811d84816f88d26b33323e1b0f395793 (diff)
downloaddotemacs-648c150f6e4e89c9c04158795da1ab13370d7f73.tar.gz
dotemacs-648c150f6e4e89c9c04158795da1ab13370d7f73.zip
feat(readers): default EPUB and PDF to a dark/sepia/light reading cycle
nov-mode's reading cycle opened on sepia and ran sepia, dark, light. I reordered it to dark, sepia, light and made a fresh EPUB open dark. pdf-view only had a binary midnight toggle. I added a matching palette layer: a fresh PDF opens dark, and c cycles dark, sepia, light, none (C selects by name, M also cycles). Each palette is a foreground/background pair fed to pdf-view-midnight-minor-mode, so sepia and light are that same duotone with warmer and lighter colors. The pdf colors mirror the nov palettes so EPUBs and PDFs read alike. Pure name-to-colors and cycle logic are unit-tested. The live render needs a manual check.
Diffstat (limited to 'tests')
-rw-r--r--tests/test-nov-reading--config-defaults.el38
-rw-r--r--tests/test-pdf-config--reading-palette.el87
2 files changed, 125 insertions, 0 deletions
diff --git a/tests/test-nov-reading--config-defaults.el b/tests/test-nov-reading--config-defaults.el
new file mode 100644
index 00000000..5e454ce1
--- /dev/null
+++ b/tests/test-nov-reading--config-defaults.el
@@ -0,0 +1,38 @@
+;;; test-nov-reading--config-defaults.el --- nov reading default/order tests -*- lexical-binding: t; -*-
+
+;;; Commentary:
+;; Asserts the shipped reading-view defaults: a fresh EPUB opens dark, and the
+;; `c' cycle runs dark -> sepia -> light -> none -> back. The pure-logic file
+;; test-nov-reading--palette.el covers the cycle mechanics on fixtures; this file
+;; pins the real `cj/nov-reading-palettes' / `cj/nov-reading-default-palette'
+;; values so a reorder can't silently drift the default or the cycle order.
+
+;;; Code:
+
+(require 'ert)
+(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory))
+(require 'nov-reading)
+
+(declare-function cj/nov--next-reading-palette "nov-reading" (current names))
+(defvar cj/nov-reading-palettes)
+(defvar cj/nov-reading-default-palette)
+
+(ert-deftest test-nov-reading-config-default-is-dark ()
+ "Normal: a fresh nov buffer opens on the dark palette."
+ (should (equal cj/nov-reading-default-palette "dark")))
+
+(ert-deftest test-nov-reading-config-order-is-dark-sepia-light ()
+ "Normal: the shipped palette order is dark, then sepia, then light."
+ (should (equal (mapcar #'car cj/nov-reading-palettes)
+ '("dark" "sepia" "light"))))
+
+(ert-deftest test-nov-reading-config-cycle-from-default ()
+ "Normal: cycling from the default advances dark -> sepia -> light -> none -> dark."
+ (let ((names (mapcar #'car cj/nov-reading-palettes)))
+ (should (equal (cj/nov--next-reading-palette "dark" names) "sepia"))
+ (should (equal (cj/nov--next-reading-palette "sepia" names) "light"))
+ (should-not (cj/nov--next-reading-palette "light" names))
+ (should (equal (cj/nov--next-reading-palette nil names) "dark"))))
+
+(provide 'test-nov-reading--config-defaults)
+;;; test-nov-reading--config-defaults.el ends here
diff --git a/tests/test-pdf-config--reading-palette.el b/tests/test-pdf-config--reading-palette.el
new file mode 100644
index 00000000..6a02d838
--- /dev/null
+++ b/tests/test-pdf-config--reading-palette.el
@@ -0,0 +1,87 @@
+;;; test-pdf-config--reading-palette.el --- pdf reading-palette tests -*- lexical-binding: t; -*-
+
+;;; Commentary:
+;; Pure-logic tests for the pdf-view reading-palette layer: name->colors
+;; resolution, the shipped default and order, and the cycle (palettes, then the
+;; no-palette state, wrapping). The live application (which drives
+;; `pdf-view-midnight-minor-mode') is exercised in the daemon, not here.
+;;
+;; Requires pdf-config, which uses use-package for pdf-tools; `make test' runs
+;; without the implicit package-initialize, so bootstrap `package' first (the
+;; shared format-wiring helper). pdf-tools is loaded lazily (:defer t), so this
+;; only needs the pure top-level helpers, not the pdf-view runtime.
+
+;;; Code:
+
+(require 'ert)
+(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory))
+(add-to-list 'load-path (expand-file-name "tests" user-emacs-directory))
+(require 'testutil-format-wiring)
+
+(format-test--ensure-packages-init)
+(require 'pdf-config)
+
+(declare-function cj/pdf--reading-palette-colors "pdf-config" (name))
+(declare-function cj/pdf--next-reading-palette "pdf-config" (current names))
+(defvar cj/pdf-reading-palettes)
+(defvar cj/pdf-reading-default-palette)
+
+;;; ------------------------ cj/pdf--reading-palette-colors --------------------
+
+(ert-deftest test-pdf-reading-palette-colors-known ()
+ "Normal: a known palette resolves to a (FG . BG) cons of two strings."
+ (let ((colors (cj/pdf--reading-palette-colors "dark")))
+ (should (consp colors))
+ (should (stringp (car colors)))
+ (should (stringp (cdr colors)))))
+
+(ert-deftest test-pdf-reading-palette-colors-unknown ()
+ "Error: an unknown palette name resolves to nil."
+ (should-not (cj/pdf--reading-palette-colors "nope")))
+
+(ert-deftest test-pdf-reading-palette-colors-nil ()
+ "Boundary: a nil name (the no-palette state) resolves to nil."
+ (should-not (cj/pdf--reading-palette-colors nil)))
+
+;;; --------------------------- shipped default + order ------------------------
+
+(ert-deftest test-pdf-reading-default-is-dark ()
+ "Normal: a fresh PDF opens on the dark palette."
+ (should (equal cj/pdf-reading-default-palette "dark")))
+
+(ert-deftest test-pdf-reading-order-is-dark-sepia-light ()
+ "Normal: the shipped palette order is dark, then sepia, then light."
+ (should (equal (mapcar #'car cj/pdf-reading-palettes)
+ '("dark" "sepia" "light"))))
+
+;;; ------------------------- cj/pdf--next-reading-palette ---------------------
+
+(ert-deftest test-pdf-reading-next-palette-advances ()
+ "Normal: cycles to the next palette in order."
+ (should (equal (cj/pdf--next-reading-palette "dark" '("dark" "sepia" "light"))
+ "sepia")))
+
+(ert-deftest test-pdf-reading-next-palette-last-to-none ()
+ "Boundary: the last palette cycles to the no-palette state (nil)."
+ (should-not (cj/pdf--next-reading-palette "light" '("dark" "sepia" "light"))))
+
+(ert-deftest test-pdf-reading-next-palette-none-to-first ()
+ "Boundary: the no-palette state (nil) cycles to the first palette."
+ (should (equal (cj/pdf--next-reading-palette nil '("dark" "sepia" "light"))
+ "dark")))
+
+(ert-deftest test-pdf-reading-next-palette-unknown-current-falls-to-first ()
+ "Error: an unknown current palette falls back to the first."
+ (should (equal (cj/pdf--next-reading-palette "gone" '("dark" "sepia" "light"))
+ "dark")))
+
+(ert-deftest test-pdf-reading-cycle-from-default ()
+ "Normal: cycling from the default advances dark -> sepia -> light -> none -> dark."
+ (let ((names (mapcar #'car cj/pdf-reading-palettes)))
+ (should (equal (cj/pdf--next-reading-palette "dark" names) "sepia"))
+ (should (equal (cj/pdf--next-reading-palette "sepia" names) "light"))
+ (should-not (cj/pdf--next-reading-palette "light" names))
+ (should (equal (cj/pdf--next-reading-palette nil names) "dark"))))
+
+(provide 'test-pdf-config--reading-palette)
+;;; test-pdf-config--reading-palette.el ends here