From 735ecf082273c0cba2f5c5dd25876e2ccd83b0f7 Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Wed, 29 Apr 2026 23:59:30 -0500 Subject: test: add gloss-display test suite (red phase) Four test files covering the gloss-display public API and pure helpers. All 23 tests fail at this commit because the implementation is still a stub. Format-candidate gets full N/B/E coverage. Render-entry gets the pure-helper treatment. Pick-definition mocks completing-read at the boundary. Show-entry has a single smoke test. --- tests/test-gloss-display--pick-definition.el | 85 ++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 tests/test-gloss-display--pick-definition.el (limited to 'tests/test-gloss-display--pick-definition.el') diff --git a/tests/test-gloss-display--pick-definition.el b/tests/test-gloss-display--pick-definition.el new file mode 100644 index 0000000..0c11fe1 --- /dev/null +++ b/tests/test-gloss-display--pick-definition.el @@ -0,0 +1,85 @@ +;;; test-gloss-display--pick-definition.el --- Tests for gloss-display-pick-definition -*- lexical-binding: t -*- + +;; SPDX-License-Identifier: GPL-3.0-or-later + +;;; Commentary: +;; Tests for `gloss-display-pick-definition' covering Normal/Boundary/Error +;; cases. The picker mocks `completing-read' at the boundary; the function +;; under test is responsible for building the alist of formatted-string -> +;; plist and mapping the user's choice back to the chosen plist. + +;;; Code: + +(require 'ert) +(require 'cl-lib) +(require 'gloss-display) + +(defmacro gloss-test--with-completing-read (return-value &rest body) + "Run BODY with `completing-read' mocked to return RETURN-VALUE. +If RETURN-VALUE is the symbol `quit', simulate the user pressing C-g +by signalling `quit' inside the mock." + (declare (indent 1) (debug t)) + `(cl-letf (((symbol-function 'completing-read) + (lambda (&rest _args) + ,(if (eq return-value 'quit) + '(signal 'quit nil) + return-value)))) + ,@body)) + +(ert-deftest test-gloss-display-pick-definition-normal-pick-first-of-three () + "Normal: choosing the first row returns the first definition plist." + (let* ((def1 '(:source wiktionary :text "First sense.")) + (def2 '(:source wiktionary :text "Second sense.")) + (def3 '(:source wiktionary :text "Third sense.")) + (defs (list def1 def2 def3)) + (chosen-row (gloss-display--format-candidate def1))) + (gloss-test--with-completing-read chosen-row + (should (equal (gloss-display-pick-definition "term" defs) def1))))) + +(ert-deftest test-gloss-display-pick-definition-normal-pick-middle-of-three () + "Normal: choosing the middle row returns the middle definition plist." + (let* ((def1 '(:source wiktionary :text "First sense.")) + (def2 '(:source wiktionary :text "Second sense.")) + (def3 '(:source wiktionary :text "Third sense.")) + (defs (list def1 def2 def3)) + (chosen-row (gloss-display--format-candidate def2))) + (gloss-test--with-completing-read chosen-row + (should (equal (gloss-display-pick-definition "term" defs) def2))))) + +(ert-deftest test-gloss-display-pick-definition-boundary-single-definition () + "Boundary: a single-definition list still returns that plist." + (let* ((def '(:source wiktionary :text "Only sense.")) + (chosen-row (gloss-display--format-candidate def))) + (gloss-test--with-completing-read chosen-row + (should (equal (gloss-display-pick-definition "term" (list def)) + def))))) + +(ert-deftest test-gloss-display-pick-definition-boundary-empty-list () + "Boundary: an empty definition list returns nil without prompting." + (let ((completing-read-called nil)) + (cl-letf (((symbol-function 'completing-read) + (lambda (&rest _args) + (setq completing-read-called t) ""))) + (should-not (gloss-display-pick-definition "term" nil)) + (should-not completing-read-called)))) + +(ert-deftest test-gloss-display-pick-definition-error-quit-returns-nil () + "Error: C-g during the picker (quit signal) returns nil, not propagate." + (let ((def '(:source wiktionary :text "Only sense."))) + (gloss-test--with-completing-read quit + (should-not (gloss-display-pick-definition "term" (list def)))))) + +(ert-deftest test-gloss-display-pick-definition-prompt-mentions-term () + "Normal: the completing-read prompt names the term being disambiguated." + (let* ((captured-prompt nil) + (def '(:source wiktionary :text "Only sense.")) + (chosen-row (gloss-display--format-candidate def))) + (cl-letf (((symbol-function 'completing-read) + (lambda (prompt &rest _args) + (setq captured-prompt prompt) + chosen-row))) + (gloss-display-pick-definition "anaphora" (list def)) + (should (string-match-p "anaphora" captured-prompt))))) + +(provide 'test-gloss-display--pick-definition) +;;; test-gloss-display--pick-definition.el ends here -- cgit v1.2.3