1" Tests for regexp with backslash and other special characters inside []
2" Also test backslash for hex/octal numbered character.
3"
4if !has('multi_byte')
5  finish
6endif
7
8scriptencoding utf-8
9
10function RunSTest(value, calls, expected)
11  new
12  call feedkeys("i" . a:value, "mx")
13  exec a:calls
14  call assert_equal(a:expected, getline(1), printf("wrong result for %s", a:calls))
15  quit!
16endfunction
17
18function RunXTest(value, search_exp, expected)
19  new
20  call feedkeys("i" . a:value, "mx")
21  call feedkeys("gg" . a:search_exp . "\nx", "mx")
22  call assert_equal(a:expected, getline(1), printf("wrong result for %s", a:search_exp))
23  quit!
24endfunction
25
26
27function Test_x_search()
28  let res = "test text test text"
29  call RunXTest("test \\text test text", "/[\\x]", res)
30  call RunXTest("test \ttext test text", "/[\\t\\]]", res)
31  call RunXTest("test text ]test text", "/[]y]", res)
32  call RunXTest("test ]text test text", "/[\\]]", res)
33  call RunXTest("test text te^st text", "/[y^]", res)
34  call RunXTest("test te$xt test text", "/[$y]", res)
35  call RunXTest("test taext test text", "/[\\x61]", res)
36  call RunXTest("test tbext test text","/[\\x60-\\x64]", res)
37  call RunXTest("test 5text test text","/[\\x785]", res)
38  call RunXTest("testc text test text","/[\\o143]", res)
39  call RunXTest("tesdt text test text","/[\\o140-\\o144]", res)
40  call RunXTest("test7 text test text", "/[\\o417]", res)
41  call RunXTest("test text tBest text", "/\\%x42", res)
42  call RunXTest("test text teCst text", "/\\%o103", res)
43  call RunXTest("test text \<C-V>x00test text", "/[\\x00]", res)
44endfunction
45
46function Test_s_search()
47  let res = "test text test text"
48  call RunSTest("test te\<C-V>x00xt t\<C-V>x04est t\<C-V>x10ext", "s/[\\x00-\\x10]//g", res)
49  call RunSTest("test \\xyztext test text", "s/[\\x-z]\\+//", res)
50  call RunSTest("test text tev\\uyst text", "s/[\\u-z]\\{2,}//", res)
51  call RunSTest("xx aaaaa xx a", "s/\\(a\\)\\+//", "xx  xx a")
52  call RunSTest("xx aaaaa xx a", "s/\\(a*\\)\\+//", "xx aaaaa xx a")
53  call RunSTest("xx aaaaa xx a", "s/\\(a*\\)*//", "xx aaaaa xx a")
54  call RunSTest("xx aaaaa xx", "s/\\(a\\)\\{2,3}/A/", "xx Aaa xx")
55  call RunSTest("xx aaaaa xx", "s/\\(a\\)\\{-2,3}/A/", "xx Aaaa xx")
56  call RunSTest("xx aaa12aa xx", "s/\\(a\\)*\\(12\\)\\@>/A/", "xx Aaa xx")
57  call RunSTest("xx foobar xbar xx", "s/\\(foo\\)\\@<!bar/A/", "xx foobar xA xx")
58  call RunSTest("xx an file xx", "s/\\(an\\_s\\+\\)\\@<=file/A/", "xx an A xx")
59  call RunSTest("x= 9;", "s/^\\(\\h\\w*\\%(->\\|\\.\\)\\=\\)\\+=/XX/", "XX 9;")
60  call RunSTest("hh= 77;", "s/^\\(\\h\\w*\\%(->\\|\\.\\)\\=\\)\\+=/YY/", "YY 77;")
61  call RunSTest(" aaa ", "s/aaa/xyz/", " xyz ")
62  call RunSTest(" xyz", "s/~/bcd/", " bcd")
63  call RunSTest(" bcdbcdbcd", "s/~\\+/BB/", " BB")
64endfunction
65
66" Test character classes in regexp using regexpengine 0, 1, 2.
67func Test_regex_char_classes()
68  new
69  let save_enc = &encoding
70  set encoding=utf-8
71
72  let input = "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"
73
74  " Format is [cmd_to_run, expected_output]
75  let tests = [
76    \ [':s/\%#=0\d//g',
77    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
78    \ [':s/\%#=1\d//g',
79    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
80    \ [':s/\%#=2\d//g',
81    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
82    \ [':s/\%#=0[0-9]//g',
83    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
84    \ [':s/\%#=1[0-9]//g',
85    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
86    \ [':s/\%#=2[0-9]//g',
87    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
88    \ [':s/\%#=0\D//g',
89    \ "0123456789"],
90    \ [':s/\%#=1\D//g',
91    \ "0123456789"],
92    \ [':s/\%#=2\D//g',
93    \ "0123456789"],
94    \ [':s/\%#=0[^0-9]//g',
95    \ "0123456789"],
96    \ [':s/\%#=1[^0-9]//g',
97    \ "0123456789"],
98    \ [':s/\%#=2[^0-9]//g',
99    \ "0123456789"],
100    \ [':s/\%#=0\o//g',
101    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./89:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
102    \ [':s/\%#=1\o//g',
103    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./89:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
104    \ [':s/\%#=2\o//g',
105    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./89:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
106    \ [':s/\%#=0[0-7]//g',
107    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./89:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
108    \ [':s/\%#=1[0-7]//g',
109    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./89:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
110    \ [':s/\%#=2[0-7]//g',
111    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./89:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
112    \ [':s/\%#=0\O//g',
113    \ "01234567"],
114    \ [':s/\%#=1\O//g',
115    \ "01234567"],
116    \ [':s/\%#=2\O//g',
117    \ "01234567"],
118    \ [':s/\%#=0[^0-7]//g',
119    \ "01234567"],
120    \ [':s/\%#=1[^0-7]//g',
121    \ "01234567"],
122    \ [':s/\%#=2[^0-7]//g',
123    \ "01234567"],
124    \ [':s/\%#=0\x//g',
125    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@GHIXYZ[\]^_`ghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
126    \ [':s/\%#=1\x//g',
127    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@GHIXYZ[\]^_`ghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
128    \ [':s/\%#=2\x//g',
129    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@GHIXYZ[\]^_`ghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
130    \ [':s/\%#=0[0-9A-Fa-f]//g',
131    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@GHIXYZ[\]^_`ghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
132    \ [':s/\%#=1[0-9A-Fa-f]//g',
133    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@GHIXYZ[\]^_`ghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
134    \ [':s/\%#=2[0-9A-Fa-f]//g',
135    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@GHIXYZ[\]^_`ghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
136    \ [':s/\%#=0\X//g',
137    \ "0123456789ABCDEFabcdef"],
138    \ [':s/\%#=1\X//g',
139    \ "0123456789ABCDEFabcdef"],
140    \ [':s/\%#=2\X//g',
141    \ "0123456789ABCDEFabcdef"],
142    \ [':s/\%#=0[^0-9A-Fa-f]//g',
143    \ "0123456789ABCDEFabcdef"],
144    \ [':s/\%#=1[^0-9A-Fa-f]//g',
145    \ "0123456789ABCDEFabcdef"],
146    \ [':s/\%#=2[^0-9A-Fa-f]//g',
147    \ "0123456789ABCDEFabcdef"],
148    \ [':s/\%#=0\w//g',
149    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@[\]^`{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
150    \ [':s/\%#=1\w//g',
151    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@[\]^`{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
152    \ [':s/\%#=2\w//g',
153    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@[\]^`{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
154    \ [':s/\%#=0[0-9A-Za-z_]//g',
155    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@[\]^`{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
156    \ [':s/\%#=1[0-9A-Za-z_]//g',
157    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@[\]^`{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
158    \ [':s/\%#=2[0-9A-Za-z_]//g',
159    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./:;<=>?@[\]^`{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
160    \ [':s/\%#=0\W//g',
161    \ "0123456789ABCDEFGHIXYZ_abcdefghiwxyz"],
162    \ [':s/\%#=1\W//g',
163    \ "0123456789ABCDEFGHIXYZ_abcdefghiwxyz"],
164    \ [':s/\%#=2\W//g',
165    \ "0123456789ABCDEFGHIXYZ_abcdefghiwxyz"],
166    \ [':s/\%#=0[^0-9A-Za-z_]//g',
167    \ "0123456789ABCDEFGHIXYZ_abcdefghiwxyz"],
168    \ [':s/\%#=1[^0-9A-Za-z_]//g',
169    \ "0123456789ABCDEFGHIXYZ_abcdefghiwxyz"],
170    \ [':s/\%#=2[^0-9A-Za-z_]//g',
171    \ "0123456789ABCDEFGHIXYZ_abcdefghiwxyz"],
172    \ [':s/\%#=0\h//g',
173    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^`{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
174    \ [':s/\%#=1\h//g',
175    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^`{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
176    \ [':s/\%#=2\h//g',
177    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^`{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
178    \ [':s/\%#=0[A-Za-z_]//g',
179    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^`{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
180    \ [':s/\%#=1[A-Za-z_]//g',
181    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^`{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
182    \ [':s/\%#=2[A-Za-z_]//g',
183    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^`{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
184    \ [':s/\%#=0\H//g',
185    \ "ABCDEFGHIXYZ_abcdefghiwxyz"],
186    \ [':s/\%#=1\H//g',
187    \ "ABCDEFGHIXYZ_abcdefghiwxyz"],
188    \ [':s/\%#=2\H//g',
189    \ "ABCDEFGHIXYZ_abcdefghiwxyz"],
190    \ [':s/\%#=0[^A-Za-z_]//g',
191    \ "ABCDEFGHIXYZ_abcdefghiwxyz"],
192    \ [':s/\%#=1[^A-Za-z_]//g',
193    \ "ABCDEFGHIXYZ_abcdefghiwxyz"],
194    \ [':s/\%#=2[^A-Za-z_]//g',
195    \ "ABCDEFGHIXYZ_abcdefghiwxyz"],
196    \ [':s/\%#=0\a//g',
197    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^_`{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
198    \ [':s/\%#=1\a//g',
199    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^_`{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
200    \ [':s/\%#=2\a//g',
201    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^_`{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
202    \ [':s/\%#=0[A-Za-z]//g',
203    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^_`{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
204    \ [':s/\%#=1[A-Za-z]//g',
205    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^_`{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
206    \ [':s/\%#=2[A-Za-z]//g',
207    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^_`{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
208    \ [':s/\%#=0\A//g',
209    \ "ABCDEFGHIXYZabcdefghiwxyz"],
210    \ [':s/\%#=1\A//g',
211    \ "ABCDEFGHIXYZabcdefghiwxyz"],
212    \ [':s/\%#=2\A//g',
213    \ "ABCDEFGHIXYZabcdefghiwxyz"],
214    \ [':s/\%#=0[^A-Za-z]//g',
215    \ "ABCDEFGHIXYZabcdefghiwxyz"],
216    \ [':s/\%#=1[^A-Za-z]//g',
217    \ "ABCDEFGHIXYZabcdefghiwxyz"],
218    \ [':s/\%#=2[^A-Za-z]//g',
219    \ "ABCDEFGHIXYZabcdefghiwxyz"],
220    \ [':s/\%#=0\l//g',
221    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
222    \ [':s/\%#=1\l//g',
223    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
224    \ [':s/\%#=2\l//g',
225    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
226    \ [':s/\%#=0[a-z]//g',
227    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
228    \ [':s/\%#=1[a-z]//g',
229    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
230    \ [':s/\%#=2[a-z]//g',
231    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
232    \ [':s/\%#=0\L//g',
233    \ "abcdefghiwxyz"],
234    \ [':s/\%#=1\L//g',
235    \ "abcdefghiwxyz"],
236    \ [':s/\%#=2\L//g',
237    \ "abcdefghiwxyz"],
238    \ [':s/\%#=0[^a-z]//g',
239    \ "abcdefghiwxyz"],
240    \ [':s/\%#=1[^a-z]//g',
241    \ "abcdefghiwxyz"],
242    \ [':s/\%#=2[^a-z]//g',
243    \ "abcdefghiwxyz"],
244    \ [':s/\%#=0\u//g',
245    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
246    \ [':s/\%#=1\u//g',
247    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
248    \ [':s/\%#=2\u//g',
249    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
250    \ [':s/\%#=0[A-Z]//g',
251    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
252    \ [':s/\%#=1[A-Z]//g',
253    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
254    \ [':s/\%#=2[A-Z]//g',
255    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./0123456789:;<=>?@[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
256    \ [':s/\%#=0\U//g',
257    \ "ABCDEFGHIXYZ"],
258    \ [':s/\%#=1\U//g',
259    \ "ABCDEFGHIXYZ"],
260    \ [':s/\%#=2\U//g',
261    \ "ABCDEFGHIXYZ"],
262    \ [':s/\%#=0[^A-Z]//g',
263    \ "ABCDEFGHIXYZ"],
264    \ [':s/\%#=1[^A-Z]//g',
265    \ "ABCDEFGHIXYZ"],
266    \ [':s/\%#=2[^A-Z]//g',
267    \ "ABCDEFGHIXYZ"],
268    \ [':s/\%#=0\%' . line('.') . 'l^\t...//g',
269    \ "!\"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
270    \ [':s/\%#=1\%' . line('.') . 'l^\t...//g',
271    \ "!\"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
272    \ [':s/\%#=2\%' . line('.') . 'l^\t...//g',
273    \ "!\"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
274    \ [':s/\%#=0[0-z]//g',
275    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
276    \ [':s/\%#=1[0-z]//g',
277    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
278    \ [':s/\%#=2[0-z]//g',
279    \ "\t\<C-L>\<C-M> !\"#$%&'()#+'-./{|}~\<C-?>\u0080\u0082\u0090\u009b������"],
280    \ [':s/\%#=0[^0-z]//g',
281    \ "0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz"],
282    \ [':s/\%#=1[^0-z]//g',
283    \ "0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz"],
284    \ [':s/\%#=2[^0-z]//g',
285    \ "0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz"]
286    \]
287
288  for [cmd, expected] in tests
289      call append(0, input)
290      call cursor(1, 1)
291      exe cmd
292      call assert_equal(expected, getline(1), cmd)
293  endfor
294
295  let &encoding = save_enc
296  enew!
297  close
298endfunc
299