diff options
| author | Craig Jennings <c@cjennings.net> | 2026-05-09 15:22:20 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-05-09 15:22:20 -0500 |
| commit | cdda0a01decb7dc61c71d830823a2ba36207306d (patch) | |
| tree | eb15d55362d5f2c273f9cc29d8156aa35c663753 | |
| parent | 7ad613f96380319c037f367a1b6b1beda03846ca (diff) | |
| download | dotemacs-cdda0a01decb7dc61c71d830823a2ba36207306d.tar.gz dotemacs-cdda0a01decb7dc61c71d830823a2ba36207306d.zip | |
refactor(tests): extract shared buffer-cleanup and fake-vterm helpers
Eight test files across the ai-vterm and vterm-toggle suites each shipped a small variant of the same cleanup loop: walk `buffer-list`, kill any buffer whose name starts with a given prefix. Each file also re-implemented the `(string-prefix-p ...)` check inline. One file additionally had its own fake-vterm-mode-buffer constructor for tests that needed `cj/--vterm-toggle-buffer-p` to fire.
I pulled the shared logic into `tests/testutil-vterm-buffers.el`:
- `cj/test--kill-buffers-matching-prefix` is the primitive.
- `cj/test--kill-claude-buffers` and `cj/test--kill-test-vterm-buffers` are thin wrappers for the two prefixes that actually appear.
- `cj/test--make-fake-vterm-buffer` constructs a buffer with `major-mode` set to `vterm-mode` without launching a real vterm process.
Each affected test file now `(require 'testutil-vterm-buffers)` and calls the shared helpers directly. `test-vterm-toggle--buffer-filter.el` keeps a 3-line wrapper that calls both kill helpers in sequence (the only place that needs both prefixes). Net diff: -116 / +72 across 8 test files, plus ~30 lines in the new testutil. Roughly -45 lines after the abstraction is paid for.
No behavior change. 80 ai-vterm tests, 15 vterm-toggle tests, 15 cj-window-geometry tests all pass. Full make test green.
| -rw-r--r-- | tests/test-ai-vterm--claude-buffers.el | 18 | ||||
| -rw-r--r-- | tests/test-ai-vterm--dispatch.el | 14 | ||||
| -rw-r--r-- | tests/test-ai-vterm--display-saved.el | 36 | ||||
| -rw-r--r-- | tests/test-ai-vterm--displayed-claude-window.el | 16 | ||||
| -rw-r--r-- | tests/test-ai-vterm--pick-buffer-candidates.el | 18 | ||||
| -rw-r--r-- | tests/test-ai-vterm--reuse-existing-claude.el | 16 | ||||
| -rw-r--r-- | tests/test-vterm-toggle--buffer-filter.el | 33 | ||||
| -rw-r--r-- | tests/test-vterm-toggle--dispatch.el | 13 | ||||
| -rw-r--r-- | tests/testutil-vterm-buffers.el | 38 |
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 |
