summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/test-undead-buffers-kill-all-other-buffers-and-windows.el159
-rw-r--r--tests/test-undead-buffers-kill-buffer-and-window.el112
-rw-r--r--tests/test-undead-buffers-kill-buffer-or-bury-alive.el138
-rw-r--r--tests/test-undead-buffers-kill-other-window.el123
-rw-r--r--tests/test-undead-buffers-make-buffer-undead.el134
-rw-r--r--tests/test-undead-buffers-undead-buffer-p.el106
6 files changed, 772 insertions, 0 deletions
diff --git a/tests/test-undead-buffers-kill-all-other-buffers-and-windows.el b/tests/test-undead-buffers-kill-all-other-buffers-and-windows.el
new file mode 100644
index 00000000..dcd08e96
--- /dev/null
+++ b/tests/test-undead-buffers-kill-all-other-buffers-and-windows.el
@@ -0,0 +1,159 @@
+;;; test-undead-buffers-kill-all-other-buffers-and-windows.el --- Tests for cj/kill-all-other-buffers-and-windows -*- lexical-binding: t; -*-
+
+;;; Commentary:
+;; Tests for the cj/kill-all-other-buffers-and-windows function from undead-buffers.el
+
+;;; Code:
+
+(require 'ert)
+(require 'undead-buffers)
+(require 'testutil-general)
+
+;;; Setup and Teardown
+
+(defun test-kill-all-other-buffers-and-windows-setup ()
+ "Setup for kill-all-other-buffers-and-windows tests."
+ (cj/create-test-base-dir)
+ (delete-other-windows))
+
+(defun test-kill-all-other-buffers-and-windows-teardown ()
+ "Teardown for kill-all-other-buffers-and-windows tests."
+ (delete-other-windows)
+ (cj/delete-test-base-dir))
+
+;;; Normal Cases
+
+(ert-deftest test-kill-all-other-buffers-and-windows-should-kill-regular-buffers ()
+ "Should kill all regular buffers except current."
+ (test-kill-all-other-buffers-and-windows-setup)
+ (unwind-protect
+ (let ((main (current-buffer))
+ (buf1 (generate-new-buffer "*test-regular-1*"))
+ (buf2 (generate-new-buffer "*test-regular-2*")))
+ (unwind-protect
+ (progn
+ (should (buffer-live-p buf1))
+ (should (buffer-live-p buf2))
+ (cj/kill-all-other-buffers-and-windows)
+ (should (buffer-live-p main))
+ (should-not (buffer-live-p buf1))
+ (should-not (buffer-live-p buf2)))
+ (when (buffer-live-p buf1) (kill-buffer buf1))
+ (when (buffer-live-p buf2) (kill-buffer buf2))))
+ (test-kill-all-other-buffers-and-windows-teardown)))
+
+(ert-deftest test-kill-all-other-buffers-and-windows-should-bury-undead-buffers ()
+ "Should bury undead buffers instead of killing them."
+ (test-kill-all-other-buffers-and-windows-setup)
+ (unwind-protect
+ (let ((orig (copy-sequence cj/undead-buffer-list))
+ (main (current-buffer))
+ (buf1 (generate-new-buffer "*test-undead-1*"))
+ (buf2 (generate-new-buffer "*test-undead-2*")))
+ (unwind-protect
+ (progn
+ (add-to-list 'cj/undead-buffer-list "*test-undead-1*")
+ (add-to-list 'cj/undead-buffer-list "*test-undead-2*")
+ (cj/kill-all-other-buffers-and-windows)
+ (should (buffer-live-p main))
+ (should (buffer-live-p buf1))
+ (should (buffer-live-p buf2)))
+ (setq cj/undead-buffer-list orig)
+ (when (buffer-live-p buf1) (kill-buffer buf1))
+ (when (buffer-live-p buf2) (kill-buffer buf2))))
+ (test-kill-all-other-buffers-and-windows-teardown)))
+
+(ert-deftest test-kill-all-other-buffers-and-windows-should-keep-current-buffer ()
+ "Should always keep the current buffer alive."
+ (test-kill-all-other-buffers-and-windows-setup)
+ (unwind-protect
+ (let ((main (current-buffer)))
+ (cj/kill-all-other-buffers-and-windows)
+ (should (buffer-live-p main))
+ (should (eq main (current-buffer))))
+ (test-kill-all-other-buffers-and-windows-teardown)))
+
+(ert-deftest test-kill-all-other-buffers-and-windows-should-delete-all-other-windows ()
+ "Should delete all windows except current."
+ (test-kill-all-other-buffers-and-windows-setup)
+ (unwind-protect
+ (progn
+ (split-window)
+ (split-window)
+ (should (> (length (window-list)) 1))
+ (cj/kill-all-other-buffers-and-windows)
+ (should (one-window-p)))
+ (test-kill-all-other-buffers-and-windows-teardown)))
+
+;;; Boundary Cases
+
+(ert-deftest test-kill-all-other-buffers-and-windows-mixed-undead-and-regular-buffers ()
+ "With mix of undead and regular buffers, should handle both correctly."
+ (test-kill-all-other-buffers-and-windows-setup)
+ (unwind-protect
+ (let ((orig (copy-sequence cj/undead-buffer-list))
+ (main (current-buffer))
+ (regular (generate-new-buffer "*test-regular*"))
+ (undead (generate-new-buffer "*test-undead*")))
+ (unwind-protect
+ (progn
+ (add-to-list 'cj/undead-buffer-list "*test-undead*")
+ (cj/kill-all-other-buffers-and-windows)
+ (should (buffer-live-p main))
+ (should-not (buffer-live-p regular))
+ (should (buffer-live-p undead)))
+ (setq cj/undead-buffer-list orig)
+ (when (buffer-live-p regular) (kill-buffer regular))
+ (when (buffer-live-p undead) (kill-buffer undead))))
+ (test-kill-all-other-buffers-and-windows-teardown)))
+
+(ert-deftest test-kill-all-other-buffers-and-windows-all-undead-buffers-should-bury-all ()
+ "When all other buffers are undead, should bury all of them."
+ (test-kill-all-other-buffers-and-windows-setup)
+ (unwind-protect
+ (let ((orig (copy-sequence cj/undead-buffer-list))
+ (main (current-buffer))
+ (undead1 (generate-new-buffer "*test-all-undead-1*"))
+ (undead2 (generate-new-buffer "*test-all-undead-2*"))
+ (undead3 (generate-new-buffer "*test-all-undead-3*")))
+ (unwind-protect
+ (progn
+ (add-to-list 'cj/undead-buffer-list "*test-all-undead-1*")
+ (add-to-list 'cj/undead-buffer-list "*test-all-undead-2*")
+ (add-to-list 'cj/undead-buffer-list "*test-all-undead-3*")
+ (cj/kill-all-other-buffers-and-windows)
+ (should (buffer-live-p main))
+ (should (buffer-live-p undead1))
+ (should (buffer-live-p undead2))
+ (should (buffer-live-p undead3)))
+ (setq cj/undead-buffer-list orig)
+ (when (buffer-live-p undead1) (kill-buffer undead1))
+ (when (buffer-live-p undead2) (kill-buffer undead2))
+ (when (buffer-live-p undead3) (kill-buffer undead3))))
+ (test-kill-all-other-buffers-and-windows-teardown)))
+
+(ert-deftest test-kill-all-other-buffers-and-windows-should-prompt-for-modified-buffers ()
+ "Should call cj/save-some-buffers to handle modified buffers."
+ (test-kill-all-other-buffers-and-windows-setup)
+ (unwind-protect
+ (let ((main (current-buffer))
+ (file (cj/create-temp-test-file-with-content "original"))
+ save-called)
+ ;; Mock cj/save-some-buffers to track if it's called
+ (cl-letf (((symbol-function 'cj/save-some-buffers)
+ (lambda (&optional arg)
+ (setq save-called t))))
+ (let ((buf (find-file-noselect file)))
+ (unwind-protect
+ (progn
+ (with-current-buffer buf
+ (insert "modified"))
+ (cj/kill-all-other-buffers-and-windows)
+ (should save-called))
+ (when (buffer-live-p buf)
+ (set-buffer-modified-p nil)
+ (kill-buffer buf))))))
+ (test-kill-all-other-buffers-and-windows-teardown)))
+
+(provide 'test-undead-buffers-kill-all-other-buffers-and-windows)
+;;; test-undead-buffers-kill-all-other-buffers-and-windows.el ends here
diff --git a/tests/test-undead-buffers-kill-buffer-and-window.el b/tests/test-undead-buffers-kill-buffer-and-window.el
new file mode 100644
index 00000000..b49969f6
--- /dev/null
+++ b/tests/test-undead-buffers-kill-buffer-and-window.el
@@ -0,0 +1,112 @@
+;;; test-undead-buffers-kill-buffer-and-window.el --- Tests for cj/kill-buffer-and-window -*- lexical-binding: t; -*-
+
+;;; Commentary:
+;; Tests for the cj/kill-buffer-and-window function from undead-buffers.el
+
+;;; Code:
+
+(require 'ert)
+(require 'undead-buffers)
+(require 'testutil-general)
+
+;;; Setup and Teardown
+
+(defun test-kill-buffer-and-window-setup ()
+ "Setup for kill-buffer-and-window tests."
+ (cj/create-test-base-dir)
+ (delete-other-windows))
+
+(defun test-kill-buffer-and-window-teardown ()
+ "Teardown for kill-buffer-and-window tests."
+ (delete-other-windows)
+ (cj/delete-test-base-dir))
+
+;;; Normal Cases
+
+(ert-deftest test-kill-buffer-and-window-multiple-windows-should-delete-window-and-kill-buffer ()
+ "With multiple windows, should delete window and kill buffer."
+ (test-kill-buffer-and-window-setup)
+ (unwind-protect
+ (let ((buf (generate-new-buffer "*test-multi*")))
+ (unwind-protect
+ (progn
+ (split-window)
+ (switch-to-buffer buf)
+ (let ((win (selected-window)))
+ (cj/kill-buffer-and-window)
+ (should-not (window-live-p win))
+ (should-not (buffer-live-p buf))))
+ (when (buffer-live-p buf) (kill-buffer buf))))
+ (test-kill-buffer-and-window-teardown)))
+
+(ert-deftest test-kill-buffer-and-window-multiple-windows-undead-buffer-should-delete-window-and-bury ()
+ "With multiple windows, undead buffer should be buried and window deleted."
+ (test-kill-buffer-and-window-setup)
+ (unwind-protect
+ (let ((orig (copy-sequence cj/undead-buffer-list))
+ (buf (generate-new-buffer "*test-undead-multi*")))
+ (unwind-protect
+ (progn
+ (add-to-list 'cj/undead-buffer-list "*test-undead-multi*")
+ (split-window)
+ (switch-to-buffer buf)
+ (let ((win (selected-window)))
+ (cj/kill-buffer-and-window)
+ (should-not (window-live-p win))
+ (should (buffer-live-p buf))))
+ (setq cj/undead-buffer-list orig)
+ (when (buffer-live-p buf) (kill-buffer buf))))
+ (test-kill-buffer-and-window-teardown)))
+
+;;; Boundary Cases
+
+(ert-deftest test-kill-buffer-and-window-single-window-should-only-kill-buffer ()
+ "With single window, should only kill buffer, not delete window."
+ (test-kill-buffer-and-window-setup)
+ (unwind-protect
+ (let ((buf (generate-new-buffer "*test-single*")))
+ (unwind-protect
+ (progn
+ (switch-to-buffer buf)
+ (should (one-window-p))
+ (cj/kill-buffer-and-window)
+ (should (one-window-p))
+ (should-not (buffer-live-p buf)))
+ (when (buffer-live-p buf) (kill-buffer buf))))
+ (test-kill-buffer-and-window-teardown)))
+
+(ert-deftest test-kill-buffer-and-window-single-window-undead-buffer-should-only-bury ()
+ "With single window, undead buffer should only be buried."
+ (test-kill-buffer-and-window-setup)
+ (unwind-protect
+ (let ((orig (copy-sequence cj/undead-buffer-list))
+ (buf (generate-new-buffer "*test-undead-single*")))
+ (unwind-protect
+ (progn
+ (add-to-list 'cj/undead-buffer-list "*test-undead-single*")
+ (switch-to-buffer buf)
+ (should (one-window-p))
+ (cj/kill-buffer-and-window)
+ (should (one-window-p))
+ (should (buffer-live-p buf)))
+ (setq cj/undead-buffer-list orig)
+ (when (buffer-live-p buf) (kill-buffer buf))))
+ (test-kill-buffer-and-window-teardown)))
+
+(ert-deftest test-kill-buffer-and-window-two-windows-should-leave-one ()
+ "With two windows, should leave one window after deletion."
+ (test-kill-buffer-and-window-setup)
+ (unwind-protect
+ (let ((buf (generate-new-buffer "*test-two*")))
+ (unwind-protect
+ (progn
+ (split-window)
+ (set-window-buffer (selected-window) buf)
+ (should (= 2 (length (window-list))))
+ (cj/kill-buffer-and-window)
+ (should (= 1 (length (window-list)))))
+ (when (buffer-live-p buf) (kill-buffer buf))))
+ (test-kill-buffer-and-window-teardown)))
+
+(provide 'test-undead-buffers-kill-buffer-and-window)
+;;; test-undead-buffers-kill-buffer-and-window.el ends here
diff --git a/tests/test-undead-buffers-kill-buffer-or-bury-alive.el b/tests/test-undead-buffers-kill-buffer-or-bury-alive.el
new file mode 100644
index 00000000..60b776e4
--- /dev/null
+++ b/tests/test-undead-buffers-kill-buffer-or-bury-alive.el
@@ -0,0 +1,138 @@
+;;; test-undead-buffers-kill-buffer-or-bury-alive.el --- Tests for cj/kill-buffer-or-bury-alive -*- lexical-binding: t; -*-
+
+;;; Commentary:
+;; Tests for the cj/kill-buffer-or-bury-alive function from undead-buffers.el
+
+;;; Code:
+
+(require 'ert)
+(require 'undead-buffers)
+(require 'testutil-general)
+
+;;; Setup and Teardown
+
+(defun test-kill-buffer-or-bury-alive-setup ()
+ "Setup for kill-buffer-or-bury-alive tests."
+ (cj/create-test-base-dir))
+
+(defun test-kill-buffer-or-bury-alive-teardown ()
+ "Teardown for kill-buffer-or-bury-alive tests."
+ (cj/delete-test-base-dir))
+
+;;; Normal Cases
+
+(ert-deftest test-kill-buffer-or-bury-alive-regular-buffer-should-kill ()
+ "Killing a regular buffer not in undead list should kill it."
+ (test-kill-buffer-or-bury-alive-setup)
+ (unwind-protect
+ (let ((buf (generate-new-buffer "*test-regular*")))
+ (should (buffer-live-p buf))
+ (cj/kill-buffer-or-bury-alive buf)
+ (should-not (buffer-live-p buf)))
+ (test-kill-buffer-or-bury-alive-teardown)))
+
+(ert-deftest test-kill-buffer-or-bury-alive-undead-buffer-should-bury ()
+ "Killing an undead buffer should bury it instead."
+ (test-kill-buffer-or-bury-alive-setup)
+ (unwind-protect
+ (let ((orig (copy-sequence cj/undead-buffer-list))
+ (buf (generate-new-buffer "*test-undead*")))
+ (unwind-protect
+ (progn
+ (add-to-list 'cj/undead-buffer-list "*test-undead*")
+ (should (buffer-live-p buf))
+ (cj/kill-buffer-or-bury-alive buf)
+ (should (buffer-live-p buf)))
+ (setq cj/undead-buffer-list orig)
+ (when (buffer-live-p buf) (kill-buffer buf))))
+ (test-kill-buffer-or-bury-alive-teardown)))
+
+(ert-deftest test-kill-buffer-or-bury-alive-with-prefix-arg-should-add-to-undead-list ()
+ "Calling with prefix arg should add buffer to undead list."
+ (test-kill-buffer-or-bury-alive-setup)
+ (unwind-protect
+ (let ((orig (copy-sequence cj/undead-buffer-list))
+ (buf (generate-new-buffer "*test-prefix*")))
+ (unwind-protect
+ (progn
+ (with-current-buffer buf
+ (let ((current-prefix-arg '(4)))
+ (cj/kill-buffer-or-bury-alive buf)))
+ (should (member "*test-prefix*" cj/undead-buffer-list))
+ (should (buffer-live-p buf)))
+ (setq cj/undead-buffer-list orig)
+ (when (buffer-live-p buf) (kill-buffer buf))))
+ (test-kill-buffer-or-bury-alive-teardown)))
+
+(ert-deftest test-kill-buffer-or-bury-alive-scratch-buffer-should-bury ()
+ "The *scratch* buffer (in default list) should be buried."
+ (test-kill-buffer-or-bury-alive-setup)
+ (unwind-protect
+ (let ((scratch (get-buffer-create "*scratch*")))
+ (should (buffer-live-p scratch))
+ (cj/kill-buffer-or-bury-alive scratch)
+ (should (buffer-live-p scratch)))
+ (test-kill-buffer-or-bury-alive-teardown)))
+
+;;; Boundary Cases
+
+(ert-deftest test-kill-buffer-or-bury-alive-buffer-by-name-string-should-work ()
+ "Passing buffer name as string should work."
+ (test-kill-buffer-or-bury-alive-setup)
+ (unwind-protect
+ (let ((buf (generate-new-buffer "*test-string*")))
+ (should (buffer-live-p buf))
+ (cj/kill-buffer-or-bury-alive "*test-string*")
+ (should-not (buffer-live-p buf)))
+ (test-kill-buffer-or-bury-alive-teardown)))
+
+(ert-deftest test-kill-buffer-or-bury-alive-buffer-by-buffer-object-should-work ()
+ "Passing buffer object should work."
+ (test-kill-buffer-or-bury-alive-setup)
+ (unwind-protect
+ (let ((buf (generate-new-buffer "*test-object*")))
+ (should (buffer-live-p buf))
+ (cj/kill-buffer-or-bury-alive buf)
+ (should-not (buffer-live-p buf)))
+ (test-kill-buffer-or-bury-alive-teardown)))
+
+(ert-deftest test-kill-buffer-or-bury-alive-modified-undead-buffer-should-bury-without-prompt ()
+ "Modified undead buffer should be buried without save prompt."
+ (test-kill-buffer-or-bury-alive-setup)
+ (unwind-protect
+ (let ((orig (copy-sequence cj/undead-buffer-list))
+ (buf (generate-new-buffer "*test-modified*")))
+ (unwind-protect
+ (progn
+ (add-to-list 'cj/undead-buffer-list "*test-modified*")
+ (with-current-buffer buf
+ (insert "some text")
+ (set-buffer-modified-p t))
+ (cj/kill-buffer-or-bury-alive buf)
+ (should (buffer-live-p buf)))
+ (setq cj/undead-buffer-list orig)
+ (when (buffer-live-p buf)
+ (set-buffer-modified-p nil)
+ (kill-buffer buf))))
+ (test-kill-buffer-or-bury-alive-teardown)))
+
+;;; Error Cases
+
+(ert-deftest test-kill-buffer-or-bury-alive-nonexistent-buffer-should-error ()
+ "Passing a non-existent buffer name should error."
+ (test-kill-buffer-or-bury-alive-setup)
+ (unwind-protect
+ (should-error (cj/kill-buffer-or-bury-alive "*nonexistent-buffer-xyz*"))
+ (test-kill-buffer-or-bury-alive-teardown)))
+
+(ert-deftest test-kill-buffer-or-bury-alive-killed-buffer-object-should-error ()
+ "Passing a killed buffer object should error."
+ (test-kill-buffer-or-bury-alive-setup)
+ (unwind-protect
+ (let ((buf (generate-new-buffer "*test-killed*")))
+ (kill-buffer buf)
+ (should-error (cj/kill-buffer-or-bury-alive buf)))
+ (test-kill-buffer-or-bury-alive-teardown)))
+
+(provide 'test-undead-buffers-kill-buffer-or-bury-alive)
+;;; test-undead-buffers-kill-buffer-or-bury-alive.el ends here
diff --git a/tests/test-undead-buffers-kill-other-window.el b/tests/test-undead-buffers-kill-other-window.el
new file mode 100644
index 00000000..e9371a0f
--- /dev/null
+++ b/tests/test-undead-buffers-kill-other-window.el
@@ -0,0 +1,123 @@
+;;; test-undead-buffers-kill-other-window.el --- Tests for cj/kill-other-window -*- lexical-binding: t; -*-
+
+;;; Commentary:
+;; Tests for the cj/kill-other-window function from undead-buffers.el
+
+;;; Code:
+
+(require 'ert)
+(require 'undead-buffers)
+(require 'testutil-general)
+
+;;; Setup and Teardown
+
+(defun test-kill-other-window-setup ()
+ "Setup for kill-other-window tests."
+ (cj/create-test-base-dir)
+ (delete-other-windows))
+
+(defun test-kill-other-window-teardown ()
+ "Teardown for kill-other-window tests."
+ (delete-other-windows)
+ (cj/delete-test-base-dir))
+
+;;; Normal Cases
+
+(ert-deftest test-kill-other-window-two-windows-should-delete-other-and-kill-buffer ()
+ "With two windows, should delete other window and kill its buffer."
+ (test-kill-other-window-setup)
+ (unwind-protect
+ (let ((buf1 (current-buffer))
+ (buf2 (generate-new-buffer "*test-other*")))
+ (unwind-protect
+ (progn
+ (split-window)
+ (let ((win1 (selected-window))
+ (win2 (next-window)))
+ (set-window-buffer win2 buf2)
+ (select-window win1)
+ (cj/kill-other-window)
+ (should-not (window-live-p win2))
+ (should-not (buffer-live-p buf2))))
+ (when (buffer-live-p buf2) (kill-buffer buf2))))
+ (test-kill-other-window-teardown)))
+
+(ert-deftest test-kill-other-window-two-windows-undead-buffer-should-delete-other-and-bury ()
+ "With two windows, undead buffer in other window should be buried."
+ (test-kill-other-window-setup)
+ (unwind-protect
+ (let ((orig (copy-sequence cj/undead-buffer-list))
+ (buf1 (current-buffer))
+ (buf2 (generate-new-buffer "*test-undead-other*")))
+ (unwind-protect
+ (progn
+ (add-to-list 'cj/undead-buffer-list "*test-undead-other*")
+ (split-window)
+ (let ((win1 (selected-window))
+ (win2 (next-window)))
+ (set-window-buffer win2 buf2)
+ (select-window win1)
+ (cj/kill-other-window)
+ (should-not (window-live-p win2))
+ (should (buffer-live-p buf2))))
+ (setq cj/undead-buffer-list orig)
+ (when (buffer-live-p buf2) (kill-buffer buf2))))
+ (test-kill-other-window-teardown)))
+
+;;; Boundary Cases
+
+(ert-deftest test-kill-other-window-single-window-should-only-kill-buffer ()
+ "With single window, should only kill the current buffer."
+ (test-kill-other-window-setup)
+ (unwind-protect
+ (let ((buf (generate-new-buffer "*test-single-other*")))
+ (unwind-protect
+ (progn
+ (switch-to-buffer buf)
+ (should (one-window-p))
+ (cj/kill-other-window)
+ (should (one-window-p))
+ (should-not (buffer-live-p buf)))
+ (when (buffer-live-p buf) (kill-buffer buf))))
+ (test-kill-other-window-teardown)))
+
+(ert-deftest test-kill-other-window-three-windows-should-delete-one ()
+ "With three windows, should delete one window."
+ (test-kill-other-window-setup)
+ (unwind-protect
+ (let ((buf1 (current-buffer))
+ (buf2 (generate-new-buffer "*test-three-1*"))
+ (buf3 (generate-new-buffer "*test-three-2*")))
+ (unwind-protect
+ (progn
+ (split-window)
+ (split-window)
+ (set-window-buffer (nth 1 (window-list)) buf2)
+ (set-window-buffer (nth 2 (window-list)) buf3)
+ (select-window (car (window-list)))
+ (should (= 3 (length (window-list))))
+ (cj/kill-other-window)
+ (should (= 2 (length (window-list)))))
+ (when (buffer-live-p buf2) (kill-buffer buf2))
+ (when (buffer-live-p buf3) (kill-buffer buf3))))
+ (test-kill-other-window-teardown)))
+
+(ert-deftest test-kill-other-window-wraps-to-first-window-correctly ()
+ "Should correctly cycle through windows with other-window."
+ (test-kill-other-window-setup)
+ (unwind-protect
+ (let ((buf1 (current-buffer))
+ (buf2 (generate-new-buffer "*test-wrap*")))
+ (unwind-protect
+ (progn
+ (split-window)
+ (let ((win2 (next-window)))
+ (set-window-buffer win2 buf2)
+ (select-window (car (window-list)))
+ (cj/kill-other-window)
+ (should-not (window-live-p win2))))
+ (when (buffer-live-p buf2) (kill-buffer buf2))))
+ (test-kill-other-window-teardown)))
+
+(provide 'test-undead-buffers-kill-other-window)
+;;; test-undead-buffers-kill-other-window.el ends here
diff --git a/tests/test-undead-buffers-make-buffer-undead.el b/tests/test-undead-buffers-make-buffer-undead.el
new file mode 100644
index 00000000..823bb56e
--- /dev/null
+++ b/tests/test-undead-buffers-make-buffer-undead.el
@@ -0,0 +1,134 @@
+;;; test-undead-buffers-make-buffer-undead.el --- Tests for cj/make-buffer-undead -*- lexical-binding: t; -*-
+
+;;; Commentary:
+;; Tests for the cj/make-buffer-undead function from undead-buffers.el
+
+;;; Code:
+
+(require 'ert)
+(require 'undead-buffers)
+(require 'testutil-general)
+
+;;; Setup and Teardown
+
+(defun test-make-buffer-undead-setup ()
+ "Setup for make-buffer-undead tests."
+ (cj/create-test-base-dir))
+
+(defun test-make-buffer-undead-teardown ()
+ "Teardown for make-buffer-undead tests."
+ (cj/delete-test-base-dir))
+
+;;; Normal Cases
+
+(ert-deftest test-make-buffer-undead-valid-name-should-add-to-list ()
+ "Adding a valid buffer name should add it to the undead buffer list."
+ (test-make-buffer-undead-setup)
+ (unwind-protect
+ (let ((orig (copy-sequence cj/undead-buffer-list)))
+ (unwind-protect
+ (progn
+ (cj/make-buffer-undead "*test-buffer*")
+ (should (member "*test-buffer*" cj/undead-buffer-list)))
+ (setq cj/undead-buffer-list orig)))
+ (test-make-buffer-undead-teardown)))
+
+(ert-deftest test-make-buffer-undead-existing-name-should-not-duplicate ()
+ "Adding an existing buffer name should not create duplicates."
+ (test-make-buffer-undead-setup)
+ (unwind-protect
+ (let ((orig (copy-sequence cj/undead-buffer-list)))
+ (unwind-protect
+ (progn
+ (cj/make-buffer-undead "*test-dup*")
+ (cj/make-buffer-undead "*test-dup*")
+ (should (= 1 (cl-count "*test-dup*" cj/undead-buffer-list :test #'string=))))
+ (setq cj/undead-buffer-list orig)))
+ (test-make-buffer-undead-teardown)))
+
+(ert-deftest test-make-buffer-undead-multiple-additions-should-preserve-order ()
+ "Adding multiple buffer names should preserve order."
+ (test-make-buffer-undead-setup)
+ (unwind-protect
+ (let ((orig (copy-sequence cj/undead-buffer-list)))
+ (unwind-protect
+ (progn
+ (cj/make-buffer-undead "*first*")
+ (cj/make-buffer-undead "*second*")
+ (cj/make-buffer-undead "*third*")
+ (let ((added-items (seq-drop cj/undead-buffer-list (length orig))))
+ (should (equal added-items '("*first*" "*second*" "*third*")))))
+ (setq cj/undead-buffer-list orig)))
+ (test-make-buffer-undead-teardown)))
+
+;;; Boundary Cases
+
+(ert-deftest test-make-buffer-undead-whitespace-only-name-should-add ()
+ "Adding a whitespace-only name should succeed."
+ (test-make-buffer-undead-setup)
+ (unwind-protect
+ (let ((orig (copy-sequence cj/undead-buffer-list)))
+ (unwind-protect
+ (progn
+ (cj/make-buffer-undead " ")
+ (should (member " " cj/undead-buffer-list)))
+ (setq cj/undead-buffer-list orig)))
+ (test-make-buffer-undead-teardown)))
+
+(ert-deftest test-make-buffer-undead-very-long-name-should-add ()
+ "Adding a very long buffer name should succeed."
+ (test-make-buffer-undead-setup)
+ (unwind-protect
+ (let ((orig (copy-sequence cj/undead-buffer-list))
+ (long-name (make-string 1000 ?x)))
+ (unwind-protect
+ (progn
+ (cj/make-buffer-undead long-name)
+ (should (member long-name cj/undead-buffer-list)))
+ (setq cj/undead-buffer-list orig)))
+ (test-make-buffer-undead-teardown)))
+
+(ert-deftest test-make-buffer-undead-unicode-name-should-add ()
+ "Adding a buffer name with Unicode characters should succeed."
+ (test-make-buffer-undead-setup)
+ (unwind-protect
+ (let ((orig (copy-sequence cj/undead-buffer-list)))
+ (unwind-protect
+ (progn
+ (cj/make-buffer-undead "*test-🚀-buffer*")
+ (should (member "*test-🚀-buffer*" cj/undead-buffer-list)))
+ (setq cj/undead-buffer-list orig)))
+ (test-make-buffer-undead-teardown)))
+
+;;; Error Cases
+
+(ert-deftest test-make-buffer-undead-empty-string-should-error ()
+ "Passing an empty string should signal an error."
+ (test-make-buffer-undead-setup)
+ (unwind-protect
+ (should-error (cj/make-buffer-undead ""))
+ (test-make-buffer-undead-teardown)))
+
+(ert-deftest test-make-buffer-undead-nil-should-error ()
+ "Passing nil should signal an error."
+ (test-make-buffer-undead-setup)
+ (unwind-protect
+ (should-error (cj/make-buffer-undead nil))
+ (test-make-buffer-undead-teardown)))
+
+(ert-deftest test-make-buffer-undead-number-should-error ()
+ "Passing a number should signal an error."
+ (test-make-buffer-undead-setup)
+ (unwind-protect
+ (should-error (cj/make-buffer-undead 42))
+ (test-make-buffer-undead-teardown)))
+
+(ert-deftest test-make-buffer-undead-symbol-should-error ()
+ "Passing a symbol should signal an error."
+ (test-make-buffer-undead-setup)
+ (unwind-protect
+ (should-error (cj/make-buffer-undead 'some-symbol))
+ (test-make-buffer-undead-teardown)))
+
+(provide 'test-undead-buffers-make-buffer-undead)
+;;; test-undead-buffers-make-buffer-undead.el ends here
diff --git a/tests/test-undead-buffers-undead-buffer-p.el b/tests/test-undead-buffers-undead-buffer-p.el
new file mode 100644
index 00000000..107256c9
--- /dev/null
+++ b/tests/test-undead-buffers-undead-buffer-p.el
@@ -0,0 +1,106 @@
+;;; test-undead-buffers-undead-buffer-p.el --- Tests for cj/undead-buffer-p -*- lexical-binding: t; -*-
+
+;;; Commentary:
+;; Tests for the cj/undead-buffer-p function from undead-buffers.el
+
+;;; Code:
+
+(require 'ert)
+(require 'undead-buffers)
+(require 'testutil-general)
+
+;;; Setup and Teardown
+
+(defun test-undead-buffer-p-setup ()
+ "Setup for undead-buffer-p tests."
+ (cj/create-test-base-dir))
+
+(defun test-undead-buffer-p-teardown ()
+ "Teardown for undead-buffer-p tests."
+ (cj/delete-test-base-dir))
+
+;;; Normal Cases
+
+(ert-deftest test-undead-buffer-p-modified-file-buffer-should-return-true ()
+ "A modified file-backed buffer not in undead list should return t."
+ (test-undead-buffer-p-setup)
+ (unwind-protect
+ (let* ((file (cj/create-temp-test-file-with-content "test content"))
+ (buf (find-file-noselect file)))
+ (unwind-protect
+ (progn
+ (with-current-buffer buf
+ (insert "more content")
+ (should (cj/undead-buffer-p))))
+ (when (buffer-live-p buf)
+ (set-buffer-modified-p nil)
+ (kill-buffer buf))))
+ (test-undead-buffer-p-teardown)))
+
+(ert-deftest test-undead-buffer-p-undead-modified-file-buffer-should-return-nil ()
+ "A modified file-backed undead buffer should return nil."
+ (test-undead-buffer-p-setup)
+ (unwind-protect
+ (let* ((orig (copy-sequence cj/undead-buffer-list))
+ (file (cj/create-temp-test-file-with-content "test content"))
+ (buf (find-file-noselect file)))
+ (unwind-protect
+ (progn
+ (add-to-list 'cj/undead-buffer-list (buffer-name buf))
+ (with-current-buffer buf
+ (insert "more content")
+ (should-not (cj/undead-buffer-p))))
+ (setq cj/undead-buffer-list orig)
+ (when (buffer-live-p buf)
+ (set-buffer-modified-p nil)
+ (kill-buffer buf))))
+ (test-undead-buffer-p-teardown)))
+
+(ert-deftest test-undead-buffer-p-scratch-buffer-should-return-nil ()
+ "The *scratch* buffer should return nil (it's undead)."
+ (test-undead-buffer-p-setup)
+ (unwind-protect
+ (with-current-buffer "*scratch*"
+ (should-not (cj/undead-buffer-p)))
+ (test-undead-buffer-p-teardown)))
+
+;;; Boundary Cases
+
+(ert-deftest test-undead-buffer-p-unmodified-file-buffer-should-return-nil ()
+ "An unmodified file buffer should return nil."
+ (test-undead-buffer-p-setup)
+ (unwind-protect
+ (let* ((file (cj/create-temp-test-file-with-content "test content"))
+ (buf (find-file-noselect file)))
+ (unwind-protect
+ (with-current-buffer buf
+ (should-not (cj/undead-buffer-p)))
+ (when (buffer-live-p buf)
+ (kill-buffer buf))))
+ (test-undead-buffer-p-teardown)))
+
+(ert-deftest test-undead-buffer-p-modified-buffer-without-file-should-return-nil ()
+ "A modified buffer without a backing file should return nil."
+ (test-undead-buffer-p-setup)
+ (unwind-protect
+ (let ((buf (generate-new-buffer "*test-no-file*")))
+ (unwind-protect
+ (with-current-buffer buf
+ (insert "content")
+ (set-buffer-modified-p t)
+ (should-not (cj/undead-buffer-p)))
+ (when (buffer-live-p buf)
+ (set-buffer-modified-p nil)
+ (kill-buffer buf))))
+ (test-undead-buffer-p-teardown)))
+
+(ert-deftest test-undead-buffer-p-temporary-buffer-should-return-nil ()
+ "A temporary buffer should return nil."
+ (test-undead-buffer-p-setup)
+ (unwind-protect
+ (with-temp-buffer
+ (should-not (cj/undead-buffer-p)))
+ (test-undead-buffer-p-teardown)))
+
+(provide 'test-undead-buffers-undead-buffer-p)
+;;; test-undead-buffers-undead-buffer-p.el ends here