diff options
| author | Craig Jennings <c@cjennings.net> | 2026-04-01 08:13:33 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-04-01 08:13:33 -0500 |
| commit | fdc63ea6675709d6ca42362b1be1918f8bf24478 (patch) | |
| tree | 056dd89c3879b4fd4e928ce8c6772501a7d7ffa5 /tests/test-music-config--playlist-tracks.el | |
| parent | 0d55edecf82b32b75780f24751dfa8d693b72708 (diff) | |
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.el | 123 |
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 |
