blob: 36e39eb05a6d89b85c9e8863b70eae25c015568f [file] [log] [blame]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001" Test various aspects of the Vim9 script language.
2
Bram Moolenaar673660a2020-01-26 16:50:05 +01003source check.vim
Bram Moolenaar101f4812020-06-16 23:18:51 +02004source term_util.vim
Bram Moolenaarad39c092020-02-26 18:23:43 +01005source view_util.vim
Bram Moolenaarcfe435d2020-04-25 20:02:55 +02006source vim9.vim
Bram Moolenaare3d46852020-08-29 13:39:17 +02007source shared.vim
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01008
9def Test_syntax()
10 let var = 234
11 let other: list<string> = ['asdf']
12enddef
13
Bram Moolenaar5d72ce62020-08-20 23:04:06 +020014def Test_range_only()
15 new
16 setline(1, ['blah', 'Blah'])
17 :/Blah/
18 assert_equal(2, getcurpos()[1])
Bram Moolenaarc2af0af2020-08-23 21:06:02 +020019 bwipe!
20
21 # without range commands use current line
22 new
23 setline(1, ['one', 'two', 'three'])
24 :2
25 print
26 assert_equal('two', Screenline(&lines))
27 :3
28 list
29 assert_equal('three$', Screenline(&lines))
30 bwipe!
Bram Moolenaar5d72ce62020-08-20 23:04:06 +020031enddef
32
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010033let s:appendToMe = 'xxx'
34let s:addToMe = 111
Bram Moolenaar401d9ff2020-02-19 18:14:44 +010035let g:existing = 'yes'
Bram Moolenaara8c17702020-04-01 21:17:24 +020036let g:inc_counter = 1
37let $SOME_ENV_VAR = 'some'
Bram Moolenaara6e67e42020-05-15 23:36:40 +020038let g:alist = [7]
39let g:astring = 'text'
Bram Moolenaarf0b9f432020-07-17 23:03:17 +020040let g:anumber = 123
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010041
Bram Moolenaarba7c0d72020-09-09 18:54:42 +020042def Test_assignment_bool()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010043 let bool1: bool = true
44 assert_equal(v:true, bool1)
45 let bool2: bool = false
46 assert_equal(v:false, bool2)
47
Bram Moolenaar29a86ff2020-09-09 14:55:31 +020048 let bool3: bool = 0
49 assert_equal(0, bool3)
50 let bool4: bool = 1
51 assert_equal(1, bool4)
52
Bram Moolenaarba7c0d72020-09-09 18:54:42 +020053 let lines =<< trim END
54 vim9script
55 def GetFlag(): bool
56 let flag: bool = 1
57 return flag
58 enddef
59 let flag: bool = GetFlag()
60 flag = 0
61 flag = 1
62 END
63 CheckScriptSuccess(lines)
64 CheckDefAndScriptFailure(['let x: bool = 2'], 'E1012:')
65 CheckDefAndScriptFailure(['let x: bool = -1'], 'E1012:')
66 CheckDefAndScriptFailure(['let x: bool = [1]'], 'E1012:')
67 CheckDefAndScriptFailure(['let x: bool = {}'], 'E1012:')
68 CheckDefAndScriptFailure(['let x: bool = "x"'], 'E1012:')
69enddef
70
71def Test_assignment()
Bram Moolenaard2c61702020-09-06 15:58:36 +020072 CheckDefFailure(['let x:string'], 'E1069:')
73 CheckDefFailure(['let x:string = "x"'], 'E1069:')
74 CheckDefFailure(['let a:string = "x"'], 'E1069:')
75 CheckDefFailure(['let lambda = {-> "lambda"}'], 'E704:')
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +020076
Bram Moolenaar4cdb13c2020-07-22 21:45:14 +020077 let nr: number = 1234
Bram Moolenaard2c61702020-09-06 15:58:36 +020078 CheckDefFailure(['let nr: number = "asdf"'], 'E1012:')
Bram Moolenaar4cdb13c2020-07-22 21:45:14 +020079
Bram Moolenaarb2097502020-07-19 17:17:02 +020080 let a: number = 6 #comment
Bram Moolenaar9be61bb2020-03-30 22:51:24 +020081 assert_equal(6, a)
82
Bram Moolenaar42a480b2020-02-29 23:23:47 +010083 if has('channel')
84 let chan1: channel
Bram Moolenaarfbdd08e2020-03-01 14:04:46 +010085 let job1: job
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +010086 let job2: job = job_start('willfail')
Bram Moolenaar42a480b2020-02-29 23:23:47 +010087 endif
Bram Moolenaarfbdd08e2020-03-01 14:04:46 +010088 if has('float')
89 let float1: float = 3.4
90 endif
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +020091 let Funky1: func
92 let Funky2: func = function('len')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +020093 let Party2: func = funcref('g:Test_syntax')
Bram Moolenaar42a480b2020-02-29 23:23:47 +010094
Bram Moolenaarb2097502020-07-19 17:17:02 +020095 g:newvar = 'new' #comment
Bram Moolenaar401d9ff2020-02-19 18:14:44 +010096 assert_equal('new', g:newvar)
97
98 assert_equal('yes', g:existing)
99 g:existing = 'no'
100 assert_equal('no', g:existing)
101
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100102 v:char = 'abc'
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100103 assert_equal('abc', v:char)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100104
105 $ENVVAR = 'foobar'
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100106 assert_equal('foobar', $ENVVAR)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100107 $ENVVAR = ''
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100108
Bram Moolenaarb5ed2662020-07-28 22:38:37 +0200109 let lines =<< trim END
110 vim9script
111 $ENVVAR = 'barfoo'
112 assert_equal('barfoo', $ENVVAR)
113 $ENVVAR = ''
114 END
Bram Moolenaard2c61702020-09-06 15:58:36 +0200115 CheckScriptSuccess(lines)
Bram Moolenaarb5ed2662020-07-28 22:38:37 +0200116
Bram Moolenaarfd1823e2020-02-19 20:23:11 +0100117 s:appendToMe ..= 'yyy'
118 assert_equal('xxxyyy', s:appendToMe)
119 s:addToMe += 222
120 assert_equal(333, s:addToMe)
Bram Moolenaar0bbf7222020-02-19 22:31:48 +0100121 s:newVar = 'new'
122 assert_equal('new', s:newVar)
Bram Moolenaara8c17702020-04-01 21:17:24 +0200123
124 set ts=7
125 &ts += 1
126 assert_equal(8, &ts)
Bram Moolenaar80c34ca2020-04-01 23:05:18 +0200127 &ts -= 3
128 assert_equal(5, &ts)
129 &ts *= 2
130 assert_equal(10, &ts)
131 &ts /= 3
132 assert_equal(3, &ts)
133 set ts=10
134 &ts %= 4
135 assert_equal(2, &ts)
Bram Moolenaarb5ed2662020-07-28 22:38:37 +0200136
Bram Moolenaar93ad1472020-08-19 22:02:41 +0200137 if has('float')
138 let f100: float = 100.0
139 f100 /= 5
140 assert_equal(20.0, f100)
141
142 let f200: float = 200.0
143 f200 /= 5.0
144 assert_equal(40.0, f200)
145
146 CheckDefFailure(['let nr: number = 200', 'nr /= 5.0'], 'E1012:')
147 endif
148
Bram Moolenaarb5ed2662020-07-28 22:38:37 +0200149 lines =<< trim END
Bram Moolenaarb5ed2662020-07-28 22:38:37 +0200150 &ts = 6
151 &ts += 3
152 assert_equal(9, &ts)
Bram Moolenaar2e800952020-08-23 19:34:48 +0200153
154 &l:ts = 6
155 assert_equal(6, &ts)
156 &l:ts += 2
157 assert_equal(8, &ts)
158
159 &g:ts = 6
160 assert_equal(6, &g:ts)
161 &g:ts += 2
162 assert_equal(8, &g:ts)
Bram Moolenaarb5ed2662020-07-28 22:38:37 +0200163 END
Bram Moolenaar2e800952020-08-23 19:34:48 +0200164 CheckDefAndScriptSuccess(lines)
Bram Moolenaarb5ed2662020-07-28 22:38:37 +0200165
Bram Moolenaar0aae4802020-08-16 21:29:05 +0200166 CheckDefFailure(['&notex += 3'], 'E113:')
167 CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
168 CheckDefFailure(['&ts = [7]'], 'E1012:')
169 CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list')
170 CheckDefFailure(['&ts = "xx"'], 'E1012:')
171 CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string')
172 CheckDefFailure(['&path += 3'], 'E1012:')
173 CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
Bram Moolenaarcb711ab2020-04-16 13:00:29 +0200174 # test freeing ISN_STOREOPT
Bram Moolenaar0aae4802020-08-16 21:29:05 +0200175 CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
Bram Moolenaar80c34ca2020-04-01 23:05:18 +0200176 &ts = 8
Bram Moolenaara8c17702020-04-01 21:17:24 +0200177
Bram Moolenaar0aae4802020-08-16 21:29:05 +0200178 lines =<< trim END
179 let save_TI = &t_TI
180 &t_TI = ''
181 assert_equal('', &t_TI)
182 &t_TI = 'xxx'
183 assert_equal('xxx', &t_TI)
184 &t_TI = save_TI
185 END
Bram Moolenaarba7c0d72020-09-09 18:54:42 +0200186 CheckDefAndScriptSuccess(lines)
Bram Moolenaar0aae4802020-08-16 21:29:05 +0200187
188 CheckDefFailure(['&t_TI = 123'], 'E1012:')
189 CheckScriptFailure(['vim9script', '&t_TI = 123'], 'E928:')
190
191 CheckDefFailure(['let s:var = 123'], 'E1101:')
192 CheckDefFailure(['let s:var: number'], 'E1101:')
Bram Moolenaar33afa242020-07-29 19:18:00 +0200193
Bram Moolenaarf9b2b492020-08-05 14:34:14 +0200194 lines =<< trim END
195 vim9script
196 def SomeFunc()
197 s:var = 123
198 enddef
199 defcompile
200 END
Bram Moolenaard2c61702020-09-06 15:58:36 +0200201 CheckScriptFailure(lines, 'E1089:')
Bram Moolenaarf9b2b492020-08-05 14:34:14 +0200202
Bram Moolenaara8c17702020-04-01 21:17:24 +0200203 g:inc_counter += 1
204 assert_equal(2, g:inc_counter)
205
206 $SOME_ENV_VAR ..= 'more'
207 assert_equal('somemore', $SOME_ENV_VAR)
Bram Moolenaard2c61702020-09-06 15:58:36 +0200208 CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1051:')
209 CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1012:')
Bram Moolenaara8c17702020-04-01 21:17:24 +0200210
Bram Moolenaarb5ed2662020-07-28 22:38:37 +0200211 lines =<< trim END
Bram Moolenaarb5ed2662020-07-28 22:38:37 +0200212 @c = 'areg'
213 @c ..= 'add'
214 assert_equal('aregadd', @c)
215 END
Bram Moolenaar2e800952020-08-23 19:34:48 +0200216 CheckDefAndScriptSuccess(lines)
217
Bram Moolenaard2c61702020-09-06 15:58:36 +0200218 CheckDefFailure(['@a += "more"'], 'E1051:')
219 CheckDefFailure(['@a += 123'], 'E1012:')
Bram Moolenaarb5ed2662020-07-28 22:38:37 +0200220
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200221 v:errmsg = 'none'
222 v:errmsg ..= 'again'
223 assert_equal('noneagain', v:errmsg)
Bram Moolenaard2c61702020-09-06 15:58:36 +0200224 CheckDefFailure(['v:errmsg += "more"'], 'E1051:')
225 CheckDefFailure(['v:errmsg += 123'], 'E1012:')
Bram Moolenaar33afa242020-07-29 19:18:00 +0200226
227 # single letter variables
228 a = 123
229 assert_equal(123, a)
230 let b: number
231 b = 123
232 assert_equal(123, b)
233 let g: number
234 g = 123
235 assert_equal(123, g)
236 let s: number
237 s = 123
238 assert_equal(123, s)
239 let t: number
240 t = 123
241 assert_equal(123, t)
242 let v: number
243 v = 123
244 assert_equal(123, v)
245 let w: number
246 w = 123
247 assert_equal(123, w)
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200248enddef
249
Bram Moolenaar3b74b6b2020-06-19 19:01:43 +0200250def Test_vim9_single_char_vars()
251 let lines =<< trim END
252 vim9script
253
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200254 # single character variable declarations work
Bram Moolenaar3b74b6b2020-06-19 19:01:43 +0200255 let a: string
256 let b: number
257 let l: list<any>
258 let s: string
259 let t: number
260 let v: number
261 let w: number
262
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200263 # script-local variables can be used without s: prefix
Bram Moolenaar3b74b6b2020-06-19 19:01:43 +0200264 a = 'script-a'
265 b = 111
266 l = [1, 2, 3]
267 s = 'script-s'
268 t = 222
269 v = 333
270 w = 444
271
272 assert_equal('script-a', a)
273 assert_equal(111, b)
274 assert_equal([1, 2, 3], l)
275 assert_equal('script-s', s)
276 assert_equal(222, t)
277 assert_equal(333, v)
278 assert_equal(444, w)
279 END
280 writefile(lines, 'Xsinglechar')
281 source Xsinglechar
282 delete('Xsinglechar')
283enddef
284
Bram Moolenaar84370082020-05-18 14:20:36 +0200285def Test_assignment_list()
286 let list1: list<bool> = [false, true, false]
287 let list2: list<number> = [1, 2, 3]
288 let list3: list<string> = ['sdf', 'asdf']
289 let list4: list<any> = ['yes', true, 1234]
290 let list5: list<blob> = [0z01, 0z02]
291
292 let listS: list<string> = []
293 let listN: list<number> = []
294
295 assert_equal([1, 2, 3], list2)
296 list2[-1] = 99
297 assert_equal([1, 2, 99], list2)
298 list2[-2] = 88
299 assert_equal([1, 88, 99], list2)
300 list2[-3] = 77
301 assert_equal([77, 88, 99], list2)
Bram Moolenaardd29f1b2020-08-07 20:46:20 +0200302 list2 += [100]
303 assert_equal([77, 88, 99, 100], list2)
304
305 list3 += ['end']
306 assert_equal(['sdf', 'asdf', 'end'], list3)
307
308
Bram Moolenaard2c61702020-09-06 15:58:36 +0200309 CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
310 CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:')
Bram Moolenaar84370082020-05-18 14:20:36 +0200311
312 # type becomes list<any>
313 let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
314enddef
315
Bram Moolenaarb31be3f2020-07-20 22:37:44 +0200316def Test_assignment_list_vim9script()
317 let lines =<< trim END
318 vim9script
319 let v1: number
320 let v2: number
321 let v3: number
322 [v1, v2, v3] = [1, 2, 3]
323 assert_equal([1, 2, 3], [v1, v2, v3])
324 END
Bram Moolenaard2c61702020-09-06 15:58:36 +0200325 CheckScriptSuccess(lines)
Bram Moolenaarb31be3f2020-07-20 22:37:44 +0200326enddef
327
Bram Moolenaar84370082020-05-18 14:20:36 +0200328def Test_assignment_dict()
329 let dict1: dict<bool> = #{one: false, two: true}
330 let dict2: dict<number> = #{one: 1, two: 2}
331 let dict3: dict<string> = #{key: 'value'}
332 let dict4: dict<any> = #{one: 1, two: '2'}
Bram Moolenaar74fae512020-05-21 21:50:58 +0200333 let dict5: dict<blob> = #{one: 0z01, two: 0z02}
Bram Moolenaar84370082020-05-18 14:20:36 +0200334
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200335 # overwrite
Bram Moolenaarc785b9a2020-06-19 18:34:15 +0200336 dict3['key'] = 'another'
337
Bram Moolenaar58626872020-08-01 14:06:38 +0200338 # empty key can be used
339 let dd = {}
340 dd[""] = 6
341 assert_equal({'': 6}, dd)
Bram Moolenaar84370082020-05-18 14:20:36 +0200342
343 # type becomes dict<any>
344 let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
Bram Moolenaar8e4c8c82020-08-01 15:38:38 +0200345
346 # assignment to script-local dict
347 let lines =<< trim END
348 vim9script
349 let test: dict<any> = {}
350 def FillDict(): dict<any>
351 test['a'] = 43
352 return test
353 enddef
354 assert_equal(#{a: 43}, FillDict())
355 END
356 call CheckScriptSuccess(lines)
357
358 lines =<< trim END
359 vim9script
360 let test: dict<any>
361 def FillDict(): dict<any>
362 test['a'] = 43
363 return test
364 enddef
365 FillDict()
366 END
367 call CheckScriptFailure(lines, 'E1103:')
Bram Moolenaar2caa1592020-08-01 15:53:19 +0200368
369 # assignment to global dict
370 lines =<< trim END
371 vim9script
372 g:test = {}
373 def FillDict(): dict<any>
374 g:test['a'] = 43
375 return g:test
376 enddef
377 assert_equal(#{a: 43}, FillDict())
378 END
379 call CheckScriptSuccess(lines)
380
381 # assignment to buffer dict
382 lines =<< trim END
383 vim9script
384 b:test = {}
385 def FillDict(): dict<any>
386 b:test['a'] = 43
387 return b:test
388 enddef
389 assert_equal(#{a: 43}, FillDict())
390 END
391 call CheckScriptSuccess(lines)
Bram Moolenaar84370082020-05-18 14:20:36 +0200392enddef
393
Bram Moolenaard3aac292020-04-19 14:32:17 +0200394def Test_assignment_local()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200395 # Test in a separated file in order not to the current buffer/window/tab is
396 # changed.
Bram Moolenaard3aac292020-04-19 14:32:17 +0200397 let script_lines: list<string> =<< trim END
398 let b:existing = 'yes'
399 let w:existing = 'yes'
400 let t:existing = 'yes'
401
402 def Test_assignment_local_internal()
403 b:newvar = 'new'
404 assert_equal('new', b:newvar)
405 assert_equal('yes', b:existing)
406 b:existing = 'no'
407 assert_equal('no', b:existing)
Bram Moolenaar396f3132020-05-09 18:44:56 +0200408 b:existing ..= 'NO'
409 assert_equal('noNO', b:existing)
Bram Moolenaard3aac292020-04-19 14:32:17 +0200410
411 w:newvar = 'new'
412 assert_equal('new', w:newvar)
413 assert_equal('yes', w:existing)
414 w:existing = 'no'
415 assert_equal('no', w:existing)
Bram Moolenaar396f3132020-05-09 18:44:56 +0200416 w:existing ..= 'NO'
417 assert_equal('noNO', w:existing)
Bram Moolenaard3aac292020-04-19 14:32:17 +0200418
419 t:newvar = 'new'
420 assert_equal('new', t:newvar)
421 assert_equal('yes', t:existing)
422 t:existing = 'no'
423 assert_equal('no', t:existing)
Bram Moolenaar396f3132020-05-09 18:44:56 +0200424 t:existing ..= 'NO'
425 assert_equal('noNO', t:existing)
Bram Moolenaard3aac292020-04-19 14:32:17 +0200426 enddef
427 call Test_assignment_local_internal()
428 END
429 call CheckScriptSuccess(script_lines)
430enddef
431
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200432def Test_assignment_default()
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200433
Bram Moolenaarcb711ab2020-04-16 13:00:29 +0200434 # Test default values.
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200435 let thebool: bool
436 assert_equal(v:false, thebool)
437
438 let thenumber: number
439 assert_equal(0, thenumber)
440
441 if has('float')
442 let thefloat: float
443 assert_equal(0.0, thefloat)
444 endif
445
446 let thestring: string
447 assert_equal('', thestring)
448
449 let theblob: blob
450 assert_equal(0z, theblob)
451
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200452 let Thefunc: func
453 assert_equal(test_null_function(), Thefunc)
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200454
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200455 let thelist: list<any>
456 assert_equal([], thelist)
457
458 let thedict: dict<any>
459 assert_equal({}, thedict)
460
Bram Moolenaar2c869de2020-04-02 19:12:08 +0200461 if has('channel')
462 let thejob: job
463 assert_equal(test_null_job(), thejob)
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200464
Bram Moolenaar2c869de2020-04-02 19:12:08 +0200465 let thechannel: channel
466 assert_equal(test_null_channel(), thechannel)
Bram Moolenaarc785b9a2020-06-19 18:34:15 +0200467
468 if has('unix') && executable('cat')
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200469 # check with non-null job and channel, types must match
Bram Moolenaarc785b9a2020-06-19 18:34:15 +0200470 thejob = job_start("cat ", #{})
471 thechannel = job_getchannel(thejob)
472 job_stop(thejob, 'kill')
473 endif
Bram Moolenaar2c869de2020-04-02 19:12:08 +0200474 endif
Bram Moolenaar585fea72020-04-02 22:33:21 +0200475
476 let nr = 1234 | nr = 5678
477 assert_equal(5678, nr)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100478enddef
479
Bram Moolenaar47a519a2020-06-14 23:05:10 +0200480def Test_assignment_var_list()
481 let v1: string
482 let v2: string
Bram Moolenaar9af78762020-06-16 11:34:42 +0200483 let vrem: list<string>
484 [v1] = ['aaa']
485 assert_equal('aaa', v1)
486
Bram Moolenaar47a519a2020-06-14 23:05:10 +0200487 [v1, v2] = ['one', 'two']
488 assert_equal('one', v1)
489 assert_equal('two', v2)
Bram Moolenaar9af78762020-06-16 11:34:42 +0200490
491 [v1, v2; vrem] = ['one', 'two']
492 assert_equal('one', v1)
493 assert_equal('two', v2)
494 assert_equal([], vrem)
495
496 [v1, v2; vrem] = ['one', 'two', 'three']
497 assert_equal('one', v1)
498 assert_equal('two', v2)
499 assert_equal(['three'], vrem)
Bram Moolenaar1c199f92020-08-07 21:28:34 +0200500
501 [&ts, &sw] = [3, 4]
502 assert_equal(3, &ts)
503 assert_equal(4, &sw)
504 set ts=8 sw=4
Bram Moolenaar47a519a2020-06-14 23:05:10 +0200505enddef
506
Bram Moolenaarc7e44a72020-07-29 21:37:43 +0200507def Test_assignment_vim9script()
508 let lines =<< trim END
509 vim9script
510 def Func(): list<number>
511 return [1, 2]
512 enddef
513 let var1: number
514 let var2: number
515 [var1, var2] =
516 Func()
517 assert_equal(1, var1)
518 assert_equal(2, var2)
519 let ll =
520 Func()
521 assert_equal([1, 2], ll)
Bram Moolenaar83144542020-08-02 20:40:43 +0200522
523 @/ = 'text'
524 assert_equal('text', @/)
525 @0 = 'zero'
526 assert_equal('zero', @0)
527 @1 = 'one'
528 assert_equal('one', @1)
529 @9 = 'nine'
530 assert_equal('nine', @9)
531 @- = 'minus'
532 assert_equal('minus', @-)
533 if has('clipboard_working')
534 @* = 'star'
535 assert_equal('star', @*)
536 @+ = 'plus'
537 assert_equal('plus', @+)
538 endif
Bram Moolenaar95dd9f22020-08-07 19:28:08 +0200539
540 let a: number = 123
541 assert_equal(123, a)
542 let s: string = 'yes'
543 assert_equal('yes', s)
544 let b: number = 42
545 assert_equal(42, b)
546 let w: number = 43
547 assert_equal(43, w)
548 let t: number = 44
549 assert_equal(44, t)
Bram Moolenaarc7e44a72020-07-29 21:37:43 +0200550 END
551 CheckScriptSuccess(lines)
552enddef
553
Bram Moolenaarcab27672020-04-09 20:10:55 +0200554def Mess(): string
555 v:foldstart = 123
556 return 'xxx'
557enddef
558
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200559def Test_assignment_failure()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200560 CheckDefFailure(['let var=234'], 'E1004:')
561 CheckDefFailure(['let var =234'], 'E1004:')
562 CheckDefFailure(['let var= 234'], 'E1004:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100563
Bram Moolenaard2c61702020-09-06 15:58:36 +0200564 CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:')
565 CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='")
566 CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:')
567 CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:')
568 CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:')
569 CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='")
570 CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:')
571 CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='")
Bram Moolenaar63be3d42020-07-23 13:11:37 +0200572
Bram Moolenaard2c61702020-09-06 15:58:36 +0200573 CheckDefFailure(['let true = 1'], 'E1034:')
574 CheckDefFailure(['let false = 1'], 'E1034:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100575
Bram Moolenaard2c61702020-09-06 15:58:36 +0200576 CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
577 CheckDefExecFailure(['let a: number',
578 '[a] = test_null_list()'], 'E1093:')
579 CheckDefExecFailure(['let a: number',
580 '[a] = []'], 'E1093:')
581 CheckDefExecFailure(['let x: number',
582 'let y: number',
583 '[x, y] = [1]'], 'E1093:')
584 CheckDefExecFailure(['let x: number',
585 'let y: number',
586 'let z: list<number>',
587 '[x, y; z] = [1]'], 'E1093:')
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200588
Bram Moolenaard2c61702020-09-06 15:58:36 +0200589 CheckDefFailure(['let somevar'], "E1022:")
590 CheckDefFailure(['let &tabstop = 4'], 'E1052:')
591 CheckDefFailure(['&g:option = 5'], 'E113:')
592 CheckScriptFailure(['vim9script', 'let &tabstop = 4'], 'E1052:')
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200593
Bram Moolenaard2c61702020-09-06 15:58:36 +0200594 CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
595 CheckScriptFailure(['vim9script', 'let $ENV = "xxx"'], 'E1016:')
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200596
Bram Moolenaar434d72c2020-08-02 20:03:25 +0200597 if has('dnd')
Bram Moolenaard2c61702020-09-06 15:58:36 +0200598 CheckDefFailure(['let @~ = 5'], 'E1066:')
Bram Moolenaar434d72c2020-08-02 20:03:25 +0200599 else
Bram Moolenaard2c61702020-09-06 15:58:36 +0200600 CheckDefFailure(['let @~ = 5'], 'E354:')
601 CheckDefFailure(['@~ = 5'], 'E354:')
Bram Moolenaar434d72c2020-08-02 20:03:25 +0200602 endif
Bram Moolenaard2c61702020-09-06 15:58:36 +0200603 CheckDefFailure(['let @a = 5'], 'E1066:')
604 CheckDefFailure(['let @/ = "x"'], 'E1066:')
605 CheckScriptFailure(['vim9script', 'let @a = "abc"'], 'E1066:')
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200606
Bram Moolenaard2c61702020-09-06 15:58:36 +0200607 CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
608 CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
609 CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
610 CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200611
Bram Moolenaard2c61702020-09-06 15:58:36 +0200612 CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
613 CheckDefFailure(['let xnr += 4'], 'E1020:', 1)
614 CheckScriptFailure(['vim9script', 'let xnr += 4'], 'E1020:')
615 CheckDefFailure(["let xnr = xnr + 1"], 'E1001:', 1)
616 CheckScriptFailure(['vim9script', 'let xnr = xnr + 4'], 'E121:')
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200617
Bram Moolenaard2c61702020-09-06 15:58:36 +0200618 CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1108:')
Bram Moolenaar33fa29c2020-03-28 19:41:33 +0100619
Bram Moolenaard2c61702020-09-06 15:58:36 +0200620 CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
621 CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100622
Bram Moolenaard2c61702020-09-06 15:58:36 +0200623 CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
624 CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100625
Bram Moolenaard2c61702020-09-06 15:58:36 +0200626 CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
627 CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100628
Bram Moolenaard2c61702020-09-06 15:58:36 +0200629 CheckDefFailure(['let var: dict <number>'], 'E1068:')
630 CheckDefFailure(['let var: dict<number'], 'E1009:')
Bram Moolenaarcab27672020-04-09 20:10:55 +0200631
Bram Moolenaard2c61702020-09-06 15:58:36 +0200632 assert_fails('s/^/\=Mess()/n', 'E794:')
633 CheckDefFailure(['let var: dict<number'], 'E1009:')
Bram Moolenaar43e969d2020-07-23 21:14:43 +0200634
Bram Moolenaard2c61702020-09-06 15:58:36 +0200635 CheckDefFailure(['w:foo: number = 10'],
636 'E488: Trailing characters: : number = 1')
637 CheckDefFailure(['t:foo: bool = true'],
638 'E488: Trailing characters: : bool = true')
639 CheckDefFailure(['b:foo: string = "x"'],
640 'E488: Trailing characters: : string = "x"')
641 CheckDefFailure(['g:foo: number = 123'],
642 'E488: Trailing characters: : number = 123')
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200643enddef
644
645def Test_unlet()
646 g:somevar = 'yes'
647 assert_true(exists('g:somevar'))
648 unlet g:somevar
649 assert_false(exists('g:somevar'))
650 unlet! g:somevar
651
Bram Moolenaar84367732020-08-23 15:21:55 +0200652 # also works for script-local variable in legacy Vim script
653 s:somevar = 'legacy'
654 assert_true(exists('s:somevar'))
655 unlet s:somevar
656 assert_false(exists('s:somevar'))
657 unlet! s:somevar
658
Bram Moolenaard2c61702020-09-06 15:58:36 +0200659 CheckScriptFailure([
660 'vim9script',
661 'let svar = 123',
662 'unlet svar',
663 ], 'E1081:')
664 CheckScriptFailure([
665 'vim9script',
666 'let svar = 123',
667 'unlet s:svar',
668 ], 'E1081:')
669 CheckScriptFailure([
670 'vim9script',
671 'let svar = 123',
672 'def Func()',
673 ' unlet svar',
674 'enddef',
675 'defcompile',
676 ], 'E1081:')
677 CheckScriptFailure([
678 'vim9script',
679 'let svar = 123',
680 'def Func()',
681 ' unlet s:svar',
682 'enddef',
683 'defcompile',
684 ], 'E1081:')
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200685
686 $ENVVAR = 'foobar'
687 assert_equal('foobar', $ENVVAR)
688 unlet $ENVVAR
689 assert_equal('', $ENVVAR)
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200690enddef
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100691
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200692def Test_delfunction()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200693 # Check function is defined in script namespace
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200694 CheckScriptSuccess([
695 'vim9script',
696 'func CheckMe()',
697 ' return 123',
698 'endfunc',
699 'assert_equal(123, s:CheckMe())',
700 ])
701
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200702 # Check function in script namespace cannot be deleted
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200703 CheckScriptFailure([
704 'vim9script',
705 'func DeleteMe1()',
706 'endfunc',
707 'delfunction DeleteMe1',
708 ], 'E1084:')
709 CheckScriptFailure([
710 'vim9script',
711 'func DeleteMe2()',
712 'endfunc',
713 'def DoThat()',
714 ' delfunction DeleteMe2',
715 'enddef',
716 'DoThat()',
717 ], 'E1084:')
718 CheckScriptFailure([
719 'vim9script',
720 'def DeleteMe3()',
721 'enddef',
722 'delfunction DeleteMe3',
723 ], 'E1084:')
724 CheckScriptFailure([
725 'vim9script',
726 'def DeleteMe4()',
727 'enddef',
728 'def DoThat()',
729 ' delfunction DeleteMe4',
730 'enddef',
731 'DoThat()',
732 ], 'E1084:')
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200733
734 # Check that global :def function can be replaced and deleted
735 let lines =<< trim END
736 vim9script
737 def g:Global(): string
738 return "yes"
739 enddef
740 assert_equal("yes", g:Global())
741 def! g:Global(): string
742 return "no"
743 enddef
744 assert_equal("no", g:Global())
745 delfunc g:Global
746 assert_false(exists('*g:Global'))
747 END
748 CheckScriptSuccess(lines)
749
750 # Check that global function can be replaced by a :def function and deleted
751 lines =<< trim END
752 vim9script
753 func g:Global()
754 return "yes"
755 endfunc
756 assert_equal("yes", g:Global())
757 def! g:Global(): string
758 return "no"
759 enddef
760 assert_equal("no", g:Global())
761 delfunc g:Global
762 assert_false(exists('*g:Global'))
763 END
764 CheckScriptSuccess(lines)
765
766 # Check that global :def function can be replaced by a function and deleted
767 lines =<< trim END
768 vim9script
769 def g:Global(): string
770 return "yes"
771 enddef
772 assert_equal("yes", g:Global())
773 func! g:Global()
774 return "no"
775 endfunc
776 assert_equal("no", g:Global())
777 delfunc g:Global
778 assert_false(exists('*g:Global'))
779 END
780 CheckScriptSuccess(lines)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200781enddef
782
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100783func Test_wrong_type()
784 call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
785 call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
786 call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
787 call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
788
789 call CheckDefFailure(['let var: dict<number'], 'E1009:')
790 call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100791
792 call CheckDefFailure(['let var: ally'], 'E1010:')
793 call CheckDefFailure(['let var: bram'], 'E1010:')
794 call CheckDefFailure(['let var: cathy'], 'E1010:')
795 call CheckDefFailure(['let var: dom'], 'E1010:')
796 call CheckDefFailure(['let var: freddy'], 'E1010:')
797 call CheckDefFailure(['let var: john'], 'E1010:')
798 call CheckDefFailure(['let var: larry'], 'E1010:')
799 call CheckDefFailure(['let var: ned'], 'E1010:')
800 call CheckDefFailure(['let var: pam'], 'E1010:')
801 call CheckDefFailure(['let var: sam'], 'E1010:')
802 call CheckDefFailure(['let var: vim'], 'E1010:')
Bram Moolenaara0a9f432020-04-28 21:29:34 +0200803
804 call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
805 call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100806endfunc
807
808func Test_const()
809 call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
810 call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
811 call CheckDefFailure(['const two'], 'E1021:')
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200812 call CheckDefFailure(['const &option'], 'E996:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100813endfunc
814
Bram Moolenaardf069ee2020-06-22 23:02:51 +0200815def Test_range_no_colon()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200816 CheckDefFailure(['%s/a/b/'], 'E1050:')
817 CheckDefFailure(['+ s/a/b/'], 'E1050:')
818 CheckDefFailure(['- s/a/b/'], 'E1050:')
819 CheckDefFailure(['. s/a/b/'], 'E1050:')
Bram Moolenaardf069ee2020-06-22 23:02:51 +0200820enddef
821
822
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100823def Test_block()
824 let outer = 1
825 {
826 let inner = 2
827 assert_equal(1, outer)
828 assert_equal(2, inner)
829 }
830 assert_equal(1, outer)
831enddef
832
833func Test_block_failure()
834 call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200835 call CheckDefFailure(['}'], 'E1025:')
836 call CheckDefFailure(['{', 'echo 1'], 'E1026:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100837endfunc
838
Bram Moolenaard032f342020-07-18 18:13:02 +0200839func g:NoSuchFunc()
840 echo 'none'
841endfunc
842
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100843def Test_try_catch()
844 let l = []
Bram Moolenaar7a092242020-04-16 22:10:49 +0200845 try # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100846 add(l, '1')
847 throw 'wrong'
848 add(l, '2')
Bram Moolenaar7a092242020-04-16 22:10:49 +0200849 catch # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100850 add(l, v:exception)
Bram Moolenaar7a092242020-04-16 22:10:49 +0200851 finally # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100852 add(l, '3')
Bram Moolenaar7a092242020-04-16 22:10:49 +0200853 endtry # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100854 assert_equal(['1', 'wrong', '3'], l)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200855
Bram Moolenaare8593122020-07-18 15:17:02 +0200856 l = []
857 try
858 try
859 add(l, '1')
860 throw 'wrong'
861 add(l, '2')
862 catch /right/
863 add(l, v:exception)
864 endtry
865 catch /wrong/
866 add(l, 'caught')
867 finally
868 add(l, 'finally')
869 endtry
870 assert_equal(['1', 'caught', 'finally'], l)
871
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200872 let n: number
873 try
874 n = l[3]
875 catch /E684:/
876 n = 99
877 endtry
878 assert_equal(99, n)
879
880 try
Bram Moolenaarcc673e72020-08-16 17:33:35 +0200881 # string slice returns a string, not a number
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200882 n = g:astring[3]
Bram Moolenaar56acb092020-08-16 14:48:19 +0200883 catch /E1029:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200884 n = 77
885 endtry
886 assert_equal(77, n)
887
888 try
889 n = l[g:astring]
Bram Moolenaar56acb092020-08-16 14:48:19 +0200890 catch /E1029:/
891 n = 88
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200892 endtry
Bram Moolenaar56acb092020-08-16 14:48:19 +0200893 assert_equal(88, n)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200894
895 try
896 n = s:does_not_exist
897 catch /E121:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200898 n = 111
899 endtry
900 assert_equal(111, n)
901
902 try
903 n = g:does_not_exist
904 catch /E121:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200905 n = 121
906 endtry
907 assert_equal(121, n)
908
909 let d = #{one: 1}
910 try
911 n = d[g:astring]
912 catch /E716:/
913 n = 222
914 endtry
915 assert_equal(222, n)
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200916
917 try
918 n = -g:astring
919 catch /E39:/
920 n = 233
921 endtry
922 assert_equal(233, n)
923
924 try
925 n = +g:astring
926 catch /E1030:/
927 n = 244
928 endtry
929 assert_equal(244, n)
930
931 try
932 n = +g:alist
933 catch /E745:/
934 n = 255
935 endtry
936 assert_equal(255, n)
937
938 let nd: dict<any>
939 try
940 nd = {g:anumber: 1}
941 catch /E1029:/
942 n = 266
943 endtry
944 assert_equal(266, n)
945
946 try
947 [n] = [1, 2, 3]
948 catch /E1093:/
949 n = 277
950 endtry
951 assert_equal(277, n)
952
Bram Moolenaare8593122020-07-18 15:17:02 +0200953 try
954 &ts = g:astring
955 catch /E1029:/
956 n = 288
957 endtry
958 assert_equal(288, n)
959
960 try
961 &backspace = 'asdf'
962 catch /E474:/
963 n = 299
964 endtry
965 assert_equal(299, n)
966
967 l = [1]
968 try
969 l[3] = 3
970 catch /E684:/
971 n = 300
972 endtry
973 assert_equal(300, n)
974
975 try
Bram Moolenaare8593122020-07-18 15:17:02 +0200976 unlet g:does_not_exist
977 catch /E108:/
978 n = 322
979 endtry
980 assert_equal(322, n)
981
982 try
983 d = {'text': 1, g:astring: 2}
984 catch /E721:/
985 n = 333
986 endtry
987 assert_equal(333, n)
988
989 try
990 l = DeletedFunc()
991 catch /E933:/
992 n = 344
993 endtry
994 assert_equal(344, n)
Bram Moolenaard032f342020-07-18 18:13:02 +0200995
996 try
997 echo len(v:true)
998 catch /E701:/
999 n = 355
1000 endtry
1001 assert_equal(355, n)
1002
1003 let P = function('g:NoSuchFunc')
1004 delfunc g:NoSuchFunc
1005 try
1006 echo P()
1007 catch /E117:/
1008 n = 366
1009 endtry
1010 assert_equal(366, n)
1011
1012 try
1013 echo g:NoSuchFunc()
1014 catch /E117:/
1015 n = 377
1016 endtry
1017 assert_equal(377, n)
1018
1019 try
1020 echo g:alist + 4
1021 catch /E745:/
1022 n = 388
1023 endtry
1024 assert_equal(388, n)
1025
1026 try
1027 echo 4 + g:alist
1028 catch /E745:/
1029 n = 399
1030 endtry
1031 assert_equal(399, n)
1032
1033 try
1034 echo g:alist.member
1035 catch /E715:/
1036 n = 400
1037 endtry
1038 assert_equal(400, n)
1039
1040 try
1041 echo d.member
1042 catch /E716:/
1043 n = 411
1044 endtry
1045 assert_equal(411, n)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001046enddef
1047
Bram Moolenaare8593122020-07-18 15:17:02 +02001048def DeletedFunc(): list<any>
1049 return ['delete me']
1050enddef
1051defcompile
1052delfunc DeletedFunc
1053
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001054def ThrowFromDef()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001055 throw "getout" # comment
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001056enddef
1057
1058func CatchInFunc()
1059 try
1060 call ThrowFromDef()
1061 catch
1062 let g:thrown_func = v:exception
1063 endtry
1064endfunc
1065
1066def CatchInDef()
1067 try
1068 ThrowFromDef()
1069 catch
1070 g:thrown_def = v:exception
1071 endtry
1072enddef
1073
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001074def ReturnFinally(): string
1075 try
1076 return 'intry'
1077 finally
1078 g:in_finally = 'finally'
1079 endtry
1080 return 'end'
1081enddef
1082
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001083def Test_try_catch_nested()
1084 CatchInFunc()
1085 assert_equal('getout', g:thrown_func)
1086
1087 CatchInDef()
1088 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001089
1090 assert_equal('intry', ReturnFinally())
1091 assert_equal('finally', g:in_finally)
1092enddef
1093
1094def Test_try_catch_match()
1095 let seq = 'a'
1096 try
1097 throw 'something'
1098 catch /nothing/
1099 seq ..= 'x'
1100 catch /some/
1101 seq ..= 'b'
1102 catch /asdf/
1103 seq ..= 'x'
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001104 catch ?a\?sdf?
1105 seq ..= 'y'
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001106 finally
1107 seq ..= 'c'
1108 endtry
1109 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001110enddef
1111
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001112def Test_try_catch_fails()
Bram Moolenaard2c61702020-09-06 15:58:36 +02001113 CheckDefFailure(['catch'], 'E603:')
1114 CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1115 CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1116 CheckDefFailure(['finally'], 'E606:')
1117 CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1118 CheckDefFailure(['endtry'], 'E602:')
1119 CheckDefFailure(['while 1', 'endtry'], 'E170:')
1120 CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1121 CheckDefFailure(['if 2', 'endtry'], 'E171:')
1122 CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001123
Bram Moolenaard2c61702020-09-06 15:58:36 +02001124 CheckDefFailure(['throw'], 'E1015:')
1125 CheckDefFailure(['throw xxx'], 'E1001:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001126enddef
1127
Bram Moolenaar006ad482020-06-30 20:55:15 +02001128def Test_throw_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001129 # only checks line continuation
Bram Moolenaar006ad482020-06-30 20:55:15 +02001130 let lines =<< trim END
1131 vim9script
1132 try
1133 throw 'one'
1134 .. 'two'
1135 catch
1136 assert_equal('onetwo', v:exception)
1137 endtry
1138 END
1139 CheckScriptSuccess(lines)
1140enddef
1141
Bram Moolenaared677f52020-08-12 16:38:10 +02001142def Test_error_in_nested_function()
1143 # an error in a nested :function aborts executin in the calling :def function
1144 let lines =<< trim END
1145 vim9script
1146 def Func()
1147 Error()
1148 g:test_var = 1
1149 enddef
1150 func Error() abort
1151 eval [][0]
1152 endfunc
1153 Func()
1154 END
1155 g:test_var = 0
1156 CheckScriptFailure(lines, 'E684:')
1157 assert_equal(0, g:test_var)
1158enddef
1159
Bram Moolenaar37c83712020-06-30 21:18:36 +02001160def Test_cexpr_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001161 # only checks line continuation
Bram Moolenaar37c83712020-06-30 21:18:36 +02001162 set errorformat=File\ %f\ line\ %l
1163 let lines =<< trim END
1164 vim9script
1165 cexpr 'File'
1166 .. ' someFile' ..
1167 ' line 19'
1168 assert_equal(19, getqflist()[0].lnum)
1169 END
1170 CheckScriptSuccess(lines)
1171 set errorformat&
1172enddef
1173
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001174def Test_statusline_syntax()
1175 # legacy syntax is used for 'statusline'
1176 let lines =<< trim END
1177 vim9script
1178 func g:Status()
1179 return '%{"x" is# "x"}'
1180 endfunc
1181 set laststatus=2 statusline=%!Status()
1182 redrawstatus
1183 set laststatus statusline=
1184 END
1185 CheckScriptSuccess(lines)
1186enddef
1187
Bram Moolenaarb2097502020-07-19 17:17:02 +02001188def Test_list_vimscript()
1189 # checks line continuation and comments
1190 let lines =<< trim END
1191 vim9script
1192 let mylist = [
1193 'one',
1194 # comment
1195 'two', # empty line follows
1196
1197 'three',
1198 ]
1199 assert_equal(['one', 'two', 'three'], mylist)
1200 END
1201 CheckScriptSuccess(lines)
Bram Moolenaar66250c92020-08-20 15:02:42 +02001202
1203 # check all lines from heredoc are kept
1204 lines =<< trim END
1205 # comment 1
1206 two
1207 # comment 3
1208
1209 five
1210 # comment 6
1211 END
1212 assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
Bram Moolenaarb2097502020-07-19 17:17:02 +02001213enddef
1214
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001215if has('channel')
1216 let someJob = test_null_job()
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001217
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001218 def FuncWithError()
1219 echomsg g:someJob
1220 enddef
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001221
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001222 func Test_convert_emsg_to_exception()
1223 try
1224 call FuncWithError()
1225 catch
1226 call assert_match('Vim:E908:', v:exception)
1227 endtry
1228 endfunc
1229endif
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001230
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001231let s:export_script_lines =<< trim END
1232 vim9script
1233 let name: string = 'bob'
1234 def Concat(arg: string): string
1235 return name .. arg
1236 enddef
Bram Moolenaar227a69d2020-05-15 18:17:28 +02001237 g:result = Concat('bie')
1238 g:localname = name
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001239
1240 export const CONST = 1234
1241 export let exported = 9876
Bram Moolenaar6e587dc2020-02-06 13:15:52 +01001242 export let exp_name = 'John'
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001243 export def Exported(): string
1244 return 'Exported'
1245 enddef
1246END
1247
Bram Moolenaarb3ca9822020-08-09 14:43:58 +02001248def Undo_export_script_lines()
1249 unlet g:result
1250 unlet g:localname
1251enddef
1252
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001253def Test_vim9_import_export()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001254 let import_script_lines =<< trim END
1255 vim9script
1256 import {exported, Exported} from './Xexport.vim'
1257 g:imported = exported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +01001258 exported += 3
1259 g:imported_added = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001260 g:imported_func = Exported()
Bram Moolenaar6e587dc2020-02-06 13:15:52 +01001261
Bram Moolenaar40f4f7a2020-07-23 22:41:43 +02001262 def GetExported(): string
1263 let local_dict = #{ref: Exported}
1264 return local_dict.ref()
1265 enddef
1266 g:funcref_result = GetExported()
1267
Bram Moolenaar6e587dc2020-02-06 13:15:52 +01001268 import {exp_name} from './Xexport.vim'
1269 g:imported_name = exp_name
1270 exp_name ..= ' Doe'
1271 g:imported_name_appended = exp_name
Bram Moolenaar5381c7a2020-03-02 22:53:32 +01001272 g:imported_later = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001273 END
1274
1275 writefile(import_script_lines, 'Ximport.vim')
1276 writefile(s:export_script_lines, 'Xexport.vim')
1277
1278 source Ximport.vim
1279
1280 assert_equal('bobbie', g:result)
1281 assert_equal('bob', g:localname)
1282 assert_equal(9876, g:imported)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +01001283 assert_equal(9879, g:imported_added)
Bram Moolenaar5381c7a2020-03-02 22:53:32 +01001284 assert_equal(9879, g:imported_later)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001285 assert_equal('Exported', g:imported_func)
Bram Moolenaar40f4f7a2020-07-23 22:41:43 +02001286 assert_equal('Exported', g:funcref_result)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +01001287 assert_equal('John', g:imported_name)
1288 assert_equal('John Doe', g:imported_name_appended)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001289 assert_false(exists('g:name'))
1290
Bram Moolenaarb3ca9822020-08-09 14:43:58 +02001291 Undo_export_script_lines()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001292 unlet g:imported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +01001293 unlet g:imported_added
Bram Moolenaar5381c7a2020-03-02 22:53:32 +01001294 unlet g:imported_later
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001295 unlet g:imported_func
Bram Moolenaar6e587dc2020-02-06 13:15:52 +01001296 unlet g:imported_name g:imported_name_appended
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001297 delete('Ximport.vim')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001298
Bram Moolenaar1c991142020-07-04 13:15:31 +02001299 # similar, with line breaks
1300 let import_line_break_script_lines =<< trim END
1301 vim9script
1302 import {
1303 exported,
1304 Exported,
1305 }
1306 from
1307 './Xexport.vim'
1308 g:imported = exported
1309 exported += 5
1310 g:imported_added = exported
1311 g:imported_func = Exported()
1312 END
1313 writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
1314 source Ximport_lbr.vim
1315
1316 assert_equal(9876, g:imported)
1317 assert_equal(9881, g:imported_added)
1318 assert_equal('Exported', g:imported_func)
1319
1320 # exported script not sourced again
1321 assert_false(exists('g:result'))
1322 unlet g:imported
1323 unlet g:imported_added
1324 unlet g:imported_func
1325 delete('Ximport_lbr.vim')
1326
1327 # import inside :def function
Bram Moolenaar5381c7a2020-03-02 22:53:32 +01001328 let import_in_def_lines =<< trim END
1329 vim9script
1330 def ImportInDef()
1331 import exported from './Xexport.vim'
1332 g:imported = exported
1333 exported += 7
1334 g:imported_added = exported
1335 enddef
1336 ImportInDef()
1337 END
1338 writefile(import_in_def_lines, 'Ximport2.vim')
1339 source Ximport2.vim
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001340 # TODO: this should be 9879
Bram Moolenaar5381c7a2020-03-02 22:53:32 +01001341 assert_equal(9876, g:imported)
1342 assert_equal(9883, g:imported_added)
1343 unlet g:imported
1344 unlet g:imported_added
1345 delete('Ximport2.vim')
1346
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001347 let import_star_as_lines =<< trim END
1348 vim9script
1349 import * as Export from './Xexport.vim'
1350 def UseExport()
1351 g:imported = Export.exported
1352 enddef
1353 UseExport()
1354 END
1355 writefile(import_star_as_lines, 'Ximport.vim')
1356 source Ximport.vim
Bram Moolenaar5381c7a2020-03-02 22:53:32 +01001357 assert_equal(9883, g:imported)
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001358
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001359 let import_star_as_lines_no_dot =<< trim END
1360 vim9script
1361 import * as Export from './Xexport.vim'
1362 def Func()
1363 let dummy = 1
1364 let imported = Export + dummy
1365 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +02001366 defcompile
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001367 END
1368 writefile(import_star_as_lines_no_dot, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001369 assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001370
1371 let import_star_as_lines_dot_space =<< trim END
1372 vim9script
1373 import * as Export from './Xexport.vim'
1374 def Func()
1375 let imported = Export . exported
1376 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +02001377 defcompile
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001378 END
1379 writefile(import_star_as_lines_dot_space, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001380 assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001381
1382 let import_star_as_lines_missing_name =<< trim END
1383 vim9script
1384 import * as Export from './Xexport.vim'
1385 def Func()
1386 let imported = Export.
1387 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +02001388 defcompile
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001389 END
1390 writefile(import_star_as_lines_missing_name, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001391 assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001392
Bram Moolenaar1c991142020-07-04 13:15:31 +02001393 let import_star_as_lbr_lines =<< trim END
1394 vim9script
1395 import *
1396 as Export
1397 from
1398 './Xexport.vim'
1399 def UseExport()
1400 g:imported = Export.exported
1401 enddef
1402 UseExport()
1403 END
1404 writefile(import_star_as_lbr_lines, 'Ximport.vim')
1405 source Ximport.vim
1406 assert_equal(9883, g:imported)
1407
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001408 let import_star_lines =<< trim END
1409 vim9script
1410 import * from './Xexport.vim'
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001411 END
1412 writefile(import_star_lines, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001413 assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001414
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001415 # try to import something that exists but is not exported
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001416 let import_not_exported_lines =<< trim END
1417 vim9script
1418 import name from './Xexport.vim'
1419 END
1420 writefile(import_not_exported_lines, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001421 assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001422
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001423 # try to import something that is already defined
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001424 let import_already_defined =<< trim END
1425 vim9script
1426 let exported = 'something'
1427 import exported from './Xexport.vim'
1428 END
1429 writefile(import_already_defined, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001430 assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001431
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001432 # try to import something that is already defined
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001433 import_already_defined =<< trim END
1434 vim9script
1435 let exported = 'something'
1436 import * as exported from './Xexport.vim'
1437 END
1438 writefile(import_already_defined, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001439 assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001440
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001441 # try to import something that is already defined
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001442 import_already_defined =<< trim END
1443 vim9script
1444 let exported = 'something'
1445 import {exported} from './Xexport.vim'
1446 END
1447 writefile(import_already_defined, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001448 assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001449
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001450 # import a very long name, requires making a copy
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001451 let import_long_name_lines =<< trim END
1452 vim9script
1453 import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1454 END
1455 writefile(import_long_name_lines, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001456 assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001457
1458 let import_no_from_lines =<< trim END
1459 vim9script
1460 import name './Xexport.vim'
1461 END
1462 writefile(import_no_from_lines, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001463 assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001464
1465 let import_invalid_string_lines =<< trim END
1466 vim9script
1467 import name from Xexport.vim
1468 END
1469 writefile(import_invalid_string_lines, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001470 assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001471
1472 let import_wrong_name_lines =<< trim END
1473 vim9script
1474 import name from './XnoExport.vim'
1475 END
1476 writefile(import_wrong_name_lines, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001477 assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001478
1479 let import_missing_comma_lines =<< trim END
1480 vim9script
1481 import {exported name} from './Xexport.vim'
1482 END
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001483 writefile(import_missing_comma_lines, 'Ximport3.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001484 assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001485
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001486 delete('Ximport.vim')
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001487 delete('Ximport3.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001488 delete('Xexport.vim')
1489
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001490 # Check that in a Vim9 script 'cpo' is set to the Vim default.
Bram Moolenaar750802b2020-02-23 18:08:33 +01001491 set cpo&vi
1492 let cpo_before = &cpo
1493 let lines =<< trim END
1494 vim9script
1495 g:cpo_in_vim9script = &cpo
1496 END
1497 writefile(lines, 'Xvim9_script')
1498 source Xvim9_script
1499 assert_equal(cpo_before, &cpo)
1500 set cpo&vim
1501 assert_equal(&cpo, g:cpo_in_vim9script)
1502 delete('Xvim9_script')
1503enddef
1504
Bram Moolenaar803af682020-08-05 16:20:03 +02001505func g:Trigger()
1506 source Ximport.vim
1507 return "echo 'yes'\<CR>"
1508endfunc
1509
1510def Test_import_export_expr_map()
1511 # check that :import and :export work when buffer is locked
1512 let export_lines =<< trim END
1513 vim9script
1514 export def That(): string
1515 return 'yes'
1516 enddef
1517 END
1518 writefile(export_lines, 'Xexport_that.vim')
1519
1520 let import_lines =<< trim END
1521 vim9script
1522 import That from './Xexport_that.vim'
1523 assert_equal('yes', That())
1524 END
1525 writefile(import_lines, 'Ximport.vim')
1526
1527 nnoremap <expr> trigger g:Trigger()
1528 feedkeys('trigger', "xt")
1529
Bram Moolenaar730b2482020-08-09 13:02:10 +02001530 delete('Xexport_that.vim')
Bram Moolenaar803af682020-08-05 16:20:03 +02001531 delete('Ximport.vim')
1532 nunmap trigger
1533enddef
1534
Bram Moolenaar8e1986e2020-08-06 22:11:06 +02001535def Test_import_in_filetype()
1536 # check that :import works when the buffer is locked
1537 mkdir('ftplugin', 'p')
1538 let export_lines =<< trim END
1539 vim9script
1540 export let That = 'yes'
1541 END
Bram Moolenaar730b2482020-08-09 13:02:10 +02001542 writefile(export_lines, 'ftplugin/Xexport_ft.vim')
Bram Moolenaar8e1986e2020-08-06 22:11:06 +02001543
1544 let import_lines =<< trim END
1545 vim9script
Bram Moolenaar730b2482020-08-09 13:02:10 +02001546 import That from './Xexport_ft.vim'
Bram Moolenaar8e1986e2020-08-06 22:11:06 +02001547 assert_equal('yes', That)
1548 g:did_load_mytpe = 1
1549 END
1550 writefile(import_lines, 'ftplugin/qf.vim')
1551
1552 let save_rtp = &rtp
1553 &rtp = getcwd() .. ',' .. &rtp
1554
1555 filetype plugin on
1556 copen
1557 assert_equal(1, g:did_load_mytpe)
1558
1559 quit!
Bram Moolenaar730b2482020-08-09 13:02:10 +02001560 delete('Xexport_ft.vim')
Bram Moolenaar8e1986e2020-08-06 22:11:06 +02001561 delete('ftplugin', 'rf')
1562 &rtp = save_rtp
1563enddef
1564
Bram Moolenaarefa94442020-08-08 22:16:00 +02001565def Test_use_import_in_mapping()
1566 let lines =<< trim END
1567 vim9script
1568 export def Funcx()
1569 g:result = 42
1570 enddef
1571 END
1572 writefile(lines, 'XsomeExport.vim')
1573 lines =<< trim END
1574 vim9script
1575 import Funcx from './XsomeExport.vim'
Bram Moolenaarb3ca9822020-08-09 14:43:58 +02001576 nnoremap <F3> :call <sid>Funcx()<cr>
Bram Moolenaarefa94442020-08-08 22:16:00 +02001577 END
1578 writefile(lines, 'Xmapscript.vim')
1579
1580 source Xmapscript.vim
Bram Moolenaarb3ca9822020-08-09 14:43:58 +02001581 feedkeys("\<F3>", "xt")
Bram Moolenaarefa94442020-08-08 22:16:00 +02001582 assert_equal(42, g:result)
1583
1584 unlet g:result
1585 delete('XsomeExport.vim')
1586 delete('Xmapscript.vim')
Bram Moolenaarb3ca9822020-08-09 14:43:58 +02001587 nunmap <F3>
Bram Moolenaarefa94442020-08-08 22:16:00 +02001588enddef
1589
Bram Moolenaar750802b2020-02-23 18:08:33 +01001590def Test_vim9script_fails()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001591 CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
1592 CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +01001593 CheckScriptFailure(['export let some = 123'], 'E1042:')
Bram Moolenaar9721fb42020-06-11 23:10:46 +02001594 CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +02001595 CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
Bram Moolenaar750802b2020-02-23 18:08:33 +01001596 CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1597
Bram Moolenaar451c2e32020-08-15 16:33:28 +02001598 CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1012:')
Bram Moolenaarc785b9a2020-06-19 18:34:15 +02001599 CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1600
Bram Moolenaare2e40752020-09-04 21:18:46 +02001601 assert_fails('vim9script', 'E1038:')
1602 assert_fails('export something', 'E1043:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001603enddef
1604
Bram Moolenaarf7d267e2020-06-17 12:04:54 +02001605func Test_import_fails_without_script()
Bram Moolenaar101f4812020-06-16 23:18:51 +02001606 CheckRunVimInTerminal
1607
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001608 " call indirectly to avoid compilation error for missing functions
Bram Moolenaarc620c052020-07-08 15:16:19 +02001609 call Run_Test_import_fails_on_command_line()
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001610endfunc
1611
Bram Moolenaarc620c052020-07-08 15:16:19 +02001612def Run_Test_import_fails_on_command_line()
Bram Moolenaar101f4812020-06-16 23:18:51 +02001613 let export =<< trim END
1614 vim9script
1615 export def Foo(): number
1616 return 0
1617 enddef
1618 END
Bram Moolenaar730b2482020-08-09 13:02:10 +02001619 writefile(export, 'XexportCmd.vim')
Bram Moolenaar101f4812020-06-16 23:18:51 +02001620
Bram Moolenaar730b2482020-08-09 13:02:10 +02001621 let buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001622 rows: 6, wait_for_ruler: 0})
1623 WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
Bram Moolenaar101f4812020-06-16 23:18:51 +02001624
Bram Moolenaar730b2482020-08-09 13:02:10 +02001625 delete('XexportCmd.vim')
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001626 StopVimInTerminal(buf)
1627enddef
Bram Moolenaar101f4812020-06-16 23:18:51 +02001628
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001629def Test_vim9script_reload_import()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001630 let lines =<< trim END
1631 vim9script
1632 const var = ''
1633 let valone = 1234
1634 def MyFunc(arg: string)
1635 valone = 5678
1636 enddef
1637 END
1638 let morelines =<< trim END
1639 let valtwo = 222
1640 export def GetValtwo(): number
1641 return valtwo
1642 enddef
1643 END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001644 writefile(lines + morelines, 'Xreload.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001645 source Xreload.vim
1646 source Xreload.vim
1647 source Xreload.vim
1648
1649 let testlines =<< trim END
1650 vim9script
1651 def TheFunc()
1652 import GetValtwo from './Xreload.vim'
1653 assert_equal(222, GetValtwo())
1654 enddef
1655 TheFunc()
1656 END
1657 writefile(testlines, 'Ximport.vim')
1658 source Ximport.vim
1659
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001660 # Test that when not using "morelines" GetValtwo() and valtwo are still
1661 # defined, because import doesn't reload a script.
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001662 writefile(lines, 'Xreload.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001663 source Ximport.vim
1664
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001665 # cannot declare a var twice
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001666 lines =<< trim END
1667 vim9script
1668 let valone = 1234
1669 let valone = 5678
1670 END
1671 writefile(lines, 'Xreload.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001672 assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001673
1674 delete('Xreload.vim')
1675 delete('Ximport.vim')
1676enddef
1677
Bram Moolenaar95006e32020-08-29 17:47:08 +02001678def s:RetSome(): string
1679 return 'some'
1680enddef
1681
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001682" Not exported function that is referenced needs to be accessed by the
1683" script-local name.
1684def Test_vim9script_funcref()
1685 let sortlines =<< trim END
1686 vim9script
1687 def Compare(i1: number, i2: number): number
Bram Moolenaarbed36b92020-07-07 23:31:36 +02001688 return i2 - i1
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001689 enddef
1690
1691 export def FastSort(): list<number>
1692 return range(5)->sort(Compare)
1693 enddef
1694 END
1695 writefile(sortlines, 'Xsort.vim')
1696
1697 let lines =<< trim END
1698 vim9script
1699 import FastSort from './Xsort.vim'
1700 def Test()
1701 g:result = FastSort()
1702 enddef
1703 Test()
1704 END
1705 writefile(lines, 'Xscript.vim')
1706
1707 source Xscript.vim
1708 assert_equal([4, 3, 2, 1, 0], g:result)
1709
1710 unlet g:result
1711 delete('Xsort.vim')
1712 delete('Xscript.vim')
Bram Moolenaar95006e32020-08-29 17:47:08 +02001713
1714 let Funcref = function('s:RetSome')
1715 assert_equal('some', Funcref())
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001716enddef
1717
Bram Moolenaar601e76a2020-08-27 21:33:10 +02001718" Check that when searching for "FilterFunc" it finds the import in the
1719" script where FastFilter() is called from, both as a string and as a direct
1720" function reference.
Bram Moolenaarc620c052020-07-08 15:16:19 +02001721def Test_vim9script_funcref_other_script()
1722 let filterLines =<< trim END
1723 vim9script
1724 export def FilterFunc(idx: number, val: number): bool
1725 return idx % 2 == 1
1726 enddef
1727 export def FastFilter(): list<number>
1728 return range(10)->filter('FilterFunc')
1729 enddef
Bram Moolenaar601e76a2020-08-27 21:33:10 +02001730 export def FastFilterDirect(): list<number>
1731 return range(10)->filter(FilterFunc)
1732 enddef
Bram Moolenaarc620c052020-07-08 15:16:19 +02001733 END
1734 writefile(filterLines, 'Xfilter.vim')
1735
1736 let lines =<< trim END
1737 vim9script
Bram Moolenaar601e76a2020-08-27 21:33:10 +02001738 import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
Bram Moolenaarc620c052020-07-08 15:16:19 +02001739 def Test()
1740 let x: list<number> = FastFilter()
1741 enddef
1742 Test()
Bram Moolenaar601e76a2020-08-27 21:33:10 +02001743 def TestDirect()
1744 let x: list<number> = FastFilterDirect()
1745 enddef
1746 TestDirect()
Bram Moolenaarc620c052020-07-08 15:16:19 +02001747 END
Bram Moolenaar601e76a2020-08-27 21:33:10 +02001748 CheckScriptSuccess(lines)
Bram Moolenaarc620c052020-07-08 15:16:19 +02001749 delete('Xfilter.vim')
Bram Moolenaarc620c052020-07-08 15:16:19 +02001750enddef
1751
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001752def Test_vim9script_reload_delfunc()
1753 let first_lines =<< trim END
1754 vim9script
1755 def FuncYes(): string
1756 return 'yes'
1757 enddef
1758 END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001759 let withno_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001760 def FuncNo(): string
1761 return 'no'
1762 enddef
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001763 def g:DoCheck(no_exists: bool)
1764 assert_equal('yes', FuncYes())
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001765 assert_equal('no', FuncNo())
1766 enddef
1767 END
1768 let nono_lines =<< trim END
1769 def g:DoCheck(no_exists: bool)
1770 assert_equal('yes', FuncYes())
Bram Moolenaar44d66522020-09-06 22:26:57 +02001771 assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001772 enddef
1773 END
1774
1775 # FuncNo() is defined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001776 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001777 source Xreloaded.vim
1778 g:DoCheck(true)
1779
1780 # FuncNo() is not redefined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001781 writefile(first_lines + nono_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001782 source Xreloaded.vim
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001783 g:DoCheck()
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001784
1785 # FuncNo() is back
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001786 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001787 source Xreloaded.vim
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001788 g:DoCheck()
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001789
1790 delete('Xreloaded.vim')
1791enddef
1792
Bram Moolenaar89483d42020-05-10 15:24:44 +02001793def Test_vim9script_reload_delvar()
1794 # write the script with a script-local variable
1795 let lines =<< trim END
1796 vim9script
1797 let var = 'string'
1798 END
1799 writefile(lines, 'XreloadVar.vim')
1800 source XreloadVar.vim
1801
1802 # now write the script using the same variable locally - works
1803 lines =<< trim END
1804 vim9script
1805 def Func()
1806 let var = 'string'
1807 enddef
1808 END
1809 writefile(lines, 'XreloadVar.vim')
1810 source XreloadVar.vim
1811
1812 delete('XreloadVar.vim')
1813enddef
1814
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001815def Test_import_absolute()
1816 let import_lines = [
Bram Moolenaare6085c52020-04-12 20:19:16 +02001817 'vim9script',
1818 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1819 'def UseExported()',
1820 ' g:imported_abs = exported',
1821 ' exported = 8888',
1822 ' g:imported_after = exported',
1823 'enddef',
1824 'UseExported()',
1825 'g:import_disassembled = execute("disass UseExported")',
1826 ]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001827 writefile(import_lines, 'Ximport_abs.vim')
1828 writefile(s:export_script_lines, 'Xexport_abs.vim')
1829
1830 source Ximport_abs.vim
1831
1832 assert_equal(9876, g:imported_abs)
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +01001833 assert_equal(8888, g:imported_after)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001834 assert_match('<SNR>\d\+_UseExported.*' ..
1835 'g:imported_abs = exported.*' ..
1836 '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1837 '1 STOREG g:imported_abs.*' ..
1838 'exported = 8888.*' ..
1839 '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1840 'g:imported_after = exported.*' ..
1841 '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1842 '5 STOREG g:imported_after.*',
Bram Moolenaare6085c52020-04-12 20:19:16 +02001843 g:import_disassembled)
Bram Moolenaarb3ca9822020-08-09 14:43:58 +02001844
1845 Undo_export_script_lines()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001846 unlet g:imported_abs
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +01001847 unlet g:import_disassembled
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001848
1849 delete('Ximport_abs.vim')
1850 delete('Xexport_abs.vim')
1851enddef
1852
1853def Test_import_rtp()
1854 let import_lines = [
Bram Moolenaare6085c52020-04-12 20:19:16 +02001855 'vim9script',
1856 'import exported from "Xexport_rtp.vim"',
1857 'g:imported_rtp = exported',
1858 ]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001859 writefile(import_lines, 'Ximport_rtp.vim')
1860 mkdir('import')
1861 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
1862
1863 let save_rtp = &rtp
1864 &rtp = getcwd()
1865 source Ximport_rtp.vim
1866 &rtp = save_rtp
1867
1868 assert_equal(9876, g:imported_rtp)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001869
Bram Moolenaarb3ca9822020-08-09 14:43:58 +02001870 Undo_export_script_lines()
1871 unlet g:imported_rtp
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001872 delete('Ximport_rtp.vim')
Bram Moolenaar89483d42020-05-10 15:24:44 +02001873 delete('import', 'rf')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001874enddef
1875
Bram Moolenaar25e0f582020-05-25 22:36:50 +02001876def Test_import_compile_error()
1877 let export_lines = [
1878 'vim9script',
1879 'export def ExpFunc(): string',
1880 ' return notDefined',
1881 'enddef',
1882 ]
1883 writefile(export_lines, 'Xexported.vim')
1884
1885 let import_lines = [
1886 'vim9script',
1887 'import ExpFunc from "./Xexported.vim"',
1888 'def ImpFunc()',
1889 ' echo ExpFunc()',
1890 'enddef',
1891 'defcompile',
1892 ]
1893 writefile(import_lines, 'Ximport.vim')
1894
1895 try
1896 source Ximport.vim
1897 catch /E1001/
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001898 # Error should be fore the Xexported.vim file.
Bram Moolenaar25e0f582020-05-25 22:36:50 +02001899 assert_match('E1001: variable not found: notDefined', v:exception)
1900 assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
1901 endtry
1902
1903 delete('Xexported.vim')
1904 delete('Ximport.vim')
1905enddef
1906
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001907def Test_func_redefine_error()
1908 let lines = [
1909 'vim9script',
1910 'def Func()',
1911 ' eval [][0]',
1912 'enddef',
1913 'Func()',
1914 ]
1915 writefile(lines, 'Xtestscript.vim')
1916
1917 for count in range(3)
1918 try
1919 source Xtestscript.vim
1920 catch /E684/
1921 # function name should contain <SNR> every time
1922 assert_match('E684: list index out of range', v:exception)
1923 assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1924 endtry
1925 endfor
1926
1927 delete('Xtestscript.vim')
1928enddef
1929
Bram Moolenaareef21022020-08-01 22:16:43 +02001930def Test_func_overrules_import_fails()
1931 let export_lines =<< trim END
1932 vim9script
1933 export def Func()
1934 echo 'imported'
1935 enddef
1936 END
1937 writefile(export_lines, 'XexportedFunc.vim')
1938
1939 let lines =<< trim END
1940 vim9script
1941 import Func from './XexportedFunc.vim'
1942 def Func()
1943 echo 'local to function'
1944 enddef
1945 END
1946 CheckScriptFailure(lines, 'E1073:')
1947
1948 lines =<< trim END
1949 vim9script
1950 import Func from './XexportedFunc.vim'
1951 def Outer()
1952 def Func()
1953 echo 'local to function'
1954 enddef
1955 enddef
1956 defcompile
1957 END
1958 CheckScriptFailure(lines, 'E1073:')
1959
1960 delete('XexportedFunc.vim')
1961enddef
1962
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001963def Test_func_redefine_fails()
1964 let lines =<< trim END
1965 vim9script
1966 def Func()
1967 echo 'one'
1968 enddef
1969 def Func()
1970 echo 'two'
1971 enddef
1972 END
1973 CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001974
1975 lines =<< trim END
1976 vim9script
1977 def Foo(): string
1978 return 'foo'
1979 enddef
1980 def Func()
1981 let Foo = {-> 'lambda'}
1982 enddef
1983 defcompile
1984 END
1985 CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001986enddef
1987
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001988def Test_fixed_size_list()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001989 # will be allocated as one piece of memory, check that changes work
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001990 let l = [1, 2, 3, 4]
1991 l->remove(0)
1992 l->add(5)
1993 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001994 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001995enddef
1996
Bram Moolenaarae616492020-07-28 20:07:27 +02001997def Test_no_insert_xit()
Bram Moolenaard2c61702020-09-06 15:58:36 +02001998 CheckDefExecFailure(['a = 1'], 'E1100:')
1999 CheckDefExecFailure(['c = 1'], 'E1100:')
2000 CheckDefExecFailure(['i = 1'], 'E1100:')
2001 CheckDefExecFailure(['t = 1'], 'E1100:')
2002 CheckDefExecFailure(['x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02002003
Bram Moolenaarae616492020-07-28 20:07:27 +02002004 CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
2005 CheckScriptFailure(['vim9script', 'a'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02002006 CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
2007 CheckScriptFailure(['vim9script', 'c'], 'E1100:')
Bram Moolenaarf5a48012020-08-01 17:00:03 +02002008 CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
2009 CheckScriptFailure(['vim9script', 'i'], 'E1100:')
2010 CheckScriptFailure(['vim9script', 't'], 'E1100:')
2011 CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
2012 CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02002013enddef
2014
Bram Moolenaar158906c2020-02-06 20:39:45 +01002015def IfElse(what: number): string
2016 let res = ''
2017 if what == 1
2018 res = "one"
2019 elseif what == 2
2020 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01002021 else
Bram Moolenaar158906c2020-02-06 20:39:45 +01002022 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01002023 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +01002024 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +01002025enddef
2026
Bram Moolenaar158906c2020-02-06 20:39:45 +01002027def Test_if_elseif_else()
2028 assert_equal('one', IfElse(1))
2029 assert_equal('two', IfElse(2))
2030 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01002031enddef
2032
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002033def Test_if_elseif_else_fails()
Bram Moolenaard2c61702020-09-06 15:58:36 +02002034 CheckDefFailure(['elseif true'], 'E582:')
2035 CheckDefFailure(['else'], 'E581:')
2036 CheckDefFailure(['endif'], 'E580:')
2037 CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
2038 CheckDefFailure(['if true', 'echo 1'], 'E171:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002039enddef
2040
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002041let g:bool_true = v:true
2042let g:bool_false = v:false
2043
2044def Test_if_const_expr()
2045 let res = false
2046 if true ? true : false
2047 res = true
2048 endif
2049 assert_equal(true, res)
2050
Bram Moolenaar585fea72020-04-02 22:33:21 +02002051 g:glob = 2
2052 if false
Bram Moolenaar67979662020-06-20 22:50:47 +02002053 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02002054 endif
2055 assert_equal(2, g:glob)
2056 if true
Bram Moolenaar67979662020-06-20 22:50:47 +02002057 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02002058 endif
2059 assert_equal(3, g:glob)
2060
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002061 res = false
2062 if g:bool_true ? true : false
2063 res = true
2064 endif
2065 assert_equal(true, res)
2066
2067 res = false
2068 if true ? g:bool_true : false
2069 res = true
2070 endif
2071 assert_equal(true, res)
2072
2073 res = false
2074 if true ? true : g:bool_false
2075 res = true
2076 endif
2077 assert_equal(true, res)
2078
2079 res = false
2080 if true ? false : true
2081 res = true
2082 endif
2083 assert_equal(false, res)
2084
2085 res = false
2086 if false ? false : true
2087 res = true
2088 endif
2089 assert_equal(true, res)
2090
2091 res = false
2092 if false ? true : false
2093 res = true
2094 endif
2095 assert_equal(false, res)
2096
2097 res = false
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002098 if has('xyz') ? true : false
2099 res = true
2100 endif
2101 assert_equal(false, res)
2102
2103 res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002104 if true && true
2105 res = true
2106 endif
2107 assert_equal(true, res)
2108
2109 res = false
2110 if true && false
2111 res = true
2112 endif
2113 assert_equal(false, res)
2114
2115 res = false
2116 if g:bool_true && false
2117 res = true
2118 endif
2119 assert_equal(false, res)
2120
2121 res = false
2122 if true && g:bool_false
2123 res = true
2124 endif
2125 assert_equal(false, res)
2126
2127 res = false
2128 if false && false
2129 res = true
2130 endif
2131 assert_equal(false, res)
2132
2133 res = false
2134 if true || false
2135 res = true
2136 endif
2137 assert_equal(true, res)
2138
2139 res = false
2140 if g:bool_true || false
2141 res = true
2142 endif
2143 assert_equal(true, res)
2144
2145 res = false
2146 if true || g:bool_false
2147 res = true
2148 endif
2149 assert_equal(true, res)
2150
2151 res = false
2152 if false || false
2153 res = true
2154 endif
2155 assert_equal(false, res)
Bram Moolenaar3988f642020-08-27 22:43:03 +02002156
2157 # with constant "false" expression may be invalid so long as the syntax is OK
2158 if false | eval 0 | endif
2159 if false | eval burp + 234 | endif
2160 if false | echo burp 234 'asd' | endif
2161 if false
2162 burp
2163 endif
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02002164enddef
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002165
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02002166def Test_if_const_expr_fails()
Bram Moolenaard2c61702020-09-06 15:58:36 +02002167 CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2168 CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2169 CheckDefFailure(["if has('aaa'"], 'E110:')
2170 CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002171enddef
2172
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002173def RunNested(i: number): number
2174 let x: number = 0
2175 if i % 2
2176 if 1
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002177 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002178 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002179 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002180 endif
2181 x += 1
2182 else
2183 x += 1000
2184 endif
2185 return x
2186enddef
2187
2188def Test_nested_if()
2189 assert_equal(1, RunNested(1))
2190 assert_equal(1000, RunNested(2))
2191enddef
2192
Bram Moolenaarad39c092020-02-26 18:23:43 +01002193def Test_execute_cmd()
2194 new
2195 setline(1, 'default')
Bram Moolenaard2c61702020-09-06 15:58:36 +02002196 execute 'setline(1, "execute-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002197 assert_equal('execute-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002198
Bram Moolenaard2c61702020-09-06 15:58:36 +02002199 execute "setline(1, 'execute-string')"
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002200 assert_equal('execute-string', getline(1))
2201
Bram Moolenaard2c61702020-09-06 15:58:36 +02002202 let cmd1 = 'setline(1,'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002203 let cmd2 = '"execute-var")'
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002204 execute cmd1 cmd2 # comment
Bram Moolenaarad39c092020-02-26 18:23:43 +01002205 assert_equal('execute-var', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002206
Bram Moolenaard2c61702020-09-06 15:58:36 +02002207 execute cmd1 cmd2 '|setline(1, "execute-var-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002208 assert_equal('execute-var-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002209
Bram Moolenaarad39c092020-02-26 18:23:43 +01002210 let cmd_first = 'call '
2211 let cmd_last = 'setline(1, "execute-var-var")'
2212 execute cmd_first .. cmd_last
2213 assert_equal('execute-var-var', getline(1))
2214 bwipe!
Bram Moolenaar585fea72020-04-02 22:33:21 +02002215
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02002216 let n = true
2217 execute 'echomsg' (n ? '"true"' : '"no"')
2218 assert_match('^true$', Screenline(&lines))
2219
Bram Moolenaare5abf7a2020-08-16 18:29:35 +02002220 echomsg [1, 2, 3] #{a: 1, b: 2}
2221 assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2222
Bram Moolenaard2c61702020-09-06 15:58:36 +02002223 CheckDefFailure(['execute xxx'], 'E1001:', 1)
2224 CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2225 CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
Bram Moolenaarad39c092020-02-26 18:23:43 +01002226enddef
2227
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002228def Test_execute_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002229 # only checks line continuation
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002230 let lines =<< trim END
2231 vim9script
2232 execute 'g:someVar'
2233 .. ' = ' ..
2234 '28'
2235 assert_equal(28, g:someVar)
2236 unlet g:someVar
2237 END
2238 CheckScriptSuccess(lines)
2239enddef
2240
Bram Moolenaarad39c092020-02-26 18:23:43 +01002241def Test_echo_cmd()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002242 echo 'some' # comment
Bram Moolenaar585fea72020-04-02 22:33:21 +02002243 echon 'thing'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002244 assert_match('^something$', Screenline(&lines))
2245
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002246 echo "some" # comment
2247 echon "thing"
2248 assert_match('^something$', Screenline(&lines))
2249
Bram Moolenaarad39c092020-02-26 18:23:43 +01002250 let str1 = 'some'
2251 let str2 = 'more'
2252 echo str1 str2
2253 assert_match('^some more$', Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002254
Bram Moolenaard2c61702020-09-06 15:58:36 +02002255 CheckDefFailure(['echo "xxx"# comment'], 'E488:')
Bram Moolenaarad39c092020-02-26 18:23:43 +01002256enddef
2257
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002258def Test_echomsg_cmd()
2259 echomsg 'some' 'more' # comment
2260 assert_match('^some more$', Screenline(&lines))
2261 echo 'clear'
Bram Moolenaardf069ee2020-06-22 23:02:51 +02002262 :1messages
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002263 assert_match('^some more$', Screenline(&lines))
2264
Bram Moolenaard2c61702020-09-06 15:58:36 +02002265 CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002266enddef
2267
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002268def Test_echomsg_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002269 # only checks line continuation
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002270 let lines =<< trim END
2271 vim9script
2272 echomsg 'here'
2273 .. ' is ' ..
2274 'a message'
2275 assert_match('^here is a message$', Screenline(&lines))
2276 END
2277 CheckScriptSuccess(lines)
2278enddef
2279
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002280def Test_echoerr_cmd()
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002281 try
2282 echoerr 'something' 'wrong' # comment
2283 catch
2284 assert_match('something wrong', v:exception)
2285 endtry
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002286enddef
2287
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002288def Test_echoerr_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002289 # only checks line continuation
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002290 let lines =<< trim END
2291 vim9script
2292 try
2293 echoerr 'this'
2294 .. ' is ' ..
2295 'wrong'
2296 catch
2297 assert_match('this is wrong', v:exception)
2298 endtry
2299 END
2300 CheckScriptSuccess(lines)
2301enddef
2302
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002303def Test_for_outside_of_function()
2304 let lines =<< trim END
2305 vim9script
2306 new
2307 for var in range(0, 3)
2308 append(line('$'), var)
2309 endfor
2310 assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
2311 bwipe!
2312 END
2313 writefile(lines, 'Xvim9for.vim')
2314 source Xvim9for.vim
2315 delete('Xvim9for.vim')
2316enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002317
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002318def Test_for_loop()
2319 let result = ''
2320 for cnt in range(7)
2321 if cnt == 4
2322 break
2323 endif
2324 if cnt == 2
2325 continue
2326 endif
2327 result ..= cnt .. '_'
2328 endfor
2329 assert_equal('0_1_3_', result)
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02002330
2331 let concat = ''
2332 for str in eval('["one", "two"]')
2333 concat ..= str
2334 endfor
2335 assert_equal('onetwo', concat)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002336enddef
2337
2338def Test_for_loop_fails()
Bram Moolenaar675f7162020-04-12 22:53:54 +02002339 CheckDefFailure(['for # in range(5)'], 'E690:')
2340 CheckDefFailure(['for i In range(5)'], 'E690:')
Bram Moolenaar451c2e32020-08-15 16:33:28 +02002341 CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1017:')
Bram Moolenaar822ba242020-05-24 23:00:18 +02002342 CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
Bram Moolenaar451c2e32020-08-15 16:33:28 +02002343 CheckDefFailure(['for i in "text"'], 'E1012:')
Bram Moolenaar675f7162020-04-12 22:53:54 +02002344 CheckDefFailure(['for i in xxx'], 'E1001:')
2345 CheckDefFailure(['endfor'], 'E588:')
2346 CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002347enddef
2348
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01002349def Test_while_loop()
2350 let result = ''
2351 let cnt = 0
2352 while cnt < 555
2353 if cnt == 3
2354 break
2355 endif
2356 cnt += 1
2357 if cnt == 2
2358 continue
2359 endif
2360 result ..= cnt .. '_'
2361 endwhile
2362 assert_equal('1_3_', result)
2363enddef
2364
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002365def Test_while_loop_fails()
Bram Moolenaar675f7162020-04-12 22:53:54 +02002366 CheckDefFailure(['while xxx'], 'E1001:')
2367 CheckDefFailure(['endwhile'], 'E588:')
2368 CheckDefFailure(['continue'], 'E586:')
2369 CheckDefFailure(['if true', 'continue'], 'E586:')
2370 CheckDefFailure(['break'], 'E587:')
2371 CheckDefFailure(['if true', 'break'], 'E587:')
2372 CheckDefFailure(['while 1', 'echo 3'], 'E170:')
Bram Moolenaarbd5da372020-03-31 23:13:10 +02002373enddef
2374
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01002375def Test_interrupt_loop()
Bram Moolenaar97acfc72020-03-22 13:44:28 +01002376 let caught = false
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01002377 let x = 0
Bram Moolenaar97acfc72020-03-22 13:44:28 +01002378 try
2379 while 1
2380 x += 1
2381 if x == 100
2382 feedkeys("\<C-C>", 'Lt')
2383 endif
2384 endwhile
2385 catch
2386 caught = true
2387 assert_equal(100, x)
2388 endtry
2389 assert_true(caught, 'should have caught an exception')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02002390 # consume the CTRL-C
2391 getchar(0)
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01002392enddef
Bram Moolenaar20431c92020-03-20 18:39:46 +01002393
Bram Moolenaar4fdae992020-04-12 16:38:57 +02002394def Test_automatic_line_continuation()
2395 let mylist = [
2396 'one',
2397 'two',
2398 'three',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002399 ] # comment
Bram Moolenaar4fdae992020-04-12 16:38:57 +02002400 assert_equal(['one', 'two', 'three'], mylist)
2401
2402 let mydict = {
2403 'one': 1,
2404 'two': 2,
2405 'three':
2406 3,
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002407 } # comment
Bram Moolenaar4fdae992020-04-12 16:38:57 +02002408 assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
2409 mydict = #{
Bram Moolenaar2c330432020-04-13 14:41:35 +02002410 one: 1, # comment
2411 two: # comment
2412 2, # comment
2413 three: 3 # comment
2414 }
2415 assert_equal(#{one: 1, two: 2, three: 3}, mydict)
2416 mydict = #{
2417 one: 1,
2418 two:
2419 2,
2420 three: 3
Bram Moolenaar4fdae992020-04-12 16:38:57 +02002421 }
2422 assert_equal(#{one: 1, two: 2, three: 3}, mydict)
Bram Moolenaare6085c52020-04-12 20:19:16 +02002423
2424 assert_equal(
2425 ['one', 'two', 'three'],
2426 split('one two three')
2427 )
Bram Moolenaar4fdae992020-04-12 16:38:57 +02002428enddef
2429
Bram Moolenaar7a092242020-04-16 22:10:49 +02002430def Test_vim9_comment()
2431 CheckScriptSuccess([
2432 'vim9script',
2433 '# something',
2434 ])
2435 CheckScriptFailure([
2436 'vim9script',
2437 ':# something',
2438 ], 'E488:')
2439 CheckScriptFailure([
2440 '# something',
2441 ], 'E488:')
2442 CheckScriptFailure([
2443 ':# something',
2444 ], 'E488:')
2445
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02002446 { # block start
2447 } # block end
2448 CheckDefFailure([
2449 '{# comment',
2450 ], 'E488:')
2451 CheckDefFailure([
2452 '{',
2453 '}# comment',
2454 ], 'E488:')
2455
2456 echo "yes" # comment
2457 CheckDefFailure([
2458 'echo "yes"# comment',
2459 ], 'E488:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02002460 CheckScriptSuccess([
2461 'vim9script',
2462 'echo "yes" # something',
2463 ])
2464 CheckScriptFailure([
2465 'vim9script',
2466 'echo "yes"# something',
2467 ], 'E121:')
2468 CheckScriptFailure([
2469 'vim9script',
2470 'echo# something',
2471 ], 'E121:')
2472 CheckScriptFailure([
2473 'echo "yes" # something',
2474 ], 'E121:')
2475
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02002476 exe "echo" # comment
2477 CheckDefFailure([
2478 'exe "echo"# comment',
2479 ], 'E488:')
2480 CheckScriptSuccess([
2481 'vim9script',
2482 'exe "echo" # something',
2483 ])
2484 CheckScriptFailure([
2485 'vim9script',
2486 'exe "echo"# something',
2487 ], 'E121:')
2488 CheckDefFailure([
2489 'exe # comment',
2490 ], 'E1015:')
2491 CheckScriptFailure([
2492 'vim9script',
2493 'exe# something',
2494 ], 'E121:')
2495 CheckScriptFailure([
2496 'exe "echo" # something',
2497 ], 'E121:')
2498
Bram Moolenaar7a092242020-04-16 22:10:49 +02002499 CheckDefFailure([
2500 'try# comment',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002501 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02002502 'catch',
2503 'endtry',
2504 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002505 CheckScriptFailure([
2506 'vim9script',
2507 'try# comment',
2508 'echo "yes"',
2509 ], 'E488:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02002510 CheckDefFailure([
2511 'try',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002512 ' throw#comment',
2513 'catch',
2514 'endtry',
2515 ], 'E1015:')
2516 CheckDefFailure([
2517 'try',
2518 ' throw "yes"#comment',
2519 'catch',
2520 'endtry',
2521 ], 'E488:')
2522 CheckDefFailure([
2523 'try',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002524 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02002525 'catch# comment',
2526 'endtry',
2527 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002528 CheckScriptFailure([
2529 'vim9script',
2530 'try',
2531 ' echo "yes"',
2532 'catch# comment',
2533 'endtry',
2534 ], 'E654:')
2535 CheckDefFailure([
2536 'try',
2537 ' echo "yes"',
2538 'catch /pat/# comment',
2539 'endtry',
2540 ], 'E488:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02002541 CheckDefFailure([
2542 'try',
2543 'echo "yes"',
2544 'catch',
2545 'endtry# comment',
2546 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002547 CheckScriptFailure([
2548 'vim9script',
2549 'try',
2550 ' echo "yes"',
2551 'catch',
2552 'endtry# comment',
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +02002553 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002554
2555 CheckScriptSuccess([
2556 'vim9script',
2557 'hi # comment',
2558 ])
2559 CheckScriptFailure([
2560 'vim9script',
2561 'hi# comment',
2562 ], 'E416:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02002563 CheckScriptSuccess([
2564 'vim9script',
2565 'hi Search # comment',
2566 ])
2567 CheckScriptFailure([
2568 'vim9script',
2569 'hi Search# comment',
2570 ], 'E416:')
2571 CheckScriptSuccess([
2572 'vim9script',
2573 'hi link This Search # comment',
2574 ])
2575 CheckScriptFailure([
2576 'vim9script',
2577 'hi link This That# comment',
2578 ], 'E413:')
2579 CheckScriptSuccess([
2580 'vim9script',
2581 'hi clear This # comment',
2582 'hi clear # comment',
2583 ])
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002584 # not tested, because it doesn't give an error but a warning:
2585 # hi clear This# comment',
Bram Moolenaar1966c242020-04-20 22:42:32 +02002586 CheckScriptFailure([
2587 'vim9script',
2588 'hi clear# comment',
2589 ], 'E416:')
2590
2591 CheckScriptSuccess([
2592 'vim9script',
2593 'hi Group term=bold',
2594 'match Group /todo/ # comment',
2595 ])
2596 CheckScriptFailure([
2597 'vim9script',
2598 'hi Group term=bold',
2599 'match Group /todo/# comment',
2600 ], 'E488:')
2601 CheckScriptSuccess([
2602 'vim9script',
2603 'match # comment',
2604 ])
2605 CheckScriptFailure([
2606 'vim9script',
2607 'match# comment',
2608 ], 'E475:')
2609 CheckScriptSuccess([
2610 'vim9script',
2611 'match none # comment',
2612 ])
2613 CheckScriptFailure([
2614 'vim9script',
2615 'match none# comment',
2616 ], 'E475:')
2617
2618 CheckScriptSuccess([
2619 'vim9script',
2620 'menutrans clear # comment',
2621 ])
2622 CheckScriptFailure([
2623 'vim9script',
2624 'menutrans clear# comment text',
2625 ], 'E474:')
2626
2627 CheckScriptSuccess([
2628 'vim9script',
2629 'syntax clear # comment',
2630 ])
2631 CheckScriptFailure([
2632 'vim9script',
2633 'syntax clear# comment text',
2634 ], 'E28:')
2635 CheckScriptSuccess([
2636 'vim9script',
2637 'syntax keyword Word some',
2638 'syntax clear Word # comment',
2639 ])
2640 CheckScriptFailure([
2641 'vim9script',
2642 'syntax keyword Word some',
2643 'syntax clear Word# comment text',
2644 ], 'E28:')
2645
2646 CheckScriptSuccess([
2647 'vim9script',
2648 'syntax list # comment',
2649 ])
2650 CheckScriptFailure([
2651 'vim9script',
2652 'syntax list# comment text',
2653 ], 'E28:')
2654
2655 CheckScriptSuccess([
2656 'vim9script',
2657 'syntax match Word /pat/ oneline # comment',
2658 ])
2659 CheckScriptFailure([
2660 'vim9script',
2661 'syntax match Word /pat/ oneline# comment',
2662 ], 'E475:')
2663
2664 CheckScriptSuccess([
2665 'vim9script',
2666 'syntax keyword Word word # comm[ent',
2667 ])
2668 CheckScriptFailure([
2669 'vim9script',
2670 'syntax keyword Word word# comm[ent',
2671 ], 'E789:')
2672
2673 CheckScriptSuccess([
2674 'vim9script',
2675 'syntax match Word /pat/ # comment',
2676 ])
2677 CheckScriptFailure([
2678 'vim9script',
2679 'syntax match Word /pat/# comment',
2680 ], 'E402:')
2681
2682 CheckScriptSuccess([
2683 'vim9script',
2684 'syntax match Word /pat/ contains=Something # comment',
2685 ])
2686 CheckScriptFailure([
2687 'vim9script',
2688 'syntax match Word /pat/ contains=Something# comment',
2689 ], 'E475:')
2690 CheckScriptFailure([
2691 'vim9script',
2692 'syntax match Word /pat/ contains= # comment',
2693 ], 'E406:')
2694 CheckScriptFailure([
2695 'vim9script',
2696 'syntax match Word /pat/ contains=# comment',
2697 ], 'E475:')
2698
2699 CheckScriptSuccess([
2700 'vim9script',
2701 'syntax region Word start=/pat/ end=/pat/ # comment',
2702 ])
2703 CheckScriptFailure([
2704 'vim9script',
2705 'syntax region Word start=/pat/ end=/pat/# comment',
Bram Moolenaard032f342020-07-18 18:13:02 +02002706 ], 'E402:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02002707
2708 CheckScriptSuccess([
2709 'vim9script',
2710 'syntax sync # comment',
2711 ])
2712 CheckScriptFailure([
2713 'vim9script',
2714 'syntax sync# comment',
2715 ], 'E404:')
2716 CheckScriptSuccess([
2717 'vim9script',
2718 'syntax sync ccomment # comment',
2719 ])
2720 CheckScriptFailure([
2721 'vim9script',
2722 'syntax sync ccomment# comment',
2723 ], 'E404:')
2724
2725 CheckScriptSuccess([
2726 'vim9script',
2727 'syntax cluster Some contains=Word # comment',
2728 ])
2729 CheckScriptFailure([
2730 'vim9script',
2731 'syntax cluster Some contains=Word# comment',
2732 ], 'E475:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002733
2734 CheckScriptSuccess([
2735 'vim9script',
2736 'command Echo echo # comment',
2737 'command Echo # comment',
2738 ])
2739 CheckScriptFailure([
2740 'vim9script',
2741 'command Echo echo# comment',
2742 'Echo',
2743 ], 'E121:')
2744 CheckScriptFailure([
2745 'vim9script',
2746 'command Echo# comment',
2747 ], 'E182:')
2748 CheckScriptFailure([
2749 'vim9script',
2750 'command Echo echo',
2751 'command Echo# comment',
2752 ], 'E182:')
2753
2754 CheckScriptSuccess([
2755 'vim9script',
2756 'function # comment',
2757 ])
2758 CheckScriptFailure([
2759 'vim9script',
Bram Moolenaar98981072020-07-29 14:40:25 +02002760 'function " comment',
2761 ], 'E129:')
2762 CheckScriptFailure([
2763 'vim9script',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002764 'function# comment',
2765 ], 'E129:')
2766 CheckScriptSuccess([
2767 'vim9script',
2768 'function CheckScriptSuccess # comment',
2769 ])
2770 CheckScriptFailure([
2771 'vim9script',
2772 'function CheckScriptSuccess# comment',
2773 ], 'E488:')
2774
2775 CheckScriptSuccess([
2776 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002777 'func g:DeleteMeA()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002778 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002779 'delfunction g:DeleteMeA # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002780 ])
2781 CheckScriptFailure([
2782 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002783 'func g:DeleteMeB()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002784 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002785 'delfunction g:DeleteMeB# comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002786 ], 'E488:')
2787
2788 CheckScriptSuccess([
2789 'vim9script',
2790 'call execute("ls") # comment',
2791 ])
2792 CheckScriptFailure([
2793 'vim9script',
2794 'call execute("ls")# comment',
2795 ], 'E488:')
Bram Moolenaare7e48382020-07-22 18:17:08 +02002796
2797 CheckScriptFailure([
2798 'def Test() " comment',
2799 'enddef',
2800 ], 'E488:')
2801 CheckScriptFailure([
2802 'vim9script',
2803 'def Test() " comment',
2804 'enddef',
2805 ], 'E488:')
2806
2807 CheckScriptSuccess([
2808 'func Test() " comment',
2809 'endfunc',
2810 ])
Bram Moolenaar98981072020-07-29 14:40:25 +02002811 CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02002812 'vim9script',
2813 'func Test() " comment',
2814 'endfunc',
Bram Moolenaar98981072020-07-29 14:40:25 +02002815 ])
Bram Moolenaare7e48382020-07-22 18:17:08 +02002816
2817 CheckScriptSuccess([
2818 'def Test() # comment',
2819 'enddef',
2820 ])
2821 CheckScriptFailure([
2822 'func Test() # comment',
2823 'endfunc',
2824 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002825enddef
2826
2827def Test_vim9_comment_gui()
2828 CheckCanRunGui
2829
2830 CheckScriptFailure([
2831 'vim9script',
2832 'gui#comment'
2833 ], 'E499:')
2834 CheckScriptFailure([
2835 'vim9script',
2836 'gui -f#comment'
2837 ], 'E499:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02002838enddef
2839
Bram Moolenaara26b9702020-04-18 19:53:28 +02002840def Test_vim9_comment_not_compiled()
Bram Moolenaar67979662020-06-20 22:50:47 +02002841 au TabEnter *.vim g:entered = 1
2842 au TabEnter *.x g:entered = 2
Bram Moolenaara26b9702020-04-18 19:53:28 +02002843
2844 edit test.vim
2845 doautocmd TabEnter #comment
2846 assert_equal(1, g:entered)
2847
2848 doautocmd TabEnter f.x
2849 assert_equal(2, g:entered)
2850
2851 g:entered = 0
2852 doautocmd TabEnter f.x #comment
2853 assert_equal(2, g:entered)
2854
2855 assert_fails('doautocmd Syntax#comment', 'E216:')
2856
2857 au! TabEnter
2858 unlet g:entered
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02002859
2860 CheckScriptSuccess([
2861 'vim9script',
Bram Moolenaar67979662020-06-20 22:50:47 +02002862 'g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02002863 'b:var = 456',
2864 'w:var = 777',
2865 't:var = 888',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02002866 'unlet g:var w:var # something',
2867 ])
2868
2869 CheckScriptFailure([
2870 'vim9script',
2871 'let g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02002872 ], 'E1016: Cannot declare a global variable:')
2873
2874 CheckScriptFailure([
2875 'vim9script',
2876 'let b:var = 123',
2877 ], 'E1016: Cannot declare a buffer variable:')
2878
2879 CheckScriptFailure([
2880 'vim9script',
2881 'let w:var = 123',
2882 ], 'E1016: Cannot declare a window variable:')
2883
2884 CheckScriptFailure([
2885 'vim9script',
2886 'let t:var = 123',
2887 ], 'E1016: Cannot declare a tab variable:')
2888
2889 CheckScriptFailure([
2890 'vim9script',
2891 'let v:version = 123',
2892 ], 'E1016: Cannot declare a v: variable:')
2893
2894 CheckScriptFailure([
2895 'vim9script',
2896 'let $VARIABLE = "text"',
2897 ], 'E1016: Cannot declare an environment variable:')
Bram Moolenaar67979662020-06-20 22:50:47 +02002898
2899 CheckScriptFailure([
2900 'vim9script',
2901 'g:var = 123',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002902 'unlet g:var# comment1',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02002903 ], 'E108:')
2904
2905 CheckScriptFailure([
2906 'let g:var = 123',
2907 'unlet g:var # something',
2908 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002909
2910 CheckScriptSuccess([
2911 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002912 'if 1 # comment2',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002913 ' echo "yes"',
2914 'elseif 2 #comment',
2915 ' echo "no"',
2916 'endif',
2917 ])
2918
2919 CheckScriptFailure([
2920 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002921 'if 1# comment3',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002922 ' echo "yes"',
2923 'endif',
2924 ], 'E15:')
2925
2926 CheckScriptFailure([
2927 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002928 'if 0 # comment4',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002929 ' echo "yes"',
2930 'elseif 2#comment',
2931 ' echo "no"',
2932 'endif',
2933 ], 'E15:')
2934
2935 CheckScriptSuccess([
2936 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002937 'let v = 1 # comment5',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002938 ])
2939
2940 CheckScriptFailure([
2941 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002942 'let v = 1# comment6',
2943 ], 'E15:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002944
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002945 CheckScriptSuccess([
2946 'vim9script',
2947 'new'
Bram Moolenaard2c61702020-09-06 15:58:36 +02002948 'setline(1, ["# define pat", "last"])',
Bram Moolenaardf069ee2020-06-22 23:02:51 +02002949 ':$',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002950 'dsearch /pat/ #comment',
2951 'bwipe!',
2952 ])
2953
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002954 CheckScriptFailure([
2955 'vim9script',
2956 'new'
Bram Moolenaard2c61702020-09-06 15:58:36 +02002957 'setline(1, ["# define pat", "last"])',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002958 ':$',
2959 'dsearch /pat/#comment',
2960 'bwipe!',
2961 ], 'E488:')
2962
2963 CheckScriptFailure([
2964 'vim9script',
2965 'func! SomeFunc()',
2966 ], 'E477:')
Bram Moolenaara26b9702020-04-18 19:53:28 +02002967enddef
2968
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02002969def Test_finish()
2970 let lines =<< trim END
2971 vim9script
Bram Moolenaar67979662020-06-20 22:50:47 +02002972 g:res = 'one'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02002973 if v:false | finish | endif
Bram Moolenaar67979662020-06-20 22:50:47 +02002974 g:res = 'two'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02002975 finish
Bram Moolenaar67979662020-06-20 22:50:47 +02002976 g:res = 'three'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02002977 END
2978 writefile(lines, 'Xfinished')
2979 source Xfinished
2980 assert_equal('two', g:res)
2981
2982 unlet g:res
2983 delete('Xfinished')
2984enddef
2985
Bram Moolenaar32e35112020-05-14 22:41:15 +02002986def Test_let_func_call()
2987 let lines =<< trim END
2988 vim9script
2989 func GetValue()
2990 if exists('g:count')
2991 let g:count += 1
2992 else
2993 let g:count = 1
2994 endif
2995 return 'this'
2996 endfunc
2997 let val: string = GetValue()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002998 # env var is always a string
Bram Moolenaardf671b42020-05-16 22:33:33 +02002999 let env = $TERM
Bram Moolenaar32e35112020-05-14 22:41:15 +02003000 END
3001 writefile(lines, 'Xfinished')
3002 source Xfinished
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003003 # GetValue() is not called during discovery phase
Bram Moolenaar32e35112020-05-14 22:41:15 +02003004 assert_equal(1, g:count)
3005
3006 unlet g:count
3007 delete('Xfinished')
3008enddef
3009
3010def Test_let_missing_type()
3011 let lines =<< trim END
3012 vim9script
Bram Moolenaardf671b42020-05-16 22:33:33 +02003013 let var = g:unknown
Bram Moolenaar227a69d2020-05-15 18:17:28 +02003014 END
Bram Moolenaar822ba242020-05-24 23:00:18 +02003015 CheckScriptFailure(lines, 'E121:')
Bram Moolenaar227a69d2020-05-15 18:17:28 +02003016
3017 lines =<< trim END
3018 vim9script
3019 let nr: number = 123
3020 let var = nr
3021 END
Bram Moolenaar822ba242020-05-24 23:00:18 +02003022 CheckScriptSuccess(lines)
Bram Moolenaar32e35112020-05-14 22:41:15 +02003023enddef
3024
Bram Moolenaarc82a5b52020-06-13 18:09:19 +02003025def Test_let_declaration()
3026 let lines =<< trim END
3027 vim9script
3028 let var: string
3029 g:var_uninit = var
3030 var = 'text'
3031 g:var_test = var
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003032 # prefixing s: is optional
Bram Moolenaar984dddb2020-06-14 12:50:24 +02003033 s:var = 'prefixed'
3034 g:var_prefixed = s:var
3035
3036 let s:other: number
3037 other = 1234
3038 g:other_var = other
Bram Moolenaar53b29e42020-08-15 14:31:20 +02003039
3040 # type is inferred
3041 s:dict = {'a': 222}
3042 def GetDictVal(key: any)
3043 g:dict_val = s:dict[key]
3044 enddef
3045 GetDictVal('a')
Bram Moolenaarc82a5b52020-06-13 18:09:19 +02003046 END
3047 CheckScriptSuccess(lines)
3048 assert_equal('', g:var_uninit)
3049 assert_equal('text', g:var_test)
Bram Moolenaar984dddb2020-06-14 12:50:24 +02003050 assert_equal('prefixed', g:var_prefixed)
3051 assert_equal(1234, g:other_var)
Bram Moolenaar53b29e42020-08-15 14:31:20 +02003052 assert_equal(222, g:dict_val)
Bram Moolenaarc82a5b52020-06-13 18:09:19 +02003053
3054 unlet g:var_uninit
3055 unlet g:var_test
Bram Moolenaar984dddb2020-06-14 12:50:24 +02003056 unlet g:var_prefixed
3057 unlet g:other_var
Bram Moolenaarc82a5b52020-06-13 18:09:19 +02003058enddef
3059
Bram Moolenaarc5b1c202020-06-18 22:43:27 +02003060def Test_let_declaration_fails()
3061 let lines =<< trim END
3062 vim9script
3063 const var: string
3064 END
3065 CheckScriptFailure(lines, 'E1021:')
3066
3067 lines =<< trim END
3068 vim9script
3069 let 9var: string
3070 END
3071 CheckScriptFailure(lines, 'E475:')
3072enddef
3073
Bram Moolenaar34db91f2020-06-13 19:00:10 +02003074def Test_let_type_check()
3075 let lines =<< trim END
3076 vim9script
3077 let var: string
3078 var = 1234
3079 END
Bram Moolenaar451c2e32020-08-15 16:33:28 +02003080 CheckScriptFailure(lines, 'E1012:')
Bram Moolenaar984dddb2020-06-14 12:50:24 +02003081
3082 lines =<< trim END
3083 vim9script
3084 let var:string
3085 END
3086 CheckScriptFailure(lines, 'E1069:')
Bram Moolenaarc5b1c202020-06-18 22:43:27 +02003087
3088 lines =<< trim END
3089 vim9script
3090 let var: asdf
3091 END
3092 CheckScriptFailure(lines, 'E1010:')
Bram Moolenaara71e2632020-08-05 15:11:03 +02003093
3094 lines =<< trim END
3095 vim9script
3096 let s:l: list<number>
3097 s:l = []
3098 END
3099 CheckScriptSuccess(lines)
3100
3101 lines =<< trim END
3102 vim9script
3103 let s:d: dict<number>
3104 s:d = {}
3105 END
3106 CheckScriptSuccess(lines)
Bram Moolenaar34db91f2020-06-13 19:00:10 +02003107enddef
3108
Bram Moolenaara5d00772020-05-14 23:20:55 +02003109def Test_forward_declaration()
3110 let lines =<< trim END
3111 vim9script
Bram Moolenaara5d00772020-05-14 23:20:55 +02003112 def GetValue(): string
3113 return theVal
3114 enddef
3115 let theVal = 'something'
Bram Moolenaar822ba242020-05-24 23:00:18 +02003116 g:initVal = GetValue()
Bram Moolenaara5d00772020-05-14 23:20:55 +02003117 theVal = 'else'
3118 g:laterVal = GetValue()
3119 END
3120 writefile(lines, 'Xforward')
3121 source Xforward
3122 assert_equal('something', g:initVal)
3123 assert_equal('else', g:laterVal)
3124
3125 unlet g:initVal
3126 unlet g:laterVal
3127 delete('Xforward')
3128enddef
3129
Bram Moolenaar9721fb42020-06-11 23:10:46 +02003130def Test_source_vim9_from_legacy()
3131 let legacy_lines =<< trim END
3132 source Xvim9_script.vim
3133
3134 call assert_false(exists('local'))
3135 call assert_false(exists('exported'))
3136 call assert_false(exists('s:exported'))
3137 call assert_equal('global', global)
3138 call assert_equal('global', g:global)
3139
3140 " imported variable becomes script-local
3141 import exported from './Xvim9_script.vim'
3142 call assert_equal('exported', s:exported)
3143 call assert_false(exists('exported'))
3144
3145 " imported function becomes script-local
3146 import GetText from './Xvim9_script.vim'
3147 call assert_equal('text', s:GetText())
3148 call assert_false(exists('*GetText'))
3149 END
3150 writefile(legacy_lines, 'Xlegacy_script.vim')
3151
3152 let vim9_lines =<< trim END
3153 vim9script
3154 let local = 'local'
3155 g:global = 'global'
3156 export let exported = 'exported'
3157 export def GetText(): string
3158 return 'text'
3159 enddef
3160 END
3161 writefile(vim9_lines, 'Xvim9_script.vim')
3162
3163 source Xlegacy_script.vim
3164
3165 assert_equal('global', g:global)
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003166 unlet g:global
Bram Moolenaar9721fb42020-06-11 23:10:46 +02003167
3168 delete('Xlegacy_script.vim')
3169 delete('Xvim9_script.vim')
3170enddef
Bram Moolenaara5d00772020-05-14 23:20:55 +02003171
Bram Moolenaar7d699702020-08-14 20:52:28 +02003172func Test_vim9script_not_global()
3173 " check that items defined in Vim9 script are script-local, not global
3174 let vim9lines =<< trim END
3175 vim9script
3176 let var = 'local'
3177 func TheFunc()
3178 echo 'local'
3179 endfunc
3180 def DefFunc()
3181 echo 'local'
3182 enddef
3183 END
3184 call writefile(vim9lines, 'Xvim9script.vim')
3185 source Xvim9script.vim
3186 try
3187 echo g:var
3188 assert_report('did not fail')
3189 catch /E121:/
3190 " caught
3191 endtry
3192 try
3193 call TheFunc()
3194 assert_report('did not fail')
3195 catch /E117:/
3196 " caught
3197 endtry
3198 try
3199 call DefFunc()
3200 assert_report('did not fail')
3201 catch /E117:/
3202 " caught
3203 endtry
3204
Bram Moolenaar25859dd2020-08-30 12:54:53 +02003205 call delete('Xvim9script.vim')
Bram Moolenaar7d699702020-08-14 20:52:28 +02003206endfunc
3207
Bram Moolenaareeb27bf2020-07-04 17:39:10 +02003208def Test_vim9_copen()
3209 # this was giving an error for setting w:quickfix_title
3210 copen
3211 quit
3212enddef
3213
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02003214" test using a vim9script that is auto-loaded from an autocmd
3215def Test_vim9_autoload()
3216 let lines =<< trim END
3217 vim9script
3218 def foo#test()
3219 echomsg getreg('"')
3220 enddef
3221 END
3222
3223 mkdir('Xdir/autoload', 'p')
3224 writefile(lines, 'Xdir/autoload/foo.vim')
3225 let save_rtp = &rtp
3226 exe 'set rtp^=' .. getcwd() .. '/Xdir'
3227 augroup test
3228 autocmd TextYankPost * call foo#test()
3229 augroup END
3230
3231 normal Y
3232
3233 augroup test
3234 autocmd!
3235 augroup END
3236 delete('Xdir', 'rf')
3237 &rtp = save_rtp
3238enddef
3239
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02003240def Test_script_var_in_autocmd()
3241 # using a script variable from an autocommand, defined in a :def function in a
3242 # legacy Vim script, cannot check the variable type.
3243 let lines =<< trim END
3244 let s:counter = 1
3245 def s:Func()
3246 au! CursorHold
3247 au CursorHold * s:counter += 1
3248 enddef
3249 call s:Func()
3250 doau CursorHold
3251 call assert_equal(2, s:counter)
3252 au! CursorHold
3253 END
3254 CheckScriptSuccess(lines)
3255enddef
3256
Bram Moolenaar3896a102020-08-09 14:33:55 +02003257def Test_cmdline_win()
3258 # if the Vim syntax highlighting uses Vim9 constructs they can be used from
3259 # the command line window.
3260 mkdir('rtp/syntax', 'p')
3261 let export_lines =<< trim END
3262 vim9script
3263 export let That = 'yes'
3264 END
3265 writefile(export_lines, 'rtp/syntax/Xexport.vim')
3266 let import_lines =<< trim END
3267 vim9script
3268 import That from './Xexport.vim'
3269 END
3270 writefile(import_lines, 'rtp/syntax/vim.vim')
3271 let save_rtp = &rtp
3272 &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
3273 syntax on
3274 augroup CmdWin
3275 autocmd CmdwinEnter * g:got_there = 'yes'
3276 augroup END
3277 # this will open and also close the cmdline window
3278 feedkeys('q:', 'xt')
3279 assert_equal('yes', g:got_there)
3280
3281 augroup CmdWin
3282 au!
3283 augroup END
3284 &rtp = save_rtp
3285 delete('rtp', 'rf')
3286enddef
3287
Bram Moolenaare3d46852020-08-29 13:39:17 +02003288def Test_invalid_sid()
3289 assert_fails('func <SNR>1234_func', 'E123:')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02003290
Bram Moolenaare3d46852020-08-29 13:39:17 +02003291 if RunVim([], ['wq Xdidit'], '+"func <SNR>1_func"')
Bram Moolenaard2c61702020-09-06 15:58:36 +02003292 assert_equal([], readfile('Xdidit'))
Bram Moolenaare3d46852020-08-29 13:39:17 +02003293 endif
3294 delete('Xdidit')
3295enddef
3296
Bram Moolenaar585fea72020-04-02 22:33:21 +02003297" Keep this last, it messes up highlighting.
3298def Test_substitute_cmd()
3299 new
3300 setline(1, 'something')
3301 :substitute(some(other(
3302 assert_equal('otherthing', getline(1))
3303 bwipe!
3304
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003305 # also when the context is Vim9 script
Bram Moolenaar585fea72020-04-02 22:33:21 +02003306 let lines =<< trim END
3307 vim9script
3308 new
3309 setline(1, 'something')
3310 :substitute(some(other(
3311 assert_equal('otherthing', getline(1))
3312 bwipe!
3313 END
3314 writefile(lines, 'Xvim9lines')
3315 source Xvim9lines
3316
3317 delete('Xvim9lines')
3318enddef
3319
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01003320" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker