summaryrefslogtreecommitdiff
path: root/test/automated
diff options
context:
space:
mode:
authorArtur Malabarba <bruce.connor.am@gmail.com>2015-12-04 15:12:10 +0000
committerArtur Malabarba <bruce.connor.am@gmail.com>2015-12-04 15:12:34 +0000
commit30f3432e9519f61882faa303e7851e761d2d18ea (patch)
treefbb216d979d5c7af77f4c4018ab4c4bf06b2a85e /test/automated
parent3a9df7589ae189fc34a5fab98e82d85d2d40433f (diff)
downloademacs-30f3432e9519f61882faa303e7851e761d2d18ea.tar.gz
emacs-30f3432e9519f61882faa303e7851e761d2d18ea.tar.bz2
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/automated')
-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 @@
;; (character-fold--test-match-exactly "a12" "xxyy")
))
+(ert-deftest character-fold--speed-test ()
+ (dolist (string (append '("tty-set-up-initial-frame-face"
+ "tty-set-up-initial-frame-face-frame-faceframe-faceframe-faceframe-face")
+ (mapcar #'character-fold--random-word '(10 50 100
+ 50 100))))
+ (message "Testing %s" string)
+ ;; Make sure we didn't just fallback on the trivial search.
+ (should-not (string= (regexp-quote string)
+ (character-fold-to-regexp string)))
+ (with-temp-buffer
+ (save-excursion (insert string))
+ (let ((time (time-to-seconds (current-time))))
+ ;; Our initial implementation of case-folding in char-folding
+ ;; created a lot of redundant paths in the regexp. Because of
+ ;; that, if a really long string "almost" matches, the regexp
+ ;; engine took a long time to realise that it doesn't match.
+ (should-not (character-fold-search-forward (concat string "c") nil 'noerror))
+ ;; Ensure it took less than a second.
+ (should (< (- (time-to-seconds (current-time))
+ time)
+ 1))))))
(provide 'character-fold-tests)
;;; character-fold-tests.el ends here