mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-12-21 10:24:55 +00:00
1dd4f26ab6
ef33bc7
Spelling and grammar fixes9c3dbab
Fix copyright years by hand0e96320
Update copyright year to 2016
316 lines
11 KiB
EmacsLisp
316 lines
11 KiB
EmacsLisp
;;; simple-test.el --- Tests for simple.el -*- lexical-binding: t; -*-
|
||
|
||
;; Copyright (C) 2015-2016 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 ()
|
||
"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 (equal (count-lines (point-min) (point-max)) 3)))
|
||
;; Let's clean up if running interactive
|
||
(unless (or noninteractive python)
|
||
(unload-feature 'python)))))
|
||
|
||
|
||
;;; 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))))
|
||
|
||
|
||
(provide 'simple-test)
|
||
;;; simple-test.el ends here
|