aboutsummaryrefslogtreecommitdiff
path: root/tests/test-dirvish-config-duplicate-file-name.el
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-05-10 13:27:51 -0500
committerCraig Jennings <c@cjennings.net>2026-05-10 13:27:51 -0500
commit2a9257006fcde777e217708b4593461a9e6c07a8 (patch)
tree1d4931fbe6132cc2a4e15b59787a58ef46f2fbc2 /tests/test-dirvish-config-duplicate-file-name.el
parentf2c45a7146568bea7eea12270688c8c8ed814c86 (diff)
downloaddotemacs-2a9257006fcde777e217708b4593461a9e6c07a8.tar.gz
dotemacs-2a9257006fcde777e217708b4593461a9e6c07a8.zip
refactor(dirvish): extract cj/--duplicate-file-name helper
The name-mangling logic in `cj/dirvish-duplicate-file' was inline -- inseparable from the dired side effects (existence check, copy, revert). Extract to `cj/--duplicate-file-name', a pure function from FILE to FILE-WITH-COPY-SUFFIX. Seven Normal/Boundary tests cover the cases I care about: typical extension, elisp file, no extension, multi-dot extensions (only the last dot counts), leading-dot dotfiles, relative paths, spaces in the base name. The wrapper retains the dired-mode interactive shape and now reads as a thin shell over the pure helper.
Diffstat (limited to 'tests/test-dirvish-config-duplicate-file-name.el')
-rw-r--r--tests/test-dirvish-config-duplicate-file-name.el59
1 files changed, 59 insertions, 0 deletions
diff --git a/tests/test-dirvish-config-duplicate-file-name.el b/tests/test-dirvish-config-duplicate-file-name.el
new file mode 100644
index 00000000..8e69f28b
--- /dev/null
+++ b/tests/test-dirvish-config-duplicate-file-name.el
@@ -0,0 +1,59 @@
+;;; test-dirvish-config-duplicate-file-name.el --- Tests for the duplicate-file-name helper -*- lexical-binding: t; -*-
+
+;;; Commentary:
+;; `cj/--duplicate-file-name' is the pure name-mangling half of
+;; `cj/dirvish-duplicate-file': given an absolute file path, return the
+;; new path with `-copy' inserted before the extension. The interactive
+;; wrapper handles the dired side effects (existence check, copy, revert).
+
+;;; 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--duplicate-file-name-with-extension ()
+ "Normal: a file with an extension gets `-copy' before the dot."
+ (should (equal (cj/--duplicate-file-name "/tmp/report.pdf")
+ "/tmp/report-copy.pdf")))
+
+(ert-deftest test-cj--duplicate-file-name-elisp-extension ()
+ "Normal: works for elisp files (the project's daily case)."
+ (should (equal (cj/--duplicate-file-name "/home/foo/script.el")
+ "/home/foo/script-copy.el")))
+
+(ert-deftest test-cj--duplicate-file-name-no-extension ()
+ "Boundary: an extensionless file appends `-copy' at the end."
+ (should (equal (cj/--duplicate-file-name "/dir/README")
+ "/dir/README-copy")))
+
+(ert-deftest test-cj--duplicate-file-name-multiple-dots ()
+ "Boundary: only the last dot counts as the extension separator."
+ (should (equal (cj/--duplicate-file-name "/tmp/archive.tar.gz")
+ "/tmp/archive.tar-copy.gz")))
+
+(ert-deftest test-cj--duplicate-file-name-dotfile ()
+ "Boundary: a leading-dot file (no real extension) keeps the dot in the base."
+ (should (equal (cj/--duplicate-file-name "/home/foo/.bashrc")
+ "/home/foo/.bashrc-copy")))
+
+(ert-deftest test-cj--duplicate-file-name-relative-path ()
+ "Boundary: relative paths preserve their relative form."
+ (should (equal (cj/--duplicate-file-name "doc.txt")
+ "doc-copy.txt")))
+
+(ert-deftest test-cj--duplicate-file-name-spaces-in-name ()
+ "Boundary: spaces in the base name are preserved."
+ (should (equal (cj/--duplicate-file-name "/tmp/my file.txt")
+ "/tmp/my file-copy.txt")))
+
+(provide 'test-dirvish-config-duplicate-file-name)
+;;; test-dirvish-config-duplicate-file-name.el ends here