diff options
Diffstat (limited to 'test/lisp/replace-tests.el')
-rw-r--r-- | test/lisp/replace-tests.el | 111 |
1 files changed, 104 insertions, 7 deletions
diff --git a/test/lisp/replace-tests.el b/test/lisp/replace-tests.el index fa28789da99..23ec24840fb 100644 --- a/test/lisp/replace-tests.el +++ b/test/lisp/replace-tests.el @@ -378,7 +378,7 @@ Each element has the format: (goto-char (point-min)) (should (string-match "\\`2 matches for \"and\" in buffer: " (buffer-substring-no-properties - (point) (line-end-position))))))) + (point) (pos-eol))))))) (and (buffer-name temp-buffer) (kill-buffer temp-buffer))))) @@ -401,11 +401,107 @@ Each element has the format: (goto-char (point-min)) (should (string-match "\\`2 matches for \"and\" in buffer: " (buffer-substring-no-properties - (point) (line-end-position))))))) + (point) (pos-eol))))))) (and (buffer-name temp-buffer) (kill-buffer temp-buffer))))) +;;; General tests for `query-replace' and `query-replace-regexp'. + +(defconst query-replace-tests + '( + ;; query-replace + ("aaa" "M-% a RET 1 RET !" "111") + ("aaa" "M-% a RET 1 RET y n y" "1a1") + ;; Empty inputs + ("aaa" "M-% a RET RET !" "") + ("aaa" "M-% RET 1 RET !" "1a1a1a") + ("aaa" "M-% RET RET !" "aaa") + ;; Reuse the previous default + ("aaa" "M-% a RET 1 RET . M-% RET !" "111") + + ;; query-replace-regexp + ("aaa" "C-M-% a* RET 1 RET !" "1") + ;; Empty inputs + ("aaa" "C-M-% a* RET RET !" "") + ("aaa" "C-M-% RET 1 RET !" "1a1a1a") + ("aaa" "C-M-% RET RET !" "aaa") + ;; Empty matches + ("aaa" "C-M-% b* RET 1 RET !" "1a1a1a") + ;; Complete matches + ("aaa" "C-M-% .* RET 1 RET !" "1") + ;; Adjacent non-empty matches + ("abaab" "C-M-% ab* RET 12 RET !" "121212") + ;; Adjacent non-empty and empty matches + ("abab" "C-M-% a* RET 1 RET !" "1b1b") + ("abab" "C-M-% b* RET 1 RET !" "1a1a1") + ;; Test case from commit 5632eb272c7 + ("a a a " "C-M-% \\ba SPC RET c RET !" "ccc") ; not "ca c" + )) + +(defun query-replace--run-tests (tests) + (with-temp-buffer + (save-window-excursion + ;; `execute-kbd-macro' is applied to window only + (set-window-buffer nil (current-buffer)) + (dolist (case tests) + ;; Ensure empty input means empty string to replace: + (setq query-replace-defaults nil) + (delete-region (point-min) (point-max)) + (insert (nth 0 case)) + (goto-char (point-min)) + (execute-kbd-macro (kbd (nth 1 case))) + (should (equal (buffer-string) (nth 2 case))))))) + +(ert-deftest query-replace-tests () + (query-replace--run-tests query-replace-tests)) + +(ert-deftest query-replace-search-function-tests () + (let* ((replace-re-search-function #'re-search-forward)) + (query-replace--run-tests query-replace-tests)) + + (let* ((pairs '((1 . 2) (3 . 4))) + (replace-re-search-function + (lambda (string &optional _bound noerror count) + (let (found) + (while (and (not found) pairs) + (goto-char (caar pairs)) + (when (re-search-forward string (cdar pairs) noerror count) + (setq found t)) + (pop pairs)) + found))) + (tests + '( + ;; FIXME: this test should pass after fixing bug#54733: + ;; ("aaaa" "C-M-% .* RET 1 RET !" "1a1a") + ))) + (query-replace--run-tests tests))) + + +;;; General tests for `perform-replace'. + +(defconst perform-replace-tests + '( + ;; Test case from commit 5632eb272c7 + ("a a a " "\\ba " "c" nil t nil nil nil nil nil nil nil "ccc") ; not "ca c" + ;; The same with region inside the second match + ;; FIXME: this test should pass after fixing bug#54733: + ;; ("a a a " "\\ba " "c" nil t nil nil nil 1 4 nil nil "ca a ") + )) + +(defun perform-replace--run-tests (tests) + (with-temp-buffer + (dolist (case tests) + (delete-region (point-min) (point-max)) + (insert (pop case)) + (goto-char (point-min)) + (apply 'perform-replace (butlast case)) + (should (equal (buffer-string) (car (last case))))))) + +(ert-deftest perform-replace-tests () + (perform-replace--run-tests perform-replace-tests)) + + ;;; Tests for `query-replace' undo feature. (defvar replace-tests-bind-read-string nil @@ -599,11 +695,12 @@ bound to HIGHLIGHT-LOCUS." (with-temp-buffer (insert before) (goto-char (point-min)) - (replace-regexp - "\\(\\(L\\)\\|\\(R\\)\\)" - '(replace-eval-replacement - replace-quote - (if (match-string 2) "R" "L"))) + (with-suppressed-warnings ((interactive-only replace-regexp)) + (replace-regexp + "\\(\\(L\\)\\|\\(R\\)\\)" + '(replace-eval-replacement + replace-quote + (if (match-string 2) "R" "L")))) (should (equal (buffer-string) after))))) (ert-deftest test-count-matches () |