mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-01-03 10:31:37 -08:00
Optimise more inputs to `regexp-opt' (bug#36444)
Use a more precise test to determine whether the input to `regexp-opt'
is safe to optimise when KEEP-ORDER is non-nil, permitting more inputs
to be optimised than before. For example, ("good" "goal" "go") is now
accepted.
* lisp/emacs-lisp/regexp-opt.el (regexp-opt):
More precise test for whether the list is safe w.r.t. KEEP-ORDER.
(regexp-opt--contains-prefix): Remove.
* test/lisp/emacs-lisp/regexp-opt-tests.el: Use lexical-binding.
(regexp-opt-test--permutation, regexp-opt-test--factorial)
(regexp-opt-test--permutations, regexp-opt-test--match-all)
(regexp-opt-test--check-perm, regexp-opt-test--explain-perm)
(regexp-opt-keep-order): Test KEEP-ORDER.
This commit is contained in:
parent
2bc90e0ce0
commit
3fd7491512
2 changed files with 83 additions and 25 deletions
|
|
@ -1,4 +1,4 @@
|
|||
;;; regexp-opt-tests.el --- Tests for regexp-opt.el
|
||||
;;; regexp-opt-tests.el --- Tests for regexp-opt.el -*- lexical-binding: t -*-
|
||||
|
||||
;; Copyright (C) 2013-2019 Free Software Foundation, Inc.
|
||||
|
||||
|
|
@ -25,6 +25,66 @@
|
|||
|
||||
(require 'regexp-opt)
|
||||
|
||||
(defun regexp-opt-test--permutation (n list)
|
||||
"The Nth permutation of LIST, 0 ≤ N < (length LIST)!."
|
||||
(let ((len (length list))
|
||||
(perm-list nil))
|
||||
(dotimes (i len)
|
||||
(let* ((d (- len i))
|
||||
(k (mod n d)))
|
||||
(push (nth k list) perm-list)
|
||||
(setq list (append (butlast list (- (length list) k))
|
||||
(nthcdr (1+ k) list)))
|
||||
(setq n (/ n d))))
|
||||
(nreverse perm-list)))
|
||||
|
||||
(defun regexp-opt-test--factorial (n)
|
||||
"N!"
|
||||
(apply #'* (number-sequence 1 n)))
|
||||
|
||||
(defun regexp-opt-test--permutations (list)
|
||||
"All permutations of LIST."
|
||||
(mapcar (lambda (i) (regexp-opt-test--permutation i list))
|
||||
(number-sequence 0 (1- (regexp-opt-test--factorial (length list))))))
|
||||
|
||||
(defun regexp-opt-test--match-all (words re)
|
||||
(mapcar (lambda (w) (and (string-match re w)
|
||||
(match-string 0 w)))
|
||||
words))
|
||||
|
||||
(defun regexp-opt-test--check-perm (perm)
|
||||
(let* ((ref-re (mapconcat #'regexp-quote perm "\\|"))
|
||||
(opt-re (regexp-opt perm nil t))
|
||||
(ref (regexp-opt-test--match-all perm ref-re))
|
||||
(opt (regexp-opt-test--match-all perm opt-re)))
|
||||
(equal opt ref)))
|
||||
|
||||
(defun regexp-opt-test--explain-perm (perm)
|
||||
(let* ((ref-re (mapconcat #'regexp-quote perm "\\|"))
|
||||
(opt-re (regexp-opt perm nil t))
|
||||
(ref (regexp-opt-test--match-all perm ref-re))
|
||||
(opt (regexp-opt-test--match-all perm opt-re)))
|
||||
(concat "\n"
|
||||
(format "Naïve regexp: %s\n" ref-re)
|
||||
(format "Optimised regexp: %s\n" opt-re)
|
||||
(format "Got: %s\n" opt)
|
||||
(format "Expected: %s\n" ref))))
|
||||
|
||||
(put 'regexp-opt-test--check-perm 'ert-explainer 'regexp-opt-test--explain-perm)
|
||||
|
||||
(ert-deftest regexp-opt-keep-order ()
|
||||
"Check that KEEP-ORDER works."
|
||||
(dolist (perm (regexp-opt-test--permutations '("abc" "bca" "cab")))
|
||||
(should (regexp-opt-test--check-perm perm)))
|
||||
(dolist (perm (regexp-opt-test--permutations '("abc" "ab" "bca" "bc")))
|
||||
(should (regexp-opt-test--check-perm perm)))
|
||||
(dolist (perm (regexp-opt-test--permutations '("abxy" "cdxy")))
|
||||
(should (regexp-opt-test--check-perm perm)))
|
||||
(dolist (perm (regexp-opt-test--permutations '("afgx" "bfgx" "afgy" "bfgy")))
|
||||
(should (regexp-opt-test--check-perm perm)))
|
||||
(dolist (perm (regexp-opt-test--permutations '("a" "ab" "ac" "abc")))
|
||||
(should (regexp-opt-test--check-perm perm))))
|
||||
|
||||
(ert-deftest regexp-opt-charset ()
|
||||
(should (equal (regexp-opt-charset '(?a ?b ?a)) "[ab]"))
|
||||
(should (equal (regexp-opt-charset '(?D ?d ?B ?a ?b ?C ?7 ?a ?c ?A))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue