(Assert (string-match "^\\(Ä\\)\\1$" "ÄÄ"))
(Assert (not (string-match "^\\(Ä\\)\\1$" "Ää"))))
+;; multiple-match
+;; Thanks to Manfred Bartz <MBartz@xix.com>
+;; c.e.x <vn4rkkm7ouf3b5@corp.supernews.com>
+;; #### Need to do repetitions of more complex regexps
+;; #### WASH ME!
+(with-temp-buffer
+ (Assert (not (string-match "^a\\{4,4\\}$" "aaa")))
+ (Assert (string-match "^a\\{4,4\\}$" "aaaa"))
+ (Assert (not (string-match "^a\\{4,4\\}$" "aaaaa")))
+ (Assert (not (string-match "^[a]\\{4,4\\}$" "aaa")))
+ (Assert (string-match "^[a]\\{4,4\\}$" "aaaa"))
+ (Assert (not (string-match "^[a]\\{4,4\\}$" "aaaaa")))
+ (Assert (not (string-match "^\\(a\\)\\{4,4\\}$" "aaa")))
+ (Assert (string-match "^\\(a\\)\\{4,4\\}$" "aaaa"))
+ (Assert (not (string-match "^\\(a\\)\\{4,4\\}$" "aaaaa")))
+ ;; Use class because repetition of single char broken in 21.5.15
+ (Assert (not (string-match "^[a]\\{3,5\\}$" "aa")))
+ (Assert (string-match "^[a]\\{3,5\\}$" "aaa"))
+ (Assert (string-match "^[a]\\{3,5\\}$" "aaaa"))
+ (Assert (string-match "^[a]\\{3,5\\}$" "aaaaa"))
+ (Assert (not (string-match "^[a]\\{3,5\\}$" "aaaaaa")))
+ (insert "\
+aa
+aaa
+aaaa
+aaaaa
+aaaaaa
+baaaa
+")
+ (goto-char (point-min))
+ (forward-line 1)
+ (Assert (not (looking-at "^a\\{4,4\\}$")))
+ (forward-line 1)
+ (Assert (looking-at "^a\\{4,4\\}$"))
+ (forward-line 1)
+ (Assert (not (looking-at "^a\\{4,4\\}$")))
+ (goto-char (point-min))
+ (forward-line 1)
+ (Assert (not (looking-at "^[a]\\{4,4\\}$")))
+ (forward-line 1)
+ (Assert (looking-at "^[a]\\{4,4\\}$"))
+ (forward-line 1)
+ (Assert (not (looking-at "^[a]\\{4,4\\}$")))
+ (goto-char (point-min))
+ (forward-line 1)
+ (Assert (not (looking-at "^\\(a\\)\\{4,4\\}$")))
+ (forward-line 1)
+ (Assert (looking-at "^\\(a\\)\\{4,4\\}$"))
+ (forward-line 1)
+ (Assert (not (looking-at "^\\(a\\)\\{4,4\\}$")))
+ ;; Use class because repetition of single char broken in 21.5.15
+ (goto-char (point-min))
+ (Assert (not (looking-at "^[a]\\{3,5\\}$")))
+ (forward-line 1)
+ (Assert (looking-at "^[a]\\{3,5\\}$"))
+ (forward-line 1)
+ (Assert (looking-at "^[a]\\{3,5\\}$"))
+ (forward-line 1)
+ (Assert (looking-at "^[a]\\{3,5\\}$"))
+ (forward-line 1)
+ (Assert (not (looking-at "^[a]\\{3,5\\}$")))
+ (goto-char (point-min))
+ (Assert (= 12 (re-search-forward "a\\{4,4\\}")))
+ (goto-char (point-min))
+ (Assert (= 12 (re-search-forward "b?a\\{4,4\\}")))
+ (goto-char (point-min))
+ (Assert (= 31 (re-search-forward "ba\\{4,4\\}")))
+ (goto-char (point-min))
+ (Assert (= 31 (re-search-forward "[b]a\\{4,4\\}")))
+ (goto-char (point-min))
+ (Assert (= 31 (re-search-forward "\\(b\\)a\\{4,4\\}")))
+ (goto-char (point-min))
+ (Assert (= 12 (re-search-forward "^a\\{4,4\\}")))
+ (goto-char (point-min))
+ (Assert (= 12 (re-search-forward "^a\\{4,4\\}$")))
+ (goto-char (point-min))
+ (Assert (= 12 (re-search-forward "[a]\\{4,4\\}")))
+ (goto-char (point-min))
+ (Assert (= 12 (re-search-forward "^[a]\\{4,4\\}")))
+ (goto-char (point-min))
+ (Assert (= 12 (re-search-forward "^[a]\\{4,4\\}$")))
+ )
+
;; charset, charset_not
;; Not called because it takes too much time.
(defun test-regexp-charset-paranoid ()
(Assert (not (string-match "\\> " " ")))
(Assert (not (string-match "a\\<" "a")))
(Assert (not (string-match "\\>a" "a")))
-;; Expect these to fail :-(
-;; Added Known-Bug 2002-09-09
+;; Added Known-Bug 2002-09-09 sjt
+;; These are now fixed 2003-03-21 sjt
(Assert (not (string-match "\\b" "")))
(Assert (not (string-match " \\b" " ")))
(Assert (not (string-match "\\b " " ")))
(Assert (not (string-match "@[A]" (string ?@ ch1))))
(Assert (eq (string-match "@[^A]" (string ?@ ch1)) 0))
(Assert (not (string-match "@?A" (string ?@ ch1))))))
+
+;; More stale match data tests.
+;; Thanks to <bjacob@ca.metsci.com> for drawing attention to this issue.
+;; Flying in the face of sanity, the Asserts with positive results below are
+;; correct. Too much code depends on failed matches preserving match-data.
+(let ((a "a"))
+ (Assert (string= (progn (string-match "a" a)
+ (string-match "b" a)
+ (match-string 0 a))
+ a))
+ (Assert (not (progn (string-match "a" a)
+ (string-match "b" a)
+ (match-string 1 a))))
+ ;; test both for the second match is a plain string match and a regexp match
+ (Assert (string= (progn (string-match "\\(a\\)" a)
+ (string-match "\\(b\\)" a)
+ (match-string 0 a))
+ a))
+ (Assert (string= (progn (string-match "\\(a\\)" a)
+ (string-match "b" a)
+ (match-string 0 a))
+ a))
+ (Assert (string= (progn (string-match "\\(a\\)" a)
+ (string-match "\\(b\\)" a)
+ (match-string 1 a))
+ a))
+ (Assert (string= (progn (string-match "\\(a\\)" a)
+ (string-match "b" a)
+ (match-string 1 a))
+ a)))
+
+;; bug identified by Katsumi Yamaoka 2004-09-03 <b9ywtzbbpue.fsf_-_@jpl.org>
+;; fix submitted by sjt 2004-09-08
+;; trailing comments are values from buggy 21.4.15
+(let ((text "abc"))
+ (Assert (eq 0 (string-match "\\(?:ab+\\)*c" text))) ; 2
+ (Assert (eq 0 (string-match "^\\(?:ab+\\)*c" text))) ; nil
+ (Assert (eq 0 (string-match "^\\(?:ab+\\)*" text))) ; 0
+ (Assert (eq 0 (string-match "^\\(?:ab+\\)c" text))) ; 0
+ (Assert (eq 0 (string-match "^\\(?:ab\\)*c" text))) ; 0
+ (Assert (eq 0 (string-match "^\\(?:a+\\)*b" text))) ; nil
+ (Assert (eq 0 (string-match "^\\(?:a\\)*b" text))) ; 0
+)
+
+;; per Steve Youngs 2004-09-30 <microsoft-free.87ekkjhj7t.fsf@youngs.au.com>
+;; fix submitted by sjt 2004-10-07
+;; trailing comments are values from buggy 21.4.pre16
+(let ((text "abc"))
+ (Assert (eq 0 (string-match "\\(?:a\\(b\\)\\)" text))) ; 0
+ (Assert (string= (match-string 1 text) "b")) ; ab
+ (Assert (null (match-string 2 text))) ; b
+ (Assert (null (match-string 3 text))) ; nil
+ (Assert (eq 0 (string-match "\\(?:a\\(?:b\\(c\\)\\)\\)" text))) ; 0
+ (Assert (string= (match-string 1 text) "c")) ; abc
+ (Assert (null (match-string 2 text))) ; ab
+ (Assert (null (match-string 3 text))) ; c
+ (Assert (null (match-string 4 text))) ; nil
+)
+
+;; trivial subpatterns and backreferences with shy groups
+(let ((text1 "abb")
+ (text2 "aba")
+ (re0 "\\(a\\)\\(b\\)\\2")
+ (re1 "\\(?:a\\)\\(b\\)\\2")
+ (re2 "\\(?:a\\)\\(b\\)\\1")
+ (re3 "\\(a\\)\\(?:b\\)\\1"))
+
+ (Assert (eq 0 (string-match re0 text1)))
+ (Assert (string= text1 (match-string 0 text1)))
+ (Assert (string= "a" (match-string 1 text1)))
+ (Assert (string= "b" (match-string 2 text1)))
+ (Assert (null (string-match re0 text2)))
+
+ (Check-Error-Message 'invalid-regexp "Invalid back reference"
+ (string-match re1 text1))
+
+ (Assert (eq 0 (string-match re2 text1)))
+ (Assert (string= text1 (match-string 0 text1)))
+ (Assert (string= "b" (match-string 1 text1)))
+ (Assert (null (match-string 2 text1)))
+ (Assert (null (string-match re2 text2)))
+
+ (Assert (null (string-match re3 text1)))
+ (Assert (eq 0 (string-match re3 text2)))
+ (Assert (string= text2 (match-string 0 text2)))
+ (Assert (string= "a" (match-string 1 text2)))
+ (Assert (null (match-string 2 text2)))
+
+ ;; Test Arnaud Giersch's shy group fix
+ (Assert (progn (string-match "\\(a\\)" "a")
+ (string-match "\\(?:a\\)" "a")
+ (not (match-beginning 1))))
+)
+
+
+;; empty string at point
+;; Thanks Julian Bradford on XEmacs Beta
+;; <18652.54975.894512.880956@krk.inf.ed.ac.uk>
+(with-string-as-buffer-contents "aáa"
+ (goto-char (point-min))
+ (Assert (looking-at "\\="))
+ (Assert (= (re-search-forward "\\=") 1))
+ (forward-char 1)
+ (Assert (looking-at "\\="))
+ (Assert (= (re-search-forward "\\=") 2))
+ (forward-char 1)
+ (Assert (looking-at "\\="))
+ (Assert (= (re-search-forward "\\=") 3))
+ (forward-char 1)
+ (Assert (looking-at "\\="))
+ (Assert (= (re-search-forward "\\=") 4)))