diff options
| author | Craig Jennings <c@cjennings.net> | 2026-09-13 09:46:11 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-09-13 09:46:11 -0500 |
| commit | f9449f6c8d4f5d174bea4a878632384f2b760c5f (patch) | |
| tree | e5bf341b6d39f9535d708900e948a925cc5915a8 | |
| parent | cb7019387d8b5bd7ebd385272126accfd37e4b1b (diff) | |
| download | emacs-wttrin-f9449f6c8d4f5d174bea4a878632384f2b760c5f.tar.gz emacs-wttrin-f9449f6c8d4f5d174bea4a878632384f2b760c5f.zip | |
fix: match the F display flag case-sensitively
wttrin--effective-display-options checked for an existing F with string-match-p, which honors case-fold-search. That defaults to t, so a lowercase f in wttrin-display-options read as F and the flag was never added. wttr.in flags are case-sensitive (q and Q differ), so I bound case-fold-search to nil inside the helper.
The tests cover a lowercase f under both case-fold settings. They also pin that a non-string options value signals wrong-type-argument rather than building a bad URL.
| -rw-r--r-- | tests/test-wttrin-hide-follow-line.el | 25 | ||||
| -rw-r--r-- | wttrin.el | 7 |
2 files changed, 30 insertions, 2 deletions
diff --git a/tests/test-wttrin-hide-follow-line.el b/tests/test-wttrin-hide-follow-line.el index fcfb906..742a872 100644 --- a/tests/test-wttrin-hide-follow-line.el +++ b/tests/test-wttrin-hide-follow-line.el @@ -51,6 +51,31 @@ (wttrin-hide-follow-line nil)) (should (equal (wttrin--effective-display-options) "")))) +;; wttr.in flags are case-sensitive (q and Q differ), and string-match-p +;; honours `case-fold-search', which defaults to t. A lowercase f must not +;; read as the F flag, whatever the caller's case-fold setting is. +(ert-deftest test-wttrin--effective-display-options-boundary-lowercase-f-is-not-f () + "Boundary: a lowercase f in the options does not count as the F flag." + (let ((wttrin-display-options "0f") + (wttrin-hide-follow-line t) + (case-fold-search t)) + (should (equal (wttrin--effective-display-options) "0fF")))) + +(ert-deftest test-wttrin--effective-display-options-boundary-case-fold-nil-same-result () + "Boundary: the result does not depend on the caller's `case-fold-search'." + (let ((wttrin-display-options "0f") + (wttrin-hide-follow-line t) + (case-fold-search nil)) + (should (equal (wttrin--effective-display-options) "0fF")))) + +;;; Error Cases + +(ert-deftest test-wttrin--effective-display-options-error-non-string-options () + "Error: a non-string options value signals rather than building a bad URL." + (let ((wttrin-display-options 'bogus) + (wttrin-hide-follow-line t)) + (should-error (wttrin--effective-display-options) :type 'wrong-type-argument))) + ;;; -------------------------------------------------------------------------- ;;; wttrin--build-url integration ;;; -------------------------------------------------------------------------- @@ -532,8 +532,11 @@ ERROR-MSG has no class." "Return the wttr.in display flags for the weather-buffer request. Starts from `wttrin-display-options' and appends the F flag (\"do not show the Follow line\") when `wttrin-hide-follow-line' is non-nil and F is not -already present, so the two controls compose without duplicating the flag." - (let ((opts (or wttrin-display-options ""))) +already present, so the two controls compose without duplicating the flag. +The match is case-sensitive, because wttr.in treats q and Q as +different flags." + (let ((opts (or wttrin-display-options "")) + (case-fold-search nil)) (if (and wttrin-hide-follow-line (not (string-match-p "F" opts))) (concat opts "F") opts))) |
