2015-10-24 23:43:06 +01:00
|
|
|
|
;;; simple-test.el --- Tests for simple.el -*- lexical-binding: t; -*-
|
|
|
|
|
|
2019-01-01 00:59:58 +00:00
|
|
|
|
;; Copyright (C) 2015-2019 Free Software Foundation, Inc.
|
2015-10-24 23:43:06 +01:00
|
|
|
|
|
|
|
|
|
;; 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
|
2017-09-13 15:52:52 -07:00
|
|
|
|
;; along with this program. If not, see <https://www.gnu.org/licenses/>.
|
2015-10-24 23:43:06 +01:00
|
|
|
|
|
|
|
|
|
;;; Code:
|
|
|
|
|
|
|
|
|
|
(require 'ert)
|
2017-04-23 22:21:42 -04:00
|
|
|
|
(eval-when-compile (require 'cl-lib))
|
2015-10-24 23:43:06 +01:00
|
|
|
|
|
2019-03-27 15:13:25 +00:00
|
|
|
|
(defun simple-test--buffer-substrings ()
|
|
|
|
|
"Return cons of buffer substrings before and after point."
|
|
|
|
|
(cons (buffer-substring (point-min) (point))
|
|
|
|
|
(buffer-substring (point) (point-max))))
|
|
|
|
|
|
2015-10-24 23:43:06 +01:00
|
|
|
|
(defmacro simple-test--dummy-buffer (&rest body)
|
|
|
|
|
(declare (indent 0)
|
|
|
|
|
(debug t))
|
|
|
|
|
`(with-temp-buffer
|
|
|
|
|
(emacs-lisp-mode)
|
2015-10-26 21:25:10 +02:00
|
|
|
|
(setq indent-tabs-mode nil)
|
2015-10-24 23:43:06 +01:00
|
|
|
|
(insert "(a b")
|
|
|
|
|
(save-excursion (insert " c d)"))
|
|
|
|
|
,@body
|
2019-03-27 15:13:25 +00:00
|
|
|
|
(with-no-warnings (simple-test--buffer-substrings))))
|
2015-10-24 23:43:06 +01:00
|
|
|
|
|
2017-04-23 22:21:42 -04:00
|
|
|
|
|
|
|
|
|
;;; `transpose-sexps'
|
2015-11-13 14:09:35 +01:00
|
|
|
|
(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
|
2019-03-27 15:13:25 +00:00
|
|
|
|
(simple-test--buffer-substrings)))
|
2015-11-13 14:09:35 +01:00
|
|
|
|
|
2017-04-23 22:21:42 -04:00
|
|
|
|
;;; 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)"))))
|
|
|
|
|
|
2015-10-24 23:43:06 +01:00
|
|
|
|
|
|
|
|
|
;;; `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)"))))
|
|
|
|
|
|
2015-11-21 22:50:05 -06:00
|
|
|
|
;; For a while, from 24 Oct - 21 Nov 2015, `open-line' in the Emacs
|
Revert `open-line' electric-indent sensitivity
* lisp/simple.el (open-line): Remove electric indent code.
(electric-indent-just-newline): Don't declare.
* test/automated/simple-test.el (open-line-indent): Adjust test.
This partly reverts Artur Malabarba's change that added electric
indent sensitivity to `open-line' (Oct 24 22:26:27 2015 +0100, git
commit bd4f04f86), and adjusts a new test he added right afterwards
(Sat Oct 24 23:43:06 2015 +0100, git commit 207f235e3) accordingly.
However, the new INTERACTIVE argument to `open-line', which he also
added in the first commit, is not reverted here.
See the thread "Questioning the new behavior of `open-line'." on the
Emacs Devel mailing list, and in particular this message:
From: Artur Malabarba
Subject: Re: Questioning the new behavior of `open-line'.
To: Karl Fogel
Cc: David Kastrup, Pierpaolo Bernardi, emacs-devel
Date: Wed, 18 Nov 2015 21:03:58 +0000
Message-ID: \
<CAAdUY-KN06pvCMy5bt3+Buk3yeKjf6n9iB2FaSTTOPpCqPwyhA@mail.gmail.com>
https://lists.gnu.org/archive/html/emacs-devel/2015-11/msg01707.html
2015-11-19 17:32:37 -06:00
|
|
|
|
;; 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
|
2015-11-21 22:50:05 -06:00
|
|
|
|
;; mailing list, and bug #21884).
|
2015-10-24 23:43:06 +01:00
|
|
|
|
(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)
|
2015-11-21 22:50:05 -06:00
|
|
|
|
(open-line 1))
|
|
|
|
|
'("(a b" . "\n c d)")))
|
2015-10-24 23:43:06 +01:00
|
|
|
|
(should (equal (simple-test--dummy-buffer
|
|
|
|
|
(electric-indent-local-mode 1)
|
|
|
|
|
(let ((current-prefix-arg nil))
|
|
|
|
|
(call-interactively #'open-line)
|
|
|
|
|
(call-interactively #'open-line)))
|
2015-11-21 22:50:05 -06:00
|
|
|
|
'("(a b" . "\n\n c d)")))
|
2015-10-24 23:43:06 +01:00
|
|
|
|
(should (equal (simple-test--dummy-buffer
|
|
|
|
|
(electric-indent-local-mode 1)
|
2015-11-21 22:50:05 -06:00
|
|
|
|
(open-line 5))
|
|
|
|
|
'("(a b" . "\n\n\n\n\n c d)")))
|
2015-10-24 23:43:06 +01:00
|
|
|
|
(should (equal (simple-test--dummy-buffer
|
|
|
|
|
(electric-indent-local-mode 1)
|
|
|
|
|
(let ((current-prefix-arg 5))
|
|
|
|
|
(call-interactively #'open-line)))
|
2015-11-21 22:50:05 -06:00
|
|
|
|
'("(a b" . "\n\n\n\n\n c d)")))
|
2015-10-24 23:43:06 +01:00
|
|
|
|
(should (equal (simple-test--dummy-buffer
|
|
|
|
|
(forward-char 1)
|
|
|
|
|
(electric-indent-local-mode 1)
|
2015-11-21 22:50:05 -06:00
|
|
|
|
(open-line 1))
|
|
|
|
|
'("(a b " . "\nc d)"))))
|
2015-10-24 23:43:06 +01:00
|
|
|
|
|
2015-11-21 22:50:05 -06:00
|
|
|
|
;; 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'
|
2017-10-09 22:53:19 -07:00
|
|
|
|
;; does not run `post-self-insert-hook' at all, so for now
|
2015-11-21 22:50:05 -06:00
|
|
|
|
;; this test just makes sure that it doesn't.
|
2015-10-24 23:43:06 +01:00
|
|
|
|
(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)
|
2015-11-21 22:50:05 -06:00
|
|
|
|
(open-line 1))
|
|
|
|
|
(should (= x 0))
|
2015-10-24 23:43:06 +01:00
|
|
|
|
|
|
|
|
|
(unwind-protect
|
|
|
|
|
(progn
|
|
|
|
|
(add-hook 'post-self-insert-hook inc)
|
|
|
|
|
(simple-test--dummy-buffer
|
|
|
|
|
(open-line 1))
|
2015-11-21 22:50:05 -06:00
|
|
|
|
(should (= x 0))
|
2015-10-24 23:43:06 +01:00
|
|
|
|
(simple-test--dummy-buffer
|
2015-11-21 22:50:05 -06:00
|
|
|
|
(open-line 10))
|
|
|
|
|
(should (= x 0)))
|
2015-10-24 23:43:06 +01:00
|
|
|
|
(remove-hook 'post-self-insert-hook inc))))
|
|
|
|
|
|
2019-03-22 16:14:50 -07:00
|
|
|
|
|
|
|
|
|
;;; `delete-indentation'
|
2019-03-27 15:13:25 +00:00
|
|
|
|
|
2019-03-22 16:14:50 -07:00
|
|
|
|
(ert-deftest simple-delete-indentation-no-region ()
|
2019-03-27 15:13:25 +00:00
|
|
|
|
"Test `delete-indentation' when no mark is set; see bug#35021."
|
|
|
|
|
(with-temp-buffer
|
|
|
|
|
(insert " first \n second \n third \n fourth ")
|
|
|
|
|
(should-not (mark t))
|
|
|
|
|
;; Without prefix argument.
|
|
|
|
|
(should-not (call-interactively #'delete-indentation))
|
|
|
|
|
(should (equal (simple-test--buffer-substrings)
|
|
|
|
|
'(" first \n second \n third" . " fourth ")))
|
|
|
|
|
(should-not (call-interactively #'delete-indentation))
|
|
|
|
|
(should (equal (simple-test--buffer-substrings)
|
|
|
|
|
'(" first \n second" . " third fourth ")))
|
|
|
|
|
;; With prefix argument.
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(let ((current-prefix-arg '(4)))
|
|
|
|
|
(should-not (call-interactively #'delete-indentation)))
|
|
|
|
|
(should (equal (simple-test--buffer-substrings)
|
|
|
|
|
'(" first" . " second third fourth ")))))
|
2019-03-22 16:14:50 -07:00
|
|
|
|
|
|
|
|
|
(ert-deftest simple-delete-indentation-inactive-region ()
|
2019-03-27 15:13:25 +00:00
|
|
|
|
"Test `delete-indentation' with an inactive region."
|
|
|
|
|
(with-temp-buffer
|
|
|
|
|
(insert " first \n second \n third ")
|
|
|
|
|
(set-marker (mark-marker) (point-min))
|
|
|
|
|
(should (mark t))
|
|
|
|
|
(should-not (call-interactively #'delete-indentation))
|
|
|
|
|
(should (equal (simple-test--buffer-substrings)
|
|
|
|
|
'(" first \n second" . " third ")))))
|
|
|
|
|
|
|
|
|
|
(ert-deftest simple-delete-indentation-blank-line ()
|
|
|
|
|
"Test `delete-indentation' does not skip blank lines.
|
|
|
|
|
See bug#35036."
|
|
|
|
|
(with-temp-buffer
|
|
|
|
|
(insert "\n\n third \n \n \n sixth \n\n")
|
|
|
|
|
;; Without prefix argument.
|
|
|
|
|
(should-not (delete-indentation))
|
|
|
|
|
(should (equal (simple-test--buffer-substrings)
|
|
|
|
|
'("\n\n third \n \n \n sixth \n" . "")))
|
|
|
|
|
(should-not (delete-indentation))
|
|
|
|
|
(should (equal (simple-test--buffer-substrings)
|
|
|
|
|
'("\n\n third \n \n \n sixth" . "")))
|
|
|
|
|
(should-not (delete-indentation))
|
|
|
|
|
(should (equal (simple-test--buffer-substrings)
|
|
|
|
|
'("\n\n third \n \n" . "sixth")))
|
|
|
|
|
;; With prefix argument.
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(should-not (delete-indentation t))
|
|
|
|
|
(should (equal (simple-test--buffer-substrings)
|
|
|
|
|
'("" . "\n third \n \nsixth")))
|
|
|
|
|
(should-not (delete-indentation t))
|
|
|
|
|
(should (equal (simple-test--buffer-substrings)
|
|
|
|
|
'("" . "third \n \nsixth")))
|
|
|
|
|
(should-not (delete-indentation t))
|
|
|
|
|
(should (equal (simple-test--buffer-substrings)
|
|
|
|
|
'("third" . "\nsixth")))
|
|
|
|
|
(should-not (delete-indentation t))
|
|
|
|
|
(should (equal (simple-test--buffer-substrings)
|
|
|
|
|
'("third" . " sixth")))))
|
|
|
|
|
|
|
|
|
|
(ert-deftest simple-delete-indentation-boundaries ()
|
|
|
|
|
"Test `delete-indentation' motion at buffer boundaries."
|
|
|
|
|
(with-temp-buffer
|
|
|
|
|
(insert " first \n second \n third ")
|
|
|
|
|
;; Stay at EOB.
|
|
|
|
|
(should-not (delete-indentation t))
|
|
|
|
|
(should (equal (simple-test--buffer-substrings)
|
|
|
|
|
'(" first \n second \n third " . "")))
|
|
|
|
|
;; Stay at BOB.
|
|
|
|
|
(forward-line -1)
|
|
|
|
|
(save-restriction
|
|
|
|
|
(narrow-to-region (point) (line-end-position))
|
|
|
|
|
(should-not (delete-indentation))
|
|
|
|
|
(should (equal (simple-test--buffer-substrings)
|
|
|
|
|
'("" . " second ")))
|
|
|
|
|
;; Go to EOB.
|
|
|
|
|
(should-not (delete-indentation t))
|
|
|
|
|
(should (equal (simple-test--buffer-substrings)
|
|
|
|
|
'(" second " . ""))))
|
|
|
|
|
;; Go to BOB.
|
|
|
|
|
(end-of-line 0)
|
|
|
|
|
(should-not (delete-indentation))
|
|
|
|
|
(should (equal (simple-test--buffer-substrings)
|
|
|
|
|
'("" . " first \n second \n third ")))))
|
|
|
|
|
|
|
|
|
|
(ert-deftest simple-delete-indentation-region ()
|
|
|
|
|
"Test `delete-indentation' with an active region."
|
|
|
|
|
(with-temp-buffer
|
|
|
|
|
;; Empty region.
|
|
|
|
|
(insert " first ")
|
|
|
|
|
(should-not (delete-indentation nil (point) (point)))
|
|
|
|
|
(should (equal (simple-test--buffer-substrings)
|
|
|
|
|
'(" first " . "")))
|
|
|
|
|
;; Single line.
|
|
|
|
|
(should-not (delete-indentation
|
|
|
|
|
nil (line-beginning-position) (1- (point))))
|
|
|
|
|
(should (equal (simple-test--buffer-substrings)
|
|
|
|
|
'("" . " first ")))
|
|
|
|
|
(should-not (delete-indentation nil (1+ (point)) (line-end-position)))
|
|
|
|
|
(should (equal (simple-test--buffer-substrings)
|
|
|
|
|
'(" " . "first ")))
|
|
|
|
|
(should-not (delete-indentation
|
|
|
|
|
nil (line-beginning-position) (line-end-position)))
|
|
|
|
|
(should (equal (simple-test--buffer-substrings)
|
|
|
|
|
'("" . " first ")))
|
|
|
|
|
;; Multiple lines.
|
|
|
|
|
(goto-char (point-max))
|
|
|
|
|
(insert "\n second \n third \n fourth ")
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(should-not (delete-indentation
|
|
|
|
|
nil (line-end-position) (line-beginning-position 2)))
|
|
|
|
|
(should (equal (simple-test--buffer-substrings)
|
|
|
|
|
'(" first" . " second \n third \n fourth ")))
|
|
|
|
|
(should-not (delete-indentation
|
|
|
|
|
nil (point) (1+ (line-beginning-position 2))))
|
|
|
|
|
(should (equal (simple-test--buffer-substrings)
|
|
|
|
|
'(" first second" . " third \n fourth ")))
|
|
|
|
|
;; Prefix argument overrides region.
|
|
|
|
|
(should-not (delete-indentation t (point-min) (point)))
|
|
|
|
|
(should (equal (simple-test--buffer-substrings)
|
|
|
|
|
'(" first second third" . " fourth ")))))
|
|
|
|
|
|
|
|
|
|
(ert-deftest simple-delete-indentation-prefix ()
|
|
|
|
|
"Test `delete-indentation' with a fill prefix."
|
|
|
|
|
(with-temp-buffer
|
|
|
|
|
(insert "> first \n> second \n> third \n> fourth ")
|
|
|
|
|
(let ((fill-prefix ""))
|
|
|
|
|
(delete-indentation))
|
|
|
|
|
(should (equal (simple-test--buffer-substrings)
|
|
|
|
|
'("> first \n> second \n> third" . " > fourth ")))
|
|
|
|
|
(let ((fill-prefix "<"))
|
|
|
|
|
(delete-indentation))
|
|
|
|
|
(should (equal (simple-test--buffer-substrings)
|
|
|
|
|
'("> first \n> second" . " > third > fourth ")))
|
|
|
|
|
(let ((fill-prefix ">"))
|
|
|
|
|
(delete-indentation))
|
|
|
|
|
(should (equal (simple-test--buffer-substrings)
|
|
|
|
|
'("> first" . " second > third > fourth ")))))
|
2019-03-22 16:14:50 -07:00
|
|
|
|
|
2015-10-28 09:55:25 +01:00
|
|
|
|
|
|
|
|
|
;;; `delete-trailing-whitespace'
|
2016-06-21 16:52:52 +02:00
|
|
|
|
(ert-deftest simple-delete-trailing-whitespace--bug-21766 ()
|
2015-10-28 09:55:25 +01:00
|
|
|
|
"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)
|
2016-06-21 16:52:52 +02:00
|
|
|
|
(should (string-equal (buffer-string)
|
|
|
|
|
(concat "query = \"\"\"WITH filtered AS\n"
|
|
|
|
|
"WHERE\n"
|
|
|
|
|
"\"\"\".format(fv_)\n"))))
|
2015-10-28 09:55:25 +01:00
|
|
|
|
;; Let's clean up if running interactive
|
|
|
|
|
(unless (or noninteractive python)
|
|
|
|
|
(unload-feature 'python)))))
|
|
|
|
|
|
2016-06-21 16:52:52 +02:00
|
|
|
|
(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"))
|
2016-06-21 16:46:52 +02:00
|
|
|
|
(should (equal ?\s (char-syntax ?\f)))
|
|
|
|
|
(should (equal ?\s (char-syntax ?\n))))))
|
2016-06-21 16:52:52 +02:00
|
|
|
|
|
2017-04-23 22:21:42 -04:00
|
|
|
|
|
|
|
|
|
;;; undo auto-boundary tests
|
2015-12-08 00:01:31 -08:00
|
|
|
|
(ert-deftest undo-auto-boundary-timer ()
|
2015-11-12 22:18:59 +00:00
|
|
|
|
(should
|
2015-12-08 00:01:31 -08:00
|
|
|
|
undo-auto-current-boundary-timer))
|
2015-11-12 22:18:59 +00:00
|
|
|
|
|
|
|
|
|
(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")
|
|
|
|
|
(undo-auto--boundaries 'test))))
|
|
|
|
|
|
2015-11-19 15:57:55 +00:00
|
|
|
|
;; Test for a regression introduced by undo-auto--boundaries changes.
|
2017-11-25 22:45:41 -08:00
|
|
|
|
;; https://lists.gnu.org/r/emacs-devel/2015-11/msg01652.html
|
2015-11-19 15:57:55 +00:00
|
|
|
|
(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))))
|
|
|
|
|
|
2016-06-06 09:35:17 +01:00
|
|
|
|
(defmacro simple-test-undo-with-switched-buffer (buffer &rest body)
|
2016-06-30 22:06:00 +01:00
|
|
|
|
(declare (indent 1) (debug t))
|
2016-06-06 09:35:17 +01:00
|
|
|
|
(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))))))
|
|
|
|
|
|
2016-06-30 22:06:00 +01:00
|
|
|
|
(ert-deftest missing-record-point-in-undo ()
|
|
|
|
|
"Check point is being restored correctly.
|
2016-06-06 09:35:17 +01:00
|
|
|
|
|
2016-06-30 22:06:00 +01:00
|
|
|
|
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)))))
|
2015-11-19 15:57:55 +00:00
|
|
|
|
|
2017-04-23 22:21:42 -04:00
|
|
|
|
|
|
|
|
|
;;; `eval-expression'
|
|
|
|
|
|
|
|
|
|
(ert-deftest eval-expression-print-format-sym ()
|
|
|
|
|
(with-temp-buffer
|
|
|
|
|
(cl-letf (((symbol-function 'read--expression) (lambda (&rest _) t)))
|
|
|
|
|
(let ((current-prefix-arg '(4)))
|
|
|
|
|
(call-interactively #'eval-expression)
|
|
|
|
|
(should (equal (buffer-string) "t"))))))
|
|
|
|
|
|
|
|
|
|
(ert-deftest eval-expression-print-format-sym-echo ()
|
|
|
|
|
;; We can only check the echo area when running interactive.
|
|
|
|
|
(skip-unless (not noninteractive))
|
|
|
|
|
(with-temp-buffer
|
|
|
|
|
(cl-letf (((symbol-function 'read--expression) (lambda (&rest _) t)))
|
|
|
|
|
(let ((current-prefix-arg nil))
|
|
|
|
|
(message nil)
|
|
|
|
|
(call-interactively #'eval-expression)
|
|
|
|
|
(should (equal (current-message) "t"))))))
|
|
|
|
|
|
2017-04-23 22:30:20 -04:00
|
|
|
|
(ert-deftest eval-expression-print-format-small-int ()
|
|
|
|
|
(with-temp-buffer
|
|
|
|
|
(cl-letf (((symbol-function 'read--expression) (lambda (&rest _) ?A)))
|
|
|
|
|
(let ((current-prefix-arg '(4)))
|
|
|
|
|
(erase-buffer)
|
|
|
|
|
(call-interactively #'eval-expression)
|
|
|
|
|
(should (equal (buffer-string) "65")))
|
|
|
|
|
(let ((current-prefix-arg 0))
|
|
|
|
|
(erase-buffer)
|
|
|
|
|
(call-interactively #'eval-expression)
|
|
|
|
|
(should (equal (buffer-string) "65 (#o101, #x41, ?A)"))))))
|
|
|
|
|
|
|
|
|
|
(ert-deftest eval-expression-print-format-small-int-echo ()
|
|
|
|
|
(skip-unless (not noninteractive))
|
|
|
|
|
(with-temp-buffer
|
|
|
|
|
(cl-letf (((symbol-function 'read--expression) (lambda (&rest _) ?A)))
|
|
|
|
|
(let ((current-prefix-arg nil))
|
|
|
|
|
(message nil)
|
|
|
|
|
(call-interactively #'eval-expression)
|
|
|
|
|
(should (equal (current-message) "65 (#o101, #x41, ?A)"))))))
|
|
|
|
|
|
|
|
|
|
(ert-deftest eval-expression-print-format-large-int ()
|
|
|
|
|
(with-temp-buffer
|
|
|
|
|
(cl-letf (((symbol-function 'read--expression) (lambda (&rest _) ?B))
|
|
|
|
|
(eval-expression-print-maximum-character ?A))
|
|
|
|
|
(let ((current-prefix-arg '(4)))
|
|
|
|
|
(erase-buffer)
|
|
|
|
|
(call-interactively #'eval-expression)
|
|
|
|
|
(should (equal (buffer-string) "66")))
|
|
|
|
|
(let ((current-prefix-arg 0))
|
|
|
|
|
(erase-buffer)
|
|
|
|
|
(call-interactively #'eval-expression)
|
|
|
|
|
(should (equal (buffer-string) "66 (#o102, #x42)")))
|
|
|
|
|
(let ((current-prefix-arg -1))
|
|
|
|
|
(erase-buffer)
|
|
|
|
|
(call-interactively #'eval-expression)
|
|
|
|
|
(should (equal (buffer-string) "66 (#o102, #x42, ?B)"))))))
|
|
|
|
|
|
|
|
|
|
(ert-deftest eval-expression-print-format-large-int-echo ()
|
|
|
|
|
(skip-unless (not noninteractive))
|
|
|
|
|
(with-temp-buffer
|
|
|
|
|
(cl-letf (((symbol-function 'read--expression) (lambda (&rest _) ?B))
|
|
|
|
|
(eval-expression-print-maximum-character ?A))
|
|
|
|
|
(let ((current-prefix-arg nil))
|
|
|
|
|
(message nil)
|
|
|
|
|
(call-interactively #'eval-expression)
|
|
|
|
|
(should (equal (current-message) "66 (#o102, #x42)")))
|
|
|
|
|
(let ((current-prefix-arg '-))
|
|
|
|
|
(message nil)
|
|
|
|
|
(call-interactively #'eval-expression)
|
|
|
|
|
(should (equal (current-message) "66 (#o102, #x42, ?B)"))))))
|
|
|
|
|
|
2018-04-29 15:37:45 +01:00
|
|
|
|
(ert-deftest command-execute-prune-command-history ()
|
|
|
|
|
"Check that Bug#31211 is fixed."
|
|
|
|
|
(let ((history-length 1)
|
|
|
|
|
(command-history ()))
|
|
|
|
|
(dotimes (_ (1+ history-length))
|
|
|
|
|
(command-execute "" t))
|
|
|
|
|
(should (= (length command-history) history-length))))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;; `line-number-at-pos'
|
|
|
|
|
|
2017-04-09 12:46:57 +02:00
|
|
|
|
(ert-deftest line-number-at-pos-in-widen-buffer ()
|
|
|
|
|
(let ((target-line 3))
|
|
|
|
|
(with-temp-buffer
|
|
|
|
|
(insert "a\nb\nc\nd\n")
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(forward-line (1- target-line))
|
|
|
|
|
(should (equal (line-number-at-pos) target-line))
|
|
|
|
|
(should (equal (line-number-at-pos nil t) target-line)))))
|
|
|
|
|
|
|
|
|
|
(ert-deftest line-number-at-pos-in-narrow-buffer ()
|
|
|
|
|
(let ((target-line 3))
|
|
|
|
|
(with-temp-buffer
|
|
|
|
|
(insert "a\nb\nc\nd\n")
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(forward-line (1- target-line))
|
|
|
|
|
(narrow-to-region (line-beginning-position) (line-end-position))
|
|
|
|
|
(should (equal (line-number-at-pos) 1))
|
|
|
|
|
(should (equal (line-number-at-pos nil t) target-line)))))
|
|
|
|
|
|
|
|
|
|
(ert-deftest line-number-at-pos-keeps-restriction ()
|
|
|
|
|
(with-temp-buffer
|
|
|
|
|
(insert "a\nb\nc\nd\n")
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(forward-line 2)
|
|
|
|
|
(narrow-to-region (line-beginning-position) (line-end-position))
|
|
|
|
|
(should (equal (line-number-at-pos) 1))
|
|
|
|
|
(line-number-at-pos nil t)
|
|
|
|
|
(should (equal (line-number-at-pos) 1))))
|
|
|
|
|
|
|
|
|
|
(ert-deftest line-number-at-pos-keeps-point ()
|
|
|
|
|
(let (pos)
|
|
|
|
|
(with-temp-buffer
|
|
|
|
|
(insert "a\nb\nc\nd\n")
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(forward-line 2)
|
|
|
|
|
(setq pos (point))
|
|
|
|
|
(line-number-at-pos)
|
|
|
|
|
(line-number-at-pos nil t)
|
|
|
|
|
(should (equal pos (point))))))
|
|
|
|
|
|
|
|
|
|
(ert-deftest line-number-at-pos-when-passing-point ()
|
2018-03-09 15:04:59 -05:00
|
|
|
|
(with-temp-buffer
|
|
|
|
|
(insert "a\nb\nc\nd\n")
|
|
|
|
|
(should (equal (line-number-at-pos 1) 1))
|
|
|
|
|
(should (equal (line-number-at-pos 3) 2))
|
|
|
|
|
(should (equal (line-number-at-pos 5) 3))
|
|
|
|
|
(should (equal (line-number-at-pos 7) 4))))
|
2017-04-09 12:46:57 +02:00
|
|
|
|
|
2017-08-23 13:40:45 -04:00
|
|
|
|
|
|
|
|
|
;;; Auto fill.
|
|
|
|
|
|
|
|
|
|
(ert-deftest auto-fill-mode-no-break-before-length-of-fill-prefix ()
|
|
|
|
|
(with-temp-buffer
|
|
|
|
|
(setq-local fill-prefix " ")
|
|
|
|
|
(set-fill-column 5)
|
|
|
|
|
;; Shouldn't break after 'foo' (3 characters) when the next
|
2017-09-10 09:20:27 -07:00
|
|
|
|
;; line is indented >= to that, that wouldn't result in shorter
|
2017-08-23 13:40:45 -04:00
|
|
|
|
;; lines.
|
|
|
|
|
(insert "foo bar")
|
|
|
|
|
(do-auto-fill)
|
|
|
|
|
(should (string-equal (buffer-string) "foo bar"))))
|
|
|
|
|
|
2018-05-15 01:22:04 +09:00
|
|
|
|
|
|
|
|
|
;;; Shell command.
|
|
|
|
|
|
2018-01-29 22:31:50 +09:00
|
|
|
|
(ert-deftest simple-tests-async-shell-command-30280 ()
|
|
|
|
|
"Test for https://debbugs.gnu.org/30280 ."
|
|
|
|
|
(let* ((async-shell-command-buffer 'new-buffer)
|
|
|
|
|
(async-shell-command-display-buffer nil)
|
2018-05-15 01:22:04 +09:00
|
|
|
|
(base "name")
|
|
|
|
|
(first (buffer-name (generate-new-buffer base)))
|
|
|
|
|
(second (generate-new-buffer-name base))
|
|
|
|
|
;; `save-window-excursion' doesn't restore frame configurations.
|
|
|
|
|
(pop-up-frames nil)
|
2018-06-17 10:22:28 -07:00
|
|
|
|
(inhibit-message t)
|
|
|
|
|
(emacs (expand-file-name invocation-name invocation-directory)))
|
|
|
|
|
(skip-unless (file-executable-p emacs))
|
2018-05-15 01:22:04 +09:00
|
|
|
|
;; Let `shell-command' create the buffer as needed.
|
|
|
|
|
(kill-buffer first)
|
|
|
|
|
(unwind-protect
|
|
|
|
|
(save-window-excursion
|
|
|
|
|
;; One command has no output, the other does.
|
|
|
|
|
;; Removing the -eval argument also yields no output, but
|
|
|
|
|
;; then both commands exit simultaneously when
|
|
|
|
|
;; `accept-process-output' is called on the second command.
|
|
|
|
|
(dolist (form '("(sleep-for 8)" "(message \"\")"))
|
|
|
|
|
(async-shell-command (format "%s -Q -batch -eval '%s'"
|
2018-06-17 10:22:28 -07:00
|
|
|
|
emacs form)
|
2018-05-15 01:22:04 +09:00
|
|
|
|
first))
|
|
|
|
|
;; First command should neither have nor display output.
|
|
|
|
|
(let* ((buffer (get-buffer first))
|
|
|
|
|
(process (get-buffer-process buffer)))
|
|
|
|
|
(should (buffer-live-p buffer))
|
|
|
|
|
(should process)
|
|
|
|
|
(should (zerop (buffer-size buffer)))
|
|
|
|
|
(should (not (get-buffer-window buffer))))
|
|
|
|
|
;; Second command should both have and display output.
|
|
|
|
|
(let* ((buffer (get-buffer second))
|
|
|
|
|
(process (get-buffer-process buffer)))
|
|
|
|
|
(should (buffer-live-p buffer))
|
|
|
|
|
(should process)
|
|
|
|
|
(should (accept-process-output process 4 nil t))
|
|
|
|
|
(should (> (buffer-size buffer) 0))
|
|
|
|
|
(should (get-buffer-window buffer))))
|
|
|
|
|
(dolist (name (list first second))
|
|
|
|
|
(let* ((buffer (get-buffer name))
|
|
|
|
|
(process (and buffer (get-buffer-process buffer))))
|
|
|
|
|
(when process (delete-process process))
|
|
|
|
|
(when buffer (kill-buffer buffer)))))))
|
2018-01-29 22:31:50 +09:00
|
|
|
|
|
2015-10-24 23:43:06 +01:00
|
|
|
|
(provide 'simple-test)
|
|
|
|
|
;;; simple-test.el ends here
|