aboutsummaryrefslogtreecommitdiff
path: root/tests/test-ai-term--sort-candidates.el
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test-ai-term--sort-candidates.el')
-rw-r--r--tests/test-ai-term--sort-candidates.el74
1 files changed, 74 insertions, 0 deletions
diff --git a/tests/test-ai-term--sort-candidates.el b/tests/test-ai-term--sort-candidates.el
new file mode 100644
index 00000000..f1f6155f
--- /dev/null
+++ b/tests/test-ai-term--sort-candidates.el
@@ -0,0 +1,74 @@
+;;; test-ai-term--sort-candidates.el --- Tests for cj/--ai-term-sort-candidates -*- lexical-binding: t; -*-
+
+;;; Commentary:
+;; The project picker lists candidates with a live tmux session first
+;; (so an agent that survived an Emacs crash is easy to get back to),
+;; then everything else. Within the active group, projects opened this
+;; session (`cj/--ai-term-mru') lead, most-recent first; the rest of the
+;; active group, and the whole no-session group, sort alphabetically by
+;; abbreviated path. With an empty MRU it's just active-first-then-alpha.
+
+;;; Code:
+
+(require 'ert)
+
+(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory))
+(require 'ai-term)
+
+(ert-deftest test-ai-term--sort-candidates-active-first-then-alpha ()
+ "Normal: the one project with a live session leads; the rest go alpha."
+ (let ((cj/ai-term-tmux-session-prefix "aiv-"))
+ (should (equal (cj/--ai-term-sort-candidates
+ '("/c/foo" "/c/bar" "/c/baz")
+ '("aiv-bar"))
+ '("/c/bar" "/c/baz" "/c/foo")))))
+
+(ert-deftest test-ai-term--sort-candidates-multiple-active-each-group-alpha ()
+ "Normal: both groups sort alphabetically internally."
+ (let ((cj/ai-term-tmux-session-prefix "aiv-"))
+ (should (equal (cj/--ai-term-sort-candidates
+ '("/c/foo" "/c/bar" "/c/baz")
+ '("aiv-foo" "aiv-bar"))
+ '("/c/bar" "/c/foo" "/c/baz")))))
+
+(ert-deftest test-ai-term--sort-candidates-no-sessions-is-plain-alpha ()
+ "Boundary: nil session set -> a plain alphabetical list."
+ (let ((cj/ai-term-tmux-session-prefix "aiv-"))
+ (should (equal (cj/--ai-term-sort-candidates
+ '("/c/foo" "/c/bar") nil)
+ '("/c/bar" "/c/foo")))))
+
+(ert-deftest test-ai-term--sort-candidates-empty-dirs-yields-nil ()
+ "Boundary: no candidates -> nil."
+ (should (null (cj/--ai-term-sort-candidates nil '("aiv-foo")))))
+
+(ert-deftest test-ai-term--sort-candidates-active-group-mru-first ()
+ "Normal: within the active group, recently-opened projects lead in MRU
+order; active dirs not opened this session fall after them alpha; the
+no-session group trails, alpha."
+ (let ((cj/ai-term-tmux-session-prefix "aiv-")
+ (cj/--ai-term-mru '("/c/baz" "/c/foo")))
+ (should (equal (cj/--ai-term-sort-candidates
+ '("/c/foo" "/c/bar" "/c/baz" "/c/qux")
+ '("aiv-foo" "aiv-bar" "aiv-baz"))
+ '("/c/baz" "/c/foo" "/c/bar" "/c/qux")))))
+
+(ert-deftest test-ai-term--sort-candidates-mru-does-not-bump-inactive ()
+ "Boundary: an MRU dir whose tmux session has died sorts alpha in the
+no-session group, not at the top."
+ (let ((cj/ai-term-tmux-session-prefix "aiv-")
+ (cj/--ai-term-mru '("/c/zed")))
+ (should (equal (cj/--ai-term-sort-candidates
+ '("/c/foo" "/c/zed" "/c/bar")
+ '("aiv-foo"))
+ '("/c/foo" "/c/bar" "/c/zed")))))
+
+(ert-deftest test-ai-term--session-active-p-matches-by-derived-name ()
+ "Normal: a dir is active when its derived session name is in the set."
+ (let ((cj/ai-term-tmux-session-prefix "aiv-"))
+ (should (cj/--ai-term-session-active-p "/c/foo" '("aiv-bar" "aiv-foo")))
+ (should-not (cj/--ai-term-session-active-p "/c/qux" '("aiv-bar" "aiv-foo")))
+ (should-not (cj/--ai-term-session-active-p "/c/foo" nil))))
+
+(provide 'test-ai-term--sort-candidates)
+;;; test-ai-term--sort-candidates.el ends here