diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/test-ai-term--next-single-agent.el | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/tests/test-ai-term--next-single-agent.el b/tests/test-ai-term--next-single-agent.el new file mode 100644 index 00000000..f31807d0 --- /dev/null +++ b/tests/test-ai-term--next-single-agent.el @@ -0,0 +1,125 @@ +;;; test-ai-term--next-single-agent.el --- cj/ai-term-next sole-agent message -*- lexical-binding: t; -*- + +;;; Commentary: +;; When M-SPC fires with a single ai-term open and that agent's window +;; selected, `cj/ai-term-next' has nowhere to go: the rotation wraps back +;; to the same agent. Instead of a misleading "Agent: <name>" swap +;; message, it should say there are no other ai-terms to switch to. +;; A sole agent that is displayed but NOT selected still gets selected +;; (the swap key doubles as "take me to the agent"), and a sole agent +;; with no window still gets shown. + +;;; Code: + +(require 'ert) +(require 'cl-lib) + +(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory)) +(require 'ai-term) + +(defun test-ai-term-next-single--buffer-name (dir) + "Deterministic fake agent buffer name for DIR." + (concat "agent-buf-" dir)) + +(ert-deftest test-ai-term-next-single-agent-focused-messages-no-others () + "Normal: sole agent focused -> echo 'no other ai-terms', no swap." + (let ((buf (get-buffer-create "agent-buf-a")) + (captured nil) + (shown 0)) + (unwind-protect + (progn + (set-window-buffer (selected-window) buf) + (cl-letf (((symbol-function 'cj/--ai-term-active-agent-dirs) + (lambda (&rest _) '("a"))) + ((symbol-function 'cj/--ai-term-displayed-agent-window) + (lambda (&rest _) (selected-window))) + ((symbol-function 'cj/--ai-term-buffer-name) + #'test-ai-term-next-single--buffer-name) + ((symbol-function 'cj/--ai-term-process-live-p) + (lambda (&rest _) t)) + ((symbol-function 'cj/--ai-term-show-or-create) + (lambda (&rest _) (setq shown (1+ shown)))) + ((symbol-function 'message) + (lambda (fmt &rest args) + (when fmt (setq captured (apply #'format fmt args)))))) + (cj/ai-term-next) + (should (equal captured "No other ai-terms to switch to")) + (should (= shown 0)) + (should (eq (window-buffer (selected-window)) buf)))) + (kill-buffer buf)))) + +(ert-deftest test-ai-term-next-single-agent-undisplayed-shows-it () + "Normal: sole agent with no window -> shown, not the no-others message." + (let ((captured nil) + (shown 0)) + (cl-letf (((symbol-function 'cj/--ai-term-active-agent-dirs) + (lambda (&rest _) '("a"))) + ((symbol-function 'cj/--ai-term-displayed-agent-window) + (lambda (&rest _) nil)) + ((symbol-function 'cj/--ai-term-buffer-name) + #'test-ai-term-next-single--buffer-name) + ((symbol-function 'cj/--ai-term-process-live-p) + (lambda (&rest _) t)) + ((symbol-function 'cj/--ai-term-show-or-create) + (lambda (&rest _) (setq shown (1+ shown)))) + ((symbol-function 'message) + (lambda (fmt &rest args) + (when fmt (setq captured (apply #'format fmt args)))))) + (cj/ai-term-next) + (should (= shown 1)) + (should-not (equal captured "No other ai-terms to switch to"))))) + +(ert-deftest test-ai-term-next-single-agent-unselected-window-gets-selected () + "Boundary: sole agent displayed in another window -> selected, no message change." + (skip-unless (not noninteractive)) ; window splitting is unreliable in batch + (let ((buf (get-buffer-create "agent-buf-a")) + (captured nil)) + (unwind-protect + (let* ((w1 (selected-window)) + (w2 (split-window))) + (set-window-buffer w2 buf) + (cl-letf (((symbol-function 'cj/--ai-term-active-agent-dirs) + (lambda (&rest _) '("a"))) + ((symbol-function 'cj/--ai-term-displayed-agent-window) + (lambda (&rest _) w2)) + ((symbol-function 'cj/--ai-term-buffer-name) + #'test-ai-term-next-single--buffer-name) + ((symbol-function 'cj/--ai-term-process-live-p) + (lambda (&rest _) t)) + ((symbol-function 'message) + (lambda (fmt &rest args) + (when fmt (setq captured (apply #'format fmt args)))))) + (select-window w1) + (cj/ai-term-next) + (should (eq (selected-window) w2)) + (should-not (equal captured "No other ai-terms to switch to")))) + (delete-other-windows) + (kill-buffer buf)))) + +(ert-deftest test-ai-term-next-two-agents-still-swaps () + "Normal: two agents, one focused -> swaps to the other, no no-others message." + (let ((buf-a (get-buffer-create "agent-buf-a")) + (buf-b (get-buffer-create "agent-buf-b")) + (captured nil)) + (unwind-protect + (progn + (set-window-buffer (selected-window) buf-a) + (cl-letf (((symbol-function 'cj/--ai-term-active-agent-dirs) + (lambda (&rest _) '("a" "b"))) + ((symbol-function 'cj/--ai-term-displayed-agent-window) + (lambda (&rest _) (selected-window))) + ((symbol-function 'cj/--ai-term-buffer-name) + #'test-ai-term-next-single--buffer-name) + ((symbol-function 'cj/--ai-term-process-live-p) + (lambda (&rest _) t)) + ((symbol-function 'message) + (lambda (fmt &rest args) + (when fmt (setq captured (apply #'format fmt args)))))) + (cj/ai-term-next) + (should (eq (window-buffer (selected-window)) buf-b)) + (should (equal captured "Agent: agent-buf-b")))) + (kill-buffer buf-a) + (kill-buffer buf-b)))) + +(provide 'test-ai-term--next-single-agent) +;;; test-ai-term--next-single-agent.el ends here |
