emacs/test/lisp/emacs-lisp/shortdoc-tests.el

114 lines
4.9 KiB
EmacsLisp
Raw Normal View History

;;; shortdoc-tests.el --- tests for shortdoc.el -*- lexical-binding: t -*-
;; Copyright (C) 2021-2025 Free Software Foundation, Inc.
;; This file is part of GNU Emacs.
;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Code:
(require 'ert)
(require 'shortdoc)
(require 'subr-x) ; `string-pad' in shortdoc group needed at run time
(require 'regexp-opt) ; `regexp-opt-charset' not autoloaded
(defun shortdoc-tests--tree-contains (tree fun)
"Whether TREE contains a call to FUN."
(and (proper-list-p tree)
(or (eq (car tree) fun)
(cl-some (lambda (x) (shortdoc-tests--tree-contains x fun)) tree))))
(ert-deftest shortdoc-examples ()
"Check that each example actually contains the corresponding form."
(dolist (group shortdoc--groups)
(dolist (item group)
(when (consp item)
(let ((fun (car item))
(props (cdr item)))
(while props
(when (memq (car props) '(:eval :no-eval :no-eval* :no-value))
(let* ((example (cadr props))
(expr (cond
((consp example) example)
((stringp example) (read example)))))
(should (shortdoc-tests--tree-contains expr fun))))
(setq props (cddr props))))))))
(ert-deftest shortdoc-all-functions-fboundp ()
"Check that all functions listed in shortdoc groups are `fboundp'."
(dolist (group shortdoc--groups)
(dolist (item group)
(when (consp item)
(let ((fun (car item)))
(should (fboundp fun)))))))
(ert-deftest shortdoc-all-groups-work ()
"Test that all defined shortdoc groups display correctly."
Delete redundant lambdas around unary functions This is not just stylistic, but also slightly faster. These are all regular defuns, of course, as this won't work with macros and defsubsts. * lisp/calc/calc-nlfit.el (math-nlfit-fit-curve) (calc-fit-hubbert-linear-curve): * lisp/calendar/cal-tex.el (cal-tex-latexify-list): * lisp/calendar/todo-mode.el (todo-sort): * lisp/cedet/semantic/ctxt.el (semantic-ctxt-end-of-symbol-default) (semantic-ctxt-current-symbol-default): * lisp/cedet/semantic/symref.el (semantic-symref-result-get-files): * lisp/cedet/semantic/texi.el (semantic-texi-command-completion-list): * lisp/descr-text.el (describe-char): * lisp/emacs-lisp/eieio-datadebug.el (data-debug-add-specialized-thing): * lisp/emacs-lisp/rmc.el (read-multiple-choice--short-answers): * lisp/eshell/em-pred.el (eshell-modifier-alist): * lisp/gnus/gnus-cache.el (gnus-cache-articles-in-group): * lisp/gnus/gnus-dired.el (gnus-dired-attach): * lisp/help-mode.el (help-package-def): * lisp/ibuf-ext.el (ibuffer-mark-modified-buffers): * lisp/image/image-dired.el: * lisp/international/quail.el (quail-keyseq-translate) (quail-get-translations): * lisp/isearch.el (isearch-pre-command-hook) (search-within-boundaries): * lisp/mail/supercite.el (sc-ask): * lisp/mh-e/mh-e.el (mh-variant-set): * lisp/net/rcirc.el (rcirc-nick-channels, rcirc-channel-nicks): (rcirc-browse-url): * lisp/obsolete/thumbs.el (thumbs-cleanup-thumbsdir): * lisp/org/org-agenda.el (org-agenda-filter-completion-function): * lisp/org/org-table.el (org-table-eval-formula): * lisp/org/org.el (org-set-regexps-and-options): * lisp/org/ox.el (org-export--get-inbuffer-options): * lisp/ses.el (ses-range): * lisp/textmodes/emacs-news-mode.el (emacs-news--buttonize): * lisp/textmodes/ispell.el (ispell-begin-tex-skip-regexp): * lisp/vc/vc-cvs.el (vc-cvs-stay-local-p): * lisp/window.el (window--state-get-1): * test/lisp/emacs-lisp/shortdoc-tests.el (shortdoc-all-groups-work): Delete redundant lambdas around unary functions. (Bug#66816)
2025-02-11 19:04:00 +01:00
(dolist (group (mapcar #'car shortdoc--groups))
(let ((buf-name (format "*Shortdoc %s*" group)) buf)
(unwind-protect
(progn
(shortdoc-display-group group)
(should (setq buf (get-buffer buf-name))))
(when buf
(kill-buffer buf))))))
(defun shortdoc-tests--to-ascii (x)
"Translate Unicode arrows to ASCII for making the test work everywhere."
(cond ((consp x)
(cons (shortdoc-tests--to-ascii (car x))
(shortdoc-tests--to-ascii (cdr x))))
((stringp x)
(thread-last x
(string-replace "" "=>")
(string-replace "" "->")))
(t x)))
(ert-deftest shortdoc-function-examples-test ()
"Test the extraction of usage examples of some Elisp functions."
(should (equal '((list . "(delete 2 (list 1 2 3 4))\n => (1 3 4)\n (delete \"a\" (list \"a\" \"b\" \"c\" \"d\"))\n => (\"b\" \"c\" \"d\")"))
(shortdoc-tests--to-ascii
(shortdoc-function-examples 'delete))))
(should (equal '((alist . "(assq 'foo '((foo . bar) (zot . baz)))\n => (foo . bar)")
(list . "(assq 'b '((a . 1) (b . 2)))\n => (b . 2)"))
(shortdoc-tests--to-ascii
(shortdoc-function-examples 'assq))))
(should (equal '((regexp . "(string-match-p \"^[fo]+\" \"foobar\")\n => 0"))
(shortdoc-tests--to-ascii
(shortdoc-function-examples 'string-match-p)))))
(ert-deftest shortdoc-help-fns-examples-function-test ()
"Test that `shortdoc-help-fns-examples-function' correctly prints Lisp function examples."
(with-temp-buffer
(shortdoc-help-fns-examples-function 'string-fill)
(should (equal "\n Examples:\n\n (string-fill \"Three short words\" 12)\n => \"Three short\\nwords\"\n (string-fill \"Long-word\" 3)\n => \"Long-word\"\n\n"
(shortdoc-tests--to-ascii
(buffer-substring-no-properties (point-min) (point-max)))))
(erase-buffer)
(shortdoc-help-fns-examples-function 'assq)
(should (equal "\n Examples:\n\n (assq 'foo '((foo . bar) (zot . baz)))\n => (foo . bar)\n\n (assq 'b '((a . 1) (b . 2)))\n => (b . 2)\n\n"
(shortdoc-tests--to-ascii
(buffer-substring-no-properties (point-min) (point-max)))))
(erase-buffer)
(shortdoc-help-fns-examples-function 'string-trim)
(should (equal "\n Example:\n\n (string-trim \" foo \")\n => \"foo\"\n\n"
(shortdoc-tests--to-ascii
(buffer-substring-no-properties (point-min)
(point-max)))))))
(provide 'shortdoc-tests)
;;; shortdoc-tests.el ends here