123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379 |
- ;;; simple-test.el --- Tests for simple.el -*- lexical-binding: t; -*-
- ;; Copyright (C) 2015-2017 Free Software Foundation, Inc.
- ;; Author: Artur Malabarba <bruce.connor.am@gmail.com>
- ;; This program 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.
- ;; This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
- ;;; Code:
- (require 'ert)
- (defmacro simple-test--dummy-buffer (&rest body)
- (declare (indent 0)
- (debug t))
- `(with-temp-buffer
- (emacs-lisp-mode)
- (setq indent-tabs-mode nil)
- (insert "(a b")
- (save-excursion (insert " c d)"))
- ,@body
- (cons (buffer-substring (point-min) (point))
- (buffer-substring (point) (point-max)))))
- (defmacro simple-test--transpositions (&rest body)
- (declare (indent 0)
- (debug t))
- `(with-temp-buffer
- (emacs-lisp-mode)
- (insert "(s1) (s2) (s3) (s4) (s5)")
- (backward-sexp 1)
- ,@body
- (cons (buffer-substring (point-min) (point))
- (buffer-substring (point) (point-max)))))
- ;;; `newline'
- (ert-deftest newline ()
- (should-error (newline -1))
- (should (equal (simple-test--dummy-buffer (newline 1))
- '("(a b\n" . " c d)")))
- (should (equal (simple-test--dummy-buffer
- (electric-indent-mode -1)
- (call-interactively #'newline))
- '("(a b\n" . " c d)")))
- (should (equal (simple-test--dummy-buffer
- (let ((current-prefix-arg 5))
- (call-interactively #'newline)))
- '("(a b\n\n\n\n\n" . " c d)")))
- (should (equal (simple-test--dummy-buffer (newline 5))
- '("(a b\n\n\n\n\n" . " c d)")))
- (should (equal (simple-test--dummy-buffer
- (forward-char 1)
- (newline 1))
- '("(a b \n" . "c d)"))))
- (ert-deftest newline-indent ()
- (should (equal (simple-test--dummy-buffer
- (electric-indent-local-mode 1)
- (newline 1))
- '("(a b\n" . " c d)")))
- (should (equal (simple-test--dummy-buffer
- (electric-indent-local-mode 1)
- (newline 1 'interactive))
- '("(a b\n " . "c d)")))
- (should (equal (simple-test--dummy-buffer
- (electric-indent-local-mode 1)
- (let ((current-prefix-arg nil))
- (call-interactively #'newline)
- (call-interactively #'newline)))
- '("(a b\n\n " . "c d)")))
- (should (equal (simple-test--dummy-buffer
- (electric-indent-local-mode 1)
- (newline 5 'interactive))
- '("(a b\n\n\n\n\n " . "c d)")))
- (should (equal (simple-test--dummy-buffer
- (electric-indent-local-mode 1)
- (let ((current-prefix-arg 5))
- (call-interactively #'newline)))
- '("(a b\n\n\n\n\n " . "c d)")))
- (should (equal (simple-test--dummy-buffer
- (forward-char 1)
- (electric-indent-local-mode 1)
- (newline 1 'interactive))
- '("(a b\n " . "c d)"))))
- ;;; `open-line'
- (ert-deftest open-line ()
- (should-error (open-line -1))
- (should-error (open-line))
- (should (equal (simple-test--dummy-buffer (open-line 1))
- '("(a b" . "\n c d)")))
- (should (equal (simple-test--dummy-buffer
- (electric-indent-mode -1)
- (call-interactively #'open-line))
- '("(a b" . "\n c d)")))
- (should (equal (simple-test--dummy-buffer
- (let ((current-prefix-arg 5))
- (call-interactively #'open-line)))
- '("(a b" . "\n\n\n\n\n c d)")))
- (should (equal (simple-test--dummy-buffer (open-line 5))
- '("(a b" . "\n\n\n\n\n c d)")))
- (should (equal (simple-test--dummy-buffer
- (forward-char 1)
- (open-line 1))
- '("(a b " . "\nc d)"))))
- (ert-deftest open-line-margin-and-prefix ()
- (should (equal (simple-test--dummy-buffer
- (let ((left-margin 10))
- (open-line 3)))
- '("(a b" . "\n\n\n c d)")))
- (should (equal (simple-test--dummy-buffer
- (forward-line 0)
- (let ((left-margin 2))
- (open-line 1)))
- '(" " . "\n (a b c d)")))
- (should (equal (simple-test--dummy-buffer
- (let ((fill-prefix "- - "))
- (open-line 1)))
- '("(a b" . "\n c d)")))
- (should (equal (simple-test--dummy-buffer
- (forward-line 0)
- (let ((fill-prefix "- - "))
- (open-line 1)))
- '("- - " . "\n(a b c d)"))))
- ;; For a while, from 24 Oct - 21 Nov 2015, `open-line' in the Emacs
- ;; development tree became sensitive to `electric-indent-mode', which
- ;; it had not been before. This sensitivity was reverted for the
- ;; Emacs 25 release, so it could be discussed further (see thread
- ;; "Questioning the new behavior of `open-line'." on the Emacs Devel
- ;; mailing list, and bug #21884).
- (ert-deftest open-line-indent ()
- (should (equal (simple-test--dummy-buffer
- (electric-indent-local-mode 1)
- (open-line 1))
- '("(a b" . "\n c d)")))
- (should (equal (simple-test--dummy-buffer
- (electric-indent-local-mode 1)
- (open-line 1))
- '("(a b" . "\n c d)")))
- (should (equal (simple-test--dummy-buffer
- (electric-indent-local-mode 1)
- (let ((current-prefix-arg nil))
- (call-interactively #'open-line)
- (call-interactively #'open-line)))
- '("(a b" . "\n\n c d)")))
- (should (equal (simple-test--dummy-buffer
- (electric-indent-local-mode 1)
- (open-line 5))
- '("(a b" . "\n\n\n\n\n c d)")))
- (should (equal (simple-test--dummy-buffer
- (electric-indent-local-mode 1)
- (let ((current-prefix-arg 5))
- (call-interactively #'open-line)))
- '("(a b" . "\n\n\n\n\n c d)")))
- (should (equal (simple-test--dummy-buffer
- (forward-char 1)
- (electric-indent-local-mode 1)
- (open-line 1))
- '("(a b " . "\nc d)"))))
- ;; From 24 Oct - 21 Nov 2015, `open-line' took a second argument
- ;; INTERACTIVE and ran `post-self-insert-hook' if the argument was
- ;; true. This test tested that. Currently, however, `open-line'
- ;; does not run run `post-self-insert-hook' at all, so for now
- ;; this test just makes sure that it doesn't.
- (ert-deftest open-line-hook ()
- (let* ((x 0)
- (inc (lambda () (setq x (1+ x)))))
- (simple-test--dummy-buffer
- (add-hook 'post-self-insert-hook inc nil 'local)
- (open-line 1))
- (should (= x 0))
- (simple-test--dummy-buffer
- (add-hook 'post-self-insert-hook inc nil 'local)
- (open-line 1))
- (should (= x 0))
- (unwind-protect
- (progn
- (add-hook 'post-self-insert-hook inc)
- (simple-test--dummy-buffer
- (open-line 1))
- (should (= x 0))
- (simple-test--dummy-buffer
- (open-line 10))
- (should (= x 0)))
- (remove-hook 'post-self-insert-hook inc))))
- ;;; `delete-trailing-whitespace'
- (ert-deftest simple-delete-trailing-whitespace--bug-21766 ()
- "Test bug#21766: delete-whitespace sometimes deletes non-whitespace."
- (defvar python-indent-guess-indent-offset) ; to avoid a warning
- (let ((python (featurep 'python))
- (python-indent-guess-indent-offset nil)
- (delete-trailing-lines t))
- (unwind-protect
- (with-temp-buffer
- (python-mode)
- (insert (concat "query = \"\"\"WITH filtered AS \n"
- "WHERE \n"
- "\"\"\".format(fv_)\n"
- "\n"
- "\n"))
- (delete-trailing-whitespace)
- (should (string-equal (buffer-string)
- (concat "query = \"\"\"WITH filtered AS\n"
- "WHERE\n"
- "\"\"\".format(fv_)\n"))))
- ;; Let's clean up if running interactive
- (unless (or noninteractive python)
- (unload-feature 'python)))))
- (ert-deftest simple-delete-trailing-whitespace--formfeeds ()
- "Test formfeeds are not deleted but whitespace past them is."
- (with-temp-buffer
- (with-syntax-table (make-syntax-table)
- (modify-syntax-entry ?\f " ") ; Make sure \f is whitespace
- (insert " \f \n \f \f \n\nlast\n")
- (delete-trailing-whitespace)
- (should (string-equal (buffer-string) " \f\n \f \f\n\nlast\n"))
- (should (equal ?\s (char-syntax ?\f)))
- (should (equal ?\s (char-syntax ?\n))))))
- ;;; auto-boundary tests
- (ert-deftest undo-auto-boundary-timer ()
- (should
- undo-auto-current-boundary-timer))
- (ert-deftest undo-auto--boundaries-added ()
- ;; The change in the buffer should have caused addition
- ;; to undo-auto--undoably-changed-buffers.
- (should
- (with-temp-buffer
- (setq buffer-undo-list nil)
- (insert "hello")
- (member (current-buffer) undo-auto--undoably-changed-buffers)))
- ;; The head of buffer-undo-list should be the insertion event, and
- ;; therefore not nil
- (should
- (with-temp-buffer
- (setq buffer-undo-list nil)
- (insert "hello")
- (car buffer-undo-list)))
- ;; Now the head of the buffer-undo-list should be a boundary and so
- ;; nil. We have to call auto-boundary explicitly because we are out
- ;; of the command loop
- (should-not
- (with-temp-buffer
- (setq buffer-undo-list nil)
- (insert "hello")
- (car buffer-undo-list)
- (undo-auto--boundaries 'test))))
- ;;; Transposition with negative args (bug#20698, bug#21885)
- (ert-deftest simple-transpose-subr ()
- (should (equal (simple-test--transpositions (transpose-sexps -1))
- '("(s1) (s2) (s4)" . " (s3) (s5)")))
- (should (equal (simple-test--transpositions (transpose-sexps -2))
- '("(s1) (s4)" . " (s2) (s3) (s5)"))))
- ;; Test for a regression introduced by undo-auto--boundaries changes.
- ;; https://lists.gnu.org/archive/html/emacs-devel/2015-11/msg01652.html
- (defun undo-test-kill-c-a-then-undo ()
- (with-temp-buffer
- (switch-to-buffer (current-buffer))
- (setq buffer-undo-list nil)
- (insert "a\nb\n\c\n")
- (goto-char (point-max))
- ;; We use a keyboard macro because it adds undo events in the same
- ;; way as if a user were involved.
- (kmacro-call-macro nil nil nil
- [left
- ;; Delete "c"
- backspace
- left left left
- ;; Delete "a"
- backspace
- ;; C-/ or undo
- 67108911
- ])
- (point)))
- (defun undo-test-point-after-forward-kill ()
- (with-temp-buffer
- (switch-to-buffer (current-buffer))
- (setq buffer-undo-list nil)
- (insert "kill word forward")
- ;; Move to word "word".
- (goto-char 6)
- (kmacro-call-macro nil nil nil
- [
- ;; kill-word
- C-delete
- ;; undo
- 67108911
- ])
- (point)))
- (ert-deftest undo-point-in-wrong-place ()
- (should
- ;; returns 5 with the bug
- (= 2
- (undo-test-kill-c-a-then-undo)))
- (should
- (= 6
- (undo-test-point-after-forward-kill))))
- (defmacro simple-test-undo-with-switched-buffer (buffer &rest body)
- (declare (indent 1) (debug t))
- (let ((before-buffer (make-symbol "before-buffer")))
- `(let ((,before-buffer (current-buffer)))
- (unwind-protect
- (progn
- (switch-to-buffer ,buffer)
- ,@body)
- (switch-to-buffer ,before-buffer)))))
- ;; This tests for a regression in emacs 25.0 see bug #23632
- (ert-deftest simple-test-undo-extra-boundary-in-tex ()
- (should
- (string=
- ""
- (simple-test-undo-with-switched-buffer
- "temp.tex"
- (latex-mode)
- ;; This macro calls `latex-insert-block'
- (execute-kbd-macro
- (read-kbd-macro
- "
- C-c C-o ;; latex-insert-block
- RET ;; newline
- C-/ ;; undo
- "
- ))
- (buffer-substring-no-properties
- (point-min)
- (point-max))))))
- (ert-deftest missing-record-point-in-undo ()
- "Check point is being restored correctly.
- See Bug#21722."
- (should
- (= 5
- (with-temp-buffer
- (generate-new-buffer " *temp*")
- (emacs-lisp-mode)
- (setq buffer-undo-list nil)
- (insert "(progn (end-of-line) (insert \"hello\"))")
- (beginning-of-line)
- (forward-char 4)
- (undo-boundary)
- (eval-defun nil)
- (undo-boundary)
- (undo)
- (point)))))
- (provide 'simple-test)
- ;;; simple-test.el ends here
|