aboutsummaryrefslogtreecommitdiff
path: root/.config/emacs/lisp/evil/evil-tests.el
diff options
context:
space:
mode:
authorJack Jamison <jackqjamison@gmail.com>2026-07-30 20:09:00 -0400
committerJack Jamison <jackqjamison@gmail.com>2026-07-30 20:18:37 -0400
commit8c4e09dff83847ac7f07bf1da7751e9328006c4d (patch)
treea0e245567ce225f8bcb63b66e4d2373b5d033e4a /.config/emacs/lisp/evil/evil-tests.el
parent1e33b30749bb1043ffc6ceb5a2fb0977446788b3 (diff)
actual final changes and get rid of junk in lisp dir
actually works fine
Diffstat (limited to '.config/emacs/lisp/evil/evil-tests.el')
-rw-r--r--.config/emacs/lisp/evil/evil-tests.el10130
1 files changed, 0 insertions, 10130 deletions
diff --git a/.config/emacs/lisp/evil/evil-tests.el b/.config/emacs/lisp/evil/evil-tests.el
deleted file mode 100644
index 01af626..0000000
--- a/.config/emacs/lisp/evil/evil-tests.el
+++ /dev/null
@@ -1,10130 +0,0 @@
-;; evil-tests.el --- unit tests for Evil -*- coding: utf-8; lexical-binding: t; -*-
-
-;; Author: Vegard Øye <vegard_oye at hotmail.com>
-;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
-
-;; Version: 1.15.0
-
-;;
-;; This file is NOT part of GNU Emacs.
-
-;;; License:
-
-;; This file is part of Evil.
-;;
-;; Evil 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.
-;;
-;; Evil 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 Evil. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This file is for developers. It runs some tests on Evil.
-;; To load it, run the Makefile target "make test" or add
-;; the following lines to .emacs:
-;;
-;; (setq evil-tests-run nil) ; set to t to run tests immediately
-;; (global-set-key [f12] 'evil-tests-run) ; hotkey
-;; (require 'evil-tests)
-;;
-;; Loading this file enables profiling on Evil. The current numbers
-;; can be displayed with `elp-results'. The Makefile target
-;; "make profiler" shows profiling results in the terminal on the
-;; basis of running all tests.
-;;
-;; To write a test, use `ert-deftest' and specify a :tags value of at
-;; least '(evil). The test may inspect the output of functions given
-;; certain input, or it may execute a key sequence in a temporary
-;; buffer and investigate the results. For the latter approach, the
-;; macro `evil-test-buffer' creates a temporary buffer in Normal
-;; state. String descriptors initialize and match the contents of
-;; the buffer:
-;;
-;; (ert-deftest evil-test ()
-;; :tags '(evil)
-;; (evil-test-buffer
-;; "[T]his creates a test buffer." ; cursor on "T"
-;; ("w") ; key sequence
-;; "This [c]reates a test buffer."))) ; cursor moved to "c"
-;;
-;; The initial state, the cursor syntax, etc., can be changed
-;; with keyword arguments. See the documentation string of
-;; `evil-test-buffer' for more details.
-;;
-;; This file is NOT part of Evil itself.
-
-;; FIXME: Merely loading an ELisp file should not change Emacs's config!
-(setq load-prefer-newer t)
-
-(require 'cl-lib)
-(require 'elp)
-(require 'ert)
-;; Load non-compiled `evil-ex'. (It defines `evil-parser' - which is
-;; needed by `evil-test-parser' - only inside an `eval-when-compile'.)
-(require 'evil-ex "evil-ex.el")
-(require 'evil)
-(require 'evil-digraphs)
-(require 'evil-test-helpers)
-(require 'ispell)
-
-;;; Code:
-
-(defvar evil-tests-run nil
- "*Run Evil tests.")
-
-(defvar evil-tests-profiler nil
- "*Profile Evil tests.")
-
-(defun evil-tests-initialize (&optional tests profiler interactive)
- (setq profiler (or profiler evil-tests-profiler))
- (when (consp profiler)
- (setq profiler (car profiler)))
- (when profiler
- (setq evil-tests-profiler t)
- (setq profiler
- (cdr (assq profiler
- '((call . elp-sort-by-call-count)
- (average . elp-sort-by-average-time)
- (total . elp-sort-by-total-time)))))
- (setq elp-sort-by-function (or profiler 'elp-sort-by-call-count))
- (elp-instrument-package "evil"))
- (if interactive
- (if (y-or-n-p-with-timeout "Run tests? " 2 t)
- (evil-tests-run tests interactive)
- (message "You can run the tests at any time with `M-x evil-tests-run'"))
- (evil-tests-run tests)))
-
-(defun evil-tests-run (&optional tests interactive)
- "Run Evil tests."
- (interactive '(nil t))
- (let ((elp-use-standard-output (not interactive)))
- (setq tests
- (or (null tests)
- `(or ,@(mapcar #'(lambda (test)
- (or (null test)
- (and (memq test '(evil t)) t)
- `(or (tag ,test)
- ,(format "^%s$" test))))
- tests))))
- (cond
- (interactive
- (ert-run-tests-interactively tests)
- (when evil-tests-profiler
- (elp-results)))
- (evil-tests-profiler
- (ert-run-tests-batch tests)
- (elp-results))
- (t
- ;; We would like to use `ert-run-tests-batch-and-exit'
- ;; Unfortunately it doesn't work outside of batch mode, and we
- ;; can't use batch mode because we have tests that need windows.
- ;; Instead, run the tests interactively, copy the results to a
- ;; text file, and then exit with an appropriate code.
- (setq attempt-stack-overflow-recovery nil
- attempt-orderly-shutdown-on-fatal-signal nil)
- (unwind-protect
- (progn
- (ert-run-tests-interactively tests)
- (with-current-buffer "*ert*"
- (append-to-file (point-min) (point-max) "test-results.txt")
- (kill-emacs (if (zerop (ert-stats-completed-unexpected ert--results-stats)) 0 1))))
- (unwind-protect
- (progn
- (append-to-file "Error running tests\n" nil "test-results.txt")
- (append-to-file (backtrace-to-string (backtrace-get-frames 'backtrace)) nil "test-results.txt"))
- (kill-emacs 2)))))))
-
-(defun evil-tests-profiler (&optional force)
- "Profile Evil tests."
- (when (or evil-tests-profiler force)
- (setq evil-tests-profiler t)
- (elp-instrument-package "evil")))
-
-;;; States
-
-(defun evil-test-local-mode-enabled ()
- "Verify that `evil-local-mode' is enabled properly"
- (ert-info ("Set the mode variable to t")
- (should (eq evil-local-mode t)))
- (ert-info ("Refresh `emulation-mode-map-alist'")
- (should (memq 'evil-mode-map-alist emulation-mode-map-alists)))
- (ert-info ("Create a buffer-local value for `evil-mode-map-alist'")
- (should (assq 'evil-mode-map-alist (buffer-local-variables))))
- (ert-info ("Initialize buffer-local keymaps")
- (should (assq 'evil-normal-state-local-map (buffer-local-variables)))
- (should (keymapp evil-normal-state-local-map))
- (should (assq 'evil-emacs-state-local-map (buffer-local-variables)))
- (should (keymapp evil-emacs-state-local-map)))
- (ert-info ("Don't add buffer-local entries to the default value")
- (should-not (rassq evil-normal-state-local-map
- (default-value 'evil-mode-map-alist)))
- (should-not (rassq evil-emacs-state-local-map
- (default-value 'evil-mode-map-alist)))))
-
-(defun evil-test-local-mode-disabled ()
- "Verify that `evil-local-mode' is disabled properly"
- (ert-info ("Set the mode variable to nil")
- (should-not evil-local-mode))
- (ert-info ("Disable all states")
- (evil-test-no-states)))
-
-(defun evil-test-no-states ()
- "Verify that all states are disabled"
- (ert-info ("Set `evil-state' to nil")
- (should-not evil-state))
- (ert-info ("Disable all state keymaps")
- (dolist (state (mapcar #'car evil-state-properties) t)
- (should-not (evil-state-property state :mode t))
- (should-not (memq (evil-state-property state :keymap t)
- (current-active-maps)))
- (should-not (evil-state-property state :local t))
- (should-not (memq (evil-state-property state :local-keymap t)
- (current-active-maps)))
- (dolist (map (evil-state-auxiliary-keymaps state))
- (should-not (memq map (current-active-maps)))))))
-
-(ert-deftest evil-test-toggle-local-mode ()
- "Toggle `evil-local-mode'"
- :tags '(evil state)
- (with-temp-buffer
- (ert-info ("Enable `evil-local-mode'")
- (evil-local-mode 1)
- (evil-test-local-mode-enabled))
- (ert-info ("Disable `evil-local-mode'")
- (evil-local-mode -1)
- (evil-test-local-mode-disabled))))
-
-(defun evil-test-change-state (state)
- "Change state to STATE and check keymaps"
- (evil-change-state state)
- (let ((mode (evil-state-property state :mode))
- ;; (keymap (evil-state-property state :keymap t))
- (local-mode (evil-state-property state :local))
- ;; (local-keymap (evil-state-property state :local-keymap t))
- (tag (evil-state-property state :tag t)))
- (when (functionp tag)
- (setq tag (funcall tag)))
- (ert-info ("Update `evil-state'")
- (should (eq evil-state state)))
- (ert-info ("Ensure `evil-local-mode' is enabled")
- (evil-test-local-mode-enabled))
- (ert-info ("Enable state modes")
- (should (symbol-value mode))
- (should (symbol-value local-mode)))
- (ert-info ("Push state keymaps to the top")
- (evil-test-state-keymaps state))
- (ert-info ("Refresh mode line tag")
- (should (equal evil-mode-line-tag tag)))))
-
-(defun evil-test-state-keymaps (state)
- "Verify that STATE's keymaps are pushed to the top"
- (let ((actual (evil-state-keymaps state))
- (expected `((,(evil-state-property state :local)
- . , (evil-state-property state :local-keymap t))
- (,(evil-state-property state :mode)
- . ,(evil-state-property state :keymap t)))))
- ;; additional keymaps inherited with :enable
- (cond
- ((eq state 'operator)
- (setq expected
- `((evil-operator-shortcut-mode
- . ,evil-operator-shortcut-map)
- (evil-operator-state-local-minor-mode
- . ,evil-operator-state-local-map)
- (evil-operator-state-minor-mode
- . ,evil-operator-state-map)
- (evil-motion-state-local-minor-mode
- . ,evil-motion-state-local-map)
- (evil-motion-state-minor-mode
- . ,evil-motion-state-map)
- (evil-normal-state-local-minor-mode
- . ,evil-normal-state-local-map)
- (evil-normal-state-minor-mode
- . ,evil-normal-state-map)))))
- (let ((actual (butlast actual (- (length actual)
- (length expected)))))
- (should (equal actual expected))
- (dolist (map actual)
- (setq map (cdr-safe map))
- (should (keymapp map))))))
-
-(ert-deftest evil-test-exit-normal-state ()
- "Enter Normal state and then disable all states"
- :tags '(evil state)
- (with-temp-buffer
- (evil-test-change-state 'normal)
- (evil-normal-state -1)
- (evil-test-no-states)))
-
-(ert-deftest evil-test-change-states ()
- "Change between Normal state, Emacs state and Operator-Pending state"
- :tags '(evil state)
- (with-temp-buffer
- (evil-test-change-state 'normal)
- (evil-test-change-state 'emacs)
- (evil-test-change-state 'normal)
- (evil-test-change-state 'operator)
- (evil-test-change-state 'normal)
- (evil-test-change-state 'emacs)
- (evil-test-change-state 'replace)
- (evil-test-change-state 'normal)))
-
-(ert-deftest evil-test-change-to-previous-state ()
- "Change to some state and back."
- :tags '(evil state)
- (with-temp-buffer
- (evil-test-change-state 'normal)
- (evil-test-change-state 'visual)
- (evil-test-change-state 'emacs)
- (evil-change-to-previous-state)
- (should (eq evil-state 'visual))
- (evil-change-to-previous-state)
- (should (eq evil-state 'normal))))
-
-(ert-deftest evil-test-enter-normal-state-disabled ()
- "Enter Normal state even if `evil-local-mode' is disabled"
- :tags '(evil state)
- (with-temp-buffer
- (evil-local-mode -1)
- (evil-test-local-mode-disabled)
- (evil-test-change-state 'normal)))
-
-(ert-deftest evil-test-execute-in-normal-state ()
- "Execute Normal state command in Insert state (`evil-execute-in-normal-state')."
- :tags '(evil)
- (evil-test-buffer "[a]bcdef\n"
- ("I")
- (should (evil-insert-state-p))
- ("\C-ox")
- (ert-info ("Should return to Insert state") (should (evil-insert-state-p)))
- "[b]cdef\n"
- ("\C-oA")
- (ert-info ("Should return to Insert state after Insert state command")
- (should (evil-insert-state-p)))
- ("bcdef[]\n"))
- (ert-info ("Cursor is placed correctly afterwards")
- (evil-test-buffer
- :state insert
- "abcdefg[]"
- ("\C-o~")
- "abcdefG[]")
- (evil-test-buffer
- :state insert
- "abcdefg[]"
- ("\C-ozz")
- "abcdefg[]")
- (evil-test-buffer
- :state insert
- "abc[]defg"
- ("\C-o$")
- "abcdefg[]")
- (evil-test-buffer
- :state insert
- "abcdefg[]"
- ("\C-o^")
- "[]abcdefg")
- (evil-test-buffer
- :state insert
- "abcdefg[]"
- ("\C-oi")
- "abcdef[]g")
- (evil-test-buffer
- :state insert
- "\n[]"
- ("\C-ok")
- "[]\n")
- (evil-test-buffer
- "line1\nli[n]e2"
- ("ma" "kA" "\C-o`a")
- "line1\nli[]ne2"))
- (ert-info ("Can enter replace state and stay in it")
- (evil-test-buffer
- :state insert
- "abc[]defg"
- ("\C-oRfoo")
- "abcfoog"))
- (ert-info ("Insert count is ignored")
- (evil-test-buffer "[]"
- ("2i" "abcdef" "\C-o~" "g" [escape])
- "abcdeF[g]"))
- (ert-info ("Can execute evil-repeat in normal state")
- (evil-test-buffer
- ;; Although this is the same in Vim, text inserted after the temporary
- ;; normal command is not recorded for repetition, which is a subtle
- ;; (but arguably more useful) difference.
- :state insert
- "ab[]cfg"
- ("\C-o~de\C-o.")
- "abCdeF[]g")))
-
-(defun evil-test-suppress-keymap (state)
- "Verify that `self-insert-command' is suppressed in STATE"
- (evil-test-buffer
- ";; This buffer is for notes."
- (evil-test-change-state state)
- ;; TODO: this should be done better
- (ert-info ("Disable the state's own keymaps so that the
-suppression keymap comes first")
- (setq evil-operator-state-minor-mode nil
- evil-operator-state-local-minor-mode nil))
- (should (eq (key-binding "£") #'undefined))
- (ert-info ("Don't insert text")
- ;; may or may not signal an error, depending on batch mode
- (condition-case nil
- (execute-kbd-macro "£££")
- (error nil))
- (should (string= (buffer-substring 1 4) ";; ")))))
-
-(ert-deftest evil-test-emacs-state-suppress-keymap ()
- "`self-insert-command' works in Emacs state"
- :tags '(evil state)
- (should-error (evil-test-suppress-keymap 'emacs)))
-
-(ert-deftest evil-test-normal-state-suppress-keymap ()
- "No `self-insert-command' in Normal state"
- :tags '(evil state)
- (evil-test-suppress-keymap 'normal))
-
-(ert-deftest evil-test-operator-state-suppress-keymap ()
- "Operator-Pending state should inherit suppression
-of `self-insert-command' from Normal state"
- :tags '(evil state)
- (evil-test-suppress-keymap 'operator))
-
-(ert-deftest evil-test-operator-state-shortcut-keymap ()
- "Enable shortcut keymap in Operator-Pending state"
- :tags '(evil state)
- (evil-test-buffer
- (ert-info ("Activate `evil-operator-shortcut-map' in \
-Operator-Pending state")
- (evil-test-change-state 'operator)
- (should (rassq evil-operator-shortcut-map
- (evil-state-keymaps 'operator)))
- (should (keymapp evil-operator-shortcut-map))
- (should evil-operator-shortcut-mode)
- (should (memq evil-operator-shortcut-map
- (current-active-maps))))
- (ert-info ("Deactivate `evil-operator-shortcut-map' \
-outside Operator-Pending state")
- (evil-test-change-state 'emacs)
- (should-not evil-operator-shortcut-mode)
- (should-not (memq evil-operator-shortcut-map
- (current-active-maps))))
- (ert-info ("Reset `evil-operator-shortcut-map' \
-when entering Operator-Pending state")
- (define-key evil-operator-shortcut-map "f" 'foo)
- (should (eq (lookup-key evil-operator-shortcut-map "f")
- 'foo))
- (evil-test-change-state 'operator)
- (should-not (eq (lookup-key evil-operator-shortcut-map "f")
- 'foo)))
- (ert-info ("Reset `evil-operator-shortcut-map' \
-when exiting Operator-Pending state")
- (define-key evil-operator-shortcut-map "b" 'bar)
- (should (eq (lookup-key evil-operator-shortcut-map "b")
- 'bar))
- (evil-test-change-state 'emacs)
- (should-not (eq (lookup-key evil-operator-shortcut-map "b")
- 'bar))))
- (ert-info ("Compute shortcuts with original keymaps")
- (evil-test-buffer "foo"
- (define-key evil-normal-state-local-map (kbd "SPC x") #'evil-delete)
- ;; evil-forward-char in motion map should not shadow the executed
- ;; evil-delete binding above when populating shortcut map.
- ((kbd "SPC x x"))
- "")))
-
-(ert-deftest evil-test-auxiliary-maps ()
- "Test auxiliary keymaps"
- :tags '(evil state)
- ;; `evil-define-key' can't be used on a lexically-scoped keymap var.
- (defvar evil--map)
- (let ((evil--map (make-sparse-keymap)) aux)
- (ert-info ("Create a new auxiliary keymap")
- (evil-define-key 'normal evil--map "f" 'foo)
- (setq aux (evil-get-auxiliary-keymap evil--map 'normal))
- (should (evil-auxiliary-keymap-p aux))
- (should (eq (lookup-key aux "f") 'foo)))
- (ert-info ("Add to auxiliary keymap")
- (evil-define-key 'normal evil--map "b" 'bar)
- (should (eq (lookup-key aux "f") 'foo))
- (should (eq (lookup-key aux "b") 'bar)))))
-
-(ert-deftest evil-test-global-local-map-binding ()
- "Test use of `evil-define-key' for binding in global maps."
- :tags '(evil state)
- (let ((evil-normal-state-map (copy-keymap evil-normal-state-map))
- (evil-normal-state-local-map
- (when (keymapp evil-normal-state-local-map)
- (copy-keymap evil-normal-state-local-map)))
- (global-map (copy-keymap global-map))
- (orig-local-map
- (when (keymapp (current-local-map))
- (copy-keymap (current-local-map))))
- (map (or (current-local-map) (make-sparse-keymap))))
- (use-local-map map)
- (ert-info ("Bind in a global state map")
- (evil-define-key 'normal 'global "f" 'foo)
- (should (eq (lookup-key evil-normal-state-map "f") 'foo)))
- (ert-info ("Bind in a local state map")
- (evil-define-key 'normal 'local "f" 'foo)
- (should (eq (lookup-key evil-normal-state-local-map "f") 'foo)))
- (ert-info ("Bind in the global map")
- (evil-define-key nil 'global "b" 'bar)
- (should (eq (lookup-key global-map "b") 'bar)))
- (ert-info ("Bind in the local map")
- (evil-define-key nil 'local "b" 'bar)
- (should (eq (lookup-key (current-local-map) "b") 'bar)))
- (use-local-map orig-local-map)))
-
-;;; Type system
-
-(ert-deftest evil-test-exclusive-type ()
- "Expand and contract the `line' type"
- :tags '(evil type)
- (evil-test-buffer
- ";; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (let* ((first-line 1)
- (second-line (progn
- (forward-line)
- (point))))
- (forward-line)
- (ert-info ("Return the beginning and end unchanged \
-if they are the same")
- (should (equal (evil-normalize 1 1 'exclusive)
- (list 1 1 'exclusive))))
- (ert-info ("expand to `inclusive' if the end position \
-is at the beginning of a line")
- (should (equal (evil-normalize (1+ first-line) second-line 'exclusive)
- (list (1+ first-line) (1- second-line) 'inclusive
- :expanded t))))
- (ert-info ("expand to `line' if both the beginning and end \
-are at the beginning of a line")
- (should (equal (evil-normalize first-line second-line 'exclusive)
- (list first-line second-line 'line
- :expanded t))))
- (ert-info ("Measure as the strict difference between the end \
-and the beginning")
- (should (string= (evil-describe 1 1 'exclusive)
- "0 characters"))
- (should (string= (evil-describe 1 2 'exclusive)
- "1 character"))
- (should (string= (evil-describe 5 2 'exclusive)
- "3 characters"))))))
-
-(ert-deftest evil-test-inclusive-type ()
- "Expand and contract the `inclusive' type"
- :tags '(evil type)
- (evil-test-buffer
- ";; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (ert-info ("Include the ending character")
- (should (equal (evil-expand 1 1 'inclusive)
- '(1 2 inclusive :expanded t))))
- (ert-info ("Don't mind if positions are in wrong order")
- (should (equal (evil-expand 5 2 'inclusive)
- '(2 6 inclusive :expanded t))))
- (ert-info ("Exclude the ending character when contracting")
- (should (equal (evil-contract 1 2 'inclusive)
- '(1 1 inclusive :expanded nil))))
- (ert-info ("Don't mind positions' order when contracting")
- (should (equal (evil-contract 6 2 'inclusive)
- '(2 5 inclusive :expanded nil))))
- (ert-info ("Measure as one more than the difference")
- (should (string= (evil-describe 1 1 'inclusive)
- "1 character"))
- (should (string= (evil-describe 5 2 'inclusive)
- "4 characters")))))
-
-(ert-deftest evil-test-line-type ()
- "Expand the `line' type"
- :tags '(evil type)
- (evil-test-buffer
- ";; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (let* ((first-line 1)
- (second-line (progn
- (forward-line)
- (point)))
- (third-line (progn
- (forward-line)
- (point))))
- (ert-info ("Expand to the whole first line")
- (should (equal (evil-expand first-line first-line 'line)
- (list first-line second-line 'line :expanded t)))
- (should (string= (evil-describe first-line first-line 'line)
- "1 line")))
- (ert-info ("Expand to the two first lines")
- (should (equal (evil-expand first-line second-line 'line)
- (list first-line third-line 'line :expanded t)))
- (should (string= (evil-describe first-line second-line 'line)
- "2 lines"))))))
-
-(ert-deftest evil-test-block-type ()
- "Expand and contract the `block' type"
- :tags '(evil type)
- (evil-test-buffer
- ";; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (let* ((first-line 1)
- (second-line (progn
- (forward-line)
- (point)))
- (third-line (progn
- (forward-line)
- (point))))
- (ert-info ("Expand to a 1x1 block")
- (should (equal (evil-expand 1 1 'block)
- (list 1 2 'block :expanded t)))
- (should (string= (evil-describe 1 1 'block)
- "1 row and 1 column")))
- (ert-info ("Expand to a 2x1 block")
- (should (equal (evil-expand first-line second-line 'block)
- (list first-line (1+ second-line) 'block :expanded t)))
- (should (string= (evil-describe first-line second-line 'block)
- "2 rows and 1 column")))
- (ert-info ("Expand to a 3x2 block")
- (should (equal (evil-expand first-line (1+ third-line) 'block)
- (list first-line (1+ (1+ third-line))
- 'block :expanded t)))
- (should (string= (evil-describe first-line (1+ third-line) 'block)
- "3 rows and 2 columns")))
- (ert-info ("Contract to a 0x0 rectangle")
- (should (equal (evil-contract 1 2 'block)
- (list 1 1 'block :expanded nil))))
- (ert-info ("Contract to a 2x0 rectangle")
- (should (equal (evil-contract first-line (1+ second-line) 'block)
- (list first-line second-line 'block :expanded nil))))
- (ert-info ("Contract to a 3x1 rectangle")
- (should (equal (evil-contract first-line (1+ (1+ third-line)) 'block)
- (list first-line (1+ third-line)
- 'block :expanded nil)))))))
-
-(ert-deftest evil-test-type-transform ()
- "Test `evil-transform'"
- :tags '(evil type)
- (evil-test-buffer
- ";; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (ert-info ("Return positions unchanged when passed nil \
-for TYPE or TRANSFORM")
- (should (equal (evil-transform nil 1 2 'block)
- '(1 2 block)))
- (should (equal (evil-transform :expand 1 2 nil)
- '(1 2)))
- (should (equal (evil-transform nil 1 2 nil)
- '(1 2))))
- (ert-info ("Accept markers, but return positions")
- (should (equal (evil-transform :expand
- (move-marker (make-marker) 1) 1
- 'inclusive)
- '(1 2 inclusive :expanded t)))
- (should (equal (evil-transform nil (move-marker (make-marker) 1) 2
- nil)
- '(1 2))))))
-
-(ert-deftest evil-test-type-modifiers ()
- "Test type modifiers like \"dv}\""
- :tags '(evil type)
- (ert-info ("Change `inclusive' motions to `exclusive'")
- (evil-test-buffer
- "[A]bove some line"
- ("dve")
- "[e] some line"))
- (ert-info ("Change `exclusive' motions to `inclusive'")
- (evil-test-buffer
- "Above [s]ome line
-
-Below some empty line"
- ("dv}")
- "Above[ ]
-Below some empty line"))
- (ert-info ("Change type to `line'")
- (evil-test-buffer
- "Above [s]ome line
-
-Below some empty line"
- ("dV}")
- "Below [s]ome empty line")))
-
-;;; Insertion
-
-(ert-deftest evil-test-insert ()
- "Test `evil-insert'"
- :tags '(evil insert)
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save"
- ("ievil rulz " [escape])
- ";; evil rulz[ ]This buffer is for notes you don't want to save"))
-
-(ert-deftest evil-test-append ()
- "Test `evil-append'"
- :tags '(evil insert)
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save"
- ("aevil rulz " [escape])
- ";; Tevil rulz[ ]his buffer is for notes you don't want to save"))
-
-(ert-deftest evil-test-visual-insert ()
- "Test `evil-insert' in Visual state."
- :tags '(evil insert)
- (ert-info ("Repeat insert over empty lines")
- (evil-test-buffer :visual line "<\n\n[]>"
- ("IX" [escape])
- "X\nX\nX")))
-
-(ert-deftest evil-test-visual-append ()
- "Test `evil-append' in Visual state."
- :tags '(evil insert)
- (evil-test-buffer "<fo[o]> bar"
- ("A_evil rulz " [escape])
- "foo_evil rulz[ ] bar"))
-
-(ert-deftest evil-test-open-above ()
- "Test `evil-open-above'"
- :tags '(evil insert)
- (evil-test-buffer
- ";; This buffer is for notes you don't want to save,
-\[;]; and for Lisp evaluation."
- ("Oabc\ndef" [escape])
- ";; This buffer is for notes you don't want to save,
-abc
-de[f]
-;; and for Lisp evaluation.")
- (ert-info ("Open empty line")
- (evil-test-buffer
- "(let (var)\n [t]est)\n"
- (emacs-lisp-mode)
- ("O" [escape])
- "(let (var)\n[\n] test)\n"))
- (ert-info ("Open non-empty line")
- (evil-test-buffer
- "(let (var)\n [t]est)\n"
- (emacs-lisp-mode)
- ("Odo-it" [escape])
- "(let (var)\n do-i[t]\n test)\n")))
-
-(ert-deftest evil-test-open-below ()
- "Test `evil-open-below'"
- :tags '(evil insert)
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("oabc\ndef" [escape])
- ";; This buffer is for notes you don't want to save,
-abc
-de[f]
-;; and for Lisp evaluation.")
- (ert-info ("Open empty line")
- (evil-test-buffer
- "[(]let (var)\n test)\n"
- (emacs-lisp-mode)
- ("o" [escape])
- "(let (var)\n[\n] test)\n"))
- (ert-info ("Open non-empty line")
- (evil-test-buffer
- "[(]let (var)\n test)\n"
- (emacs-lisp-mode)
- ("odo-it" [escape])
- "(let (var)\n do-i[t]\n test)\n"))
- (let ((evil-auto-indent t))
- (ert-info ("With count")
- (evil-test-buffer
- "[(]and a\n c)\n"
- (emacs-lisp-mode)
- ("3ob" [escape])
- "(and a\n b\n b\n [b]\n c)\n"))))
-
-(ert-deftest evil-test-open-below-folded ()
- "Test `evil-open-below' on folded lines"
- :tags '(evil insert)
- (evil-test-buffer
- "[l]ine1\n\n(let ()\n var)\n\nlast line\n"
- (emacs-lisp-mode)
- (hs-minor-mode 1)
- ("zm2joABC" [escape])
- "line1\n\n(let ()\n var)\nAB[C]\n\nlast line\n"))
-
-(ert-deftest evil-test-insert-line ()
- "Test `evil-insert-line'"
- :tags '(evil insert)
- (evil-test-buffer "foo [b]ar"
- ("Ievil rulz " [escape])
- "evil rulz[ ]foo bar")
- (ert-info ("With count")
- (evil-test-buffer "foo [b]ar"
- ("2Ievil rulz " [escape])
- "evil rulz evil rulz[ ]foo bar")))
-
-(ert-deftest evil-test-append-line ()
- "Test `evil-append-line'"
- :tags '(evil insert)
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save"
- ("Aevil rulz " [escape])
- ";; This buffer is for notes you don't want to saveevil rulz[ ]"))
-
-(ert-deftest evil-test-insert-digraph ()
- "Test `evil-insert-digraph'"
- :tags '(evil insert)
- (ert-info ("Predefined digraph")
- (evil-test-buffer
- ("i\C-kae")
- "æ[]"))
- (ert-info ("Custom digraph")
- (let ((evil-digraphs-table-user '(((?a ?o) . ?å))))
- (evil-test-buffer
- ("i\C-kao")
- "å[]")))
- (ert-info ("Digraph in replace state")
- (evil-test-buffer
- "ab[c]defgh"
- ("R\C-kc,")
- "abç[d]efgh")
- (ert-info ("with count")
- (evil-test-buffer
- "abc[d]efgh"
- ("R\C-u3\C-kd*")
- "abcδδδ[g]h"))))
-
-(ert-deftest evil-test-track-insertion ()
- "Test that the text of the previous insertion is tracked."
- (ert-info ("Moving the cursor starts a new insertion")
- (evil-test-buffer
- ("iabc" [left] "xxx" [escape] "o\C-a")
- "abxxxc\nxxx"))
- (ert-info ("Autoindentation should be excluded")
- (evil-test-buffer "\(setq x"
- (emacs-lisp-mode)
- ("o0\)" [escape] "o\C-a")
- "(setq x
- 0)
-0\)")))
-
-;;; Repeat system
-
-(ert-deftest evil-test-normalize-repeat-info ()
- "Test `evil-normalize-repeat-info'"
- :tags '(evil repeat)
- (ert-info ("Single array")
- (should (equal (evil-normalize-repeat-info
- '("abc"))
- '([?a ?b ?c])))
- (should (equal (evil-normalize-repeat-info
- '("\M-f"))
- (list (kbd "M-f")))))
- (ert-info ("Single symbol")
- (should (equal (evil-normalize-repeat-info
- '(SYM))
- '(SYM))))
- (ert-info ("Arrays only")
- (should (equal (evil-normalize-repeat-info
- '("abc" [XX YY] "def"))
- '([?a ?b ?c XX YY ?d ?e ?f]))))
- (ert-info ("Several symbols")
- (should (equal (evil-normalize-repeat-info
- '(BEG MID END))
- '(BEG MID END))))
- (ert-info ("Arrays with symbol at the beginning")
- (should (equal (evil-normalize-repeat-info
- '(BEG "abc" [XX YY] "def"))
- '(BEG [?a ?b ?c XX YY ?d ?e ?f]))))
- (ert-info ("Arrays with symbol at the end")
- (should (equal (evil-normalize-repeat-info
- '("abc" [XX YY] "def" END))
- '([?a ?b ?c XX YY ?d ?e ?f] END))))
- (ert-info ("Arrays with symbol in the middle")
- (should (equal (evil-normalize-repeat-info
- '("abc" [XX YY] MID "def" ))
- '([?a ?b ?c XX YY] MID [?d ?e ?f]))))
- (ert-info ("Concatenate arrays with several symbols")
- (should (equal (evil-normalize-repeat-info
- '(BEG "abc" [XX YY] MID "def" END))
- '(BEG [?a ?b ?c XX YY] MID [?d ?e ?f] END)))))
-
-(defun evil-test-repeat-info (keys &optional recorded)
- "Execute a sequence of keys and verify that `evil-repeat-ring'
-records them correctly. KEYS is the sequence of keys to execute.
-RECORDED is the expected sequence of recorded events.
-If nil, KEYS is used."
- (execute-kbd-macro keys)
- (should (equal (evil-normalize-repeat-info (ring-ref evil-repeat-ring 0))
- (list (vconcat (or recorded keys))))))
-
-(ert-deftest evil-test-normal-repeat-info-simple-command ()
- "Save key-sequence after simple editing command in Normal state"
- :tags '(evil repeat)
- (evil-test-buffer
- "[T]his is a test buffer"
- (ert-info ("Call simple command without count")
- (evil-test-repeat-info "x"))
- (ert-info ("Call simple command with count 3")
- (evil-test-repeat-info "3x"))))
-
-(ert-deftest evil-test-normal-repeat-info-char-command ()
- "Save key-sequence after editing command with character in Normal state"
- :tags '(evil repeat)
- (evil-test-buffer
- "[T]his is a test buffer"
- (ert-info ("Call command with character argument without count")
- (evil-test-repeat-info "r5"))
- (ert-info ("Call command with character argument with count 12")
- (evil-test-repeat-info "12rX"))))
-
-(ert-deftest evil-test-insert-repeat-info ()
- "Save key-sequence after Insert state"
- :tags '(evil repeat)
- (evil-test-buffer
- (ert-info ("Insert text without count")
- (evil-test-repeat-info (vconcat "iABC" [escape])))
- (ert-info ("Insert text with count 42")
- (evil-test-repeat-info (vconcat "42iABC" [escape])))))
-
-(ert-deftest evil-test-repeat ()
- "Repeat several editing commands"
- :tags '(evil repeat)
- (ert-info ("Repeat replace")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save"
- ("rX")
- "[X]; This buffer is for notes you don't want to save"
- ([right right] ".")
- "X;[X]This buffer is for notes you don't want to save"))
- (ert-info ("Repeat replace with count")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save"
- ("2rX")
- "X[X] This buffer is for notes you don't want to save"
- ([right right] ".")
- "XX X[X]is buffer is for notes you don't want to save"))
- (ert-info ("Repeat replace without count with a new count")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save"
- ("rX")
- "[X]; This buffer is for notes you don't want to save"
- ([right right] "13.")
- "X;XXXXXXXXXXXX[X]is for notes you don't want to save"))
- (ert-info ("Repeat replace with count replacing original count")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save"
- ("10rX")
- "XXXXXXXXX[X]ffer is for notes you don't want to save"
- ([right right] "20.")
- "XXXXXXXXXXfXXXXXXXXXXXXXXXXXXX[X] don't want to save"))
- (ert-info ("Repeat movement in Insert state")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save"
- ("i(\M-f)" [escape])
- ";; (This[)] buffer is for notes you don't want to save"
- ("w.")
- ";; (This) (buffer[)] is for notes you don't want to save"))
- (ert-info ("Repeat search motion with offset")
- (evil-select-search-module 'evil-search-module 'evil-search)
- (evil-test-buffer
- "[f]irst, second, third, fourth"
- ("d/, /e" [return])
- "[s]econd, third, fourth"
- ("2.")
- "[f]ourth")))
-
-(ert-deftest evil-test-repeat-register ()
- "Test repeating a register command."
- :tags '(evil repeat)
- (evil-test-buffer
- "[l]ine 1\nline 2\nline 3\nline 4\n"
- ("\"addyy\"aP")
- "[l]ine 1\nline 2\nline 3\nline 4\n"
- (".")
- "[l]ine 1\nline 1\nline 2\nline 3\nline 4\n"))
-
-(ert-deftest evil-test-repeat-numeric-register ()
- "Test repeating a command with a numeric register."
- :tags '(evil repeat)
- (evil-test-buffer
- "[l]ine 1\nline 2\nline 3\nline 4\nline 5\n"
- ("dd...")
- "[l]ine 5\n"
- ("\"1P")
- "[l]ine 4\nline 5\n"
- (".")
- "[l]ine 3\nline 4\nline 5\n"
- (".")
- "[l]ine 2\nline 3\nline 4\nline 5\n"
- (".")
- "[l]ine 1\nline 2\nline 3\nline 4\nline 5\n"))
-
-(ert-deftest evil-test-cmd-replace-char ()
- "Calling `evil-replace-char' should replace characters"
- :tags '(evil repeat)
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save"
- ("r5")
- "[5]; This buffer is for notes you don't want to save"
- ("3rX")
- "XX[X]This buffer is for notes you don't want to save")
- (ert-info ("Replace digraph")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save"
- ("r e'")
- "[é]; This buffer is for notes you don't want to save"
- ("3r c*")
- "ξξ[ξ]This buffer is for notes you don't want to save")
- (ert-info ("Repeat replace digraph")
- (evil-test-buffer
- "ab[c]defghijkl"
- ("r W*")
- "ab[Ω]defghijkl"
- ("fg" "2.")
- "abΩdefΩ[Ω]ijkl")))
- (ert-info ("Replacing \\n should insert only one newline")
- (evil-test-buffer
- "(setq var xxx [y]yy zzz)\n"
- (emacs-lisp-mode)
- (setq indent-tabs-mode nil)
- ("2r\n")
- "(setq var xxx \n [y] zzz)\n")))
-
-(ert-deftest evil-test-insert-with-count ()
- "Test `evil-insert' with repeat count"
- :tags '(evil repeat)
- (evil-test-buffer
- ";; [T]his buffer is for notes"
- ("2ievil rulz " [escape])
- ";; evil rulz evil rulz[ ]This buffer is for notes"))
-
-(ert-deftest evil-test-repeat-insert ()
- "Test repeating of `evil-insert'"
- :tags '(evil repeat)
- (ert-info ("Repeat insert")
- (evil-test-buffer
- "[;]; This buffer is for notes"
- ("iABC" [escape])
- "AB[C];; This buffer is for notes"
- ("..")
- "ABABAB[C]CC;; This buffer is for notes"))
- (ert-info ("Repeat insert with count")
- (evil-test-buffer
- "[;]; This buffer is for notes"
- ("2iABC" [escape])
- "ABCAB[C];; This buffer is for notes"
- ("..")
- "ABCABABCABABCAB[C]CC;; This buffer is for notes"))
- (ert-info ("Repeat insert with repeat count")
- (evil-test-buffer
- "[;]; This buffer is for notes"
- ("iABC" [escape])
- "AB[C];; This buffer is for notes"
- ("11.")
- "ABABCABCABCABCABCABCABCABCABCABCAB[C]C;; This buffer is for notes"))
- (ert-info ("Repeat insert with count with repeat with count")
- (evil-test-buffer
- "[;]; This buffer is for notes"
- ("10iABC" [escape])
- "ABCABCABCABCABCABCABCABCABCAB[C];; This buffer is for notes"
- ("11.")
- "ABCABCABCABCABCABCABCABCABCABABCABCABCABCABCABCABCABCABCABCAB[C]C;; \
-This buffer is for notes")))
-
-(ert-deftest evil-test-repeat-error ()
- "Test whether repeat returns to normal state in case of an error."
- (evil-test-buffer
- "[l]ine 1\nline 2\nline 3\nline 4"
- ("ixxx" [down] [down] [left] [left] [left] "yyy" [escape])
- "xxxline 1\nline 2\nyy[y]line 3\nline 4"
- (should-error (execute-kbd-macro "j^."))
- (should (evil-normal-state-p))
- ("^")
- "xxxline 1\nline 2\nyyyline 3\n[x]xxline 4"))
-
-(ert-deftest evil-test-quoted-insert ()
- "Test evil-quoted-insert in replace state."
- (ert-info ("Simple replace C-v")
- (evil-test-buffer
- "ab[c]defg"
- ("R\C-vx")
- "abx[d]efg"))
- (ert-info ("Control char replace C-v")
- (evil-test-buffer
- "ab[c]defg"
- ("R\C-v\C-g")
- "ab[d]efg"))
- (ert-info ("C-v with count")
- (evil-test-buffer
- "ab[c]defg"
- ("R\C-u3\C-vx")
- "abxxx[f]g"))
- (ert-info ("C-v with count near eol")
- (evil-test-buffer
- "abcde[f]g"
- ("R\C-u3\C-vx")
- "abcdexxx[]"))
- (ert-info ("C-v in replace can be backspaced")
- (evil-test-buffer
- "ab[c]defg"
- ("R\C-u3\C-vx" [backspace])
- "abxx[e]fg")))
-
-(ert-deftest evil-test-repeat-quoted-insert ()
- "Test whether `quoted-insert' can be repeated."
- (ert-info ("Insert C-v")
- (evil-test-buffer
- "lin[e] 1\nline 2\nline 3\n"
- ("i\C-v\C-v" [escape])
- "lin[]e 1\nline 2\nline 3\n"))
- (ert-info ("Insert ESC")
- (evil-test-buffer
- "lin[e] 1\nline 2\nline 3\n"
- ("i\C-v" [escape escape])
- "lin[]e 1\nline 2\nline 3\n"))
- (ert-info ("Block insert C-v")
- (evil-test-buffer
- "lin[e] 1\nline 2\nline 3\n"
- ("gg\C-vGI\C-v\C-v" [escape])
- "[]line 1\nline 2\nline 3\n")))
-
-(ert-deftest evil-test-insert-vcount ()
- "Test `evil-insert' with vertical repeating"
- :tags '(evil repeat)
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer.
-
-;; Below the empty line."
- (define-key evil-normal-state-local-map "i"
- #'(lambda (count)
- (interactive "p")
- (evil-insert count 5)))
- ("2iABC" [escape])
- "\
-;; ABCAB[C]This buffer is for notes you don't want to save.
-;; ABCABCIf you want to create a file, visit that file with C-x C-f,
-;; ABCABCthen enter the text in that file's own buffer.
- ABCABC
-;; ABCABCBelow the empty line."))
-
-(ert-deftest evil-test-append-with-count ()
- "Test `evil-append' with repeat count"
- :tags '(evil repeat)
- (evil-test-buffer
- ";; [T]his buffer is for notes"
- ("2aevil rulz " [escape])
- ";; Tevil rulz evil rulz[ ]his buffer is for notes"))
-
-(ert-deftest evil-test-repeat-append ()
- "Test repeating of `evil-append'"
- :tags '(evil repeat)
- (ert-info ("Repeat insert")
- (evil-test-buffer
- "[;]; This buffer is for notes"
- ("aABC" [escape])
- ";AB[C]; This buffer is for notes"
- ("..")
- ";ABCABCAB[C]; This buffer is for notes"))
- (ert-info ("Repeat insert with count")
- (evil-test-buffer
- "[;]; This buffer is for notes"
- ("2aABC" [escape])
- ";ABCAB[C]; This buffer is for notes"
- ("..")
- ";ABCABCABCABCABCAB[C]; This buffer is for notes"))
- (ert-info ("Repeat insert with repeat count")
- (evil-test-buffer
- "[;]; This buffer is for notes"
- ("aABC" [escape])
- ";AB[C]; This buffer is for notes"
- ("11.")
- ";ABCABCABCABCABCABCABCABCABCABCABCAB[C]; This buffer is for notes"))
- (ert-info ("Repeat insert with count with repeat with count")
- (evil-test-buffer
- "[;]; This buffer is for notes"
- ("10aABC" [escape])
- ";ABCABCABCABCABCABCABCABCABCAB[C]; This buffer is for notes"
- ("11.")
- ";ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCAB[C]; \
-This buffer is for notes")))
-
-(ert-deftest evil-test-append-vcount ()
- "Test `evil-append' with vertical repeating"
- :tags '(evil repeat)
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer.
-
-;; Below the empty line."
- (define-key evil-normal-state-local-map "a"
- #'(lambda (count)
- (interactive "p")
- (evil-append count 5)))
- ("2aABC" [escape])
- "\
-;; TABCAB[C]his buffer is for notes you don't want to save.
-;; IABCABCf you want to create a file, visit that file with C-x C-f,
-;; tABCABChen enter the text in that file's own buffer.
- ABCABC
-;; BABCABCelow the empty line."))
-
-(ert-deftest evil-test-open-above-with-count ()
- "Test `evil-open-above' with repeat count"
- :tags '(evil repeat)
- (evil-test-buffer
- ";; This buffer is for notes you don't want to save,
-\[;]; and for Lisp evaluation."
- ("2Oevil\nrulz" [escape])
- ";; This buffer is for notes you don't want to save,
-evil\nrulz\nevil\nrul[z]
-;; and for Lisp evaluation."))
-
-(ert-deftest evil-test-repeat-open-above ()
- "Test repeating of `evil-open-above'"
- :tags '(evil repeat)
- (ert-info ("Repeat insert")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save."
- ("Oevil\nrulz" [escape])
- "evil\nrul[z]
-;; This buffer is for notes you don't want to save."
- ("..")
- "evil\nevil\nevil\nrul[z]\nrulz\nrulz
-;; This buffer is for notes you don't want to save."))
- (ert-info ("Repeat insert with count")
- (evil-test-buffer
- ";; This buffer is for notes you don't want to save."
- ("2Oevil\nrulz" [escape])
- "evil\nrulz\nevil\nrul[z]
-;; This buffer is for notes you don't want to save."
- ("..")
- "evil\nrulz\nevil\nevil\nrulz\nevil\nevil\nrulz\nevil\nrul[z]\nrulz\nrulz
-;; This buffer is for notes you don't want to save."))
- (ert-info ("Repeat insert with repeat count")
- (evil-test-buffer
- ";; This buffer is for notes you don't want to save."
- ("Oevil\nrulz" [escape])
- "evil\nrul[z]\n;; This buffer is for notes you don't want to save."
- ("2.")
- "evil\nevil\nrulz\nevil\nrul[z]\nrulz
-;; This buffer is for notes you don't want to save."))
- (ert-info ("Repeat insert with count with repeat with count")
- (evil-test-buffer
- ";; This buffer is for notes you don't want to save."
- ("2Oevil\nrulz" [escape])
- "evil\nrulz\nevil\nrul[z]
-;; This buffer is for notes you don't want to save."
- ("3.")
- "evil\nrulz\nevil\nevil\nrulz\nevil\nrulz\nevil\nrul[z]\nrulz
-;; This buffer is for notes you don't want to save.")))
-
-(ert-deftest evil-test-open-below-with-count ()
- "Test insertion of `evil-open-below' with repeat count"
- :tags '(evil repeat)
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("2oevil\nrulz" [escape])
- ";; This buffer is for notes you don't want to save,
-evil\nrulz\nevil\nrul[z]
-;; and for Lisp evaluation."))
-
-(ert-deftest evil-test-repeat-open-below ()
- "Test repeating `evil-open-below'"
- :tags '(evil repeat)
- (ert-info ("Repeat insert")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("oevil\nrulz" [escape])
- ";; This buffer is for notes you don't want to save,
-evil\nrul[z]\n;; and for Lisp evaluation."
- ("..")
- ";; This buffer is for notes you don't want to save,
-evil\nrulz\nevil\nrulz\nevil\nrul[z]
-;; and for Lisp evaluation."))
- (ert-info ("Repeat insert with count")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("2oevil\nrulz" [escape])
- ";; This buffer is for notes you don't want to save,
-evil\nrulz\nevil\nrul[z]
-;; and for Lisp evaluation."
- ("..")
- ";; This buffer is for notes you don't want to save,
-evil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrul[z]
-;; and for Lisp evaluation."))
- (ert-info ("Repeat insert with repeat count")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("oevil\nrulz" [escape])
- ";; This buffer is for notes you don't want to save,
-evil\nrul[z]\n;; and for Lisp evaluation."
- ("2.")
- ";; This buffer is for notes you don't want to save,
-evil\nrulz\nevil\nrulz\nevil\nrul[z]
-;; and for Lisp evaluation."))
- (ert-info ("Repeat insert with count with repeat with count")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("2oevil\nrulz" [escape])
- ";; This buffer is for notes you don't want to save,
-evil\nrulz\nevil\nrul[z]
-;; and for Lisp evaluation."
- ("3.")
- ";; This buffer is for notes you don't want to save,
-evil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrul[z]
-;; and for Lisp evaluation.")))
-
-(ert-deftest evil-test-repeat-insert-line ()
- "Test repeating of `evil-insert-line'"
- :tags '(evil repeat)
- (ert-info ("Repeat insert")
- (evil-test-buffer
- ";; This buffer is for note[s]"
- ("IABC" [escape])
- "AB[C];; This buffer is for notes"
- ("..")
- "AB[C]ABCABC;; This buffer is for notes"))
- (ert-info ("Repeat insert with count")
- (evil-test-buffer
- ";; This buffer is for note[s]"
- ("2IABC" [escape])
- "ABCAB[C];; This buffer is for notes"
- ("..")
- "ABCAB[C]ABCABCABCABC;; This buffer is for notes"))
- (ert-info ("Repeat insert with repeat count")
- (evil-test-buffer
- ";; This buffer is for note[s]"
- ("IABC" [escape])
- "AB[C];; This buffer is for notes"
- ("11.")
- "ABCABCABCABCABCABCABCABCABCABCAB[C]ABC;; This buffer is for notes"))
- (ert-info ("Repeat insert with count with repeat with count")
- (evil-test-buffer
- ";; This buffer is for note[s]"
- ("10IABC" [escape])
- "ABCABCABCABCABCABCABCABCABCAB[C];; This buffer is for notes"
- ("11.")
- "ABCABCABCABCABCABCABCABCABCABCAB[C]ABCABCABCABCABCABCABCABCABCABC;; This buffer is for notes")))
-
-(ert-deftest evil-test-insert-line-vcount ()
- "Test `evil-insert-line' with vertical repeating"
- :tags '(evil repeat)
- (evil-test-buffer
- "int[ ]main(int argc, char** argv)
-{
- printf(\"Hello world\\n\");
- return EXIT_SUCCESS;
-}"
- (define-key evil-normal-state-local-map "I"
- #'(lambda (count)
- (interactive "p")
- (evil-insert-line count 4)))
- ("2IABC" [escape])
- "ABCABCint main(int argc, char** argv)
-ABCABC{
- ABCABCprintf(\"Hello world\\n\");
- ABCABCreturn EXIT_SUCCESS;
-}"))
-
-(ert-deftest evil-test-append-line-with-count ()
- "Test `evil-append-line' with repeat count"
- :tags '(evil repeat)
- (evil-test-buffer
- ";; [T]his buffer is for notes."
- ("2Aevil rulz " [escape])
- ";; This buffer is for notes.evil rulz evil rulz[ ]"))
-
-(ert-deftest evil-test-repeat-append-line ()
- "Test repeating of `evil-append-line'"
- :tags '(evil repeat)
- (ert-info ("Repeat insert")
- (evil-test-buffer
- ";; [T]his buffer is for notes."
- ("AABC" [escape])
- ";; This buffer is for notes.AB[C]"
- ("..")
- ";; This buffer is for notes.ABCABCAB[C]"))
- (ert-info ("Repeat insert with count")
- (evil-test-buffer
- ";; [T]his buffer is for notes."
- ("2AABC" [escape])
- ";; This buffer is for notes.ABCAB[C]"
- ("..")
- ";; This buffer is for notes.ABCABCABCABCABCAB[C]"))
- (ert-info ("Repeat insert with repeat count")
- (evil-test-buffer
- ";; [T]his buffer is for notes."
- ("AABC" [escape])
- ";; This buffer is for notes.ABC"
- ("11.")
- ";; This buffer is for notes.ABCABCABCABCABCABCABCABCABCABCABCAB[C]"))
- (ert-info ("Repeat insert with count with repeat with count")
- (evil-test-buffer
- ";; [T]his buffer is for notes."
- ("10AABC" [escape])
- ";; This buffer is for notes.ABCABCABCABCABCABCABCABCABCAB[C]"
- ("11.")
- ";; This buffer is for notes.ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCAB[C]"))
- (ert-info ("Repeat append over empty lines")
- (evil-test-buffer
- ""
- ("i" [return] [return] [return] [return] [return] [return] [escape] "gg\C-vGAX" [escape])
- "X\nX\nX\nX\nX\nX\n")))
-
-(ert-deftest evil-test-append-line-vcount ()
- "Test `evil-append-line' with vertical repeating"
- :tags '(evil repeat)
- (evil-test-buffer
- "int[ ]main(int argc, char** argv)
-{
- printf(\"Hello world\\n\");
- return EXIT_SUCCESS;
-}"
- (define-key evil-normal-state-local-map "A"
- #'(lambda (count)
- (interactive "p")
- (evil-append-line count 4)))
- ("2AABC" [escape])
- "int main(int argc, char** argv)ABCAB[C]
-{ABCABC
- printf(\"Hello world\\n\");ABCABC
- return EXIT_SUCCESS;ABCABC
-}"))
-
-(ert-deftest evil-test-repeat-by-change ()
- "Test repeating by tracking changes for completion commands"
- :tags '(evil repeat)
- (let ((line-move-visual nil)
- (change (evil-define-command nil ()
- :repeat change
- (interactive)
- (delete-char 5)
- (insert "BEGIN\n")
- (save-excursion
- (insert "\nEND\n")))))
- (evil-test-buffer
- ";; [T]his buffer is for notes."
- (define-key evil-insert-state-local-map (kbd "C-c C-p") change)
- ("iABC " (kbd "C-c C-p") "BODY" [escape])
- ";; ABC BEGIN
-BOD[Y]
-END
-buffer is for notes."
- (".")
- ";; ABC BEGIN
-BODABC BEGIN
-BOD[Y]
-END
-
-buffer is for notes.")))
-
-(ert-deftest evil-test-repeat-kill-buffer ()
- "Test safe-guard preventing buffers from being deleted
-when repeating a command"
- :tags '(evil repeat)
- (ert-info ("Test killing works for direct calls \
-to `evil-execute-repeat-info'")
- (evil-test-buffer
- "[;]; This buffer is for notes."
- (setq evil-repeat-ring (make-ring 10))
- (ring-insert evil-repeat-ring '((kill-buffer nil)))
- (evil-execute-repeat-info (ring-ref evil-repeat-ring 0))
- (should-not (looking-at ";; This"))))
- (ert-info ("Verify an error is raised when using \
-the `evil-repeat' command")
- (evil-test-buffer
- "[;]; This buffer is for notes."
- (setq evil-repeat-ring (make-ring 10))
- (ring-insert evil-repeat-ring '((kill-buffer nil)))
- (evil-execute-repeat-info (ring-ref evil-repeat-ring 0))
- (should-error (call-interactively #'evil-repeat)))))
-
-(ert-deftest evil-test-repeat-pop ()
- "Test `repeat-pop'."
- :tags '(evil repeat)
- (ert-info ("Test repeat-pop")
- (evil-test-buffer
- ";; [T]his buffer is for notes."
- (setq evil-repeat-ring (make-ring 10))
- ("iABC" [escape] "aXYZ" [escape])
- ";; ABCXY[Z]This buffer is for notes."
- (".")
- ";; ABCXYZXY[Z]This buffer is for notes."))
- (ert-info ("Test repeat-pop")
- (evil-test-buffer
- ";; [T]his buffer is for notes."
- (setq evil-repeat-ring (make-ring 10))
- ("iABC" [escape] "aXYZ" [escape])
- ";; ABCXY[Z]This buffer is for notes."
- ("." (kbd "C-."))
- ";; ABCXYAB[C]ZThis buffer is for notes."))
- (ert-info ("Test repeat-pop-next")
- (evil-test-buffer
- ";; [T]his buffer is for notes."
- (setq evil-repeat-ring (make-ring 10))
- ("iABC" [escape] "aXYZ" [escape])
- ";; ABCXY[Z]This buffer is for notes."
- ("." (kbd "C-.") (kbd "M-."))
- ";; ABCXYZXY[Z]This buffer is for notes."))
- (ert-info ("Test repeat-pop after non-change")
- (evil-test-buffer
- ";; [T]his buffer is for notes."
- (setq evil-repeat-ring (make-ring 10))
- ("iABC" [escape] "a" [escape] "aXYZ" [escape])
- ";; ABCXY[Z]This buffer is for notes."
- ("." (kbd "C-.") (kbd "C-."))
- ";; ABCXYAB[C]ZThis buffer is for notes.")))
-
-(ert-deftest evil-test-ESC-repeat-normal-state ()
- "Test if ESC is not been recorded in normal state."
- :tags '(evil repeat)
- (ert-info ("Test normal ESC")
- (evil-test-buffer
- ";;[ ]This buffer is for notes."
- (setq evil-repeat-ring (make-ring 10))
- (should (= (ring-length evil-repeat-ring) 0))
- ("aABC" [escape])
- ";; AB[C]This buffer is for notes."
- (should (= (ring-length evil-repeat-ring) 1))
- (".")
- ";; ABCAB[C]This buffer is for notes."
- ([escape])
- (should (= (ring-length evil-repeat-ring) 1))
- (".")
- ";; ABCABCAB[C]This buffer is for notes.")))
-
-(ert-deftest evil-test-abort-operator-repeat ()
- "Test if ESC in operator-state cancels recording of repeation."
- :tags '(evil repeat)
- (let ((inhibit-quit t))
- (ert-info ("Test ESC")
- (evil-test-buffer
- ";;[ ]This buffer is for notes."
- (setq evil-repeat-ring (make-ring 10))
- (should (= (ring-length evil-repeat-ring) 0))
- ("aABC" [escape])
- ";; AB[C]This buffer is for notes."
- (should (= (ring-length evil-repeat-ring) 1))
- (".")
- ";; ABCAB[C]This buffer is for notes."
- ("d" [escape])
- (should (= (ring-length evil-repeat-ring) 1))
- (".")
- ";; ABCABCAB[C]This buffer is for notes."))))
-
-(ert-deftest evil-test-repeat-with-find-char ()
- "Ensure that repeating find-char commands doesn't change `evil-last-find'"
- :tags '(evil repeat)
- (evil-test-buffer
- "[b]ar baz bat"
- ("dfa" "fb")
- "r [b]az bat"
- (".")
- "r [z] bat"
- (";")
- "r z [b]at"))
-
-(ert-deftest evil-test-repeat-visual-char ()
- "Test repeat of character visual mode command."
- :tags '(evil repeat)
- (ert-info ("Test repeat on same line")
- (evil-test-buffer
- ";; [T]his buffer is for notes."
- ("v3lcABC" [escape])
- ";; AB[C] buffer is for notes."
- ("ww.")
- ";; ABC buffer AB[C]or notes."))
- (ert-info ("Test repeat on several lines")
- (evil-test-buffer
- ";; This [b]uffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer.
-"
- ("vj^eerX")
- ";; This XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-XXXX[X] you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer.
-"
- ("2gg^3w.")
- ";; This XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-XXXXX you want XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-XXXX[X]en enter the text in that file's own buffer.
-")))
-
-(ert-deftest evil-test-repeat-visual-line ()
- "Test repeat of linewise visual mode command."
- :tags '(evil repeat)
- (ert-info ("Test repeat on several lines")
- (evil-test-buffer
- ";; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter th[e] text in that file's own buffer.
-
-;; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer.
-"
- ("VkcNew Text" [escape])
- ";; This buffer is for notes you don't want to save.
-New Tex[t]
-
-;; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer.
-"
- ("jj.")
- ";; This buffer is for notes you don't want to save.
-New Text
-
-New Tex[t]
-;; then enter the text in that file's own buffer.
-")))
-
-(ert-deftest evil-test-repeat-visual-block ()
- "Test repeat of block visual mode command."
- :tags '(evil repeat)
- (ert-info ("Test repeat on several lines")
- (evil-test-buffer
- ";; This [b]uffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer.
-;; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer.
-"
- ((kbd "C-v") "3j2lrQ")
- ";; This [Q]QQfer is for notes you don't want to save.
-;; If yoQQQant to create a file, visit that file with C-x C-f,
-;; then QQQer the text in that file's own buffer.
-;; This QQQfer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer.
-"
- ("2j3w.")
- ";; This QQQfer is for notes you don't want to save.
-;; If yoQQQant to create a file, visit that file with C-x C-f,
-;; then QQQer the text [Q]QQthat file's own buffer.
-;; This QQQfer is for nQQQs you don't want to save.
-;; If you want to creatQQQ file, visit that file with C-x C-f,
-;; then enter the text QQQthat file's own buffer.
-")))
-
-(ert-deftest evil-visual-block-append ()
- "Test appending in visual block."
- :tags '(evil visual insert)
- (ert-info ("Simple append")
- (evil-test-buffer
- "l[i]ne 1\nline 2\nline 3\n"
- ((kbd "C-v") "jjllAXXX" [escape])
- "lineXX[X] 1\nlineXXX 2\nlineXXX 3\n"))
- (ert-info ("Append after empty lines")
- (evil-test-buffer
- "line 1l[i]ne 1\nline 2\nline 3line 3\n"
- (setq indent-tabs-mode nil)
- ((kbd "C-v") "jjllAXXX" [escape])
- "line 1lineXX[X] 1\nline 2 XXX\nline 3lineXXX 3\n"))
- (ert-info ("Append after empty first line")
- (evil-test-buffer
- "l[i]ne 1line 1\nline 2\nline 3line 3line 3\n"
- (setq indent-tabs-mode nil)
- ((kbd "C-v") "jj3feAXXX" [escape])
- "line 1line 1 XX[X]\nline 2 XXX\nline 3line 3lineXXX 3\n"))
- (ert-info ("Append after end of lines")
- (evil-test-buffer
- "line 1l[i]ne 1line 1\nline 2\nline 3line 3\n"
- (setq indent-tabs-mode nil)
- ((kbd "C-v") "jj$AXXX" [escape])
- "line 1line 1line 1XX[X]\nline 2XXX\nline 3line 3XXX\n")))
-
-(ert-deftest evil-visual-block-insert ()
- "Test inserting (prepending) in visual block."
- :tags '(evil visual insert)
- (ert-info ("Prepend and repeat")
- (evil-test-buffer
- "[a]lpha\nbravo\ncharlie\ndelta\necho\nfoxtrot\ngolf"
- ("\C-v" "jj" "I" "zulu" [escape])
- "zul[u]alpha\nzulubravo\nzulucharlie\ndelta\necho\nfoxtrot\ngolf"
- ("/delta" [return] ".")
- "zulualpha\nzulubravo\nzulucharlie\nzul[u]delta\nzuluecho\nzulufoxtrot\ngolf")))
-
-(ert-deftest evil-test-repeat-digraph ()
- "Test repeat of insertion of a digraph."
- :tags '(evil digraph repeat)
- (evil-test-buffer
- "Line with ['] several apostrophes ', yeah."
- ("s" (kbd "C-k") "'9" [escape])
- "Line with [’] several apostrophes ', yeah."
- ("f'.")
- "Line with ’ several apostrophes [’], yeah."))
-
-;;; Operators
-
-(ert-deftest evil-test-indent ()
- "Test `evil-indent'"
- :tags '(evil visual operator)
- (evil-test-buffer
- :state visual
- "< Line with too much indentation.>"
- ("=")
- "Line with too much indentation.")
- (ert-info ("Can repeat evil-indent without errors")
- (evil-test-buffer
- "[ ]x\n x"
- ("==j.")
- "x\nx")))
-
-(ert-deftest evil-test-keypress-parser ()
- "Test `evil-keypress-parser'"
- :tags '(evil operator)
- (evil-test-buffer
- :state operator
- (ert-info ("Read from the keyboard unless INPUT is given")
- (evil-test-buffer
- :state operator
- (let ((unread-command-events '(?d)))
- (should (equal (evil-keypress-parser)
- '(evil-delete nil)))
- (should (equal (evil-keypress-parser '(?d))
- '(evil-delete nil))))))
- (ert-info ("Read remainder from the keyboard if INPUT is incomplete")
- (let ((unread-command-events '(?d)))
- (should (equal (evil-keypress-parser '(?2))
- '(evil-delete 2)))))
- (ert-info ("Handle counts not starting with zero")
- (should (equal (evil-keypress-parser '(?2 ?d))
- '(evil-delete 2)))
- (should (equal (evil-keypress-parser '(?2 ?0 ?d))
- '(evil-delete 20)))
- (should (equal (evil-keypress-parser '(?2 ?0 ?2 ?d))
- '(evil-delete 202)))
- (should (equal (evil-keypress-parser '(?4 ?0 ?4 ?g ??))
- '(evil-rot13 404))))
- (ert-info ("Treat 0 as a motion")
- (should (equal
- (evil-keypress-parser '(?0))
- '(evil-beginning-of-line nil))))
- (ert-info ("Handle keyboard macros")
- (evil-test-buffer
- (define-key evil-motion-state-local-map (kbd "W") (kbd "w"))
- (should (equal (evil-keypress-parser '(?W))
- '(evil-forward-word-begin nil)))))))
-
-(ert-deftest evil-test-invert-char ()
- "Test `evil-invert-char'"
- :tags '(evil operator)
- (evil-test-buffer
- ";; [T]his buffer is for notes."
- ("~")
- ";; t[h]is buffer is for notes.")
- (evil-test-buffer
- ";; <[T]his> buffer is for notes."
- ("~")
- ";; [t]HIS buffer is for notes.")
- (evil-test-buffer
- :visual block
- ";; <[T]his buffer is for notes,
-;; and >for Lisp evaluation."
- ("~")
- ";; [t]HIS buffer is for notes,
-;; AND for Lisp evaluation."))
-
-(ert-deftest evil-test-rot13 ()
- "Test `evil-rot13'"
- :tags '(evil operator)
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save."
- ("g?" [M-right])
- ";; [G]uvf buffer is for notes you don't want to save."))
-
-(ert-deftest evil-test-rot13-with-count ()
- "Test `evil-rot13' with count argument"
- :tags '(evil operator)
- (ert-info ("Count before operator")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save."
- ("2g?" [M-right])
- ";; [G]uvf ohssre is for notes you don't want to save."))
- (ert-info ("Count before motion")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save."
- ("g?2" [M-right])
- ";; [G]uvf ohssre is for notes you don't want to save."))
- (ert-info ("Count before operator and motion")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save."
- ("3g?2" [M-right])
- ";; [G]uvf ohssre vf sbe abgrf lbh don't want to save."))
- (ert-info ("Count exceeding buffer boundaries")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save."
- ("g?200" [right])
- ";; [G]uvf ohssre vf sbe abgrf lbh qba'g jnag gb fnir.")))
-
-(ert-deftest evil-test-rot13-repeat ()
- "Test repeating of `evil-rot13'"
- :tags '(evil operator)
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save."
- ("g?" [M-right] [M-right])
- ";; Guvf[ ]buffer is for notes you don't want to save."
- (".")
- ";; Guvf[ ]ohssre is for notes you don't want to save."))
-
-(ert-deftest evil-test-rot13-repeat-with-count ()
- "Test repeating of `evil-rot13' with new count"
- :tags '(evil operator)
- (ert-info ("Count before operator")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save."
- ("2g?" [M-right])
- ";; [G]uvf ohssre is for notes you don't want to save."
- ("3.")
- ";; [T]his buffer vf for notes you don't want to save."))
- (ert-info ("Count before motion")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save."
- ("g?2" [M-right])
- ";; [G]uvf ohssre is for notes you don't want to save."
- ("3.")
- ";; [T]his buffer vf for notes you don't want to save."))
- (ert-info ("Count before operator and motion")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save."
- ("3g?2" [M-right])
- ";; [G]uvf ohssre vf sbe abgrf lbh don't want to save."
- ("4.")
- ";; [T]his buffer is for abgrf lbh don't want to save.")))
-
-(ert-deftest evil-test-operator-delete ()
- "Test deleting text"
- :tags '(evil operator)
- (ert-info ("Delete characters")
- (evil-test-buffer
- ";; [T]his buffer is for notes."
- ("dl")
- ";; [h]is buffer is for notes."
- ("d1l")
- ";; [i]s buffer is for notes."
- ("1dl")
- ";; [s] buffer is for notes."
- ("1d1l")
- ";; [ ]buffer is for notes."
- ("d2l")
- ";; [u]ffer is for notes."
- ("2dl")
- ";; [f]er is for notes."
- ("d4l")
- ";; [i]s for notes."
- ("4dl")
- ";; [o]r notes."
- ("2d2l")
- ";; [o]tes."))
- (ert-info ("Delete current line")
- (ert-info ("With `evil-start-of-line' `nil'")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("dd")
- ";; [a]nd for Lisp evaluation.")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("d1d")
- ";; [a]nd for Lisp evaluation.")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("1dd")
- ";; [a]nd for Lisp evaluation.")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("1d1d")
- ";; [a]nd for Lisp evaluation."))
- (ert-info ("With `evil-start-of-line' `t'")
- (let ((evil-start-of-line t))
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("dd")
- "[;]; and for Lisp evaluation.")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("d1d")
- "[;]; and for Lisp evaluation.")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("1dd")
- "[;]; and for Lisp evaluation.")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("1d1d")
- "[;]; and for Lisp evaluation."))))
- (ert-info ("Delete two lines")
- (ert-info ("With `evil-start-of-line' `nil'")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- ("d2d")
- ";; [t]hen enter the text in that file's own buffer.")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- ("2dd")
- ";; [t]hen enter the text in that file's own buffer.")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- ("dj")
- ";; [t]hen enter the text in that file's own buffer.")
- (evil-test-buffer
- ";; This buffer is for notes you don't want to save.
-;; [I]f you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- ("dk")
- ";; [t]hen enter the text in that file's own buffer."))
- (ert-info ("With `evil-start-of-line' `t'")
- (let ((evil-start-of-line t))
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- ("d2d")
- "[;]; then enter the text in that file's own buffer.")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- ("2dd")
- "[;]; then enter the text in that file's own buffer.")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- ("dj")
- "[;]; then enter the text in that file's own buffer.")
- (evil-test-buffer
- ";; This buffer is for notes you don't want to save.
-;; [I]f you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- ("dk")
- "[;]; then enter the text in that file's own buffer.")))))
-
-(evil-define-motion evil-test-square-motion (count)
- "Test motion for selecting a square."
- :type block
- (let ((column (current-column)))
- (forward-line (1- count))
- (move-to-column (+ column count -1))))
-
-(ert-deftest evil-test-yank ()
- "Test `evil-yank'"
- :tags '(evil operator yank)
- (ert-info ("Yank characters")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save."
- ("y2e")
- (should (string= (current-kill 0) "This buffer"))))
- (ert-info ("Yank lines")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- ("yj")
- (should (string= (current-kill 0)
- (buffer-substring (point-min)
- (1+ (line-end-position 2)))))
- (should (eq (car-safe (get-text-property 0 'yank-handler
- (current-kill 0)))
- 'evil-yank-line-handler)))
- (evil-test-buffer
- ";; This buffer is for notes you don't want to save.
-\[;]; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- ("y5j")
- (should
- (string= (current-kill 0)
- (concat (buffer-substring (line-beginning-position 1)
- (point-max))
- "\n")))
- (should (eq (car-safe (get-text-property 0 'yank-handler
- (current-kill 0)))
- 'evil-yank-line-handler))))
- (ert-info ("Yank rectangle")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (define-key evil-operator-state-local-map "s" #'evil-test-square-motion)
- ("y3s")
- (should (string= (current-kill 0) "Thi\nIf \nthe"))
- (should (eq (car-safe (get-text-property 0 'yank-handler
- (current-kill 0)))
- 'evil-yank-block-handler))))
- (ert-info (":yank, then paste")
- (evil-test-buffer
- "a\n[b]\nc\nd\n"
- (":yank" [return] "p")
- "a\nb\nb\nc\nd\n"))
- (ert-info (":yank with COUNT")
- (evil-test-buffer
- "a\n[b]\nc\nd\n"
- (":yank 2" [return] "p")
- "a\nb\nb\nc\nc\nd\n"))
- (ert-info (":yank with COUNT in visual state")
- (evil-test-buffer
- "a\n<b\nc>\nd\ne\nf\n"
- (":yank 3" [return] "p")
- "a\nb\nc\nd\ne\nc\nd\ne\nf\n"))
- (ert-info (":yank with REGISTER")
- (evil-test-buffer
- "a\n[b]\nc\nd\n"
- (":yank r") ;; yank into the 'r' register
- "a\nb\nc\nd\n"
- ;; check the 'r' register contains the yanked text
- (should (string= (substring-no-properties (evil-get-register ?r)) "b\n"))))
- (ert-info (":yank with REGISTER and COUNT")
- (evil-test-buffer
- "a\n[b]\nc\nd\ne\nf\n"
- (":yank r 3")
- "a\nb\nc\nd\ne\nf\n"
- (should (string= (substring-no-properties (evil-get-register ?r)) "b\nc\nd\n"))))
- (ert-info (":yank with range yanks without moving point")
- (evil-test-buffer
- "[a]\nb\nc\nd\ne\n"
- (":4y" [return] "p")
- "a\n[d]\nb\nc\nd\ne\n")
- (evil-test-buffer
- "[a]\nb\nc\nd\ne\n"
- (":+4y" [return] "p")
- "a\n[e]\nb\nc\nd\ne\n")
- (evil-test-buffer
- "1\n2\n3\n4\n5\n6\n7\n8\n9\n1[0]"
- (":-5,.y")
- "1\n2\n3\n4\n5\n6\n7\n8\n9\n1[0]")
- (evil-test-buffer
- "1\n2\n3\n4\n[5]\n6\n7\n8\n9\n10"
- ("my" "G" ":'y,.y")
- "1\n2\n3\n4\n5\n6\n7\n8\n9\n[1]0")))
-
-(ert-deftest evil-test-yank-line ()
- "Test `evil-yank-line'"
- :tags '(evil operator)
- (ert-info ("Yank line with eof being part of visual selection")
- (evil-test-buffer
- ";; This is line one
-;; This is lin[e] two
-;; This is line three"
- ("v$Yjp")
- ";; This is line one
-;; This is line two
-;; This is line three
-[;]; This is line two")))
-
-(ert-deftest evil-test-delete ()
- "Test `evil-delete'"
- :tags '(evil operator delete)
- (ert-info ("Delete characters")
- (evil-test-buffer
- ";; This buffer is for notes you don't want to save[.]"
- ("x")
- ";; This buffer is for notes you don't want to sav[e]"
- (goto-char 4)
- ";; [T]his buffer is for notes you don't want to save"
- ("d2e")
- ";; [ ]is for notes you don't want to save"
- (should (string= (current-kill 0) "This buffer"))
- ("P")
- ";; This buffe[r] is for notes you don't want to save"))
- (ert-info ("Delete lines")
- (ert-info ("With `evil-start-of-line' `nil'")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- ("2dd")
- ";; [t]hen enter the text in that file's own buffer."
- ("P")
- "[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."))
- (ert-info ("With `evil-start-of-line' `t'")
- (let ((evil-start-of-line t))
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- ("2dd")
- "[;]; then enter the text in that file's own buffer."
- ("P")
- "[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."))))
- (ert-info ("Delete last line")
- (evil-test-buffer
- ";; This buffer is for notes you don't want to save.
-;; [I]f you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- ("2dd")
- ";; [T]his buffer is for notes you don't want to save."))
- (ert-info ("Delete last empty line")
- (evil-test-buffer
- "line 1\nline 2\n\n[]"
- ("dd")
- "line 1\nline 2\n[]"))
- (ert-info ("Delete rectangle")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (define-key evil-operator-state-local-map "s" #'evil-test-square-motion)
- ("d3s")
- "[T]his buffer is for notes you don't want to save.
-If you want to create a file, visit that file with C-x C-f,
-then enter the text in that file's own buffer."))
- (ert-info (":delete")
- (evil-test-buffer
- "a\n[b]\nc\nd\n"
- (":delete")
- "a\nc\nd\n"))
- (ert-info (":delete with COUNT")
- (evil-test-buffer
- "a\n[b]\nc\nd\n"
- (":delete 2")
- "a\nd\n"))
- (ert-info (":delete with COUNT in visual state")
- (evil-test-buffer
- "a\n<b\nc>\nd\ne\nf\n"
- (":delete 3")
- "a\nb\nf\n"))
- (ert-info (":delete with REGISTER")
- (evil-test-buffer
- "a\n[b]\nc\nd\n"
- (":delete r") ;; delete into the 'r' register
- "a\nc\nd\n"
- ;; check the 'r' register contains the deleted text
- (should (string= (substring-no-properties (evil-get-register ?r)) "b\n"))))
- (ert-info (":delete with REGISTER and COUNT")
- (evil-test-buffer
- "a\n[b]\nc\nd\ne\nf\n"
- (":delete r 3")
- "a\ne\nf\n"
- (should (string= (substring-no-properties (evil-get-register ?r)) "b\nc\nd\n"))))
- (ert-info ("Charwise multiple whole line delete becomes linewise")
- (evil-test-buffer
- "1\n[2]\n3\n4"
- ("d2w")
- "1\n[4]")))
-
-(ert-deftest evil-test-delete-line ()
- "Test `evil-delete-line'"
- :tags '(evil operator)
- (ert-info ("Delete to end of line")
- (evil-test-buffer
- ";; This buffer is for notes[ ]you don't want to save."
- ("D")
- ";; This buffer is for note[s]"))
- (ert-info ("Act linewise on character selection")
- (evil-test-buffer
- ";; This <buffe[r]> is for notes,
-and for Lisp evaluation."
- ("D")
- "and for Lisp [e]valuation."))
- (ert-info ("Act on each line of block selection")
- (evil-test-buffer
- :visual block
- ";; This buffer is for <notes,
-;; and for Lisp evaluatio[n]>."
- ("D")
- ";; This buffer is for[ ]
-;; and for Lisp evalua"))
- (ert-info ("Yank full block with block selection")
- (evil-test-buffer
- :visual block
- "line1 l<ine1 line1 line1\nline2 line2\nline3 lin>e3 line3\n"
- ("D")
- "line1 [l]\nline2 l\nline3 l\n"
- ("0P")
- "ine1 line1 line1line1 l
-ine2 line2 l
-ine3 line3 line3 l\n"))
- (ert-info ("Delete additional whole lines with count")
- (evil-test-buffer
- "a[a]a\nbbb\nc\n"
- ("2D")
- "a\nc\n"))
- (ert-info ("Delete line with eof being part of visual selection")
- (evil-test-buffer
- ";; This is line one
-;; This is lin[e] two
-;; This is line three"
- ("v$D")
- ";; This is line one
-;; This is line three"))
- (ert-info ("Deletion in normal state leaves point in the right place")
- (evil-test-buffer
- "alpha b[r]avo charlie\ndelta echo foxtrot\ngolf hotel india"
- (should-not evil-start-of-line)
- ("D")
- "alpha [b]\ndelta echo foxtrot\ngolf hotel india"
- ("/echo" [return] "C" "newtext" [escape])
- "alpha b\ndelta newtex[t]\ngolf hotel india")
- (let ((evil-start-of-line t))
- (evil-test-buffer
- "alpha b[r]avo charlie\ndelta echo foxtrot\ngolf hotel india"
- ("D")
- "alpha [b]\ndelta echo foxtrot\ngolf hotel india"
- ("/echo" [return] "C" "newtext" [escape])
- "alpha b\ndelta newtex[t]\ngolf hotel india")))
- (ert-info ("Line deletion in visual state leaves point in the right place")
- (evil-test-buffer
- "alpha [b]ravo charlie\ndelta echo foxtrot\ngolf hotel india"
- (should-not evil-start-of-line)
- ("vD")
- "delta [e]cho foxtrot\ngolf hotel india"
- ("vX")
- "golf h[o]tel india")
- (let ((evil-start-of-line t))
- (evil-test-buffer
- "alpha [b]ravo charlie\ndelta echo foxtrot\ngolf hotel india"
- ("vD")
- "[d]elta echo foxtrot\ngolf hotel india"
- ("vX")
- "[g]olf hotel india"))))
-
-(ert-deftest evil-test-delete-folded ()
- "Test `evil-delete' on folded lines."
- :tags '(evil operator)
- (ert-info ("Delete folded lines")
- (evil-test-buffer
- "[l]ine1\n\n(let ()\n var)\n\n(let ()\n var2)\n"
- (emacs-lisp-mode)
- (hs-minor-mode 1)
- ("zm2jdd")
- "line1\n\n[\n](let ()\n var2)\n"))
- (ert-info ("Delete folded lines with count")
- (evil-test-buffer
- "[l]ine1\n\n(let ()\n var)\n\n(let ()\n var2)\n\nlast line\n"
- (emacs-lisp-mode)
- (hs-minor-mode 1)
- ("zm2j3dd")
- "line1\n\n[\n]last line\n")))
-
-(ert-deftest evil-test-delete-backward-word ()
- "Test `evil-delete-backward-word' in insert & replace states, and ex command-line."
- :tags '(evil)
- (ert-info ("evil-delete-backward-word in insert state")
- (let ((evil-backspace-join-lines t))
- (evil-test-buffer
- "abc def\n ghi j[k]l\n"
- ("i" (kbd "C-w"))
- "abc def\n ghi [k]l\n"
- ((kbd "C-w"))
- "abc def\n [k]l\n"
- ((kbd "C-w"))
- "abc def\n[k]l\n"
- ((kbd "C-w"))
- "abc def[k]l\n"))
- (let (evil-backspace-join-lines)
- (evil-test-buffer
- "abc def\n[k]l\n"
- (should-error (execute-kbd-macro (concat "i" (kbd "C-w"))))
- "abc def\n[k]l\n")))
- (ert-info ("evil-delete-backward-word in replace state")
- (evil-test-buffer
- "alpha bravo [c]harlie delta"
- ("R" "one two")
- "alpha bravo one two[ ]delta"
- ("\C-w")
- "alpha bravo one [l]ie delta"
- ("\C-w")
- "alpha bravo [c]harlie delta"
- ("\C-w")
- "alpha [b]ravo charlie delta"))
- (ert-info ("evil-delete-backward-word in ex command-line")
- (evil-test-buffer
- "[ ]"
- (":normal i" "one-two" (kbd "C-w") (kbd "C-w") [return])
- "on[e]")))
-
-(ert-deftest evil-test-visual-X ()
- "Test `X' in visual state."
- :tags '(evil)
- (evil-test-buffer
- "This is line one\nThis is lin[e] two\nThis is line three"
- ("v$oX")
- "This is line one\nThis is lin[e] three"))
-
-(ert-deftest evil-test-delete-back-to-indentation ()
- "Test `evil-delete-back-to-indentation' in insert & replace states."
- :tags '(evil)
- (let ((evil-backspace-join-lines t))
- (evil-test-buffer
- "abc def\n ghi j[k]l\n"
- ("i" (call-interactively #'evil-delete-back-to-indentation))
- "abc def\n [k]l\n"
- (left-char 2)
- "abc def\n [ ] kl\n"
- (call-interactively #'evil-delete-back-to-indentation)
- "abc def\n[ ] kl\n"
- (call-interactively #'evil-delete-back-to-indentation)
- "abc def[ ] kl\n"))
- (let (evil-backspace-join-lines)
- (evil-test-buffer
- "abc def\n[k]l\n"
- (should-error
- (progn
- (execute-kbd-macro "i")
- (call-interactively #'evil-delete-back-to-indentation)))
- "abc def\n[k]l\n"))
- (ert-info ("Delete back to indentation in replace state")
- (evil-test-buffer
- " alpha [b]ravo charlie"
- ("R" "delta")
- " alpha delta[ ]charlie"
- (evil-delete-back-to-indentation)
- " [a]lpha bravo charlie")))
-
-(ert-deftest evil-test-change ()
- "Test `evil-change'"
- :tags '(evil operator)
- (ert-info ("Change characters")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save."
- ("c2eABC" [escape])
- ";; AB[C] is for notes you don't want to save."
- (should (string= (current-kill 0) "This buffer"))
- ("p")
- ";; ABCThis buffe[r] is for notes you don't want to save."))
- (ert-info ("Change lines")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- ("2ccABCLINE\nDEFLINE" [escape])
- "ABCLINE
-DEFLIN[E]
-;; then enter the text in that file's own buffer."
- ("p")
- "ABCLINE
-DEFLINE
-\[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."))
- (ert-info ("Change last line")
- (evil-test-buffer
- ";; This buffer is for notes you don't want to save.
-;; [I]f you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- ("2ccABC" [escape])
- ";; This buffer is for notes you don't want to save.
-AB[C]"))
- (ert-info ("C changes whole line in visual characterwise and linewise states")
- (evil-test-buffer
- "Two lines [s]hould suffice
-for this test."
- ("veC" "all gone!")
- "all gone![]
-for this test.")
- (evil-test-buffer
- "Two lines [w]ill be fine
-for this test too."
- ("VjC" "all gone!")
- "all gone![]"))
- (ert-info ("C clears the visual blockwise selection, and all text to the right")
- (evil-test-buffer
- "Two [l]ines will be fine for
-the tests here as well."
- ("\C-vjeC")
- "Two []
-the "))
- (ert-info ("S clears the whole line in normal mode, and all lines touched by visual selection")
- (evil-test-buffer
- "Two lines [s]hould suffice
-for this test."
- ("S" "all gone!")
- "all gone![]
-for this test.")
- (evil-test-buffer
- "Two lines [s]hould suffice
-for this test."
- ("vS" "all gone!")
- "all gone![]
-for this test.")
- (evil-test-buffer
- "Two lines [s]hould suffice
-for this test."
- ("VjS" "all gone!")
- "all gone![]")
- (evil-test-buffer
- "Two lines [s]hould suffice
-for this test."
- ("\C-VjS" "all gone!")
- "all gone![]"))
- (ert-info ("R behaves the same as S in visual modes")
- (evil-test-buffer
- "Two lines [s]hould suffice
-for this test."
- ("vR" "all gone!")
- "all gone![]
-for this test."))
- (ert-info ("Change rectangle")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (define-key evil-operator-state-local-map "s" #'evil-test-square-motion)
- ("c3sABC" [escape])
- "AB[C]This buffer is for notes you don't want to save.
-ABCIf you want to create a file, visit that file with C-x C-f,
-ABCthen enter the text in that file's own buffer.")))
-
-(ert-deftest evil-maybe-remove-spaces-test ()
- "Test maybe removing (indentation) spaces after some commands when making a clear line."
- :tags '(evil operator)
- (ert-info ("changing the line and returning to normal mode removes spaces")
- (evil-test-buffer
- (emacs-lisp-mode)
- ("i(one two" [return] "three" [return] "four" [return] "five" [escape] "?three" [return])
- "(one two
- [t]hree
- four
- five"
- ("cc" "new line" [escape] "+")
- "(one two
- new line
- [f]our
- five"
- ("cc" [escape])
- "(one two
- new line
-[]
- five")))
-
-(ert-deftest evil-test-change-line ()
- "Test `evil-change-line'"
- :tags '(evil operator)
- (ert-info ("Change line with eof being part of visual selection")
- (evil-test-buffer
- "This is line one
-This is lin[e] two
-This is line three"
- ("v$C")
- "This is line one
-[]
-This is line three")))
-
-(ert-deftest evil-test-change-word ()
- "Test changing words"
- :tags '(evil operator)
- (ert-info ("Non-word")
- (evil-test-buffer
- "[;]; This buffer is for notes."
- ("cwABC" [escape])
- "AB[C] This buffer is for notes."))
- (ert-info ("Word")
- (evil-test-buffer
- ";; [T]his buffer is for notes."
- ("cwABC" [escape])
- ";; AB[C] buffer is for notes."))
- (ert-info ("Single character")
- (evil-test-buffer
- "[;] This buffer is for notes."
- ("cwABC" [escape])
- "AB[C] This buffer is for notes."))
- (ert-info ("Whitespace")
- (evil-test-buffer
- "This[ ]is a test\n"
- ("cwABC" [escape])
- "ThisAB[C]is a test\n")))
-
-(ert-deftest evil-test-join ()
- "Test `evil-join'"
- :tags '(evil join operator)
- (ert-info ("Simple")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f."
- ("J")
- ";; This buffer is for notes you don't want to save.[ ]\
-;; If you want to create a file, visit that file with C-x C-f."))
- (ert-info ("Visual")
- (evil-test-buffer
- :visual line
- "<;; [T]his buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f.>"
- ("J")
- ";; This buffer is for notes you don't want to save.[ ]\
-;; If you want to create a file, visit that file with C-x C-f."))
- (ert-info ("Join with count")
- (evil-test-buffer
- "[l]ine 1\nline 2\nline 3\nline 4"
- (":join 3")
- "line 1 line 2 line 3\nline 4"))
- (ert-info ("Join with bang and count")
- (evil-test-buffer
- "[l]ine 1\nline 2\nline 3\nline 4"
- (":join! 3")
- "line 1line 2line 3\nline 4"))
- (ert-info ("Join with bang and count, exceeding end-of-buffer")
- (evil-test-buffer
- "[l]ine 1\nline 2\nline 3\nline 4"
- (":join! 10")
- "line 1line 2line 3line 4"))
- (ert-info ("Join with count 1 should be the same as without count")
- (evil-test-buffer
- "[l]ine 1\nline 2\nline 3\nline 4"
- (":join 1")
- "line 1 line 2\nline 3\nline 4"))
- (ert-info ("Join with count 2 should be the same as with count 1")
- (evil-test-buffer
- "[l]ine 1\nline 2\nline 3\nline 4"
- (":join 2")
- "line 1 line 2\nline 3\nline 4"))
- (ert-info ("Join with count and single line range")
- (evil-test-buffer
- "[l]ine 1\nline 2\nline 3\nline 4"
- (":2join 3")
- "line 1\nline 2 line 3 line 4"))
- (ert-info ("Join with count and range")
- (evil-test-buffer
- "[l]ine 1\nline 2\nline 3\nline 4"
- (":1,2join 3")
- "line 1\nline 2 line 3 line 4"))
- (ert-info ("Join with count, range and bang")
- (evil-test-buffer
- "[l]ine 1\nline 2\nline 3\nline 4"
- (":1,2join! 3")
- "line 1\nline 2line 3line 4"))
- (ert-info ("Join with range")
- (evil-test-buffer
- "[l]ine 1\nline 2\nline 3\nline 4"
- (":1,3join")
- "line 1 line 2 line 3\nline 4"))
- (ert-info ("Join blank line")
- (evil-test-buffer
- "(when foo\n[]\n bar)"
- (emacs-lisp-mode)
- ("J")
- "(when foo\n [b]ar)")))
-
-(ert-deftest evil-test-substitute ()
- "Test `evil-substitute'"
- :tags '(evil operator)
- (ert-info ("Simple")
- (evil-test-buffer
- ";; [T]his buffer is for notes."
- ("5sABC" [escape])
- ";; AB[C]buffer is for notes."))
- (ert-info ("On empty line")
- (evil-test-buffer
- "Above some line
-\[]
-Below some empty line"
- ("5sABC" [escape])
- "Above some line
-AB[C]
-Below some empty line")))
-
-(ert-deftest evil-test-shift ()
- "Test `evil-shift-right' and `evil-shift-left'."
- :tags '(evil operator)
- (let ((evil-shift-width 4)
- indent-tabs-mode)
- (ert-info ("Shift linewise")
- (ert-info ("With `evil-start-of-line' `nil'")
- (evil-test-buffer
- "[l]ine 1\nline 2\nline 3\n"
- ("Vj>")
- "[ ] line 1\n line 2\nline 3\n"))
- (ert-info ("With `evil-start-of-line' `t'")
- (let ((evil-start-of-line t))
- (evil-test-buffer
- "[l]ine 1\nline 2\nline 3\n"
- ("Vj>")
- " [l]ine 1\n line 2\nline 3\n"))))
- (ert-info ("Shift char selection on whole line")
- (ert-info ("With `evil-start-of-line' `nil'")
- (evil-test-buffer
- "[l]ine 1\nline 2\nline 3\n"
- ("v$>")
- " line [1]\nline 2\nline 3\n"))
- (ert-info ("With `evil-start-of-line' `t'")
- (let ((evil-start-of-line t))
- (evil-test-buffer
- "[l]ine 1\nline 2\nline 3\n"
- ("v$>")
- " [l]ine 1\nline 2\nline 3\n"))))
- (ert-info ("Shift visual with count")
- (ert-info ("With `evil-start-of-line' `nil'")
- (evil-test-buffer
- "[l]ine 1\nline 2\nline 3\n"
- ("Vj3>")
- "[ ] line 1\n line 2\nline 3\n"
- ("Vj2<")
- "[ ] line 1\n line 2\nline 3\n"))
- (ert-info ("With `evil-start-of-line' `t'")
- (let ((evil-start-of-line t))
- (evil-test-buffer
- "[l]ine 1\nline 2\nline 3\n"
- ("Vj3>")
- " [l]ine 1\n line 2\nline 3\n"
- ("Vj2<")
- " [l]ine 1\n line 2\nline 3\n"))))
- (ert-info ("Shift in insert state")
- (evil-test-buffer
- "line 1\nl[i]ne 2\nline 3\n"
- ("i\C-t\C-t")
- "line 1\n l[i]ne 2\nline 3\n"
- ("\C-d")
- "line 1\n l[i]ne 2\nline 3\n"))
- (ert-info ("Delete all indentation in insert state")
- (evil-test-buffer
- "line1\n sometext[ ]"
- ("a" "somemore" "0\C-d")
- "line1\nsometext somemore[]"))))
-
-(ert-deftest evil-test-operator-set-marks ()
- "Test `[ and `] are set by operators."
- :tags '(evil operator)
- (ert-info ("Can go to end of last operated text")
- (evil-test-buffer
- "alpha br[a]vo charlie"
- ("gUiw")
- "alpha [B]RAVO charlie"
- ("`]")
- "alpha BRAV[O] charlie"))
- (ert-info ("Can go to end of last operated text")
- (evil-test-buffer
- "alpha br[a]vo charlie"
- ("g?iw$")
- "alpha oenib charli[e]"
- ("`[")
- "alpha [o]enib charlie"))
- (ert-info ("Marks are correct after deletion")
- (evil-test-buffer
- "alpha br[a]vo charlie"
- ("daw^")
- "[a]lpha charlie"
- ("`]")
- "alpha [c]harlie"
- ("^`[")
- "alpha [c]harlie")
- (evil-test-buffer
- "alpha br[a]vo charlie"
- ("D^")
- "[a]lpha br"
- ("`]")
- "alpha b[r]"
- ("^`[")
- "alpha b[r]")))
-
-(ert-deftest evil-test-operator-save-state-for-motion ()
- "Test that `evil-operator-range' restores state after executing motion."
- (evil-test-buffer "abc"
- ("dfbix" [escape])
- "xc"))
-
-;;; Paste
-
-(ert-deftest evil-test-paste-before ()
- "Test `evil-paste-before'"
- :tags '(evil paste)
- (ert-info ("Paste characters")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("y2ej0")
- ";; This buffer is for notes you don't want to save,
-\[;]; and for Lisp evaluation."
- ("P")
- ";; This buffer is for notes you don't want to save,
-This buffe[r];; and for Lisp evaluation."))
- (ert-info ("Paste characters with count")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("y2ej0")
- ";; This buffer is for notes you don't want to save,
-\[;]; and for Lisp evaluation."
- ("3P")
- ";; This buffer is for notes you don't want to save,
-This bufferThis bufferThis buffe[r];; and for Lisp evaluation."))
- (ert-info ("Paste characters at end-of-buffer")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("y2eG$")
- ";; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation[.]"
- ("2P")
- ";; This buffer is for notes you don't want to save,
-;; and for Lisp evaluationThis bufferThis buffe[r]."))
- (ert-info ("Paste lines")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("2yyP")
- "[;]; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation.
-;; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation."))
- (ert-info ("Paste lines with count")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("2yy2P")
- "[;]; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation.
-;; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation.
-;; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation."))
- (ert-info ("Paste lines at end-of-buffer")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("2yyG$")
- ";; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation[.]"
- ("2P")
- ";; This buffer is for notes you don't want to save,
-\[;]; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation.
-;; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation.
-;; and for Lisp evaluation."))
- (ert-info ("Paste block")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (define-key evil-operator-state-local-map "s" #'evil-test-square-motion)
- ("3ysP")
- "[;]; ;; This buffer is for notes you don't want to save.
-;; ;; If you want to create a file, visit that file with C-x C-f,
-;; ;; then enter the text in that file's own buffer."))
- (ert-info ("Paste block with count")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (define-key evil-operator-state-local-map "s" #'evil-test-square-motion)
- ("3ys2P")
- "[;]; ;; ;; This buffer is for notes you don't want to save.
-;; ;; ;; If you want to create a file, visit that file with C-x C-f,
-;; ;; ;; then enter the text in that file's own buffer."))
- (ert-info ("Paste block with empty line")
- (evil-test-buffer
- "[;]; Above some line
-
-;; Below some empty line"
- (define-key evil-operator-state-local-map "s" #'evil-test-square-motion)
- ("3ys2P")
- "[;]; ;; ;; Above some line
- \n\
-;; ;; ;; Below some empty line"))
- (ert-info ("Paste block crossing end of buffer")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (define-key evil-operator-state-local-map "s" #'evil-test-square-motion)
- ("3ysj")
- ";; This buffer is for notes you don't want to save.
-\[;]; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- ("P")
- ";; This buffer is for notes you don't want to save.
-\[;]; ;; If you want to create a file, visit that file with C-x C-f,
-;; ;; then enter the text in that file's own buffer.
-;;"))
- (ert-info ("Paste block at end-of-line")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (define-key evil-operator-state-local-map "s" #'evil-test-square-motion)
- ("3ys$")
- ";; This buffer is for notes you don't want to save[.]
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- ("p")
- ";; This buffer is for notes you don't want to save.[;];
-;; If you want to create a file, visit that file wi;; th C-x C-f,
-;; then enter the text in that file's own buffer. ;;"))
- (ert-info ("Don't mutate register when stripping test props")
- (let (indent-tabs-mode)
- (evil-test-buffer
- "[a]aaaaaaaaaaaa
-bbbbbbbb
-cccc"
- ("\C-vG$yA " "\C-r\"" [escape] "up")
- "aaaaaaaaaaaaa[a]aaaaaaaaaaaa
-bbbbbbbb bbbbbbbb
-cccc cccc"))))
-
-(ert-deftest evil-test-paste-after ()
- "Test `evil-paste-after'"
- :tags '(evil paste)
- (ert-info ("Paste characters")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("y2ej0")
- ";; This buffer is for notes you don't want to save,
-\[;]; and for Lisp evaluation."
- ("p")
- ";; This buffer is for notes you don't want to save,
-;This buffe[r]; and for Lisp evaluation."))
- (ert-info ("Paste characters with count")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("y2ej0")
- ";; This buffer is for notes you don't want to save,
-\[;]; and for Lisp evaluation."
- ("3p")
- ";; This buffer is for notes you don't want to save,
-;This bufferThis bufferThis buffe[r]; and for Lisp evaluation."))
- (ert-info ("Paste characters at end-of-buffer")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("y2eG$")
- ";; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation[.]"
- ("2p")
- ";; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation.This bufferThis buffe[r]"))
- (ert-info ("Paste lines")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("2yyp")
- ";; This buffer is for notes you don't want to save,
-\[;]; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation.
-;; and for Lisp evaluation."))
- (ert-info ("Paste lines with count")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("2yy2p")
- ";; This buffer is for notes you don't want to save,
-\[;]; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation.
-;; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation.
-;; and for Lisp evaluation."))
- (ert-info ("Paste lines at end-of-buffer")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("2yyG$")
- ";; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation[.]"
- ("2p")
- ";; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation.
-\[;]; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation.
-;; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation."))
- (ert-info ("Paste block")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (define-key evil-operator-state-local-map "s" #'evil-test-square-motion)
- ("3ysp")
- ";[;]; ; This buffer is for notes you don't want to save.
-;;; ; If you want to create a file, visit that file with C-x C-f,
-;;; ; then enter the text in that file's own buffer."))
- (ert-info ("Paste block with count")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (define-key evil-operator-state-local-map "s" #'evil-test-square-motion)
- ("3ys2p")
- ";[;]; ;; ; This buffer is for notes you don't want to save.
-;;; ;; ; If you want to create a file, visit that file with C-x C-f,
-;;; ;; ; then enter the text in that file's own buffer."))
- (ert-info ("Paste block with empty line")
- (evil-test-buffer
- "[;]; Above some line
-
-;; Below some empty line"
- (define-key evil-operator-state-local-map "s" #'evil-test-square-motion)
- ("3ys2p")
- ";;; ;; ; Above some line
-
-;;; ;; ; Below some empty line"))
- (ert-info ("Paste block crossing end of buffer")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (define-key evil-operator-state-local-map "s" #'evil-test-square-motion)
- ("3ysj")
- ";; This buffer is for notes you don't want to save.
-\[;]; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- ("p")
- ";; This buffer is for notes you don't want to save.
-;;; ; If you want to create a file, visit that file with C-x C-f,
-;;; ; then enter the text in that file's own buffer.
- ;;"))
- (ert-info ("Paste block at end-of-line")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (define-key evil-operator-state-local-map "s" #'evil-test-square-motion)
- ("3ys$")
- ";; This buffer is for notes you don't want to save[.]
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- ("p")
- ";; This buffer is for notes you don't want to save.;;
-;; If you want to create a file, visit that file wi;; th C-x C-f,
-;; then enter the text in that file's own buffer. ;;"))
- (ert-info ("Paste preserves preceding text properties")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (put-text-property (point) (line-end-position) 'font-lock-face 'warning)
- ("yyp")
- ";; This buffer is for notes you don't want to save.
-[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (should (equal (get-text-property (point-min) 'font-lock-face) 'warning)))))
-
-(ert-deftest evil-test-paste-pop-before ()
- "Test `evil-paste-pop' after `evil-paste-before'"
- :tags '(evil paste)
- (ert-info ("Paste")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (define-key evil-operator-state-local-map "s" #'evil-test-square-motion)
- ("y2e2yyy3sj")
- ";; This buffer is for notes you don't want to save.
-\[;]; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- ("P")
- ";; This buffer is for notes you don't want to save.
-\[;]; ;; If you want to create a file, visit that file with C-x C-f,
-;; ;; then enter the text in that file's own buffer.
-;;"))
- (ert-info ("Single pop")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (define-key evil-operator-state-local-map "s" #'evil-test-square-motion)
- ("y2e2yyy3sjP\C-p")
- ";; This buffer is for notes you don't want to save.
-\[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."))
- (ert-info ("Two pops")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (define-key evil-operator-state-local-map "s" #'evil-test-square-motion)
- ("y2e2yyy3sjP\C-p\C-p")
- ";; This buffer is for notes you don't want to save.
-;; Thi[s];; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."))
- (ert-info ("Pop with count")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (define-key evil-operator-state-local-map "s" #'evil-test-square-motion)
- ("y2e2yyy3sjP2\C-p")
- ";; This buffer is for notes you don't want to save.
-;; Thi[s];; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."))
- (ert-info ("Single pop-next")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (define-key evil-operator-state-local-map "s" #'evil-test-square-motion)
- ("y2e2yyy3sjP2\C-p\C-n")
- ";; This buffer is for notes you don't want to save.
-\[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."))
- (ert-info ("Pop-next with count")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (define-key evil-operator-state-local-map "s" #'evil-test-square-motion)
- ("y2e2yyy3sjP\C-p\C-p2\C-n")
- ";; This buffer is for notes you don't want to save.
-\[;]; ;; If you want to create a file, visit that file with C-x C-f,
-;; ;; then enter the text in that file's own buffer.
-;;")))
-
-(ert-deftest evil-test-paste-pop-after ()
- "Test `evil-paste-pop' after `evil-paste-after'"
- :tags '(evil paste)
- (ert-info ("Paste")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (define-key evil-operator-state-local-map "s" #'evil-test-square-motion)
- ("y2e2yyy3sj")
- ";; This buffer is for notes you don't want to save.
-\[;]; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- ("p")
- ";; This buffer is for notes you don't want to save.
-;[;]; ; If you want to create a file, visit that file with C-x C-f,
-;;; ; then enter the text in that file's own buffer.
- ;;"))
- (ert-info ("Single pop")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (define-key evil-operator-state-local-map "s" #'evil-test-square-motion)
- ("y2e2yyy3sjp\C-p")
- ";; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-\[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."))
- (ert-info ("Two pops")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (define-key evil-operator-state-local-map "s" #'evil-test-square-motion)
- ("y2e2yyy3sjp\C-p\C-p")
- ";; This buffer is for notes you don't want to save.
-;;; Thi[s]; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."))
- (ert-info ("Pop with count")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (define-key evil-operator-state-local-map "s" #'evil-test-square-motion)
- ("y2e2yyy3sjp2\C-p")
- ";; This buffer is for notes you don't want to save.
-;;; Thi[s]; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."))
- (ert-info ("Single pop-next")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (define-key evil-operator-state-local-map "s" #'evil-test-square-motion)
- ("y2e2yyy3sjp2\C-p\C-n")
- ";; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-\[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."))
- (ert-info ("Pop-next with count")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (define-key evil-operator-state-local-map "s" #'evil-test-square-motion)
- ("y2e2yyy3sjp\C-p\C-p2\C-n")
- ";; This buffer is for notes you don't want to save.
-;[;]; ; If you want to create a file, visit that file with C-x C-f,
-;;; ; then enter the text in that file's own buffer.
- ;;")))
-
-(ert-deftest evil-test-paste-pop-without-undo ()
- "Test `evil-paste-pop' with undo disabled"
- :tags '(evil paste)
- (ert-info ("Pop-next with count without undo")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (setq buffer-undo-list t)
- (define-key evil-operator-state-local-map "s" #'evil-test-square-motion)
- ("y2e2yyy3sjP\C-p\C-p2\C-n")
- ";; This buffer is for notes you don't want to save.
-\[;]; ;; If you want to create a file, visit that file with C-x C-f,
-;; ;; then enter the text in that file's own buffer.
-;;")))
-
-(ert-deftest evil-test-visual-paste ()
- "Test `evil-paste-before' and `evil-paste-after' in Visual state"
- :tags '(evil paste)
- (evil-test-buffer
- ";; This buffer is for notes you don't want to save.
-;; [I]f you want to create a file, visit that file with C-x C-f."
- ("yyk")
- ";; [T]his buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f."
- ("VP")
- "[;]; If you want to create a file, visit that file with C-x C-f.
-;; If you want to create a file, visit that file with C-x C-f.")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f."
- ("yyj")
- ";; This buffer is for notes you don't want to save.
-;; [I]f you want to create a file, visit that file with C-x C-f."
- ("Vp")
- ";; This buffer is for notes you don't want to save.
-\[;]; This buffer is for notes you don't want to save.")
- (ert-info ("Visual-paste from register 3")
- ;; This behaviour deviates from vim, which populates registers 1-9 with
- ;; deleted text only, not yanked text. This is an aspect of `evil-yank's
- ;; use of the emacs kill-ring, so is consistent with non-visual paste.
- (evil-test-buffer
- "[w]ord1a word1b word1c word1d
-word2a word2b word2c word2d"
- ("yiwwyiwwyiw")
- "word1a word1b [w]ord1c word1d
-word2a word2b word2c word2d"
- ("+viw\"3p")
- "word1a word1b word1c word1d
-word1[a] word2b word2c word2d"))
- (ert-info ("Visual-paste respects `evil-kill-on-visual-paste'")
- (evil-test-buffer
- "[w]ord1 word2 word3"
- (setq evil-kill-on-visual-paste nil)
- ("yewyew")
- "word1 word2 [w]ord3"
- ("ve\"2p")
- "word1 word2 word[1]"
- ("o\C-r\"")
- "word1 word2 word1
-word2[]")
- (evil-test-buffer
- "[w]ord1 word2 word3"
- (setq evil-kill-on-visual-paste t)
- ("yewyew")
- "word1 word2 [w]ord3"
- ("ve\"2p")
- "word1 word2 word[1]"
- ("o\C-r\"")
- "word1 word2 word1
-word3[]"))
- (ert-info ("Visual-paste from `=' register")
- (evil-test-buffer
- "foo"
- ("viw" "\"=p(* 6 7)" [return])
- "4[2]"))
- (ert-info ("Blockwise visual paste (of charwise text) with count")
- (evil-test-buffer
- "[a]bc\n123\n123\n123"
- ("ye" "jl" "\C-vG" "2p")
- "abc\n1[a]bcabc3\n1abcabc3\n1abcabc3"
- ("gv") ;; Test point & mark are stored correctly
- "abc\n1<abcabc3\n1abcabc3\n1abcab[c]>3"))
- (ert-info ("Blockwise visual paste of linewise text")
- (evil-test-buffer "[a]bc\n123\n123"
- ("yy" "jl" "\C-vj" "p")
- "abc\n13\n13\nabc"))
- (ert-info ("Blockwise visual paste of blockwise text")
- (evil-test-buffer "xy\n[z]\n123\n123"
- ("\C-vkly2jl\C-vjp")
- "xy\nz\n1xy3\n1z 3")))
-
-(ert-deftest evil-test-visual-paste-pop ()
- "Test `evil-paste-pop' after visual paste."
- :tags '(evil paste)
- (ert-info ("Visual-char paste, char paste")
- (evil-test-buffer
- "[w]ord1a word1b word1c\nword2a word2b\nword3a word3b word3c word3d\n"
- ("yiwyywyiw^jw")
- "word1a word1b word1c\nword2a [w]ord2b\nword3a word3b word3c word3d\n"
- ("viwp")
- "word1a word1b word1c\nword2a word1[b]\nword3a word3b word3c word3d\n"))
- (ert-info ("Visual-char paste, char paste, line pop")
- (evil-test-buffer
- "[w]ord1a word1b word1c\nword2a word2b\nword3a word3b word3c word3d\n"
- ("yiwyywyiw^jw")
- "word1a word1b word1c\nword2a [w]ord2b\nword3a word3b word3c word3d\n"
- ("viwp\C-p")
- "word1a word1b word1c\nword2a \n[w]ord1a word1b word1c\n\nword3a word3b word3c word3d\n"))
- (ert-info ("Visual-char paste, char paste, line pop, char pop")
- (evil-test-buffer
- "[w]ord1a word1b word1c\nword2a word2b\nword3a word3b word3c word3d\n"
- ("yiwyywyiw^jw")
- "word1a word1b word1c\nword2a [w]ord2b\nword3a word3b word3c word3d\n"
- ("viwp\C-p\C-p")
- "word1a word1b word1c\nword2a word1[a]\nword3a word3b word3c word3d\n"))
- (ert-info ("Visual-line paste, char paste")
- (evil-test-buffer
- "[w]ord1a word1b word1c\nword2a word2b\nword3a word3b word3c word3d\n"
- ("yiwyywyiw^j")
- "word1a word1b word1c\n[w]ord2a word2b\nword3a word3b word3c word3d\n"
- ("Vp")
- "word1a word1b word1c\nword1[b]\nword3a word3b word3c word3d\n"))
- (ert-info ("Visual-line paste, char paste, line pop")
- (evil-test-buffer
- "[w]ord1a word1b word1c\nword2a word2b\nword3a word3b word3c word3d\n"
- ("yiwyywyiw^j")
- "word1a word1b word1c\n[w]ord2a word2b\nword3a word3b word3c word3d\n"
- ("Vp\C-p")
- "word1a word1b word1c\n[w]ord1a word1b word1c\nword3a word3b word3c word3d\n"))
- (ert-info ("Visual-line paste, char paste, line pop, char pop")
- (evil-test-buffer
- "[w]ord1a word1b word1c\nword2a word2b\nword3a word3b word3c word3d\n"
- ("yiwyywyiw^j")
- "word1a word1b word1c\n[w]ord2a word2b\nword3a word3b word3c word3d\n"
- ("Vp\C-p\C-p")
- "word1a word1b word1c\nword1[a]\nword3a word3b word3c word3d\n")))
-
-(ert-deftest evil-test-register ()
- "Test yanking and pasting to and from register."
- :tags '(evil yank paste)
- (ert-info ("simple lower case register")
- (evil-test-buffer
- "[f]oo\n"
- ("\"ayw\"aP")
- "fo[o]foo\n"
- ("\"ayy\"aP")
- "[f]oofoo\nfoofoo\n"))
- (ert-info ("upper case register")
- (evil-test-buffer
- "[f]oo\n"
- ("\"ayw\"Ayw\"aP")
- "foofo[o]foo\n"
- ("\"ayy\"Ayy\"aP")
- "[f]oofoofoo\nfoofoofoo\nfoofoofoo\n"))
- (ert-info ("upper case register and lines")
- (evil-test-buffer
- "[l]ine 1\nline 2\nline 3\nline 4\n"
- ("\"a2Yjj\"A2Y\"aP")
- "line 1\nline 2\n[l]ine 1\nline 2\nline 3\nline 4\nline 3\nline 4\n"
- ("8G\"ap")
- "line 1\nline 2\nline 1\nline 2\nline 3\nline 4\nline 3\nline 4\n[l]ine 1\nline 2\nline 3\nline 4\n"))
- (ert-info ("yank with count")
- (evil-test-buffer
- "[l]ine 1\nline 2\nline 3\n"
- ("\"a2yw\"aP")
- "line [1]line 1\nline 2\nline 3\n"
- ("\"a2yy\"aP")
- "[l]ine 1line 1\nline 2\nline 1line 1\nline 2\nline 3\n"))
- (dolist (module '(evil-search isearch))
- (evil-select-search-module 'evil-search-module module)
- (ert-info ((format "special register / (module: %s)" module))
- (evil-test-buffer
- "[f]oo bar\n"
- ("/bar" [return] "0i\C-r/")
- "bar[f]oo bar\n")))
- (ert-info ("special register :")
- (evil-test-buffer
- "[f]oo bar\n"
- (":noh\ni\C-r:")))
- (ert-info ("Paste from register during change to register")
- (evil-test-buffer
- "[a]lpha beta"
- ("\"ayiw" "w" "\"bciw" "\C-ra")
- "alpha alpha[]"))
- (ert-info ("Paste from register in replace state")
- (evil-test-buffer
- "[a]lpha bravo charlie"
- ("yiw" "w" "R" "\C-r0")
- "alpha alpha[ ]charlie"
- ([backspace] [backspace] [backspace])
- "alpha al[a]vo charlie"))
- (ert-info ("Normal delete after visual delete doesn't clobber register")
- (evil-test-buffer
- "[a]lpha bravo charlie delta"
- ("vf \"xd" "dw" ";\"xp")
- "charlie alpha delta"))
- (ert-info ("Choosing register keeps eol anchoring")
- (evil-test-buffer
- "[a]aaaaa\nbbbbb\ncccc"
- ("\C-v" "2j" "$" "\"xy" "G" "o" [escape] "\"xp")
- "aaaaaa\nbbbbb\ncccc\n[a]aaaaa\nbbbbb\ncccc")))
-
-(ert-deftest evil-test-last-insert-register ()
- "Test last insertion register."
- (evil-test-buffer
- "[l]ine 1\n"
- ("GiABC" [escape])
- "line 1\nAB[C]"
- ("go\".P")
- "AB[C]line 1\nABC"))
-
-(ert-deftest evil-test-zero-register ()
- "\"0 contains the last text that was yanked without specificying a register."
- (evil-test-buffer
- "[l]ine 1\nline 2\n"
- ("yy\"0p")
- "line 1\n[l]ine 1\nline 2\n"
- ("j\"ayy\"0p")
- "line 1\nline 1\nline 2\n[l]ine 1\n" ; yanked line 2 to "a, so "0 is still line 1
- ("kdd\"0p")
- "line 1\nline 1\nline 1\n[l]ine 1\n"))
-
-(ert-deftest evil-test-=-register ()
- "\"= is not really a register . It inserts the result of evaluating some elisp"
- (ert-info ("Can eval elisp, and can fetch default (last) result")
- (evil-test-buffer
- :state insert
- "8x8= []"
- ("\C-r=(* 8 8)" [return])
- "8x8= 64"
- ([return] "16x4= \C-r=" [return])
- "8x8= 64
-16x4= 64"))
-
- (ert-info ("Can eval infix math, and can use register at prompt")
- (evil-test-buffer
- "[5]0/10 * 100 = "
- ("\"nyt=" "A\C-r=" "\C-rn" [return])
- "50/10 * 100 = 500")))
-
-(ert-deftest evil-test-gp-gP ()
- (ert-info ("gp and gP are just like p and P but move the cursor forward")
- (evil-test-buffer
- "[a]lpha bravo charlie"
- ("ye" "2f " "gp")
- "alpha bravo alpha[c]harlie"
- ("2F " "gP")
- "alphaalpha[ ]bravo alphacharlie"
- ("l" "ve" "gp")
- "alphaalpha alpha[ ]alphacharlie"))
- (ert-info ("gp linewise")
- (evil-test-buffer
- "[a]lpha line\nbravo line\ncharlie line\ndelta line\necho line"
- ("2yy" "2j")
- "alpha line\nbravo line\n[c]harlie line\ndelta line\necho line"
- ("gp")
- "alpha line\nbravo line\ncharlie line\nalpha line\nbravo line\n[d]elta line\necho line"
- (".")
- "alpha line\nbravo line\ncharlie line\nalpha line\nbravo line\ndelta line\nalpha line\nbravo line\necho line")))
-
-(ert-deftest evil-test-ex-put ()
- "evil-ex-put inserts text linewise, regardless of yank-handler"
- (ert-info ("Can put linewise text from default register, by line number")
- (evil-test-buffer
- "[L]orem ipsum dolor sit amet
-consectetur adipiscing elit
-sed do eiusmod tempor incididunt"
- ("yy:2put" [return])
- "Lorem ipsum dolor sit amet
-consectetur adipiscing elit
-[L]orem ipsum dolor sit amet
-sed do eiusmod tempor incididunt"))
-
- (ert-info ("Can put blockwise text from letter register, backwards")
- (evil-test-buffer
- "Lorem ipsum [d]olor sit amet
-consectetur adipiscing elit
-sed do eiusmod tempor incididunt"
- ("\C-vje\"xy" "bye" "Vj" ":put! x" [return])
- "Lorem ipsum dolor sit amet
-dolor sit
-[a]dipiscing
-consectetur adipiscing elit
-sed do eiusmod tempor incididunt"))
-
- (ert-info ("Can supply args and put from = register")
- (evil-test-buffer
- "[L]ine one."
- (":put = (* 6 7)" [return])
- "Line one.
-[4]2")))
-
-(ert-deftest evil-test-align ()
- "Test `evil-align-left', `evil-align-right' and `evil-align-center'."
- :tags '(evil operator)
- (evil-without-display
- (let ((fill-column 70)
- indent-tabs-mode)
- (evil-test-buffer
- "before\n[l]ine 1\nthis is line number 2\nline number 3\nafter\n"
- (":.,+2ri" [return] (kbd "M-x") "untabify" [return])
- "before\n [l]ine 1\n this is line number 2\n line number 3\nafter\n"
- (":.,+2ri 60" [return] (kbd "M-x") "untabify" [return])
- "before\n [l]ine 1\n this is line number 2\n line number 3\nafter\n"
- (":.,+2le" [return] (kbd "M-x") "untabify" [return])
- "before\n[l]ine 1\nthis is line number 2\nline number 3\nafter\n"
- (":.,+2le 10" [return])
- "before\n [l]ine 1\n this is line number 2\n line number 3\nafter\n"
- (":.,+2ce" [return] (kbd "M-x") "untabify" [return])
- "before\n [l]ine 1\n this is line number 2\n line number 3\nafter\n"
- (":.,+2ce 40" [return] (kbd "M-x") "untabify" [return])
- "before\n [l]ine 1\n this is line number 2\n line number 3\nafter\n"))))
-
-;;; Motions
-
-(ert-deftest evil-test-forward-char ()
- "Test `evil-forward-char' motion"
- :tags '(evil motion)
- (ert-info ("Simple")
- (evil-test-buffer
- "[;]; This buffer is for notes."
- ("l")
- ";[;] This buffer is for notes."))
- (ert-info ("End of line")
- (let ((evil-cross-lines t)
- (evil-move-beyond-eol nil))
- (evil-test-buffer
- ";; This buffer is for notes[,]
-;; and for Lisp evaluation."
- ("l")
- ";; This buffer is for notes,
-\[;]; and for Lisp evaluation.")))
- (ert-info ("With count")
- (evil-test-buffer
- "[;]; This buffer is for notes."
- ("12l")
- ";; This buff[e]r is for notes."))
- (ert-info ("End of line")
- (evil-test-buffer
- ";; This buffer is for notes[.]"
- (error end-of-line "l")
- (error end-of-line "10l")))
- (ert-info ("Until end-of-line")
- (evil-test-buffer
- "[;]; This buffer is for notes."
- (error end-of-line "100l")
- ";; This buffer is for notes[.]"))
- (ert-info ("On empty line")
- (evil-test-buffer
- "Above some line
-\[]
-Below some empty line"
- (should-error (execute-kbd-macro "l"))
- (should-error (execute-kbd-macro "42l")))))
-
-(ert-deftest evil-test-backward-char ()
- "Test `evil-backward-char' motion"
- :tags '(evil motion)
- (ert-info ("Simple")
- (evil-test-buffer
- ";; This[ ]buffer is for notes."
- ("h")
- ";; Thi[s] buffer is for notes."))
- (ert-info ("With count")
- (evil-test-buffer
- ";; This[ ]buffer is for notes."
- ("3h")
- ";; T[h]is buffer is for notes."))
- (ert-info ("Beginning of line")
- (evil-test-buffer
- "[;]; This buffer is for notes."
- (should-error (execute-kbd-macro "h"))
- (should-error (execute-kbd-macro "10h"))))
- (ert-info ("Until beginning-of-line")
- (evil-test-buffer
- ";; This[ ]buffer is for notes."
- (error beginning-of-line "100h")
- "[;]; This buffer is for notes."))
- (ert-info ("On empty line")
- (evil-test-buffer
- "Above some line
-\[]
-Below some empty line"
- (should-error (execute-kbd-macro "h"))
- (should-error (execute-kbd-macro "42h")))))
-
-(ert-deftest evil-test-previous-line ()
- "Test `evil-previous-line' motion"
- :tags '(evil motion)
- (ert-info ("Simple")
- (evil-test-buffer
- ";; This buffer is for notes you don't want to save,
-;; [a]nd for Lisp evaluation."
- ("k")
- ";; [T]his buffer is for notes you don't want to save,
-;; and for Lisp evaluation."))
- (ert-info ("With count")
- (evil-test-buffer
- ";; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; [t]hen enter the text in that file's own buffer."
- ("2k")
- ";; [T]his buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."))
- (ert-info ("Until beginning of buffer")
- (evil-test-buffer
- ";; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; [t]hen enter the text in that file's own buffer."
- ("100k")
- ";; [T]his buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."))
- (ert-info ("At beginning of buffer")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save."
- (should-error (execute-kbd-macro "k"))
- (should-error (execute-kbd-macro "42k")))))
-
-(ert-deftest evil-test-next-line ()
- "Test `evil-next-line' motion"
- :tags '(evil motion)
- (ert-info ("Simple")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("j")
- ";; This buffer is for notes you don't want to save,
-;; [a]nd for Lisp evaluation."))
- (ert-info ("With count")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- ("2j")
- ";; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; [t]hen enter the text in that file's own buffer."))
- (ert-info ("Until end of buffer")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- ("100j")
- ";; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; [t]hen enter the text in that file's own buffer."))
- (ert-info ("At end of buffer")
- (evil-test-buffer
- ";; This buffer is for notes you don't want to [s]ave."
- (should-error (execute-kbd-macro "j"))
- (should-error (execute-kbd-macro "42j")))))
-
-(ert-deftest evil-test-next+previous-preserve-column ()
- "Test `evil-previous-line' and `evil-next-line' preserve the column."
- :tags '(evil motion)
- (ert-info ("Simple")
- (evil-test-buffer
- "ab[c]\nabcdef\n\nabcd\n"
- ("j")
- "abc\nab[c]def\n\nabcd\n")
- (evil-test-buffer
- "ab[c]\nabcdef\n\nabcd\n"
- ("jj")
- "abc\nabcdef\n[\n]abcd\n")
- (evil-test-buffer
- "ab[c]\nabcdef\n\nabcd\n"
- ("jjj")
- "abc\nabcdef\n\nab[c]d\n")
- (evil-test-buffer
- "ab[c]\nabcdef\n\nabcd\n"
- ("jjjk")
- "abc\nabcdef\n[\n]abcd\n")
- (evil-test-buffer
- "ab[c]\nabcdef\n\nabcd\n"
- ("jjjkk")
- "abc\nab[c]def\n\nabcd\n")))
-
-(ert-deftest evil-test-logical-visual-next-line ()
- "Test alternating between logical and visual next/previous line motions."
- :tags '(evil motion)
- (skip-unless (and (not noninteractive) (> (window-width) 2)))
- (evil-test-buffer "[x]\nyy\n"
- (insert (make-string (window-width) ?x)) ; Make first line soft-wrap
- (goto-char (point-min))
- ("gjj")
- (should (= (current-column) 1))
- ("Gkgk")
- (should-not (bolp))))
-
-(ert-deftest evil-test-eol-anchoring-with-visual-line-movement ()
- "Test gj and gk once the cursor is anchored at eol with $."
- :tags '(evil motion)
- (skip-unless (and (not noninteractive) (> (window-width) 13)))
- (evil-test-buffer
- "Short [l]ine\nA longer line\nThird line"
- ("$gj")
- "Short line\nA longer lin[e]\nThird line"))
-
-(ert-deftest evil-test-other-commands-preserve-column ()
- "Test other comamnds preserve the column, when appropriate."
- :tags '(evil motion)
- (ert-info ("evil-goto-line can preserve column")
- (let ((evil-start-of-line nil))
- (evil-test-buffer
- "Shor[t] line
-Average line
-The longest line"
- ("2G")
- "Short line
-Aver[a]ge line
-The longest line"
- ("$G")
- "Short line
-Average line
-The longest lin[e]"
- ("hgg")
- "Short lin[e]
-Average line
-The longest line")))
-
- (ert-info ("evil-goto-line respects evil-start-of-line")
- (let ((evil-start-of-line t))
- (evil-test-buffer
- "foo\n[b]ar"
- ("$ggj")
- "foo\n[b]ar")))
-
- (ert-info ("N% (`evil-jump-item' with count) can preserve column")
- (let ((evil-start-of-line nil))
- (evil-test-buffer
- "Short line
-Average line
-The lo[n]gest line"
- ("5%")
- "Short [l]ine
-Average line
-The longest line"
- ("$90%")
- "Short line
-Average line
-The longest lin[e]"))))
-
-(ert-deftest evil-test-beginning-of-line ()
- "Test `evil-beginning-of-line' motion"
- :tags '(evil motion)
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save."
- ("0")
- "[;]; This buffer is for notes you don't want to save."
- ("0")
- "[;]; This buffer is for notes you don't want to save."))
-
-(ert-deftest evil-test-end-of-line ()
- "Test `evil-end-of-line' motion"
- :tags '(evil motion)
- (ert-info ("Simple")
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save."
- ("$")
- ";; This buffer is for notes you don't want to save[.]"
- ("$")
- ";; This buffer is for notes you don't want to save[.]"))
- (ert-info ("Don't delete blank lines")
- (evil-test-buffer
- "Above some line
-\[]
-Below some empty line"
- ("d$")
- "Above some line
-\[]
-Below some empty line"))
- (ert-info ("Visual state")
- (evil-test-buffer
- "f[o]o\nbar"
- ("v$")
- "f<oo\n>bar")
- (let ((evil-v$-excludes-newline t))
- (evil-test-buffer
- "f[o]o\nbar"
- ("v$")
- "f<oo>\nbar"))))
-
-(ert-deftest evil-test-percentage-of-line ()
- "Test `evil-percentage-of-line' motion"
- :tags '(evil motion)
- (evil-test-buffer
- "[0]123456789"
- ("gM")
- "01234[5]6789"
- ("10gM")
- "0[1]23456789"
- ("85gM")
- "01234567[8]9"))
-
-(ert-deftest evil-test-first-non-blank ()
- "Test `evil-first-non-blank' motion"
- :tags '(evil motion)
- (evil-test-buffer
- "\
- printf(\"Hello world\\n\")[;]
- return EXIT_SUCCESS;"
- ("^")
- "\
- [p]rintf(\"Hello world\\n\");
- return EXIT_SUCCESS;"
- ("j^")
- "\
- printf(\"Hello world\\n\");
- [r]eturn EXIT_SUCCESS;"))
-
-(ert-deftest evil-test-last-non-blank ()
- "Test `evil-last-non-blank' motion"
- :tags '(evil motion)
- (evil-test-buffer
- "[i]nt main(int argc, char** argv) \n\
-{
- printf(\"Hello world\\n\");
- return EXIT_SUCCESS;
-}"
- ("g_")
- "int main(int argc, char** argv[)] \n\
-{
- printf(\"Hello world\\n\");
- return EXIT_SUCCESS;
-}"
- ("jjg_")
- "int main(int argc, char** argv) \n\
-{
- printf(\"Hello world\\n\")[;]
- return EXIT_SUCCESS;
-}"))
-
-(ert-deftest evil-test-goto-first-line ()
- "Test `evil-goto-first-line' motion"
- :tags '(evil motion)
- (ert-info ("With `evil-start-of-line' `nil'")
- (evil-test-buffer
- "[i]nt main(int argc, char** argv)
-{
- printf(\"Hello world\\n\");
- return EXIT_SUCCESS;
-}"
- ("3gg")
- "int main(int argc, char** argv)
-{
-[ ] printf(\"Hello world\\n\");
- return EXIT_SUCCESS;
-}"
- ("gg")
- "[i]nt main(int argc, char** argv)
-{
- printf(\"Hello world\\n\");
- return EXIT_SUCCESS;
-}"
- ("100gg")
- "int main(int argc, char** argv)
-{
- printf(\"Hello world\\n\");
- return EXIT_SUCCESS;
-\[}]"))
- (ert-info ("With `evil-start-of-line' `nil'")
- (let ((evil-start-of-line t))
- (evil-test-buffer
- "[i]nt main(int argc, char** argv)
-{
- printf(\"Hello world\\n\");
- return EXIT_SUCCESS;
-}"
- ("3gg")
- "int main(int argc, char** argv)
-{
- [p]rintf(\"Hello world\\n\");
- return EXIT_SUCCESS;
-}"
- ("gg")
- "[i]nt main(int argc, char** argv)
-{
- printf(\"Hello world\\n\");
- return EXIT_SUCCESS;
-}"
- ("100gg")
- "int main(int argc, char** argv)
-{
- printf(\"Hello world\\n\");
- return EXIT_SUCCESS;
-\[}]"))))
-
-(ert-deftest evil-test-goto-line ()
- "Test `evil-goto-line' motion"
- :tags '(evil motion)
- (ert-info ("With `evil-start-of-line' `t'")
- (let ((evil-start-of-line t))
- (evil-test-buffer
- "[i]nt main(int argc, char** argv)
-{
- printf(\"Hello world\\n\");
- return EXIT_SUCCESS;
-}"
- ("G")
- "int main(int argc, char** argv)
-{
- printf(\"Hello world\\n\");
- return EXIT_SUCCESS;
-\[}]"
- ("3G")
- "int main(int argc, char** argv)
-{
- [p]rintf(\"Hello world\\n\");
- return EXIT_SUCCESS;
-}"
- ("100G")
- "int main(int argc, char** argv)
-{
- printf(\"Hello world\\n\");
- return EXIT_SUCCESS;
-\[}]")))
- (ert-info ("With `evil-start-of-line' `nil'")
- (evil-test-buffer
- "[i]nt main(int argc, char** argv)
-{
- printf(\"Hello world\\n\");
- return EXIT_SUCCESS;
-}"
- ("G")
- "int main(int argc, char** argv)
-{
- printf(\"Hello world\\n\");
- return EXIT_SUCCESS;
-\[}]"
- ("3G")
- "int main(int argc, char** argv)
-{
-[ ] printf(\"Hello world\\n\");
- return EXIT_SUCCESS;
-}"
- ("100G")
- "int main(int argc, char** argv)
-{
- printf(\"Hello world\\n\");
- return EXIT_SUCCESS;
-\[}]")))
-
-(ert-deftest evil-test-goto-char ()
- "Test `evil-goto-char' motion and ex command."
- :tags '(evil motion ex)
- (evil-test-buffer
- "[W]e only need a short buffer for this test"
- (":goto 9")
- "We only [n]eed a short buffer for this test"
- (":goto")
- "[W]e only need a short buffer for this test"
- ("16go")
- "We only need a [s]hort buffer for this test"
- ("go")
- "[W]e only need a short buffer for this test"
- (evil-goto-char 24)
- "We only need a short bu[f]fer for this test"
- ("v29go")
- "We only need a short bu<ffer [f]>or this test"))
-
-(ert-deftest evil-test-operator-0 ()
- "Test motion \"0\" with an operator."
- :tags '(evil motion)
- (evil-test-buffer
- ";; [T]his buffer is for notes."
- ("d0")
- "[T]his buffer is for notes."))
-
-(ert-deftest evil-test-forward-not-word ()
- "Test `evil-forward-not-thing'"
- :tags '(evil motion)
- (evil-test-buffer
- "[ ] aa,,"
- (evil-forward-not-thing 'evil-word)
- " [a]a,,"))
-
-;; TODO: test Visual motions and window motions
-(ert-deftest evil-test-forward-word-begin ()
- "Test `evil-forward-word-begin'"
- :tags '(evil motion)
- (ert-info ("Non-word")
- (evil-test-buffer
- "[;]; This buffer is for notes."
- ("w")
- ";; [T]his buffer is for notes."))
- (ert-info ("Simple")
- (evil-test-buffer
- ";; [T]his buffer is for notes."
- ("w")
- ";; This [b]uffer is for notes."))
- (ert-info ("With count")
- (evil-test-buffer
- ";; [T]his buffer is for notes."
- ("3w")
- ";; This buffer is [f]or notes."))
- (ert-info ("With count on whitespace")
- (evil-test-buffer
- ";;[ ]This buffer is for notes."
- ("3w")
- ";; This buffer [i]s for notes."))
- (ert-info ("Empty line")
- (evil-test-buffer
- "Above some line
-\[]
-Below some empty line"
- ("w")
- "Above some line
-
-\[B]elow some empty line")
- (evil-test-buffer
- "[A]bove
-
-Below some empty line"
- ("dw")
- "[]
-
-Below some empty line"
- ("dw")
- "[]
-Below some empty line"
- ("dw")
- "[B]elow some empty line")
- (evil-test-buffer
- "[A]bove
-
- Below some empty line with leading whitespace"
- ("dw")
- "[]
-
- Below some empty line with leading whitespace"
- ("dw")
- "[]
- Below some empty line with leading whitespace"
- ("dw")
- " [B]elow some empty line")
- (evil-test-buffer
- "Some line with trailing whitespace [ ] \n next line\n"
- ("dw")
- "Some line with trailing whitespace [ ]\n next line\n")
- (evil-test-buffer
- "[A]\n"
- ("dw")
- "[]\n"))
- (ert-info ("End of buffer")
- (evil-test-buffer
- ";; [T]his buffer is for notes."
- ("100w")
- ";; This buffer is for notes[.]"
- (should-error (execute-kbd-macro "w"))
- (should-error (execute-kbd-macro "10w"))))
- (ert-info ("Before last character in buffer")
- (evil-test-buffer
- "fo[o]."
- ("w")
- "foo[.]")
- (evil-test-buffer
- "fo[o] "
- ("w")
- "foo[ ]")
- (evil-test-buffer
- "[ ]e"
- ("w")
- " [e]")))
-
-(ert-deftest evil-test-forward-word-end ()
- "Test `evil-forward-word-end'"
- :tags '(evil motion)
- (ert-info ("Non-word")
- (evil-test-buffer
- "[;]; This buffer is for notes."
- ("e")
- ";[;] This buffer is for notes."))
- (ert-info ("Simple")
- (evil-test-buffer
- ";; [T]his buffer is for notes."
- ("e")
- ";; Thi[s] buffer is for notes."))
- (ert-info ("With count")
- (evil-test-buffer
- ";; [T]his buffer is for notes."
- ("3e")
- ";; This buffer i[s] for notes."))
- (ert-info ("With count on whitespace")
- (evil-test-buffer
- ";;[ ]This buffer is for notes."
- ("3e")
- ";; This buffer i[s] for notes."))
- (ert-info ("Delete")
- (evil-test-buffer
- ";; This[-]buffer-is-for-notes."
- ("de")
- ";; This[-]is-for-notes."))
- (ert-info ("Empty line")
- (evil-test-buffer
- "Above some line
-\[]
-Below some empty line"
- ("e")
- "Above some line
-
-Belo[w] some empty line"))
- (ert-info ("End of buffer")
- (evil-test-buffer
- ";; [T]his buffer is for notes."
- ("100e")
- ";; This buffer is for notes[.]"
- (should-error (execute-kbd-macro "e"))
- (should-error (execute-kbd-macro "10e"))))
- ;; In Vim, "de" may delete two words rather than one
- ;; if the first word is only one letter. In Evil,
- ;; "de" always deletes one word.
- (ert-info ("Delete a single-letter word")
- (evil-test-buffer
- "a [b] c"
- ("de")
- "a [ ]c")))
-
-(ert-deftest evil-test-backward-word-begin ()
- "Test `evil-backward-word-begin'"
- :tags '(evil motion)
- (ert-info ("Simple")
- (evil-test-buffer
- ";; This buffer is for notes[.]"
- ("b")
- ";; This buffer is for [n]otes."))
- (ert-info ("With count")
- (evil-test-buffer
- ";; This buffer is for notes[.]"
- ("2b")
- ";; This buffer is [f]or notes."))
- (ert-info ("Empty line")
- (evil-test-buffer
- "Above some line
-\[]
-Below some empty line"
- ("b")
- "Above some [l]ine
-
-Below some empty line"))
- (ert-info ("With count on whitespace")
- (evil-test-buffer
- ";; This buffer is for[ ]notes."
- ("2b")
- ";; This buffer [i]s for notes."))
- (ert-info ("Beginning of buffer")
- (evil-test-buffer
- ";; This buffer is for notes[.]"
- ("100b")
- "[;]; This buffer is for notes."
- (should-error (execute-kbd-macro "b"))
- (should-error (execute-kbd-macro "10b")))))
-
-(ert-deftest evil-test-backward-word-end ()
- "Test `evil-backward-word-end'"
- :tags '(evil motion)
- (ert-info ("Simple")
- (evil-test-buffer
- ";; This buffer is for notes[.]"
- ("ge")
- ";; This buffer is for note[s]."))
- (ert-info ("With count")
- (evil-test-buffer
- ";; This buffer is for notes[.]"
- ("2ge")
- ";; This buffer is fo[r] notes."))
- (ert-info ("Empty line")
- (evil-test-buffer
- "Above some line
-\[]
-Below some empty line"
- ("ge")
- "Above some lin[e]
-
-Below some empty line"))
- (ert-info ("With count on whitespace")
- (evil-test-buffer
- ";; This buffer is for[ ]notes."
- ("2ge")
- ";; This buffer i[s] for notes."))
- (ert-info ("Beginning of buffer")
- (evil-test-buffer
- ";; This buffer is for notes[.]"
- ("100ge")
- "[;]; This buffer is for notes."
- (should-error (execute-kbd-macro "ge"))
- (should-error (execute-kbd-macro "10ge")))))
-
-(ert-deftest evil-test-forward-word-begin-cjk ()
- "Test `evil-forward-word-begin' on CJK words"
- :tags '(evil motion cjk)
- (ert-info ("Latin / numeric")
- (evil-test-buffer
- "[a]bcd1234"
- ("w")
- "abcd123[4]"))
- (ert-info ("Latin / Kanji")
- (evil-test-buffer
- "[a]bcd漢字"
- ("w")
- "abcd[漢]字"))
- (ert-info ("Latin / Hiragana")
- (evil-test-buffer
- "[a]bcdひらがな"
- ("w")
- "abcd[ひ]らがな"))
- (ert-info ("Latin / Katakana")
- (evil-test-buffer
- "[a]bcdカタカナ"
- ("w")
- "abcd[カ]タカナ"))
- (ert-info ("Latin / half-width Katakana")
- (evil-test-buffer
- "[a]bcdカタカナ"
- ("w")
- "abcdカタカ[ナ]"))
- (ert-info ("Latin / full-width alphabet")
- (evil-test-buffer
- "[a]bcdABC"
- ("w")
- "abcdAB[C]"))
- (ert-info ("Latin / full-width numeric")
- (evil-test-buffer
- "[a]bcd123"
- ("w")
- "abcd12[3]"))
- (ert-info ("Latin / Hangul")
- (evil-test-buffer
- "[a]bcd한글"
- ("w")
- "abcd[한]글"))
- (ert-info ("numeric / Latin")
- (evil-test-buffer
- "[1]234abcd"
- ("w")
- "1234abc[d]"))
- (ert-info ("numeric / Kanji")
- (evil-test-buffer
- "[1]234漢字"
- ("w")
- "1234[漢]字"))
- (ert-info ("numeric / Hiragana")
- (evil-test-buffer
- "[1]234ひらがな"
- ("w")
- "1234[ひ]らがな"))
- (ert-info ("numeric / Katakana")
- (evil-test-buffer
- "[1]234カタカナ"
- ("w")
- "1234[カ]タカナ"))
- (ert-info ("numeric / half-width Katakana")
- (evil-test-buffer
- "[1]234カタカナ"
- ("w")
- "1234カタカ[ナ]"))
- (ert-info ("numeric / full-width alphabet")
- (evil-test-buffer
- "[1]234ABC"
- ("w")
- "1234AB[C]"))
- (ert-info ("numeric / full-width numeric")
- (evil-test-buffer
- "[1]234123"
- ("w")
- "123412[3]"))
- (ert-info ("numeric / Hangul")
- (evil-test-buffer
- "[1]234한글"
- ("w")
- "1234[한]글"))
- (ert-info ("Kanji / Latin")
- (evil-test-buffer
- "[漢]字abcd"
- ("w")
- "漢字[a]bcd"))
- (ert-info ("Kanji / numeric")
- (evil-test-buffer
- "[漢]字1234"
- ("w")
- "漢字[1]234"))
- (ert-info ("Kanji / Hiragana")
- (evil-test-buffer
- "[漢]字ひらがな"
- ("w")
- "漢字[ひ]らがな"))
- (ert-info ("Kanji / Katakana")
- (evil-test-buffer
- "[漢]字カタカナ"
- ("w")
- "漢字[カ]タカナ"))
- (ert-info ("Kanji / half-width Katakana")
- (evil-test-buffer
- "[漢]字カタカナ"
- ("w")
- "漢字[カ]タカナ"))
- (ert-info ("Kanji / full-width alphabet")
- (evil-test-buffer
- "[漢]字ABC"
- ("w")
- "漢字[A]BC"))
- (ert-info ("Kanji / full-width numeric")
- (evil-test-buffer
- "[漢]字123"
- ("w")
- "漢字[1]23"))
- (ert-info ("Kanji / Hangul")
- (evil-test-buffer
- "[漢]字한글"
- ("w")
- "漢字[한]글"))
- (ert-info ("Hiragana / Latin")
- (evil-test-buffer
- "[ひ]らがなabcd"
- ("w")
- "ひらがな[a]bcd"))
- (ert-info ("Hiragana / numeric")
- (evil-test-buffer
- "[ひ]らがな1234"
- ("w")
- "ひらがな[1]234"))
- (ert-info ("Hiragana / Kanji")
- (evil-test-buffer
- "[ひ]らがな漢字"
- ("w")
- "ひらがな[漢]字"))
- (ert-info ("Hiragana / Katakana")
- (evil-test-buffer
- "[ひ]らがなカタカナ"
- ("w")
- "ひらがな[カ]タカナ"))
- (ert-info ("Hiragana / half-width Katakana")
- (evil-test-buffer
- "[ひ]らがなカタカナ"
- ("w")
- "ひらがな[カ]タカナ"))
- (ert-info ("Hiragana / full-width alphabet")
- (evil-test-buffer
- "[ひ]らがなABC"
- ("w")
- "ひらがな[A]BC"))
- (ert-info ("Hiragana / full-width numeric")
- (evil-test-buffer
- "[ひ]らがな123"
- ("w")
- "ひらがな[1]23"))
- (ert-info ("Hiragana / Hangul")
- (evil-test-buffer
- "[ひ]らがな한글"
- ("w")
- "ひらがな[한]글"))
- (ert-info ("Katakana / Latin")
- (evil-test-buffer
- "[カ]タカナabcd"
- ("w")
- "カタカナ[a]bcd"))
- (ert-info ("Katakana / numeric")
- (evil-test-buffer
- "[カ]タカナ1234"
- ("w")
- "カタカナ[1]234"))
- (ert-info ("Katakana / Kanji")
- (evil-test-buffer
- "[カ]タカナ漢字"
- ("w")
- "カタカナ[漢]字"))
- (ert-info ("Katakana / Hiragana")
- (evil-test-buffer
- "[カ]タカナひらがな"
- ("w")
- "カタカナ[ひ]らがな"))
- (ert-info ("Katakana / half-width Katakana")
- (evil-test-buffer
- "[カ]タカナカタカナ"
- ("w")
- "カタカナ[カ]タカナ"))
- (ert-info ("Katakana / full-width alphabet")
- (evil-test-buffer
- "[カ]タカナABC"
- ("w")
- "カタカナ[A]BC"))
- (ert-info ("Katakana / full-width numeric")
- (evil-test-buffer
- "[カ]タカナ123"
- ("w")
- "カタカナ[1]23"))
- (ert-info ("Katakana / Hangul")
- (evil-test-buffer
- "[カ]タカナ한글"
- ("w")
- "カタカナ[한]글"))
- (ert-info ("half-width Katakana / Latin")
- (evil-test-buffer
- "[カ]タカナabcd"
- ("w")
- "カタカナabc[d]"))
- (ert-info ("half-width Katakana / numeric")
- (evil-test-buffer
- "[カ]タカナ1234"
- ("w")
- "カタカナ123[4]"))
- (ert-info ("half-width Katakana / Kanji")
- (evil-test-buffer
- "[カ]タカナ漢字"
- ("w")
- "カタカナ[漢]字"))
- (ert-info ("half-width Katakana / Hiragana")
- (evil-test-buffer
- "[カ]タカナひらがな"
- ("w")
- "カタカナ[ひ]らがな"))
- (ert-info ("half-width Katakana / Katakana")
- (evil-test-buffer
- "[カ]タカナカタカナ"
- ("w")
- "カタカナ[カ]タカナ"))
- (ert-info ("half-width Katakana / full-width alphabet")
- (evil-test-buffer
- "[カ]タカナABC"
- ("w")
- "カタカナAB[C]"))
- (ert-info ("half-width Katakana / full-width numeric")
- (evil-test-buffer
- "[カ]タカナ123"
- ("w")
- "カタカナ12[3]"))
- (ert-info ("half-width Katakana / Hangul")
- (evil-test-buffer
- "[カ]タカナ한글"
- ("w")
- "カタカナ[한]글"))
- (ert-info ("full-width alphabet / Latin")
- (evil-test-buffer
- "[A]BCabcd"
- ("w")
- "ABCabc[d]"))
- (ert-info ("full-width alphabet / numeric")
- (evil-test-buffer
- "[A]BC1234"
- ("w")
- "ABC123[4]"))
- (ert-info ("full-width alphabet / Kanji")
- (evil-test-buffer
- "[A]BC漢字"
- ("w")
- "ABC[漢]字"))
- (ert-info ("full-width alphabet / Hiragana")
- (evil-test-buffer
- "[A]BCひらがな"
- ("w")
- "ABC[ひ]らがな"))
- (ert-info ("full-width alphabet / Katakana")
- (evil-test-buffer
- "[A]BCカタカナ"
- ("w")
- "ABC[カ]タカナ"))
- (ert-info ("full-width alphabet / half-width Katakana")
- (evil-test-buffer
- "[A]BCカタカナ"
- ("w")
- "ABCカタカ[ナ]"))
- (ert-info ("full-width alphabet / full-width numeric")
- (evil-test-buffer
- "[A]BC123"
- ("w")
- "ABC12[3]"))
- (ert-info ("full-width alphabet / Hangul")
- (evil-test-buffer
- "[A]BC한글"
- ("w")
- "ABC[한]글"))
- (ert-info ("full-width numeric / Latin")
- (evil-test-buffer
- "[1]23abcd"
- ("w")
- "123abc[d]"))
- (ert-info ("full-width numeric / numeric")
- (evil-test-buffer
- "[1]231234"
- ("w")
- "123123[4]"))
- (ert-info ("full-width numeric / Kanji")
- (evil-test-buffer
- "[1]23漢字"
- ("w")
- "123[漢]字"))
- (ert-info ("full-width numeric / Hiragana")
- (evil-test-buffer
- "[1]23ひらがな"
- ("w")
- "123[ひ]らがな"))
- (ert-info ("full-width numeric / Katakana")
- (evil-test-buffer
- "[1]23カタカナ"
- ("w")
- "123[カ]タカナ"))
- (ert-info ("full-width numeric / half-width Katakana")
- (evil-test-buffer
- "[1]23カタカナ"
- ("w")
- "123カタカ[ナ]"))
- (ert-info ("full-width numeric / full-width alphabet")
- (evil-test-buffer
- "[1]23ABC"
- ("w")
- "123AB[C]"))
- (ert-info ("full-width numeric / Hangul")
- (evil-test-buffer
- "[1]23한글"
- ("w")
- "123[한]글"))
- (ert-info ("Hangul / Latin")
- (evil-test-buffer
- "[한]글abcd"
- ("w")
- "한글[a]bcd"))
- (ert-info ("Hangul / numeric")
- (evil-test-buffer
- "[한]글1234"
- ("w")
- "한글[1]234"))
- (ert-info ("Hangul / Kanji")
- (evil-test-buffer
- "[한]글漢字"
- ("w")
- "한글[漢]字"))
- (ert-info ("Hangul / Hiragana")
- (evil-test-buffer
- "[한]글ひらがな"
- ("w")
- "한글[ひ]らがな"))
- (ert-info ("Hangul / Katakana")
- (evil-test-buffer
- "[한]글カタカナ"
- ("w")
- "한글[カ]タカナ"))
- (ert-info ("Hangul / half-width Katakana")
- (evil-test-buffer
- "[한]글カタカナ"
- ("w")
- "한글[カ]タカナ"))
- (ert-info ("Hangul / full-width alphabet")
- (evil-test-buffer
- "[한]글ABC"
- ("w")
- "한글[A]BC"))
- (ert-info ("Hangul / full-width numeric")
- (evil-test-buffer
- "[한]글123"
- ("w")
- "한글[1]23")))
-
-(ert-deftest evil-test-forward-word-end-cjk ()
- "Test `evil-forward-word-end' on CJK words"
- :tags '(evil motion cjk)
- (ert-info ("Latin / numeric")
- (evil-test-buffer
- "[a]bcd1234"
- ("e")
- "abcd123[4]"))
- (ert-info ("Latin / Kanji")
- (evil-test-buffer
- "[a]bcd漢字"
- ("e")
- "abc[d]漢字"))
- (ert-info ("Latin / Hiragana")
- (evil-test-buffer
- "[a]bcdひらがな"
- ("e")
- "abc[d]ひらがな"))
- (ert-info ("Latin / Katakana")
- (evil-test-buffer
- "[a]bcdカタカナ"
- ("e")
- "abc[d]カタカナ"))
- (ert-info ("Latin / half-width Katakana")
- (evil-test-buffer
- "[a]bcdカタカナ"
- ("e")
- "abcdカタカ[ナ]"))
- (ert-info ("Latin / full-width alphabet")
- (evil-test-buffer
- "[a]bcdABC"
- ("e")
- "abcdAB[C]"))
- (ert-info ("Latin / full-width numeric")
- (evil-test-buffer
- "[a]bcd123"
- ("e")
- "abcd12[3]"))
- (ert-info ("Latin / Hangul")
- (evil-test-buffer
- "[a]bcd한글"
- ("e")
- "abc[d]한글"))
- (ert-info ("numeric / Latin")
- (evil-test-buffer
- "[1]234abcd"
- ("e")
- "1234abc[d]"))
- (ert-info ("numeric / Kanji")
- (evil-test-buffer
- "[1]234漢字"
- ("e")
- "123[4]漢字"))
- (ert-info ("numeric / Hiragana")
- (evil-test-buffer
- "[1]234ひらがな"
- ("e")
- "123[4]ひらがな"))
- (ert-info ("numeric / Katakana")
- (evil-test-buffer
- "[1]234カタカナ"
- ("e")
- "123[4]カタカナ"))
- (ert-info ("numeric / half-width Katakana")
- (evil-test-buffer
- "[1]234カタカナ"
- ("e")
- "1234カタカ[ナ]"))
- (ert-info ("numeric / full-width alphabet")
- (evil-test-buffer
- "[1]234ABC"
- ("e")
- "1234AB[C]"))
- (ert-info ("numeric / full-width numeric")
- (evil-test-buffer
- "[1]234123"
- ("e")
- "123412[3]"))
- (ert-info ("numeric / Hangul")
- (evil-test-buffer
- "[1]234한글"
- ("e")
- "123[4]한글"))
- (ert-info ("Kanji / Latin")
- (evil-test-buffer
- "[漢]字abcd"
- ("e")
- "漢[字]abcd"))
- (ert-info ("Kanji / numeric")
- (evil-test-buffer
- "[漢]字1234"
- ("e")
- "漢[字]1234"))
- (ert-info ("Kanji / Hiragana")
- (evil-test-buffer
- "[漢]字ひらがな"
- ("e")
- "漢[字]ひらがな"))
- (ert-info ("Kanji / Katakana")
- (evil-test-buffer
- "[漢]字カタカナ"
- ("e")
- "漢[字]カタカナ"))
- (ert-info ("Kanji / half-width Katakana")
- (evil-test-buffer
- "[漢]字カタカナ"
- ("e")
- "漢[字]カタカナ"))
- (ert-info ("Kanji / full-width alphabet")
- (evil-test-buffer
- "[漢]字ABC"
- ("e")
- "漢[字]ABC"))
- (ert-info ("Kanji / full-width numeric")
- (evil-test-buffer
- "[漢]字123"
- ("e")
- "漢[字]123"))
- (ert-info ("Kanji / Hangul")
- (evil-test-buffer
- "[漢]字한글"
- ("e")
- "漢[字]한글"))
- (ert-info ("Hiragana / Latin")
- (evil-test-buffer
- "[ひ]らがなabcd"
- ("e")
- "ひらが[な]abcd"))
- (ert-info ("Hiragana / numeric")
- (evil-test-buffer
- "[ひ]らがな1234"
- ("e")
- "ひらが[な]1234"))
- (ert-info ("Hiragana / Kanji")
- (evil-test-buffer
- "[ひ]らがな漢字"
- ("e")
- "ひらが[な]漢字"))
- (ert-info ("Hiragana / Katakana")
- (evil-test-buffer
- "[ひ]らがなカタカナ"
- ("e")
- "ひらが[な]カタカナ"))
- (ert-info ("Hiragana / half-width Katakana")
- (evil-test-buffer
- "[ひ]らがなカタカナ"
- ("e")
- "ひらが[な]カタカナ"))
- (ert-info ("Hiragana / full-width alphabet")
- (evil-test-buffer
- "[ひ]らがなABC"
- ("e")
- "ひらが[な]ABC"))
- (ert-info ("Hiragana / full-width numeric")
- (evil-test-buffer
- "[ひ]らがな123"
- ("e")
- "ひらが[な]123"))
- (ert-info ("Hiragana / Hangul")
- (evil-test-buffer
- "[ひ]らがな한글"
- ("e")
- "ひらが[な]한글"))
- (ert-info ("Katakana / Latin")
- (evil-test-buffer
- "[カ]タカナabcd"
- ("e")
- "カタカ[ナ]abcd"))
- (ert-info ("Katakana / numeric")
- (evil-test-buffer
- "[カ]タカナ1234"
- ("e")
- "カタカ[ナ]1234"))
- (ert-info ("Katakana / Kanji")
- (evil-test-buffer
- "[カ]タカナ漢字"
- ("e")
- "カタカ[ナ]漢字"))
- (ert-info ("Katakana / Hiragana")
- (evil-test-buffer
- "[カ]タカナひらがな"
- ("e")
- "カタカ[ナ]ひらがな"))
- (ert-info ("Katakana / half-width Katakana")
- (evil-test-buffer
- "[カ]タカナカタカナ"
- ("e")
- "カタカ[ナ]カタカナ"))
- (ert-info ("Katakana / full-width alphabet")
- (evil-test-buffer
- "[カ]タカナABC"
- ("e")
- "カタカ[ナ]ABC"))
- (ert-info ("Katakana / full-width numeric")
- (evil-test-buffer
- "[カ]タカナ123"
- ("e")
- "カタカ[ナ]123"))
- (ert-info ("Katakana / Hangul")
- (evil-test-buffer
- "[カ]タカナ한글"
- ("e")
- "カタカ[ナ]한글"))
- (ert-info ("half-width Katakana / Latin")
- (evil-test-buffer
- "[カ]タカナabcd"
- ("e")
- "カタカナabc[d]"))
- (ert-info ("half-width Katakana / numeric")
- (evil-test-buffer
- "[カ]タカナ1234"
- ("e")
- "カタカナ123[4]"))
- (ert-info ("half-width Katakana / Kanji")
- (evil-test-buffer
- "[カ]タカナ漢字"
- ("e")
- "カタカ[ナ]漢字"))
- (ert-info ("half-width Katakana / Hiragana")
- (evil-test-buffer
- "[カ]タカナひらがな"
- ("e")
- "カタカ[ナ]ひらがな"))
- (ert-info ("half-width Katakana / Katakana")
- (evil-test-buffer
- "[カ]タカナカタカナ"
- ("e")
- "カタカ[ナ]カタカナ"))
- (ert-info ("half-width Katakana / full-width alphabet")
- (evil-test-buffer
- "[カ]タカナABC"
- ("e")
- "カタカナAB[C]"))
- (ert-info ("half-width Katakana / full-width numeric")
- (evil-test-buffer
- "[カ]タカナ123"
- ("e")
- "カタカナ12[3]"))
- (ert-info ("half-width Katakana / Hangul")
- (evil-test-buffer
- "[カ]タカナ한글"
- ("e")
- "カタカ[ナ]한글"))
- (ert-info ("full-width alphabet / Latin")
- (evil-test-buffer
- "[A]BCabcd"
- ("e")
- "ABCabc[d]"))
- (ert-info ("full-width alphabet / numeric")
- (evil-test-buffer
- "[A]BC1234"
- ("e")
- "ABC123[4]"))
- (ert-info ("full-width alphabet / Kanji")
- (evil-test-buffer
- "[A]BC漢字"
- ("e")
- "AB[C]漢字"))
- (ert-info ("full-width alphabet / Hiragana")
- (evil-test-buffer
- "[A]BCひらがな"
- ("e")
- "AB[C]ひらがな"))
- (ert-info ("full-width alphabet / Katakana")
- (evil-test-buffer
- "[A]BCカタカナ"
- ("e")
- "AB[C]カタカナ"))
- (ert-info ("full-width alphabet / half-width Katakana")
- (evil-test-buffer
- "[A]BCカタカナ"
- ("e")
- "ABCカタカ[ナ]"))
- (ert-info ("full-width alphabet / full-width numeric")
- (evil-test-buffer
- "[A]BC123"
- ("e")
- "ABC12[3]"))
- (ert-info ("full-width alphabet / Hangul")
- (evil-test-buffer
- "[A]BC한글"
- ("e")
- "AB[C]한글"))
- (ert-info ("full-width numeric / Latin")
- (evil-test-buffer
- "[1]23abcd"
- ("e")
- "123abc[d]"))
- (ert-info ("full-width numeric / numeric")
- (evil-test-buffer
- "[1]231234"
- ("e")
- "123123[4]"))
- (ert-info ("full-width numeric / Kanji")
- (evil-test-buffer
- "[1]23漢字"
- ("e")
- "12[3]漢字"))
- (ert-info ("full-width numeric / Hiragana")
- (evil-test-buffer
- "[1]23ひらがな"
- ("e")
- "12[3]ひらがな"))
- (ert-info ("full-width numeric / Katakana")
- (evil-test-buffer
- "[1]23カタカナ"
- ("e")
- "12[3]カタカナ"))
- (ert-info ("full-width numeric / half-width Katakana")
- (evil-test-buffer
- "[1]23カタカナ"
- ("e")
- "123カタカ[ナ]"))
- (ert-info ("full-width numeric / full-width alphabet")
- (evil-test-buffer
- "[1]23ABC"
- ("e")
- "123AB[C]"))
- (ert-info ("full-width numeric / Hangul")
- (evil-test-buffer
- "[1]23한글"
- ("e")
- "12[3]한글"))
- (ert-info ("Hangul / Latin")
- (evil-test-buffer
- "[한]글abcd"
- ("e")
- "한[글]abcd"))
- (ert-info ("Hangul / numeric")
- (evil-test-buffer
- "[한]글1234"
- ("e")
- "한[글]1234"))
- (ert-info ("Hangul / Kanji")
- (evil-test-buffer
- "[한]글漢字"
- ("e")
- "한[글]漢字"))
- (ert-info ("Hangul / Hiragana")
- (evil-test-buffer
- "[한]글ひらがな"
- ("e")
- "한[글]ひらがな"))
- (ert-info ("Hangul / Katakana")
- (evil-test-buffer
- "[한]글カタカナ"
- ("e")
- "한[글]カタカナ"))
- (ert-info ("Hangul / half-width Katakana")
- (evil-test-buffer
- "[한]글カタカナ"
- ("e")
- "한[글]カタカナ"))
- (ert-info ("Hangul / full-width alphabet")
- (evil-test-buffer
- "[한]글ABC"
- ("e")
- "한[글]ABC"))
- (ert-info ("Hangul / full-width numeric")
- (evil-test-buffer
- "[한]글123"
- ("e")
- "한[글]123")))
-
-(ert-deftest evil-test-backword-word-begin-cjk ()
- "Test `evil-backward-word-begin' on CJK words"
- :tags '(evil motion cjk)
- (ert-info ("Latin / numeric")
- (evil-test-buffer
- "abcd123[4]"
- ("b")
- "[a]bcd1234"))
- (ert-info ("Latin / Kanji")
- (evil-test-buffer
- "abcd漢[字]"
- ("b")
- "abcd[漢]字"))
- (ert-info ("Latin / Hiragana")
- (evil-test-buffer
- "abcdひらが[な]"
- ("b")
- "abcd[ひ]らがな"))
- (ert-info ("Latin / Katakana")
- (evil-test-buffer
- "abcdカタカ[ナ]"
- ("b")
- "abcd[カ]タカナ"))
- (ert-info ("Latin / half-width Katakana")
- (evil-test-buffer
- "abcdカタカ[ナ]"
- ("b")
- "[a]bcdカタカナ"))
- (ert-info ("Latin / full-width alphabet")
- (evil-test-buffer
- "abcdAB[C]"
- ("b")
- "[a]bcdABC"))
- (ert-info ("Latin / full-width numeric")
- (evil-test-buffer
- "abcd12[3]"
- ("b")
- "[a]bcd123"))
- (ert-info ("Latin / Hangul")
- (evil-test-buffer
- "abcd한[글]"
- ("b")
- "abcd[한]글"))
- (ert-info ("numeric / Latin")
- (evil-test-buffer
- "1234abc[d]"
- ("b")
- "[1]234abcd"))
- (ert-info ("numeric / Kanji")
- (evil-test-buffer
- "1234漢[字]"
- ("b")
- "1234[漢]字"))
- (ert-info ("numeric / Hiragana")
- (evil-test-buffer
- "1234ひらが[な]"
- ("b")
- "1234[ひ]らがな"))
- (ert-info ("numeric / Katakana")
- (evil-test-buffer
- "1234カタカ[ナ]"
- ("b")
- "1234[カ]タカナ"))
- (ert-info ("numeric / half-width Katakana")
- (evil-test-buffer
- "1234カタカ[ナ]"
- ("b")
- "[1]234カタカナ"))
- (ert-info ("numeric / full-width alphabet")
- (evil-test-buffer
- "1234AB[C]"
- ("b")
- "[1]234ABC"))
- (ert-info ("numeric / full-width numeric")
- (evil-test-buffer
- "123412[3]"
- ("b")
- "[1]234123"))
- (ert-info ("numeric / Hangul")
- (evil-test-buffer
- "1234한[글]"
- ("b")
- "1234[한]글"))
- (ert-info ("Kanji / Latin")
- (evil-test-buffer
- "漢字abc[d]"
- ("b")
- "漢字[a]bcd"))
- (ert-info ("Kanji / numeric")
- (evil-test-buffer
- "漢字123[4]"
- ("b")
- "漢字[1]234"))
- (ert-info ("Kanji / Hiragana")
- (evil-test-buffer
- "漢字ひらが[な]"
- ("b")
- "漢字[ひ]らがな"))
- (ert-info ("Kanji / Katakana")
- (evil-test-buffer
- "漢字カタカ[ナ]"
- ("b")
- "漢字[カ]タカナ"))
- (ert-info ("Kanji / half-width Katakana")
- (evil-test-buffer
- "漢字カタカ[ナ]"
- ("b")
- "漢字[カ]タカナ"))
- (ert-info ("Kanji / full-width alphabet")
- (evil-test-buffer
- "漢字AB[C]"
- ("b")
- "漢字[A]BC"))
- (ert-info ("Kanji / full-width numeric")
- (evil-test-buffer
- "漢字12[3]"
- ("b")
- "漢字[1]23"))
- (ert-info ("Kanji / Hangul")
- (evil-test-buffer
- "漢字한[글]"
- ("b")
- "漢字[한]글"))
- (ert-info ("Hiragana / Latin")
- (evil-test-buffer
- "ひらがなabc[d]"
- ("b")
- "ひらがな[a]bcd"))
- (ert-info ("Hiragana / numeric")
- (evil-test-buffer
- "ひらがな123[4]"
- ("b")
- "ひらがな[1]234"))
- (ert-info ("Hiragana / Kanji")
- (evil-test-buffer
- "ひらがな漢[字]"
- ("b")
- "ひらがな[漢]字"))
- (ert-info ("Hiragana / Katakana")
- (evil-test-buffer
- "ひらがなカタカ[ナ]"
- ("b")
- "ひらがな[カ]タカナ"))
- (ert-info ("Hiragana / half-width Katakana")
- (evil-test-buffer
- "ひらがなカタカ[ナ]"
- ("b")
- "ひらがな[カ]タカナ"))
- (ert-info ("Hiragana / full-width alphabet")
- (evil-test-buffer
- "ひらがなAB[C]"
- ("b")
- "ひらがな[A]BC"))
- (ert-info ("Hiragana / full-width numeric")
- (evil-test-buffer
- "ひらがな12[3]"
- ("b")
- "ひらがな[1]23"))
- (ert-info ("Hiragana / Hangul")
- (evil-test-buffer
- "ひらがな한[글]"
- ("b")
- "ひらがな[한]글"))
- (ert-info ("Katakana / Latin")
- (evil-test-buffer
- "カタカナabc[d]"
- ("b")
- "カタカナ[a]bcd"))
- (ert-info ("Katakana / numeric")
- (evil-test-buffer
- "カタカナ123[4]"
- ("b")
- "カタカナ[1]234"))
- (ert-info ("Katakana / Kanji")
- (evil-test-buffer
- "カタカナ漢[字]"
- ("b")
- "カタカナ[漢]字"))
- (ert-info ("Katakana / Hiragana")
- (evil-test-buffer
- "カタカナひらが[な]"
- ("b")
- "カタカナ[ひ]らがな"))
- (ert-info ("Katakana / half-width Katakana")
- (evil-test-buffer
- "カタカナカタカ[ナ]"
- ("b")
- "カタカナ[カ]タカナ"))
- (ert-info ("Katakana / full-width alphabet")
- (evil-test-buffer
- "カタカナAB[C]"
- ("b")
- "カタカナ[A]BC"))
- (ert-info ("Katakana / full-width numeric")
- (evil-test-buffer
- "カタカナ12[3]"
- ("b")
- "カタカナ[1]23"))
- (ert-info ("Katakana / Hangul")
- (evil-test-buffer
- "カタカナ한[글]"
- ("b")
- "カタカナ[한]글"))
- (ert-info ("half-width Katakana / Latin")
- (evil-test-buffer
- "カタカナabc[d]"
- ("b")
- "[カ]タカナabcd"))
- (ert-info ("half-width Katakana / numeric")
- (evil-test-buffer
- "カタカナ123[4]"
- ("b")
- "[カ]タカナ1234"))
- (ert-info ("half-width Katakana / Kanji")
- (evil-test-buffer
- "カタカナ漢[字]"
- ("b")
- "カタカナ[漢]字"))
- (ert-info ("half-width Katakana / Hiragana")
- (evil-test-buffer
- "カタカナひらが[な]"
- ("b")
- "カタカナ[ひ]らがな"))
- (ert-info ("half-width Katakana / Katakana")
- (evil-test-buffer
- "カタカナカタカ[ナ]"
- ("b")
- "カタカナ[カ]タカナ"))
- (ert-info ("half-width Katakana / full-width alphabet")
- (evil-test-buffer
- "カタカナAB[C]"
- ("b")
- "[カ]タカナABC"))
- (ert-info ("half-width Katakana / full-width numeric")
- (evil-test-buffer
- "カタカナ12[3]"
- ("b")
- "[カ]タカナ123"))
- (ert-info ("half-width Katakana / Hangul")
- (evil-test-buffer
- "カタカナ한[글]"
- ("b")
- "カタカナ[한]글"))
- (ert-info ("full-width alphabet / Latin")
- (evil-test-buffer
- "ABCabc[d]"
- ("b")
- "[A]BCabcd"))
- (ert-info ("full-width alphabet / numeric")
- (evil-test-buffer
- "ABC123[4]"
- ("b")
- "[A]BC1234"))
- (ert-info ("full-width alphabet / Kanji")
- (evil-test-buffer
- "ABC漢[字]"
- ("b")
- "ABC[漢]字"))
- (ert-info ("full-width alphabet / Hiragana")
- (evil-test-buffer
- "ABCひらが[な]"
- ("b")
- "ABC[ひ]らがな"))
- (ert-info ("full-width alphabet / Katakana")
- (evil-test-buffer
- "ABCカタカ[ナ]"
- ("b")
- "ABC[カ]タカナ"))
- (ert-info ("full-width alphabet / half-width Katakana")
- (evil-test-buffer
- "ABCカタカ[ナ]"
- ("b")
- "[A]BCカタカナ"))
- (ert-info ("full-width alphabet / full-width numeric")
- (evil-test-buffer
- "ABC12[3]"
- ("b")
- "[A]BC123"))
- (ert-info ("full-width alphabet / Hangul")
- (evil-test-buffer
- "ABC한[글]"
- ("b")
- "ABC[한]글"))
- (ert-info ("full-width numeric / Latin")
- (evil-test-buffer
- "123abc[d]"
- ("b")
- "[1]23abcd"))
- (ert-info ("full-width numeric / numeric")
- (evil-test-buffer
- "123123[4]"
- ("b")
- "[1]231234"))
- (ert-info ("full-width numeric / Kanji")
- (evil-test-buffer
- "123漢[字]"
- ("b")
- "123[漢]字"))
- (ert-info ("full-width numeric / Hiragana")
- (evil-test-buffer
- "123ひらが[な]"
- ("b")
- "123[ひ]らがな"))
- (ert-info ("full-width numeric / Katakana")
- (evil-test-buffer
- "123カタカ[ナ]"
- ("b")
- "123[カ]タカナ"))
- (ert-info ("full-width numeric / half-width Katakana")
- (evil-test-buffer
- "123カタカ[ナ]"
- ("b")
- "[1]23カタカナ"))
- (ert-info ("full-width numeric / full-width alphabet")
- (evil-test-buffer
- "123AB[C]"
- ("b")
- "[1]23ABC"))
- (ert-info ("full-width numeric / Hangul")
- (evil-test-buffer
- "123한[글]"
- ("b")
- "123[한]글"))
- (ert-info ("Hangul / Latin")
- (evil-test-buffer
- "한글abc[d]"
- ("b")
- "한글[a]bcd"))
- (ert-info ("Hangul / numeric")
- (evil-test-buffer
- "한글123[4]"
- ("b")
- "한글[1]234"))
- (ert-info ("Hangul / Kanji")
- (evil-test-buffer
- "한글漢[字]"
- ("b")
- "한글[漢]字"))
- (ert-info ("Hangul / Hiragana")
- (evil-test-buffer
- "한글ひらが[な]"
- ("b")
- "한글[ひ]らがな"))
- (ert-info ("Hangul / Katakana")
- (evil-test-buffer
- "한글カタカ[ナ]"
- ("b")
- "한글[カ]タカナ"))
- (ert-info ("Hangul / half-width Katakana")
- (evil-test-buffer
- "한글カタカ[ナ]"
- ("b")
- "한글[カ]タカナ"))
- (ert-info ("Hangul / full-width alphabet")
- (evil-test-buffer
- "한글AB[C]"
- ("b")
- "한글[A]BC"))
- (ert-info ("Hangul / full-width numeric")
- (evil-test-buffer
- "한글12[3]"
- ("b")
- "한글[1]23")))
-
-(ert-deftest evil-test-backword-word-end-cjk ()
- "Test `evil-backward-word-end' on CJK words"
- :tags '(evil motion cjk)
- (ert-info ("Latin / numeric")
- (evil-test-buffer
- "abcd123[4]"
- ("ge")
- "[a]bcd1234"))
- (ert-info ("Latin / Kanji")
- (evil-test-buffer
- "abcd漢[字]"
- ("ge")
- "abc[d]漢字"))
- (ert-info ("Latin / Hiragana")
- (evil-test-buffer
- "abcdひらが[な]"
- ("ge")
- "abc[d]ひらがな"))
- (ert-info ("Latin / Katakana")
- (evil-test-buffer
- "abcdカタカ[ナ]"
- ("ge")
- "abc[d]カタカナ"))
- (ert-info ("Latin / half-width Katakana")
- (evil-test-buffer
- "abcdカタカ[ナ]"
- ("ge")
- "[a]bcdカタカナ"))
- (ert-info ("Latin / full-width alphabet")
- (evil-test-buffer
- "abcdAB[C]"
- ("ge")
- "[a]bcdABC"))
- (ert-info ("Latin / full-width numeric")
- (evil-test-buffer
- "abcd12[3]"
- ("ge")
- "[a]bcd123"))
- (ert-info ("Latin / Hangul")
- (evil-test-buffer
- "abcd한[글]"
- ("ge")
- "abc[d]한글"))
- (ert-info ("numeric / Latin")
- (evil-test-buffer
- "1234abc[d]"
- ("ge")
- "[1]234abcd"))
- (ert-info ("numeric / Kanji")
- (evil-test-buffer
- "1234漢[字]"
- ("ge")
- "123[4]漢字"))
- (ert-info ("numeric / Hiragana")
- (evil-test-buffer
- "1234ひらが[な]"
- ("ge")
- "123[4]ひらがな"))
- (ert-info ("numeric / Katakana")
- (evil-test-buffer
- "1234カタカ[ナ]"
- ("ge")
- "123[4]カタカナ"))
- (ert-info ("numeric / half-width Katakana")
- (evil-test-buffer
- "1234カタカ[ナ]"
- ("ge")
- "[1]234カタカナ"))
- (ert-info ("numeric / full-width alphabet")
- (evil-test-buffer
- "1234AB[C]"
- ("ge")
- "[1]234ABC"))
- (ert-info ("numeric / full-width numeric")
- (evil-test-buffer
- "123412[3]"
- ("ge")
- "[1]234123"))
- (ert-info ("numeric / Hangul")
- (evil-test-buffer
- "1234한[글]"
- ("ge")
- "123[4]한글"))
- (ert-info ("Kanji / Latin")
- (evil-test-buffer
- "漢字abc[d]"
- ("ge")
- "漢[字]abcd"))
- (ert-info ("Kanji / numeric")
- (evil-test-buffer
- "漢字123[4]"
- ("ge")
- "漢[字]1234"))
- (ert-info ("Kanji / Hiragana")
- (evil-test-buffer
- "漢字ひらが[な]"
- ("ge")
- "漢[字]ひらがな"))
- (ert-info ("Kanji / Katakana")
- (evil-test-buffer
- "漢字カタカ[ナ]"
- ("ge")
- "漢[字]カタカナ"))
- (ert-info ("Kanji / half-width Katakana")
- (evil-test-buffer
- "漢字カタカ[ナ]"
- ("ge")
- "漢[字]カタカナ"))
- (ert-info ("Kanji / full-width alphabet")
- (evil-test-buffer
- "漢字AB[C]"
- ("ge")
- "漢[字]ABC"))
- (ert-info ("Kanji / full-width numeric")
- (evil-test-buffer
- "漢字12[3]"
- ("ge")
- "漢[字]123"))
- (ert-info ("Kanji / Hangul")
- (evil-test-buffer
- "漢字한[글]"
- ("ge")
- "漢[字]한글"))
- (ert-info ("Hiragana / Latin")
- (evil-test-buffer
- "ひらがなabc[d]"
- ("ge")
- "ひらが[な]abcd"))
- (ert-info ("Hiragana / numeric")
- (evil-test-buffer
- "ひらがな123[4]"
- ("ge")
- "ひらが[な]1234"))
- (ert-info ("Hiragana / Kanji")
- (evil-test-buffer
- "ひらがな漢[字]"
- ("ge")
- "ひらが[な]漢字"))
- (ert-info ("Hiragana / Katakana")
- (evil-test-buffer
- "ひらがなカタカ[ナ]"
- ("ge")
- "ひらが[な]カタカナ"))
- (ert-info ("Hiragana / half-width Katakana")
- (evil-test-buffer
- "ひらがなカタカ[ナ]"
- ("ge")
- "ひらが[な]カタカナ"))
- (ert-info ("Hiragana / full-width alphabet")
- (evil-test-buffer
- "ひらがなAB[C]"
- ("ge")
- "ひらが[な]ABC"))
- (ert-info ("Hiragana / full-width numeric")
- (evil-test-buffer
- "ひらがな12[3]"
- ("ge")
- "ひらが[な]123"))
- (ert-info ("Hiragana / Hangul")
- (evil-test-buffer
- "ひらがな한[글]"
- ("ge")
- "ひらが[な]한글"))
- (ert-info ("Katakana / Latin")
- (evil-test-buffer
- "カタカナabc[d]"
- ("ge")
- "カタカ[ナ]abcd"))
- (ert-info ("Katakana / numeric")
- (evil-test-buffer
- "カタカナ123[4]"
- ("ge")
- "カタカ[ナ]1234"))
- (ert-info ("Katakana / Kanji")
- (evil-test-buffer
- "カタカナ漢[字]"
- ("ge")
- "カタカ[ナ]漢字"))
- (ert-info ("Katakana / Hiragana")
- (evil-test-buffer
- "カタカナひらが[な]"
- ("ge")
- "カタカ[ナ]ひらがな"))
- (ert-info ("Katakana / half-width Katakana")
- (evil-test-buffer
- "カタカナカタカ[ナ]"
- ("ge")
- "カタカ[ナ]カタカナ"))
- (ert-info ("Katakana / full-width alphabet")
- (evil-test-buffer
- "カタカナAB[C]"
- ("ge")
- "カタカ[ナ]ABC"))
- (ert-info ("Katakana / full-width numeric")
- (evil-test-buffer
- "カタカナ12[3]"
- ("ge")
- "カタカ[ナ]123"))
- (ert-info ("Katakana / Hangul")
- (evil-test-buffer
- "カタカナ한[글]"
- ("ge")
- "カタカ[ナ]한글"))
- (ert-info ("half-width Katakana / Latin")
- (evil-test-buffer
- "カタカナabc[d]"
- ("ge")
- "[カ]タカナabcd"))
- (ert-info ("half-width Katakana / numeric")
- (evil-test-buffer
- "カタカナ123[4]"
- ("ge")
- "[カ]タカナ1234"))
- (ert-info ("half-width Katakana / Kanji")
- (evil-test-buffer
- "カタカナ漢[字]"
- ("ge")
- "カタカ[ナ]漢字"))
- (ert-info ("half-width Katakana / Hiragana")
- (evil-test-buffer
- "カタカナひらが[な]"
- ("ge")
- "カタカ[ナ]ひらがな"))
- (ert-info ("half-width Katakana / Katakana")
- (evil-test-buffer
- "カタカナカタカ[ナ]"
- ("ge")
- "カタカ[ナ]カタカナ"))
- (ert-info ("half-width Katakana / full-width alphabet")
- (evil-test-buffer
- "カタカナAB[C]"
- ("ge")
- "[カ]タカナABC"))
- (ert-info ("half-width Katakana / full-width numeric")
- (evil-test-buffer
- "カタカナ12[3]"
- ("ge")
- "[カ]タカナ123"))
- (ert-info ("half-width Katakana / Hangul")
- (evil-test-buffer
- "カタカナ한[글]"
- ("ge")
- "カタカ[ナ]한글"))
- (ert-info ("full-width alphabet / Latin")
- (evil-test-buffer
- "ABCabc[d]"
- ("ge")
- "[A]BCabcd"))
- (ert-info ("full-width alphabet / numeric")
- (evil-test-buffer
- "ABC123[4]"
- ("ge")
- "[A]BC1234"))
- (ert-info ("full-width alphabet / Kanji")
- (evil-test-buffer
- "ABC漢[字]"
- ("ge")
- "AB[C]漢字"))
- (ert-info ("full-width alphabet / Hiragana")
- (evil-test-buffer
- "ABCひらが[な]"
- ("ge")
- "AB[C]ひらがな"))
- (ert-info ("full-width alphabet / Katakana")
- (evil-test-buffer
- "ABCカタカ[ナ]"
- ("ge")
- "AB[C]カタカナ"))
- (ert-info ("full-width alphabet / half-width Katakana")
- (evil-test-buffer
- "ABCカタカ[ナ]"
- ("ge")
- "[A]BCカタカナ"))
- (ert-info ("full-width alphabet / full-width numeric")
- (evil-test-buffer
- "ABC12[3]"
- ("ge")
- "[A]BC123"))
- (ert-info ("full-width alphabet / Hangul")
- (evil-test-buffer
- "ABC한[글]"
- ("ge")
- "AB[C]한글"))
- (ert-info ("full-width numeric / Latin")
- (evil-test-buffer
- "123abc[d]"
- ("ge")
- "[1]23abcd"))
- (ert-info ("full-width numeric / numeric")
- (evil-test-buffer
- "123123[4]"
- ("ge")
- "[1]231234"))
- (ert-info ("full-width numeric / Kanji")
- (evil-test-buffer
- "123漢[字]"
- ("ge")
- "12[3]漢字"))
- (ert-info ("full-width numeric / Hiragana")
- (evil-test-buffer
- "123ひらが[な]"
- ("ge")
- "12[3]ひらがな"))
- (ert-info ("full-width numeric / Katakana")
- (evil-test-buffer
- "123カタカ[ナ]"
- ("ge")
- "12[3]カタカナ"))
- (ert-info ("full-width numeric / half-width Katakana")
- (evil-test-buffer
- "123カタカ[ナ]"
- ("ge")
- "[1]23カタカナ"))
- (ert-info ("full-width numeric / full-width alphabet")
- (evil-test-buffer
- "123AB[C]"
- ("ge")
- "[1]23ABC"))
- (ert-info ("full-width numeric / Hangul")
- (evil-test-buffer
- "123한[글]"
- ("ge")
- "12[3]한글"))
- (ert-info ("Hangul / Latin")
- (evil-test-buffer
- "한글abc[d]"
- ("ge")
- "한[글]abcd"))
- (ert-info ("Hangul / numeric")
- (evil-test-buffer
- "한글123[4]"
- ("ge")
- "한[글]1234"))
- (ert-info ("Hangul / Kanji")
- (evil-test-buffer
- "한글漢[字]"
- ("ge")
- "한[글]漢字"))
- (ert-info ("Hangul / Hiragana")
- (evil-test-buffer
- "한글ひらが[な]"
- ("ge")
- "한[글]ひらがな"))
- (ert-info ("Hangul / Katakana")
- (evil-test-buffer
- "한글カタカ[ナ]"
- ("ge")
- "한[글]カタカナ"))
- (ert-info ("Hangul / half-width Katakana")
- (evil-test-buffer
- "한글カタカ[ナ]"
- ("ge")
- "한[글]カタカナ"))
- (ert-info ("Hangul / full-width alphabet")
- (evil-test-buffer
- "한글AB[C]"
- ("ge")
- "한[글]ABC"))
- (ert-info ("Hangul / full-width numeric")
- (evil-test-buffer
- "한글12[3]"
- ("ge")
- "한[글]123")))
-
-(ert-deftest evil-test-forward-paragraph ()
- "Test `evil-forward-paragraph'"
- :tags '(evil motion)
- (ert-info ("Simple")
- (evil-test-buffer
- "[A]bove some line
-
-Below some empty line"
- ("}")
- "Above some line
-\[]
-Below some empty line"))
- (ert-info ("With count")
- (evil-test-buffer
- "[A]bove some line
-
-Below some empty line"
- ("2}")
- "Above some line
-
-Below some empty lin[e]"))
- (ert-info ("End of buffer")
- (evil-test-buffer
- "[B]elow some empty line"
- ("100}")
- "Below some empty lin[e]"
- (should-error (execute-kbd-macro "}"))
- (should-error (execute-kbd-macro "42}"))))
- (ert-info ("End of buffer with newline")
- (evil-test-buffer
- "[B]elow some empty line\n\n"
- ("100}")
- "Below some empty line\n\n[]"
- (should-error (execute-kbd-macro "}"))
- (should-error (execute-kbd-macro "42}")))))
-
-(ert-deftest evil-test-backward-paragraph ()
- "Test `evil-backward-paragraph'"
- :tags '(evil motion)
- (ert-info ("Simple")
- (evil-test-buffer
- "Above some line
-
-Below some empty lin[e]"
- ("{")
- "Above some line
-\[]
-Below some empty line"))
- (ert-info ("With count")
- (evil-test-buffer
- "Above some line
-
-Below some empty lin[e]"
- ("2{")
- "[A]bove some line
-
-Below some empty line"))
- (ert-info ("Beginning of buffer")
- (evil-test-buffer
- "Above some line
-
-Below some empty lin[e]"
- ("100{")
- "[A]bove some line
-
-Below some empty line"
- (should-error (execute-kbd-macro "{"))
- (should-error (execute-kbd-macro "42{"))))
- (ert-info ("Beginning of buffer with newlines")
- (evil-test-buffer
- "\n\nAbove some line
-
-Below some empty lin[e]"
- ("100{")
- "[]\n\nAbove some line
-
-Below some empty line"
- (should-error (execute-kbd-macro "{"))
- (should-error (execute-kbd-macro "42{")))))
-
-(ert-deftest evil-test-forward-sentence ()
- "Test `evil-forward-sentence'"
- :tags '(evil motion)
- (ert-info ("Simple")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation. If you want to create a file,
-;; visit that file with C-x C-f.
-
-Below some empty line."
- (")")
- ";; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation. [I]f you want to create a file,
-;; visit that file with C-x C-f.
-
-Below some empty line."
- (")")
- ";; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation. If you want to create a file,
-;; visit that file with C-x C-f.
-\[]
-Below some empty line."
- (")")
- ";; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation. If you want to create a file,
-;; visit that file with C-x C-f.
-
-\[B]elow some empty line."))
- (ert-info ("With count")
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation. If you want to create a file,
-;; visit that file with C-x C-f.
-
-Below some empty line."
- ("2)")
- ";; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation. If you want to create a file,
-;; visit that file with C-x C-f.
-\[]
-Below some empty line."
- ("2)")
- ";; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation. If you want to create a file,
-;; visit that file with C-x C-f.
-
-Below some empty line[.]"))
- (ert-info ("End of buffer")
- (evil-test-buffer
- "[B]elow some empty line."
- ("100)")
- "Below some empty line[.]"
- (should-error (execute-kbd-macro ")"))
- (should-error (execute-kbd-macro "42)"))))
- (ert-info ("End of buffer with newline")
- (evil-test-buffer
- "[B]elow some empty line.\n\n"
- (")")
- "Below some empty line.\n[\n]"
- (")")
- "Below some empty line.\n\n[]"
- (should-error (execute-kbd-macro ")"))
- (should-error (execute-kbd-macro "42)")))))
-
-(ert-deftest evil-test-backward-sentence ()
- "Test `evil-backward-sentence'"
- :tags '(evil motion)
- (ert-info ("Simple")
- (evil-test-buffer
- ";; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation. If you want to create a file,
-;; visit that file with C-x C-f.
-
-Below some empty line[.]"
- ("(")
- ";; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation. If you want to create a file,
-;; visit that file with C-x C-f.
-
-\[B]elow some empty line."
- ("(")
- ";; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation. If you want to create a file,
-;; visit that file with C-x C-f.
-\[]
-Below some empty line."
- ("(")
- ";; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation. [I]f you want to create a file,
-;; visit that file with C-x C-f.
-
-Below some empty line."
- ("(")
- "[;]; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation. If you want to create a file,
-;; visit that file with C-x C-f.
-
-Below some empty line."))
- (ert-info ("With count")
- (evil-test-buffer
- ";; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation. If you want to create a file,
-;; visit that file with C-x C-f.
-
-Below some empty line[.]"
- ("2(")
- ";; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation. If you want to create a file,
-;; visit that file with C-x C-f.
-\[]
-Below some empty line."
- ("2(")
- "[;]; This buffer is for notes you don't want to save,
-;; and for Lisp evaluation. If you want to create a file,
-;; visit that file with C-x C-f.
-
-Below some empty line."))
- (ert-info ("Beginning of buffer")
- (evil-test-buffer
- ";; This buffer is for notes you don't want to save[.]"
- ("100(")
- "[;]; This buffer is for notes you don't want to save."
- (should-error (execute-kbd-macro "("))
- (should-error (execute-kbd-macro "42("))))
- (ert-info ("Beginning of buffer with newlines")
- (evil-test-buffer
- "\n\n;; This buffer is for notes you don't want to save[.]"
- ("100(")
- "[]\n\n;; This buffer is for notes you don't want to save."
- (should-error (execute-kbd-macro "("))
- (should-error (execute-kbd-macro "42(")))))
-
-(ert-deftest evil-test-find-char ()
- "Test `evil-find-char'"
- :tags '(evil motion)
- (ert-info ("Simple")
- (evil-test-buffer
- "[;]; This buffer is for notes."
- ("fT")
- ";; [T]his buffer is for notes."))
- (ert-info ("With count")
- (evil-test-buffer
- "[;]; This buffer is for notes."
- ("2fe")
- ";; This buffer is for not[e]s."))
- (ert-info ("Repeat")
- (evil-test-buffer
- "[;]; This buffer is for notes."
- ("fe;")
- ";; This buffer is for not[e]s."))
- (ert-info ("Repeat backward")
- (evil-test-buffer
- "[;]; This buffer is for notes."
- ("2fe,")
- ";; This buff[e]r is for notes."))
- (ert-info ("No match")
- (evil-test-buffer
- "[;]; This buffer is for notes."
- (should-error (execute-kbd-macro "fL"))))
- (ert-info ("End of line")
- (let ((evil-cross-lines t))
- (evil-test-buffer
- "[;]; This buffer is for notes,
-;; and for Lisp evaluation."
- ("fL")
- ";; This buffer is for notes,
-;; and for [L]isp evaluation.")))
- (ert-info ("Empty line")
- (evil-test-buffer
- "[]
-This buffer is for notes."
- (should-error (execute-kbd-macro "fT")))))
-
-(ert-deftest evil-test-find-char-backward ()
- "Test `evil-find-char-backward'"
- :tags '(evil motion)
- (ert-info ("Simple")
- (evil-test-buffer
- ";; This buffer is for notes[.]"
- ("FT")
- ";; [T]his buffer is for notes."))
- (ert-info ("With count")
- (evil-test-buffer
- ";; This buffer is for notes[.]"
- ("2Fe")
- ";; This buff[e]r is for notes."))
- (ert-info ("Repeat")
- (evil-test-buffer
- ";; This buffer is for notes[.]"
- ("Fe;")
- ";; This buff[e]r is for notes."))
- (ert-info ("Repeat backward")
- (evil-test-buffer
- ";; This buffer is for notes[.]"
- ("2Fe,")
- ";; This buffer is for not[e]s."))
- (ert-info ("No match")
- (evil-test-buffer
- ";; This buffer is for notes[.]"
- (should-error (execute-kbd-macro "FL"))))
- (ert-info ("End of line")
- (let ((evil-cross-lines t))
- (evil-test-buffer
- ";; This buffer is for notes,
-;; and for Lisp evaluation[.]"
- ("FT")
- ";; [T]his buffer is for notes,
-;; and for Lisp evaluation."))))
-
-(ert-deftest evil-test-find-digraph-char ()
- "Test evil-read-digraph-char while finding char."
- :tags '(evil motion)
- (ert-info ("Find digraph char")
- (evil-test-buffer
- "a[b]cde∀g"
- ("f\C-kFA")
- "abcde[∀]g")))
-
-(ert-deftest evil-test-find-char-to ()
- "Test `evil-find-char-to'"
- :tags '(evil motion)
- (ert-info ("Simple")
- (evil-test-buffer
- "[;]; This buffer is for notes."
- ("tT")
- ";;[ ]This buffer is for notes."))
- (ert-info ("With count")
- (evil-test-buffer
- "[;]; This buffer is for notes."
- ("2te")
- ";; This buffer is for no[t]es."))
- (ert-info ("Repeat")
- (evil-test-buffer
- "[;]; This buffer is for notes."
- ("tel;")
- ";; This buffer is for no[t]es."))
- (ert-info ("Repeat backward")
- (evil-test-buffer
- "[;]; This buffer is for notes."
- ("2te,")
- ";; This buffe[r] is for notes."))
- (ert-info ("Repeat should skip adjacent character")
- (let ((evil-repeat-find-to-skip-next t))
- (evil-test-buffer
- "[a]aaxaaaxaaaxaaa"
- ("tx;")
- "aaaxaa[a]xaaaxaaa"
- (";")
- "aaaxaaaxaa[a]xaaa"
- (",")
- "aaaxaaax[a]aaxaaa"
- (",")
- "aaax[a]aaxaaaxaaa")))
- (ert-info ("Repeat should NOT skip adjacent character")
- (let ((evil-repeat-find-to-skip-next nil))
- (evil-test-buffer
- "[a]aaxaaaxaaaxaaa"
- ("tx;")
- "aa[a]xaaaxaaaxaaa")))
- (ert-info ("No match")
- (evil-test-buffer
- "[;]; This buffer is for notes."
- (should-error (execute-kbd-macro "tL"))))
- (ert-info ("End of line")
- (let ((evil-cross-lines t))
- (evil-test-buffer
- "[;]; This buffer is for notes,
-;; and for Lisp evaluation."
- ("tL")
- ";; This buffer is for notes,
-;; and for[ ]Lisp evaluation."))))
-
-(ert-deftest evil-test-find-char-to-backward ()
- "Test `evil-find-char-to-backward'"
- :tags '(evil motion)
- (ert-info ("Simple")
- (evil-test-buffer
- ";; This buffer is for notes[.]"
- ("TT")
- ";; T[h]is buffer is for notes."))
- (ert-info ("With count")
- (evil-test-buffer
- ";; This buffer is for notes[.]"
- ("2Te")
- ";; This buffe[r] is for notes."))
- (ert-info ("Repeat")
- (evil-test-buffer
- ";; This buffer is for notes[.]"
- ("Teh;")
- ";; This buffe[r] is for notes."))
- (ert-info ("Repeat backward")
- (evil-test-buffer
- ";; This buffer is for notes[.]"
- ("2Te,")
- ";; This buffer is for no[t]es."))
- (ert-info ("Repeat should skip adjacent character")
- (let ((evil-repeat-find-to-skip-next t))
- (evil-test-buffer
- "aaaxaaaxaaaxaa[a]"
- ("Tx;")
- "aaaxaaax[a]aaxaaa"
- (";")
- "aaax[a]aaxaaaxaaa"
- (",")
- "aaaxaa[a]xaaaxaaa"
- (",")
- "aaaxaaaxaa[a]xaaa")))
- (ert-info ("Repeat should NOT skip adjacent character")
- (let ((evil-repeat-find-to-skip-next nil))
- (evil-test-buffer
- "aaaxaaaxaaaxaa[a]"
- ("Tx;")
- "aaaxaaaxaaax[a]aa")))
- (ert-info ("No match")
- (evil-test-buffer
- ";; This buffer is for notes[.]"
- (should-error (execute-kbd-macro "TL"))))
- (ert-info ("End of line")
- (let ((evil-cross-lines t))
- (evil-test-buffer
- ";; This buffer is for notes,
-;; and for Lisp evaluation[.]"
- ("TT")
- ";; T[h]is buffer is for notes,
-;; and for Lisp evaluation."))))
-
-(ert-deftest evil-test-jump-item ()
- "Test `evil-jump-item'"
- :tags '(evil motion)
- (ert-info ("Simple")
- (evil-test-buffer
- "int main[(]int argc, char** argv)"
- ("%")
- "int main(int argc, char** argv[)]"
- ("%")
- "int main[(]int argc, char** argv)"))
- (ert-info ("Before parenthesis")
- (evil-test-buffer
- "[i]nt main(int argc, char** argv)"
- ("%")
- "int main(int argc, char** argv[)]"
- ("5h")
- "int main(int argc, char**[ ]argv)"
- ("%")
- "int main[(]int argc, char** argv)"))
- (ert-info ("Over several lines")
- (evil-test-buffer
- "int main(int argc, char** argv)
-\[{]
- printf(\"Hello world\\n\");
- return EXIT_SUCCESS;
-}"
- ("%")
- "int main(int argc, char** argv)
-{
- printf(\"Hello world\\n\");
- return EXIT_SUCCESS;
-\[}]"))
- (ert-info ("On line without parenthesis")
- (evil-test-buffer
- "[#]include <stdio.h>"
- (should-error (execute-kbd-macro "%"))))
- (ert-info ("Before unmatched opening parenthesies")
- (evil-test-buffer
- "x[x]xx ( yyyyy () zzzz"
- (should-error (execute-kbd-macro "%"))
- "x[x]xx ( yyyyy () zzzz"))
- (ert-info ("Before unmatched closing parenthesies")
- (evil-test-buffer
- "x[x]xx ) yyyyy () zzzz"
- (should-error (execute-kbd-macro "%"))
- "x[x]xx ) yyyyy () zzzz"))
-
- (ert-info ("At the end of the line")
- (evil-test-buffer
- "[p]ublic void foo(String bar) {\n blabla;\n}\n"
- ("v$%")
- "public void foo(String bar) {\n blabla;\n[}]\n")))
-
-(ert-deftest evil-test-unmatched-paren ()
- "Test `evil-previous-open-paren' and `evil-next-close-paren'"
- :tags '(evil motion)
- (ert-info ("Simple")
- (evil-test-buffer
- "foo ( { ( [b]ar ) baz } )"
- ("[(")
- "foo ( { [(] bar ) baz } )"
- ("])")
- "foo ( { ( bar [)] baz } )"
- ("[(")
- "foo ( { [(] bar ) baz } )"
- ("[(")
- "foo [(] { ( bar ) baz } )"
- ("f)])")
- "foo ( { ( bar ) baz } [)]"))
- (ert-info ("With count")
- (evil-test-buffer
- "foo ( { ( [b]ar ) baz } )"
- ("2[(")
- "foo [(] { ( bar ) baz } )")
- (evil-test-buffer
- "foo ( { ( [b]ar ) baz } )"
- ("2])")
- "foo ( { ( bar ) baz } [)]")))
-
-(ert-deftest evil-test-paren-jump-from-string ()
- "Test jump to next/prev paren from a string"
- :tags '(evil motion)
- (evil-test-buffer
- "{
- fun(a, \"T[]est\", test());
-}
-"
- ("[(")
- "{
- fun[(]a, \"Test\", test());
-}
-"
- ("])")
- "{
- fun(a, \"Test\", test()[)];
-}
-")
- (evil-test-buffer
- "{
- fun(a, \"T[]est\", test());
-}
-"
- ("])")
- "{
- fun(a, \"Test\", test()[)];
-}
-"
- ("[(")
- "{
- fun[(]a, \"Test\", test());
-}
-")
- (evil-test-buffer
- "{
- fun(a, \"T[]est\", test());
-}
-"
- ("[{")
- "[{]
- fun(a, \"Test\", test());
-}
-")
- (evil-test-buffer
- "{
- fun(a, \"T[]est\", test());
-}
-"
- ("]}")
- "{
- fun(a, \"Test\", test());
-[}]
-"))
-
-(ert-deftest evil-test-paren-jump-inside-string-from-string ()
- "Test jump to next/prev paren inside string from a string"
- :tags '(evil motion)
- (evil-test-buffer
- "{ (\"Test with paren (inside multi (l[e]vel))\", test()); } "
- ("[(")
- "{ (\"Test with paren (inside multi [(]level))\", test()); } "
- ("[(")
- "{ (\"Test with paren [(]inside multi (level))\", test()); } ")
- (evil-test-buffer
- "{ (\"Test with paren (inside multi (l[e]vel))\", test()); } "
- ("])")
- "{ (\"Test with paren (inside multi (level[)])\", test()); } "
- ("])")
- "{ (\"Test with paren (inside multi (level)[)]\", test()); } ")
- (evil-test-buffer
- "{ (\"Test with paren {inside multi {l[e]vel}}\", test()); } "
- ("[{")
- "{ (\"Test with paren {inside multi [{]level}}\", test()); } "
- ("[{")
- "{ (\"Test with paren [{]inside multi {level}}\", test()); } ")
- (evil-test-buffer
- "{ (\"Test with paren {inside multi {l[e]vel}}\", test()); } "
- ("]}")
- "{ (\"Test with paren {inside multi {level[}]}\", test()); } "
- ("]}")
- "{ (\"Test with paren {inside multi {level}[}]\", test()); } "))
-
-(ert-deftest evil-test-insert-resume ()
- "Test `evil-insert-resume'"
- :tags '(evil motion)
- (ert-info ("Can move to last insert location and take a count")
- (evil-test-buffer
- "alpha bravo [ ]delta echo"
- ("i" "charlie" [escape] "^")
- "[a]lpha bravo charlie delta echo"
- ("2gi" " zulu" [escape])
- "alpha bravo charlie zulu zul[u] delta echo"))
- (ert-info ("Can move to `^' marker in visual line state")
- (evil-test-buffer
- "alpha [b]ravo\ncharlie delta\necho foxtrot"
- ("i" [escape] "/foxtrot" [return])
- "alpha bravo\ncharlie delta\necho [f]oxtrot"
- ("Vk")
- "alpha bravo\ncharl[i]e delta\necho foxtrot"
- ("gi")
- "alpha [b]ravo\ncharlie delta\necho foxtrot"
- ("vd")
- "alpha [o]xtrot")))
-
-(ert-deftest evil-test-next-mark ()
- "Test `evil-next-mark', `evil-previous-mark'"
- :tags '(evil motion)
- (ert-info ("Can move to next mark, next mark line,
-previous mark and previous mark line")
- (evil-test-buffer
- "[a]lpha bravo
-charlie delta echo
-foxtrot golf hotel
-india juliet"
- ("ma" "w" "mb" "w"
- "mc" "w" "md" "w" "me" "w"
- "mf" "w" "mg" "w" "mh" "w"
- "mi" "w" "mj")
- "alpha bravo
-charlie delta echo
-foxtrot golf hotel
-india [j]uliet"
- ("3]`")
- "alpha bravo
-[c]harlie delta echo
-foxtrot golf hotel
-india juliet"
- ("]'")
- "alpha bravo
-charlie delta echo
-[f]oxtrot golf hotel
-india juliet"
- ("[`")
- "alpha bravo
-charlie delta [e]cho
-foxtrot golf hotel
-india juliet"
- ("2['")
- "alpha bravo
-charlie delta echo
-foxtrot golf hotel
-[i]ndia juliet")))
-
-(ert-deftest evil-set-col-0-mark-test ()
- "Test `evil-set-col-0-mark' ex command"
- :tags '(evil ex)
- (evil-test-buffer
- "Lin[e] 1
-Line 2"
- (":mark k" [return] "G" "`k")
- "[L]ine 1
-Line 2"))
-
-(ert-deftest evil-delete-marks-test ()
- "Test `evil-delete-marks' ex command"
- :tags '(evil ex)
- (ert-info ("Can delete marks")
- (evil-test-buffer
- "[O]ne line is enough if we use backtick to navigate"
- ("mO" "w" "ml" "w" "mi" "$b" "m4")
- "One line is enough if we use backtick to [n]avigate"
- ("`O")
- "[O]ne line is enough if we use backtick to navigate"
- (":delm O" [return] "`i")
- "One line [i]s enough if we use backtick to navigate"
- (error user-error "`O")
- "One line [i]s enough if we use backtick to navigate"
- ("`4")
- "One line is enough if we use backtick to [n]avigate"
- (":delm h-m" [return])
- (error user-error "`i")
- "One line is enough if we use backtick to [n]avigate")))
-
-(ert-deftest evil-automatic-marks-test ()
- "Test that certain commands automatically set mark(er)s"
- :tags '(evil)
- (ert-info ("Visual selection sets angle-bracket marks")
- (evil-test-buffer
- "alpha br[a]vo charlie"
- ("viw" [escape] "$")
- "alpha bravo charli[e]"
- ("`>")
- "alpha brav[o] charlie"
- ("`<")
- "alpha [b]ravo charlie")))
-
-(ert-deftest evil-test-flyspell-motions ()
- "Test flyspell motions"
- :tags '(evil motion)
- (skip-unless (condition-case _ (progn (ispell-check-version) t) (error)))
- (ert-info ("Simple")
- (evil-test-buffer
- "[I] cannt tpye for lyfe"
- (flyspell-mode)
- (flyspell-buffer)
- ("]s")
- "I [c]annt tpye for lyfe"
- ("]s")
- "I cannt [t]pye for lyfe"
- ("]s")
- "I cannt tpye for [l]yfe"
- ("]s")
- "I [c]annt tpye for lyfe"
- ("[s")
- "I cannt tpye for [l]yfe"
- ("[s")
- "I cannt [t]pye for lyfe")
- (evil-test-buffer
- "[o]en otw thre"
- (flyspell-mode)
- (flyspell-buffer)
- ("]s")
- "oen [o]tw thre"
- ("]s")
- "oen otw [t]hre"
- ("]s")
- "[o]en otw thre"))
- (ert-info ("With count")
- (evil-test-buffer
- "[I] cannt tpye for lyfe"
- (flyspell-mode)
- (flyspell-buffer)
- ("2]s")
- "I cannt [t]pye for lyfe"
- ("2]s")
- "I [c]annt tpye for lyfe"
- ("2[s")
- "I cannt [t]pye for lyfe"
- ("2[s")
- "I cannt tpye for [l]yfe"))
- (ert-info ("With evil-search-wrap disabled")
- (let (evil-search-wrap)
- (evil-test-buffer
- "[I] cannt tpye for lyfe"
- (flyspell-mode)
- (flyspell-buffer)
- ("]s")
- "I [c]annt tpye for lyfe"
- ("]s")
- "I cannt [t]pye for lyfe"
- ("]s")
- "I cannt tpye for [l]yfe"
- (error search-failed "]s"))))
- (ert-info ("One mistake")
- (evil-test-buffer
- "[I]'m almst there..."
- (flyspell-mode)
- (flyspell-buffer)
- ("]s")
- "I'm [a]lmst there..."
- ("]s")
- "I'm [a]lmst there..."))
- (ert-info ("No mistakes")
- (evil-test-buffer
- "[I]'ve learned to type!"
- (flyspell-mode)
- (flyspell-buffer)
- (error search-failed "]s")
- (error search-failed "[s"))))
-
-;;; Text objects
-
-(ert-deftest evil-test-text-object ()
- "Test `evil-define-text-object'"
- :tags '(evil text-object)
- (let ((object (evil-define-text-object nil (count &optional beg end _type)
- (let ((sel (and beg end (evil-range beg end))))
- (when (and sel (> count 0)) (forward-char 1))
- (let ((range (if (< count 0)
- (list (- (point) 3) (point))
- (list (point) (+ (point) 3)))))
- (if sel
- (evil-range-union range sel)
- range))))))
- (ert-info ("Select three characters after point")
- (evil-test-buffer
- :state operator
- ";; [T]his buffer is for notes."
- (should (equal (funcall object 1) '(4 7 inclusive)))))
- (ert-info ("Select three characters before point")
- (evil-test-buffer
- :state operator
- ";; [T]his buffer is for notes."
- (should (equal (funcall object -1) '(1 4 inclusive)))))
- (ert-info ("Select three characters after selection")
- (evil-test-buffer
- ";; <Thi[s]> buffer is for notes."
- (call-interactively object)
- ";; <This b[u]>ffer is for notes."))
- (ert-info ("Select three characters before selection")
- (evil-test-buffer
- ";; <[T]his> buffer is for notes."
- (call-interactively object)
- "<[;]; This> buffer is for notes."))
- (ert-info ("Delete three characters after point")
- (evil-test-buffer
- "[;]; This buffer is for notes."
- (define-key evil-operator-state-local-map "io" object)
- ("dio")
- "[T]his buffer is for notes."))))
-
-(ert-deftest evil-test-word-objects ()
- "Test `evil-inner-word' and `evil-a-word'"
- :tags '(evil text-object)
- (ert-info ("Select a word")
- (evil-test-buffer
- ";; [T]his buffer is for notes."
- ("viw")
- ";; <Thi[s]> buffer is for notes.")
- (evil-test-buffer
- ";; [T]his buffer is for notes."
- ("vaw")
- ";; <This[ ]>buffer is for notes.")
- (evil-test-buffer
- ";; Thi[s] buffer is for notes."
- ("viw")
- ";; <Thi[s]> buffer is for notes.")
- (evil-test-buffer
- ";; Thi[s] buffer is for notes."
- ("vaw")
- ";; <This[ ]>buffer is for notes."))
- (ert-info ("Select two words")
- (ert-info ("Include whitespace on this side")
- (evil-test-buffer
- ";;< Thi[s]> buffer is for notes."
- ("aw")
- ";;< This buffe[r]> is for notes.")
- (evil-test-buffer
- ";; This <[b]uffer >is for notes."
- ("aw")
- ";; <[T]his buffer >is for notes."))
- (ert-info ("Include whitespace on the other side")
- (evil-test-buffer
- ";; <This[ ]>buffer is for notes."
- ("aw")
- ";; <This buffer[ ]>is for notes.")
- (evil-test-buffer
- ";; This<[ ]buffer> is for notes."
- ("aw")
- ";;<[ ]This buffer> is for notes.")))
- (ert-info ("select first visual word")
- (evil-test-buffer
- "([a])"
- ("viw")
- "(<[a]>)"))
- (ert-info ("Deleting whitespace is confined to the line")
- (evil-test-buffer
- "foo\n [ ] bar"
- ("diw")
- "foo\n[b]ar")
- (evil-test-buffer
- "foo\n [ ] bar"
- ("diW")
- "foo\n[b]ar")
- (evil-test-buffer
- "fo[o]\nbar"
- ("diW")
- "[\n]bar")
- (evil-test-buffer
- "foo\n [ ] bar"
- ("daw")
- "foo\n[]")
- (evil-test-buffer
- "foo\n [ ] bar"
- ("daW")
- "foo\n[]"))
- (ert-info ("Deleting the only word on a line doesn't delete indentation")
- (evil-test-buffer
- " [b]ar"
- ("daw")
- " [ ]")
- (evil-test-buffer
- " [b]ar"
- ("daW")
- " [ ]")
- (ert-info ("But deleting the final word of many behaves as normal")
- (evil-test-buffer
- " foo [b]ar"
- ("daw")
- " fo[o]")))
- (ert-info ("Deleting whitespace on whitepsace only line")
- (evil-test-buffer
- "foo\n[ ]\nbar"
- ("diw")
- "foo\n[]\nbar")
- (evil-test-buffer
- "foo\n[ ]\nbar"
- ("daw")
- "foo\n[]\nbar")))
-
-(ert-deftest evil-test-word-objects-cjk ()
- "Test `evil-inner-word' and `evil-a-word' on CJK words"
- :tags '(evil text-object cjk)
- (ert-info ("Select a word")
- (evil-test-buffer
- "[a]bcd1234"
- ("viw")
- "<abcd123[4]>")
- (evil-test-buffer
- "[a]bcd1234"
- ("vaw")
- "<abcd123[4]>")
- (evil-test-buffer
- "[a]bcd漢字"
- ("viw")
- "<abc[d]>漢字")
- (evil-test-buffer
- "[a]bcd漢字"
- ("vaw")
- "<abc[d]>漢字")
- (evil-test-buffer
- "[a]bcdひらがな"
- ("viw")
- "<abc[d]>ひらがな")
- (evil-test-buffer
- "[a]bcdひらがな"
- ("vaw")
- "<abc[d]>ひらがな")
- (evil-test-buffer
- "[a]bcdカタカナ"
- ("viw")
- "<abc[d]>カタカナ")
- (evil-test-buffer
- "[a]bcdカタカナ"
- ("vaw")
- "<abc[d]>カタカナ")
- (evil-test-buffer
- "[a]bcdカタカナ"
- ("viw")
- "<abcdカタカ[ナ]>")
- (evil-test-buffer
- "[a]bcdカタカナ"
- ("vaw")
- "<abcdカタカ[ナ]>")
- (evil-test-buffer
- "[a]bcdABC"
- ("viw")
- "<abcdAB[C]>")
- (evil-test-buffer
- "[a]bcdABC"
- ("vaw")
- "<abcdAB[C]>")
- (evil-test-buffer
- "[a]bcd123"
- ("viw")
- "<abcd12[3]>")
- (evil-test-buffer
- "[a]bcd123"
- ("vaw")
- "<abcd12[3]>")
- (evil-test-buffer
- "[a]bcd한글"
- ("viw")
- "<abc[d]>한글")
- (evil-test-buffer
- "[a]bcd한글"
- ("vaw")
- "<abc[d]>한글")
- (evil-test-buffer
- "[1]234abcd"
- ("viw")
- "<1234abc[d]>")
- (evil-test-buffer
- "[1]234abcd"
- ("vaw")
- "<1234abc[d]>")
- (evil-test-buffer
- "[1]234漢字"
- ("viw")
- "<123[4]>漢字")
- (evil-test-buffer
- "[1]234漢字"
- ("vaw")
- "<123[4]>漢字")
- (evil-test-buffer
- "[1]234ひらがな"
- ("viw")
- "<123[4]>ひらがな")
- (evil-test-buffer
- "[1]234ひらがな"
- ("vaw")
- "<123[4]>ひらがな")
- (evil-test-buffer
- "[1]234カタカナ"
- ("viw")
- "<123[4]>カタカナ")
- (evil-test-buffer
- "[1]234カタカナ"
- ("vaw")
- "<123[4]>カタカナ")
- (evil-test-buffer
- "[1]234カタカナ"
- ("viw")
- "<1234カタカ[ナ]>")
- (evil-test-buffer
- "[1]234カタカナ"
- ("vaw")
- "<1234カタカ[ナ]>")
- (evil-test-buffer
- "[1]234ABC"
- ("viw")
- "<1234AB[C]>")
- (evil-test-buffer
- "[1]234ABC"
- ("vaw")
- "<1234AB[C]>")
- (evil-test-buffer
- "[1]234123"
- ("viw")
- "<123412[3]>")
- (evil-test-buffer
- "[1]234123"
- ("vaw")
- "<123412[3]>")
- (evil-test-buffer
- "[1]234한글"
- ("viw")
- "<123[4]>한글")
- (evil-test-buffer
- "[1]234한글"
- ("vaw")
- "<123[4]>한글")
- (evil-test-buffer
- "[漢]字abcd"
- ("viw")
- "<漢[字]>abcd")
- (evil-test-buffer
- "[漢]字abcd"
- ("vaw")
- "<漢[字]>abcd")
- (evil-test-buffer
- "[漢]字1234"
- ("viw")
- "<漢[字]>1234")
- (evil-test-buffer
- "[漢]字1234"
- ("vaw")
- "<漢[字]>1234")
- (evil-test-buffer
- "[漢]字ひらがな"
- ("viw")
- "<漢[字]>ひらがな")
- (evil-test-buffer
- "[漢]字ひらがな"
- ("vaw")
- "<漢[字]>ひらがな")
- (evil-test-buffer
- "[漢]字カタカナ"
- ("viw")
- "<漢[字]>カタカナ")
- (evil-test-buffer
- "[漢]字カタカナ"
- ("vaw")
- "<漢[字]>カタカナ")
- (evil-test-buffer
- "[漢]字カタカナ"
- ("viw")
- "<漢[字]>カタカナ")
- (evil-test-buffer
- "[漢]字カタカナ"
- ("vaw")
- "<漢[字]>カタカナ")
- (evil-test-buffer
- "[漢]字ABC"
- ("viw")
- "<漢[字]>ABC")
- (evil-test-buffer
- "[漢]字ABC"
- ("vaw")
- "<漢[字]>ABC")
- (evil-test-buffer
- "[漢]字123"
- ("viw")
- "<漢[字]>123")
- (evil-test-buffer
- "[漢]字123"
- ("vaw")
- "<漢[字]>123")
- (evil-test-buffer
- "[漢]字한글"
- ("viw")
- "<漢[字]>한글")
- (evil-test-buffer
- "[漢]字한글"
- ("vaw")
- "<漢[字]>한글")
- (evil-test-buffer
- "[ひ]らがなabcd"
- ("viw")
- "<ひらが[な]>abcd")
- (evil-test-buffer
- "[ひ]らがなabcd"
- ("vaw")
- "<ひらが[な]>abcd")
- (evil-test-buffer
- "[ひ]らがな1234"
- ("viw")
- "<ひらが[な]>1234")
- (evil-test-buffer
- "[ひ]らがな1234"
- ("vaw")
- "<ひらが[な]>1234")
- (evil-test-buffer
- "[ひ]らがな漢字"
- ("viw")
- "<ひらが[な]>漢字")
- (evil-test-buffer
- "[ひ]らがな漢字"
- ("vaw")
- "<ひらが[な]>漢字")
- (evil-test-buffer
- "[ひ]らがなカタカナ"
- ("viw")
- "<ひらが[な]>カタカナ")
- (evil-test-buffer
- "[ひ]らがなカタカナ"
- ("vaw")
- "<ひらが[な]>カタカナ")
- (evil-test-buffer
- "[ひ]らがなカタカナ"
- ("viw")
- "<ひらが[な]>カタカナ")
- (evil-test-buffer
- "[ひ]らがなカタカナ"
- ("vaw")
- "<ひらが[な]>カタカナ")
- (evil-test-buffer
- "[ひ]らがなABC"
- ("viw")
- "<ひらが[な]>ABC")
- (evil-test-buffer
- "[ひ]らがなABC"
- ("vaw")
- "<ひらが[な]>ABC")
- (evil-test-buffer
- "[ひ]らがな123"
- ("viw")
- "<ひらが[な]>123")
- (evil-test-buffer
- "[ひ]らがな123"
- ("vaw")
- "<ひらが[な]>123")
- (evil-test-buffer
- "[ひ]らがな한글"
- ("viw")
- "<ひらが[な]>한글")
- (evil-test-buffer
- "[ひ]らがな한글"
- ("vaw")
- "<ひらが[な]>한글")
- (evil-test-buffer
- "[カ]タカナabcd"
- ("viw")
- "<カタカ[ナ]>abcd")
- (evil-test-buffer
- "[カ]タカナabcd"
- ("vaw")
- "<カタカ[ナ]>abcd")
- (evil-test-buffer
- "[カ]タカナ1234"
- ("viw")
- "<カタカ[ナ]>1234")
- (evil-test-buffer
- "[カ]タカナ1234"
- ("vaw")
- "<カタカ[ナ]>1234")
- (evil-test-buffer
- "[カ]タカナ漢字"
- ("viw")
- "<カタカ[ナ]>漢字")
- (evil-test-buffer
- "[カ]タカナ漢字"
- ("vaw")
- "<カタカ[ナ]>漢字")
- (evil-test-buffer
- "[カ]タカナひらがな"
- ("viw")
- "<カタカ[ナ]>ひらがな")
- (evil-test-buffer
- "[カ]タカナひらがな"
- ("vaw")
- "<カタカ[ナ]>ひらがな")
- (evil-test-buffer
- "[カ]タカナカタカナ"
- ("viw")
- "<カタカ[ナ]>カタカナ")
- (evil-test-buffer
- "[カ]タカナカタカナ"
- ("vaw")
- "<カタカ[ナ]>カタカナ")
- (evil-test-buffer
- "[カ]タカナABC"
- ("viw")
- "<カタカ[ナ]>ABC")
- (evil-test-buffer
- "[カ]タカナABC"
- ("vaw")
- "<カタカ[ナ]>ABC")
- (evil-test-buffer
- "[カ]タカナ123"
- ("viw")
- "<カタカ[ナ]>123")
- (evil-test-buffer
- "[カ]タカナ123"
- ("vaw")
- "<カタカ[ナ]>123")
- (evil-test-buffer
- "[カ]タカナ한글"
- ("viw")
- "<カタカ[ナ]>한글")
- (evil-test-buffer
- "[カ]タカナ한글"
- ("vaw")
- "<カタカ[ナ]>한글")
- (evil-test-buffer
- "[カ]タカナabcd"
- ("viw")
- "<カタカナabc[d]>")
- (evil-test-buffer
- "[カ]タカナabcd"
- ("vaw")
- "<カタカナabc[d]>")
- (evil-test-buffer
- "[カ]タカナ1234"
- ("viw")
- "<カタカナ123[4]>")
- (evil-test-buffer
- "[カ]タカナ1234"
- ("vaw")
- "<カタカナ123[4]>")
- (evil-test-buffer
- "[カ]タカナ漢字"
- ("viw")
- "<カタカ[ナ]>漢字")
- (evil-test-buffer
- "[カ]タカナ漢字"
- ("vaw")
- "<カタカ[ナ]>漢字")
- (evil-test-buffer
- "[カ]タカナひらがな"
- ("viw")
- "<カタカ[ナ]>ひらがな")
- (evil-test-buffer
- "[カ]タカナひらがな"
- ("vaw")
- "<カタカ[ナ]>ひらがな")
- (evil-test-buffer
- "[カ]タカナカタカナ"
- ("viw")
- "<カタカ[ナ]>カタカナ")
- (evil-test-buffer
- "[カ]タカナカタカナ"
- ("vaw")
- "<カタカ[ナ]>カタカナ")
- (evil-test-buffer
- "[カ]タカナABC"
- ("viw")
- "<カタカナAB[C]>")
- (evil-test-buffer
- "[カ]タカナABC"
- ("vaw")
- "<カタカナAB[C]>")
- (evil-test-buffer
- "[カ]タカナ123"
- ("viw")
- "<カタカナ12[3]>")
- (evil-test-buffer
- "[カ]タカナ123"
- ("vaw")
- "<カタカナ12[3]>")
- (evil-test-buffer
- "[カ]タカナ한글"
- ("viw")
- "<カタカ[ナ]>한글")
- (evil-test-buffer
- "[カ]タカナ한글"
- ("vaw")
- "<カタカ[ナ]>한글")
- (evil-test-buffer
- "[A]BCabcd"
- ("viw")
- "<ABCabc[d]>")
- (evil-test-buffer
- "[A]BCabcd"
- ("vaw")
- "<ABCabc[d]>")
- (evil-test-buffer
- "[A]BC1234"
- ("viw")
- "<ABC123[4]>")
- (evil-test-buffer
- "[A]BC1234"
- ("vaw")
- "<ABC123[4]>")
- (evil-test-buffer
- "[A]BC漢字"
- ("viw")
- "<AB[C]>漢字")
- (evil-test-buffer
- "[A]BC漢字"
- ("vaw")
- "<AB[C]>漢字")
- (evil-test-buffer
- "[A]BCひらがな"
- ("viw")
- "<AB[C]>ひらがな")
- (evil-test-buffer
- "[A]BCひらがな"
- ("vaw")
- "<AB[C]>ひらがな")
- (evil-test-buffer
- "[A]BCカタカナ"
- ("viw")
- "<AB[C]>カタカナ")
- (evil-test-buffer
- "[A]BCカタカナ"
- ("vaw")
- "<AB[C]>カタカナ")
- (evil-test-buffer
- "[A]BCカタカナ"
- ("viw")
- "<ABCカタカ[ナ]>")
- (evil-test-buffer
- "[A]BCカタカナ"
- ("vaw")
- "<ABCカタカ[ナ]>")
- (evil-test-buffer
- "[A]BC123"
- ("viw")
- "<ABC12[3]>")
- (evil-test-buffer
- "[A]BC123"
- ("vaw")
- "<ABC12[3]>")
- (evil-test-buffer
- "[A]BC한글"
- ("viw")
- "<AB[C]>한글")
- (evil-test-buffer
- "[A]BC한글"
- ("vaw")
- "<AB[C]>한글")
- (evil-test-buffer
- "[1]23abcd"
- ("viw")
- "<123abc[d]>")
- (evil-test-buffer
- "[1]23abcd"
- ("vaw")
- "<123abc[d]>")
- (evil-test-buffer
- "[1]231234"
- ("viw")
- "<123123[4]>")
- (evil-test-buffer
- "[1]231234"
- ("vaw")
- "<123123[4]>")
- (evil-test-buffer
- "[1]23漢字"
- ("viw")
- "<12[3]>漢字")
- (evil-test-buffer
- "[1]23漢字"
- ("vaw")
- "<12[3]>漢字")
- (evil-test-buffer
- "[1]23ひらがな"
- ("viw")
- "<12[3]>ひらがな")
- (evil-test-buffer
- "[1]23ひらがな"
- ("vaw")
- "<12[3]>ひらがな")
- (evil-test-buffer
- "[1]23カタカナ"
- ("viw")
- "<12[3]>カタカナ")
- (evil-test-buffer
- "[1]23カタカナ"
- ("vaw")
- "<12[3]>カタカナ")
- (evil-test-buffer
- "[1]23カタカナ"
- ("viw")
- "<123カタカ[ナ]>")
- (evil-test-buffer
- "[1]23カタカナ"
- ("vaw")
- "<123カタカ[ナ]>")
- (evil-test-buffer
- "[1]23ABC"
- ("viw")
- "<123AB[C]>")
- (evil-test-buffer
- "[1]23ABC"
- ("vaw")
- "<123AB[C]>")
- (evil-test-buffer
- "[1]23한글"
- ("viw")
- "<12[3]>한글")
- (evil-test-buffer
- "[1]23한글"
- ("vaw")
- "<12[3]>한글")
- (evil-test-buffer
- "[한]글abcd"
- ("viw")
- "<한[글]>abcd")
- (evil-test-buffer
- "[한]글abcd"
- ("vaw")
- "<한[글]>abcd")
- (evil-test-buffer
- "[한]글1234"
- ("viw")
- "<한[글]>1234")
- (evil-test-buffer
- "[한]글1234"
- ("vaw")
- "<한[글]>1234")
- (evil-test-buffer
- "[한]글漢字"
- ("viw")
- "<한[글]>漢字")
- (evil-test-buffer
- "[한]글漢字"
- ("vaw")
- "<한[글]>漢字")
- (evil-test-buffer
- "[한]글ひらがな"
- ("viw")
- "<한[글]>ひらがな")
- (evil-test-buffer
- "[한]글ひらがな"
- ("vaw")
- "<한[글]>ひらがな")
- (evil-test-buffer
- "[한]글カタカナ"
- ("viw")
- "<한[글]>カタカナ")
- (evil-test-buffer
- "[한]글カタカナ"
- ("vaw")
- "<한[글]>カタカナ")
- (evil-test-buffer
- "[한]글カタカナ"
- ("viw")
- "<한[글]>カタカナ")
- (evil-test-buffer
- "[한]글カタカナ"
- ("vaw")
- "<한[글]>カタカナ")
- (evil-test-buffer
- "[한]글ABC"
- ("viw")
- "<한[글]>ABC")
- (evil-test-buffer
- "[한]글ABC"
- ("vaw")
- "<한[글]>ABC")
- (evil-test-buffer
- "[한]글123"
- ("viw")
- "<한[글]>123")
- (evil-test-buffer
- "[한]글123"
- ("vaw")
- "<한[글]>123")))
-
-(ert-deftest evil-test-paragraph-objects ()
- "Test `evil-inner-paragraph' and `evil-a-paragraph'"
- :tags '(evil text-object)
- (ert-info ("Select a paragraph with point at beginning")
- (evil-test-buffer
- "[;]; This buffer is for notes,
-;; and for Lisp evaluation.
-
-;; This buffer is for notes,
-;; and for Lisp evaluation."
- ("vap")
- "<;; This buffer is for notes,
-;; and for Lisp evaluation.
-\[]\n>\
-;; This buffer is for notes,
-;; and for Lisp evaluation."))
- (ert-info ("Select a paragraph with point at last line")
- (evil-test-buffer
- ";; This buffer is for notes,
-\[;]; and for Lisp evaluation.
-
-;; This buffer is for notes,
-;; and for Lisp evaluation."
- ("vap")
- "<;; This buffer is for notes,
-;; and for Lisp evaluation.
-\[]\n>\
-;; This buffer is for notes,
-;; and for Lisp evaluation."))
- (ert-info ("Select a paragraph with point after paragraph")
- (evil-test-buffer
- ";; This buffer is for notes,
-;; and for Lisp evaluation.
-\[]
-;; This buffer is for notes,
-;; and for Lisp evaluation."
- ("vap")
- ";; This buffer is for notes,
-;; and for Lisp evaluation.
-<
-;; This buffer is for notes,
-;; and for Lisp evaluation[.]>"))
- (ert-info ("Select inner paragraph")
- (evil-test-buffer
- "[;]; This buffer is for notes,
-;; and for Lisp evaluation.
-
-;; This buffer is for notes,
-;; and for Lisp evaluation."
- ("vip")
- "<;; This buffer is for notes,
-;; and for Lisp evaluation.[]
->
-;; This buffer is for notes,
-;; and for Lisp evaluation.")
- (evil-test-buffer
- ";; This buffer is for notes,
-\[;]; and for Lisp evaluation.
-
-;; This buffer is for notes,
-;; and for Lisp evaluation."
- ("vip")
- "<;; This buffer is for notes,
-;; and for Lisp evaluation.[]
->
-;; This buffer is for notes,
-;; and for Lisp evaluation.")
- (evil-test-buffer
- ";; This buffer is for notes,
-;; and for Lisp evaluation.
-\[]
-;; This buffer is for notes,
-;; and for Lisp evaluation."
- ("vip")
- ";; This buffer is for notes,
-;; and for Lisp evaluation.
-<
-;; This buffer is for notes,
-;; and for Lisp evaluation[.]>")))
-
-(ert-deftest evil-test-quote-objects ()
- "Test `evil-inner-single-quote' and `evil-a-single-quote'"
- :tags '(evil text-object)
- (ert-info ("Select text inside of '...'")
- (evil-test-buffer
- "This is 'a [t]est' for quote objects."
- ("vi'")
- "This is '<a tes[t]>' for quote objects.")
- (evil-test-buffer
- "This is \"a '[t]est'\" for quote objects."
- ("vi'")
- "This is \"a '<tes[t]>'\" for quote objects."))
- (ert-info ("Select text including enclosing quotes")
- (evil-test-buffer
- "This is 'a [t]est' for quote objects."
- ("v2i'")
- "This is <'a test[']> for quote objects."))
- (ert-info ("Select text including enclosing quotes and following space")
- (evil-test-buffer
- "This is 'a [t]est' for quote objects."
- ("va'")
- "This is <'a test'[ ]>for quote objects."))
- (ert-info ("Select text including enclosing quotes and previous space")
- (evil-test-buffer
- "This is 'a [t]est'. For quote objects."
- ("va'")
- "This is< 'a test[']>. For quote objects."))
- (ert-info ("Select text on opening quote")
- (evil-test-buffer
- "This is [\"]a test\". For \"quote\" objects."
- (emacs-lisp-mode)
- ("va\"")
- "This is< \"a test[\"]>. For \"quote\" objects."))
- (ert-info ("Select text on closing quote")
- (evil-test-buffer
- "This is \"a test[\"]. For \"quote\" objects."
- (emacs-lisp-mode)
- ("va\"")
- "This is< \"a test[\"]>. For \"quote\" objects."))
- (ert-info ("Delete text from outside")
- (evil-test-buffer
- "Th[i]s is \"a test\". For \"quote\" objects."
- (emacs-lisp-mode)
- ("da\"")
- "This is[.] For \"quote\" objects."))
- (ert-info ("Operator on empty quotes")
- (evil-test-buffer
- "This is [a]n \"\" empty quote"
- (emacs-lisp-mode)
- ("ci\"XXX" [escape])
- "This is an \"XX[X]\" empty quote")))
-
-(ert-deftest evil-test-paren-objects ()
- "Test `evil-inner-paren', etc."
- :tags '(evil text-object)
- (ert-info ("Select inner text")
- (evil-test-buffer
- "[(]aaa)"
- (emacs-lisp-mode) ; syntax
- ("vi(")
- "(<aa[a]>)")
- (evil-test-buffer
- "(aaa[)]"
- (emacs-lisp-mode)
- ("vi(")
- "(<aa[a]>)")
- (ert-info ("Next to outer delimiter")
- (evil-test-buffer
- "([(]aaa))"
- (emacs-lisp-mode)
- ("vi(")
- "((<aa[a]>))")
- (evil-test-buffer
- "((aaa[)])"
- (emacs-lisp-mode)
- ("vi(")
- "((<aa[a]>))")))
- (ert-info ("Select double inner parentheses")
- (evil-test-buffer
- "([(]word))"
- ("dib")
- "(())")
- (evil-test-buffer
- "[(](word))"
- ("dib")
- "()")
- (evil-test-buffer
- "((word[)])"
- ("dib")
- "(())")
- (evil-test-buffer
- "((word)[)]"
- ("dib")
- "()"))
- (ert-info ("Select double outer parentheses")
- (evil-test-buffer
- "a([(]word))b"
- ("dab")
- "a()b")
- (evil-test-buffer
- "a[(](word))b"
- ("dab")
- "ab")
- (evil-test-buffer
- "a((word[)])b"
- ("dab")
- "a()b")
- (evil-test-buffer
- "a((word)[)]b"
- ("dab")
- "ab"))
- (ert-info ("Select parentheses inside strings")
- (evil-test-buffer
- "(aaa \"b(b[b]b)\" aa)"
- (emacs-lisp-mode)
- ("va(")
- "(aaa \"b<(bbb[)]>\" aa)"))
- (ert-info ("Break out of empty strings")
- (evil-test-buffer
- "(aaa \"bb[b]b\" aa)"
- (emacs-lisp-mode)
- ("va(")
- "<(aaa \"bbbb\" aa[)]>"))
- (ert-info ("Select inner parentheses around strings")
- (evil-test-buffer
- "((\"t[e]st\"))\n"
- (emacs-lisp-mode)
- ("vib")
- "((<\"test[\"]>))\n"
- ("ib")
- "(<(\"test\"[)]>)\n")
- (evil-test-buffer
- "( ( \"t[e]st\" ) )\n"
- (emacs-lisp-mode)
- ("vib")
- "( (< \"test\"[ ]>) )\n"
- ("ib")
- "(< ( \"test\" )[ ]>)\n")
- (evil-test-buffer
- "((\"t[e]st\"))\n"
- (emacs-lisp-mode)
- ("vhhib")
- "((<[\"]test\">))\n"
- ("ib")
- "(<[(]\"test\")>)\n")
- (evil-test-buffer
- "( ( \"t[e]st\" ) )\n"
- (emacs-lisp-mode)
- ("vhhib")
- "( (<[ ]\"test\" >) )\n"
- ("ib")
- "(<[ ]( \"test\" ) >)\n"))
- (ert-info ("Select outer parentheses around strings")
- (evil-test-buffer
- "((\"t[e]st\"))\n"
- (emacs-lisp-mode)
- ("vab")
- "(<(\"test\"[)]>)\n"
- ("ab")
- "<((\"test\")[)]>\n")
- (evil-test-buffer
- "( ( \"t[e]st\" ) )\n"
- (emacs-lisp-mode)
- ("vab")
- "( <( \"test\" [)]> )\n"
- ("ab")
- "<( ( \"test\" ) [)]>\n")
- (evil-test-buffer
- "((\"t[e]st\"))\n"
- (emacs-lisp-mode)
- ("vhhab")
- "(<[(]\"test\")>)\n"
- ("ab")
- "<[(](\"test\"))>\n")
- (evil-test-buffer
- "( ( \"t[e]st\" ) )\n"
- (emacs-lisp-mode)
- ("vhhab")
- "( <[(] \"test\" )> )\n"
- ("ab")
- "<[(] ( \"test\" ) )>\n")
- (evil-test-buffer
- "(([\"]\"))\n"
- ("dab")
- "([)]\n"))
- (ert-info ("Select inner paren on different lines")
- (evil-test-buffer
- "for (auto i : vector) {
- if (cond) {
- do_[s]omething();
- }
-}"
- ("vi}")
- "for (auto i : vector) {
- if (cond) {
-< do_something();[\n]> }\n}"
- ("i}")
- "for (auto i : vector) {
-< if (cond) {
- do_something();
- }[\n]>}"))
- (ert-info ("Enlarge to smallest complete surrounding")
- (evil-test-buffer
- "for (auto i : vector) {
- if (c<ond) {
- do_[s]>omething();
- }
-}"
- ("i}")
- "for (auto i : vector) {
-< if (cond) {
- do_something();
- }[\n]>}"))
- (ert-info ("yank on blocks is turned linewise")
- (evil-test-buffer
- "{\n [f]oo();\n}\n"
- ("yiBp")
- "{\n foo();\n [f]oo();\n}\n"))
- (ert-info ("exclusive like if ending at bol")
- (evil-test-buffer
- "(defun foo ()\n[ ] (insert \"bar\")\n )\n"
- ("cibx" [escape])
- "([x]\n )\n"))
- (ert-info ("Operator on empty parentheses")
- (evil-test-buffer
- "a([(]))b"
- ("cibx" [escape])
- "a(([x]))b")
- (evil-test-buffer
- "a(([)])b"
- ("cibx" [escape])
- "a(([x]))b")))
-
-(ert-deftest evil-test-forces-linewise-text-objects ()
- "Test `evil-text-object-change-visual-type' option."
- :tags '(evil text-object)
- (let ((evil-text-object-change-visual-type t))
- (ert-info ("Change visual type")
- (evil-test-buffer
- " function(opts) {
- this.var1 = something();
- [t]his.var2 = something_else();
- return something_nasty();
- }
-"
- ("Vi}")
- " function(opts) {
-< this.var1 = something();
- this.var2 = something_else();
- return something_nasty();[
-]> }
-"
- (should (eq (evil-visual-type) 'inclusive)))))
- (let ((evil-text-object-change-visual-type nil))
- (ert-info ("Change visual type keeping linewise")
- (evil-test-buffer
- " function(opts) {
- this.var1 = something();
- [t]his.var2 = something_else();
- return something_nasty();
- }
-"
- ("Vi}")
- " function(opts) {
-< this.var1 = something();
- this.var2 = something_else();
- return something_nasty();\n> }
-"
- (should (eq (evil-visual-type) 'line)))))
- (let ((evil-text-object-change-visual-type nil))
- (ert-info ("Linewise outer block")
- (evil-test-buffer
- " function(opts) {
- this.var1 = something();
- [t]his.var2 = something_else();
- return something_nasty();
- }
-"
- ("Va}")
- "< function(opts) {
- this.var1 = something();
- this.var2 = something_else();
- return something_nasty();
- }
->"
- (should (eq (evil-visual-type) 'line)))))
- (ert-info ("Forced motion type should change text object type")
- (evil-test-buffer
- "for (int i=0; i<10; i++) {
- if ([c]ond) {
- do_something();
- }
-}"
- ("dVi}")
- "for (int i=0; i<10; i++) {
-\[}]")))
-
-(ert-deftest evil-test-tag-objects ()
- "Test `evil-inner-tag', etc."
- :tags '(evil text-object)
- (ert-info ("Handle nested tags")
- (evil-test-buffer
- :visual-start "{"
- :visual-end "}"
- "<p><a>f[o]o</a> bar</p>"
- ("vit")
- "<p><a>{fo[o]}</a> bar</p>"))
- (ert-info ("Break out of tags")
- (evil-test-buffer
- :visual-start "{"
- :visual-end "}"
- "<a[a]a>bbbb</aaa>"
- ("vit")
- "<aaa>{bbb[b]}</aaa>")
- (evil-test-buffer
- :visual-start "{"
- :visual-end "}"
- "<a[a]a>bbbb</aaa>"
- ("vat")
- "{<aaa>bbbb</aaa[>]}"))
- (ert-info ("Handle quoted strings tags")
- (evil-test-buffer
- :visual-start "{"
- :visual-end "}"
- "<html>
-<body>
-<div id=\"content\">
-\[ ]
-<p>
-UPDATE
-</p>
-<p>
-test hello <a href=\"/deed.zh\">Creative Commons</a>
-</p>
-</div>
-</body>
-</html>
-"
- ("vit")
- "<html>
-<body>
-<div id=\"content\">{\n \n<p>
-UPDATE
-</p>
-<p>
-test hello <a href=\"/deed.zh\">Creative Commons</a>
-</p>[\n]}</div>
-</body>
-</html>
-"))
- (ert-info ("Handle js arrow fns")
- (evil-test-buffer
- :visual-start "«"
- :visual-end "»"
- "<button foo=\"bar\" onClick={() => fnbody()}>inner [t]ext</button>"
- ("vit")
- "<button foo=\"bar\" onClick={() => fnbody()}>«inner tex[t]»</button>"))
- (ert-info ("Inner tag is selected, even when empty")
- (evil-test-buffer
- :visual-start "«"
- :visual-end "»"
- "<p>foo<b [c]lass =\"bold\"></b>qux</p>"
- ("cit" "bar")
- "<p>foo<b class =\"bold\">bar</b>qux</p>")))
-
-;;; Visual state
-
-(defun evil-test-visual-select (selection &optional mark point)
- "Verify that TYPE is selected correctly"
- (let ((type (evil-visual-type selection)))
- (evil-visual-make-selection mark point type)
- (ert-info ("Activate region unless SELECTION is `block'")
- (cond
- ((eq selection 'block)
- (should (mark t))
- (should-not (region-active-p))
- (should-not transient-mark-mode))
- (t
- (should (mark))
- (should (region-active-p)))))
- (ert-info ("Refresh Visual markers")
- (should (= (evil-range-beginning (evil-expand (point) (mark) type))
- evil-visual-beginning))
- (should (= (evil-range-end (evil-expand (point) (mark) type))
- evil-visual-end))
- (should (eq (evil-visual-type) type))
- (should (eq evil-visual-direction
- (if (< (point) (mark)) -1 1))))))
-
-(ert-deftest evil-test-visual-refresh ()
- "Test `evil-visual-refresh'"
- :tags '(evil visual)
- (evil-test-buffer
- ";; [T]his buffer is for notes."
- (evil-visual-refresh nil nil 'inclusive)
- (should (= evil-visual-beginning 4))
- (should (= evil-visual-end 5)))
- (evil-test-buffer
- ";; [T]his buffer is for notes."
- (let ((evil-visual-region-expanded t))
- (evil-visual-refresh nil nil 'inclusive)
- (should (= evil-visual-beginning 4))
- (should (= evil-visual-end 4)))))
-
-(ert-deftest evil-test-non-transient-visual-selection ()
- "Ensure visual charwise selection can be made when transient mark mode is nil."
- :tags '(evil visual)
- (evil-test-buffer
- "Alpha [b]ravo charlie"
- (setq-local transient-mark-mode nil)
- ("ve")
- "Alpha <brav[o]> charlie"))
-
-(ert-deftest evil-test-visual-exchange ()
- "Test `exchange-point-and-mark' in Visual character selection"
- :tags '(evil visual)
- (evil-test-buffer
- ";; <[T]his> buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("o")
- (should (region-active-p))
- ";; <Thi[s]> buffer is for notes you don't want to save,
-;; and for Lisp evaluation."))
-
-(ert-deftest evil-test-visual-char ()
- "Test Visual character selection"
- :tags '(evil visual)
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- (evil-test-visual-select 'char)
- ";; <[T]>his buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("e")
- ";; <Thi[s]> buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("o")
- ";; <[T]his> buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("d")
- ";; [ ]buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- ("vV")
- "<;; [ ]buffer is for notes you don't want to save,\n>\
-;; and for Lisp evaluation."))
-
-(ert-deftest evil-test-visual-line ()
- "Test Visual line selection"
- :tags '(evil visual)
- (evil-test-buffer
- ";; [T]his buffer is for notes you don't want to save,
-;; and for Lisp evaluation."
- (evil-test-visual-select 'line)
- "<;; [T]his buffer is for notes you don't want to save,\n>\
-;; and for Lisp evaluation."
- ("e")
- "<;; Thi[s] buffer is for notes you don't want to save,\n>\
-;; and for Lisp evaluation."
- ("o")
- "<;; [T]his buffer is for notes you don't want to save,\n>\
-;; and for Lisp evaluation."
- ("d")
- ";; [a]nd for Lisp evaluation."))
-
-(ert-deftest evil-test-visual-block ()
- "Test Visual block selection"
- :tags '(evil visual)
- (evil-test-buffer
- "[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- (evil-test-visual-select 'block)
- "<[;]>; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; then enter the text in that file's own buffer."
- ("jjll")
- "<;; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;;[ ]>then enter the text in that file's own buffer."
- ("O")
- ";; <This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
->[;]; then enter the text in that file's own buffer."
- ("o")
- ";;[ ]<This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
->;; then enter the text in that file's own buffer."
- ("O")
- "<[;]; This buffer is for notes you don't want to save.
-;; If you want to create a file, visit that file with C-x C-f,
-;; >then enter the text in that file's own buffer."
- ("d")
- "This buffer is for notes you don't want to save.
-If you want to create a file, visit that file with C-x C-f,
-then enter the text in that file's own buffer.")
- (ert-info ("Visual block can select over lines of different length")
- (evil-test-buffer
- "Short [l]ine
-A much longer line
-A medium line
-Tiny ln"
- ("\C-v$jd")
- "Short[ ]
-A much
-A medium line
-Tiny ln"
- ("jj\C-v" [end] "jd")
- "Short
-A much
-A me[d]
-Tiny "))
- (ert-info ("Visual block does not extend up to curswant unless tracking EOL")
- (evil-test-buffer
- "[a]bc
-"
- ("\C-vfcjd")
- "[b]c
-"))
- (ert-info ("Pasting visual block")
- (evil-test-buffer
- "alpha [b]ravo charlie
-delta echo foxtrot
-golf hotel india
-juliet kilo mike"
- ("\C-v" "jje" "y" "$" "p")
- "alpha bravo charlie[b]rav
-delta echo foxtrot echo
-golf hotel india otel
-juliet kilo mike"
- ("G" "o" [escape] "p")
- "alpha bravo charliebrav
-delta echo foxtrot echo
-golf hotel india otel
-juliet kilo mike
-[b]rav
-echo
-otel")))
-
-(ert-deftest evil-test-visual-restore ()
- "Test restoring a previous selection"
- :tags '(evil visual)
- (ert-info ("Restore characterwise selection")
- (evil-test-buffer
- ";; <[T]his> buffer is for notes."
- ([escape] "gv")
- ";; <[T]his> buffer is for notes."))
- (ert-info ("Restore linewise selection")
- (evil-test-buffer
- :visual line
- "<;; [T]his buffer is for notes.>"
- ([escape] "gv")
- "<;; [T]his buffer is for notes.>"))
- (ert-info ("Restore blockwise selection")
- (evil-test-buffer
- :visual block
- "<;; This buffer is for notes,
-;;[ ]>and for Lisp evaluation."
- ([escape] "gv")
- "<;; This buffer is for notes,
-;;[ ]>and for Lisp evaluation.")
- (ert-info ("After paste shifts initially selected text")
- (evil-test-buffer
- :visual block
- "<1\n2\n[3]>"
- ("yP")
- "[1]1\n22\n33"
- ("gvr*")
- "[*]1\n*2\n*3")))
- (ert-info ("Restore linewise visually-pasted selection")
- (evil-test-buffer
- "[a]lpha bravo\ncharlie delta
-echo foxtrot\ngolf hotel"
- ("2yy" "++" "Vp" "gv")
- "alpha bravo\ncharlie delta
-<alpha bravo\ncharlie delta\n>golf hotel"))
- ;; 4 repetitions appears necessary, from manual testing
- (ert-info ("Restore previous linewise selection from linewise selection")
- (evil-test-buffer
- "alpha bravo\nch[a]rlie delta\necho foxtrot\ngolf hotel"
- ("V" [escape] "jV")
- "alpha bravo\ncharlie delta\n<ec[h]o foxtrot\n>golf hotel"
- ("gv")
- "alpha bravo\n<ch[a]rlie delta\n>echo foxtrot\ngolf hotel"
- ("gv")
- "alpha bravo\ncharlie delta\n<ec[h]o foxtrot\n>golf hotel"
- ("gv")
- "alpha bravo\n<ch[a]rlie delta\n>echo foxtrot\ngolf hotel"
- ("gv")
- "alpha bravo\ncharlie delta\n<ec[h]o foxtrot\n>golf hotel"))
- (ert-info ("Restore between previous charwise selection and linewise selection")
- (evil-test-buffer
- "alpha bravo\nch[a]rlie delta\necho foxtrot\ngolf hotel"
- ("viw" [escape] "jV")
- "alpha bravo\ncharlie delta\n<echo f[o]xtrot\n>golf hotel"
- ("gv")
- "alpha bravo\n<charli[e]> delta\necho foxtrot\ngolf hotel"
- ("gv")
- "alpha bravo\ncharlie delta\n<echo f[o]xtrot\n>golf hotel"
- ("gv")
- "alpha bravo\n<charli[e]> delta\necho foxtrot\ngolf hotel"
- ("gv")
- "alpha bravo\ncharlie delta\n<echo f[o]xtrot\n>golf hotel")))
-
-(ert-deftest evil-test-visual-redefine ()
- "Test redefining a previous selection"
- :tags '(evil visual)
- (ert-info ("Redefine characterwise selection")
- (evil-test-buffer
- ";; <[T]his> buffer is for notes."
- ([escape] "gv")
- ";; <[T]his> buffer is for notes."
- ([escape] "2lm<2wm>gv")
- ";; Th<is buffer [i]>s for notes."))
- (ert-info ("Redefine linewise selection")
- (evil-test-buffer
- :visual line
- "<[a]lpha bravo
->charlie delta
-echo foxtrot
-golf hotel"
- ([escape] "gv")
- "<[a]lpha bravo
->charlie delta
-echo foxtrot
-golf hotel"
- ([escape] "2jm>gv")
- "<alpha bravo
-charlie delta
-[e]cho foxtrot
->golf hotel"
- ([escape] "km<gv")
- "alpha bravo
-<charlie delta
-[e]cho foxtrot
->golf hotel"))
- (ert-info ("Redefine blockwise selection")
- (evil-test-buffer
- :visual block
- "<alpha bravo
-charli[e]> delta
-echo foxtrot
-golf hotel"
- ([escape] "gv")
- "<alpha bravo
-charli[e]> delta
-echo foxtrot
-golf hotel"
- ([escape] "2jm>gv")
- "<alpha bravo
-charlie delta
-echo foxtrot
-golf h[o]>tel"
- ([escape] "k0m<gv")
- "alpha bravo
-charlie delta
-<echo foxtrot
-golf h[o]>tel")))
-
-(ert-deftest evil-test-visual-separate-from-operator-marks ()
- "Test that visual selection is kept separate from the '[ and '] marks (#1744)."
- (evil-test-buffer "x\ny"
- ("ylvpjxgv")
- "[x]\n"))
-
-;;; Replace state
-
-(ert-deftest evil-test-replacement ()
- "Test replacing consecutive characters"
- :tags '(evil replace)
- (ert-info ("Replace and restore consecutive characters")
- (evil-test-buffer
- ";; [T]his buffer is for notes"
- ("Rfoo")
- ";; foo[s] buffer is for notes"
- ([backspace backspace backspace])
- ";; [T]his buffer is for notes"))
- (ert-info ("Replace and restore consecutive characters beyond eol")
- (evil-test-buffer
- ";; [T]his buffer is for notes"
- ("wwwwRxxxxxxx")
- ";; This buffer is for xxxxxxx[]"
- ([backspace backspace backspace backspace backspace backspace backspace])
- ";; This buffer is for [n]otes"))
- (ert-info ("Replace from line below and restore")
- (define-key evil-replace-state-map (kbd "C-e") #'evil-copy-from-below)
- (evil-test-buffer
- ";; [f]oo bar\n;; qux quux"
- ("R\C-e\C-e\C-e")
- ";; qux[ ]bar\n;; qux quux"
- ([backspace backspace backspace])
- ";; [f]oo bar\n;; qux quux")
- (define-key evil-replace-state-map (kbd "C-e") nil))
- (ert-info ("Replace from line above and restore")
- (define-key evil-replace-state-map (kbd "C-y") #'evil-copy-from-above)
- (evil-test-buffer
- ";; foo bar\n;; [q]ux quux"
- ("R\C-y\C-y\C-y")
- ";; foo bar\n;; foo[ ]quux"
- ([backspace backspace backspace])
- ";; foo bar\n;; [q]ux quux")
- (define-key evil-replace-state-map (kbd "C-y") nil))
- (ert-info ("Replace character twice and restore")
- (evil-test-buffer "[a]"
- ("Rb" [left] "c" [backspace])
- "b"))
- (ert-info ("Can give Replace-state a count repeat it")
- (evil-test-buffer
- "a[l]pha bravo"
- ("3Rx" [escape])
- "axx[x]a bravo"
- ("wi\C-a")
- "axxxa x[]bravo"))
- (ert-info ("Replace deletion keeps consistent . register")
- (evil-test-buffer
- "a[l]pha bravo"
- ("Rfop" [backspace] "o" [escape])
- "afo[o]a bravo"
- ("A \C-@")
- "afooa bravo fo[o]"))
- (ert-info ("Replace-state sets ^ mark")
- (evil-test-buffer
- "a[l]pha bravo"
- ("Rxx" [escape] "$")
- "axxha brav[o]"
- ("`^")
- "axx[h]a bravo")))
-
-;;; Ex
-
-(ert-deftest evil-test-ex-parse ()
- "Test `evil-ex-parse'"
- :tags '(evil ex)
- (should (equal (evil-ex-parse "5cmd arg")
- '(evil-ex-call-command (string-to-number "5") "cmd" "arg")))
- (should (equal (evil-ex-parse "5cmd !arg")
- '(evil-ex-call-command (string-to-number "5") "cmd" "!arg")))
- (should (equal (evil-ex-parse "5 arg")
- '(evil-ex-call-command (string-to-number "5") "arg" nil)))
- (should (equal (evil-ex-parse "+1,+2t-1")
- '(evil-ex-call-command
- (let ((l1 (evil-ex-line
- nil
- (+ (evil-ex-signed-number
- (intern "+")
- (string-to-number "1"))))))
- (save-excursion
- (and l1 (string= "," ";") (goto-line l1))
- (evil-ex-range
- l1 (evil-ex-line
- nil
- (+ (evil-ex-signed-number
- (intern "+")
- (string-to-number "2")))))))
- "t"
- "-1"))))
-
-(ert-deftest evil-test-ex-parse-ranges ()
- "Test parsing of ranges"
- :tags '(evil ex)
- (cl-flet
- ((mk-range
- (a b &optional relative)
- `(let ((l1 ,(when a `(evil-ex-line ,@a))))
- (save-excursion
- (and l1 (string= ,(if relative ";" ",") ";") (goto-line l1))
- (evil-ex-range l1 ,(when b `(evil-ex-line ,@b)))))))
- (should (equal (evil-ex-parse "%" nil 'range)
- '(evil-ex-full-range)))
- (should (equal (evil-ex-parse "*" nil 'range)
- '(evil-ex-last-visual-range)))
- (should (equal (evil-ex-parse "5,27" nil 'range)
- (mk-range '((string-to-number "5") nil)
- '((string-to-number "27") nil))))
- (should (equal (evil-ex-parse "5,$" nil 'range)
- (mk-range '((string-to-number "5") nil)
- '((evil-ex-last-line) nil))))
- (should (equal (evil-ex-parse "5,'x" nil 'range)
- (mk-range '((string-to-number "5") nil)
- '((evil-ex-marker "x") nil))))
- (should (equal (evil-ex-parse "`x,`y" nil 'range)
- '(evil-ex-char-marker-range "x" "y")))
- (should (equal (evil-ex-parse "`[,`]" nil 'range)
- '(evil-ex-char-marker-range "[" "]")))
- (should (equal (evil-ex-parse "5,+" nil 'range)
- (mk-range '((string-to-number "5") nil)
- '(nil (+ (evil-ex-signed-number (intern "+") nil))))))
- (should (equal (evil-ex-parse "5,-" nil 'range)
- (mk-range '((string-to-number "5") nil)
- '(nil (+ (evil-ex-signed-number (intern "-") nil))))))
- (should (equal (evil-ex-parse "5,4+2-7-3+10-" nil 'range)
- (mk-range
- '((string-to-number "5") nil)
- '((string-to-number "4")
- (+ (evil-ex-signed-number
- (intern "+") (string-to-number "2"))
- (evil-ex-signed-number
- (intern "-") (string-to-number "7"))
- (evil-ex-signed-number
- (intern "-") (string-to-number "3"))
- (evil-ex-signed-number
- (intern "+") (string-to-number "10"))
- (evil-ex-signed-number (intern "-") nil))))))
- (should (equal (evil-ex-parse ".-2,4+2-7-3+10-" nil 'range)
- (mk-range
- '((evil-ex-current-line)
- (+ (evil-ex-signed-number
- (intern "-") (string-to-number "2"))))
- '((string-to-number "4")
- (+ (evil-ex-signed-number
- (intern "+") (string-to-number "2"))
- (evil-ex-signed-number
- (intern "-") (string-to-number "7"))
- (evil-ex-signed-number
- (intern "-") (string-to-number "3"))
- (evil-ex-signed-number
- (intern "+") (string-to-number "10"))
- (evil-ex-signed-number
- (intern "-") nil))))))
- (should (equal (evil-ex-parse "'a-2,$-10" nil 'range)
- (mk-range
- '((evil-ex-marker "a")
- (+ (evil-ex-signed-number
- (intern "-") (string-to-number "2"))))
- '((evil-ex-last-line)
- (+ (evil-ex-signed-number
- (intern "-") (string-to-number "10")))))))
- (should (equal (evil-ex-parse "'[,']" nil 'range)
- (mk-range '((evil-ex-marker "[") nil)
- '((evil-ex-marker "]") nil))))
- (should (equal (evil-ex-parse "'{,'}" nil 'range)
- (mk-range '((evil-ex-marker "{") nil)
- '((evil-ex-marker "}") nil))))
- (should (equal (evil-ex-parse "'(,')" nil 'range)
- (mk-range '((evil-ex-marker "(") nil)
- '((evil-ex-marker ")") nil))))
- (should (equal (evil-ex-parse ",']" nil 'range)
- (mk-range nil '((evil-ex-marker "]") nil))))
- (should (equal (evil-ex-parse ";']" nil 'range)
- (mk-range nil '((evil-ex-marker "]") nil) t)))
- (should (equal (evil-ex-parse ".+42" nil 'range)
- '(evil-ex-range
- (evil-ex-line
- (evil-ex-current-line)
- (+ (evil-ex-signed-number
- (intern "+") (string-to-number "42")))))))))
-
-(ert-deftest evil-test-ex-parse-emacs-commands ()
- "Test parsing of Emacs commands"
- :tags '(evil ex)
- (should (equal (evil-ex-parse "ido-mode")
- '(evil-ex-call-command nil "ido-mode" nil)))
- (should (equal (evil-ex-parse "yas/reload-all")
- '(evil-ex-call-command nil "yas/reload-all" nil)))
- (should (equal (evil-ex-parse "mu4e")
- '(evil-ex-call-command nil "mu4e" nil)))
- (should (equal (evil-ex-parse "make-frame")
- '(evil-ex-call-command nil "make-frame" nil))))
-
-(ert-deftest evil-text-ex-search-offset ()
- "Test for addresses like /base//pattern/"
- :tags '(evil ex)
- (ert-info ("without base")
- (evil-test-buffer
- "[l]ine 1\naaa\nbbb\naaa\nccc\nddd"
- (":/aaa/d")
- "line 1\nbbb\naaa\nccc\nddd"))
- (ert-info ("with base")
- (evil-test-buffer
- "[l]ine 1\naaa\nbbb\naaa\nccc\nddd"
- (":/bbb//aaa/d")
- "line 1\naaa\nbbb\nccc\nddd"))
- (ert-info ("range without base")
- (evil-test-buffer
- "[l]ine 1\naaa\nbbb\naaa\nccc\nddd\nccc\neee\n"
- (":/aaa/;/ccc/d")
- "line 1\nddd\nccc\neee\n"))
- (ert-info ("range with base")
- (evil-test-buffer
- "[l]ine 1\naaa\nbbb\naaa\nccc\nddd\nccc\neee\n"
- (":/bbb//aaa/;/ddd//ccc/d")
- "line 1\naaa\nbbb\neee\n")))
-
-(ert-deftest evil-test-ex-goto-line ()
- "Test if :number moves point to a certain line"
- :tags '(evil ex)
- (ert-info ("Move to line")
- (let ((evil-start-of-line t))
- (evil-test-buffer
- :visual line
- "1\n 2\n [ ]3\n 4\n 5\n"
- (":4" [return])
- "1\n 2\n 3\n [4]\n 5\n"
- (":2" [return])
- "1\n [2]\n 3\n 4\n 5\n"))))
-
-(ert-deftest evil-test-ex-repeat ()
- "Test :@: command."
- :tags '(evil ex)
- (evil-without-display
- (ert-info ("Repeat in current line")
- (evil-test-buffer
- "[a]bcdef\nabcdef\nabcdef"
- (":s/[be]/X/g" [return])
- "[a]XcdXf\nabcdef\nabcdef"
- ("jj:@:" [return])
- "aXcdXf\nabcdef\n[a]XcdXf"))
- (ert-info ("Repeat in specified line")
- (evil-test-buffer
- "[a]bcdef\nabcdef\nabcdef"
- (":s/[be]/X/g" [return])
- "[a]XcdXf\nabcdef\nabcdef"
- (":3@:" [return])
- "aXcdXf\nabcdef\n[a]XcdXf"))
- (ert-info ("Double repeat, first without then with specified line")
- (evil-test-buffer
- "[a]bcdef\nabcdef\nabcdef"
- (":s/[be]/X/" [return])
- "[a]Xcdef\nabcdef\nabcdef"
- ("jj:@:" [return] ":1@:" [return])
- "[a]XcdXf\nabcdef\naXcdef"))))
-
-(ert-deftest evil-test-ex-repeat2 ()
- "Test @: command."
- :tags '(evil ex)
- (evil-without-display
- (ert-info ("Repeat in current line")
- (evil-test-buffer
- "[a]bcdef\nabcdef\nabcdef"
- (":s/[be]/X" [return])
- "[a]Xcdef\nabcdef\nabcdef"
- ("jj@:")
- "aXcdef\nabcdef\n[a]Xcdef"))
- (ert-info ("Repeat with count in current line")
- (evil-test-buffer
- "[a]bcdef\nabcdef\nabcdef"
- (":s/[be]/X" [return])
- "[a]Xcdef\nabcdef\nabcdef"
- ("jj2@:")
- "aXcdef\nabcdef\n[a]XcdXf"))
- (ert-info ("Do not record dot repeat")
- (evil-test-buffer
- ""
- ("OAAAAAA" [escape] "^")
- "[A]AAAAA\n"
- (":s/A/X" [return])
- "[X]AAAAA\n"
- ("@:")
- "[X]XAAAA\n"
- (".")
- "AAAAAA\nXXAAAA\n"))))
-
-(ert-deftest evil-test-ex-visual-char-range ()
- "Test visual character ranges in ex state."
- :tags '(evil ex visual)
- (evil-without-display
- (ert-info ("No character range, inclusive")
- (let ((evil-visual-char 'inclusive)
- evil-ex-visual-char-range)
- (evil-test-buffer
- "li[n]e 1\nline 2\nline 3\nline 4\n"
- ("vjll:d" [return])
- "line 3\nline 4\n")))
- (ert-info ("No character range, exclusive")
- (let ((evil-visual-char 'inclusive)
- evil-ex-visual-char-range)
- (evil-test-buffer
- "li[n]e 1\nline 2\nline 3\nline 4\n"
- ("vjll:d" [return])
- "line 3\nline 4\n")))
- (ert-info ("Character range, inclusive")
- (let ((evil-visual-char 'inclusive)
- (evil-ex-visual-char-range t))
- (evil-test-buffer
- "li[n]e 1\nline 2\nline 3\nline 4\n"
- ("vjll:d" [return])
- "li2\nline 3\nline 4\n")))
- (ert-info ("Character range, exclusive")
- (let ((evil-visual-char 'exclusive)
- (evil-ex-visual-char-range t))
- (evil-test-buffer
- "li[n]e 1\nline 2\nline 3\nline 4\n"
- ("vjll:d" [return])
- "li 2\nline 3\nline 4\n")))))
-
-(ert-deftest evil-test-ex-substitute-replacement ()
- "Test `evil-ex-substitute' with special replacements."
- :tags '(evil ex search)
- (ert-info ("Substitute upper first on first match in line")
- (evil-test-buffer
- "[x]xx foo bar foo bar foo bar"
- (":s/\\(foo\\|bar\\)/\\u\\1" [return])
- "[x]xx Foo bar foo bar foo bar"))
- (ert-info ("Substitute upper first on first match in line with confirm")
- (evil-test-buffer
- "[x]xx foo bar foo bar foo bar"
- (":s/\\(foo\\|bar\\)/\\u\\1/c" [return] "y")
- "[x]xx Foo bar foo bar foo bar"))
- (ert-info ("Substitute upper first on whole line")
- (evil-test-buffer
- "[x]xx foo bar foo bar foo bar"
- (":s/\\(foo\\|bar\\)/\\u\\1/g" [return])
- "[x]xx Foo Bar Foo Bar Foo Bar"))
- (ert-info ("Substitute upper first on whole line")
- (evil-test-buffer
- "[x]xx foo bar foo bar foo bar"
- (":s/\\(foo\\|bar\\)/\\u\\1/gc" [return] "yynyyn")
- "[x]xx Foo Bar foo Bar Foo bar"))
- (ert-info ("Substitute upper/lower on first match in line")
- (evil-test-buffer
- "[x]xx foo BAR foo BAR foo BAR"
- (":s/\\(f[[:alpha:]]*\\>\\)\\s-*\\(b[[:alpha:]]*\\>\\)/\\L\\2_\\e\\U\\1" [return])
- "[x]xx bar_FOO foo BAR foo BAR"))
- (ert-info ("Substitute upper/lower on first match in line with confirm")
- (evil-test-buffer
- "[x]xx foo BAR foo BAR foo BAR"
- (":s/\\(f[[:alpha:]]*\\>\\)\\s-*\\(b[[:alpha:]]*\\>\\)/\\L\\2_\\e\\U\\1/c" [return] "y")
- "[x]xx bar_FOO foo BAR foo BAR"))
- (ert-info ("Substitute upper/lower on whole line")
- (evil-test-buffer
- "[x]xx foo BAR foo BAR foo BAR"
- (":s/\\(f[[:alpha:]]*\\>\\)\\s-*\\(b[[:alpha:]]*\\>\\)/\\L\\2_\\e\\U\\1/g" [return])
- "[x]xx bar_FOO bar_FOO bar_FOO"))
- (ert-info ("Substitute upper/lower on whole line")
- (evil-test-buffer
- "[x]xx foo BAR foo BAR foo BAR"
- (":s/\\(f[[:alpha:]]*\\>\\)\\s-*\\(b[[:alpha:]]*\\>\\)/\\L\\2_\\e\\U\\1/gc" [return] "yny")
- "[x]xx bar_FOO foo BAR bar_FOO"))
- (ert-info ("Substitute with escaped characters in replacement")
- (evil-test-buffer
- "[a]bcXdefXghiXjkl\n"
- (":s/X/\\|\\/\\|/g" [return])
- "[a]bc|/|def|/|ghi|/|jkl\n"))
- (ert-info ("Substitute with register")
- (evil-test-buffer
- "[a]bc\niiiXiiiXiiiXiii\n"
- ("\"ayiwj:s/X/\\=@a/g" [return])
- "abc\n[i]iiabciiiabciiiabciii\n"))
- (ert-info ("Substitute newlines")
- (evil-test-buffer
- "[a]bc\ndef\nghi\n"
- (":%s/\n/z/" [return])
- "[a]bczdefzghiz"))
- (ert-info ("Substitute newlines with g flag")
- (evil-test-buffer
- "[a]bc\ndef\nghi\n"
- (":%s/\n/z/g" [return])
- "[a]bczdefzghiz"))
- (ert-info ("Substitute newlines without newline in regexp")
- (evil-test-buffer
- "[A]BC\nDEF\nGHI\n"
- (":%s/[^]]*/z/" [return])
- "Z"))
- (ert-info ("Substitute n flag does not replace")
- (evil-test-buffer
- "[a]bc\naef\nahi\n"
- (":%s/a//n" [return])
- "[a]bc\naef\nahi\n"))
- (ert-info ("Substitute n flag does not replace with g flag")
- (evil-test-buffer
- "[a]bc\naef\nahi\n"
- (":%s/a//gn" [return])
- "[a]bc\naef\nahi\n"))
- (ert-info ("Substitute $ does not loop infinitely")
- (evil-test-buffer
- "[a]bc\ndef\nghi"
- (":%s/$/ END/g" [return])
- "abc END\ndef END\n[g]hi END"))
- (ert-info ("Substitute the zero-length beginning of line character")
- (evil-test-buffer
- "[a]bc\ndef\nghi"
- (":s/^/ #/" [return])
- " [#]abc\ndef\nghi"))
- (ert-info ("Substitute the zero-length beginning of line character with g flag")
- (evil-test-buffer
- "[a]bc\ndef\nghi"
- (":s/^/ #/g" [return])
- " [#]abc\ndef\nghi"))
- (ert-info ("Use Substitute to delete individual characters")
- (evil-test-buffer
- "[x]xyxxz"
- (":%s/x//g" [return])
- "[y]z"))
- (ert-info ("Substitute doesn't match final empty line")
- (evil-test-buffer
- "abc\n[d]ef\n\nghi"
- (":s/$/4" [return])
- "abc\n[d]ef4\n\nghi")
- (evil-test-buffer
- "abc\n[d]ef\n\nghi"
- (":s/f\\w*/4" [return])
- "abc\n[d]e4\n\nghi"))
- (ert-info ("Substitute doesn't move point if 0 matches")
- (evil-test-buffer
- "abc\nd[e]f\nghi"
- (":%s/nothere/foo" [return])
- "abc\nd[e]f\nghi"))
- (ert-info ("Substitute up to EOB works")
- (evil-test-buffer "[f]oo"
- (":s/foo")
- ""))
- (ert-info ("Substitute with multi-line replacement")
- (evil-test-buffer "x"
- (":s/./foo\\nbar")
- "foo\n[b]ar"))
- (ert-info ("Use replace count in substitution")
- (evil-test-buffer "xx"
- (":s/./\\#/g")
- "01"))
- (ert-info ("Substitute with `calc' Lisp expression")
- (evil-test-buffer "1 + 2"
- (":s/.*/\\,(calc-eval \\0)")
- "3")))
-
-(ert-deftest evil-test-ex-repeat-substitute-replacement ()
- "Test `evil-ex-substitute' with repeating of previous substitutions."
- :tags '(evil ex search)
- (ert-info ("Repeat previous pattern")
- (evil-select-search-module 'evil-search-module 'evil-search)
- (evil-test-buffer
- "[x]xx foo bar foo bar foo bar"
- (":s/foo/AAA" [return])
- "[x]xx AAA bar foo bar foo bar"
- (":s//BBB" [return])
- "[x]xx AAA bar BBB bar foo bar"
- ("/bar" [return] ":s//CCC" [return])
- "[x]xx AAA CCC BBB bar foo bar"
- (":s/ar/XX" [return])
- "[x]xx AAA CCC BBB bXX foo bar"
- (":s//YY" [return])
- "[x]xx AAA CCC BBB bXX foo bYY"))
- (ert-info ("Repeat previous replacement")
- (evil-test-buffer
- "[x]xx foo bar foo bar foo bar"
- (":s/foo/AAA" [return])
- "[x]xx AAA bar foo bar foo bar"
- (":s/bar/~" [return])
- "[x]xx AAA AAA foo bar foo bar"))
- (ert-info ("Repeat with previous flags")
- (evil-test-buffer
- "[x]xx foo bar foo bar foo bar"
- (":s/foo/AAA/g" [return])
- "[x]xx AAA bar AAA bar AAA bar"
- (":s/bar/BBB/&" [return])
- "[x]xx AAA BBB AAA BBB AAA BBB"))
- (ert-info ("Repeat previous substitute without flags")
- (evil-select-search-module 'evil-search-module 'evil-search)
- (evil-test-buffer
- "[x]xx foo bar foo bar foo bar\nxxx foo bar foo bar foo bar"
- (":s/foo/AAA/g" [return])
- "[x]xx AAA bar AAA bar AAA bar\nxxx foo bar foo bar foo bar"
- ("j:s" [return])
- "xxx AAA bar AAA bar AAA bar\n[x]xx AAA bar foo bar foo bar"
- ("/bar" [return] ":s" [return])
- "xxx AAA bar AAA bar AAA bar\n[x]xx AAA bar AAA bar foo bar")
- (evil-test-buffer
- "[x]xx foo bar foo bar foo bar\nxxx foo bar foo bar foo bar"
- (":s/foo/AAA/g" [return])
- "[x]xx AAA bar AAA bar AAA bar\nxxx foo bar foo bar foo bar"
- ("j&")
- "xxx AAA bar AAA bar AAA bar\n[x]xx AAA bar foo bar foo bar")
- (evil-test-buffer
- "[x]xx foo bar foo bar foo bar\nxxx foo bar foo bar foo bar"
- (":s/foo/AAA/g" [return])
- "[x]xx AAA bar AAA bar AAA bar\nxxx foo bar foo bar foo bar"
- ("j:&" [return])
- "xxx AAA bar AAA bar AAA bar\n[x]xx AAA bar foo bar foo bar"))
- (ert-info ("Repeat previous substitute with the same flags")
- (evil-test-buffer
- "[x]xx foo bar foo bar foo bar\nxxx foo bar foo bar foo bar"
- (":s/foo/AAA/g" [return])
- "[x]xx AAA bar AAA bar AAA bar\nxxx foo bar foo bar foo bar"
- ("j:s//~/&" [return])
- "xxx AAA bar AAA bar AAA bar\n[x]xx AAA bar AAA bar AAA bar")
- (evil-test-buffer
- "[x]xx foo bar foo bar foo bar\nxxx foo bar foo bar foo bar"
- (":s/foo/AAA/g" [return])
- "[x]xx AAA bar AAA bar AAA bar\nxxx foo bar foo bar foo bar"
- ("j:&&" [return])
- "xxx AAA bar AAA bar AAA bar\n[x]xx AAA bar AAA bar AAA bar"))
- (ert-info ("Repeat previous substitute with new flags")
- (evil-test-buffer
- "[x]xx foo bar foo bar foo bar\nxxx foo bar foo bar foo bar"
- (":s/foo/AAA" [return])
- "[x]xx AAA bar foo bar foo bar\nxxx foo bar foo bar foo bar"
- ("j:s g" [return])
- "xxx AAA bar foo bar foo bar\n[x]xx AAA bar AAA bar AAA bar")
- (evil-test-buffer
- "[x]xx foo bar foo bar foo bar\nxxx foo bar foo bar foo bar"
- (":s/foo/AAA" [return])
- "[x]xx AAA bar foo bar foo bar\nxxx foo bar foo bar foo bar"
- ("j:& g" [return])
- "xxx AAA bar foo bar foo bar\n[x]xx AAA bar AAA bar AAA bar"))
- (ert-info ("Repeat with previous search pattern")
- (evil-select-search-module 'evil-search-module 'evil-search)
- (evil-test-buffer
- "[x]xx foo bar foo bar foo bar\nxxx foo bar foo bar foo bar"
- (":s/foo/AAA" [return])
- "[x]xx AAA bar foo bar foo bar\nxxx foo bar foo bar foo bar"
- ("/bar" [return])
- "xxx AAA [b]ar foo bar foo bar\nxxx foo bar foo bar foo bar"
- (":2s rg" [return])
- "xxx AAA bar foo bar foo bar\n[x]xx foo AAA foo AAA foo AAA")
- (evil-test-buffer
- "[x]xx foo bar foo bar foo bar\nxxx foo bar foo bar foo bar"
- (":s/foo/AAA" [return])
- "[x]xx AAA bar foo bar foo bar\nxxx foo bar foo bar foo bar"
- ("/bar" [return])
- "xxx AAA [b]ar foo bar foo bar\nxxx foo bar foo bar foo bar"
- (":2~ g" [return])
- "xxx AAA bar foo bar foo bar\n[x]xx foo AAA foo AAA foo AAA"))
- (ert-info ("Repeat previous substitute globally")
- (evil-test-buffer
- "[x]xx foo bar foo bar foo bar\nxxx foo bar foo bar foo bar"
- (":s/foo/AAA/g" [return])
- "[x]xx AAA bar AAA bar AAA bar\nxxx foo bar foo bar foo bar"
- ("g&")
- "xxx AAA bar AAA bar AAA bar\n[x]xx AAA bar AAA bar AAA bar"))
- (ert-info ("Substitute with last search, maintaining case sensitivty")
- (evil-select-search-module 'evil-search-module 'evil-search)
- (evil-test-buffer
- "[a]lpha\nbravo\nbravo\ncharlie\nBravo\ndelta"
- ("/\\Cbravo" [return])
- "alpha\n[b]ravo\nbravo\ncharlie\nBravo\ndelta"
- (":%s//zulu" [return])
- "alpha\nzulu\n[z]ulu\ncharlie\nBravo\ndelta"))
- (ert-info ("Repeat magic multiple times")
- (let ((evil-magic 'very-magic)
- (evil-ex-search-vim-style-regexp t))
- (evil-test-buffer
- "[b]ravo, alpha\ndelta, charlie\nfoxtrot, echo\nhotel, golf"
- (":s/(.*), (.*)/\\2 \\1" [return])
- "alpha bravo\ndelta, charlie\nfoxtrot, echo\nhotel, golf"
- ("j&")
- "alpha bravo\ncharlie delta\nfoxtrot, echo\nhotel, golf"
- ("j&")
- "alpha bravo\ncharlie delta\necho foxtrot\nhotel, golf"
- ("j&")
- "alpha bravo\ncharlie delta\necho foxtrot\ngolf hotel"))))
-
-(ert-deftest evil-test-ex-regex-without-case ()
- "Test `evil-ex-regex-without-case'"
- :tags '(evil ex search)
- (should (equal (evil-ex-regex-without-case "cdeCDE")
- "cdeCDE"))
- (should (equal (evil-ex-regex-without-case "\\ccde\\CCDE")
- "cdeCDE"))
- (should (equal (evil-ex-regex-without-case "\\\\ccde\\\\CCDE")
- "\\\\ccde\\\\CCDE"))
- (should (equal (evil-ex-regex-without-case "\\\\\\ccde\\\\\\CCDE")
- "\\\\cde\\\\CDE")))
-
-(ert-deftest evil-test-ex-regex-case ()
- "Test `evil-ex-regex-case'"
- :tags '(evil ex search)
- (should (equal (evil-ex-regex-case "cde" 'smart) 'insensitive))
- (should (equal (evil-ex-regex-case "cDe" 'smart) 'sensitive))
- (should (equal (evil-ex-regex-case "cde" 'sensitive) 'sensitive))
- (should (equal (evil-ex-regex-case "cde" 'insensitive) 'insensitive))
- (should (equal (evil-ex-regex-case "\\ccde" 'smart) 'insensitive))
- (should (equal (evil-ex-regex-case "\\cCde" 'smart) 'insensitive))
- (should (equal (evil-ex-regex-case "\\Ccde" 'smart) 'sensitive))
- (should (equal (evil-ex-regex-case "\\CCde" 'smart) 'sensitive))
- (should (equal (evil-ex-regex-case "\\ccd\\Ce" 'smart) 'insensitive))
- (should (equal (evil-ex-regex-case "\\cCd\\Ce" 'smart) 'insensitive))
- (should (equal (evil-ex-regex-case "\\Ccd\\ce" 'smart) 'sensitive))
- (should (equal (evil-ex-regex-case "\\CCd\\ce" 'smart) 'sensitive)))
-
-(ert-deftest evil-test-ex-search ()
- "Test evil internal search."
- :tags '(evil ex search)
- (evil-without-display
- (evil-select-search-module 'evil-search-module 'evil-search)
- (ert-info ("Test smart case insensitive")
- (evil-test-buffer
- "[s]tart you YOU You you YOU You"
- ("/you" [return])
- "start [y]ou YOU You you YOU You"
- ("n")
- "start you [Y]OU You you YOU You"
- ("n")
- "start you YOU [Y]ou you YOU You"
- ("n")
- "start you YOU You [y]ou YOU You"))
- (ert-info ("Test smart case sensitive")
- (evil-test-buffer
- "[s]tart you YOU You you YOU You"
- ("/You" [return])
- "start you YOU [Y]ou you YOU You"
- ("n")
- "start you YOU You you YOU [Y]ou"))
- (ert-info ("Test insensitive")
- (evil-test-buffer
- "[s]tart you YOU You you YOU You"
- ("/\\cyou" [return])
- "start [y]ou YOU You you YOU You"
- ("n")
- "start you [Y]OU You you YOU You"
- ("n")
- "start you YOU [Y]ou you YOU You"
- ("n")
- "start you YOU You [y]ou YOU You"))
- (ert-info ("Test sensitive")
- (evil-test-buffer
- "[s]tart you YOU You you YOU You"
- ("/\\Cyou" [return])
- "start [y]ou YOU You you YOU You"
- ("n")
- "start you YOU You [y]ou YOU You"))
- (ert-info ("Test failing search does not move point")
- (evil-test-buffer
- "foo [f]oo foo\nbar bar2 bar\nbaz baz baz\n"
- (error search-failed "/foofoo" [return])
- "foo [f]oo foo\nbar bar2 bar\nbaz baz baz\n"
- ("/bar2" [return])
- "foo foo foo\nbar [b]ar2 bar\nbaz baz baz\n"
- ("dw")
- "foo foo foo\nbar [b]ar\nbaz baz baz\n"
- (error search-failed "n")
- "foo foo foo\nbar [b]ar\nbaz baz baz\n"
- (error search-failed "N")
- "foo foo foo\nbar [b]ar\nbaz baz baz\n"))
- (ert-info ("Test search for newline")
- (evil-test-buffer
- "[s]tart\nline 2\nline 3\n\n"
- ("/\\n" [return])
- "star[t]\nline 2\nline 3\n\n"
- ("n")
- "start\nline [2]\nline 3\n\n"
- ("n")
- "start\nline 2\nline [3]\n\n"
- ("n")
- "start\nline 2\nline 3\n[]\n"))
- (ert-info ("Can search for start/end of symbol")
- (let ((evil-magic 'very-magic))
- (evil-test-buffer
- "[a]lpha bravo bra charlie"
- ("/bra\\_>" [return])
- "alpha bravo [b]ra charlie")))
- (ert-info ("Can search for literal < and >")
- (let ((evil-magic 'very-magic))
- (evil-test-buffer
- :visual-start "«"
- :visual-end "»"
- "[a]lpha bravo <bravo> charlie"
- ("/<bravo>" [return])
- "alpha bravo [<]bravo> charlie")))
- (ert-info ("Can paste from register in ex-search")
- (evil-test-buffer
- "Alpha [b]ravo charlie alpha bravo delta bravo delta"
- ("\"bye" "w")
- "Alpha bravo [c]harlie alpha bravo delta bravo delta"
- ("/\C-rb" [return])
- "Alpha bravo charlie alpha [b]ravo delta bravo delta"
- ("w/\C-r\C-o" [return])
- "Alpha bravo charlie alpha bravo delta bravo [d]elta"))
- (ert-info ("Can use C-w yank-word functionality")
- (let ((old-val evil-want-C-w-delete))
- (custom-set-variables '(evil-want-C-w-delete nil))
- (evil-test-buffer
- "alpha [b]ravo charlie delta bravo echo"
- ("/\C-w" [return])
- "alpha bravo charlie delta [b]ravo echo")
- (custom-set-variables `(evil-want-C-w-delete ,old-val))))
- (ert-info ("Can use backreferences with vim-style regexp")
- (let ((evil-ex-search-vim-style-regexp t))
- (evil-test-buffer
- "[a]bacababcacabccadefghij"
- ;; Very magic
- ("/\\v(.)(.)(.)\\3\\1/e" [return])
- "abacababcacabcc[a]defghij")
- (evil-test-buffer
- "[a]bacababcacabccadefghij"
- ;; Default magic
- ("/\\(.\\)\\(.\\)\\(.\\)\\3\\1/e" [return])
- "abacababcacabcc[a]defghij")
- (evil-test-buffer
- "[a]bacababcac1abcca1defghij"
- ;; With literal numbers
- ("/\\(.\\)\\(.\\)\\(.\\)\\3\\11/e" [return])
- "abacababcac1abcca[1]defghij")))))
-
-(ert-deftest evil-test-ex-search-offset ()
- "Test search offsets."
- :tags '(evil ex search)
- (evil-without-display
- (evil-select-search-module 'evil-search-module 'evil-search)
- (ert-info ("Test line offsets")
- (evil-test-buffer
- "[f]oo foo\nbar bar\nbaz baz\nAnother line\nAnd yet another line"
- ("/bar/2")
- "foo foo\nbar bar\nbaz baz\n[A]nother line\nAnd yet another line"
- ("?bar?-")
- "[f]oo foo\nbar bar\nbaz baz\nAnother line\nAnd yet another line"
- ("/r bar/")
- "foo foo\nba[r] bar\nbaz baz\nAnother line\nAnd yet another line"))
- (ert-info ("Test end offsets")
- (evil-test-buffer
- "[f]oo foo\nbar bar\nbaz baz\nAnother line\nAnd yet another line"
- ("/bar/e")
- "foo foo\nba[r] bar\nbaz baz\nAnother line\nAnd yet another line"
- ("/baz/e+2")
- "foo foo\nbar bar\nbaz [b]az\nAnother line\nAnd yet another line"
- ("/line/e-1")
- "foo foo\nbar bar\nbaz baz\nAnother li[n]e\nAnd yet another line"))
- (ert-info ("Test begin offsets")
- (evil-test-buffer
- "[f]oo foo\nbar bar\nbaz baz\nAnother line\nAnd yet another line"
- ("/bar/b")
- "foo foo\n[b]ar bar\nbaz baz\nAnother line\nAnd yet another line"
- ("/baz/b+2")
- "foo foo\nbar bar\nba[z] baz\nAnother line\nAnd yet another line"
- ("/line/b-")
- "foo foo\nbar bar\nbaz baz\nAnother[ ]line\nAnd yet another line"))
- (ert-info ("Test search-next with offset")
- (evil-test-buffer
- "[f]oo foo\nbar bar\nbaz baz\nAnother line\nAnd yet another line"
- ("/ ba/+1" [return])
- "foo foo\nbar bar\n[b]az baz\nAnother line\nAnd yet another line"
- ("n")
- "foo foo\nbar bar\nbaz baz\n[A]nother line\nAnd yet another line"))
- (ert-info ("Test search next after /$")
- (evil-test-buffer
- "[l]ine 1\nline 2\n\n\line 4\n"
- ("/$" [return])
- "line [1]\nline 2\n\n\line 4\n"
- ("n")
- "line 1\nline [2]\n\n\line 4\n"
- ("n")
- "line 1\nline 2\n[\n]\line 4\n"
- ("n")
- "line 1\nline 2\n\n\line [4]\n"))))
-
-(ert-deftest evil-test-ex-search-pattern-offset ()
- "Test pattern offsets."
- :tags '(evil ex search)
- (evil-without-display
- (evil-select-search-module 'evil-search-module 'evil-search)
- (ert-info ("Test simple pattern offsets")
- (evil-test-buffer
- "[f]oo foo\nbar bar\nfoo foo\nbaz baz\nAnother line\nAnd yet another line"
- ("/bar/;/foo" [return])
- "foo foo\nbar bar\n[f]oo foo\nbaz baz\nAnother line\nAnd yet another line"))
- (ert-info ("Test simple pattern offsets in backward direction")
- (evil-test-buffer
- "[f]oo foo\nbar bar\nfoo foo\nbaz baz\nAnother line\nAnd yet another line"
- ("/bar/;?foo" [return])
- "foo [f]oo\nbar bar\nfoo foo\nbaz baz\nAnother line\nAnd yet another line"))
- (ert-info ("Ensure second pattern is used for search repeat")
- (evil-test-buffer
- "[f]oo foo\nbar bar\nfoo foo\nbaz baz\nAnother line\nAnd yet another line"
- ("/bar/;?foo" [return] "n")
- "foo foo\nbar bar\n[f]oo foo\nbaz baz\nAnother line\nAnd yet another line"))))
-
-(ert-deftest evil-test-ex-search-repeat ()
- "Test repeat of search."
- :tags '(evil ex search)
- (evil-without-display
- (evil-select-search-module 'evil-search-module 'evil-search)
- (ert-info ("Test repeat of simple pattern")
- (evil-test-buffer
- "[f]oo foo\nbar bar\nbaz baz\nAnother line\nAnd yet another line"
- ("/bar" [return] "/" [return])
- "foo foo\nbar [b]ar\nbaz baz\nAnother line\nAnd yet another line"))
- (ert-info ("Test repeat of simple pattern with new offset")
- (evil-test-buffer
- "[f]oo foo\nbar bar\nbaz baz\nAnother line\nAnd yet another line"
- ("/bar" [return] "//e" [return])
- "foo foo\nbar ba[r]\nbaz baz\nAnother line\nAnd yet another line"))
- (ert-info ("Test repeat of pattern with offset")
- (evil-test-buffer
- "[f]oo foo\nbar bar\nbaz baz\nAnother line\nAnd yet another line"
- ("/bar/e" [return] "/" [return])
- "foo foo\nbar ba[r]\nbaz baz\nAnother line\nAnd yet another line"))
- (ert-info ("Test repeat of pattern with offset without offset")
- (evil-test-buffer
- "[f]oo foo\nbar bar\nbaz baz\nAnother line\nAnd yet another line"
- ("/bar/e" [return] "//" [return])
- "foo foo\nbar [b]ar\nbaz baz\nAnother line\nAnd yet another line"))
- (ert-info ("Test repeat of pattern with offset with new offset")
- (evil-test-buffer
- "[f]oo foo\nbar bar\nbaz baz\nAnother line\nAnd yet another line"
- ("/bar/e" [return] "//b+1" [return])
- "foo foo\nbar b[a]r\nbaz baz\nAnother line\nAnd yet another line"))
- (ert-info ("Test repeat of pattern in the same search")
- (evil-test-buffer
- "[a]lpha bravo charlie delta charlie alpha bravo alpha"
- ("/charlie/;/")
- "alpha bravo charlie delta [c]harlie alpha bravo alpha"
- ("/alpha/;//")
- "alpha bravo charlie delta charlie alpha bravo [a]lpha"
- ("?charlie?;?")
- "alpha bravo [c]harlie delta charlie alpha bravo alpha")
- (ert-info ("including when switching direction")
- (evil-test-buffer
- "[a]lpha bravo charlie delta charlie alpha bravo alpha"
- ("/bravo/;?")
- "alpha bravo charlie delta charlie alpha [b]ravo alpha"
- ("?alpha?;//")
- "alpha bravo charlie delta charlie alpha bravo [a]lpha")))))
-
-(ert-deftest evil-test-ex-search-word ()
- "Test search for word under point."
- :tags '(evil ex search)
- (evil-without-display
- (evil-select-search-module 'evil-search-module 'evil-search)
- (setq evil-ex-search-history nil)
- (evil-test-buffer
- "so[m]e text with a strange word
-and here some other stuff
-maybe we need one line more with some text\n"
- (setq evil-symbol-word-search nil)
- ("*")
- "some text with a strange word
-and here [s]ome other stuff
-maybe we need one line more with some text\n"
- ("n")
- "some text with a strange word
-and here some other stuff
-maybe we need one line more with [s]ome text\n"
- (ert-info ("Search history")
- (should (equal evil-ex-search-history '("\\<some\\>"))))
- ("*")
- "[s]ome text with a strange word
-and here some other stuff
-maybe we need one line more with some text\n"
- (ert-info ("Search history with double pattern")
- (should (equal evil-ex-search-history '("\\<some\\>")))))
- (ert-info ("Test unbounded search")
- (evil-select-search-module 'evil-search-module 'evil-search)
- (setq evil-ex-search-history nil)
- (evil-test-buffer
- "[s]ymbol\n(defun my-symbolfunc ())\n(defvar my-symbolvar)\nanother symbol\n"
- ("*")
- (setq evil-symbol-word-search nil)
- "symbol\n(defun my-symbolfunc ())\n(defvar my-symbolvar)\nanother [s]ymbol\n"
- ("ggg*")
- "symbol\n(defun my-[s]ymbolfunc ())\n(defvar my-symbolvar)\nanother symbol\n"
- (should (equal evil-ex-search-history '("symbol" "\\<symbol\\>")))
- ("n")
- "symbol\n(defun my-symbolfunc ())\n(defvar my-[s]ymbolvar)\nanother symbol\n"))
- (ert-info ("Test symbol search")
- (evil-select-search-module 'evil-search-module 'evil-search)
- (evil-test-buffer
- "(defun my-s[y]mbol-func ())\n(defvar my-symbol-var)\n(my-symbol-func)\n(setq my-symbol-func2 (my-symbol-func))\n"
- (setq evil-symbol-word-search t)
- ("*")
- "(defun my-symbol-func ())\n(defvar my-symbol-var)\n([m]y-symbol-func)\n(setq my-symbol-func2 (my-symbol-func))\n"
- ("n")
- "(defun my-symbol-func ())\n(defvar my-symbol-var)\n(my-symbol-func)\n(setq my-symbol-func2 ([m]y-symbol-func))\n"))
- (ert-info ("Test with non-nil `evil-ex-search-vim-style-regexp'")
- (evil-select-search-module 'evil-search-module 'evil-search)
- (let ((evil-ex-search-vim-style-regexp t)
- (evil-magic 'very-magic))
- (evil-test-buffer
- "[a]lpha bravo alpha charlie alpha"
- ("*")
- "alpha bravo [a]lpha charlie alpha"
- ("/" [return])
- "alpha bravo alpha charlie [a]lpha")))))
-
-(ert-deftest evil-test-ex-search-motion ()
- "Test that Ex forward search, as a motion, can be repeated."
- :tags '(evil ex search)
- (evil-without-display
- (evil-select-search-module 'evil-search-module 'evil-search)
- (evil-test-buffer "alpha [b]ravo charlie delta golf hotel charlie india"
- ("c/charlie" [return] "replacement " [escape] "4w.")
- "alpha replacement charlie delta golf replacement[ ]charlie india")))
-
-(ert-deftest evil-test-ex-search-next+previous-match ()
- :tags '(evil ex search)
- (evil-without-display
- (evil-select-search-module 'evil-search-module 'evil-search)
- (ert-info ("evil-next-match in normal state")
- (evil-test-buffer
- "[b]ravo charlie delta charlie alpha charlie bravo"
- ("/charlie" [return] "e")
- "bravo charli[e] delta charlie alpha charlie bravo"
- ("gn")
- "bravo <charli[e]> delta charlie alpha charlie bravo"
- ([escape] "b")
- "bravo [c]harlie delta charlie alpha charlie bravo"
- ("gn")
- "bravo <charli[e]> delta charlie alpha charlie bravo"
- ([escape] "w")
- "bravo charlie [d]elta charlie alpha charlie bravo"
- ("gn")
- "bravo charlie delta <charli[e]> alpha charlie bravo"
- ([escape] "^")
- "[b]ravo charlie delta charlie alpha charlie bravo"
- ("3gn")
- "bravo charlie delta charlie alpha <charli[e]> bravo"))
- (ert-info ("evil-previous-match in normal state")
- (evil-test-buffer
- "[b]ravo charlie delta charlie alpha charlie bravo"
- ("/charlie" [return] "e")
- "bravo charli[e] delta charlie alpha charlie bravo"
- ("$gN")
- "bravo charlie delta charlie alpha <[c]harlie> bravo"
- ([escape] "gN")
- "bravo charlie delta charlie alpha <[c]harlie> bravo"
- ([escape] "e" "2gN")
- "bravo charlie delta <[c]harlie> alpha charlie bravo"))
- (ert-info ("evil-next-match in visual state")
- (evil-test-buffer
- "[b]ravo charlie delta charlie alpha charlie bravo"
- ("/charlie" [return] "e")
- "bravo charli[e] delta charlie alpha charlie bravo"
- ("gn")
- "bravo <charli[e]> delta charlie alpha charlie bravo"
- ("gn")
- "bravo <charlie delta charli[e]> alpha charlie bravo"
- ("o")
- "bravo <[c]harlie delta charlie> alpha charlie bravo"
- ("gn")
- "bravo charli<[e] delta charlie> alpha charlie bravo"
- ([escape] "^v2gn")
- "<bravo charlie delta charli[e]> alpha charlie bravo"))
- (ert-info ("evil-previous-match in visual state")
- (evil-test-buffer
- "bravo charlie delta charlie alpha charlie brav[o]"
- ("?charlie" [return])
- "bravo charlie delta charlie alpha [c]harlie bravo"
- ("gN")
- "bravo charlie delta charlie alpha <[c]harlie> bravo"
- ("gN")
- "bravo charlie delta <[c]harlie alpha charlie> bravo"
- ("o")
- "bravo charlie delta <charlie alpha charli[e]> bravo"
- ("gN")
- "bravo charlie delta <charlie alpha [c]>harlie bravo"
- ([escape] "$v2gN")
- "bravo charlie delta <[c]harlie alpha charlie bravo>"))
- (ert-info ("evil-match in operator state")
- (evil-test-buffer
- "[b]ravo charlie delta charlie alpha charlie bravo"
- ("/charlie" [return])
- "bravo [c]harlie delta charlie alpha charlie bravo"
- ("cgn" "foo" [escape])
- "bravo fo[o] delta charlie alpha charlie bravo"
- (".")
- "bravo foo delta fo[o] alpha charlie bravo"
- ("$cgN" "bar" [escape])
- "bravo foo delta foo alpha ba[r] bravo"))
- (ert-info ("Unfound evil ex next match doesn't move cursor")
- (evil-test-buffer
- "[a]lpha bravo"
- (should-error (execute-kbd-macro "/zulu"))
- "[a]lpha bravo"
- (should-error (execute-kbd-macro "gn"))
- "[a]lpha bravo"))))
-
-(ert-deftest evil-test-isearch-word ()
- "Test isearch for word under point."
- :tags '(evil isearch)
- (evil-without-display
- (evil-select-search-module 'evil-search-module 'isearch)
- (evil-test-buffer
- "so[m]e text with a strange word
-and here some other stuff
-maybe we need one line more with some text\n"
- (setq evil-symbol-word-search nil)
- ("*")
- "some text with a strange word
-and here [s]ome other stuff
-maybe we need one line more with some text\n"
- ("n")
- "some text with a strange word
-and here some other stuff
-maybe we need one line more with [s]ome text\n"
- ("*")
- "[s]ome text with a strange word
-and here some other stuff
-maybe we need one line more with some text\n")
- (ert-info ("Test unbounded search")
- (evil-select-search-module 'evil-search-module 'isearch)
- (evil-test-buffer
- "[s]ymbol\n(defun my-symbolfunc ())\n(defvar my-symbolvar)\nanother symbol\n"
- (setq evil-symbol-word-search nil)
- ("*")
- "symbol\n(defun my-symbolfunc ())\n(defvar my-symbolvar)\nanother [s]ymbol\n"
- ("ggg*")
- "symbol\n(defun my-[s]ymbolfunc ())\n(defvar my-symbolvar)\nanother symbol\n"
- ("n")
- "symbol\n(defun my-symbolfunc ())\n(defvar my-[s]ymbolvar)\nanother symbol\n"))
- (ert-info ("Test symbol search")
- (evil-select-search-module 'evil-search-module 'isearch)
- (evil-test-buffer
- "(defun my-s[y]mbol-func ())\n(defvar my-symbol-var)\n(my-symbol-func)\n(setq my-symbol-func2 (my-symbol-func))\n"
- (setq evil-symbol-word-search t)
- ("*")
- "(defun my-symbol-func ())\n(defvar my-symbol-var)\n([m]y-symbol-func)\n(setq my-symbol-func2 (my-symbol-func))\n"
- ("n")
- "(defun my-symbol-func ())\n(defvar my-symbol-var)\n(my-symbol-func)\n(setq my-symbol-func2 ([m]y-symbol-func))\n"))))
-
-(ert-deftest evil-test-read ()
- "Test of `evil-read'"
- :tags '(evil ex)
- (evil-without-display
- (ert-info ("Test insertion of file with trailing newline")
- (evil-with-temp-file name
- "temp file 1\ntemp file 2\n"
- (ert-info ("At first line")
- (evil-test-buffer
- "[l]ine 1\nline 2"
- ((vconcat ":read " name [return]))
- "line 1\n[t]emp file 1\ntemp file 2\nline 2"))
- (ert-info ("At last line")
- (evil-test-buffer
- "line 1\n[l]ine 2"
- ((vconcat ":read " name [return]))
- "line 1\nline 2\n[t]emp file 1\ntemp file 2\n"))
- (ert-info ("After specified line number")
- (evil-test-buffer
- "[l]ine 1\nline 2\nline 3\nline 4\line 5"
- ((vconcat ":3read " name [return]))
- "line 1\nline 2\nline 3\n[t]emp file 1\ntemp file 2\nline 4\line 5"))
- (ert-info ("After specified line 0")
- (evil-test-buffer
- "line 1\nline [2]\nline 3\nline 4\line 5"
- ((vconcat ":0read " name [return]))
- "[t]emp file 1\ntemp file 2\nline 1\nline 2\nline 3\nline 4\line 5"))))
- (ert-info ("Test insertion of file without trailing newline")
- (evil-with-temp-file name
- "temp file 1\ntemp file 2"
- (evil-test-buffer
- "[l]ine 1\nline 2"
- ((vconcat ":read " name [return]))
- "line 1\n[t]emp file 1\ntemp file 2\nline 2")))
- (ert-info ("Test insertion of shell command")
- (ert-info ("with space")
- (evil-test-buffer
- "[l]line 1\nline 2"
- (":read !echo cmd line 1" [return])
- "line 1\n[c]md line 1\nline 2"))
- (ert-info ("without space")
- (evil-test-buffer
- "[l]line 1\nline 2"
- (":read!echo cmd line 1" [return])
- "line 1\n[c]md line 1\nline 2")))
- (ert-info ("Test substitution of % in shell commands")
- (evil-with-temp-file name
- "3\n2\n1\n"
- (evil-test-buffer
- (":e " name [return])
- "[3]\n2\n1\n"
- (":read !echo %" [return] ":w" [return])
- (file name (concat "3\n"
- (buffer-file-name) "\n"
- "2\n"
- "1\n")))))
- (ert-info ("Ensure that point ends up at the last line of shell output, if any")
- (evil-with-temp-file name
- "3\n2\n1\n"
- (evil-test-buffer
- "[l]ine 1\nline 2"
- ((vconcat ":read !cat " name [return]))
- "line 1\n3\n2\n[1]\nline 2")))
- (ert-info ("Test insertion of shell command without trailing newline")
- (ert-info ("with space")
- (evil-test-buffer
- "[l]line 1\nline 2"
- (":read !echo -n cmd line 1" [return])
- "line 1\n[c]md line 1\nline 2"))
- (ert-info ("without space")
- (evil-test-buffer
- "[l]line 1\nline 2"
- (":read!echo -n cmd line 1" [return])
- "line 1\n[c]md line 1\nline 2")))))
-
-(ert-deftest evil-test-shell-command ()
- "Test `evil-shell-command'."
- (ert-info ("ex shell command")
- (evil-test-buffer
- "[l]ine 5\nline 4\nline 3\nline 2\nline 1\n"
- (":2,3!sort" [return])
- "line 5\n[l]ine 3\nline 4\nline 2\nline 1\n"))
- (ert-info ("shell command operator with count")
- (evil-test-buffer
- "line 5\n[l]ine 4\nline 3\nline 2\nline 1\n"
- ("2!!sort" [return])
- "line 5\n[l]ine 3\nline 4\nline 2\nline 1\n"))
- (ert-info ("shell command operator with motion")
- (evil-test-buffer
- "line 5\n[l]ine 4\nline 3\nline 2\nline 1\n"
- ("!jsort" [return])
- "line 5\n[l]ine 3\nline 4\nline 2\nline 1\n"))
- (ert-info ("shell command operator with backward motion")
- (evil-test-buffer
- "line 5\nline 4\n[l]ine 3\nline 2\nline 1\n"
- ("!ksort" [return])
- "line 5\n[l]ine 3\nline 4\nline 2\nline 1\n"))
- (ert-info ("shell command operator with visual selection")
- (evil-test-buffer
- "line 5\n[l]ine 4\nline 3\nline 2\nline 1\n"
- ("vj!sort" [return])
- "line 5\n[l]ine 3\nline 4\nline 2\nline 1\n")))
-
-(defmacro evil-with-both-search-modules (&rest body)
- `(mapc (lambda (search-module)
- (setq evil-search-forward-history nil
- evil-search-backward-history nil
- evil-ex-search-history nil)
- (evil-select-search-module 'evil-search-module search-module)
- ,@body)
- '(isearch evil-search)))
-
-(ert-deftest evil-test-global ()
- "Test `evil-ex-global'."
- :tags '(evil ex global)
- (ert-info ("global delete")
- (evil-test-buffer
- "[n]o 1\nno 2\nno 3\nyes 4\nno 5\nno 6\nno 7\n"
- (":g/yes/d" [return])
- "no 1\nno 2\nno 3\n[n]o 5\nno 6\nno 7\n"))
- (ert-info ("global delete, specifying case sensitivty")
- (evil-test-buffer
- "[a]lpha bravo charlie\nalpha Bravo charlie\nalpha BRAVO charlie\nalpha delta charlie"
- (":g/\\CBravo/d" [return])
- "alpha bravo charlie\n[a]lpha BRAVO charlie\nalpha delta charlie"
- (":g/\\cBravo/d" [return])
- "alpha delta charlie"))
- (ert-info ("global delete with arg")
- (evil-test-buffer
- "[n]o 1\nno 2\nno 3\nyes 4\nno 5\nno 6\nno 7\n"
- (":g/yes/d2" [return])
- "no 1\nno 2\nno 3\n[n]o 6\nno 7\n"))
- (ert-info ("global delete with range")
- (evil-test-buffer
- "alpha\nbravo\ncharlie\ndelta\ncharlie\necho\ngolf\ncharlie\nhotel"
- (":g/charlie/-1d")
- "alpha\ncharlie\ncharlie\necho\ncharlie\nhotel"))
- (ert-info ("global substitute")
- (evil-test-buffer
- "[n]o 1\nno 2\nno 3\nyes 4\nno 5\nno 6\nno 7\n"
- (":g/no/s/[3-6]/x" [return])
- "no 1\nno 2\nno x\nyes 4\nno x\nno x\n[n]o 7\n"
- ("u")
- "no 1\nno 2\nno [3]\nyes 4\nno 5\nno 6\nno 7\n"))
- (ert-info ("global substitute with trailing slash")
- (evil-test-buffer
- "[n]o 1\nno 2\nno 3\nyes 4\nno 5\nno 6\nno 7\n"
- (":g/no/s/[3-6]/x/" [return])
- "no 1\nno 2\nno x\nyes 4\nno x\nno x\n[n]o 7\n"
- ("u")
- "no 1\nno 2\nno [3]\nyes 4\nno 5\nno 6\nno 7\n"))
- (evil-select-search-module 'evil-search-module 'evil-search)
- (ert-info ("global use last match if none given, with evil-search")
- (evil-test-buffer
- "[n]o 1\nno 2\nno 3\nyes 4\nno 5\nno 6\nno 7\n"
- ("/yes" [return])
- "no 1\nno 2\nno 3\nyes 4\nno 5\nno 6\nno 7\n"
- (":g//d" [return])
- "no 1\nno 2\nno 3\n[n]o 5\nno 6\nno 7\n"
- (":v//d" [return])
- ""))
- (evil-select-search-module 'evil-search-module 'isearch)
- (ert-info ("global use last match if none given, with isearch")
- (evil-test-buffer
- "[n]o 1\nno 2\nno 3\nisearch 4\nno 5\nno 6\nno 7\n"
- ("/isearch" [return])
- "no 1\nno 2\nno 3\nisearch 4\nno 5\nno 6\nno 7\n"
- (":g//d" [return])
- "no 1\nno 2\nno 3\n[n]o 5\nno 6\nno 7\n"
- (":v//d" [return])
- ""))
- (ert-info (":global should take into account evil-ex-search-case")
- (evil-with-both-search-modules
- (let ((evil-ex-search-case 'sensitive))
- (evil-test-buffer
- "this\nThis\n"
- (":g/this/d" [return])
- "This\n"))
- (let ((evil-ex-search-case 'insensitive))
- (evil-test-buffer
- "this\nThis\n"
- (":g/this/d" [return])
- ""))
- (let ((evil-ex-search-case 'smart))
- (evil-test-buffer
- "this\nThis\n"
- (":g/this/d" [return])
- "")
- (evil-test-buffer
- "this\nThis\n"
- (":g/This/d" [return])
- "this\n"))))
- (ert-info (":global should transform vim-style regexp when appropriate")
- (let ((evil-ex-search-vim-style-regexp t))
- (evil-test-buffer
- "a\n1\nb\n2\nc\n3\n"
- (":g/\\d/>")
- "a\n 1\nb\n 2\nc\n 3\n"))))
-
-(ert-deftest evil-test-normal ()
- "Test `evil-ex-normal'."
- :tags '(evil ex)
- (let (evil-want-fine-undo)
- (evil-test-buffer
- "[l]ine 1\nline 2\nline 3\nline 4\nline 5\n"
- (":normal lxIABC" [escape] "AXYZ" [return])
- "ABClne 1XY[Z]\nline 2\nline 3\nline 4\nline 5\n"
- (":3,4normal lxIABC" [escape] "AXYZ" [return])
- "ABClne 1XYZ\nline 2\nABClne 3XYZ\nABClne 4XY[Z]\nline 5\n"
- ("u")
- "ABClne 1XYZ\nline 2\nl[i]ne 3\nline 4\nline 5\n")))
-
-(ert-deftest evil-test-copy ()
- :tags '(evil ex)
- "Test `evil-copy'."
- (ert-info ("Copy to last line")
- (evil-test-buffer
- "[l]ine1\nline2\nline3\nline4\nline5\n"
- (":2,3copy$")
- "line1\nline2\nline3\nline4\nline5\nline2\n[l]ine3\n"))
- (ert-info ("Copy to last incomplete line")
- (evil-test-buffer
- "[l]ine1\nline2\nline3\nline4\nline5"
- (":2,3copy$")
- "line1\nline2\nline3\nline4\nline5\nline2\n[l]ine3\n"))
- (ert-info ("Copy incomplete line to last incomplete line")
- (evil-test-buffer
- "[l]ine1\nline2\nline3\nline4\nline5"
- (":4,5copy$")
- "line1\nline2\nline3\nline4\nline5\nline4\n[l]ine5\n"))
- (ert-info ("Copy to first line")
- (evil-test-buffer
- "[l]ine1\nline2\nline3\nline4\nline5\n"
- (":2,3copy0")
- "line2\n[l]ine3\nline1\nline2\nline3\nline4\nline5\n"))
- (ert-info ("Copy to intermediate line")
- (evil-test-buffer
- "[l]ine1\nline2\nline3\nline4\nline5\n"
- (":2,4copy2")
- "line1\nline2\nline2\nline3\n[l]ine4\nline3\nline4\nline5\n"))
- (ert-info ("Copy to current line")
- (evil-test-buffer
- "line1\nline2\nline3\nli[n]e4\nline5\n"
- (":2,4copy.")
- "line1\nline2\nline3\nline4\nline2\nline3\n[l]ine4\nline5\n")))
-
-(ert-deftest evil-test-move ()
- :tags '(evil ex)
- "Test `evil-move'."
- (ert-info ("Move to last line")
- (evil-test-buffer
- "[l]ine1\nline2\nline3\nline4\nline5\n"
- (":2,3move$")
- "line1\nline4\nline5\nline2\n[l]ine3\n"))
- (ert-info ("Move to last incomplete line")
- (evil-test-buffer
- "[l]ine1\nline2\nline3\nline4\nline5"
- (":2,3move$")
- "line1\nline4\nline5\nline2\n[l]ine3\n"))
- (ert-info ("Move incomplete line to last incomplete line")
- (evil-test-buffer
- "[l]ine1\nline2\nline3\nline4\nline5"
- (":4,5move$")
- "line1\nline2\nline3\nline4\n[l]ine5\n"))
- (ert-info ("Move to first line")
- (evil-test-buffer
- "[l]ine1\nline2\nline3\nline4\nline5\n"
- (":2,3move0")
- "line2\n[l]ine3\nline1\nline4\nline5\n"))
- (ert-info ("Move to intermediate line")
- (evil-test-buffer
- "[l]ine1\nline2\nline3\nline4\nline5\n"
- (":2,4move2")
- "line1\nline2\nline3\n[l]ine4\nline5\n"))
- (ert-info ("Move to other line")
- (evil-test-buffer
- "[l]ine1\nline2\nline3\nline4\nline5\n"
- (":2,3move4")
- "line1\nline4\nline2\n[l]ine3\nline5\n"))
- (ert-info ("Move to current line")
- (evil-test-buffer
- "line1\nline2\nline3\nli[n]e4\nline5\n"
- (":2,4move.")
- "line1\nline2\nline3\n[l]ine4\nline5\n"))
- (ert-info ("Move to backwards line, searching forwards (wrapping around)")
- (evil-test-buffer
- "
-Target
-Other line
-[S]ource
-"
- (":move/Target/")
- "
-Target
-[S]ource
-Other line
-"))
- (ert-info ("Move to forwards line, searching backwards (wrapping around)")
- (evil-test-buffer
- "
-Target
-[O]ther line
-Source
-"
- (":move?Source?")
- "
-Target
-Source
-[O]ther line
-"))
- (ert-info ("Move with global (classic line reversal)")
- (evil-test-buffer
- "5\n4\n3\n2\n1\n"
- (":g/^/m0")
- "1\n2\n3\n4\n5\n")
- (ert-info ("... and visual selection")
- (evil-test-buffer
- "<5\n4\n3\n2\n[1]>\n"
- (":g/^/m0")
- "1\n2\n3\n4\n5\n"))
- (ert-info ("... and no last blank line")
- (evil-test-buffer
- "5\n4\n3\n2\n1"
- (":g/^/m0")
- "1\n2\n3\n4\n5"))))
-
-(ert-deftest evil-test-write ()
- :tags '(evil ex)
- "Test `evil-write'."
- (ert-info ("Write open file")
- (evil-with-temp-file filename "line1\nline2\nline3\n"
- (evil-test-buffer
- ((vconcat ":e " filename [return]))
- "[l]ine1\nline2\nline3\n"
- ("Galine4\nline5\n" [escape])
- "line1\nline2\nline3\nline4\nline5\n"
- (":w")
- (file filename "line1\nline2\nline3\nline4\nline5\n"))))
- (ert-info ("Write current buffer to new file")
- (let ((filename (make-temp-file "evil-test-write")))
- (evil-test-buffer
- "[l]ine1\nline2\nline3\nline4\nline5\n"
- (delete-file filename)
- ((vconcat ":w " filename [return]))
- (file filename "line1\nline2\nline3\nline4\nline5\n")
- (delete-file filename))))
- (ert-info ("Write part of a buffer")
- (let ((filename (make-temp-file "evil-test-write")))
- (evil-test-buffer
- "[l]ine1\nline2\nline3\nline4\nline5\n"
- (delete-file filename)
- ((vconcat ":2,3w " filename [return]))
- (file filename "line2\nline3\n")
- (delete-file filename))))
- (ert-info ("Appending a file")
- (let ((filename (make-temp-file "evil-test-write")))
- (evil-test-buffer
- "[l]ine1\nline2\nline3\nline4\nline5\n"
- (delete-file filename)
- ((vconcat ":4w " filename [return]))
- (file filename "line4\n")
- ((vconcat ":1,2w >>" filename [return]))
- (file filename "line4\nline1\nline2\n")
- ((vconcat ":w >> " filename [return]))
- (file filename
- "line4\nline1\nline2\nline1\nline2\nline3\nline4\nline5\n")
- (delete-file filename)))))
-
-(ert-deftest evil-test-ex-sort ()
- :tags '(evil ex)
- "Text Ex command \":sort\" (`evil-ex-sort')."
- (ert-info ("Plain sort")
- (evil-test-buffer
- "[z]zyy\ntest\ntEst\ntesT\nTEST\ntest\n"
- (":sort")
- "[T]EST\ntEst\ntesT\ntest\ntest\nzzyy\n"))
- (ert-info ("Reverse sort")
- (evil-test-buffer
- "[z]zyy\ntest\ntEst\ntesT\nTEST\ntest\n"
- (":sort!")
- "[z]zyy\ntest\ntest\ntesT\ntEst\nTEST\n"))
- (ert-info ("case insensitive")
- (evil-test-buffer
- "[z]zyy\ntest\ntEst\ntesT\nTEST\ntest\n"
- (":sort i")
- "[t]est\ntEst\ntesT\nTEST\ntest\nzzyy\n"))
- (ert-info ("unique")
- (evil-test-buffer
- "[z]zyy\ntest\ntEst\ntesT\nTEST\ntest\n"
- (":sort u")
- "[T]EST\ntEst\ntesT\ntest\nzzyy\n"))
- (ert-info ("case insensitive and unique")
- (evil-test-buffer
- "[z]zyy\ntest\ntEst\ntesT\nTEST\ntest\n"
- (":sort iu")
- "[t]est\nzzyy\n"))
- (ert-info ("pattern sort")
- (evil-test-buffer
- "[t]e|z|t\nzz|a|y\n"
- (":sort /|[a-z]|/ r")
- ("zz|a|y\nte|z|t\n"))
- (evil-test-buffer
- "[a],b\nb,a\n"
- (":sort /[^,]*,/")
- "b,a\na,b\n")
- (evil-test-buffer
- "[a],b\nb,a\n"
- ("/," [return] ":sort //")
- "b,a\na,b\n"))
- (ert-info ("numeric sort")
- (ert-info ("decimal")
- (evil-test-buffer
- "27\n027\n2\na\n1\n"
- (":sort n")
- "a\n1\n2\n27\n027\n"))
- (ert-info ("octal")
- (evil-test-buffer
- "9\n8\n"
- (":sort o")
- "9\n8\n")
- (evil-test-buffer
- "777\n776\n7239\n"
- (":sort o")
- "7239\n776\n777\n"))
- (ert-info ("hexadecimal")
- (evil-test-buffer
- "0xae\n0xb\nae\nad\n"
- (":sort x")
- "0xb\nad\n0xae\nae\n"))))
-
-;;; Command line window
-
-(ert-deftest evil-test-command-window-ex ()
- "Test command line window for Ex commands."
- (let ((evil-ex-history (list "s/foo/baz" "s/foo/bar")))
- (evil-test-buffer "[b]ar baz foo"
- ("q:")
- "s/foo/bar\ns/foo/baz\n[]\n"
- ("kk:s/bar/quz" [return])
- "[s]/foo/quz\ns/foo/baz\n"
- ("fzrx" [return])
- "[b]ar baz qux"
- (should (equal (car evil-ex-history) "s/foo/qux")))))
-
-(ert-deftest evil-test-command-window-noop ()
- "Test that executing a blank command does nothing."
- (evil-test-buffer "[f]oo foo foo"
- ("q:")
- "[]\n"
- ([return])
- "[f]oo foo foo"))
-
-(ert-deftest evil-test-command-window-search-history ()
- "Test command window with forward and backward search history."
- (let ((evil-search-module 'isearch)
- (evil-search-forward-history (list "four" "three" "qux"))
- (evil-search-backward-history (list "baz" "bar")))
- (evil-test-buffer "foo bar [b]az qux one two three four"
- ("q/")
- "qux\nthree\nfour\n[]\n"
- ("k" [return])
- "foo bar baz qux one two three [f]our"
- ("0N")
- "foo bar baz qux one two three [f]our"
- ("q?")
- "bar\nbaz\n[]\n"
- ("k$rr" [return])
- "foo [b]ar baz qux one two three four"
- (error 'user-error "q/iNOT THERE" [return])
- "foo [b]ar baz qux one two three four")))
-
-(ert-deftest evil-test-command-window-search-word ()
- "Test command window history when searching for word under cursor."
- (let ((evil-search-module 'isearch))
- (evil-test-buffer
- "[f]oo bar foo bar foo"
- ("**")
- "foo bar foo bar [f]oo"
- ("B#")
- "foo [b]ar foo bar foo"
- ("q/k" [return])
- "foo bar [f]oo bar foo"
- ("q?k" [return])
- "foo [b]ar foo bar foo")))
-
-;;; Window motions
-
-(ert-deftest evil-test-window-next-and-prev-respect-window-parameters ()
- "Test that `evil-window-next' and `evil-window-prev' respect window parameters.
-E.g. they do not move to windows that have the `no-other-window'
-parameter set."
- (save-window-excursion
- ;; Make sure there is a single original window and open a second
- ;; other window with `no-other-window' set.
- (delete-other-windows)
- (let* ((this-window (selected-window))
- (other-window (split-window)))
- (set-window-parameter other-window 'no-other-window t)
- ;; `evil-window-next'/`evil-window-prev' should not switch to
- ;; the window with `no-other-window' parameter set.
- (evil-window-next nil)
- (should (eq (selected-window) this-window))
- (evil-window-prev nil)
- (should (eq (selected-window) this-window)))))
-
-;;; Utilities
-
-(ert-deftest evil-test-parser ()
- "Test `evil-parser'"
- (with-temp-buffer
- (cl-flet
- ((parse
- (s &rest args)
- (erase-buffer)
- (insert s)
- (goto-char (point-min))
- (apply
- (evil-parser
- '((number "[0-9]+" #'string-to-number)
- (plus "\\+" #'intern)
- (minus "-" #'intern)
- (operator
- plus
- minus)
- (sign (\? operator))
- (signed-number (sign number))
- (expr
- ("foo" (& "bar"))
- ("xxx" (! "yyy"))
- (number operator number))
- (epsilon nil))
- expr operator plus signed-number number epsilon)
- args)))
- (ert-info ("Nothing")
- (should (equal (parse "1+2" 'epsilon) '(nil))))
- (ert-info ("Symbols")
- (should (equal (parse "+" 'plus) '((intern "+"))))
- (should (equal (parse "+" 'operator) '((intern "+")))))
- (ert-info ("Leading whitespace")
- (should (equal (parse " 1" 'number) '((string-to-number "1")))))
- (ert-info ("Syntax tree")
- (should (equal (parse "1" 'signed-number t)
- '((signed-number (sign . 1) (number . 2))))))
- (ert-info ("Lookahead")
- (should (equal (parse "foobar" 'expr) '((list "foo"))))
- (should (null (parse "foobaz" 'expr)))
- (should (null (parse "xxxyyy" 'expr)))
- (should (equal (parse "xxxzzz" 'expr) '((list "xxx")))))
- (ert-info ("Semantic actions")
- (should (equal (parse "1+1" 'expr)
- '((list
- (string-to-number "1")
- (intern "+")
- (string-to-number "1")))))))))
-
-(ert-deftest evil-test-delimited-arguments ()
- "Test `evil-delimited-arguments'"
- :tags '(evil util)
- (ert-info ("Any number of arguments")
- (should (equal (evil-delimited-arguments "/a/b/c/")
- '("a" "b" "c")))
- (should (equal (evil-delimited-arguments "/a/b/c")
- '("a" "b" "c")))
- (should (equal (evil-delimited-arguments "/a/b//")
- '("a" "b" "")))
- (should (equal (evil-delimited-arguments "/a///")
- '("a" "" "")))
- (should (equal (evil-delimited-arguments "/a/ ")
- '("a" " ")))
- (should (equal (evil-delimited-arguments "/a/")
- '("a")))
- (should (equal (evil-delimited-arguments "//b//")
- '("" "b" "")))
- (should (equal (evil-delimited-arguments "/a//c")
- '("a" "" "c")))
- (should (equal (evil-delimited-arguments "////")
- '("" "" "")))
- (should (equal (evil-delimited-arguments "/")
- nil))
- (should (equal (evil-delimited-arguments " ")
- nil))
- (should (equal (evil-delimited-arguments "")
- nil)))
- (ert-info ("Two arguments")
- (should (equal (evil-delimited-arguments "/a/b/c" 2)
- '("a" "b/c")))
- (should (equal (evil-delimited-arguments "/a/b/" 2)
- '("a" "b")))
- (should (equal (evil-delimited-arguments "/a/b" 2)
- '("a" "b")))
- (should (equal (evil-delimited-arguments "/a//" 2)
- '("a" "")))
- (should (equal (evil-delimited-arguments "/a/ " 2)
- '("a" " ")))
- (should (equal (evil-delimited-arguments "/a/" 2)
- '("a" nil)))
- (should (equal (evil-delimited-arguments "/a" 2)
- '("a" nil)))
- (should (equal (evil-delimited-arguments " " 2)
- '(nil nil)))
- (should (equal (evil-delimited-arguments "" 2)
- '(nil nil))))
- (ert-info ("One argument")
- (should (equal (evil-delimited-arguments "/a/b/c" 1)
- '("a/b/c")))
- (should (equal (evil-delimited-arguments "/a/ " 1)
- '("a")))
- (should (equal (evil-delimited-arguments "/a/" 1)
- '("a")))
- (should (equal (evil-delimited-arguments "/a" 1)
- '("a")))
- (should (equal (evil-delimited-arguments "/" 1)
- '(nil)))
- (should (equal (evil-delimited-arguments " " 1)
- '(nil)))
- (should (equal (evil-delimited-arguments "" 1)
- '(nil))))
- (ert-info ("Zero arguments")
- (should (equal (evil-delimited-arguments "/a" 0)
- nil))
- (should (equal (evil-delimited-arguments "/" 0)
- nil))
- (should (equal (evil-delimited-arguments " " 0)
- nil))
- (should (equal (evil-delimited-arguments "" 0)
- nil))))
-
-(ert-deftest evil-test-concat-charsets ()
- "Test `evil-concat-charsets'"
- :tags '(evil util)
- (ert-info ("Bracket")
- (should (equal (evil-concat-charsets "abc" "]def")
- "]abcdef")))
- (ert-info ("Complement")
- (should (equal (evil-concat-charsets "^abc" "def")
- "^abcdef"))
- (should (equal (evil-concat-charsets "^abc" "^def")
- "^abcdef")))
- (ert-info ("Hyphen")
- (should (equal (evil-concat-charsets "abc" "-def")
- "-abcdef"))
- (should (equal (evil-concat-charsets "^abc" "-def")
- "^-abcdef")))
- (ert-info ("Newline")
- (should (equal (evil-concat-charsets "^ \t\r\n" "[:word:]_")
- "^ \t\r\n[:word:]_"))))
-
-(ert-deftest evil-test-properties ()
- "Test `evil-get-property' and `evil-put-property'"
- :tags '(evil util)
- (defvar evil--alist)
- (let (evil--alist)
- (ert-info ("Set properties")
- (evil-put-property 'evil--alist 'wibble :foo t)
- (should (equal evil--alist '((wibble . (:foo t)))))
- (evil-put-property 'evil--alist 'wibble :bar nil)
- (should (equal evil--alist '((wibble . (:foo t :bar nil)))))
- (evil-put-property 'evil--alist 'wobble :foo nil :bar nil :baz t)
- (should (equal evil--alist '((wobble . (:foo nil :bar nil :baz t))
- (wibble . (:foo t :bar nil))))))
- (ert-info ("Get properties")
- (should (evil-get-property evil--alist 'wibble :foo))
- (should-not (evil-get-property evil--alist 'wibble :bar))
- (should-not (evil-get-property evil--alist 'wobble :foo))
- (should-not (evil-get-property evil--alist 'wibble :baz))
- (should (equal (evil-get-property evil--alist t :foo)
- '((wibble . t) (wobble . nil))))
- (should (equal (evil-get-property evil--alist t :bar)
- '((wibble . nil) (wobble . nil))))
- (should (equal (evil-get-property evil--alist t :baz)
- '((wobble . t)))))))
-
-(ert-deftest evil-test-filter-list ()
- "Test `evil-filter-list'"
- :tags '(evil util)
- (ert-info ("Return filtered list")
- (should (null (evil-filter-list #'null '(nil))))
- (should (equal (evil-filter-list #'null '(nil 1)) '(1)))
- (should (equal (evil-filter-list #'null '(nil 1 2 nil)) '(1 2)))
- (should (equal (evil-filter-list #'null '(nil nil 1)) '(1)))
- (should (equal (evil-filter-list #'null '(nil 1 nil 2 nil 3))
- '(1 2 3))))
- (ert-info ("Remove matches by side-effect when possible")
- (let (list)
- (setq list '(1 nil))
- (evil-filter-list #'null list)
- (should (equal list '(1)))
-
- (setq list '(1 nil nil))
- (evil-filter-list #'null list)
- (should (equal list '(1)))
-
- (setq list '(1 nil nil 2))
- (evil-filter-list #'null list)
- (should (equal list '(1 2)))
-
- (setq list '(1 nil 2 nil 3))
- (evil-filter-list #'null list)
- (should (equal list '(1 2 3))))))
-
-(ert-deftest evil-test-concat-lists ()
- "Test `evil-concat-lists' and `evil-concat-alists'"
- :tags '(evil util)
- (ert-info ("Remove duplicates across lists")
- (should (equal (evil-concat-lists
- nil '(a b) '(b c))
- '(a b c))))
- (ert-info ("Remove duplicates inside lists")
- (should (equal (evil-concat-lists
- '(a a b) nil '(b c) nil)
- '(a b c))))
- (ert-info ("Remove duplicate associations")
- (should (equal (evil-concat-alists
- '((a . b)) '((a . c)))
- '((a . c))))
- (should-not (equal (evil-concat-lists
- '((a . b)) '((a . c)))
- '((a . b))))))
-
-(ert-deftest evil-test-sort ()
- "Test `evil-sort'."
- :tags '(evil util)
- (ert-info ("Two elements")
- (let ((a 2) (b 1))
- (evil-sort a b)
- (should (= a 1))
- (should (= b 2))))
- (ert-info ("Three elements")
- (let ((a 3) (b 1) (c 2))
- (evil-sort a b c)
- (should (= a 1))
- (should (= b 2))
- (should (= c 3))))
- (ert-info ("Four elements")
- (let ((a 4) (b 3) (c 2) (d 1))
- (evil-sort a b c d)
- (should (= a 1))
- (should (= b 2))
- (should (= c 3))
- (should (= d 4)))))
-
-(ert-deftest evil-test-read-key ()
- "Test `evil-read-key'"
- :tags '(evil util)
- (let ((unread-command-events '(?A)))
- (ert-info ("Prevent downcasing in `this-command-keys'")
- (should (eq (evil-read-key) ?A))
- (should (equal (this-command-keys) "A")))))
-
-(ert-deftest evil-test-extract-count ()
- "Test `evil-extract-count'"
- :tags '(evil util)
- (evil-test-buffer
- (ert-info ("Exact without count")
- (should (equal (evil-extract-count "x")
- (list nil 'evil-delete-char "x" nil)))
- (should (equal (evil-extract-count "g0")
- (list nil 'evil-beginning-of-visual-line "g0" nil))))
-
- (ert-info ("Exact with count")
- (should (equal (evil-extract-count "420x")
- (list 420 'evil-delete-char "x" nil)))
- (should (equal (evil-extract-count (vconcat "420" [M-right]))
- (list 420 (key-binding [M-right]) (vconcat [M-right]) nil)))
- (should (equal (evil-extract-count "2301g0")
- (list 2301 'evil-beginning-of-visual-line "g0" nil))))
-
- (ert-info ("Extra elements without count")
- (should (equal (evil-extract-count "xAB")
- (list nil 'evil-delete-char "x" "AB")))
- (should (equal (evil-extract-count "g0CD")
- (list nil 'evil-beginning-of-visual-line "g0" "CD"))))
-
- (ert-info ("Extra elements with count")
- (should (equal (evil-extract-count "420xAB")
- (list 420 'evil-delete-char "x" "AB")))
- (should (equal (evil-extract-count "2301g0CD")
- (list 2301 'evil-beginning-of-visual-line "g0" "CD"))))
-
- (ert-info ("Exact \"0\" count")
- (should (equal (evil-extract-count "0")
- (list nil 'evil-beginning-of-line
- "0" nil))))
-
- (ert-info ("Extra elements and \"0\"")
- (should (equal (evil-extract-count "0XY")
- (list nil 'evil-beginning-of-line
- "0" "XY"))))
-
- (ert-info ("Count only")
- (should-error (evil-extract-count "1230")))
-
- (ert-info ("Unknown command")
- (should-error (evil-extract-count "°"))
- (should-error (evil-extract-count "12°")))))
-
-(ert-deftest evil-transform-vim-style-regexp ()
- "Test `evil-transform-vim-style-regexp'"
- (dolist (repl '((?s . "[[:space:]]")
- (?S . "[^[:space:]]")
- (?d . "[[:digit:]]")
- (?D . "[^[:digit:]]")
- (?x . "[[:xdigit:]]")
- (?X . "[^[:xdigit:]]")
- (?o . "[0-7]")
- (?O . "[^0-7]")
- (?a . "[[:alpha:]]")
- (?A . "[^[:alpha:]]")
- (?l . "[a-z]")
- (?L . "[^a-z]")
- (?u . "[A-Z]")
- (?U . "[^A-Z]")
- (?y . "\\s")
- (?Y . "\\S")
- (?w . "\\w")
- (?W . "\\W")))
- (ert-info ((format "Test transform from '\\%c' to '%s'"
- (car repl) (cdr repl)))
- (should (equal (evil-transform-vim-style-regexp
- (concat "xxx\\"
- (char-to-string (car repl))
- "\\"
- (char-to-string (car repl))
- "\\\\"
- (char-to-string (car repl))
- "\\\\\\"
- (char-to-string (car repl))
- "yyy"))
- (concat "xxx"
- (cdr repl)
- (cdr repl)
- "\\\\"
- (char-to-string (car repl))
- "\\\\"
- (cdr repl)
- "yyy"))))))
-
-;;; Advice
-
-(ert-deftest evil-test-eval-last-sexp ()
- "Test advised `evil-last-sexp'"
- :tags '(evil advice)
- (ert-info ("Normal state")
- (evil-test-buffer
- "(+ 1 (+ 2 3[)])"
- ("1" (kbd "C-x C-e"))
- "(+ 1 (+ 2 35[)])"))
- (ert-info ("Insert state")
- (evil-test-buffer
- "(+ 1 (+ 2 3[)])"
- ("i" (kbd "C-u") (kbd "C-x C-e") [escape])
- "(+ 1 (+ 2 3[3]))"))
- (ert-info ("Emacs state")
- (evil-test-buffer
- "(+ 1 (+ 2 3[)])"
- ((kbd "C-z") (kbd "C-u") (kbd "C-x C-e"))
- "(+ 1 (+ 2 33[)])")))
-
-;;; ESC
-
-(ert-deftest evil-test-esc-count ()
- "Test if prefix-argument is transferred for key sequences with meta-key"
- :tags '(evil esc)
- (unless noninteractive
- (ert-info ("Test M-<right>")
- (evil-test-buffer
- "[A]BC DEF GHI JKL MNO"
- ("3" (kbd "ESC <right>"))
- "ABC DEF GHI[ ]JKL MNO"))
- (ert-info ("Test shell-command")
- (evil-test-buffer
- "[A]BC DEF GHI JKL MNO"
- ("1" (kbd "ESC !") "echo TEST" [return])
- "[T]EST\nABC DEF GHI JKL MNO"))))
-
-(when (or evil-tests-profiler evil-tests-run)
- (evil-tests-initialize))
-
-(ert-deftest evil-test-black-hole-register ()
- :tags '(evil)
- (ert-info ("Test \"_ on delete word")
- (evil-test-buffer
- "[E]vil evil is awesome."
- ("dw\"_dwP")
- "Evil[ ]is awesome."))
- (ert-info ("Test \"_ on delete line")
- (evil-test-buffer
- "[T]his line is a keeper!\nThis line is not."
- ("dd\"_ddP")
- "[T]his line is a keeper!"))
- (ert-info ("Test \"_ on delete region")
- (evil-test-buffer
- "<This region is a keeper>!\nThis line is not."
- ("d\gg\"_dGP")
- "This region is a keepe[r]")))
-
-(ert-deftest evil-test-pasteable-macros ()
- "Test if we can yank and paste macros containing
- <escape>"
- :tags '(evil)
- (ert-info ("Execute yanked macro")
- (evil-test-buffer
- "[i]foo\e"
- ("\"qD@q\"qp"
- "fooifoo\e")))
- (ert-info ("Paste recorded marco")
- (evil-test-buffer
- (evil-set-register ?q (vconcat "ifoo" [escape]))
- ("@q\"qp")
- "fooifoo\e")))
-
-(ert-deftest evil-test-forward-symbol ()
- :tags '(evil)
- (ert-info ("Test symbol deletion")
- (evil-test-buffer
- "(test [t]his (hello there) with dao)"
- ("dao")
- "(test [(]hello there) with dao)"))
- (ert-info ("Test symbol motion")
- (evil-test-buffer
- "(test[ ](hello there) with dao)"
- (should (eq 0 (forward-evil-symbol 1)))
- "(test ([h]ello there) with dao)"
- (should (eq 0 (forward-evil-symbol 1)))
- "(test (hello[ ]there) with dao)"))
- (ert-info ("Test dio on whitespace")
- (evil-test-buffer
- "(test[ ]dio with whitespace)"
- ("dio")
- "(test[d]io with whitespace)"))
- (ert-info ("Test dao/dio with empty lines")
- (evil-test-buffer
- "there are two lines in this file\n[\n]and some whitespace between them"
- ("dao")
- "there are two lines in this file\n[a]nd some whitespace between them")
- (evil-test-buffer
- "here are another two lines\n[\n]with a blank line between them"
- ("dio")
- "here are another two lines\n[w]ith a blank line between them"))
- (ert-info ("Test dao/dio with empty lines and punctuation")
- (evil-test-buffer
- "These two lines \n[\n]!have punctuation on them"
- ("dao")
- "These two lines \n[!]have punctuation on them")))
-
-(ert-deftest evil-test-jump ()
- :tags '(evil jumps)
- (let ((evil--jumps-buffer-targets "\\*\\(new\\|scratch\\|test\\)\\*"))
- (ert-info ("Test jumping backward and forward in a single buffer")
- (evil-test-buffer
- "[z] z z z z z z z z z"
- ("/z" [return])
- "z [z] z z z z z z z z"
- ("nnnn")
- "z z z z z [z] z z z z"
- ("\C-o")
- "z z z z [z] z z z z z"
- ("\C-o")
- "z z z [z] z z z z z z"
- ("\C-i\C-i")
- "z z z z z [z] z z z z"))
- (ert-info ("Test jumping backward and forward with counts")
- (evil-test-buffer
- "[z] z z z z z z z z z"
- ("/z" [return] "nnnn")
- "z z z z z [z] z z z z"
- ("3\C-o")
- "z z [z] z z z z z z z"
- ("2\C-i")
- "z z z z [z] z z z z z"
- ))
- (ert-info ("Jump list branches off when new jump is set")
- (evil-test-buffer
- "[z] z z z z z z z"
- ("/z" [return] "nnnn4\C-o") ;; adds a bunch of jumps after the 2nd z
- "z [z] z z z z z z"
- ("/z" [return]) ;; sets a new jump, list should be reset
- "z z [z] z z z z z"
- ("\C-o")
- "z [z] z z z z z z"
- ("3\C-i") ;; even after jumping forward 3 times it can't get past the 3rd z
- "z z [z] z z z z z"))
- (ert-info ("Jump across files")
- (let ((temp-file (make-temp-file "evil-test-")))
- (unwind-protect
- (evil-test-buffer
- "[z] z z z z z z"
- ("\M-x" "find-file" [return] temp-file [return] "inew buffer" [escape])
- "new buffe[r]"
- ("\C-o")
- "[z] z z z z z z"
- ("\C-i")
- "new buffe[r]")
- (delete-file temp-file)
- (let ((buf (file-name-nondirectory temp-file)))
- (when (get-buffer buf)
- (with-current-buffer buf (set-buffer-modified-p nil))
- (kill-buffer buf))))))
- (ert-info ("Jump multiple times between files")
- (let ((a (make-temp-file "evil-aa-" nil nil "evil-bb\n\nthis is a"))
- (b (make-temp-file "evil-bb-" nil nil "evil-cc\n\nthis is b"))
- (c (make-temp-file "evil-cc-" nil nil "this is c")))
- (unwind-protect
- (evil-test-buffer
- (find-file a)
- ("gf" [return])
- "evil-cc\n\nthis is b"
- ("gf" [return])
- "this is c"
- ("\C-o" "\C-o")
- "evil-bb\n\nthis is a"
- ("\C-i" "\C-i")
- "this is c")
- (dolist (f (list a b c))
- (let ((buf (file-name-nondirectory f)))
- (when (get-buffer buf)
- (with-current-buffer buf (set-buffer-modified-p nil))
- (kill-buffer buf)))
- (delete-file f)))))))
-
-(ert-deftest evil-test-find-file ()
- :tags '(evil jumps)
- (when (memq system-type '(cygwin windows-nt ms-dos))
- (ert-skip "[INFO] GitHub Actions has different userprofile name."))
- (ert-info ("Find file at point (normal state)")
- (evil-with-temp-file file-name ""
- (evil-test-buffer
- (vconcat "i" file-name [escape])
- (should-not (equal file-name (buffer-file-name)))
- ("gf")
- (should (equal file-name (buffer-file-name))))))
- (ert-info ("Find file at point (visual state)")
- (evil-with-temp-file file-name ""
- (evil-test-buffer
- (vconcat "iuser@localhost:" file-name "$" [escape])
- (should-not (equal file-name (buffer-file-name)))
- ("0f:lvt$gf")
- (should (equal file-name (buffer-file-name))))))
- (ert-info ("Find file at point with line number")
- (let* ((line-number 3)
- (file-content (make-string (* 2 line-number) ?\n)))
- (evil-with-temp-file file-name (insert file-content)
- (evil-test-buffer
- (vconcat "i" file-name (format ":%d" line-number) [escape])
- (should (and (not (equal file-name (buffer-file-name)))
- (not (equal line-number (line-number-at-pos)))))
- ("gF")
- (should (and (equal file-name (buffer-file-name))
- (equal line-number (line-number-at-pos))))))))
- (ert-info ("Find file at point with line and column numbers")
- (let* ((line-number 3)
- (column-number 5)
- (file-content (mapconcat #'identity
- (make-list (* 2 line-number)
- (make-string (* 2 column-number) ?\s))
- "\n")))
- (evil-with-temp-file file-name (insert file-content)
- (evil-test-buffer
- (vconcat "i" file-name (format ":%d:%d" line-number column-number) [escape])
- (should (and (not (equal file-name (buffer-file-name)))
- (not (equal line-number (line-number-at-pos)))
- (not (equal column-number (current-column)))))
- ("gF")
- (should (and (equal file-name (buffer-file-name))
- (equal line-number (line-number-at-pos))
- (equal column-number (1+ (current-column))))))))))
-
-(ert-deftest evil-test-jump-buffers ()
- :tags '(evil jumps)
- (skip-unless nil)
- (ert-info ("Test jumping backward and forward across buffers")
- (evil-test-buffer
- "[z] z z z z z z z z z"
- (":new" [return] "inew buffer" [escape])
- "new buffe[r]"
- ("\C-o")
- "[z] z z z z z z z z z"
- ("\C-i")
- "new buffe[r]")))
-
-(ert-deftest evil-test-abbrev-expand ()
- :tags '(evil abbrev)
- (ert-info ("Test abbrev expansion on insert state exit")
- (define-abbrev-table 'global-abbrev-table
- '(("undef" "undefined"))) ; add global abbrev
- (evil-test-buffer
- "foo unde[f] bar"
- (abbrev-mode)
- ("a" [escape])
- "foo undefine[d] bar") ; 'undef' should be expanded
- (evil-test-buffer
- "foo unde[f] bar"
- ("a" [escape])
- "foo unde[f] bar") ; 'undef' shouldn't be expanded,
- ; abbrev-mode is not enabled
- (evil-test-buffer
- "fo[o] undef bar"
- (abbrev-mode)
- ("a" [escape])
- "fo[o] undef bar") ; 'foo' shouldn't be expanded,
- ; it's not an abbrev
- (kill-all-abbrevs) ; remove all abbrevs
- (evil-test-buffer
- "foo unde[f] bar"
- (abbrev-mode)
- ("a" [escape])
- "foo unde[f] bar") ; 'undef' shouldn't be expanded,
- ; it's not an abbrev
- (setq abbrevs-changed nil)))
-
-(ert-deftest evil-test-text-object-macro ()
- :tags '(evil abbrev)
- (ert-info ("Test pipe character and other delimiters as object delimiters")
- ;; This is the macro that broke after pull #747.
- (defmacro evil-test-define-and-bind-text-object (name key start-regex end-regex)
- (let ((inner-name (make-symbol (concat "evil-inner-" name)))
- (outer-name (make-symbol (concat "evil-a-" name))))
- `(progn
- (evil-define-text-object ,inner-name (count &optional beg end _type)
- (evil-select-paren ,start-regex ,end-regex beg end type count nil))
- (evil-define-text-object ,outer-name (count &optional beg end _type)
- (evil-select-paren ,start-regex ,end-regex beg end type count t))
- (define-key evil-inner-text-objects-map ,key #',inner-name)
- (define-key evil-outer-text-objects-map ,key #',outer-name))))
- (evil-test-define-and-bind-text-object "pipe" "|" "|" "|")
- (evil-test-define-and-bind-text-object "rackety" "#" "#|" "|#")
-
- (evil-test-buffer
- "#|this i[s] a test #|with rackety|# multiline
- and nestable comments|#"
- ("vi#")
- "#|<this is a test #|with rackety|# multiline
- and nestable comments>|#")
- (evil-test-buffer
- "| foo | aoe[u] | bar |"
- ("vi|")
- "| foo |< aoeu >| bar |"
- ("a|")
- "| foo <| aoeu |> bar |"
- ("a|")
- "<| foo | aoeu | bar |>")
- (evil-test-buffer
- "| foo | aoe[u] | bar |"
- ("ci|testing" [escape])
- "| foo |testing| bar |")))
-
-(ert-deftest evil-test-kbd-macro ()
- "Test recording and replaying of macros."
- :tags '(evil kbd-macro)
- (ert-info ("Execute macro an infinite number of times")
- (evil-test-buffer "xxx"
- (evil-set-register ?q "ryl")
- (error 'end-of-line "\C-u@q")
- "yyy")))
-
-(ert-deftest evil-test-undo-kbd-macro ()
- "Test if evil can undo the changes made by a keyboard macro
-when an error stops the execution of the macro"
- :tags '(evil undo kbd-macro)
- (ert-info ("When kbd-macro goes to the end of buffer")
- (evil-test-buffer
- "[l]ine 1\nline 2\nline 3\nline 4"
- (evil-set-register ?q "jdd")
- ("jdd")
- (should-error (execute-kbd-macro "2@q"))
- ("uu")
- "line 1\n[l]ine 2\nline 3\nline 4"))
- (ert-info ("When kbd-macro goes to the end of line")
- (evil-test-buffer
- "[f]ofof"
- (evil-set-register ?q "lx")
- ("lx")
- (should-error (execute-kbd-macro "2@q"))
- ("uu")
- "f[o]fof"))
- (ert-info ("When kbd-macro goes to the beginning of buffer")
- (evil-test-buffer
- "line 1\nline 2\n[l]ine 3"
- (evil-set-register ?q "kx")
- ("kx")
- (should-error (execute-kbd-macro "2@q"))
- ("uu")
- "line 1\n[l]ine 2\nline 3")))
-
-(ert-deftest evil-test-undo-jump ()
- "Test that undo adds to the jump list."
- :tags '(evil)
- (let ((evil--jumps-buffer-targets "\\*\\(new\\|scratch\\|test\\)\\*"))
- (ert-info ("Undo adds to the jump list")
- (evil-test-buffer
- "alpha [b]ravo charlie delta"
- ("dw" "w")
- "alpha charlie [d]elta"
- ("u")
- "alpha [b]ravo charlie delta"
- ("``")
- "alpha bravo charlie [d]elta"))))
-
-(ert-deftest evil-test-insert-state-undo ()
- "Test that undo isn't lost when done from insert state."
- :tags '(evil)
- (skip-unless (version<= "28" emacs-version))
- (let (evil-want-fine-undo)
- (customize-set-variable 'evil-undo-system 'undo-redo)
- (evil-test-buffer
- "alpha [ ]delta"
- (evil-define-key* 'insert 'local [f8] 'evil-undo)
- ("icharlie" [f8] [escape])
- "alpha[ ] delta"
- ("\C-r")
- "alpha [c]harlie delta")))
-
-(ert-deftest evil-test-visual-update-x-selection ()
- "Test `evil-visual-update-x-selection'."
- :tags '(evil)
- (ert-info ("Buffer argument isn't a live buffer")
- ;; create buffer in normal mode, so we don't try to actually copy anything to
- ;; the X selection.
- (let ((buf (evil-test-buffer-from-string "foobar")))
- (kill-buffer buf)
- ;; should not raise an "Selecting deleted buffer" error
- (evil-visual-update-x-selection buf))))
-
-(ert-deftest evil-test-append-to-kbd-macro ()
- "Test if evil can append to a keyboard macro."
- :tags '(evil append to kbd-macro)
- (ert-info ("When kbd-macro ends in <escape>")
- (evil-test-buffer
- (evil-set-register ?a (vconcat "ainserted text" [escape]))
- (evil-set-register ?A (vconcat "a appended text" [escape]))
- ("@a")
- "inserted text appended tex[t]")))
-
-(ert-deftest evil-test-paren-jumping ()
- :tags '(evil paren)
- (ert-info ("Test doing motions on parens that you aren't in")
- (evil-test-buffer
- "[m]ain(argc, argv) char **argv; {"
- ("dib" [escape])
- "main([)] char **argv; {")
- (evil-test-buffer
- "[a]lpha (bravo) charlie "
- ("yi(")
- "alpha ([b]ravo) charlie "
- ("$p")
- "alpha (bravo) charlie brav[o]")
- (evil-test-buffer
- "[a]lpha (bravo (charlie))"
- ("2di(")
- "alpha (bravo ([)]")
- (evil-test-buffer
- :point-start "("
- :point-end ")"
- "(a)lpha [bravo [charlie]] [bravo]"
- ("3di[")
- "alpha [bravo [charlie]] [(])")
- (evil-test-buffer
-"[#]include \"stdlib.h\"
-main(argc, argv) char **argv; {
- while (1) malloc(0);
-}"
- ("ci{ return 0;" [escape])
-"#include \"stdlib.h\"
-main(argc, argv) char **argv; {
- return 0[;]
-}")))
-
-;;; Core
-
-(ert-deftest evil-test-initial-state ()
- "Test `evil-initial-state'"
- :tags '(evil core)
- ;; FIXME: These have a global effect, so better move them out and give them
- ;; a proper namespace prefix.
- (define-derived-mode test-1-mode prog-mode "Test1")
- (define-derived-mode test-2-mode test-1-mode "Test2")
- (evil-set-initial-state 'test-1-mode 'insert)
- (ert-info ("Check default state")
- (should (eq (evil-initial-state 'prog-mode 'normal) 'normal)))
- (ert-info ("Basic functionality 1")
- (should (eq (evil-initial-state 'test-1-mode) 'insert)))
- (ert-info ("Basic functionality 2")
- (evil-test-buffer
- "abc\ndef\n"
- (test-1-mode)
- (should (eq evil-state 'insert))))
- (ert-info ("Inherit initial state from a parent")
- (evil-test-buffer
- "abc\ndef\n"
- (test-2-mode)
- (should (eq evil-state 'insert))))
- (evil-set-initial-state 'test-1-mode nil)
- (ert-info ("Check for inheritance loops")
- (evil-test-buffer
- "abc\ndef\n"
- (unwind-protect
- (let ((major-mode 'test-2-mode))
- (put 'test-1-mode 'derived-mode-parent 'test-2-mode)
- ;; avoid triggering all of the hooks here, some of which might get
- ;; caught in loops depending on the environment. settings major-mode
- ;; is sufficient for `evil-initial-state-for-buffer' to work.
- (should-error (evil-initial-state-for-buffer)))
- (put 'test-1-mode 'derived-mode-parent 'prog-mode))))
- ;; FIXME: Same as above.
- (defalias 'test-1-alias-mode #'test-1-mode)
- (define-derived-mode test-3-mode test-1-alias-mode "Test3")
- (evil-set-initial-state 'test-1-mode 'insert)
- (ert-info ("Check inheritance from major mode aliases")
- "abc\ndef\n"
- (test-3-mode)
- (should (eq evil-state 'insert))))
-
-(ert-deftest evil-test-keep-input-method ()
- "Test that the input method is preserved when changing the major mode."
- :tags '(evil core input-method)
- (cl-flet ((use-german-input-method () (set-input-method "german-prefix")))
- (unwind-protect
- (progn
- (add-hook 'text-mode-hook #'use-german-input-method)
- (evil-test-buffer
- "[]"
- (should (null evil-input-method))
- ("a\"a" [escape])
- "\"[a]"
- (text-mode)
- (should (equal evil-input-method "german-prefix"))
- ("a\"a" [escape])
- "\"a[ä]"
- (emacs-lisp-mode)
- (should (equal evil-input-method "german-prefix"))))
- (remove-hook 'text-mode-hook #'use-german-input-method))))
-
-(ert-deftest evil-retab ()
- "Test the :retab command"
- :tags '(evil)
- (ert-info ("From tabs to spaces")
- (evil-test-buffer
- "def foo():\n\twhile True:\n\t\treturn\n"
- (setq indent-tabs-mode nil)
- (setq tab-width 4)
- (":retab" [return])
- "def foo():\n while True:\n return\n"))
- (ert-info ("From spaces to tabs")
- (evil-test-buffer
- "def foo():\n while True:\n return\n"
- (setq indent-tabs-mode t)
- (setq tab-width 4)
- (":retab" [return])
- "def foo():\n\twhile True:\n\t\treturn\n"))
- (ert-info ("Specify tab width as an argument")
- (evil-test-buffer
- "def foo():\n\twhile True:\n\t\treturn\n"
- (setq indent-tabs-mode nil)
- (setq tab-width 4)
- (":retab 2" [return])
- "def foo():\n while True:\n return\n"))
- (ert-info ("Invalid argument")
- (evil-test-buffer
- "def foo():\n\twhile True:\n\t\treturn\n"
- (should-error (execute-kbd-macro ":retab foo" [return])))))
-
-(ert-deftest evil-retab-visual ()
- "Test the :retab command on visual line selection.
-This test fails in the batch mode (and therefore in the GitHub CI)
-but it works fine in `M-x ert-run-tests-interactively'."
- :tags '(evil visual)
- (skip-unless (not noninteractive))
- (ert-info ("Retab only selected lines")
- (evil-test-buffer
- "def foo():\n\twhile True:\n\t\treturn\n"
- (setq indent-tabs-mode nil)
- (setq tab-width 4)
- ("Vj" ":retab" [return])
- "def foo():\n while True:\n\t\treturn\n")))
-
-(provide 'evil-tests)
-
-;;; evil-tests.el ends here