From 9c0dbf985cdc3360b47adc24f50964f8cf04b2cc Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Sun, 24 May 2026 15:28:25 -0500 Subject: test: cover sort and render ordering boundary cases Added ERT tests for the deterministic-ordering guarantees: title sort folds nil and empty titles to the empty key (ordered first ascending); a nil (none) priority sorts last ascending and first descending; equal keys keep input order ascending and reverse it descending (Emacs sort is stable, then nreverse); and the render boundary sorts by priority after normalization even when a node omits the field. 384 tests green. --- tests/test-pearl-saved.el | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/tests/test-pearl-saved.el b/tests/test-pearl-saved.el index 63a3f8c..88bf468 100644 --- a/tests/test-pearl-saved.el +++ b/tests/test-pearl-saved.el @@ -108,5 +108,51 @@ (should (equal '("apple" "banana") (mapcar (lambda (i) (plist-get i :title)) written)))))) +;;; sort boundary cases + +(ert-deftest test-pearl-sort-issues-title-nil-and-empty () + "Title sort treats nil and empty titles as empty strings, ordered first ascending." + (let ((out (pearl--sort-issues + '((:title "banana") (:title nil) (:title "apple") (:title "")) + 'title 'asc))) + ;; both empties sort before the named titles; their relative order is the + ;; stable input order (nil came before the empty string) + (should (equal '(nil "" "apple" "banana") + (mapcar (lambda (i) (plist-get i :title)) out))))) + +(ert-deftest test-pearl-sort-issues-priority-nil-is-last-asc () + "A nil (none) priority sorts last ascending and first descending." + (let ((issues '((:title "p2" :priority 2) (:title "none" :priority nil) (:title "p1" :priority 1)))) + (should (equal '("p1" "p2" "none") + (mapcar (lambda (i) (plist-get i :title)) + (pearl--sort-issues issues 'priority 'asc)))) + (should (equal '("none" "p2" "p1") + (mapcar (lambda (i) (plist-get i :title)) + (pearl--sort-issues issues 'priority 'desc)))))) + +(ert-deftest test-pearl-sort-issues-equal-keys-deterministic () + "Equal keys keep input order ascending and reverse it descending (stable sort + nreverse)." + (let ((issues '((:title "a" :priority 2) (:title "b" :priority 2) (:title "c" :priority 2)))) + (should (equal '("a" "b" "c") + (mapcar (lambda (i) (plist-get i :title)) + (pearl--sort-issues issues 'priority 'asc)))) + (should (equal '("c" "b" "a") + (mapcar (lambda (i) (plist-get i :title)) + (pearl--sort-issues issues 'priority 'desc)))))) + +(ert-deftest test-pearl-render-query-result-sorts-with-missing-priority () + "Render sorts by priority after normalization even when a node lacks the field." + (let ((written nil) + (source '(:type filter :name "By priority" :filter nil :sort priority :order asc))) + (cl-letf (((symbol-function 'pearl--normalize-issue) #'identity) + ((symbol-function 'pearl--update-org-from-issues) + (lambda (issues &optional _s _t) (setq written issues)))) + (pearl--render-query-result + (pearl--make-query-result + 'ok :issues '((:title "hi" :priority 1) (:title "none") (:title "lo" :priority 3))) + source) + (should (equal '("hi" "lo" "none") + (mapcar (lambda (i) (plist-get i :title)) written)))))) + (provide 'test-pearl-saved) ;;; test-pearl-saved.el ends here -- cgit v1.2.3