aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-06-15 23:07:37 -0500
committerCraig Jennings <c@cjennings.net>2026-06-15 23:08:00 -0500
commitb53375c12c46f7020feae0c6274770ef2e31ebbb (patch)
treef011843b136ba240635dfd31e666734536203984 /tests
parent5b83e9a224115ecc86332db8c14104e7b0864bef (diff)
downloaddotemacs-b53375c12c46f7020feae0c6274770ef2e31ebbb.tar.gz
dotemacs-b53375c12c46f7020feae0c6274770ef2e31ebbb.zip
fix(dirvish): mark-all-visible no longer skips every other file
dired-mark advances point itself, so the loop's extra forward-line skipped every other file (and could mark a directory). Use dired-get-filename + file-directory-p with an if/else: a marked file line advances once via dired-mark, non-file/directory lines advance manually. Replaces the regex line predicate (retired with its mock test) with a real-Dired marked-count test.
Diffstat (limited to 'tests')
-rw-r--r--tests/test-dirvish-config-dired-line-directory.el56
-rw-r--r--tests/test-dirvish-config-mark-all-visible.el68
-rw-r--r--tests/test-dirvish-config-public-wrappers.el19
3 files changed, 71 insertions, 72 deletions
diff --git a/tests/test-dirvish-config-dired-line-directory.el b/tests/test-dirvish-config-dired-line-directory.el
deleted file mode 100644
index 7f344c7c0..000000000
--- a/tests/test-dirvish-config-dired-line-directory.el
+++ /dev/null
@@ -1,56 +0,0 @@
-;;; test-dirvish-config-dired-line-directory.el --- Tests for the directory-line predicate -*- lexical-binding: t; -*-
-
-;;; Commentary:
-;; `cj/--dired-line-is-directory-p' is the testable predicate behind
-;; `cj/dired-mark-all-visible-files'. Dired buffers prefix each file
-;; line with a one-char mark column followed by the `ls -l' output, so
-;; column 2 is the file-type letter (`d' for directory, `-' for regular
-;; file). The wrapper iterates the buffer and skips lines this
-;; predicate returns t for; the iteration stays dired-coupled and
-;; untested, but the line-classification logic is now isolated.
-
-;;; Code:
-
-(require 'ert)
-(require 'package)
-
-(setq package-user-dir (expand-file-name "elpa" user-emacs-directory))
-(package-initialize)
-(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory))
-(add-to-list 'load-path (expand-file-name "elpa/dirvish-2.3.0/extensions"
- user-emacs-directory))
-(require 'user-constants)
-(require 'keybindings)
-(require 'dirvish-config)
-
-(ert-deftest test-cj--dired-line-is-directory-p-unmarked-directory ()
- "Normal: an unmarked directory line (` drwx...') matches."
- (should (cj/--dired-line-is-directory-p
- " drwxr-xr-x 1 me me 4096 May 10 13:00 subdir/")))
-
-(ert-deftest test-cj--dired-line-is-directory-p-marked-directory ()
- "Normal: a star-marked directory line (`* drwx...') matches."
- (should (cj/--dired-line-is-directory-p
- "* drwxr-xr-x 1 me me 4096 May 10 13:00 subdir/")))
-
-(ert-deftest test-cj--dired-line-is-directory-p-regular-file ()
- "Normal: a regular file line (` -rw...') does not match."
- (should-not (cj/--dired-line-is-directory-p
- " -rw-r--r-- 1 me me 42 May 10 13:00 notes.txt")))
-
-(ert-deftest test-cj--dired-line-is-directory-p-symlink-line ()
- "Boundary: a symlink line (` lrwx...') does not match -- only `d' is a dir."
- (should-not (cj/--dired-line-is-directory-p
- " lrwxrwxrwx 1 me me 12 May 10 13:00 link -> target")))
-
-(ert-deftest test-cj--dired-line-is-directory-p-empty-line ()
- "Boundary: an empty string does not match."
- (should-not (cj/--dired-line-is-directory-p "")))
-
-(ert-deftest test-cj--dired-line-is-directory-p-header-line ()
- "Boundary: a dired header (` /path/to:') or `total' line does not match."
- (should-not (cj/--dired-line-is-directory-p " /home/me/projects:"))
- (should-not (cj/--dired-line-is-directory-p " total 24")))
-
-(provide 'test-dirvish-config-dired-line-directory)
-;;; test-dirvish-config-dired-line-directory.el ends here
diff --git a/tests/test-dirvish-config-mark-all-visible.el b/tests/test-dirvish-config-mark-all-visible.el
new file mode 100644
index 000000000..5ed01440c
--- /dev/null
+++ b/tests/test-dirvish-config-mark-all-visible.el
@@ -0,0 +1,68 @@
+;;; test-dirvish-config-mark-all-visible.el --- Tests for marking all visible files -*- lexical-binding: t; -*-
+
+;;; Commentary:
+;; `cj/dired-mark-all-visible-files' marks every regular file in a Dired
+;; buffer and leaves directories unmarked. The loop is exercised here against
+;; a real Dired buffer over a temp directory (the line predicate has its own
+;; unit tests). The regression this pins: `dired-mark' advances point itself,
+;; so an extra `forward-line' skipped every other file and only alternate files
+;; got marked.
+
+;;; Code:
+
+(require 'ert)
+(require 'package)
+(setq package-user-dir (expand-file-name "elpa" user-emacs-directory))
+(package-initialize)
+(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory))
+(add-to-list 'load-path (expand-file-name "elpa/dirvish-2.3.0/extensions"
+ user-emacs-directory))
+(require 'user-constants)
+(require 'keybindings)
+(require 'dirvish-config)
+(require 'dired)
+
+(defun test-dirvish--marked-count ()
+ "Return the number of `*'-marked lines in the current Dired buffer."
+ (let ((n 0))
+ (save-excursion
+ (goto-char (point-min))
+ (while (not (eobp))
+ (when (looking-at-p "^\\*") (setq n (1+ n)))
+ (forward-line 1)))
+ n))
+
+(ert-deftest test-dirvish-mark-all-visible-marks-every-file ()
+ "Normal: all regular files get marked, no skips.
+Three files plus a subdirectory; the count of marks must equal the file count."
+ (let ((dir (make-temp-file "dirvish-mark-test-" t)))
+ (unwind-protect
+ (progn
+ (dolist (f '("a.txt" "b.txt" "c.txt"))
+ (write-region "" nil (expand-file-name f dir)))
+ (make-directory (expand-file-name "subdir" dir))
+ (let ((buf (dired-noselect dir)))
+ (unwind-protect
+ (with-current-buffer buf
+ (cj/dired-mark-all-visible-files)
+ (should (= 3 (test-dirvish--marked-count))))
+ (kill-buffer buf))))
+ (delete-directory dir t))))
+
+(ert-deftest test-dirvish-mark-all-visible-leaves-directories-unmarked ()
+ "Boundary: a directory line is never marked."
+ (let ((dir (make-temp-file "dirvish-mark-test-" t)))
+ (unwind-protect
+ (progn
+ (write-region "" nil (expand-file-name "only.txt" dir))
+ (make-directory (expand-file-name "adir" dir))
+ (let ((buf (dired-noselect dir)))
+ (unwind-protect
+ (with-current-buffer buf
+ (cj/dired-mark-all-visible-files)
+ (should (= 1 (test-dirvish--marked-count))))
+ (kill-buffer buf))))
+ (delete-directory dir t))))
+
+(provide 'test-dirvish-config-mark-all-visible)
+;;; test-dirvish-config-mark-all-visible.el ends here
diff --git a/tests/test-dirvish-config-public-wrappers.el b/tests/test-dirvish-config-public-wrappers.el
index 0a9998646..cec979e4a 100644
--- a/tests/test-dirvish-config-public-wrappers.el
+++ b/tests/test-dirvish-config-public-wrappers.el
@@ -101,22 +101,9 @@ confused when several built-ins are overridden in the same test."
(when (file-exists-p dst) (delete-file dst)))))
;;; cj/dired-mark-all-visible-files
-
-(ert-deftest test-dirvish-mark-all-visible-skips-directories ()
- "Normal: directory lines are skipped, file lines are marked."
- (let ((marks 0))
- (with-temp-buffer
- ;; Real dired listing has lines like " drwxr... dir/" or " -rw... file".
- ;; The helper `cj/--dired-line-is-directory-p' matches "<space>d".
- (insert " drwxr-xr-x subdir\n"
- " -rw-r--r-- file1.txt\n"
- " -rw-r--r-- file2.txt\n")
- (goto-char (point-min))
- (cl-letf (((symbol-function 'dired-mark)
- (lambda (&rest _) (cl-incf marks))))
- (cj/dired-mark-all-visible-files)))
- ;; 2 file lines marked; the directory line + the trailing empty line skipped.
- (should (= marks 2))))
+;; Covered by test-dirvish-config-mark-all-visible.el, which exercises the loop
+;; against a real Dired buffer (the previous fake-buffer mock coupled to the
+;; retired regex helper).
;;; cj/dired-copy-path-as-kill