aboutsummaryrefslogtreecommitdiff
path: root/tests/test-signel-cancel-input.el
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test-signel-cancel-input.el')
-rw-r--r--tests/test-signel-cancel-input.el74
1 files changed, 74 insertions, 0 deletions
diff --git a/tests/test-signel-cancel-input.el b/tests/test-signel-cancel-input.el
new file mode 100644
index 00000000..b2a7ef89
--- /dev/null
+++ b/tests/test-signel-cancel-input.el
@@ -0,0 +1,74 @@
+;;; test-signel-cancel-input.el --- Cancel-input contract for the signel fork -*- lexical-binding: t; -*-
+
+;;; Commentary:
+;; `signel--cancel-input' is the C-c C-k handler in `signel-chat-mode'.
+;; Its contract: clear any in-progress input between `signel--input-marker'
+;; and `point-max' (so the prompt is fresh on next visit), then dismiss
+;; the window via `quit-window' (the buffer stays alive so chat history
+;; survives revisits). These tests lock the contract; the binding test
+;; locks the keymap entry.
+
+;;; Code:
+
+(require 'ert)
+(require 'cl-lib)
+
+(eval-and-compile
+ (add-to-list 'load-path (expand-file-name "~/code/signel")))
+(require 'signel)
+
+(defmacro test-signel-cancel--with-chat-buffer (&rest body)
+ "Set up a temp signel-chat-mode buffer with prompt drawn and run BODY."
+ (declare (indent 0))
+ `(with-temp-buffer
+ (signel-chat-mode)
+ (setq signel--chat-id "+15555550100")
+ (signel--draw-prompt)
+ ,@body))
+
+(ert-deftest test-signel-cancel-input-clears-pending-text ()
+ "Normal: pending input from input-marker to point-max is cleared."
+ (test-signel-cancel--with-chat-buffer
+ (insert "abandoned-draft")
+ (cl-letf (((symbol-function 'quit-window) (lambda (&rest _) nil)))
+ (signel--cancel-input))
+ (should-not (signel--pending-input))))
+
+(ert-deftest test-signel-cancel-input-empty-input-area-is-a-noop ()
+ "Boundary: cancelling with no in-progress input is harmless."
+ (test-signel-cancel--with-chat-buffer
+ (cl-letf (((symbol-function 'quit-window) (lambda (&rest _) nil)))
+ (signel--cancel-input))
+ (should-not (signel--pending-input))))
+
+(ert-deftest test-signel-cancel-input-calls-quit-window ()
+ "Normal: cancel dismisses the window via `quit-window'."
+ (test-signel-cancel--with-chat-buffer
+ (insert "abandoned-draft")
+ (let ((called nil))
+ (cl-letf (((symbol-function 'quit-window)
+ (lambda (&rest _) (setq called t))))
+ (signel--cancel-input))
+ (should called))))
+
+(ert-deftest test-signel-cancel-input-preserves-buffer ()
+ "Normal: cancel does not kill the buffer; chat history (prompt + prior
+content above the input marker) survives so reopening the contact lands
+in the same buffer."
+ (test-signel-cancel--with-chat-buffer
+ (insert "abandoned-draft")
+ (let ((buf (current-buffer)))
+ (cl-letf (((symbol-function 'quit-window) (lambda (&rest _) nil)))
+ (signel--cancel-input))
+ (should (buffer-live-p buf)))))
+
+(ert-deftest test-signel-chat-mode-binds-c-c-c-k-to-cancel ()
+ "Normal: `signel-chat-mode' binds C-c C-k to `signel--cancel-input' so
+the documented cancel gesture reaches the handler."
+ (with-temp-buffer
+ (signel-chat-mode)
+ (should (eq (lookup-key (current-local-map) (kbd "C-c C-k"))
+ #'signel--cancel-input))))
+
+(provide 'test-signel-cancel-input)
+;;; test-signel-cancel-input.el ends here