From 193b9ab0dfd07dfd188681b6a6a3171cb470d907 Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Sun, 5 Apr 2026 06:35:45 -0500 Subject: refactor(recording): unify parse-pactl-sources/sinks-verbose into single function Identical 31-line parser logic differed only in "Source #" vs "Sink #" header. Replaced with cj/recording--parse-pactl-verbose taking a record-type parameter. --- ...t-video-audio-recording--parse-pactl-sinks-verbose.el | 16 ++++++++-------- ...video-audio-recording--parse-pactl-sources-verbose.el | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) (limited to 'tests') diff --git a/tests/test-video-audio-recording--parse-pactl-sinks-verbose.el b/tests/test-video-audio-recording--parse-pactl-sinks-verbose.el index 8a2cba2d..59159039 100644 --- a/tests/test-video-audio-recording--parse-pactl-sinks-verbose.el +++ b/tests/test-video-audio-recording--parse-pactl-sinks-verbose.el @@ -1,7 +1,7 @@ ;;; test-video-audio-recording--parse-pactl-sinks-verbose.el --- Tests for verbose pactl sinks parser -*- lexical-binding: t; -*- ;;; Commentary: -;; Unit tests for cj/recording--parse-pactl-sinks-verbose. +;; Unit tests for cj/recording--parse-pactl-verbose. ;; Parses the verbose output of `pactl list sinks' into structured tuples ;; of (name description mute state). @@ -34,7 +34,7 @@ (ert-deftest test-parse-pactl-sinks-verbose-normal-multiple-sinks () "Test parsing multiple sink entries from fixture." (let* ((output (test-sinks--fixture "pactl-sinks-verbose-normal.txt")) - (result (cj/recording--parse-pactl-sinks-verbose output))) + (result (cj/recording--parse-pactl-verbose output "Sink"))) (should (= 3 (length result))) (should (equal "alsa_output.usb-JDS_Labs-00.analog-stereo" (nth 0 (nth 0 result)))) (should (equal "JDS Labs Element IV Analog Stereo" (nth 1 (nth 0 result)))) @@ -44,7 +44,7 @@ (ert-deftest test-parse-pactl-sinks-verbose-normal-single-sink () "Test parsing a single sink entry." (let* ((output "Sink #65\n\tState: SUSPENDED\n\tName: alsa_output.usb-JDS-00.analog-stereo\n\tDescription: JDS Labs Element IV\n\tMute: no\n") - (result (cj/recording--parse-pactl-sinks-verbose output))) + (result (cj/recording--parse-pactl-verbose output "Sink"))) (should (= 1 (length result))) (should (equal "alsa_output.usb-JDS-00.analog-stereo" (nth 0 (car result)))) (should (equal "JDS Labs Element IV" (nth 1 (car result)))) @@ -54,7 +54,7 @@ (ert-deftest test-parse-pactl-sinks-verbose-normal-muted-sink () "Test that muted sinks are parsed (filtering is done by caller)." (let* ((output (test-sinks--fixture "pactl-sinks-verbose-muted.txt")) - (result (cj/recording--parse-pactl-sinks-verbose output))) + (result (cj/recording--parse-pactl-verbose output "Sink"))) (should (= 3 (length result))) ;; Second sink is muted (should (equal "yes" (nth 2 (nth 1 result)))))) @@ -63,14 +63,14 @@ (ert-deftest test-parse-pactl-sinks-verbose-boundary-empty-input () "Test that empty input returns empty list." - (should (null (cj/recording--parse-pactl-sinks-verbose "")))) + (should (null (cj/recording--parse-pactl-verbose "" "Sink")))) (ert-deftest test-parse-pactl-sinks-verbose-boundary-extra-fields () "Test that extra fields between sinks are ignored." (let* ((output (concat "Sink #65\n\tState: IDLE\n\tName: sink-a\n\tDescription: Sink A\n\tMute: no\n" "\tDriver: PipeWire\n\tSample Specification: s16le 2ch 48000Hz\n" "Sink #66\n\tState: SUSPENDED\n\tName: sink-b\n\tDescription: Sink B\n\tMute: no\n")) - (result (cj/recording--parse-pactl-sinks-verbose output))) + (result (cj/recording--parse-pactl-verbose output "Sink"))) (should (= 2 (length result))) (should (equal "sink-a" (nth 0 (car result)))) (should (equal "sink-b" (nth 0 (cadr result)))))) @@ -78,7 +78,7 @@ (ert-deftest test-parse-pactl-sinks-verbose-boundary-description-with-parens () "Test descriptions containing parentheses are captured fully." (let* ((output "Sink #91\n\tState: SUSPENDED\n\tName: hdmi-output\n\tDescription: Radeon (HDMI 2) Output\n\tMute: no\n") - (result (cj/recording--parse-pactl-sinks-verbose output))) + (result (cj/recording--parse-pactl-verbose output "Sink"))) (should (equal "Radeon (HDMI 2) Output" (nth 1 (car result)))))) ;;; Error Cases @@ -86,7 +86,7 @@ (ert-deftest test-parse-pactl-sinks-verbose-error-malformed-no-name () "Test that sink entries without Name field are skipped." (let* ((output "Sink #65\n\tState: SUSPENDED\n\tDescription: Orphan\n\tMute: no\n") - (result (cj/recording--parse-pactl-sinks-verbose output))) + (result (cj/recording--parse-pactl-verbose output "Sink"))) (should (null result)))) (provide 'test-video-audio-recording--parse-pactl-sinks-verbose) diff --git a/tests/test-video-audio-recording--parse-pactl-sources-verbose.el b/tests/test-video-audio-recording--parse-pactl-sources-verbose.el index e856f29a..67945846 100644 --- a/tests/test-video-audio-recording--parse-pactl-sources-verbose.el +++ b/tests/test-video-audio-recording--parse-pactl-sources-verbose.el @@ -1,7 +1,7 @@ ;;; test-video-audio-recording--parse-pactl-sources-verbose.el --- Tests for verbose pactl parser -*- lexical-binding: t; -*- ;;; Commentary: -;; Unit tests for cj/recording--parse-pactl-sources-verbose. +;; Unit tests for cj/recording--parse-pactl-verbose. ;; Parses the verbose output of `pactl list sources' into structured tuples ;; of (name description mute state). @@ -20,7 +20,7 @@ (ert-deftest test-video-audio-recording--parse-pactl-sources-verbose-normal-single-source () "Test parsing a single source entry." (let* ((output "Source #65\n\tState: SUSPENDED\n\tName: alsa_input.usb-Jabra-00.mono\n\tDescription: Jabra SPEAK 510 Mono\n\tMute: no\n") - (result (cj/recording--parse-pactl-sources-verbose output))) + (result (cj/recording--parse-pactl-verbose output "Source"))) (should (= 1 (length result))) (should (equal "alsa_input.usb-Jabra-00.mono" (nth 0 (car result)))) (should (equal "Jabra SPEAK 510 Mono" (nth 1 (car result)))) @@ -31,7 +31,7 @@ "Test parsing multiple source entries." (let* ((output (concat "Source #65\n\tState: SUSPENDED\n\tName: device-a\n\tDescription: Device A\n\tMute: no\n" "Source #66\n\tState: RUNNING\n\tName: device-b\n\tDescription: Device B\n\tMute: yes\n")) - (result (cj/recording--parse-pactl-sources-verbose output))) + (result (cj/recording--parse-pactl-verbose output "Source"))) (should (= 2 (length result))) (should (equal "device-a" (nth 0 (car result)))) (should (equal "Device B" (nth 1 (cadr result)))) @@ -40,7 +40,7 @@ (ert-deftest test-video-audio-recording--parse-pactl-sources-verbose-normal-monitors-included () "Test that monitor sources are parsed (filtering is done by caller)." (let* ((output "Source #67\n\tState: SUSPENDED\n\tName: alsa_output.jds.monitor\n\tDescription: Monitor of JDS Labs\n\tMute: no\n") - (result (cj/recording--parse-pactl-sources-verbose output))) + (result (cj/recording--parse-pactl-verbose output "Source"))) (should (= 1 (length result))) (should (string-match-p "\\.monitor$" (nth 0 (car result)))))) @@ -48,7 +48,7 @@ (ert-deftest test-video-audio-recording--parse-pactl-sources-verbose-boundary-empty-input () "Test that empty input returns empty list." - (should (null (cj/recording--parse-pactl-sources-verbose "")))) + (should (null (cj/recording--parse-pactl-verbose "" "Source")))) (ert-deftest test-video-audio-recording--parse-pactl-sources-verbose-boundary-extra-fields () "Test that extra fields between sources are ignored." @@ -56,7 +56,7 @@ "\tDriver: PipeWire\n\tSample Specification: s16le 2ch 48000Hz\n" "\tChannel Map: front-left,front-right\n" "Source #66\n\tState: SUSPENDED\n\tName: dev-b\n\tDescription: Dev B\n\tMute: no\n")) - (result (cj/recording--parse-pactl-sources-verbose output))) + (result (cj/recording--parse-pactl-verbose output "Source"))) (should (= 2 (length result))) (should (equal "dev-a" (nth 0 (car result)))) (should (equal "dev-b" (nth 0 (cadr result)))))) @@ -64,7 +64,7 @@ (ert-deftest test-video-audio-recording--parse-pactl-sources-verbose-boundary-description-with-parens () "Test descriptions containing parentheses are captured fully." (let* ((output "Source #91\n\tState: SUSPENDED\n\tName: hdmi.monitor\n\tDescription: Monitor of Radeon (HDMI 2)\n\tMute: no\n") - (result (cj/recording--parse-pactl-sources-verbose output))) + (result (cj/recording--parse-pactl-verbose output "Source"))) (should (equal "Monitor of Radeon (HDMI 2)" (nth 1 (car result)))))) ;;; Error Cases @@ -72,7 +72,7 @@ (ert-deftest test-video-audio-recording--parse-pactl-sources-verbose-error-malformed-no-name () "Test that source entries without Name field are skipped." (let* ((output "Source #65\n\tState: SUSPENDED\n\tDescription: Orphan\n\tMute: no\n") - (result (cj/recording--parse-pactl-sources-verbose output))) + (result (cj/recording--parse-pactl-verbose output "Source"))) (should (null result)))) (provide 'test-video-audio-recording--parse-pactl-sources-verbose) -- cgit v1.2.3