summaryrefslogtreecommitdiff
path: root/tests/test-video-audio-recording-modeline-indicator.el
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2025-11-11 17:43:34 -0600
committerCraig Jennings <c@cjennings.net>2025-11-11 17:43:34 -0600
commitb07f8fe248db0c9916eccbc249f24d7a9107a3ce (patch)
treef6336d009b589f1840fadac901bf2758563af9aa /tests/test-video-audio-recording-modeline-indicator.el
parent23b3df60eb619351fada7b83c9646c86e1addbd2 (diff)
a/v recording: fix setup, add test functionality and indicatorlkg
Integrates a modeline indicator to display active recording status in Emacs. The indicator shows "🔴Audio", "🔴Video", or "🔴A+V" based on the active recording processes. Includes functions for starting and stopping audio/video recordings, with sentinel processes ensuring timely updates to the modeline. Also adds extensive integration tests to validate modeline synchronization.
Diffstat (limited to 'tests/test-video-audio-recording-modeline-indicator.el')
-rw-r--r--tests/test-video-audio-recording-modeline-indicator.el134
1 files changed, 134 insertions, 0 deletions
diff --git a/tests/test-video-audio-recording-modeline-indicator.el b/tests/test-video-audio-recording-modeline-indicator.el
new file mode 100644
index 00000000..f7f3bbff
--- /dev/null
+++ b/tests/test-video-audio-recording-modeline-indicator.el
@@ -0,0 +1,134 @@
+;;; test-video-audio-recording-modeline-indicator.el --- Tests for cj/recording-modeline-indicator -*- lexical-binding: t; -*-
+
+;;; Commentary:
+;; Unit tests for cj/recording-modeline-indicator function.
+;; Tests modeline indicator display based on active recording processes.
+
+;;; Code:
+
+(require 'ert)
+
+;; Stub dependencies before loading the module
+(defvar cj/custom-keymap (make-sparse-keymap)
+ "Stub keymap for testing.")
+
+;; Now load the actual production module
+(require 'video-audio-recording)
+
+;;; Setup and Teardown
+
+(defun test-modeline-indicator-setup ()
+ "Reset process variables before each test."
+ (setq cj/audio-recording-ffmpeg-process nil)
+ (setq cj/video-recording-ffmpeg-process nil))
+
+(defun test-modeline-indicator-teardown ()
+ "Clean up process variables after each test."
+ (setq cj/audio-recording-ffmpeg-process nil)
+ (setq cj/video-recording-ffmpeg-process nil))
+
+;;; Normal Cases
+
+(ert-deftest test-video-audio-recording-modeline-indicator-normal-no-processes-returns-empty ()
+ "Test that indicator returns empty string when no processes are active."
+ (test-modeline-indicator-setup)
+ (unwind-protect
+ (let ((result (cj/recording-modeline-indicator)))
+ (should (stringp result))
+ (should (equal "" result)))
+ (test-modeline-indicator-teardown)))
+
+(ert-deftest test-video-audio-recording-modeline-indicator-normal-audio-only-shows-audio ()
+ "Test that indicator shows audio when only audio process is active."
+ (test-modeline-indicator-setup)
+ (unwind-protect
+ (let ((fake-process (make-process :name "test-audio" :command '("sleep" "1000"))))
+ (setq cj/audio-recording-ffmpeg-process fake-process)
+ (let ((result (cj/recording-modeline-indicator)))
+ (should (equal " 🔴Audio " result)))
+ (delete-process fake-process))
+ (test-modeline-indicator-teardown)))
+
+(ert-deftest test-video-audio-recording-modeline-indicator-normal-video-only-shows-video ()
+ "Test that indicator shows video when only video process is active."
+ (test-modeline-indicator-setup)
+ (unwind-protect
+ (let ((fake-process (make-process :name "test-video" :command '("sleep" "1000"))))
+ (setq cj/video-recording-ffmpeg-process fake-process)
+ (let ((result (cj/recording-modeline-indicator)))
+ (should (equal " 🔴Video " result)))
+ (delete-process fake-process))
+ (test-modeline-indicator-teardown)))
+
+(ert-deftest test-video-audio-recording-modeline-indicator-normal-both-shows-combined ()
+ "Test that indicator shows A+V when both processes are active."
+ (test-modeline-indicator-setup)
+ (unwind-protect
+ (let ((audio-proc (make-process :name "test-audio" :command '("sleep" "1000")))
+ (video-proc (make-process :name "test-video" :command '("sleep" "1000"))))
+ (setq cj/audio-recording-ffmpeg-process audio-proc)
+ (setq cj/video-recording-ffmpeg-process video-proc)
+ (let ((result (cj/recording-modeline-indicator)))
+ (should (equal " 🔴A+V " result)))
+ (delete-process audio-proc)
+ (delete-process video-proc))
+ (test-modeline-indicator-teardown)))
+
+;;; Boundary Cases
+
+(ert-deftest test-video-audio-recording-modeline-indicator-boundary-dead-audio-process-returns-empty ()
+ "Test that indicator returns empty string when audio process variable is set but process is dead."
+ (test-modeline-indicator-setup)
+ (unwind-protect
+ (let ((fake-process (make-process :name "test-audio" :command '("sleep" "1000"))))
+ (setq cj/audio-recording-ffmpeg-process fake-process)
+ ;; Kill the process
+ (delete-process fake-process)
+ ;; Wait for process to be fully dead
+ (sit-for 0.1)
+ (let ((result (cj/recording-modeline-indicator)))
+ (should (equal "" result))))
+ (test-modeline-indicator-teardown)))
+
+(ert-deftest test-video-audio-recording-modeline-indicator-boundary-dead-video-process-returns-empty ()
+ "Test that indicator returns empty string when video process variable is set but process is dead."
+ (test-modeline-indicator-setup)
+ (unwind-protect
+ (let ((fake-process (make-process :name "test-video" :command '("sleep" "1000"))))
+ (setq cj/video-recording-ffmpeg-process fake-process)
+ ;; Kill the process
+ (delete-process fake-process)
+ ;; Wait for process to be fully dead
+ (sit-for 0.1)
+ (let ((result (cj/recording-modeline-indicator)))
+ (should (equal "" result))))
+ (test-modeline-indicator-teardown)))
+
+(ert-deftest test-video-audio-recording-modeline-indicator-boundary-one-dead-one-alive-shows-alive ()
+ "Test that only the alive process shows when one is dead and one is alive."
+ (test-modeline-indicator-setup)
+ (unwind-protect
+ (let ((dead-proc (make-process :name "test-dead" :command '("sleep" "1000")))
+ (alive-proc (make-process :name "test-alive" :command '("sleep" "1000"))))
+ (setq cj/audio-recording-ffmpeg-process dead-proc)
+ (setq cj/video-recording-ffmpeg-process alive-proc)
+ (delete-process dead-proc)
+ (sit-for 0.1)
+ (let ((result (cj/recording-modeline-indicator)))
+ (should (equal " 🔴Video " result)))
+ (delete-process alive-proc))
+ (test-modeline-indicator-teardown)))
+
+(ert-deftest test-video-audio-recording-modeline-indicator-boundary-nil-process-variables ()
+ "Test that nil process variables are handled gracefully."
+ (test-modeline-indicator-setup)
+ (unwind-protect
+ (progn
+ (setq cj/audio-recording-ffmpeg-process nil)
+ (setq cj/video-recording-ffmpeg-process nil)
+ (let ((result (cj/recording-modeline-indicator)))
+ (should (equal "" result))))
+ (test-modeline-indicator-teardown)))
+
+(provide 'test-video-audio-recording-modeline-indicator)
+;;; test-video-audio-recording-modeline-indicator.el ends here