diff options
Diffstat (limited to 'test/lisp/emacs-lisp/regexp-opt-tests.el')
-rw-r--r-- | test/lisp/emacs-lisp/regexp-opt-tests.el | 89 |
1 files changed, 84 insertions, 5 deletions
diff --git a/test/lisp/emacs-lisp/regexp-opt-tests.el b/test/lisp/emacs-lisp/regexp-opt-tests.el index 1fc49909d3e..3658964faac 100644 --- a/test/lisp/emacs-lisp/regexp-opt-tests.el +++ b/test/lisp/emacs-lisp/regexp-opt-tests.el @@ -1,4 +1,4 @@ -;;; regexp-tests.el --- Test suite for regular expression handling. +;;; regexp-opt-tests.el --- Tests for regexp-opt.el -*- lexical-binding: t -*- ;; Copyright (C) 2013-2019 Free Software Foundation, Inc. @@ -25,9 +25,88 @@ (require 'regexp-opt) -(ert-deftest regexp-test-regexp-opt () - "Test the `compilation-error-regexp-alist' regexps. -The test data is in `compile-tests--test-regexps-data'." - (should (string-match (regexp-opt-charset '(?^)) "a^b"))) +(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)) + "[7A-Da-d]")) + (should (equal (regexp-opt-charset '(?a)) "a")) + + (should (equal (regexp-opt-charset '(?^)) "\\^")) + (should (equal (regexp-opt-charset '(?-)) "-")) + (should (equal (regexp-opt-charset '(?\])) "]")) + (should (equal (regexp-opt-charset '(?^ ?\])) "[]^]")) + (should (equal (regexp-opt-charset '(?^ ?-)) "[-^]")) + (should (equal (regexp-opt-charset '(?- ?\])) "[]-]")) + (should (equal (regexp-opt-charset '(?- ?\] ?^)) "[]^-]")) + + (should (equal (regexp-opt-charset '(?^ ?a)) "[a^]")) + (should (equal (regexp-opt-charset '(?- ?a)) "[a-]")) + (should (equal (regexp-opt-charset '(?\] ?a)) "[]a]")) + (should (equal (regexp-opt-charset '(?^ ?\] ?a)) "[]a^]")) + (should (equal (regexp-opt-charset '(?^ ?- ?a)) "[a^-]")) + (should (equal (regexp-opt-charset '(?- ?\] ?a)) "[]a-]")) + (should (equal (regexp-opt-charset '(?- ?\] ?^ ?a)) "[]a^-]")) + + (should (equal (regexp-opt-charset '()) regexp-unmatchable))) ;;; regexp-tests.el ends here. |