aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorArtur Malabarba2015-12-04 15:12:10 +0000
committerArtur Malabarba2015-12-04 15:12:34 +0000
commit30f3432e9519f61882faa303e7851e761d2d18ea (patch)
treefbb216d979d5c7af77f4c4018ab4c4bf06b2a85e /test
parent3a9df7589ae189fc34a5fab98e82d85d2d40433f (diff)
downloademacs-30f3432e9519f61882faa303e7851e761d2d18ea.tar.gz
emacs-30f3432e9519f61882faa303e7851e761d2d18ea.zip
* lisp/character-fold.el: Remove special case-folding support
(character-fold-to-regexp): Remove special code for case-folding. Char-fold search still respects the `case-fold-search' variable (i.e., f matches F). This only removes the code that was added to ensure that f also matched all chars that F matched. For instance, after this commit, f no longer matches 𝔽. This was necessary because the logic created a regexp with 2^(length of the string) redundant paths. So, when a very long string "almost" matched, Emacs took a very long time to figure out that it didn't. This became particularly relevant because isearch's lazy-highlight does a search bounded by (1- match-end) (which, in most circumstances, is a search that almost matches). A recipe for this can be found in bug#22090.
Diffstat (limited to 'test')
-rw-r--r--test/automated/character-fold-tests.el21
1 files changed, 21 insertions, 0 deletions
diff --git a/test/automated/character-fold-tests.el b/test/automated/character-fold-tests.el
index 40735e5df7f..4e8761e6f7b 100644
--- a/test/automated/character-fold-tests.el
+++ b/test/automated/character-fold-tests.el
@@ -98,6 +98,27 @@
98 ;; (character-fold--test-match-exactly "a12" "xxyy") 98 ;; (character-fold--test-match-exactly "a12" "xxyy")
99 )) 99 ))
100 100
101(ert-deftest character-fold--speed-test ()
102 (dolist (string (append '("tty-set-up-initial-frame-face"
103 "tty-set-up-initial-frame-face-frame-faceframe-faceframe-faceframe-face")
104 (mapcar #'character-fold--random-word '(10 50 100
105 50 100))))
106 (message "Testing %s" string)
107 ;; Make sure we didn't just fallback on the trivial search.
108 (should-not (string= (regexp-quote string)
109 (character-fold-to-regexp string)))
110 (with-temp-buffer
111 (save-excursion (insert string))
112 (let ((time (time-to-seconds (current-time))))
113 ;; Our initial implementation of case-folding in char-folding
114 ;; created a lot of redundant paths in the regexp. Because of
115 ;; that, if a really long string "almost" matches, the regexp
116 ;; engine took a long time to realise that it doesn't match.
117 (should-not (character-fold-search-forward (concat string "c") nil 'noerror))
118 ;; Ensure it took less than a second.
119 (should (< (- (time-to-seconds (current-time))
120 time)
121 1))))))
101 122
102(provide 'character-fold-tests) 123(provide 'character-fold-tests)
103;;; character-fold-tests.el ends here 124;;; character-fold-tests.el ends here