+
+;; Test replace-match
+(with-temp-buffer
+ (insert "This is a test buffer.")
+ (goto-char (point-min))
+ (search-forward "this is a test ")
+ (looking-at "Unmatchable text")
+ (replace-match "")
+ (Assert (looking-at "^buffer.$")))
+
+;; Test that trivial regexps reset unused registers
+;; Thanks to Martin Sternholm for the report.
+;; xemacs-beta <5blm6h2ki5.fsf@lister.roxen.com>
+(with-temp-buffer
+ (insert "ab")
+ (goto-char (point-min))
+ (re-search-forward "\\(a\\)")
+ ;; test the whole-match data, too -- one try scotched that, too!
+ (Assert (string= (match-string 0) "a"))
+ (Assert (string= (match-string 1) "a"))
+ (re-search-forward "b")
+ (Assert (string= (match-string 0) "b"))
+ (Assert (not (match-string 1))))
+
+;; Test word boundaries
+(Assert (= (string-match " \\<a" " a") 0))
+(Assert (= (string-match "a\\> " "a ") 0))
+(Assert (= (string-match " \\ba" " a") 0))
+(Assert (= (string-match "a\\b " "a ") 0))
+(Assert (= (string-match "\\ba" " a") 1))
+(Assert (= (string-match "a\\b" "a ") 0))
+;; should work at target boundaries
+(Assert (= (string-match "\\<a" "a") 0))
+(Assert (= (string-match "a\\>" "a") 0))
+(Assert (= (string-match "\\ba" "a") 0))
+(Assert (= (string-match "a\\b" "a") 0))
+;; but not if the "word" would be on the null side of the boundary!
+(Assert (not (string-match "\\<" "")))
+(Assert (not (string-match "\\>" "")))
+(Assert (not (string-match " \\<" " ")))
+(Assert (not (string-match "\\> " " ")))
+(Assert (not (string-match "a\\<" "a")))
+(Assert (not (string-match "\\>a" "a")))
+;; 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 " " ")))
+
+;; Added 2002-12-27
+(if (featurep 'mule)
+ ;; note: (int-to-char 65) => ?A
+ (let ((ch0 (make-char 'japanese-jisx0208 52 65))
+ (ch1 (make-char 'japanese-jisx0208 51 65)))
+ (Assert (not (string-match "A" (string ch0))))
+ (Assert (not (string-match "[A]" (string ch0))))
+ (Assert (eq (string-match "[^A]" (string ch0)) 0))
+ (Assert (not (string-match "@A" (string ?@ ch0))))
+ (Assert (not (string-match "@[A]" (string ?@ ch0))))
+ (Assert (eq (string-match "@[^A]" (string ?@ ch0)) 0))
+ (Assert (not (string-match "@?A" (string ?@ ch0))))
+ (Assert (not (string-match "A" (string ch1))))
+ (Assert (not (string-match "[A]" (string ch1))))
+ (Assert (eq (string-match "[^A]" (string ch1)) 0))
+ (Assert (not (string-match "@A" (string ?@ ch1))))
+ (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)))