aboutsummaryrefslogtreecommitdiff
path: root/tests/test-dirvish-config-playlist.el
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-05-10 13:34:24 -0500
committerCraig Jennings <c@cjennings.net>2026-05-10 13:34:24 -0500
commit3c840b0569ba3461cd61eabc32919f6899a25163 (patch)
treee601b0080d7e923d3c3e66446d9d01c474923314 /tests/test-dirvish-config-playlist.el
parent1f907e40bb2124084e336d429cd60830df6aa369 (diff)
downloaddotemacs-3c840b0569ba3461cd61eabc32919f6899a25163.tar.gz
dotemacs-3c840b0569ba3461cd61eabc32919f6899a25163.zip
refactor(dirvish): extract playlist filter and sanitize helpers
`cj/dired-create-playlist-from-marked' had its audio-file filtering and trailing-`.m3u' stripping inline among the dired marking, prompting, overwrite-loop, and file-write logic. Lift each into its own pure helper: - `cj/--playlist-filter-audio (files extensions)' returns only files whose extension matches one of EXTENSIONS (lowercase, no dot). Case-insensitive on the file side. - `cj/--playlist-sanitize-name (name)' strips a trailing `.m3u' suffix; embedded `.m3u' that isn't at the end is preserved. Ten Normal/Boundary tests cover keep-only-audio, case-insensitivity, files-without-extension excluded, empty inputs, and the sanitize edge cases (bare name, embedded `.m3u', empty string, just `.m3u').
Diffstat (limited to 'tests/test-dirvish-config-playlist.el')
-rw-r--r--tests/test-dirvish-config-playlist.el82
1 files changed, 82 insertions, 0 deletions
diff --git a/tests/test-dirvish-config-playlist.el b/tests/test-dirvish-config-playlist.el
new file mode 100644
index 00000000..3876a177
--- /dev/null
+++ b/tests/test-dirvish-config-playlist.el
@@ -0,0 +1,82 @@
+;;; test-dirvish-config-playlist.el --- Tests for the playlist helpers -*- lexical-binding: t; -*-
+
+;;; Commentary:
+;; `cj/--playlist-filter-audio' and `cj/--playlist-sanitize-name' are
+;; the two pure pieces under `cj/dired-create-playlist-from-marked'.
+;; The interactive command does the dired marking, prompting,
+;; overwrite-confirmation loop, and the file write -- the helpers stay
+;; testable in isolation.
+
+;;; 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)
+
+;;; --------------------------- filter-audio --------------------------
+
+(ert-deftest test-cj--playlist-filter-audio-keeps-only-audio ()
+ "Normal: a mixed list returns only the entries with audio extensions."
+ (should (equal (cj/--playlist-filter-audio
+ '("/m/song.mp3" "/d/notes.org" "/m/track.flac" "/d/run.sh")
+ '("mp3" "flac"))
+ '("/m/song.mp3" "/m/track.flac"))))
+
+(ert-deftest test-cj--playlist-filter-audio-case-insensitive-extension ()
+ "Boundary: uppercase / mixed-case extensions are matched against the
+lowercase extension list."
+ (should (equal (cj/--playlist-filter-audio
+ '("/m/A.MP3" "/m/B.Flac" "/m/c.OGG")
+ '("mp3" "flac" "ogg"))
+ '("/m/A.MP3" "/m/B.Flac" "/m/c.OGG"))))
+
+(ert-deftest test-cj--playlist-filter-audio-files-without-extension-excluded ()
+ "Boundary: a file with no extension can't be an audio file."
+ (should (equal (cj/--playlist-filter-audio
+ '("/m/README" "/m/song.mp3" "/m/Makefile")
+ '("mp3"))
+ '("/m/song.mp3"))))
+
+(ert-deftest test-cj--playlist-filter-audio-empty-input-empty-output ()
+ "Boundary: no input files -> no output."
+ (should-not (cj/--playlist-filter-audio '() '("mp3" "flac"))))
+
+(ert-deftest test-cj--playlist-filter-audio-empty-extensions-empty-output ()
+ "Boundary: no allowed extensions -> nothing matches."
+ (should-not (cj/--playlist-filter-audio
+ '("/m/song.mp3" "/m/track.flac")
+ '())))
+
+;;; ---------------------- sanitize-playlist-name ---------------------
+
+(ert-deftest test-cj--playlist-sanitize-name-strips-trailing-m3u ()
+ "Normal: a `.m3u' suffix is stripped."
+ (should (equal (cj/--playlist-sanitize-name "summer.m3u") "summer")))
+
+(ert-deftest test-cj--playlist-sanitize-name-bare-name-unchanged ()
+ "Normal: a name without `.m3u' is returned unchanged."
+ (should (equal (cj/--playlist-sanitize-name "summer") "summer")))
+
+(ert-deftest test-cj--playlist-sanitize-name-embedded-m3u-untouched ()
+ "Boundary: `.m3u' that isn't at the end is kept (it's part of the name)."
+ (should (equal (cj/--playlist-sanitize-name "my.m3u.draft")
+ "my.m3u.draft")))
+
+(ert-deftest test-cj--playlist-sanitize-name-empty-string-unchanged ()
+ "Boundary: empty string returns empty string."
+ (should (equal (cj/--playlist-sanitize-name "") "")))
+
+(ert-deftest test-cj--playlist-sanitize-name-only-suffix ()
+ "Boundary: a name that's just `.m3u' becomes empty after stripping."
+ (should (equal (cj/--playlist-sanitize-name ".m3u") "")))
+
+(provide 'test-dirvish-config-playlist)
+;;; test-dirvish-config-playlist.el ends here