summaryrefslogtreecommitdiff
path: root/tests/test-music-config--playlist-tracks.el
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-04-01 08:13:33 -0500
committerCraig Jennings <c@cjennings.net>2026-04-01 08:13:33 -0500
commitfdc63ea6675709d6ca42362b1be1918f8bf24478 (patch)
tree056dd89c3879b4fd4e928ce8c6772501a7d7ffa5 /tests/test-music-config--playlist-tracks.el
parent0d55edecf82b32b75780f24751dfa8d693b72708 (diff)
feat(music): add test coverage for 7 functions, refactor with extracted helpersHEADmain
Add 47 new unit tests across 7 test files covering playlist-modified-p, assert-valid-playlist-file, playlist-tracks, create-radio-station, ensure-playlist-buffer, after-playlist-clear, and header-text. Extract three helpers to reduce duplication: assert-m3u-files-exist (dedupes 2 identical guards), sync-playlist-file (dedupes 3 state-sync patterns), and select-m3u-file (reusable M3U selection with cancel). Simplify append-track-to-playlist nesting from 6 to 4 levels. Delete unused cj/music-keymap-prefix variable.
Diffstat (limited to 'tests/test-music-config--playlist-tracks.el')
-rw-r--r--tests/test-music-config--playlist-tracks.el123
1 files changed, 123 insertions, 0 deletions
diff --git a/tests/test-music-config--playlist-tracks.el b/tests/test-music-config--playlist-tracks.el
new file mode 100644
index 00000000..7736b8d2
--- /dev/null
+++ b/tests/test-music-config--playlist-tracks.el
@@ -0,0 +1,123 @@
+;;; test-music-config--playlist-tracks.el --- Tests for playlist track extraction -*- coding: utf-8; lexical-binding: t; -*-
+;;
+;; Author: Craig Jennings <c@cjennings.net>
+;;
+;;; Commentary:
+;; Unit tests for cj/music--playlist-tracks function.
+;; Tests reading track names from the current EMMS playlist buffer.
+;;
+;; Test organization:
+;; - Normal Cases: Single and multiple tracks
+;; - Boundary Cases: Empty playlist, order preservation
+;; - Error Cases: No playlist buffer, tracks without names
+;;
+;;; Code:
+
+(require 'ert)
+
+;; Stub missing dependencies before loading music-config
+(defvar-keymap cj/custom-keymap
+ :doc "Stub keymap for testing")
+
+;; Add EMMS elpa directory to load path for batch testing
+(let ((emms-dir (car (file-expand-wildcards
+ (expand-file-name "elpa/emms-*" user-emacs-directory)))))
+ (when emms-dir
+ (add-to-list 'load-path emms-dir)))
+
+(require 'emms)
+(require 'emms-playlist-mode)
+(require 'music-config)
+
+;;; Test helpers
+
+(defun test-tracks--setup-playlist-buffer (track-names)
+ "Create an EMMS playlist buffer with TRACK-NAMES and return it.
+Each entry in TRACK-NAMES becomes a file track in the playlist."
+ (let ((buf (get-buffer-create cj/music-playlist-buffer-name)))
+ (with-current-buffer buf
+ (emms-playlist-mode)
+ (setq emms-playlist-buffer-p t)
+ (let ((inhibit-read-only t))
+ (erase-buffer)
+ (dolist (name track-names)
+ (emms-playlist-insert-track (emms-track 'file name)))))
+ (setq emms-playlist-buffer buf)
+ buf))
+
+(defun test-tracks--teardown ()
+ "Clean up test playlist buffer."
+ (when-let ((buf (get-buffer cj/music-playlist-buffer-name)))
+ (kill-buffer buf)))
+
+;;; Normal Cases
+
+(ert-deftest test-music-config--playlist-tracks-normal-multiple-tracks-returns-list ()
+ "Multiple tracks in playlist returns list of track names."
+ (unwind-protect
+ (let ((tracks '("/music/a.mp3" "/music/b.mp3" "/music/c.mp3")))
+ (test-tracks--setup-playlist-buffer tracks)
+ (should (equal (cj/music--playlist-tracks) tracks)))
+ (test-tracks--teardown)))
+
+(ert-deftest test-music-config--playlist-tracks-normal-single-track-returns-list ()
+ "Single track in playlist returns single-element list."
+ (unwind-protect
+ (let ((tracks '("/music/only.mp3")))
+ (test-tracks--setup-playlist-buffer tracks)
+ (should (equal (cj/music--playlist-tracks) tracks)))
+ (test-tracks--teardown)))
+
+;;; Boundary Cases
+
+(ert-deftest test-music-config--playlist-tracks-boundary-empty-playlist-returns-nil ()
+ "Empty playlist returns nil (empty list)."
+ (unwind-protect
+ (progn
+ (test-tracks--setup-playlist-buffer '())
+ (should-not (cj/music--playlist-tracks)))
+ (test-tracks--teardown)))
+
+(ert-deftest test-music-config--playlist-tracks-boundary-preserves-insertion-order ()
+ "Track order matches insertion order."
+ (unwind-protect
+ (let ((tracks '("/music/z.mp3" "/music/a.mp3" "/music/m.mp3")))
+ (test-tracks--setup-playlist-buffer tracks)
+ (should (equal (cj/music--playlist-tracks) tracks)))
+ (test-tracks--teardown)))
+
+(ert-deftest test-music-config--playlist-tracks-boundary-url-tracks-included ()
+ "URL tracks are included alongside file tracks."
+ (unwind-protect
+ (let* ((buf (get-buffer-create cj/music-playlist-buffer-name)))
+ (with-current-buffer buf
+ (emms-playlist-mode)
+ (setq emms-playlist-buffer-p t)
+ (let ((inhibit-read-only t))
+ (erase-buffer)
+ (emms-playlist-insert-track (emms-track 'file "/music/local.mp3"))
+ (emms-playlist-insert-track (emms-track 'url "http://stream.example.com/radio"))))
+ (setq emms-playlist-buffer buf)
+ (let ((result (cj/music--playlist-tracks)))
+ (should (= 2 (length result)))
+ (should (equal (nth 0 result) "/music/local.mp3"))
+ (should (equal (nth 1 result) "http://stream.example.com/radio"))))
+ (test-tracks--teardown)))
+
+;;; Error Cases
+
+(ert-deftest test-music-config--playlist-tracks-error-no-buffer-creates-one ()
+ "When playlist buffer doesn't exist, ensure-playlist-buffer creates it."
+ (unwind-protect
+ (progn
+ ;; Kill any existing buffer
+ (when-let ((buf (get-buffer cj/music-playlist-buffer-name)))
+ (kill-buffer buf))
+ ;; Should create buffer and return empty list
+ (should-not (cj/music--playlist-tracks))
+ ;; Buffer should now exist
+ (should (get-buffer cj/music-playlist-buffer-name)))
+ (test-tracks--teardown)))
+
+(provide 'test-music-config--playlist-tracks)
+;;; test-music-config--playlist-tracks.el ends here