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