summaryrefslogtreecommitdiff
path: root/test/lisp/whitespace-tests.el
diff options
context:
space:
mode:
Diffstat (limited to 'test/lisp/whitespace-tests.el')
-rw-r--r--test/lisp/whitespace-tests.el239
1 files changed, 234 insertions, 5 deletions
diff --git a/test/lisp/whitespace-tests.el b/test/lisp/whitespace-tests.el
index ba99ddcdec4..97c30c4d627 100644
--- a/test/lisp/whitespace-tests.el
+++ b/test/lisp/whitespace-tests.el
@@ -1,6 +1,6 @@
;;; whitespace-tests.el --- Test suite for whitespace -*- lexical-binding: t -*-
-;; Copyright (C) 2016-2017 Free Software Foundation, Inc.
+;; Copyright (C) 2016-2022 Free Software Foundation, Inc.
;; This file is part of GNU Emacs.
@@ -20,8 +20,35 @@
;;; Code:
(require 'ert)
+(require 'ert-x)
+(require 'faceup)
(require 'whitespace)
+(defmacro whitespace-tests--with-test-buffer (style &rest body)
+ "Run BODY in a buffer with `whitespace-mode' style STYLE.
+The buffer is displayed in `selected-window', and
+`noninteractive' is set to nil even in batch mode."
+ (declare (debug ((style form) def-body))
+ (indent 1))
+ `(ert-with-test-buffer-selected ()
+ ;; In case global-*-mode is enabled.
+ (whitespace-mode -1)
+ (font-lock-mode -1)
+ (let ((noninteractive nil)
+ (whitespace-style ,style))
+ (font-lock-mode 1)
+ (whitespace-mode 1)
+ ,@body)))
+
+(defun whitespace-tests--faceup (&rest lines)
+ "Convenience wrapper around `faceup-test-font-lock-buffer'.
+Returns non-nil if the concatenated LINES match the current
+buffer's content."
+ (faceup-test-font-lock-buffer nil (apply #'concat lines)))
+(let ((x (get 'faceup-test-font-lock-buffer 'ert-explainer)))
+ (put 'whitespace-tests--faceup 'ert-explainer
+ (lambda (&rest lines) (funcall x nil (apply #'concat lines)))))
+
(defun whitespace-tests--cleanup-string (string)
(with-temp-buffer
(insert string)
@@ -51,10 +78,10 @@
;; We cannot call whitespace-mode because it will do nothing in batch
;; mode. So we call its innards instead.
(defun whitespace-tests-whitespace-mode-on ()
- "Turn whitespace-mode on even in batch mode."
+ "Turn `whitespace-mode' on even in batch mode."
+ (setq whitespace-mode t)
(whitespace-turn-on)
- (whitespace-action-when-on)
- (setq whitespace-mode t))
+ (whitespace-action-when-on))
(ert-deftest whitespace-tests-display-tables ()
"Test whitespace stores and restores the buffer display table - bug26892."
@@ -77,10 +104,212 @@
;test the stored display table is preserved
(should (equal nil
(progn (whitespace-tests-whitespace-mode-on)
- (whitespace-tests-whitespace-mode-on)
(whitespace-turn-off)
buffer-display-table))))))
+(ert-deftest whitespace-tests--empty-bob ()
+ (whitespace-tests--with-test-buffer '(face empty)
+ (electric-indent-mode -1)
+
+ ;; Insert some empty lines. None of the lines should be
+ ;; highlighted even though point is on the last line because the
+ ;; entire buffer is empty lines.
+ (execute-kbd-macro (kbd "SPC RET C-q TAB RET RET SPC"))
+ (should (equal (buffer-string) " \n\t\n\n "))
+ (should (equal (line-number-at-pos) 4))
+ (should (whitespace-tests--faceup " \n"
+ "\t\n"
+ "\n"
+ " "))
+
+ ;; Adding content on the last line (and keeping point there)
+ ;; should cause the previous lines to be highlighted. Note that
+ ;; the `whitespace-empty' face applies to the newline just before
+ ;; the last line, which has the desired property of extending the
+ ;; highlight the full width of the window.
+ (execute-kbd-macro (kbd "x"))
+ (should (equal (buffer-string) " \n\t\n\n x"))
+ (should (equal (line-number-at-pos) 4))
+ (should (whitespace-tests--faceup "«:whitespace-empty: \n"
+ "\t\n"
+ "\n"
+ "» x"))
+
+ ;; Lines should become un-highlighted as point moves up into the
+ ;; empty lines.
+ (execute-kbd-macro (kbd "<up>"))
+ (should (equal (line-number-at-pos) 3))
+ (should (whitespace-tests--faceup "«:whitespace-empty: \n"
+ "\t\n"
+ "»\n"
+ " x"))
+ (execute-kbd-macro (kbd "<up>"))
+ (should (equal (line-number-at-pos) 2))
+ (should (whitespace-tests--faceup "«:whitespace-empty: \n"
+ "»\t\n"
+ "\n"
+ " x"))
+ (execute-kbd-macro (kbd "<up> C-a"))
+ (should (equal (point) 1))
+ (should (whitespace-tests--faceup " \n"
+ "\t\n"
+ "\n"
+ " x"))
+
+ ;; Line 1 should be un-highlighted when point is in line 1 even if
+ ;; point is not bobp.
+ (execute-kbd-macro (kbd "<right>"))
+ (should (equal (line-number-at-pos) 1))
+ (should (> (point) 1))
+ (should (whitespace-tests--faceup " \n"
+ "\t\n"
+ "\n"
+ " x"))
+
+ ;; Make sure lines become re-highlighted as point moves down.
+ (execute-kbd-macro (kbd "<down>"))
+ (should (equal (line-number-at-pos) 2))
+ (should (whitespace-tests--faceup "«:whitespace-empty: \n"
+ "»\t\n"
+ "\n"
+ " x"))
+ (execute-kbd-macro (kbd "<down>"))
+ (should (equal (line-number-at-pos) 3))
+ (should (whitespace-tests--faceup "«:whitespace-empty: \n"
+ "\t\n"
+ "»\n"
+ " x"))
+ (execute-kbd-macro (kbd "<down>"))
+ (should (equal (line-number-at-pos) 4))
+ (should (whitespace-tests--faceup "«:whitespace-empty: \n"
+ "\t\n"
+ "\n"
+ "» x"))
+
+ ;; Inserting content on line 2 should un-highlight lines 2 and 3.
+ (execute-kbd-macro (kbd "<up> <up> C-e"))
+ (should (equal (line-number-at-pos) 2))
+ (should (equal (- (point) (line-beginning-position)) 1))
+ (execute-kbd-macro (kbd "y <down> <down>"))
+ (should (equal (line-number-at-pos) 4))
+ (should (whitespace-tests--faceup "«:whitespace-empty: \n"
+ "»\ty\n"
+ "\n"
+ " x"))
+
+ ;; Removing the content on line 2 should re-highlight lines 2 and
+ ;; 3.
+ (execute-kbd-macro (kbd "<up> <up> C-e"))
+ (should (equal (line-number-at-pos) 2))
+ (should (equal (- (point) (line-beginning-position)) 2))
+ (execute-kbd-macro (kbd "DEL <down> <down>"))
+ (should (equal (line-number-at-pos) 4))
+ (should (whitespace-tests--faceup "«:whitespace-empty: \n"
+ "\t\n"
+ "\n"
+ "» x"))))
+
+(ert-deftest whitespace-tests--empty-eob ()
+ (whitespace-tests--with-test-buffer '(face empty)
+ (electric-indent-mode -1)
+
+ ;; Insert some empty lines. None of the lines should be
+ ;; highlighted even though point is on line 1 because the entire
+ ;; buffer is empty lines.
+ (execute-kbd-macro (kbd "RET RET C-q TAB RET SPC C-<home>"))
+ (should (equal (buffer-string) "\n\n\t\n "))
+ (should (equal (line-number-at-pos) 1))
+ (should (whitespace-tests--faceup "\n"
+ "\n"
+ "\t\n"
+ " "))
+
+ ;; Adding content on the first line (and keeping point there)
+ ;; should cause the subsequent lines to be highlighted.
+ (execute-kbd-macro (kbd "x"))
+ (should (equal (buffer-string) "x\n\n\t\n "))
+ (should (equal (line-number-at-pos) 1))
+ (should (whitespace-tests--faceup "x\n"
+ "«:whitespace-empty:\n"
+ "\t\n"
+ " »"))
+
+ ;; Lines should become un-highlighted as point moves down into the
+ ;; empty lines.
+ (execute-kbd-macro (kbd "<down>"))
+ (should (equal (line-number-at-pos) 2))
+ (should (whitespace-tests--faceup "x\n"
+ "\n"
+ "«:whitespace-empty:\t\n"
+ " »"))
+ (execute-kbd-macro (kbd "<down>"))
+ (should (equal (line-number-at-pos) 3))
+ (should (whitespace-tests--faceup "x\n"
+ "\n"
+ "\t\n"
+ "«:whitespace-empty: »"))
+ (execute-kbd-macro (kbd "C-<end>"))
+ (should (equal (line-number-at-pos) 4))
+ (should (eobp))
+ (should (equal (- (point) (line-beginning-position)) 1))
+ (should (whitespace-tests--faceup "x\n"
+ "\n"
+ "\t\n"
+ " "))
+
+ ;; The last line should be un-highlighted when point is in that
+ ;; line even if point is not eobp.
+ (execute-kbd-macro (kbd "<left>"))
+ (should (equal (line-number-at-pos) 4))
+ (should (not (eobp)))
+ (should (whitespace-tests--faceup "x\n"
+ "\n"
+ "\t\n"
+ " "))
+
+ ;; Make sure lines become re-highlighted as point moves up.
+ (execute-kbd-macro (kbd "<up>"))
+ (should (equal (line-number-at-pos) 3))
+ (should (whitespace-tests--faceup "x\n"
+ "\n"
+ "\t\n"
+ "«:whitespace-empty: »"))
+ (execute-kbd-macro (kbd "<up>"))
+ (should (equal (line-number-at-pos) 2))
+ (should (whitespace-tests--faceup "x\n"
+ "\n"
+ "«:whitespace-empty:\t\n"
+ " »"))
+ (execute-kbd-macro (kbd "<up>"))
+ (should (equal (line-number-at-pos) 1))
+ (should (whitespace-tests--faceup "x\n"
+ "«:whitespace-empty:\n"
+ "\t\n"
+ " »"))
+
+ ;; Inserting content on line 3 should un-highlight lines 2 and 3.
+ (execute-kbd-macro (kbd "<down> <down> C-a"))
+ (should (equal (line-number-at-pos) 3))
+ (should (equal (- (point) (line-beginning-position)) 0))
+ (execute-kbd-macro (kbd "y <up> <up>"))
+ (should (equal (line-number-at-pos) 1))
+ (should (whitespace-tests--faceup "x\n"
+ "\n"
+ "y\t\n"
+ "«:whitespace-empty: »"))
+
+ ;; Removing the content on line 3 should re-highlight lines 2 and
+ ;; 3.
+ (execute-kbd-macro (kbd "<down> <down> C-a"))
+ (should (equal (line-number-at-pos) 3))
+ (should (equal (- (point) (line-beginning-position)) 0))
+ (execute-kbd-macro (kbd "<deletechar> <up> <up>"))
+ (should (equal (line-number-at-pos) 1))
+ (should (whitespace-tests--faceup "x\n"
+ "«:whitespace-empty:\n"
+ "\t\n"
+ " »"))))
+
(provide 'whitespace-tests)
;;; whitespace-tests.el ends here