aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-06-28 15:29:37 -0400
committerCraig Jennings <c@cjennings.net>2026-06-28 15:29:37 -0400
commit3c54def0bb2637da6b0700d72defa3a3f838909b (patch)
tree5bdb2fe703c79193986703f63063afe685798fd6 /tests
parent7cdd9a7490e6a3d0725adcf6fea8c678fafc4416 (diff)
downloaddotemacs-3c54def0bb2637da6b0700d72defa3a3f838909b.tar.gz
dotemacs-3c54def0bb2637da6b0700d72defa3a3f838909b.zip
fix(ai-term): keep agent buffers alive through the kill-all sweep
F1 (cj/dashboard-only) kills every other buffer, burying only those on the undead list. Agent buffers were never registered, so the sweep killed live agents and detached their sessions. Agent buffers are a dynamic family ("agent [<project>]") that an exact-name list can't pre-enumerate, so undead-buffers gains a regexp list (cj/undead-buffer-regexps) and a centralized cj/--buffer-undead-p predicate. Both kill paths route through it. ai-term registers the "agent [" pattern, so every agent -- current or future, however created -- is buried rather than killed.
Diffstat (limited to 'tests')
-rw-r--r--tests/test-undead-buffers--buffer-undead-p.el52
1 files changed, 52 insertions, 0 deletions
diff --git a/tests/test-undead-buffers--buffer-undead-p.el b/tests/test-undead-buffers--buffer-undead-p.el
new file mode 100644
index 000000000..e196e41a9
--- /dev/null
+++ b/tests/test-undead-buffers--buffer-undead-p.el
@@ -0,0 +1,52 @@
+;;; test-undead-buffers--buffer-undead-p.el --- undead predicate (name + regexp) -*- lexical-binding: t; -*-
+
+;;; Commentary:
+;; `cj/--buffer-undead-p' decides whether a buffer name is buried instead of
+;; killed. A name is undead when it is in `cj/undead-buffer-list' (exact) or
+;; matches any regexp in `cj/undead-buffer-regexps' (dynamic families like the
+;; ai-term agent buffers, named "agent [<project>]"). `cj/make-buffer-pattern-undead'
+;; registers a regexp.
+
+;;; Code:
+
+(require 'ert)
+(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory))
+(require 'undead-buffers)
+
+(ert-deftest test-undead-buffer-undead-p-name-list ()
+ "Normal: a name in the exact list is undead; others are not."
+ (let ((cj/undead-buffer-list '("*scratch*" "*Messages*"))
+ (cj/undead-buffer-regexps nil))
+ (should (cj/--buffer-undead-p "*scratch*"))
+ (should (cj/--buffer-undead-p "*Messages*"))
+ (should-not (cj/--buffer-undead-p "other"))))
+
+(ert-deftest test-undead-buffer-undead-p-regexp ()
+ "Normal: a name matching a regexp is undead; the agent pattern is anchored."
+ (let ((cj/undead-buffer-list nil)
+ (cj/undead-buffer-regexps '("\\`agent \\[")))
+ (should (cj/--buffer-undead-p "agent [rulesets]"))
+ (should (cj/--buffer-undead-p "agent [.emacs.d]"))
+ (should-not (cj/--buffer-undead-p "not an agent"))
+ (should-not (cj/--buffer-undead-p "my agent [x]")))) ; anchored: must start with "agent ["
+
+(ert-deftest test-undead-buffer-undead-p-neither ()
+ "Boundary/Error: a name in neither, an empty string, and a non-string are not undead."
+ (let ((cj/undead-buffer-list '("*scratch*"))
+ (cj/undead-buffer-regexps '("\\`agent \\[")))
+ (should-not (cj/--buffer-undead-p "random"))
+ (should-not (cj/--buffer-undead-p ""))
+ (should-not (cj/--buffer-undead-p nil))))
+
+(ert-deftest test-undead-make-buffer-pattern-undead-adds-and-rejects ()
+ "Normal/Error: registering a regexp makes matching names undead; a blank or
+non-string regexp signals."
+ (let ((cj/undead-buffer-regexps nil))
+ (cj/make-buffer-pattern-undead "\\`agent \\[")
+ (should (member "\\`agent \\[" cj/undead-buffer-regexps))
+ (should (cj/--buffer-undead-p "agent [x]"))
+ (should-error (cj/make-buffer-pattern-undead ""))
+ (should-error (cj/make-buffer-pattern-undead 42))))
+
+(provide 'test-undead-buffers--buffer-undead-p)
+;;; test-undead-buffers--buffer-undead-p.el ends here