aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-06-24 00:10:51 -0400
committerCraig Jennings <c@cjennings.net>2026-06-24 00:10:51 -0400
commitefd3cdce5b3aebfdb3e02460d1ec0434cef85949 (patch)
treeae8746cc7699b7e989d253f4c816fc7798a8e040 /tests
parent4d46eafaa087f5570ece9d2e5f5d2ba6bc0d824e (diff)
downloademacs-wttrin-efd3cdce5b3aebfdb3e02460d1ec0434cef85949.tar.gz
emacs-wttrin-efd3cdce5b3aebfdb3e02460d1ec0434cef85949.zip
feat: add 'd' key to make the displayed location the defaultHEADmain
I bound d in the weather buffer to wttrin-make-default, which sets wttrin-favorite-location to the location on screen so it drives the mode-line and future sessions. The footer advertises "[d] to make default". Persistence rides savehist, not the Emacs custom-variable mechanism: wttrin--savehist-register registers wttrin-favorite-location alongside the search history, at load and on savehist-save-hook. Enable savehist-mode and the favorite survives restarts. Promoting a location drops it from the search history, the way wttrin-default-locations entries are kept out of history. The favorite shows in the picker instead: wttrin--completion-candidates prepends it when it's a string and not already a default, so it appears exactly once. The setter only assigns the variable and trims history. It doesn't register with savehist itself, because savehist-additional-variables is unbound until savehist loads, so a direct add-to-list would error for users without savehist. Registration stays on the load and save-hook path.
Diffstat (limited to 'tests')
-rw-r--r--tests/test-wttrin--add-buffer-instructions.el12
-rw-r--r--tests/test-wttrin-location-history.el8
-rw-r--r--tests/test-wttrin-make-default.el130
3 files changed, 141 insertions, 9 deletions
diff --git a/tests/test-wttrin--add-buffer-instructions.el b/tests/test-wttrin--add-buffer-instructions.el
index 0f1c382..425832d 100644
--- a/tests/test-wttrin--add-buffer-instructions.el
+++ b/tests/test-wttrin--add-buffer-instructions.el
@@ -28,7 +28,7 @@
"Test adding instructions to empty buffer."
(with-temp-buffer
(wttrin--add-buffer-instructions)
- (should (string= "\n\nPress: [a] for another location [g] to refresh [q] to quit"
+ (should (string= "\n\nPress: [a] for another location [g] to refresh [d] to make default [q] to quit"
(buffer-string)))))
(ert-deftest test-wttrin--add-buffer-instructions-normal-with-existing-content-appends-instructions ()
@@ -36,7 +36,7 @@
(with-temp-buffer
(insert "Weather: Sunny\nTemperature: 20°C")
(wttrin--add-buffer-instructions)
- (should (string= "Weather: Sunny\nTemperature: 20°C\n\nPress: [a] for another location [g] to refresh [q] to quit"
+ (should (string= "Weather: Sunny\nTemperature: 20°C\n\nPress: [a] for another location [g] to refresh [d] to make default [q] to quit"
(buffer-string)))))
(ert-deftest test-wttrin--add-buffer-instructions-normal-preserves-point-moves-to-end ()
@@ -99,7 +99,7 @@
(insert "Weather data here")
(goto-char (point-min))
(wttrin--add-buffer-instructions)
- (should (string-suffix-p "Press: [a] for another location [g] to refresh [q] to quit"
+ (should (string-suffix-p "Press: [a] for another location [g] to refresh [d] to make default [q] to quit"
(buffer-string)))))
(ert-deftest test-wttrin--add-buffer-instructions-boundary-point-in-middle-appends-at-end ()
@@ -109,7 +109,7 @@
(goto-char (point-min))
(forward-line 1)
(wttrin--add-buffer-instructions)
- (should (string-suffix-p "Press: [a] for another location [g] to refresh [q] to quit"
+ (should (string-suffix-p "Press: [a] for another location [g] to refresh [d] to make default [q] to quit"
(buffer-string)))))
(ert-deftest test-wttrin--add-buffer-instructions-boundary-trailing-newlines-preserves-newlines ()
@@ -117,7 +117,7 @@
(with-temp-buffer
(insert "Weather\n\n\n")
(wttrin--add-buffer-instructions)
- (should (string= "Weather\n\n\n\n\nPress: [a] for another location [g] to refresh [q] to quit"
+ (should (string= "Weather\n\n\n\n\nPress: [a] for another location [g] to refresh [d] to make default [q] to quit"
(buffer-string)))))
(ert-deftest test-wttrin--add-buffer-instructions-boundary-very-large-buffer-appends-at-end ()
@@ -126,7 +126,7 @@
(insert (make-string 10000 ?x))
(wttrin--add-buffer-instructions)
(goto-char (point-max))
- (should (looking-back "Press: \\[a\\] for another location \\[g\\] to refresh \\[q\\] to quit" nil))))
+ (should (looking-back "Press: \\[a\\] for another location \\[g\\] to refresh \\[d\\] to make default \\[q\\] to quit" nil))))
;;; Error Cases
diff --git a/tests/test-wttrin-location-history.el b/tests/test-wttrin-location-history.el
index d23bdcd..61b495c 100644
--- a/tests/test-wttrin-location-history.el
+++ b/tests/test-wttrin-location-history.el
@@ -211,11 +211,13 @@
(should (memq 'wttrin--location-history savehist-additional-variables))))
(ert-deftest test-wttrin-location-history-boundary-savehist-register-idempotent ()
- "Registering when already present does not duplicate the entry."
+ "Registering an already-present variable does not duplicate it."
(require 'savehist)
- (let ((savehist-additional-variables '(wttrin--location-history)))
+ (require 'cl-lib)
+ (let ((savehist-additional-variables '(wttrin--location-history wttrin-favorite-location)))
(wttrin--savehist-register)
- (should (equal '(wttrin--location-history) savehist-additional-variables))))
+ (should (= 1 (cl-count 'wttrin--location-history savehist-additional-variables)))
+ (should (= 1 (cl-count 'wttrin-favorite-location savehist-additional-variables)))))
(ert-deftest test-wttrin-location-history-integration-savehist-register-on-save-hook ()
"The registration runs on `savehist-save-hook' so it survives a clobber."
diff --git a/tests/test-wttrin-make-default.el b/tests/test-wttrin-make-default.el
new file mode 100644
index 0000000..c6f845b
--- /dev/null
+++ b/tests/test-wttrin-make-default.el
@@ -0,0 +1,130 @@
+;;; test-wttrin-make-default.el --- Tests for promote-to-default command -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2026 Craig Jennings
+
+;;; Commentary:
+
+;; Unit tests for wttrin--set-favorite-location and wttrin-make-default,
+;; the weather-buffer command (bound to "d") that promotes the displayed
+;; location to the persisted favorite.
+
+;;; Code:
+
+(require 'ert)
+(require 'cl-lib)
+(require 'wttrin)
+
+;;; --------------------------------------------------------------------------
+;;; wttrin--set-favorite-location
+;;; --------------------------------------------------------------------------
+
+;;; Normal Cases
+
+(ert-deftest test-wttrin--set-favorite-location-normal-sets-variable ()
+ "Normal: sets `wttrin-favorite-location' to the given location."
+ (let ((wttrin-favorite-location nil)
+ (savehist-additional-variables nil))
+ (wttrin--set-favorite-location "Paris, FR")
+ (should (equal wttrin-favorite-location "Paris, FR"))))
+
+(ert-deftest test-wttrin--set-favorite-location-error-no-savehist-loaded ()
+ "Error: setting the favorite works even when savehist is not loaded.
+The setter must not touch `savehist-additional-variables' directly (it may be
+unbound); persistence is left to `wttrin--savehist-register'."
+ (let ((wttrin-favorite-location nil))
+ ;; Simulate savehist absent: the variable is unbound.
+ (cl-letf (((symbol-function 'wttrin--savehist-register)
+ (lambda () (error "Should not be called from the setter"))))
+ (wttrin--set-favorite-location "Oslo, NO")
+ (should (equal wttrin-favorite-location "Oslo, NO")))))
+
+(ert-deftest test-wttrin--set-favorite-location-normal-drops-from-history ()
+ "Normal: promoting a location removes it from the search history."
+ (let ((wttrin-favorite-location nil)
+ (wttrin--location-history '("Reykjavik" "Oslo, NO")))
+ (wttrin--set-favorite-location "Reykjavik")
+ (should-not (member "Reykjavik" wttrin--location-history))
+ (should (equal wttrin--location-history '("Oslo, NO")))))
+
+(ert-deftest test-wttrin--set-favorite-location-boundary-not-in-history-is-noop ()
+ "Boundary: promoting a location absent from history leaves history intact."
+ (let ((wttrin-favorite-location nil)
+ (wttrin--location-history '("Oslo, NO")))
+ (wttrin--set-favorite-location "Berkeley, CA")
+ (should (equal wttrin--location-history '("Oslo, NO")))))
+
+(ert-deftest test-wttrin-favorite-savehist-register-includes-favorite ()
+ "Normal: `wttrin--savehist-register' registers the favorite for persistence."
+ (require 'savehist)
+ (let ((savehist-additional-variables '(kill-ring)))
+ (wttrin--savehist-register)
+ (should (memq 'wttrin-favorite-location savehist-additional-variables))))
+
+;;; --------------------------------------------------------------------------
+;;; wttrin-make-default
+;;; --------------------------------------------------------------------------
+
+;;; Normal Cases
+
+(ert-deftest test-wttrin-make-default-normal-sets-favorite-from-current ()
+ "Normal: promotes the buffer's current location to the favorite."
+ (let ((wttrin-favorite-location nil)
+ (savehist-additional-variables nil))
+ (with-temp-buffer
+ (setq-local wttrin--current-location "Tokyo, JP")
+ (wttrin-make-default)
+ (should (equal wttrin-favorite-location "Tokyo, JP")))))
+
+;;; Boundary Cases
+
+(ert-deftest test-wttrin-make-default-boundary-nil-current-leaves-favorite ()
+ "Boundary: no current location is a no-op that leaves the favorite intact."
+ (let ((wttrin-favorite-location "Berkeley, CA")
+ (savehist-additional-variables nil))
+ (with-temp-buffer
+ (setq-local wttrin--current-location nil)
+ (wttrin-make-default)
+ (should (equal wttrin-favorite-location "Berkeley, CA")))))
+
+;;; --------------------------------------------------------------------------
+;;; favorite in completion candidates
+;;; --------------------------------------------------------------------------
+
+;;; Normal Cases
+
+(ert-deftest test-wttrin-make-default-normal-favorite-prepended-to-candidates ()
+ "Normal: a typed-in favorite is offered in the picker, at the front."
+ (let ((wttrin-default-locations '("Honolulu, HI" "Berkeley, CA"))
+ (wttrin--location-history nil)
+ (wttrin-favorite-location "Reykjavik"))
+ (should (equal (wttrin--completion-candidates)
+ '("Reykjavik" "Honolulu, HI" "Berkeley, CA")))))
+
+;;; Boundary Cases
+
+(ert-deftest test-wttrin-make-default-boundary-favorite-default-not-duplicated ()
+ "Boundary: a favorite that is already a default appears exactly once."
+ (require 'cl-lib)
+ (let ((wttrin-default-locations '("Honolulu, HI" "Berkeley, CA"))
+ (wttrin--location-history nil)
+ (wttrin-favorite-location "Berkeley, CA"))
+ (should (= 1 (cl-count "Berkeley, CA" (wttrin--completion-candidates) :test #'equal)))))
+
+(ert-deftest test-wttrin-make-default-boundary-nil-favorite-candidates-unchanged ()
+ "Boundary: nil favorite leaves the candidate list as defaults plus history."
+ (let ((wttrin-default-locations '("Honolulu, HI"))
+ (wttrin--location-history '("Oslo, NO"))
+ (wttrin-favorite-location nil))
+ (should (equal (wttrin--completion-candidates)
+ '("Honolulu, HI" "Oslo, NO")))))
+
+;;; --------------------------------------------------------------------------
+;;; keymap binding
+;;; --------------------------------------------------------------------------
+
+(ert-deftest test-wttrin-make-default-normal-d-bound-in-mode-map ()
+ "Normal: the weather-buffer keymap binds \"d\" to the command."
+ (should (eq (lookup-key wttrin-mode-map (kbd "d")) 'wttrin-make-default)))
+
+(provide 'test-wttrin-make-default)
+;;; test-wttrin-make-default.el ends here