aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-05-28 00:55:30 -0500
committerCraig Jennings <c@cjennings.net>2026-05-28 00:55:30 -0500
commitb75e6ecc1eb0bc16ffd7f8ca6c8a42229419c8d6 (patch)
tree299d9102e1d9ea4154bb0056d1cb8fd9c9574789 /tests
parent1288c2af084fb9ce09bd8807a30291821b39f7b3 (diff)
downloadpearl-b75e6ecc1eb0bc16ffd7f8ca6c8a42229419c8d6.tar.gz
pearl-b75e6ecc1eb0bc16ffd7f8ca6c8a42229419c8d6.zip
fix(filter): pin builder candidate order so [ None. ] stays at the top
Wrapping each builder prompt with `pearl--with-none` put the sentinel first in the candidate list, but the completion framework's default sort (vertico-sort-history-length-alpha, prescient, ivy's sorter, etc.) re-sorted alphabetically and any real candidate starting with a letter before "[" pushed the sentinel down. Linear's "Software Engineering" outsorted "[ None. ]", so the new pattern failed at the very first prompt. The standard Emacs hook for "I sorted these on purpose" is a completion table that returns `(metadata (display-sort-function . identity))` for the `metadata` action. The new `pearl--completion-table-keep-order` helper does exactly that, and the five builder prompts (team, state, project, labels, assignee) now wrap their candidate lists through it. The framework keeps its default sort everywhere else. Only these five prompts opt out, in the place where author-order is meaningful.
Diffstat (limited to 'tests')
-rw-r--r--tests/test-pearl-adhoc.el16
1 files changed, 16 insertions, 0 deletions
diff --git a/tests/test-pearl-adhoc.el b/tests/test-pearl-adhoc.el
index d8c7231..2bcc575 100644
--- a/tests/test-pearl-adhoc.el
+++ b/tests/test-pearl-adhoc.el
@@ -57,6 +57,22 @@ completing-read candidate list."
(let ((wrapped (pearl--with-none '())))
(should (equal (list pearl--filter-none) wrapped))))
+(ert-deftest test-pearl-completion-table-keep-order-metadata-pins-identity ()
+ "Action `metadata' returns an alist with `display-sort-function' bound to
+`identity', the standard Emacs hook saying \"these are pre-sorted; don't re-sort.\""
+ (let* ((tbl (pearl--completion-table-keep-order '("a" "b" "c")))
+ (meta (funcall tbl "" nil 'metadata)))
+ (should (eq 'metadata (car meta)))
+ (should (eq #'identity (alist-get 'display-sort-function (cdr meta))))
+ (should (eq #'identity (alist-get 'cycle-sort-function (cdr meta))))))
+
+(ert-deftest test-pearl-completion-table-keep-order-delegates-all-completions ()
+ "Non-metadata actions delegate to `complete-with-action' over the original
+candidate list, so completion still works the way the framework expects."
+ (let ((tbl (pearl--completion-table-keep-order '("alpha" "beta" "gamma"))))
+ (should (equal '("alpha") (all-completions "a" tbl)))
+ (should (equal '("beta") (all-completions "b" tbl)))))
+
;;; --assemble-filter
(ert-deftest test-pearl-assemble-filter-only-set-keys ()