Mercurial > hg > xemacs-beta
view tests/automated/regexp-tests.el @ 4477:e34711681f30
Don't determine whether to call general device-type code at startup,
rather decide in the device-specific code itself.
lisp/ChangeLog addition:
2008-07-07 Aidan Kehoe <kehoea@parhasard.net>
Patch to make it up to the device-specific code whether
various Lisp functions should be called during device creation,
not relying on the startup code to decide this. Also, rename
initial-window-system to initial-device-type (which makes more
sense in this scheme), always set it.
* startup.el (command-line):
Use initial-device-type, not initial-window-system; just call
#'make-device, leave the special behaviour to be done the first
time a console type is initialised to be decided on by the
respective console code.
* x-init.el (x-app-defaults-directory): Declare that it should be
bound.
(x-define-dead-key): Have the macro take a DEVICE argument.
(x-initialize-compose): Have the function take a DEVICE argument,
and use it when checking if various keysyms are available on the
keyboard.
(x-initialize-keyboard): Have the function take a DEVICE argument,
allowing device-specific keyboard initialisation.
(make-device-early-x-entry-point-called-p): New.
(make-device-late-x-entry-point-called-p): New. Rename
pre-x-win-initted, x-win-initted.
(make-device-early-x-entry-point): Rename init-pre-x-win, take the
call to make-x-device out (it should be called from the
device-creation code, not vice-versa).
(make-device-late-x-entry-point): Rename init-post-x-win, have it
take a DEVICE argument, use that DEVICE argument when working out
what device-specific things need doing. Don't use
create-console-hook in core code.
* x-win-xfree86.el (x-win-init-xfree86): Take a DEVICE argument;
use it.
* x-win-sun.el (x-win-init-sun): Take a DEVICE argument; use it.
* mule/mule-x-init.el: Remove #'init-mule-x-win, an empty
function.
* tty-init.el (make-device-early-tty-entry-point-called-p): New.
Rename pre-tty-win-initted.
(make-device-early-tty-entry-point): New.
Rename init-pre-tty-win.
(make-frame-after-init-entry-point): New.
Rename init-post-tty-win to better reflect when it's called.
* gtk-init.el (gtk-early-lisp-options-file): New.
Move this path to a documented variable.
(gtk-command-switch-alist): Wrap the docstring to fewer than 79
columns.
(make-device-early-gtk-entry-point-called-p): New.
(make-device-late-gtk-entry-point-called-p): New.
Renamed gtk-pre-win-initted, gtk-post-win-initted to these.
(make-device-early-gtk-entry-point): New.
(make-device-late-gtk-entry-point): New.
Renamed init-pre-gtk-win, init-post-gtk-win to these.
Have make-device-late-gtk-entry-point take a device argument, and use
it; have make-device-early-gtk-entry-point load the GTK-specific
startup code, instead of doing that in C.
(init-gtk-win): Deleted, functionality moved to the GTK device
creation code.
(gtk-define-dead-key): Have it take a DEVICE argument; use this
argument.
(gtk-initialize-compose): Ditto.
* coding.el (set-terminal-coding-system):
Correct the docstring; the function isn't broken.
src/ChangeLog addition:
2008-07-07 Aidan Kehoe <kehoea@parhasard.net>
Patch to make it up to the device-specific code whether
various Lisp functions should be called during device creation,
not relying on the startup code to decide this. Also, rename
initial-window-system to initial-device-type (which makes more
sense in this scheme), always set it.
* redisplay.c (Vinitial_device_type): New.
(Vinitial_window_system): Removed.
Rename initial-window-system to initial-device type, making it
a stream if we're noninteractive. Update its docstring.
* device-x.c (Qmake_device_early_x_entry_point,
Qmake_device_late_x_entry_point): New.
Rename Qinit_pre_x_win, Qinit_post_x_win.
(x_init_device): Call #'make-device-early-x-entry-point earlier,
now we rely on it to find the application class and the
app-defaults directory.
(x_finish_init_device): Call #'make-device-late-x-entry-point with
the created device.
(Vx_app_defaults_directory): Always make this available, to
simplify code in x-init.el.
* device-tty.c (Qmake_device_early_tty_entry_point): New.
Rename Qinit_pre_tty_win, rename Qinit_post_tty_win and move to
frame-tty.c as Qmake_frame_after_init_entry_point.
(tty_init_device): Call #'make-device-early-tty-entry-point before
doing anything.
* frame-tty.c (Qmake_frame_after_init_entry_point): New.
* frame-tty.c (tty_after_init_frame): Have it call the
better-named #'make-frame-after-init-entry-point function
instead of #'init-post-tty-win (since it's called after frame, not
device, creation).
* device-msw.c (Qmake_device_early_mswindows_entry_point,
Qmake_device_late_mswindows_entry_point): New.
Rename Qinit_pre_mswindows_win, Qinit_post_mswindows_win.
(mswindows_init_device): Call
#'make-device-early-mswindows-entry-point here, instead of having
its predecessor call us.
(mswindows_finish_init_device): Call
#'make-device-early-mswindows-entry-point, for symmetry with the
other device types (though it's an empty function).
* device-gtk.c (Qmake_device_early_gtk_entry_point,
Qmake_device_late_gtk_entry_point): New.
Rename Qinit_pre_gtk_win, Qinit_post_gtk_win.
(gtk_init_device): Call #'make-device-early-gtk-entry-point; don't
load ~/.xemacs/gtk-options.el ourselves, leave that to lisp.
(gtk_finish_init_device): Call #'make-device-late-gtk-entry-point
with the created device as an argument.
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Wed, 09 Jul 2008 20:46:22 +0200 |
parents | 3660d327399f |
children | b82fdf7305ee |
line wrap: on
line source
;;; -*- coding: iso-8859-1 -*- ;; Copyright (C) 2000, 2002, 2003 Free Software Foundation, Inc. ;; Author: Yoshiki Hayashi <yoshiki@xemacs.org> ;; Maintainer: Stephen J. Turnbull <stephen@xemacs.org> ;; Created: 2000 ;; Keywords: tests ;; This file is part of XEmacs. ;; XEmacs is free software; you can redistribute it and/or modify it ;; under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; XEmacs is distributed in the hope that it will be useful, but ;; WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;; General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with XEmacs; see the file COPYING. If not, write to the Free ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA ;; 02111-1307, USA. ;;; Synched up with: Not in FSF. ;;; Commentary: ;; Test regular expression. (Check-Error-Message error "Trailing backslash" (string-match "\\" "a")) (Check-Error-Message error "Invalid preceding regular expression" (string-match "a++" "a")) (Check-Error-Message error "Invalid preceding regular expression" (string-match "a**" "a")) (Check-Error-Message error "Invalid preceding regular expression" (string-match "a???" "a")) (Check-Error-Message error "Unmatched \\[ or \\[^" (string-match "[" "a")) (Check-Error-Message error "Unmatched \\[ or \\[^" (string-match "[abc" "a")) (Check-Error-Message error "Unmatched ) or \\\\)" (string-match "\\)" "a")) (Check-Error-Message error "Invalid regular expression" (string-match "\\(?.\\)" "a")) (Check-Error-Message error "Unmatched \\\\{" (string-match "a\\{" "a")) (Check-Error-Message error "Invalid content of \\\\{\\\\}" (string-match "a\\{a\\}" "a")) ;; exactn ;; string-match (with-temp-buffer ;; case-insensitive (Assert (string-match "ä" "ä")) (Assert (string-match "ä" "Ä")) (Assert (string-match "Ä" "Ä")) (Assert (string-match "Ä" "ä")) ;; case-sensitive (setq case-fold-search nil) (Assert (string-match "ä" "ä")) (Assert (not (string-match "ä" "Ä"))) (Assert (string-match "Ä" "Ä")) (Assert (not (string-match "Ä" "ä")))) ;; looking-at (with-temp-buffer (insert "äÄ") ;; case-insensitive (goto-char (point-min)) (Assert (looking-at "ä")) (Assert (looking-at "Ä")) (forward-char) (Assert (looking-at "ä")) (Assert (looking-at "Ä")) ;; case-sensitive (setq case-fold-search nil) (goto-char (point-min)) (Assert (looking-at "ä")) (Assert (not (looking-at "Ä"))) (forward-char) (Assert (not (looking-at "ä"))) (Assert (looking-at "Ä"))) ;; re-search-forward and re-search-backward (with-temp-buffer (insert "äÄ") ;; case insensitive ;; forward (goto-char (point-min)) ;; Avoid trivial regexp. (Assert (eq 2 (re-search-forward "ä\\|a" nil t))) (goto-char (point-min)) (Assert (eq 2 (re-search-forward "Ä\\|a" nil t))) (goto-char (1+ (point-min))) (Assert (eq 3 (re-search-forward "ä\\|a" nil t))) (goto-char (1+ (point-min))) (Assert (eq 3 (re-search-forward "Ä\\|a" nil t))) ;; backward (goto-char (point-max)) (Assert (eq 2 (re-search-backward "ä\\|a" nil t))) (goto-char (point-max)) (Assert (eq 2 (re-search-backward "Ä\\|a" nil t))) (goto-char (1- (point-max))) (Assert (eq 1 (re-search-backward "ä\\|a" nil t))) (goto-char (1- (point-max))) (Assert (eq 1 (re-search-backward "Ä\\|a" nil t))) ;; case sensitive (setq case-fold-search nil) ;; forward (goto-char (point-min)) (Assert (eq 2 (re-search-forward "ä\\|a" nil t))) (goto-char (point-min)) (Assert (eq 3 (re-search-forward "Ä\\|a" nil t))) (goto-char (1+ (point-min))) (Assert (not (re-search-forward "ä\\|a" nil t))) (goto-char (1+ (point-min))) (Assert (eq 3 (re-search-forward "Ä\\|a" nil t))) ;; backward (goto-char (point-max)) (Assert (eq 1 (re-search-backward "ä\\|a" nil t))) (goto-char (point-max)) (Assert (eq 2 (re-search-backward "Ä\\|a" nil t))) (goto-char (1- (point-max))) (Assert (eq 1 (re-search-backward "ä\\|a" nil t))) (goto-char (1- (point-max))) (Assert (not (re-search-backward "Ä\\|a" nil t)))) ;; duplicate (with-temp-buffer ;; case insensitive (Assert (string-match "^\\(ä\\)\\1$" "ää")) (Assert (string-match "^\\(ä\\)\\1$" "äÄ")) (Assert (string-match "^\\(ä\\)\\1$" "ÄÄ")) (Assert (string-match "^\\(ä\\)\\1$" "Ää")) (Assert (string-match "^\\(Ä\\)\\1$" "ää")) (Assert (string-match "^\\(Ä\\)\\1$" "äÄ")) (Assert (string-match "^\\(Ä\\)\\1$" "ÄÄ")) (Assert (string-match "^\\(Ä\\)\\1$" "Ää")) ;; case sensitive (setq case-fold-search nil) (Assert (string-match "^\\(ä\\)\\1$" "ää")) (Assert (not (string-match "^\\(ä\\)\\1$" "äÄ"))) (Assert (not (string-match "^\\(ä\\)\\1$" "ÄÄ"))) (Assert (not (string-match "^\\(ä\\)\\1$" "Ää"))) (Assert (not (string-match "^\\(Ä\\)\\1$" "ää"))) (Assert (not (string-match "^\\(Ä\\)\\1$" "äÄ"))) (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 () (let ((i 0) (max (expt 2 (if (featurep 'mule) 19 8))) (range "[a-z]") (range-not "[^a-z]") char string) (while (< i max) (when (setq char (int-to-char i)) (setq string (char-to-string char)) (if (or (and (<= 65 i) (<= i 90)) (and (<= 97 i) (<= i 122))) (progn (Assert (string-match range string)) (Assert (not (string-match range-not string)))) (Assert (not (string-match range string))) (Assert (string-match range-not string)))) (setq i (1+ i))))) ;; (test-regexp-charset-paranoid) ;; charset_mule, charset_mule_not ;; Not called because it takes too much time. (defun test-regex-charset-mule-paranoid () (if (featurep 'mule) (let ((i 0) (max (expt 2 19)) (range (format "[%c-%c]" (make-char 'japanese-jisx0208 36 34) (make-char 'japanese-jisx0208 36 42))) (range-not (format "[^%c-%c]" (make-char 'japanese-jisx0208 36 34) (make-char 'japanese-jisx0208 36 42))) (min-int (char-to-int (make-char 'japanese-jisx0208 36 34))) (max-int (char-to-int (make-char 'japanese-jisx0208 36 42))) char string) (while (< i max) (when (setq char (int-to-char i)) (setq string (char-to-string char)) (if (and (<= min-int i) (<= i max-int)) (progn (Assert (string-match range string)) (Assert (not (string-match range-not string)))) (Assert (not (string-match range string))) (Assert (string-match range-not string)))) (setq i (1+ i)))))) ;; (test-regex-charset-mule-paranoid) ;; Test that replace-match does not clobber registers after a failed 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 attempted fix 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 (string= (match-string 1) nil))) ;; Test word boundaries (Assert (= (string-match "\\<a" " a") 1)) (Assert (= (string-match "a\\>" "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)) ;; Check for weirdness (Assert (not (string-match " \\> " " "))) (Assert (not (string-match " \\< " " "))) (Assert (not (string-match " \\b " " "))) ;; 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 ;; Fixed bug 2003-03-21 sjt (Assert (not (string-match "\\b" ""))) (Assert (not (string-match "\\b" " "))) (Assert (not (string-match " \\b" " "))) (Assert (not (string-match "\\b " " "))) ;; Character classes are broken in Mule as of 21.5.9 ;; Added Known-Bug 2002-12-27 ;; Fixed by Daiki Ueno 2003-03-24 (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>. ;; These tests used to fail because we cleared match data only on success. ;; Fixed 2003-04-17. ;; Must change sense of failing tests 2003-05-09. 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)) ;; in 21.4.16, registers from num_shy_groups to num_groups were not cleared, ;; resulting in stale match data (Assert (progn (string-match "\\(a\\)" a) (string-match "\\(?:a\\)" a) (not (match-beginning 1)))) ) ;; 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))) ) ;; replace-regexp-in-string (regexp rep source ;; fixedcase literal buf-or-subexp start) ;; Currently we test the following cases: ;; where `cbuf' and `bar-or-empty' are bound below. ;; #### Tests for the various functional features (fixedcase, literal, start) ;; should be added. (with-temp-buffer (flet ((bar-or-empty (subexp) (if (string= subexp "foo") "bar" ""))) (let ((cbuf (current-buffer))) (dolist (test-case ;; REP BUF-OR-SUBEXP EXPECTED RESULT `(("bar" nil " bar") ("bar" ,cbuf " bar") ("bar" 0 " bar") ("bar" 1 " bar foo") (bar-or-empty nil " ") (bar-or-empty ,cbuf " ") (bar-or-empty 0 " ") (bar-or-empty 1 " bar foo"))) (Assert (string= (nth 2 test-case) (replace-regexp-in-string "\\(foo\\).*\\'" (nth 0 test-case) " foo foo" nil nil (nth 1 test-case))))) ;; #### Why doesn't this loop work right? ; (dolist (test-case ; ;; REP BUF-OR-SUBEXP EXPECTED ERROR EXPECTED MESSAGE ; `(;; expected message was "bufferp, symbol" up to 21.5.28 ; ("bar" 'symbol wrong-type-argument "integerp, symbol") ; ("bar" -1 invalid-argument ; "match data register invalid, -1") ; ("bar" 2 invalid-argument ; "match data register not set, 2") ; )) ; (eval ; `(Check-Error-Message ,(nth 2 test-case) ,(nth 3 test-case) ; (replace-regexp-in-string "\\(foo\\).*\\'" ,(nth 0 test-case) ; " foo foo" nil nil ,(nth 1 test-case))))) ;; #### Can't test the message with w-t-a, see test-harness.el. (Check-Error wrong-type-argument (replace-regexp-in-string "\\(foo\\).*\\'" "bar" " foo foo" nil nil 'symbol)) ;; #### Can't test the FROB (-1), see test-harness.el. (Check-Error-Message invalid-argument "match data register invalid" (replace-regexp-in-string "\\(foo\\).*\\'" "bar" " foo foo" nil nil -1)) ;; #### Can't test the FROB (-1), see test-harness.el. (Check-Error-Message invalid-argument "match data register not set" (replace-regexp-in-string "\\(foo\\).*\\'" "bar" " foo foo" nil nil 2)) ))) ;; replace-match (REPLACEMENT &optional FIXEDCASE LITERAL STRING STRBUFFER) ;; #### Write some tests! Much functionality is implicitly tested above ;; via `replace-regexp-in-string', but we should specifically test bogus ;; combinations of STRING and STRBUFFER.