From c4e9232f297ffda4443477c589f29052178d2c87 Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Wed, 22 Oct 2025 12:27:05 -0500 Subject: feat: undead-buffers: Add `cj/make-buffer-undead` function and tests Introduce a new function `cj/make-buffer-undead` that appends a buffer name to the `cj/undead-buffer-list`, preventing it from being killed. This comes along with a suite of tests to check various scenarios and edge cases for handling undead buffers. Additionally, add tests for related functions: `cj/kill-buffer-or-bury-alive`, `cj/kill-buffer-and-window`, and others to ensure they correctly manage buffers, particularly with undead-status considerations. Refactor `undead-buffer-list` naming for consistency and clarity in the module. --- ...d-buffers-kill-all-other-buffers-and-windows.el | 159 +++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 tests/test-undead-buffers-kill-all-other-buffers-and-windows.el (limited to 'tests/test-undead-buffers-kill-all-other-buffers-and-windows.el') 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 -- cgit v1.2.3