summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/test-ai-vterm--claude-buffers.el18
-rw-r--r--tests/test-ai-vterm--dispatch.el14
-rw-r--r--tests/test-ai-vterm--display-saved.el36
-rw-r--r--tests/test-ai-vterm--displayed-claude-window.el16
-rw-r--r--tests/test-ai-vterm--pick-buffer-candidates.el18
-rw-r--r--tests/test-ai-vterm--reuse-existing-claude.el16
-rw-r--r--tests/test-vterm-toggle--buffer-filter.el33
-rw-r--r--tests/test-vterm-toggle--dispatch.el13
-rw-r--r--tests/testutil-vterm-buffers.el38
9 files changed, 101 insertions, 101 deletions
diff --git a/tests/test-ai-vterm--claude-buffers.el b/tests/test-ai-vterm--claude-buffers.el
index 56668ca1..f975b64e 100644
--- a/tests/test-ai-vterm--claude-buffers.el
+++ b/tests/test-ai-vterm--claude-buffers.el
@@ -12,24 +12,20 @@
(require 'ert)
(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory))
+(add-to-list 'load-path (expand-file-name "tests" user-emacs-directory))
(require 'ai-vterm)
-
-(defun test-ai-vterm--claude-buffers-cleanup ()
- "Kill any leftover claude-prefixed buffers before/after a test."
- (dolist (b (buffer-list))
- (when (string-prefix-p "claude [" (buffer-name b))
- (kill-buffer b))))
+(require 'testutil-vterm-buffers)
(ert-deftest test-ai-vterm--claude-buffers-empty-when-none-exist ()
"Boundary: no claude-prefixed buffers anywhere -> empty list."
- (test-ai-vterm--claude-buffers-cleanup)
+ (cj/test--kill-claude-buffers)
(unwind-protect
(should (null (cj/--ai-vterm-claude-buffers)))
- (test-ai-vterm--claude-buffers-cleanup)))
+ (cj/test--kill-claude-buffers)))
(ert-deftest test-ai-vterm--claude-buffers-returns-only-claude-buffers ()
"Normal: filters to only claude-prefixed buffers, leaves others alone."
- (test-ai-vterm--claude-buffers-cleanup)
+ (cj/test--kill-claude-buffers)
(let ((c1 (get-buffer-create "claude [a]"))
(c2 (get-buffer-create "claude [b]"))
(other (get-buffer-create "regular-buffer")))
@@ -45,7 +41,7 @@
(ert-deftest test-ai-vterm--claude-buffers-anchors-prefix-not-substring ()
"Boundary: 'foo claude [bar]' is not a claude buffer -- prefix anchored."
- (test-ai-vterm--claude-buffers-cleanup)
+ (cj/test--kill-claude-buffers)
(let ((not-claude (get-buffer-create "foo claude [bar]")))
(unwind-protect
(should-not (memq not-claude (cj/--ai-vterm-claude-buffers)))
@@ -53,7 +49,7 @@
(ert-deftest test-ai-vterm--claude-buffers-bare-claude-not-included ()
"Boundary: 'claude' alone (no bracket) doesn't match the 'claude [' prefix."
- (test-ai-vterm--claude-buffers-cleanup)
+ (cj/test--kill-claude-buffers)
(let ((bare (get-buffer-create "claude")))
(unwind-protect
(should-not (memq bare (cj/--ai-vterm-claude-buffers)))
diff --git a/tests/test-ai-vterm--dispatch.el b/tests/test-ai-vterm--dispatch.el
index 030b200d..8871af9a 100644
--- a/tests/test-ai-vterm--dispatch.el
+++ b/tests/test-ai-vterm--dispatch.el
@@ -14,13 +14,9 @@
(require 'cl-lib)
(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory))
+(add-to-list 'load-path (expand-file-name "tests" user-emacs-directory))
(require 'ai-vterm)
-
-(defun test-ai-vterm--dispatch-cleanup ()
- "Kill any leftover claude-prefixed buffers."
- (dolist (b (buffer-list))
- (when (string-prefix-p "claude [" (buffer-name b))
- (kill-buffer b))))
+(require 'testutil-vterm-buffers)
(ert-deftest test-ai-vterm--dispatch-window-displayed-returns-toggle-off ()
"Normal: displayed claude window -> (toggle-off . WIN)."
@@ -32,7 +28,7 @@
(ert-deftest test-ai-vterm--dispatch-no-window-single-buffer-returns-redisplay-recent ()
"Normal: no displayed claude, one alive buffer -> redisplay-recent + buffer."
- (test-ai-vterm--dispatch-cleanup)
+ (cj/test--kill-claude-buffers)
(let ((b1 (get-buffer-create "claude [single]")))
(unwind-protect
(cl-letf (((symbol-function 'cj/--ai-vterm-displayed-claude-window)
@@ -48,7 +44,7 @@
F9 redisplays the most-recently-selected claude (head of buffer-list
order) rather than opening the project picker, so the user toggles
THE claude they were last using. Other claudes are reachable via M-F9."
- (test-ai-vterm--dispatch-cleanup)
+ (cj/test--kill-claude-buffers)
(let ((b1 (get-buffer-create "claude [a]"))
(b2 (get-buffer-create "claude [b]")))
(unwind-protect
@@ -63,7 +59,7 @@ THE claude they were last using. Other claudes are reachable via M-F9."
(ert-deftest test-ai-vterm--dispatch-no-window-zero-buffers-returns-pick-project ()
"Boundary: no displayed claude, zero alive buffers -> pick-project."
- (test-ai-vterm--dispatch-cleanup)
+ (cj/test--kill-claude-buffers)
(cl-letf (((symbol-function 'cj/--ai-vterm-displayed-claude-window)
(lambda (&optional _frame) nil))
((symbol-function 'cj/--ai-vterm-claude-buffers)
diff --git a/tests/test-ai-vterm--display-saved.el b/tests/test-ai-vterm--display-saved.el
index aa0dc5ee..2b2bad09 100644
--- a/tests/test-ai-vterm--display-saved.el
+++ b/tests/test-ai-vterm--display-saved.el
@@ -16,7 +16,9 @@
(require 'cl-lib)
(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory))
+(add-to-list 'load-path (expand-file-name "tests" user-emacs-directory))
(require 'ai-vterm)
+(require 'testutil-vterm-buffers)
(ert-deftest test-ai-vterm--display-saved-uses-defaults-when-state-nil ()
"Normal: nil state -> direction=rightmost, size=cj/ai-vterm-window-width.
@@ -94,12 +96,6 @@ which window is selected."
(cj/--ai-vterm-display-saved 'sentinel-buffer nil))
(should (eq received-buf 'sentinel-buffer))))
-(defun test-ai-vterm--display-saved-cleanup ()
- "Kill any leftover claude-prefixed buffers."
- (dolist (b (buffer-list))
- (when (string-prefix-p "claude [" (buffer-name b))
- (kill-buffer b))))
-
(ert-deftest test-ai-vterm--display-saved-3window-roundtrip-preserves-body-width ()
"Regression: capture+delete+display in a 3-window layout preserves body-width.
@@ -109,7 +105,7 @@ the new claude lands at a different position than the captured one
of the right divider. `window-body-width' is divider-independent
and is what the user actually sees, so the assertion locks down
the body match."
- (test-ai-vterm--display-saved-cleanup)
+ (cj/test--kill-claude-buffers)
(let ((claude-name "claude [3win-roundtrip]")
(left-name "*test-3win-left*")
(right-name "*test-3win-right*"))
@@ -144,11 +140,11 @@ the body match."
(should (eq captured-direction 'right)))))))
(when (get-buffer left-name) (kill-buffer left-name))
(when (get-buffer right-name) (kill-buffer right-name))
- (test-ai-vterm--display-saved-cleanup))))
+ (cj/test--kill-claude-buffers))))
(ert-deftest test-ai-vterm--display-saved-3window-claude-rightmost-roundtrip ()
"Round-trip when claude is the rightmost window (no right divider)."
- (test-ai-vterm--display-saved-cleanup)
+ (cj/test--kill-claude-buffers)
(let ((claude-name "claude [rightmost]")
(left-name "*test-rm-left*")
(mid-name "*test-rm-mid*"))
@@ -173,11 +169,11 @@ the body match."
(should (= (window-body-width new-win) captured-size)))))))
(when (get-buffer left-name) (kill-buffer left-name))
(when (get-buffer mid-name) (kill-buffer mid-name))
- (test-ai-vterm--display-saved-cleanup))))
+ (cj/test--kill-claude-buffers))))
(ert-deftest test-ai-vterm--display-saved-3window-after-mouse-resize ()
"Round-trip after a deliberate mid-window resize (mimics mouse-drag)."
- (test-ai-vterm--display-saved-cleanup)
+ (cj/test--kill-claude-buffers)
(let ((claude-name "claude [mouse-resize]")
(left-name "*test-mr-left*")
(right-name "*test-mr-right*"))
@@ -206,11 +202,11 @@ the body match."
(should (= (window-body-width new-win) captured-size)))))))
(when (get-buffer left-name) (kill-buffer left-name))
(when (get-buffer right-name) (kill-buffer right-name))
- (test-ai-vterm--display-saved-cleanup))))
+ (cj/test--kill-claude-buffers))))
(ert-deftest test-ai-vterm--display-saved-roundtrip-via-cj/ai-vterm-toggle ()
"End-to-end: toggle-off via dispatch then redisplay -- preserves size."
- (test-ai-vterm--display-saved-cleanup)
+ (cj/test--kill-claude-buffers)
(let ((claude-name "claude [toggle-roundtrip]")
(left-name "*test-tr-left*")
(right-name "*test-tr-right*"))
@@ -240,11 +236,11 @@ the body match."
(should (= new-size before-size))))))))
(when (get-buffer left-name) (kill-buffer left-name))
(when (get-buffer right-name) (kill-buffer right-name))
- (test-ai-vterm--display-saved-cleanup))))
+ (cj/test--kill-claude-buffers))))
(ert-deftest test-ai-vterm--display-saved-two-toggle-cycles-stable ()
"Two consecutive toggle-off+toggle-on cycles -- no compounding error."
- (test-ai-vterm--display-saved-cleanup)
+ (cj/test--kill-claude-buffers)
(let ((claude-name "claude [two-cycle]")
(left-name "*test-2c-left*")
(right-name "*test-2c-right*"))
@@ -277,13 +273,13 @@ the body match."
(should (= cycle2-size initial-size))))))))
(when (get-buffer left-name) (kill-buffer left-name))
(when (get-buffer right-name) (kill-buffer right-name))
- (test-ai-vterm--display-saved-cleanup))))
+ (cj/test--kill-claude-buffers))))
(ert-deftest test-ai-vterm--display-saved-craig-c-x-3-roundtrip ()
"Reproduces Craig's repro from 2026-05-09:
launch -> F9 -> dashboard splits via C-x 3 -> toggle off -> toggle on.
Expected: new claude lands at the same total-width it had before."
- (test-ai-vterm--display-saved-cleanup)
+ (cj/test--kill-claude-buffers)
(let ((claude-name "claude [c-x-3-repro]")
(dash-name "*test-cx3-dashboard*"))
(unwind-protect
@@ -314,7 +310,7 @@ Expected: new claude lands at the same total-width it had before."
(should (windowp claude-win-3))
(should (= size-after size-before)))))))
(when (get-buffer dash-name) (kill-buffer dash-name))
- (test-ai-vterm--display-saved-cleanup))))
+ (cj/test--kill-claude-buffers))))
(ert-deftest test-ai-vterm--toggle-after-buffer-move-no-extra-window ()
"Regression: toggle-off must remove claude's window even when buffer-move
@@ -331,7 +327,7 @@ landing the user at N+1 windows instead of N.
Assertion: after toggle-off+toggle-on, the window count is back to
its pre-cycle value, regardless of `quit-restore' state."
- (test-ai-vterm--display-saved-cleanup)
+ (cj/test--kill-claude-buffers)
(let ((claude-name "claude [buffer-move-toggle]")
(left-name "*test-bm-left*")
(right-name "*test-bm-right*"))
@@ -364,7 +360,7 @@ its pre-cycle value, regardless of `quit-restore' state."
(should (= (length claude-windows) 1)))))))
(when (get-buffer left-name) (kill-buffer left-name))
(when (get-buffer right-name) (kill-buffer right-name))
- (test-ai-vterm--display-saved-cleanup))))
+ (cj/test--kill-claude-buffers))))
(provide 'test-ai-vterm--display-saved)
;;; test-ai-vterm--display-saved.el ends here
diff --git a/tests/test-ai-vterm--displayed-claude-window.el b/tests/test-ai-vterm--displayed-claude-window.el
index 283a1b3c..9f84f87b 100644
--- a/tests/test-ai-vterm--displayed-claude-window.el
+++ b/tests/test-ai-vterm--displayed-claude-window.el
@@ -10,24 +10,20 @@
(require 'ert)
(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory))
+(add-to-list 'load-path (expand-file-name "tests" user-emacs-directory))
(require 'ai-vterm)
-
-(defun test-ai-vterm--displayed-cleanup ()
- "Kill any leftover claude-prefixed buffers."
- (dolist (b (buffer-list))
- (when (string-prefix-p "claude [" (buffer-name b))
- (kill-buffer b))))
+(require 'testutil-vterm-buffers)
(ert-deftest test-ai-vterm--displayed-claude-window-no-buffers-returns-nil ()
"Boundary: no claude buffers anywhere -> nil."
- (test-ai-vterm--displayed-cleanup)
+ (cj/test--kill-claude-buffers)
(save-window-excursion
(delete-other-windows)
(should-not (cj/--ai-vterm-displayed-claude-window))))
(ert-deftest test-ai-vterm--displayed-claude-window-not-displayed-returns-nil ()
"Boundary: claude buffer exists but not in any window -> nil."
- (test-ai-vterm--displayed-cleanup)
+ (cj/test--kill-claude-buffers)
(let ((b1 (get-buffer-create "claude [hidden]")))
(unwind-protect
(save-window-excursion
@@ -37,7 +33,7 @@
(ert-deftest test-ai-vterm--displayed-claude-window-returns-window-when-displayed ()
"Normal: claude buffer in a window -> returns that window."
- (test-ai-vterm--displayed-cleanup)
+ (cj/test--kill-claude-buffers)
(let ((b1 (get-buffer-create "claude [shown]")))
(unwind-protect
(save-window-excursion
@@ -51,7 +47,7 @@
(ert-deftest test-ai-vterm--displayed-claude-window-ignores-non-claude-windows ()
"Boundary: only a non-claude buffer is displayed -> nil."
- (test-ai-vterm--displayed-cleanup)
+ (cj/test--kill-claude-buffers)
(let ((other (get-buffer-create "regular-displayed-buffer")))
(unwind-protect
(save-window-excursion
diff --git a/tests/test-ai-vterm--pick-buffer-candidates.el b/tests/test-ai-vterm--pick-buffer-candidates.el
index 99ef7325..ddfd7529 100644
--- a/tests/test-ai-vterm--pick-buffer-candidates.el
+++ b/tests/test-ai-vterm--pick-buffer-candidates.el
@@ -16,23 +16,19 @@
(require 'ert)
(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory))
+(add-to-list 'load-path (expand-file-name "tests" user-emacs-directory))
(require 'ai-vterm)
-
-(defun test-ai-vterm--pbc-cleanup ()
- "Kill any leftover claude-prefixed buffers."
- (dolist (b (buffer-list))
- (when (string-prefix-p "claude [" (buffer-name b))
- (kill-buffer b))))
+(require 'testutil-vterm-buffers)
(ert-deftest test-ai-vterm--pick-buffer-candidates-empty-buffers ()
"Boundary: empty buffer list -> empty alist regardless of shown."
- (test-ai-vterm--pbc-cleanup)
+ (cj/test--kill-claude-buffers)
(should (null (cj/--ai-vterm-pick-buffer-candidates nil nil)))
(should (null (cj/--ai-vterm-pick-buffer-candidates nil 'sentinel))))
(ert-deftest test-ai-vterm--pick-buffer-candidates-shown-nil ()
"Normal: shown is nil -> straight alist in input order, no marker."
- (test-ai-vterm--pbc-cleanup)
+ (cj/test--kill-claude-buffers)
(let ((b1 (get-buffer-create "claude [a]"))
(b2 (get-buffer-create "claude [b]")))
(unwind-protect
@@ -44,7 +40,7 @@
(ert-deftest test-ai-vterm--pick-buffer-candidates-shown-promotes-non-shown ()
"Normal: shown buffer sorts last with [shown] suffix; others first."
- (test-ai-vterm--pbc-cleanup)
+ (cj/test--kill-claude-buffers)
(let ((b1 (get-buffer-create "claude [a]"))
(b2 (get-buffer-create "claude [b]"))
(b3 (get-buffer-create "claude [c]")))
@@ -61,7 +57,7 @@
(ert-deftest test-ai-vterm--pick-buffer-candidates-shown-only-buffer ()
"Boundary: shown is the only entry -> single cell with [shown] marker."
- (test-ai-vterm--pbc-cleanup)
+ (cj/test--kill-claude-buffers)
(let ((b1 (get-buffer-create "claude [a]")))
(unwind-protect
(let ((result (cj/--ai-vterm-pick-buffer-candidates (list b1) b1)))
@@ -70,7 +66,7 @@
(ert-deftest test-ai-vterm--pick-buffer-candidates-shown-not-in-buffers ()
"Boundary: stale shown buffer not in list -> all cells are non-shown."
- (test-ai-vterm--pbc-cleanup)
+ (cj/test--kill-claude-buffers)
(let ((b1 (get-buffer-create "claude [a]"))
(b-stale (get-buffer-create "claude [stale]")))
(unwind-protect
diff --git a/tests/test-ai-vterm--reuse-existing-claude.el b/tests/test-ai-vterm--reuse-existing-claude.el
index 4668188d..195e50a2 100644
--- a/tests/test-ai-vterm--reuse-existing-claude.el
+++ b/tests/test-ai-vterm--reuse-existing-claude.el
@@ -15,17 +15,13 @@
(require 'ert)
(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory))
+(add-to-list 'load-path (expand-file-name "tests" user-emacs-directory))
(require 'ai-vterm)
-
-(defun test-ai-vterm--reuse-cleanup ()
- "Kill any leftover claude-prefixed buffers."
- (dolist (b (buffer-list))
- (when (string-prefix-p "claude [" (buffer-name b))
- (kill-buffer b))))
+(require 'testutil-vterm-buffers)
(ert-deftest test-ai-vterm--reuse-existing-claude-swaps-buffer-when-window-exists ()
"Normal: a claude window exists -> swap its buffer, return the window."
- (test-ai-vterm--reuse-cleanup)
+ (cj/test--kill-claude-buffers)
(save-window-excursion
(delete-other-windows)
(let ((existing (get-buffer-create "claude [existing]"))
@@ -42,7 +38,7 @@
(ert-deftest test-ai-vterm--reuse-existing-claude-returns-nil-when-no-claude-window ()
"Boundary: no claude window in frame -> nil (chain continues to next action)."
- (test-ai-vterm--reuse-cleanup)
+ (cj/test--kill-claude-buffers)
(save-window-excursion
(delete-other-windows)
(let ((new-buf (get-buffer-create "claude [no-existing]")))
@@ -52,7 +48,7 @@
(ert-deftest test-ai-vterm--reuse-existing-claude-leaves-non-claude-windows-alone ()
"Boundary: only non-claude windows in frame -> nil; other windows untouched."
- (test-ai-vterm--reuse-cleanup)
+ (cj/test--kill-claude-buffers)
(save-window-excursion
(delete-other-windows)
(let ((code-buf (get-buffer-create "*test-code-buffer*"))
@@ -76,7 +72,7 @@
This is the C-F9-from-claude regression: with claude at the bottom
and code on top, switching projects must replace the bottom window's
buffer, not the top window's."
- (test-ai-vterm--reuse-cleanup)
+ (cj/test--kill-claude-buffers)
(save-window-excursion
(delete-other-windows)
(let* ((code-buf (get-buffer-create "*test-code-top*"))
diff --git a/tests/test-vterm-toggle--buffer-filter.el b/tests/test-vterm-toggle--buffer-filter.el
index 8deb9066..96681461 100644
--- a/tests/test-vterm-toggle--buffer-filter.el
+++ b/tests/test-vterm-toggle--buffer-filter.el
@@ -12,28 +12,19 @@
(require 'ert)
(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory))
+(add-to-list 'load-path (expand-file-name "tests" user-emacs-directory))
(require 'eshell-vterm-config)
+(require 'testutil-vterm-buffers)
(defun test-vterm-toggle--cleanup ()
- "Kill any test-prefixed vterm-style buffers left behind."
- (dolist (b (buffer-list))
- (let ((name (buffer-name b)))
- (when (or (string-prefix-p "*test-vterm" name)
- (string-prefix-p "claude [" name))
- (kill-buffer b)))))
-
-(defun test-vterm-toggle--make-vterm-buffer (name)
- "Create BUFFER with vterm-mode for testing.
-Avoids actually launching a vterm process by manually setting major-mode."
- (let ((buf (get-buffer-create name)))
- (with-current-buffer buf
- (setq-local major-mode 'vterm-mode))
- buf))
+ "Kill leftover claude- and *test-vterm- prefixed buffers."
+ (cj/test--kill-claude-buffers)
+ (cj/test--kill-test-vterm-buffers))
(ert-deftest test-vterm-toggle--buffer-p-accepts-vterm-mode ()
"Normal: a vterm-mode buffer with non-claude name qualifies."
(test-vterm-toggle--cleanup)
- (let ((buf (test-vterm-toggle--make-vterm-buffer "*test-vterm-1*")))
+ (let ((buf (cj/test--make-fake-vterm-buffer "*test-vterm-1*")))
(unwind-protect
(should (cj/--vterm-toggle-buffer-p buf))
(kill-buffer buf))))
@@ -41,7 +32,7 @@ Avoids actually launching a vterm process by manually setting major-mode."
(ert-deftest test-vterm-toggle--buffer-p-rejects-claude ()
"Boundary: claude-prefixed vterm buffers are excluded from F12's set."
(test-vterm-toggle--cleanup)
- (let ((buf (test-vterm-toggle--make-vterm-buffer "claude [project-a]")))
+ (let ((buf (cj/test--make-fake-vterm-buffer "claude [project-a]")))
(unwind-protect
(should-not (cj/--vterm-toggle-buffer-p buf))
(kill-buffer buf))))
@@ -57,15 +48,15 @@ Avoids actually launching a vterm process by manually setting major-mode."
(ert-deftest test-vterm-toggle--buffer-p-rejects-dead-buffer ()
"Boundary: nil and dead buffers -> nil."
(should-not (cj/--vterm-toggle-buffer-p nil))
- (let ((buf (test-vterm-toggle--make-vterm-buffer "*test-vterm-dead*")))
+ (let ((buf (cj/test--make-fake-vterm-buffer "*test-vterm-dead*")))
(kill-buffer buf)
(should-not (cj/--vterm-toggle-buffer-p buf))))
(ert-deftest test-vterm-toggle--buffers-filters-claude ()
"Normal: returns vterm buffers but excludes claude-prefixed ones."
(test-vterm-toggle--cleanup)
- (let ((normal (test-vterm-toggle--make-vterm-buffer "*test-vterm-normal*"))
- (claude (test-vterm-toggle--make-vterm-buffer "claude [for-test]")))
+ (let ((normal (cj/test--make-fake-vterm-buffer "*test-vterm-normal*"))
+ (claude (cj/test--make-fake-vterm-buffer "claude [for-test]")))
(unwind-protect
(let ((result (cj/--vterm-toggle-buffers)))
(should (memq normal result))
@@ -76,7 +67,7 @@ Avoids actually launching a vterm process by manually setting major-mode."
(ert-deftest test-vterm-toggle--displayed-window-finds-vterm ()
"Normal: vterm in a window -> returns that window."
(test-vterm-toggle--cleanup)
- (let ((vt (test-vterm-toggle--make-vterm-buffer "*test-vterm-shown*")))
+ (let ((vt (cj/test--make-fake-vterm-buffer "*test-vterm-shown*")))
(unwind-protect
(save-window-excursion
(delete-other-windows)
@@ -90,7 +81,7 @@ Avoids actually launching a vterm process by manually setting major-mode."
(ert-deftest test-vterm-toggle--displayed-window-skips-claude ()
"Boundary: only a claude vterm is displayed -> nil (claude not F12-managed)."
(test-vterm-toggle--cleanup)
- (let ((claude (test-vterm-toggle--make-vterm-buffer "claude [skip-test]")))
+ (let ((claude (cj/test--make-fake-vterm-buffer "claude [skip-test]")))
(unwind-protect
(save-window-excursion
(delete-other-windows)
diff --git a/tests/test-vterm-toggle--dispatch.el b/tests/test-vterm-toggle--dispatch.el
index d63b3d35..93c06467 100644
--- a/tests/test-vterm-toggle--dispatch.el
+++ b/tests/test-vterm-toggle--dispatch.el
@@ -13,14 +13,9 @@
(require 'cl-lib)
(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory))
+(add-to-list 'load-path (expand-file-name "tests" user-emacs-directory))
(require 'eshell-vterm-config)
-
-(defun test-vterm-toggle--dispatch-cleanup ()
- "Kill any leftover test buffers."
- (dolist (b (buffer-list))
- (let ((name (buffer-name b)))
- (when (string-prefix-p "*test-vterm" name)
- (kill-buffer b)))))
+(require 'testutil-vterm-buffers)
(ert-deftest test-vterm-toggle--dispatch-window-displayed-returns-toggle-off ()
"Normal: displayed vterm window -> (toggle-off . WIN)."
@@ -32,7 +27,7 @@
(ert-deftest test-vterm-toggle--dispatch-no-window-buffer-alive-returns-show-recent ()
"Normal: no displayed vterm, at least one alive -> show-recent + first."
- (test-vterm-toggle--dispatch-cleanup)
+ (cj/test--kill-test-vterm-buffers)
(let ((b1 (get-buffer-create "*test-vterm-mru-1*"))
(b2 (get-buffer-create "*test-vterm-mru-2*")))
(unwind-protect
@@ -47,7 +42,7 @@
(ert-deftest test-vterm-toggle--dispatch-no-window-no-buffer-returns-create-new ()
"Boundary: nothing displayed, no alive vterms -> create-new."
- (test-vterm-toggle--dispatch-cleanup)
+ (cj/test--kill-test-vterm-buffers)
(cl-letf (((symbol-function 'cj/--vterm-toggle-displayed-window)
(lambda (&optional _frame) nil))
((symbol-function 'cj/--vterm-toggle-buffers)
diff --git a/tests/testutil-vterm-buffers.el b/tests/testutil-vterm-buffers.el
new file mode 100644
index 00000000..864dd8f3
--- /dev/null
+++ b/tests/testutil-vterm-buffers.el
@@ -0,0 +1,38 @@
+;;; testutil-vterm-buffers.el --- Shared helpers for vterm/claude buffer tests -*- lexical-binding: t; -*-
+
+;;; Commentary:
+;; Cleanup helpers and a fake-vterm constructor used across the
+;; ai-vterm and vterm-toggle test files. Before this module, each
+;; test file re-implemented the same `(dolist (b (buffer-list))
+;; (when (string-prefix-p ...) (kill-buffer b)))' loop with a
+;; different prefix.
+
+;;; Code:
+
+(defun cj/test--kill-buffers-matching-prefix (prefix)
+ "Kill all live buffers whose name starts with PREFIX."
+ (dolist (b (buffer-list))
+ (when (string-prefix-p prefix (buffer-name b))
+ (kill-buffer b))))
+
+(defun cj/test--kill-claude-buffers ()
+ "Kill all live buffers whose name matches the AI-vterm prefix \"claude [\"."
+ (cj/test--kill-buffers-matching-prefix "claude ["))
+
+(defun cj/test--kill-test-vterm-buffers ()
+ "Kill all live buffers whose name starts with \"*test-vterm\"."
+ (cj/test--kill-buffers-matching-prefix "*test-vterm"))
+
+(defun cj/test--make-fake-vterm-buffer (name)
+ "Return a buffer named NAME with `major-mode' set to `vterm-mode'.
+
+Avoids actually launching a vterm process by setting the mode
+buffer-locally. Used by tests that need a buffer satisfying the
+vterm-mode predicate without the side-effects of `(vterm)'."
+ (let ((buf (get-buffer-create name)))
+ (with-current-buffer buf
+ (setq-local major-mode 'vterm-mode))
+ buf))
+
+(provide 'testutil-vterm-buffers)
+;;; testutil-vterm-buffers.el ends here