blob: 0becc7d1ba838890f1b6ec07cc27d6080942f64b [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
Bram Moolenaar5d72ce62020-08-20 23:04:06 +02009def Test_range_only()
10 new
11 setline(1, ['blah', 'Blah'])
12 :/Blah/
13 assert_equal(2, getcurpos()[1])
Bram Moolenaarc2af0af2020-08-23 21:06:02 +020014 bwipe!
15
16 # without range commands use current line
17 new
18 setline(1, ['one', 'two', 'three'])
19 :2
20 print
21 assert_equal('two', Screenline(&lines))
22 :3
23 list
24 assert_equal('three$', Screenline(&lines))
25 bwipe!
Bram Moolenaar025cb1c2020-12-14 18:31:27 +010026
27 # won't generate anything
28 if false
29 :123
30 endif
Bram Moolenaar5d72ce62020-08-20 23:04:06 +020031enddef
32
Bram Moolenaara6e67e42020-05-15 23:36:40 +020033let g:alist = [7]
34let g:astring = 'text'
Bram Moolenaarf0b9f432020-07-17 23:03:17 +020035let g:anumber = 123
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010036
Bram Moolenaar4c17ad92020-04-27 22:47:51 +020037def Test_delfunction()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +020038 # Check function is defined in script namespace
Bram Moolenaar4c17ad92020-04-27 22:47:51 +020039 CheckScriptSuccess([
40 'vim9script',
41 'func CheckMe()',
42 ' return 123',
43 'endfunc',
44 'assert_equal(123, s:CheckMe())',
45 ])
46
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +020047 # Check function in script namespace cannot be deleted
Bram Moolenaar4c17ad92020-04-27 22:47:51 +020048 CheckScriptFailure([
49 'vim9script',
50 'func DeleteMe1()',
51 'endfunc',
52 'delfunction DeleteMe1',
53 ], 'E1084:')
54 CheckScriptFailure([
55 'vim9script',
56 'func DeleteMe2()',
57 'endfunc',
58 'def DoThat()',
59 ' delfunction DeleteMe2',
60 'enddef',
61 'DoThat()',
62 ], 'E1084:')
63 CheckScriptFailure([
64 'vim9script',
65 'def DeleteMe3()',
66 'enddef',
67 'delfunction DeleteMe3',
68 ], 'E1084:')
69 CheckScriptFailure([
70 'vim9script',
71 'def DeleteMe4()',
72 'enddef',
73 'def DoThat()',
74 ' delfunction DeleteMe4',
75 'enddef',
76 'DoThat()',
77 ], 'E1084:')
Bram Moolenaar925e9fd2020-07-25 15:41:11 +020078
79 # Check that global :def function can be replaced and deleted
Bram Moolenaarcfcd0112020-09-27 15:19:27 +020080 var lines =<< trim END
Bram Moolenaar925e9fd2020-07-25 15:41:11 +020081 vim9script
82 def g:Global(): string
83 return "yes"
84 enddef
85 assert_equal("yes", g:Global())
86 def! g:Global(): string
87 return "no"
88 enddef
89 assert_equal("no", g:Global())
90 delfunc g:Global
91 assert_false(exists('*g:Global'))
92 END
93 CheckScriptSuccess(lines)
94
95 # Check that global function can be replaced by a :def function and deleted
96 lines =<< trim END
97 vim9script
98 func g:Global()
99 return "yes"
100 endfunc
101 assert_equal("yes", g:Global())
102 def! g:Global(): string
103 return "no"
104 enddef
105 assert_equal("no", g:Global())
106 delfunc g:Global
107 assert_false(exists('*g:Global'))
108 END
109 CheckScriptSuccess(lines)
110
111 # Check that global :def function can be replaced by a function and deleted
112 lines =<< trim END
113 vim9script
114 def g:Global(): string
115 return "yes"
116 enddef
117 assert_equal("yes", g:Global())
118 func! g:Global()
119 return "no"
120 endfunc
121 assert_equal("no", g:Global())
122 delfunc g:Global
123 assert_false(exists('*g:Global'))
124 END
125 CheckScriptSuccess(lines)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200126enddef
127
Bram Moolenaar08052222020-09-14 17:04:31 +0200128def Test_wrong_type()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200129 CheckDefFailure(['var name: list<nothing>'], 'E1010:')
130 CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
131 CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
132 CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100133
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200134 CheckDefFailure(['var name: dict<number'], 'E1009:')
135 CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100136
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200137 CheckDefFailure(['var name: ally'], 'E1010:')
138 CheckDefFailure(['var name: bram'], 'E1010:')
139 CheckDefFailure(['var name: cathy'], 'E1010:')
140 CheckDefFailure(['var name: dom'], 'E1010:')
141 CheckDefFailure(['var name: freddy'], 'E1010:')
142 CheckDefFailure(['var name: john'], 'E1010:')
143 CheckDefFailure(['var name: larry'], 'E1010:')
144 CheckDefFailure(['var name: ned'], 'E1010:')
145 CheckDefFailure(['var name: pam'], 'E1010:')
146 CheckDefFailure(['var name: sam'], 'E1010:')
147 CheckDefFailure(['var name: vim'], 'E1010:')
Bram Moolenaara0a9f432020-04-28 21:29:34 +0200148
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200149 CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
150 CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
Bram Moolenaar08052222020-09-14 17:04:31 +0200151enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100152
Bram Moolenaar10c65862020-10-08 21:16:42 +0200153def Test_script_wrong_type()
154 var lines =<< trim END
155 vim9script
156 var s:dict: dict<string>
157 s:dict['a'] = ['x']
158 END
159 CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3)
160enddef
161
Bram Moolenaar08052222020-09-14 17:04:31 +0200162def Test_const()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200163 CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
164 CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
165 CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200166 CheckDefFailure(['final two'], 'E1125:')
167 CheckDefFailure(['final &option'], 'E996:')
Bram Moolenaardbeecb22020-09-14 18:15:09 +0200168
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200169 var lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200170 final list = [1, 2, 3]
Bram Moolenaardbeecb22020-09-14 18:15:09 +0200171 list[0] = 4
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200172 list->assert_equal([4, 2, 3])
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200173 const other = [5, 6, 7]
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200174 other->assert_equal([5, 6, 7])
Bram Moolenaar71abe482020-09-14 22:28:30 +0200175
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200176 var varlist = [7, 8]
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200177 const constlist = [1, varlist, 3]
Bram Moolenaar71abe482020-09-14 22:28:30 +0200178 varlist[0] = 77
179 # TODO: does not work yet
180 # constlist[1][1] = 88
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200181 var cl = constlist[1]
Bram Moolenaar71abe482020-09-14 22:28:30 +0200182 cl[1] = 88
183 constlist->assert_equal([1, [77, 88], 3])
184
Bram Moolenaare0de1712020-12-02 17:36:54 +0100185 var vardict = {five: 5, six: 6}
186 const constdict = {one: 1, two: vardict, three: 3}
Bram Moolenaar71abe482020-09-14 22:28:30 +0200187 vardict['five'] = 55
188 # TODO: does not work yet
189 # constdict['two']['six'] = 66
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200190 var cd = constdict['two']
Bram Moolenaar71abe482020-09-14 22:28:30 +0200191 cd['six'] = 66
Bram Moolenaare0de1712020-12-02 17:36:54 +0100192 constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3})
Bram Moolenaardbeecb22020-09-14 18:15:09 +0200193 END
194 CheckDefAndScriptSuccess(lines)
Bram Moolenaar08052222020-09-14 17:04:31 +0200195enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100196
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200197def Test_const_bang()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200198 var lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200199 const var = 234
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200200 var = 99
201 END
202 CheckDefExecFailure(lines, 'E1018:', 2)
203 CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
204
205 lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200206 const ll = [2, 3, 4]
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200207 ll[0] = 99
208 END
209 CheckDefExecFailure(lines, 'E1119:', 2)
210 CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
211
212 lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200213 const ll = [2, 3, 4]
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200214 ll[3] = 99
215 END
216 CheckDefExecFailure(lines, 'E1118:', 2)
217 CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
218
219 lines =<< trim END
Bram Moolenaare0de1712020-12-02 17:36:54 +0100220 const dd = {one: 1, two: 2}
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200221 dd["one"] = 99
222 END
223 CheckDefExecFailure(lines, 'E1121:', 2)
224 CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
225
226 lines =<< trim END
Bram Moolenaare0de1712020-12-02 17:36:54 +0100227 const dd = {one: 1, two: 2}
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200228 dd["three"] = 99
229 END
230 CheckDefExecFailure(lines, 'E1120:')
231 CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
232enddef
233
Bram Moolenaardf069ee2020-06-22 23:02:51 +0200234def Test_range_no_colon()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200235 CheckDefFailure(['%s/a/b/'], 'E1050:')
236 CheckDefFailure(['+ s/a/b/'], 'E1050:')
237 CheckDefFailure(['- s/a/b/'], 'E1050:')
238 CheckDefFailure(['. s/a/b/'], 'E1050:')
Bram Moolenaardf069ee2020-06-22 23:02:51 +0200239enddef
240
241
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100242def Test_block()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200243 var outer = 1
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100244 {
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200245 var inner = 2
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100246 assert_equal(1, outer)
247 assert_equal(2, inner)
248 }
249 assert_equal(1, outer)
250enddef
251
Bram Moolenaar08052222020-09-14 17:04:31 +0200252def Test_block_failure()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200253 CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
Bram Moolenaar08052222020-09-14 17:04:31 +0200254 CheckDefFailure(['}'], 'E1025:')
255 CheckDefFailure(['{', 'echo 1'], 'E1026:')
256enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100257
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200258def Test_block_local_vars()
259 var lines =<< trim END
260 vim9script
Bram Moolenaared234f22020-10-15 20:42:20 +0200261 v:testing = 1
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200262 if true
Bram Moolenaared234f22020-10-15 20:42:20 +0200263 var text = ['hello']
264 def SayHello(): list<string>
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200265 return text
266 enddef
267 def SetText(v: string)
Bram Moolenaared234f22020-10-15 20:42:20 +0200268 text = [v]
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200269 enddef
270 endif
271
272 if true
Bram Moolenaared234f22020-10-15 20:42:20 +0200273 var text = ['again']
274 def SayAgain(): list<string>
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200275 return text
276 enddef
277 endif
Bram Moolenaared234f22020-10-15 20:42:20 +0200278
279 # test that the "text" variables are not cleaned up
280 test_garbagecollect_now()
281
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200282 defcompile
283
Bram Moolenaared234f22020-10-15 20:42:20 +0200284 assert_equal(['hello'], SayHello())
285 assert_equal(['again'], SayAgain())
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200286
287 SetText('foobar')
Bram Moolenaared234f22020-10-15 20:42:20 +0200288 assert_equal(['foobar'], SayHello())
289
290 call writefile(['ok'], 'Xdidit')
291 qall!
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200292 END
Bram Moolenaared234f22020-10-15 20:42:20 +0200293
294 # need to execute this with a separate Vim instance to avoid the current
295 # context gets garbage collected.
296 writefile(lines, 'Xscript')
297 RunVim([], [], '-S Xscript')
298 assert_equal(['ok'], readfile('Xdidit'))
299
300 delete('Xscript')
301 delete('Xdidit')
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200302enddef
303
Bram Moolenaar39ca4122020-10-20 14:25:07 +0200304def Test_block_local_vars_with_func()
305 var lines =<< trim END
306 vim9script
307 if true
308 var foo = 'foo'
309 if true
310 var bar = 'bar'
311 def Func(): list<string>
312 return [foo, bar]
313 enddef
314 endif
315 endif
316 # function is compiled here, after blocks have finished, can still access
317 # "foo" and "bar"
318 assert_equal(['foo', 'bar'], Func())
319 END
320 CheckScriptSuccess(lines)
321enddef
322
Bram Moolenaard032f342020-07-18 18:13:02 +0200323func g:NoSuchFunc()
324 echo 'none'
325endfunc
326
Bram Moolenaar9e1d9e32021-01-11 20:17:34 +0100327def Test_try_catch_throw()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200328 var l = []
Bram Moolenaar7a092242020-04-16 22:10:49 +0200329 try # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100330 add(l, '1')
331 throw 'wrong'
332 add(l, '2')
Bram Moolenaar7a092242020-04-16 22:10:49 +0200333 catch # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100334 add(l, v:exception)
Bram Moolenaar7a092242020-04-16 22:10:49 +0200335 finally # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100336 add(l, '3')
Bram Moolenaar7a092242020-04-16 22:10:49 +0200337 endtry # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100338 assert_equal(['1', 'wrong', '3'], l)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200339
Bram Moolenaare8593122020-07-18 15:17:02 +0200340 l = []
341 try
342 try
343 add(l, '1')
344 throw 'wrong'
345 add(l, '2')
346 catch /right/
347 add(l, v:exception)
348 endtry
349 catch /wrong/
350 add(l, 'caught')
Bram Moolenaar373863e2020-09-26 17:20:53 +0200351 fina
Bram Moolenaare8593122020-07-18 15:17:02 +0200352 add(l, 'finally')
353 endtry
354 assert_equal(['1', 'caught', 'finally'], l)
355
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200356 var n: number
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200357 try
358 n = l[3]
359 catch /E684:/
360 n = 99
361 endtry
362 assert_equal(99, n)
363
Bram Moolenaar69f70502021-01-01 16:10:46 +0100364 var done = 'no'
365 if 0
366 try | catch | endtry
367 else
368 done = 'yes'
369 endif
370 assert_equal('yes', done)
371
372 done = 'no'
373 if 1
374 done = 'yes'
375 else
376 try | catch | endtry
377 done = 'never'
378 endif
379 assert_equal('yes', done)
380
381 if 1
382 else
383 try | catch /pat/ | endtry
384 try | catch /pat/
385 endtry
386 try
387 catch /pat/ | endtry
388 try
389 catch /pat/
390 endtry
391 endif
392
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200393 try
Bram Moolenaarcc673e72020-08-16 17:33:35 +0200394 # string slice returns a string, not a number
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200395 n = g:astring[3]
Bram Moolenaar5e654232020-09-16 15:22:00 +0200396 catch /E1012:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200397 n = 77
398 endtry
399 assert_equal(77, n)
400
401 try
402 n = l[g:astring]
Bram Moolenaar5e654232020-09-16 15:22:00 +0200403 catch /E1012:/
Bram Moolenaar56acb092020-08-16 14:48:19 +0200404 n = 88
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200405 endtry
Bram Moolenaar56acb092020-08-16 14:48:19 +0200406 assert_equal(88, n)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200407
408 try
409 n = s:does_not_exist
410 catch /E121:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200411 n = 111
412 endtry
413 assert_equal(111, n)
414
415 try
416 n = g:does_not_exist
417 catch /E121:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200418 n = 121
419 endtry
420 assert_equal(121, n)
421
Bram Moolenaare0de1712020-12-02 17:36:54 +0100422 var d = {one: 1}
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200423 try
424 n = d[g:astring]
425 catch /E716:/
426 n = 222
427 endtry
428 assert_equal(222, n)
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200429
430 try
431 n = -g:astring
432 catch /E39:/
433 n = 233
434 endtry
435 assert_equal(233, n)
436
437 try
438 n = +g:astring
439 catch /E1030:/
440 n = 244
441 endtry
442 assert_equal(244, n)
443
444 try
445 n = +g:alist
446 catch /E745:/
447 n = 255
448 endtry
449 assert_equal(255, n)
450
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200451 var nd: dict<any>
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200452 try
Bram Moolenaar2e5910b2021-02-03 17:41:24 +0100453 nd = {[g:alist]: 1}
454 catch /E1105:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200455 n = 266
456 endtry
457 assert_equal(266, n)
458
459 try
460 [n] = [1, 2, 3]
461 catch /E1093:/
462 n = 277
463 endtry
464 assert_equal(277, n)
465
Bram Moolenaare8593122020-07-18 15:17:02 +0200466 try
467 &ts = g:astring
Bram Moolenaar5e654232020-09-16 15:22:00 +0200468 catch /E1012:/
Bram Moolenaare8593122020-07-18 15:17:02 +0200469 n = 288
470 endtry
471 assert_equal(288, n)
472
473 try
474 &backspace = 'asdf'
475 catch /E474:/
476 n = 299
477 endtry
478 assert_equal(299, n)
479
480 l = [1]
481 try
482 l[3] = 3
483 catch /E684:/
484 n = 300
485 endtry
486 assert_equal(300, n)
487
488 try
Bram Moolenaare8593122020-07-18 15:17:02 +0200489 unlet g:does_not_exist
490 catch /E108:/
491 n = 322
492 endtry
493 assert_equal(322, n)
494
495 try
Bram Moolenaar2bede172020-11-19 18:53:18 +0100496 d = {text: 1, [g:astring]: 2}
Bram Moolenaare8593122020-07-18 15:17:02 +0200497 catch /E721:/
498 n = 333
499 endtry
500 assert_equal(333, n)
501
502 try
503 l = DeletedFunc()
504 catch /E933:/
505 n = 344
506 endtry
507 assert_equal(344, n)
Bram Moolenaard032f342020-07-18 18:13:02 +0200508
509 try
510 echo len(v:true)
511 catch /E701:/
512 n = 355
513 endtry
514 assert_equal(355, n)
515
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200516 var P = function('g:NoSuchFunc')
Bram Moolenaard032f342020-07-18 18:13:02 +0200517 delfunc g:NoSuchFunc
518 try
519 echo P()
520 catch /E117:/
521 n = 366
522 endtry
523 assert_equal(366, n)
524
525 try
526 echo g:NoSuchFunc()
527 catch /E117:/
528 n = 377
529 endtry
530 assert_equal(377, n)
531
532 try
533 echo g:alist + 4
534 catch /E745:/
535 n = 388
536 endtry
537 assert_equal(388, n)
538
539 try
540 echo 4 + g:alist
541 catch /E745:/
542 n = 399
543 endtry
544 assert_equal(399, n)
545
546 try
547 echo g:alist.member
548 catch /E715:/
549 n = 400
550 endtry
551 assert_equal(400, n)
552
553 try
554 echo d.member
555 catch /E716:/
556 n = 411
557 endtry
558 assert_equal(411, n)
Bram Moolenaard9d77892021-02-12 21:32:47 +0100559
560 var counter = 0
561 for i in range(4)
562 try
563 eval [][0]
564 catch
565 endtry
566 counter += 1
567 endfor
568 assert_equal(4, counter)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100569enddef
570
Bram Moolenaar1430cee2021-01-17 19:20:32 +0100571def Test_cnext_works_in_catch()
572 var lines =<< trim END
573 vim9script
574 au BufEnter * eval 0
575 writefile(['text'], 'Xfile1')
576 writefile(['text'], 'Xfile2')
577 var items = [
578 {lnum: 1, filename: 'Xfile1', valid: true},
579 {lnum: 1, filename: 'Xfile2', valid: true}
580 ]
581 setqflist([], ' ', {items: items})
582 cwindow
583
584 def CnextOrCfirst()
585 # if cnext fails, cfirst is used
586 try
587 cnext
588 catch
589 cfirst
590 endtry
591 enddef
592
593 CnextOrCfirst()
594 CnextOrCfirst()
595 writefile([getqflist({idx: 0}).idx], 'Xresult')
596 qall
597 END
598 writefile(lines, 'XCatchCnext')
599 RunVim([], [], '--clean -S XCatchCnext')
600 assert_equal(['1'], readfile('Xresult'))
601
602 delete('Xfile1')
603 delete('Xfile2')
604 delete('XCatchCnext')
605 delete('Xresult')
606enddef
607
Bram Moolenaar9e1d9e32021-01-11 20:17:34 +0100608def Test_throw_skipped()
609 if 0
610 throw dontgethere
611 endif
612enddef
613
Bram Moolenaar8f81b222021-01-14 21:47:06 +0100614def Test_nocatch_throw_silenced()
615 var lines =<< trim END
616 vim9script
617 def Func()
618 throw 'error'
619 enddef
620 silent! Func()
621 END
622 writefile(lines, 'XthrowSilenced')
623 source XthrowSilenced
624 delete('XthrowSilenced')
625enddef
626
Bram Moolenaare8593122020-07-18 15:17:02 +0200627def DeletedFunc(): list<any>
628 return ['delete me']
629enddef
630defcompile
631delfunc DeletedFunc
632
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100633def ThrowFromDef()
Bram Moolenaara72cfb82020-04-23 17:07:30 +0200634 throw "getout" # comment
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100635enddef
636
637func CatchInFunc()
638 try
639 call ThrowFromDef()
640 catch
641 let g:thrown_func = v:exception
642 endtry
643endfunc
644
645def CatchInDef()
646 try
647 ThrowFromDef()
648 catch
649 g:thrown_def = v:exception
650 endtry
651enddef
652
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100653def ReturnFinally(): string
654 try
655 return 'intry'
Bram Moolenaar373863e2020-09-26 17:20:53 +0200656 finall
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100657 g:in_finally = 'finally'
658 endtry
659 return 'end'
660enddef
661
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100662def Test_try_catch_nested()
663 CatchInFunc()
664 assert_equal('getout', g:thrown_func)
665
666 CatchInDef()
667 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100668
669 assert_equal('intry', ReturnFinally())
670 assert_equal('finally', g:in_finally)
671enddef
672
Bram Moolenaar9939f572020-09-16 22:29:52 +0200673def TryOne(): number
674 try
675 return 0
676 catch
677 endtry
678 return 0
679enddef
680
681def TryTwo(n: number): string
682 try
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200683 var x = {}
Bram Moolenaar9939f572020-09-16 22:29:52 +0200684 catch
685 endtry
686 return 'text'
687enddef
688
689def Test_try_catch_twice()
690 assert_equal('text', TryOne()->TryTwo())
691enddef
692
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100693def Test_try_catch_match()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200694 var seq = 'a'
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100695 try
696 throw 'something'
697 catch /nothing/
698 seq ..= 'x'
699 catch /some/
700 seq ..= 'b'
701 catch /asdf/
702 seq ..= 'x'
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200703 catch ?a\?sdf?
704 seq ..= 'y'
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100705 finally
706 seq ..= 'c'
707 endtry
708 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100709enddef
710
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200711def Test_try_catch_fails()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200712 CheckDefFailure(['catch'], 'E603:')
713 CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
714 CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
715 CheckDefFailure(['finally'], 'E606:')
716 CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
717 CheckDefFailure(['endtry'], 'E602:')
718 CheckDefFailure(['while 1', 'endtry'], 'E170:')
719 CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
Bram Moolenaar13106602020-10-04 16:06:05 +0200720 CheckDefFailure(['if 1', 'endtry'], 'E171:')
Bram Moolenaard2c61702020-09-06 15:58:36 +0200721 CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200722
Bram Moolenaare4984292020-12-13 14:19:25 +0100723 CheckDefFailure(['throw'], 'E1143:')
Bram Moolenaard2c61702020-09-06 15:58:36 +0200724 CheckDefFailure(['throw xxx'], 'E1001:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200725enddef
726
Bram Moolenaar7c5b3c0362021-02-14 22:40:57 +0100727def Try_catch_skipped()
728 var l = []
729 try
730 finally
731 endtry
732
733 if 1
734 else
735 try
736 endtry
737 endif
738enddef
739
740" The skipped try/endtry was updating the wrong instruction.
741def Test_try_catch_skipped()
742 var instr = execute('disassemble Try_catch_skipped')
743 assert_match("NEWLIST size 0\n", instr)
744enddef
745
746
747
Bram Moolenaar006ad482020-06-30 20:55:15 +0200748def Test_throw_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200749 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200750 var lines =<< trim END
Bram Moolenaar006ad482020-06-30 20:55:15 +0200751 vim9script
752 try
753 throw 'one'
754 .. 'two'
755 catch
756 assert_equal('onetwo', v:exception)
757 endtry
758 END
759 CheckScriptSuccess(lines)
Bram Moolenaar1e021e62020-10-16 20:25:23 +0200760
761 lines =<< trim END
762 vim9script
Bram Moolenaar352134b2020-10-17 22:04:08 +0200763 @r = ''
Bram Moolenaar1e021e62020-10-16 20:25:23 +0200764 def Func()
765 throw @r
766 enddef
767 var result = ''
768 try
769 Func()
770 catch /E1129:/
771 result = 'caught'
772 endtry
773 assert_equal('caught', result)
774 END
775 CheckScriptSuccess(lines)
Bram Moolenaar006ad482020-06-30 20:55:15 +0200776enddef
777
Bram Moolenaared677f52020-08-12 16:38:10 +0200778def Test_error_in_nested_function()
Bram Moolenaar03dfde22021-02-14 13:17:22 +0100779 # an error in a nested :function aborts executing in the calling :def function
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200780 var lines =<< trim END
Bram Moolenaared677f52020-08-12 16:38:10 +0200781 vim9script
782 def Func()
783 Error()
784 g:test_var = 1
785 enddef
786 func Error() abort
787 eval [][0]
788 endfunc
789 Func()
790 END
791 g:test_var = 0
792 CheckScriptFailure(lines, 'E684:')
793 assert_equal(0, g:test_var)
794enddef
795
Bram Moolenaar37c83712020-06-30 21:18:36 +0200796def Test_cexpr_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200797 # only checks line continuation
Bram Moolenaar37c83712020-06-30 21:18:36 +0200798 set errorformat=File\ %f\ line\ %l
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200799 var lines =<< trim END
Bram Moolenaar37c83712020-06-30 21:18:36 +0200800 vim9script
801 cexpr 'File'
802 .. ' someFile' ..
803 ' line 19'
804 assert_equal(19, getqflist()[0].lnum)
805 END
806 CheckScriptSuccess(lines)
807 set errorformat&
808enddef
809
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +0200810def Test_statusline_syntax()
811 # legacy syntax is used for 'statusline'
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200812 var lines =<< trim END
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +0200813 vim9script
814 func g:Status()
815 return '%{"x" is# "x"}'
816 endfunc
817 set laststatus=2 statusline=%!Status()
818 redrawstatus
819 set laststatus statusline=
820 END
821 CheckScriptSuccess(lines)
822enddef
823
Bram Moolenaarb2097502020-07-19 17:17:02 +0200824def Test_list_vimscript()
825 # checks line continuation and comments
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200826 var lines =<< trim END
Bram Moolenaarb2097502020-07-19 17:17:02 +0200827 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200828 var mylist = [
Bram Moolenaarb2097502020-07-19 17:17:02 +0200829 'one',
830 # comment
831 'two', # empty line follows
832
833 'three',
834 ]
835 assert_equal(['one', 'two', 'three'], mylist)
836 END
837 CheckScriptSuccess(lines)
Bram Moolenaar66250c92020-08-20 15:02:42 +0200838
839 # check all lines from heredoc are kept
840 lines =<< trim END
841 # comment 1
842 two
843 # comment 3
844
845 five
846 # comment 6
847 END
848 assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
Bram Moolenaar4bce26b2021-01-22 22:06:56 +0100849
850 lines =<< trim END
851 [{
852 a: 0}]->string()->assert_equal("[{'a': 0}]")
853 END
854 CheckDefAndScriptSuccess(lines)
Bram Moolenaarb2097502020-07-19 17:17:02 +0200855enddef
856
Bram Moolenaar2a1381c2020-05-05 23:32:58 +0200857if has('channel')
858 let someJob = test_null_job()
Bram Moolenaar40ee4662020-05-05 22:08:26 +0200859
Bram Moolenaar2a1381c2020-05-05 23:32:58 +0200860 def FuncWithError()
861 echomsg g:someJob
862 enddef
Bram Moolenaar40ee4662020-05-05 22:08:26 +0200863
Bram Moolenaar2a1381c2020-05-05 23:32:58 +0200864 func Test_convert_emsg_to_exception()
865 try
866 call FuncWithError()
867 catch
868 call assert_match('Vim:E908:', v:exception)
869 endtry
870 endfunc
871endif
Bram Moolenaar40ee4662020-05-05 22:08:26 +0200872
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100873let s:export_script_lines =<< trim END
874 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200875 var name: string = 'bob'
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100876 def Concat(arg: string): string
877 return name .. arg
878 enddef
Bram Moolenaar227a69d2020-05-15 18:17:28 +0200879 g:result = Concat('bie')
880 g:localname = name
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100881
882 export const CONST = 1234
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200883 export var exported = 9876
884 export var exp_name = 'John'
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100885 export def Exported(): string
886 return 'Exported'
887 enddef
888END
889
Bram Moolenaarb3ca9822020-08-09 14:43:58 +0200890def Undo_export_script_lines()
891 unlet g:result
892 unlet g:localname
893enddef
894
Bram Moolenaar5269bd22020-03-09 19:25:27 +0100895def Test_vim9_import_export()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200896 var import_script_lines =<< trim END
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100897 vim9script
898 import {exported, Exported} from './Xexport.vim'
899 g:imported = exported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100900 exported += 3
901 g:imported_added = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100902 g:imported_func = Exported()
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100903
Bram Moolenaar40f4f7a2020-07-23 22:41:43 +0200904 def GetExported(): string
Bram Moolenaare0de1712020-12-02 17:36:54 +0100905 var local_dict = {ref: Exported}
Bram Moolenaar40f4f7a2020-07-23 22:41:43 +0200906 return local_dict.ref()
907 enddef
908 g:funcref_result = GetExported()
909
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100910 import {exp_name} from './Xexport.vim'
911 g:imported_name = exp_name
912 exp_name ..= ' Doe'
913 g:imported_name_appended = exp_name
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100914 g:imported_later = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100915 END
916
917 writefile(import_script_lines, 'Ximport.vim')
918 writefile(s:export_script_lines, 'Xexport.vim')
919
920 source Ximport.vim
921
922 assert_equal('bobbie', g:result)
923 assert_equal('bob', g:localname)
924 assert_equal(9876, g:imported)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100925 assert_equal(9879, g:imported_added)
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100926 assert_equal(9879, g:imported_later)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100927 assert_equal('Exported', g:imported_func)
Bram Moolenaar40f4f7a2020-07-23 22:41:43 +0200928 assert_equal('Exported', g:funcref_result)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100929 assert_equal('John', g:imported_name)
930 assert_equal('John Doe', g:imported_name_appended)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100931 assert_false(exists('g:name'))
932
Bram Moolenaarb3ca9822020-08-09 14:43:58 +0200933 Undo_export_script_lines()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100934 unlet g:imported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100935 unlet g:imported_added
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100936 unlet g:imported_later
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100937 unlet g:imported_func
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100938 unlet g:imported_name g:imported_name_appended
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100939 delete('Ximport.vim')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100940
Bram Moolenaar1c991142020-07-04 13:15:31 +0200941 # similar, with line breaks
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200942 var import_line_break_script_lines =<< trim END
Bram Moolenaar1c991142020-07-04 13:15:31 +0200943 vim9script
944 import {
945 exported,
946 Exported,
947 }
948 from
949 './Xexport.vim'
950 g:imported = exported
951 exported += 5
952 g:imported_added = exported
953 g:imported_func = Exported()
954 END
955 writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
956 source Ximport_lbr.vim
957
958 assert_equal(9876, g:imported)
959 assert_equal(9881, g:imported_added)
960 assert_equal('Exported', g:imported_func)
961
962 # exported script not sourced again
963 assert_false(exists('g:result'))
964 unlet g:imported
965 unlet g:imported_added
966 unlet g:imported_func
967 delete('Ximport_lbr.vim')
968
969 # import inside :def function
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200970 var import_in_def_lines =<< trim END
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100971 vim9script
972 def ImportInDef()
973 import exported from './Xexport.vim'
974 g:imported = exported
975 exported += 7
976 g:imported_added = exported
977 enddef
978 ImportInDef()
979 END
980 writefile(import_in_def_lines, 'Ximport2.vim')
981 source Ximport2.vim
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200982 # TODO: this should be 9879
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100983 assert_equal(9876, g:imported)
984 assert_equal(9883, g:imported_added)
985 unlet g:imported
986 unlet g:imported_added
987 delete('Ximport2.vim')
988
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200989 var import_star_as_lines =<< trim END
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100990 vim9script
991 import * as Export from './Xexport.vim'
992 def UseExport()
993 g:imported = Export.exported
994 enddef
995 UseExport()
996 END
997 writefile(import_star_as_lines, 'Ximport.vim')
998 source Ximport.vim
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100999 assert_equal(9883, g:imported)
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001000
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001001 var import_star_as_lines_no_dot =<< trim END
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001002 vim9script
1003 import * as Export from './Xexport.vim'
1004 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001005 var dummy = 1
1006 var imported = Export + dummy
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001007 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +02001008 defcompile
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001009 END
1010 writefile(import_star_as_lines_no_dot, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001011 assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001012
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001013 var import_star_as_lines_dot_space =<< trim END
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001014 vim9script
1015 import * as Export from './Xexport.vim'
1016 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001017 var imported = Export . exported
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001018 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +02001019 defcompile
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001020 END
1021 writefile(import_star_as_lines_dot_space, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001022 assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001023
Bram Moolenaara6294952020-12-27 13:39:50 +01001024 var import_star_as_duplicated =<< trim END
1025 vim9script
1026 import * as Export from './Xexport.vim'
1027 var some = 'other'
1028 import * as Export from './Xexport.vim'
1029 defcompile
1030 END
1031 writefile(import_star_as_duplicated, 'Ximport.vim')
1032 assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
1033
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001034 var import_star_as_lines_missing_name =<< trim END
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001035 vim9script
1036 import * as Export from './Xexport.vim'
1037 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001038 var imported = Export.
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001039 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +02001040 defcompile
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001041 END
1042 writefile(import_star_as_lines_missing_name, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001043 assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001044
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001045 var import_star_as_lbr_lines =<< trim END
Bram Moolenaar1c991142020-07-04 13:15:31 +02001046 vim9script
1047 import *
1048 as Export
1049 from
1050 './Xexport.vim'
1051 def UseExport()
1052 g:imported = Export.exported
1053 enddef
1054 UseExport()
1055 END
1056 writefile(import_star_as_lbr_lines, 'Ximport.vim')
1057 source Ximport.vim
1058 assert_equal(9883, g:imported)
1059
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001060 var import_star_lines =<< trim END
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001061 vim9script
1062 import * from './Xexport.vim'
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001063 END
1064 writefile(import_star_lines, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001065 assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001066
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001067 # try to import something that exists but is not exported
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001068 var import_not_exported_lines =<< trim END
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001069 vim9script
1070 import name from './Xexport.vim'
1071 END
1072 writefile(import_not_exported_lines, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001073 assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001074
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001075 # try to import something that is already defined
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001076 var import_already_defined =<< trim END
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001077 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001078 var exported = 'something'
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001079 import exported from './Xexport.vim'
1080 END
1081 writefile(import_already_defined, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001082 assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001083
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001084 # try to import something that is already defined
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001085 import_already_defined =<< trim END
1086 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001087 var exported = 'something'
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001088 import * as exported from './Xexport.vim'
1089 END
1090 writefile(import_already_defined, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001091 assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001092
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001093 # try to import something that is already defined
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001094 import_already_defined =<< trim END
1095 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001096 var exported = 'something'
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001097 import {exported} from './Xexport.vim'
1098 END
1099 writefile(import_already_defined, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001100 assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001101
Bram Moolenaar918a4242020-12-06 14:37:08 +01001102 # try changing an imported const
1103 var import_assign_to_const =<< trim END
1104 vim9script
1105 import CONST from './Xexport.vim'
1106 def Assign()
1107 CONST = 987
1108 enddef
1109 defcompile
1110 END
1111 writefile(import_assign_to_const, 'Ximport.vim')
1112 assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1113
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001114 # import a very long name, requires making a copy
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001115 var import_long_name_lines =<< trim END
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001116 vim9script
1117 import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1118 END
1119 writefile(import_long_name_lines, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001120 assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001121
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001122 var import_no_from_lines =<< trim END
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001123 vim9script
1124 import name './Xexport.vim'
1125 END
1126 writefile(import_no_from_lines, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001127 assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001128
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001129 var import_invalid_string_lines =<< trim END
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001130 vim9script
1131 import name from Xexport.vim
1132 END
1133 writefile(import_invalid_string_lines, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001134 assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001135
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001136 var import_wrong_name_lines =<< trim END
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001137 vim9script
1138 import name from './XnoExport.vim'
1139 END
1140 writefile(import_wrong_name_lines, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001141 assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001142
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001143 var import_missing_comma_lines =<< trim END
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001144 vim9script
1145 import {exported name} from './Xexport.vim'
1146 END
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001147 writefile(import_missing_comma_lines, 'Ximport3.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001148 assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001149
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001150 delete('Ximport.vim')
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001151 delete('Ximport3.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001152 delete('Xexport.vim')
1153
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001154 # Check that in a Vim9 script 'cpo' is set to the Vim default.
Bram Moolenaar750802b2020-02-23 18:08:33 +01001155 set cpo&vi
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001156 var cpo_before = &cpo
1157 var lines =<< trim END
Bram Moolenaar750802b2020-02-23 18:08:33 +01001158 vim9script
1159 g:cpo_in_vim9script = &cpo
1160 END
1161 writefile(lines, 'Xvim9_script')
1162 source Xvim9_script
1163 assert_equal(cpo_before, &cpo)
1164 set cpo&vim
1165 assert_equal(&cpo, g:cpo_in_vim9script)
1166 delete('Xvim9_script')
1167enddef
1168
Bram Moolenaar803af682020-08-05 16:20:03 +02001169func g:Trigger()
1170 source Ximport.vim
1171 return "echo 'yes'\<CR>"
1172endfunc
1173
1174def Test_import_export_expr_map()
1175 # check that :import and :export work when buffer is locked
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001176 var export_lines =<< trim END
Bram Moolenaar803af682020-08-05 16:20:03 +02001177 vim9script
1178 export def That(): string
1179 return 'yes'
1180 enddef
1181 END
1182 writefile(export_lines, 'Xexport_that.vim')
1183
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001184 var import_lines =<< trim END
Bram Moolenaar803af682020-08-05 16:20:03 +02001185 vim9script
1186 import That from './Xexport_that.vim'
1187 assert_equal('yes', That())
1188 END
1189 writefile(import_lines, 'Ximport.vim')
1190
1191 nnoremap <expr> trigger g:Trigger()
1192 feedkeys('trigger', "xt")
1193
Bram Moolenaar730b2482020-08-09 13:02:10 +02001194 delete('Xexport_that.vim')
Bram Moolenaar803af682020-08-05 16:20:03 +02001195 delete('Ximport.vim')
1196 nunmap trigger
1197enddef
1198
Bram Moolenaar8e1986e2020-08-06 22:11:06 +02001199def Test_import_in_filetype()
1200 # check that :import works when the buffer is locked
1201 mkdir('ftplugin', 'p')
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001202 var export_lines =<< trim END
Bram Moolenaar8e1986e2020-08-06 22:11:06 +02001203 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001204 export var That = 'yes'
Bram Moolenaar8e1986e2020-08-06 22:11:06 +02001205 END
Bram Moolenaar730b2482020-08-09 13:02:10 +02001206 writefile(export_lines, 'ftplugin/Xexport_ft.vim')
Bram Moolenaar8e1986e2020-08-06 22:11:06 +02001207
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001208 var import_lines =<< trim END
Bram Moolenaar8e1986e2020-08-06 22:11:06 +02001209 vim9script
Bram Moolenaar730b2482020-08-09 13:02:10 +02001210 import That from './Xexport_ft.vim'
Bram Moolenaar8e1986e2020-08-06 22:11:06 +02001211 assert_equal('yes', That)
1212 g:did_load_mytpe = 1
1213 END
1214 writefile(import_lines, 'ftplugin/qf.vim')
1215
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001216 var save_rtp = &rtp
Bram Moolenaar8e1986e2020-08-06 22:11:06 +02001217 &rtp = getcwd() .. ',' .. &rtp
1218
1219 filetype plugin on
1220 copen
1221 assert_equal(1, g:did_load_mytpe)
1222
1223 quit!
Bram Moolenaar730b2482020-08-09 13:02:10 +02001224 delete('Xexport_ft.vim')
Bram Moolenaar8e1986e2020-08-06 22:11:06 +02001225 delete('ftplugin', 'rf')
1226 &rtp = save_rtp
1227enddef
1228
Bram Moolenaarefa94442020-08-08 22:16:00 +02001229def Test_use_import_in_mapping()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001230 var lines =<< trim END
Bram Moolenaarefa94442020-08-08 22:16:00 +02001231 vim9script
1232 export def Funcx()
1233 g:result = 42
1234 enddef
1235 END
1236 writefile(lines, 'XsomeExport.vim')
1237 lines =<< trim END
1238 vim9script
1239 import Funcx from './XsomeExport.vim'
Bram Moolenaarb3ca9822020-08-09 14:43:58 +02001240 nnoremap <F3> :call <sid>Funcx()<cr>
Bram Moolenaarefa94442020-08-08 22:16:00 +02001241 END
1242 writefile(lines, 'Xmapscript.vim')
1243
1244 source Xmapscript.vim
Bram Moolenaarb3ca9822020-08-09 14:43:58 +02001245 feedkeys("\<F3>", "xt")
Bram Moolenaarefa94442020-08-08 22:16:00 +02001246 assert_equal(42, g:result)
1247
1248 unlet g:result
1249 delete('XsomeExport.vim')
1250 delete('Xmapscript.vim')
Bram Moolenaarb3ca9822020-08-09 14:43:58 +02001251 nunmap <F3>
Bram Moolenaarefa94442020-08-08 22:16:00 +02001252enddef
1253
Bram Moolenaar750802b2020-02-23 18:08:33 +01001254def Test_vim9script_fails()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001255 CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
1256 CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001257 CheckScriptFailure(['export var some = 123'], 'E1042:')
Bram Moolenaar9721fb42020-06-11 23:10:46 +02001258 CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001259 CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
Bram Moolenaar750802b2020-02-23 18:08:33 +01001260 CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1261
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001262 CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
Bram Moolenaarc785b9a2020-06-19 18:34:15 +02001263 CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1264
Bram Moolenaare2e40752020-09-04 21:18:46 +02001265 assert_fails('vim9script', 'E1038:')
1266 assert_fails('export something', 'E1043:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001267enddef
1268
Bram Moolenaarf7d267e2020-06-17 12:04:54 +02001269func Test_import_fails_without_script()
Bram Moolenaar101f4812020-06-16 23:18:51 +02001270 CheckRunVimInTerminal
1271
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001272 " call indirectly to avoid compilation error for missing functions
Bram Moolenaarc620c052020-07-08 15:16:19 +02001273 call Run_Test_import_fails_on_command_line()
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001274endfunc
1275
Bram Moolenaarc620c052020-07-08 15:16:19 +02001276def Run_Test_import_fails_on_command_line()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001277 var export =<< trim END
Bram Moolenaar101f4812020-06-16 23:18:51 +02001278 vim9script
1279 export def Foo(): number
1280 return 0
1281 enddef
1282 END
Bram Moolenaar730b2482020-08-09 13:02:10 +02001283 writefile(export, 'XexportCmd.vim')
Bram Moolenaar101f4812020-06-16 23:18:51 +02001284
Bram Moolenaare0de1712020-12-02 17:36:54 +01001285 var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001286 rows: 6, wait_for_ruler: 0})
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001287 WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
Bram Moolenaar101f4812020-06-16 23:18:51 +02001288
Bram Moolenaar730b2482020-08-09 13:02:10 +02001289 delete('XexportCmd.vim')
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001290 StopVimInTerminal(buf)
1291enddef
Bram Moolenaar101f4812020-06-16 23:18:51 +02001292
Bram Moolenaar2b327002020-12-26 15:39:31 +01001293def Test_vim9script_reload_noclear()
1294 var lines =<< trim END
Bram Moolenaara6294952020-12-27 13:39:50 +01001295 vim9script
1296 export var exported = 'thexport'
1297 END
1298 writefile(lines, 'XExportReload')
1299 lines =<< trim END
Bram Moolenaar2b327002020-12-26 15:39:31 +01001300 vim9script noclear
1301 g:loadCount += 1
1302 var s:reloaded = 'init'
Bram Moolenaara6294952020-12-27 13:39:50 +01001303 import exported from './XExportReload'
Bram Moolenaar2b327002020-12-26 15:39:31 +01001304
1305 def Again(): string
1306 return 'again'
1307 enddef
1308
1309 if exists('s:loaded') | finish | endif
1310 var s:loaded = true
1311
1312 var s:notReloaded = 'yes'
1313 s:reloaded = 'first'
1314 def g:Values(): list<string>
Bram Moolenaara6294952020-12-27 13:39:50 +01001315 return [s:reloaded, s:notReloaded, Again(), Once(), exported]
Bram Moolenaar2b327002020-12-26 15:39:31 +01001316 enddef
1317
1318 def Once(): string
1319 return 'once'
1320 enddef
1321 END
1322 writefile(lines, 'XReloaded')
1323 g:loadCount = 0
1324 source XReloaded
1325 assert_equal(1, g:loadCount)
Bram Moolenaara6294952020-12-27 13:39:50 +01001326 assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
Bram Moolenaar2b327002020-12-26 15:39:31 +01001327 source XReloaded
1328 assert_equal(2, g:loadCount)
Bram Moolenaara6294952020-12-27 13:39:50 +01001329 assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
Bram Moolenaar2b327002020-12-26 15:39:31 +01001330 source XReloaded
1331 assert_equal(3, g:loadCount)
Bram Moolenaara6294952020-12-27 13:39:50 +01001332 assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
Bram Moolenaar2b327002020-12-26 15:39:31 +01001333
Bram Moolenaar48e11c12021-01-11 18:47:00 +01001334 delete('XReloaded')
Bram Moolenaara6294952020-12-27 13:39:50 +01001335 delete('XExportReload')
Bram Moolenaar2b327002020-12-26 15:39:31 +01001336 delfunc g:Values
Bram Moolenaar2b327002020-12-26 15:39:31 +01001337 unlet g:loadCount
1338enddef
1339
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001340def Test_vim9script_reload_import()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001341 var lines =<< trim END
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001342 vim9script
1343 const var = ''
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001344 var valone = 1234
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001345 def MyFunc(arg: string)
1346 valone = 5678
1347 enddef
1348 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001349 var morelines =<< trim END
1350 var valtwo = 222
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001351 export def GetValtwo(): number
1352 return valtwo
1353 enddef
1354 END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001355 writefile(lines + morelines, 'Xreload.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001356 source Xreload.vim
1357 source Xreload.vim
1358 source Xreload.vim
1359
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001360 var testlines =<< trim END
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001361 vim9script
1362 def TheFunc()
1363 import GetValtwo from './Xreload.vim'
1364 assert_equal(222, GetValtwo())
1365 enddef
1366 TheFunc()
1367 END
1368 writefile(testlines, 'Ximport.vim')
1369 source Ximport.vim
1370
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001371 # Test that when not using "morelines" GetValtwo() and valtwo are still
1372 # defined, because import doesn't reload a script.
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001373 writefile(lines, 'Xreload.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001374 source Ximport.vim
1375
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001376 # cannot declare a var twice
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001377 lines =<< trim END
1378 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001379 var valone = 1234
1380 var valone = 5678
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001381 END
1382 writefile(lines, 'Xreload.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001383 assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001384
1385 delete('Xreload.vim')
1386 delete('Ximport.vim')
1387enddef
1388
Bram Moolenaar07a65d22020-12-26 20:09:15 +01001389" if a script is reloaded with a script-local variable that changed its type, a
1390" compiled function using that variable must fail.
1391def Test_script_reload_change_type()
1392 var lines =<< trim END
1393 vim9script noclear
1394 var str = 'string'
1395 def g:GetStr(): string
1396 return str .. 'xxx'
1397 enddef
1398 END
1399 writefile(lines, 'Xreload.vim')
1400 source Xreload.vim
1401 echo g:GetStr()
1402
1403 lines =<< trim END
1404 vim9script noclear
1405 var str = 1234
1406 END
1407 writefile(lines, 'Xreload.vim')
1408 source Xreload.vim
1409 assert_fails('echo g:GetStr()', 'E1150:')
1410
1411 delfunc g:GetStr
1412 delete('Xreload.vim')
1413enddef
1414
Bram Moolenaar95006e32020-08-29 17:47:08 +02001415def s:RetSome(): string
1416 return 'some'
1417enddef
1418
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001419" Not exported function that is referenced needs to be accessed by the
1420" script-local name.
1421def Test_vim9script_funcref()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001422 var sortlines =<< trim END
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001423 vim9script
1424 def Compare(i1: number, i2: number): number
Bram Moolenaarbed36b92020-07-07 23:31:36 +02001425 return i2 - i1
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001426 enddef
1427
1428 export def FastSort(): list<number>
1429 return range(5)->sort(Compare)
1430 enddef
1431 END
1432 writefile(sortlines, 'Xsort.vim')
1433
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001434 var lines =<< trim END
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001435 vim9script
1436 import FastSort from './Xsort.vim'
1437 def Test()
1438 g:result = FastSort()
1439 enddef
1440 Test()
1441 END
1442 writefile(lines, 'Xscript.vim')
1443
1444 source Xscript.vim
1445 assert_equal([4, 3, 2, 1, 0], g:result)
1446
1447 unlet g:result
1448 delete('Xsort.vim')
1449 delete('Xscript.vim')
Bram Moolenaar95006e32020-08-29 17:47:08 +02001450
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001451 var Funcref = function('s:RetSome')
Bram Moolenaar95006e32020-08-29 17:47:08 +02001452 assert_equal('some', Funcref())
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001453enddef
1454
Bram Moolenaar601e76a2020-08-27 21:33:10 +02001455" Check that when searching for "FilterFunc" it finds the import in the
1456" script where FastFilter() is called from, both as a string and as a direct
1457" function reference.
Bram Moolenaarc620c052020-07-08 15:16:19 +02001458def Test_vim9script_funcref_other_script()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001459 var filterLines =<< trim END
Bram Moolenaarc620c052020-07-08 15:16:19 +02001460 vim9script
1461 export def FilterFunc(idx: number, val: number): bool
1462 return idx % 2 == 1
1463 enddef
1464 export def FastFilter(): list<number>
1465 return range(10)->filter('FilterFunc')
1466 enddef
Bram Moolenaar601e76a2020-08-27 21:33:10 +02001467 export def FastFilterDirect(): list<number>
1468 return range(10)->filter(FilterFunc)
1469 enddef
Bram Moolenaarc620c052020-07-08 15:16:19 +02001470 END
1471 writefile(filterLines, 'Xfilter.vim')
1472
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001473 var lines =<< trim END
Bram Moolenaarc620c052020-07-08 15:16:19 +02001474 vim9script
Bram Moolenaar601e76a2020-08-27 21:33:10 +02001475 import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim'
Bram Moolenaarc620c052020-07-08 15:16:19 +02001476 def Test()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001477 var x: list<number> = FastFilter()
Bram Moolenaarc620c052020-07-08 15:16:19 +02001478 enddef
1479 Test()
Bram Moolenaar601e76a2020-08-27 21:33:10 +02001480 def TestDirect()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001481 var x: list<number> = FastFilterDirect()
Bram Moolenaar601e76a2020-08-27 21:33:10 +02001482 enddef
1483 TestDirect()
Bram Moolenaarc620c052020-07-08 15:16:19 +02001484 END
Bram Moolenaar601e76a2020-08-27 21:33:10 +02001485 CheckScriptSuccess(lines)
Bram Moolenaarc620c052020-07-08 15:16:19 +02001486 delete('Xfilter.vim')
Bram Moolenaarc620c052020-07-08 15:16:19 +02001487enddef
1488
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001489def Test_vim9script_reload_delfunc()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001490 var first_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001491 vim9script
1492 def FuncYes(): string
1493 return 'yes'
1494 enddef
1495 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001496 var withno_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001497 def FuncNo(): string
1498 return 'no'
1499 enddef
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001500 def g:DoCheck(no_exists: bool)
1501 assert_equal('yes', FuncYes())
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001502 assert_equal('no', FuncNo())
1503 enddef
1504 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001505 var nono_lines =<< trim END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001506 def g:DoCheck(no_exists: bool)
1507 assert_equal('yes', FuncYes())
Bram Moolenaar44d66522020-09-06 22:26:57 +02001508 assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001509 enddef
1510 END
1511
1512 # FuncNo() is defined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001513 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001514 source Xreloaded.vim
1515 g:DoCheck(true)
1516
1517 # FuncNo() is not redefined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001518 writefile(first_lines + nono_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001519 source Xreloaded.vim
Bram Moolenaar50824712020-12-20 21:10:17 +01001520 g:DoCheck(false)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001521
1522 # FuncNo() is back
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001523 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001524 source Xreloaded.vim
Bram Moolenaar50824712020-12-20 21:10:17 +01001525 g:DoCheck(false)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001526
1527 delete('Xreloaded.vim')
1528enddef
1529
Bram Moolenaar89483d42020-05-10 15:24:44 +02001530def Test_vim9script_reload_delvar()
1531 # write the script with a script-local variable
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001532 var lines =<< trim END
Bram Moolenaar89483d42020-05-10 15:24:44 +02001533 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001534 var name = 'string'
Bram Moolenaar89483d42020-05-10 15:24:44 +02001535 END
1536 writefile(lines, 'XreloadVar.vim')
1537 source XreloadVar.vim
1538
1539 # now write the script using the same variable locally - works
1540 lines =<< trim END
1541 vim9script
1542 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001543 var name = 'string'
Bram Moolenaar89483d42020-05-10 15:24:44 +02001544 enddef
1545 END
1546 writefile(lines, 'XreloadVar.vim')
1547 source XreloadVar.vim
1548
1549 delete('XreloadVar.vim')
1550enddef
1551
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001552def Test_import_absolute()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001553 var import_lines = [
Bram Moolenaare6085c52020-04-12 20:19:16 +02001554 'vim9script',
1555 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1556 'def UseExported()',
1557 ' g:imported_abs = exported',
1558 ' exported = 8888',
1559 ' g:imported_after = exported',
1560 'enddef',
1561 'UseExported()',
1562 'g:import_disassembled = execute("disass UseExported")',
1563 ]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001564 writefile(import_lines, 'Ximport_abs.vim')
1565 writefile(s:export_script_lines, 'Xexport_abs.vim')
1566
1567 source Ximport_abs.vim
1568
1569 assert_equal(9876, g:imported_abs)
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +01001570 assert_equal(8888, g:imported_after)
Bram Moolenaarfbbcd002020-10-15 12:46:44 +02001571 assert_match('<SNR>\d\+_UseExported\_s*' ..
1572 'g:imported_abs = exported\_s*' ..
1573 '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1574 '1 STOREG g:imported_abs\_s*' ..
1575 'exported = 8888\_s*' ..
1576 '2 PUSHNR 8888\_s*' ..
1577 '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1578 'g:imported_after = exported\_s*' ..
1579 '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1580 '5 STOREG g:imported_after',
Bram Moolenaare6085c52020-04-12 20:19:16 +02001581 g:import_disassembled)
Bram Moolenaarb3ca9822020-08-09 14:43:58 +02001582
1583 Undo_export_script_lines()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001584 unlet g:imported_abs
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +01001585 unlet g:import_disassembled
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001586
1587 delete('Ximport_abs.vim')
1588 delete('Xexport_abs.vim')
1589enddef
1590
1591def Test_import_rtp()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001592 var import_lines = [
Bram Moolenaare6085c52020-04-12 20:19:16 +02001593 'vim9script',
1594 'import exported from "Xexport_rtp.vim"',
1595 'g:imported_rtp = exported',
1596 ]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001597 writefile(import_lines, 'Ximport_rtp.vim')
1598 mkdir('import')
1599 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
1600
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001601 var save_rtp = &rtp
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001602 &rtp = getcwd()
1603 source Ximport_rtp.vim
1604 &rtp = save_rtp
1605
1606 assert_equal(9876, g:imported_rtp)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001607
Bram Moolenaarb3ca9822020-08-09 14:43:58 +02001608 Undo_export_script_lines()
1609 unlet g:imported_rtp
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001610 delete('Ximport_rtp.vim')
Bram Moolenaar89483d42020-05-10 15:24:44 +02001611 delete('import', 'rf')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001612enddef
1613
Bram Moolenaar25e0f582020-05-25 22:36:50 +02001614def Test_import_compile_error()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001615 var export_lines = [
Bram Moolenaar25e0f582020-05-25 22:36:50 +02001616 'vim9script',
1617 'export def ExpFunc(): string',
1618 ' return notDefined',
1619 'enddef',
1620 ]
1621 writefile(export_lines, 'Xexported.vim')
1622
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001623 var import_lines = [
Bram Moolenaar25e0f582020-05-25 22:36:50 +02001624 'vim9script',
1625 'import ExpFunc from "./Xexported.vim"',
1626 'def ImpFunc()',
1627 ' echo ExpFunc()',
1628 'enddef',
1629 'defcompile',
1630 ]
1631 writefile(import_lines, 'Ximport.vim')
1632
1633 try
1634 source Ximport.vim
1635 catch /E1001/
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001636 # Error should be fore the Xexported.vim file.
Bram Moolenaar77072282020-09-16 17:55:40 +02001637 assert_match('E1001: Variable not found: notDefined', v:exception)
Bram Moolenaar25e0f582020-05-25 22:36:50 +02001638 assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
1639 endtry
1640
1641 delete('Xexported.vim')
1642 delete('Ximport.vim')
1643enddef
1644
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001645def Test_func_redefine_error()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001646 var lines = [
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001647 'vim9script',
1648 'def Func()',
1649 ' eval [][0]',
1650 'enddef',
1651 'Func()',
1652 ]
1653 writefile(lines, 'Xtestscript.vim')
1654
1655 for count in range(3)
1656 try
1657 source Xtestscript.vim
1658 catch /E684/
1659 # function name should contain <SNR> every time
1660 assert_match('E684: list index out of range', v:exception)
1661 assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1662 endtry
1663 endfor
1664
1665 delete('Xtestscript.vim')
1666enddef
1667
Bram Moolenaareef21022020-08-01 22:16:43 +02001668def Test_func_overrules_import_fails()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001669 var export_lines =<< trim END
Bram Moolenaareef21022020-08-01 22:16:43 +02001670 vim9script
1671 export def Func()
1672 echo 'imported'
1673 enddef
1674 END
1675 writefile(export_lines, 'XexportedFunc.vim')
1676
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001677 var lines =<< trim END
Bram Moolenaareef21022020-08-01 22:16:43 +02001678 vim9script
1679 import Func from './XexportedFunc.vim'
1680 def Func()
1681 echo 'local to function'
1682 enddef
1683 END
1684 CheckScriptFailure(lines, 'E1073:')
1685
1686 lines =<< trim END
1687 vim9script
1688 import Func from './XexportedFunc.vim'
1689 def Outer()
1690 def Func()
1691 echo 'local to function'
1692 enddef
1693 enddef
1694 defcompile
1695 END
1696 CheckScriptFailure(lines, 'E1073:')
1697
1698 delete('XexportedFunc.vim')
1699enddef
1700
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001701def Test_func_redefine_fails()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001702 var lines =<< trim END
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001703 vim9script
1704 def Func()
1705 echo 'one'
1706 enddef
1707 def Func()
1708 echo 'two'
1709 enddef
1710 END
1711 CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001712
1713 lines =<< trim END
1714 vim9script
1715 def Foo(): string
1716 return 'foo'
1717 enddef
1718 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001719 var Foo = {-> 'lambda'}
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001720 enddef
1721 defcompile
1722 END
1723 CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001724enddef
1725
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001726def Test_fixed_size_list()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001727 # will be allocated as one piece of memory, check that changes work
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001728 var l = [1, 2, 3, 4]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001729 l->remove(0)
1730 l->add(5)
1731 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001732 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001733enddef
1734
Bram Moolenaarae616492020-07-28 20:07:27 +02001735def Test_no_insert_xit()
Bram Moolenaard2c61702020-09-06 15:58:36 +02001736 CheckDefExecFailure(['a = 1'], 'E1100:')
1737 CheckDefExecFailure(['c = 1'], 'E1100:')
1738 CheckDefExecFailure(['i = 1'], 'E1100:')
1739 CheckDefExecFailure(['t = 1'], 'E1100:')
1740 CheckDefExecFailure(['x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02001741
Bram Moolenaarae616492020-07-28 20:07:27 +02001742 CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1743 CheckScriptFailure(['vim9script', 'a'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02001744 CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1745 CheckScriptFailure(['vim9script', 'c'], 'E1100:')
Bram Moolenaarf5a48012020-08-01 17:00:03 +02001746 CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1747 CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1748 CheckScriptFailure(['vim9script', 't'], 'E1100:')
1749 CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1750 CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02001751enddef
1752
Bram Moolenaar158906c2020-02-06 20:39:45 +01001753def IfElse(what: number): string
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001754 var res = ''
Bram Moolenaar158906c2020-02-06 20:39:45 +01001755 if what == 1
1756 res = "one"
1757 elseif what == 2
1758 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001759 else
Bram Moolenaar158906c2020-02-06 20:39:45 +01001760 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001761 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +01001762 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001763enddef
1764
Bram Moolenaar158906c2020-02-06 20:39:45 +01001765def Test_if_elseif_else()
1766 assert_equal('one', IfElse(1))
1767 assert_equal('two', IfElse(2))
1768 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001769enddef
1770
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001771def Test_if_elseif_else_fails()
Bram Moolenaard2c61702020-09-06 15:58:36 +02001772 CheckDefFailure(['elseif true'], 'E582:')
1773 CheckDefFailure(['else'], 'E581:')
1774 CheckDefFailure(['endif'], 'E580:')
Bram Moolenaarced68a02021-01-24 17:53:47 +01001775 CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
Bram Moolenaard2c61702020-09-06 15:58:36 +02001776 CheckDefFailure(['if true', 'echo 1'], 'E171:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01001777
1778 var lines =<< trim END
1779 var s = ''
1780 if s = ''
1781 endif
1782 END
1783 CheckDefFailure(lines, 'E488:')
1784
1785 lines =<< trim END
1786 var s = ''
1787 if s == ''
1788 elseif s = ''
1789 endif
1790 END
1791 CheckDefFailure(lines, 'E488:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001792enddef
1793
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001794let g:bool_true = v:true
1795let g:bool_false = v:false
1796
1797def Test_if_const_expr()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001798 var res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001799 if true ? true : false
1800 res = true
1801 endif
1802 assert_equal(true, res)
1803
Bram Moolenaar585fea72020-04-02 22:33:21 +02001804 g:glob = 2
1805 if false
Bram Moolenaar67979662020-06-20 22:50:47 +02001806 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001807 endif
1808 assert_equal(2, g:glob)
1809 if true
Bram Moolenaar67979662020-06-20 22:50:47 +02001810 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001811 endif
1812 assert_equal(3, g:glob)
1813
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001814 res = false
1815 if g:bool_true ? true : false
1816 res = true
1817 endif
1818 assert_equal(true, res)
1819
1820 res = false
1821 if true ? g:bool_true : false
1822 res = true
1823 endif
1824 assert_equal(true, res)
1825
1826 res = false
1827 if true ? true : g:bool_false
1828 res = true
1829 endif
1830 assert_equal(true, res)
1831
1832 res = false
1833 if true ? false : true
1834 res = true
1835 endif
1836 assert_equal(false, res)
1837
1838 res = false
1839 if false ? false : true
1840 res = true
1841 endif
1842 assert_equal(true, res)
1843
1844 res = false
1845 if false ? true : false
1846 res = true
1847 endif
1848 assert_equal(false, res)
1849
1850 res = false
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001851 if has('xyz') ? true : false
1852 res = true
1853 endif
1854 assert_equal(false, res)
1855
1856 res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001857 if true && true
1858 res = true
1859 endif
1860 assert_equal(true, res)
1861
1862 res = false
1863 if true && false
1864 res = true
1865 endif
1866 assert_equal(false, res)
1867
1868 res = false
1869 if g:bool_true && false
1870 res = true
1871 endif
1872 assert_equal(false, res)
1873
1874 res = false
1875 if true && g:bool_false
1876 res = true
1877 endif
1878 assert_equal(false, res)
1879
1880 res = false
1881 if false && false
1882 res = true
1883 endif
1884 assert_equal(false, res)
1885
1886 res = false
1887 if true || false
1888 res = true
1889 endif
1890 assert_equal(true, res)
1891
1892 res = false
1893 if g:bool_true || false
1894 res = true
1895 endif
1896 assert_equal(true, res)
1897
1898 res = false
1899 if true || g:bool_false
1900 res = true
1901 endif
1902 assert_equal(true, res)
1903
1904 res = false
1905 if false || false
1906 res = true
1907 endif
1908 assert_equal(false, res)
Bram Moolenaar3988f642020-08-27 22:43:03 +02001909
1910 # with constant "false" expression may be invalid so long as the syntax is OK
1911 if false | eval 0 | endif
1912 if false | eval burp + 234 | endif
1913 if false | echo burp 234 'asd' | endif
1914 if false
1915 burp
1916 endif
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02001917enddef
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001918
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02001919def Test_if_const_expr_fails()
Bram Moolenaard2c61702020-09-06 15:58:36 +02001920 CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1921 CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1922 CheckDefFailure(["if has('aaa'"], 'E110:')
1923 CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001924enddef
1925
Bram Moolenaar72abcf42020-06-18 18:26:24 +02001926def RunNested(i: number): number
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001927 var x: number = 0
Bram Moolenaar72abcf42020-06-18 18:26:24 +02001928 if i % 2
1929 if 1
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001930 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02001931 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001932 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02001933 endif
1934 x += 1
1935 else
1936 x += 1000
1937 endif
1938 return x
1939enddef
1940
1941def Test_nested_if()
1942 assert_equal(1, RunNested(1))
1943 assert_equal(1000, RunNested(2))
1944enddef
1945
Bram Moolenaarad39c092020-02-26 18:23:43 +01001946def Test_execute_cmd()
Bram Moolenaare4984292020-12-13 14:19:25 +01001947 # missing argument is ignored
1948 execute
1949 execute # comment
1950
Bram Moolenaarad39c092020-02-26 18:23:43 +01001951 new
1952 setline(1, 'default')
Bram Moolenaard2c61702020-09-06 15:58:36 +02001953 execute 'setline(1, "execute-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001954 assert_equal('execute-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001955
Bram Moolenaard2c61702020-09-06 15:58:36 +02001956 execute "setline(1, 'execute-string')"
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001957 assert_equal('execute-string', getline(1))
1958
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001959 var cmd1 = 'setline(1,'
1960 var cmd2 = '"execute-var")'
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001961 execute cmd1 cmd2 # comment
Bram Moolenaarad39c092020-02-26 18:23:43 +01001962 assert_equal('execute-var', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001963
Bram Moolenaard2c61702020-09-06 15:58:36 +02001964 execute cmd1 cmd2 '|setline(1, "execute-var-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001965 assert_equal('execute-var-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001966
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001967 var cmd_first = 'call '
1968 var cmd_last = 'setline(1, "execute-var-var")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001969 execute cmd_first .. cmd_last
1970 assert_equal('execute-var-var', getline(1))
1971 bwipe!
Bram Moolenaar585fea72020-04-02 22:33:21 +02001972
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001973 var n = true
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02001974 execute 'echomsg' (n ? '"true"' : '"no"')
1975 assert_match('^true$', Screenline(&lines))
1976
Bram Moolenaare0de1712020-12-02 17:36:54 +01001977 echomsg [1, 2, 3] {a: 1, b: 2}
Bram Moolenaare5abf7a2020-08-16 18:29:35 +02001978 assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
1979
Bram Moolenaard2c61702020-09-06 15:58:36 +02001980 CheckDefFailure(['execute xxx'], 'E1001:', 1)
1981 CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
1982 CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
Bram Moolenaarad39c092020-02-26 18:23:43 +01001983enddef
1984
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001985def Test_execute_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001986 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001987 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001988 vim9script
1989 execute 'g:someVar'
1990 .. ' = ' ..
1991 '28'
1992 assert_equal(28, g:someVar)
1993 unlet g:someVar
1994 END
1995 CheckScriptSuccess(lines)
1996enddef
1997
Bram Moolenaarad39c092020-02-26 18:23:43 +01001998def Test_echo_cmd()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001999 echo 'some' # comment
Bram Moolenaar585fea72020-04-02 22:33:21 +02002000 echon 'thing'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002001 assert_match('^something$', Screenline(&lines))
2002
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002003 echo "some" # comment
2004 echon "thing"
2005 assert_match('^something$', Screenline(&lines))
2006
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002007 var str1 = 'some'
2008 var str2 = 'more'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002009 echo str1 str2
2010 assert_match('^some more$', Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002011
Bram Moolenaard2c61702020-09-06 15:58:36 +02002012 CheckDefFailure(['echo "xxx"# comment'], 'E488:')
Bram Moolenaarad39c092020-02-26 18:23:43 +01002013enddef
2014
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002015def Test_echomsg_cmd()
2016 echomsg 'some' 'more' # comment
2017 assert_match('^some more$', Screenline(&lines))
2018 echo 'clear'
Bram Moolenaardf069ee2020-06-22 23:02:51 +02002019 :1messages
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002020 assert_match('^some more$', Screenline(&lines))
2021
Bram Moolenaard2c61702020-09-06 15:58:36 +02002022 CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002023enddef
2024
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002025def Test_echomsg_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002026 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002027 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002028 vim9script
2029 echomsg 'here'
2030 .. ' is ' ..
2031 'a message'
2032 assert_match('^here is a message$', Screenline(&lines))
2033 END
2034 CheckScriptSuccess(lines)
2035enddef
2036
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002037def Test_echoerr_cmd()
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002038 try
2039 echoerr 'something' 'wrong' # comment
2040 catch
2041 assert_match('something wrong', v:exception)
2042 endtry
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002043enddef
2044
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002045def Test_echoerr_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002046 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002047 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002048 vim9script
2049 try
2050 echoerr 'this'
2051 .. ' is ' ..
2052 'wrong'
2053 catch
2054 assert_match('this is wrong', v:exception)
2055 endtry
2056 END
2057 CheckScriptSuccess(lines)
2058enddef
2059
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002060def Test_for_outside_of_function()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002061 var lines =<< trim END
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002062 vim9script
2063 new
2064 for var in range(0, 3)
2065 append(line('$'), var)
2066 endfor
2067 assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
2068 bwipe!
2069 END
2070 writefile(lines, 'Xvim9for.vim')
2071 source Xvim9for.vim
2072 delete('Xvim9for.vim')
2073enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002074
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002075def Test_for_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002076 var result = ''
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002077 for cnt in range(7)
2078 if cnt == 4
2079 break
2080 endif
2081 if cnt == 2
2082 continue
2083 endif
2084 result ..= cnt .. '_'
2085 endfor
2086 assert_equal('0_1_3_', result)
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02002087
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002088 var concat = ''
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02002089 for str in eval('["one", "two"]')
2090 concat ..= str
2091 endfor
2092 assert_equal('onetwo', concat)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002093
2094 var total = 0
2095 for nr in
2096 [1, 2, 3]
2097 total += nr
2098 endfor
2099 assert_equal(6, total)
2100
2101 total = 0
2102 for nr
2103 in [1, 2, 3]
2104 total += nr
2105 endfor
2106 assert_equal(6, total)
2107
2108 total = 0
2109 for nr
2110 in
2111 [1, 2, 3]
2112 total += nr
2113 endfor
2114 assert_equal(6, total)
Bram Moolenaar036d0712021-01-17 20:23:38 +01002115
2116 var res = ""
2117 for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2118 res ..= n .. s
2119 endfor
2120 assert_equal('1a2b', res)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002121enddef
2122
2123def Test_for_loop_fails()
Bram Moolenaar025cb1c2020-12-14 18:31:27 +01002124 CheckDefFailure(['for '], 'E1097:')
2125 CheckDefFailure(['for x'], 'E1097:')
2126 CheckDefFailure(['for x in'], 'E1097:')
Bram Moolenaar675f7162020-04-12 22:53:54 +02002127 CheckDefFailure(['for # in range(5)'], 'E690:')
2128 CheckDefFailure(['for i In range(5)'], 'E690:')
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002129 CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:')
Bram Moolenaar822ba242020-05-24 23:00:18 +02002130 CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01002131 delfunc! g:Func
Bram Moolenaar451c2e32020-08-15 16:33:28 +02002132 CheckDefFailure(['for i in "text"'], 'E1012:')
Bram Moolenaar675f7162020-04-12 22:53:54 +02002133 CheckDefFailure(['for i in xxx'], 'E1001:')
2134 CheckDefFailure(['endfor'], 'E588:')
2135 CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002136enddef
2137
Bram Moolenaarea870692020-12-02 14:24:30 +01002138def Test_for_loop_script_var()
2139 # cannot use s:var in a :def function
2140 CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:')
2141
2142 # can use s:var in Vim9 script, with or without s:
2143 var lines =<< trim END
2144 vim9script
2145 var total = 0
2146 for s:var in [1, 2, 3]
2147 total += s:var
2148 endfor
2149 assert_equal(6, total)
2150
2151 total = 0
2152 for var in [1, 2, 3]
2153 total += var
2154 endfor
2155 assert_equal(6, total)
2156 END
2157enddef
2158
Bram Moolenaar792f7862020-11-23 08:31:18 +01002159def Test_for_loop_unpack()
Bram Moolenaar792f7862020-11-23 08:31:18 +01002160 var lines =<< trim END
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002161 var result = []
2162 for [v1, v2] in [[1, 2], [3, 4]]
2163 result->add(v1)
2164 result->add(v2)
2165 endfor
2166 assert_equal([1, 2, 3, 4], result)
2167
2168 result = []
2169 for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2170 result->add(v1)
2171 result->add(v2)
2172 result->add(v3)
2173 endfor
2174 assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2175
2176 result = []
2177 for [&ts, &sw] in [[1, 2], [3, 4]]
2178 result->add(&ts)
2179 result->add(&sw)
2180 endfor
2181 assert_equal([1, 2, 3, 4], result)
2182
2183 var slist: list<string>
2184 for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
2185 slist->add($LOOPVAR)
2186 slist->add(@r)
2187 slist->add(v:errmsg)
2188 endfor
2189 assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
2190
2191 slist = []
2192 for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
2193 slist->add(g:globalvar)
2194 slist->add(b:bufvar)
2195 slist->add(w:winvar)
2196 slist->add(t:tabvar)
2197 endfor
2198 assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
Bram Moolenaarf6c177a2020-12-04 17:38:00 +01002199 unlet! g:globalvar b:bufvar w:winvar t:tabvar
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002200 END
2201 CheckDefAndScriptSuccess(lines)
2202
2203 lines =<< trim END
Bram Moolenaar792f7862020-11-23 08:31:18 +01002204 for [v1, v2] in [[1, 2, 3], [3, 4]]
2205 echo v1 v2
2206 endfor
2207 END
2208 CheckDefExecFailure(lines, 'E710:', 1)
2209
2210 lines =<< trim END
2211 for [v1, v2] in [[1], [3, 4]]
2212 echo v1 v2
2213 endfor
2214 END
2215 CheckDefExecFailure(lines, 'E711:', 1)
2216
2217 lines =<< trim END
2218 for [v1, v1] in [[1, 2], [3, 4]]
2219 echo v1
2220 endfor
2221 END
2222 CheckDefExecFailure(lines, 'E1017:', 1)
2223enddef
2224
Bram Moolenaarc150c092021-02-13 15:02:46 +01002225def Test_for_loop_with_try_continue()
2226 var looped = 0
2227 var cleanup = 0
2228 for i in range(3)
2229 looped += 1
2230 try
2231 eval [][0]
2232 catch
2233 continue
2234 finally
2235 cleanup += 1
2236 endtry
2237 endfor
2238 assert_equal(3, looped)
2239 assert_equal(3, cleanup)
2240enddef
2241
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01002242def Test_while_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002243 var result = ''
2244 var cnt = 0
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01002245 while cnt < 555
2246 if cnt == 3
2247 break
2248 endif
2249 cnt += 1
2250 if cnt == 2
2251 continue
2252 endif
2253 result ..= cnt .. '_'
2254 endwhile
2255 assert_equal('1_3_', result)
Bram Moolenaardee37dc2021-02-07 16:40:05 +01002256
2257 var s = ''
Bram Moolenaar0123cc12021-02-07 17:17:58 +01002258 while s == 'x' #{comment}
Bram Moolenaardee37dc2021-02-07 16:40:05 +01002259 endwhile
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01002260enddef
2261
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002262def Test_while_loop_fails()
Bram Moolenaar675f7162020-04-12 22:53:54 +02002263 CheckDefFailure(['while xxx'], 'E1001:')
2264 CheckDefFailure(['endwhile'], 'E588:')
2265 CheckDefFailure(['continue'], 'E586:')
2266 CheckDefFailure(['if true', 'continue'], 'E586:')
2267 CheckDefFailure(['break'], 'E587:')
2268 CheckDefFailure(['if true', 'break'], 'E587:')
2269 CheckDefFailure(['while 1', 'echo 3'], 'E170:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01002270
2271 var lines =<< trim END
2272 var s = ''
2273 while s = ''
2274 endwhile
2275 END
2276 CheckDefFailure(lines, 'E488:')
Bram Moolenaarbd5da372020-03-31 23:13:10 +02002277enddef
2278
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01002279def Test_interrupt_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002280 var caught = false
2281 var x = 0
Bram Moolenaar97acfc72020-03-22 13:44:28 +01002282 try
2283 while 1
2284 x += 1
2285 if x == 100
2286 feedkeys("\<C-C>", 'Lt')
2287 endif
2288 endwhile
2289 catch
2290 caught = true
2291 assert_equal(100, x)
2292 endtry
2293 assert_true(caught, 'should have caught an exception')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02002294 # consume the CTRL-C
2295 getchar(0)
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01002296enddef
Bram Moolenaar20431c92020-03-20 18:39:46 +01002297
Bram Moolenaar4fdae992020-04-12 16:38:57 +02002298def Test_automatic_line_continuation()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002299 var mylist = [
Bram Moolenaar4fdae992020-04-12 16:38:57 +02002300 'one',
2301 'two',
2302 'three',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002303 ] # comment
Bram Moolenaar4fdae992020-04-12 16:38:57 +02002304 assert_equal(['one', 'two', 'three'], mylist)
2305
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002306 var mydict = {
Bram Moolenaare0de1712020-12-02 17:36:54 +01002307 ['one']: 1,
2308 ['two']: 2,
2309 ['three']:
Bram Moolenaar4fdae992020-04-12 16:38:57 +02002310 3,
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002311 } # comment
Bram Moolenaare0de1712020-12-02 17:36:54 +01002312 assert_equal({one: 1, two: 2, three: 3}, mydict)
2313 mydict = {
Bram Moolenaar2c330432020-04-13 14:41:35 +02002314 one: 1, # comment
2315 two: # comment
2316 2, # comment
2317 three: 3 # comment
2318 }
Bram Moolenaare0de1712020-12-02 17:36:54 +01002319 assert_equal({one: 1, two: 2, three: 3}, mydict)
2320 mydict = {
Bram Moolenaar2c330432020-04-13 14:41:35 +02002321 one: 1,
2322 two:
2323 2,
2324 three: 3
Bram Moolenaar4fdae992020-04-12 16:38:57 +02002325 }
Bram Moolenaare0de1712020-12-02 17:36:54 +01002326 assert_equal({one: 1, two: 2, three: 3}, mydict)
Bram Moolenaare6085c52020-04-12 20:19:16 +02002327
2328 assert_equal(
2329 ['one', 'two', 'three'],
2330 split('one two three')
2331 )
Bram Moolenaar4fdae992020-04-12 16:38:57 +02002332enddef
2333
Bram Moolenaar7a092242020-04-16 22:10:49 +02002334def Test_vim9_comment()
2335 CheckScriptSuccess([
2336 'vim9script',
2337 '# something',
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01002338 '#something',
2339 '#{something',
Bram Moolenaar7a092242020-04-16 22:10:49 +02002340 ])
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01002341
2342 split Xfile
2343 CheckScriptSuccess([
2344 'vim9script',
2345 'edit #something',
2346 ])
2347 CheckScriptSuccess([
2348 'vim9script',
2349 'edit #{something',
2350 ])
2351 close
2352
Bram Moolenaar7a092242020-04-16 22:10:49 +02002353 CheckScriptFailure([
2354 'vim9script',
2355 ':# something',
2356 ], 'E488:')
2357 CheckScriptFailure([
2358 '# something',
2359 ], 'E488:')
2360 CheckScriptFailure([
2361 ':# something',
2362 ], 'E488:')
2363
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02002364 { # block start
2365 } # block end
2366 CheckDefFailure([
2367 '{# comment',
2368 ], 'E488:')
2369 CheckDefFailure([
2370 '{',
2371 '}# comment',
2372 ], 'E488:')
2373
2374 echo "yes" # comment
2375 CheckDefFailure([
2376 'echo "yes"# comment',
2377 ], 'E488:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02002378 CheckScriptSuccess([
2379 'vim9script',
2380 'echo "yes" # something',
2381 ])
2382 CheckScriptFailure([
2383 'vim9script',
2384 'echo "yes"# something',
2385 ], 'E121:')
2386 CheckScriptFailure([
2387 'vim9script',
2388 'echo# something',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01002389 ], 'E1144:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02002390 CheckScriptFailure([
2391 'echo "yes" # something',
2392 ], 'E121:')
2393
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02002394 exe "echo" # comment
2395 CheckDefFailure([
2396 'exe "echo"# comment',
2397 ], 'E488:')
2398 CheckScriptSuccess([
2399 'vim9script',
2400 'exe "echo" # something',
2401 ])
2402 CheckScriptFailure([
2403 'vim9script',
2404 'exe "echo"# something',
2405 ], 'E121:')
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02002406 CheckScriptFailure([
2407 'vim9script',
2408 'exe# something',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01002409 ], 'E1144:')
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02002410 CheckScriptFailure([
2411 'exe "echo" # something',
2412 ], 'E121:')
2413
Bram Moolenaar7a092242020-04-16 22:10:49 +02002414 CheckDefFailure([
2415 'try# comment',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002416 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02002417 'catch',
2418 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01002419 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002420 CheckScriptFailure([
2421 'vim9script',
2422 'try# comment',
2423 'echo "yes"',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01002424 ], 'E1144:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02002425 CheckDefFailure([
2426 'try',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002427 ' throw#comment',
2428 'catch',
2429 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01002430 ], 'E1144:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002431 CheckDefFailure([
2432 'try',
2433 ' throw "yes"#comment',
2434 'catch',
2435 'endtry',
2436 ], 'E488:')
2437 CheckDefFailure([
2438 'try',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002439 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02002440 'catch# comment',
2441 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01002442 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002443 CheckScriptFailure([
2444 'vim9script',
2445 'try',
2446 ' echo "yes"',
2447 'catch# comment',
2448 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01002449 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002450 CheckDefFailure([
2451 'try',
2452 ' echo "yes"',
2453 'catch /pat/# comment',
2454 'endtry',
2455 ], 'E488:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02002456 CheckDefFailure([
2457 'try',
2458 'echo "yes"',
2459 'catch',
2460 'endtry# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01002461 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002462 CheckScriptFailure([
2463 'vim9script',
2464 'try',
2465 ' echo "yes"',
2466 'catch',
2467 'endtry# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01002468 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002469
2470 CheckScriptSuccess([
2471 'vim9script',
2472 'hi # comment',
2473 ])
2474 CheckScriptFailure([
2475 'vim9script',
2476 'hi# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01002477 ], 'E1144:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02002478 CheckScriptSuccess([
2479 'vim9script',
2480 'hi Search # comment',
2481 ])
2482 CheckScriptFailure([
2483 'vim9script',
2484 'hi Search# comment',
2485 ], 'E416:')
2486 CheckScriptSuccess([
2487 'vim9script',
2488 'hi link This Search # comment',
2489 ])
2490 CheckScriptFailure([
2491 'vim9script',
2492 'hi link This That# comment',
2493 ], 'E413:')
2494 CheckScriptSuccess([
2495 'vim9script',
2496 'hi clear This # comment',
2497 'hi clear # comment',
2498 ])
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002499 # not tested, because it doesn't give an error but a warning:
2500 # hi clear This# comment',
Bram Moolenaar1966c242020-04-20 22:42:32 +02002501 CheckScriptFailure([
2502 'vim9script',
2503 'hi clear# comment',
2504 ], 'E416:')
2505
2506 CheckScriptSuccess([
2507 'vim9script',
2508 'hi Group term=bold',
2509 'match Group /todo/ # comment',
2510 ])
2511 CheckScriptFailure([
2512 'vim9script',
2513 'hi Group term=bold',
2514 'match Group /todo/# comment',
2515 ], 'E488:')
2516 CheckScriptSuccess([
2517 'vim9script',
2518 'match # comment',
2519 ])
2520 CheckScriptFailure([
2521 'vim9script',
2522 'match# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01002523 ], 'E1144:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02002524 CheckScriptSuccess([
2525 'vim9script',
2526 'match none # comment',
2527 ])
2528 CheckScriptFailure([
2529 'vim9script',
2530 'match none# comment',
2531 ], 'E475:')
2532
2533 CheckScriptSuccess([
2534 'vim9script',
2535 'menutrans clear # comment',
2536 ])
2537 CheckScriptFailure([
2538 'vim9script',
2539 'menutrans clear# comment text',
2540 ], 'E474:')
2541
2542 CheckScriptSuccess([
2543 'vim9script',
2544 'syntax clear # comment',
2545 ])
2546 CheckScriptFailure([
2547 'vim9script',
2548 'syntax clear# comment text',
2549 ], 'E28:')
2550 CheckScriptSuccess([
2551 'vim9script',
2552 'syntax keyword Word some',
2553 'syntax clear Word # comment',
2554 ])
2555 CheckScriptFailure([
2556 'vim9script',
2557 'syntax keyword Word some',
2558 'syntax clear Word# comment text',
2559 ], 'E28:')
2560
2561 CheckScriptSuccess([
2562 'vim9script',
2563 'syntax list # comment',
2564 ])
2565 CheckScriptFailure([
2566 'vim9script',
2567 'syntax list# comment text',
2568 ], 'E28:')
2569
2570 CheckScriptSuccess([
2571 'vim9script',
2572 'syntax match Word /pat/ oneline # comment',
2573 ])
2574 CheckScriptFailure([
2575 'vim9script',
2576 'syntax match Word /pat/ oneline# comment',
2577 ], 'E475:')
2578
2579 CheckScriptSuccess([
2580 'vim9script',
2581 'syntax keyword Word word # comm[ent',
2582 ])
2583 CheckScriptFailure([
2584 'vim9script',
2585 'syntax keyword Word word# comm[ent',
2586 ], 'E789:')
2587
2588 CheckScriptSuccess([
2589 'vim9script',
2590 'syntax match Word /pat/ # comment',
2591 ])
2592 CheckScriptFailure([
2593 'vim9script',
2594 'syntax match Word /pat/# comment',
2595 ], 'E402:')
2596
2597 CheckScriptSuccess([
2598 'vim9script',
2599 'syntax match Word /pat/ contains=Something # comment',
2600 ])
2601 CheckScriptFailure([
2602 'vim9script',
2603 'syntax match Word /pat/ contains=Something# comment',
2604 ], 'E475:')
2605 CheckScriptFailure([
2606 'vim9script',
2607 'syntax match Word /pat/ contains= # comment',
2608 ], 'E406:')
2609 CheckScriptFailure([
2610 'vim9script',
2611 'syntax match Word /pat/ contains=# comment',
2612 ], 'E475:')
2613
2614 CheckScriptSuccess([
2615 'vim9script',
2616 'syntax region Word start=/pat/ end=/pat/ # comment',
2617 ])
2618 CheckScriptFailure([
2619 'vim9script',
2620 'syntax region Word start=/pat/ end=/pat/# comment',
Bram Moolenaard032f342020-07-18 18:13:02 +02002621 ], 'E402:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02002622
2623 CheckScriptSuccess([
2624 'vim9script',
2625 'syntax sync # comment',
2626 ])
2627 CheckScriptFailure([
2628 'vim9script',
2629 'syntax sync# comment',
2630 ], 'E404:')
2631 CheckScriptSuccess([
2632 'vim9script',
2633 'syntax sync ccomment # comment',
2634 ])
2635 CheckScriptFailure([
2636 'vim9script',
2637 'syntax sync ccomment# comment',
2638 ], 'E404:')
2639
2640 CheckScriptSuccess([
2641 'vim9script',
2642 'syntax cluster Some contains=Word # comment',
2643 ])
2644 CheckScriptFailure([
2645 'vim9script',
2646 'syntax cluster Some contains=Word# comment',
2647 ], 'E475:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002648
2649 CheckScriptSuccess([
2650 'vim9script',
2651 'command Echo echo # comment',
2652 'command Echo # comment',
Bram Moolenaar2d870f82020-12-05 13:41:01 +01002653 'delcommand Echo',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002654 ])
2655 CheckScriptFailure([
2656 'vim9script',
2657 'command Echo echo# comment',
2658 'Echo',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01002659 ], 'E1144:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01002660 delcommand Echo
Bram Moolenaar70249ee2020-12-10 21:01:30 +01002661
2662 var curdir = getcwd()
2663 CheckScriptSuccess([
2664 'command Echo cd " comment',
2665 'Echo',
2666 'delcommand Echo',
2667 ])
2668 CheckScriptSuccess([
Bram Moolenaar090728a2020-12-20 15:43:31 +01002669 'vim9script',
Bram Moolenaar70249ee2020-12-10 21:01:30 +01002670 'command Echo cd # comment',
2671 'Echo',
2672 'delcommand Echo',
2673 ])
2674 CheckScriptFailure([
2675 'vim9script',
2676 'command Echo cd " comment',
2677 'Echo',
2678 ], 'E344:')
2679 delcommand Echo
2680 chdir(curdir)
2681
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002682 CheckScriptFailure([
2683 'vim9script',
2684 'command Echo# comment',
2685 ], 'E182:')
2686 CheckScriptFailure([
2687 'vim9script',
2688 'command Echo echo',
2689 'command Echo# comment',
2690 ], 'E182:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01002691 delcommand Echo
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002692
2693 CheckScriptSuccess([
2694 'vim9script',
2695 'function # comment',
2696 ])
2697 CheckScriptFailure([
2698 'vim9script',
Bram Moolenaar98981072020-07-29 14:40:25 +02002699 'function " comment',
2700 ], 'E129:')
2701 CheckScriptFailure([
2702 'vim9script',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002703 'function# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01002704 ], 'E1144:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002705 CheckScriptSuccess([
2706 'vim9script',
2707 'function CheckScriptSuccess # comment',
2708 ])
2709 CheckScriptFailure([
2710 'vim9script',
2711 'function CheckScriptSuccess# comment',
2712 ], 'E488:')
2713
2714 CheckScriptSuccess([
2715 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002716 'func g:DeleteMeA()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002717 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002718 'delfunction g:DeleteMeA # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002719 ])
2720 CheckScriptFailure([
2721 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002722 'func g:DeleteMeB()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002723 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002724 'delfunction g:DeleteMeB# comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002725 ], 'E488:')
2726
2727 CheckScriptSuccess([
2728 'vim9script',
2729 'call execute("ls") # comment',
2730 ])
2731 CheckScriptFailure([
2732 'vim9script',
2733 'call execute("ls")# comment',
2734 ], 'E488:')
Bram Moolenaare7e48382020-07-22 18:17:08 +02002735
2736 CheckScriptFailure([
2737 'def Test() " comment',
2738 'enddef',
2739 ], 'E488:')
2740 CheckScriptFailure([
2741 'vim9script',
2742 'def Test() " comment',
2743 'enddef',
2744 ], 'E488:')
2745
2746 CheckScriptSuccess([
2747 'func Test() " comment',
2748 'endfunc',
Bram Moolenaar2d870f82020-12-05 13:41:01 +01002749 'delfunc Test',
Bram Moolenaare7e48382020-07-22 18:17:08 +02002750 ])
Bram Moolenaar98981072020-07-29 14:40:25 +02002751 CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02002752 'vim9script',
2753 'func Test() " comment',
2754 'endfunc',
Bram Moolenaar98981072020-07-29 14:40:25 +02002755 ])
Bram Moolenaare7e48382020-07-22 18:17:08 +02002756
2757 CheckScriptSuccess([
2758 'def Test() # comment',
2759 'enddef',
2760 ])
2761 CheckScriptFailure([
2762 'func Test() # comment',
2763 'endfunc',
2764 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002765enddef
2766
2767def Test_vim9_comment_gui()
2768 CheckCanRunGui
2769
2770 CheckScriptFailure([
2771 'vim9script',
2772 'gui#comment'
Bram Moolenaarf8103f22020-12-25 17:36:27 +01002773 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002774 CheckScriptFailure([
2775 'vim9script',
2776 'gui -f#comment'
2777 ], 'E499:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02002778enddef
2779
Bram Moolenaara26b9702020-04-18 19:53:28 +02002780def Test_vim9_comment_not_compiled()
Bram Moolenaar67979662020-06-20 22:50:47 +02002781 au TabEnter *.vim g:entered = 1
2782 au TabEnter *.x g:entered = 2
Bram Moolenaara26b9702020-04-18 19:53:28 +02002783
2784 edit test.vim
2785 doautocmd TabEnter #comment
2786 assert_equal(1, g:entered)
2787
2788 doautocmd TabEnter f.x
2789 assert_equal(2, g:entered)
2790
2791 g:entered = 0
2792 doautocmd TabEnter f.x #comment
2793 assert_equal(2, g:entered)
2794
2795 assert_fails('doautocmd Syntax#comment', 'E216:')
2796
2797 au! TabEnter
2798 unlet g:entered
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02002799
2800 CheckScriptSuccess([
2801 'vim9script',
Bram Moolenaar67979662020-06-20 22:50:47 +02002802 'g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02002803 'b:var = 456',
2804 'w:var = 777',
2805 't:var = 888',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02002806 'unlet g:var w:var # something',
2807 ])
2808
2809 CheckScriptFailure([
2810 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002811 'let var = 123',
2812 ], 'E1126: Cannot use :let in Vim9 script')
2813
2814 CheckScriptFailure([
2815 'vim9script',
2816 'var g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02002817 ], 'E1016: Cannot declare a global variable:')
2818
2819 CheckScriptFailure([
2820 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002821 'var b:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02002822 ], 'E1016: Cannot declare a buffer variable:')
2823
2824 CheckScriptFailure([
2825 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002826 'var w:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02002827 ], 'E1016: Cannot declare a window variable:')
2828
2829 CheckScriptFailure([
2830 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002831 'var t:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02002832 ], 'E1016: Cannot declare a tab variable:')
2833
2834 CheckScriptFailure([
2835 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002836 'var v:version = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02002837 ], 'E1016: Cannot declare a v: variable:')
2838
2839 CheckScriptFailure([
2840 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002841 'var $VARIABLE = "text"',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02002842 ], 'E1016: Cannot declare an environment variable:')
Bram Moolenaar67979662020-06-20 22:50:47 +02002843
2844 CheckScriptFailure([
2845 'vim9script',
2846 'g:var = 123',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002847 'unlet g:var# comment1',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02002848 ], 'E108:')
2849
2850 CheckScriptFailure([
2851 'let g:var = 123',
2852 'unlet g:var # something',
2853 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002854
2855 CheckScriptSuccess([
2856 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002857 'if 1 # comment2',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002858 ' echo "yes"',
2859 'elseif 2 #comment',
2860 ' echo "no"',
2861 'endif',
2862 ])
2863
2864 CheckScriptFailure([
2865 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002866 'if 1# comment3',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002867 ' echo "yes"',
2868 'endif',
2869 ], 'E15:')
2870
2871 CheckScriptFailure([
2872 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002873 'if 0 # comment4',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002874 ' echo "yes"',
2875 'elseif 2#comment',
2876 ' echo "no"',
2877 'endif',
2878 ], 'E15:')
2879
2880 CheckScriptSuccess([
2881 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002882 'var v = 1 # comment5',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002883 ])
2884
2885 CheckScriptFailure([
2886 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002887 'var v = 1# comment6',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002888 ], 'E15:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002889
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002890 CheckScriptSuccess([
2891 'vim9script',
2892 'new'
Bram Moolenaard2c61702020-09-06 15:58:36 +02002893 'setline(1, ["# define pat", "last"])',
Bram Moolenaardf069ee2020-06-22 23:02:51 +02002894 ':$',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002895 'dsearch /pat/ #comment',
2896 'bwipe!',
2897 ])
2898
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002899 CheckScriptFailure([
2900 'vim9script',
2901 'new'
Bram Moolenaard2c61702020-09-06 15:58:36 +02002902 'setline(1, ["# define pat", "last"])',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002903 ':$',
2904 'dsearch /pat/#comment',
2905 'bwipe!',
2906 ], 'E488:')
2907
2908 CheckScriptFailure([
2909 'vim9script',
2910 'func! SomeFunc()',
2911 ], 'E477:')
Bram Moolenaara26b9702020-04-18 19:53:28 +02002912enddef
2913
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02002914def Test_finish()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002915 var lines =<< trim END
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02002916 vim9script
Bram Moolenaar67979662020-06-20 22:50:47 +02002917 g:res = 'one'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02002918 if v:false | finish | endif
Bram Moolenaar67979662020-06-20 22:50:47 +02002919 g:res = 'two'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02002920 finish
Bram Moolenaar67979662020-06-20 22:50:47 +02002921 g:res = 'three'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02002922 END
2923 writefile(lines, 'Xfinished')
2924 source Xfinished
2925 assert_equal('two', g:res)
2926
2927 unlet g:res
2928 delete('Xfinished')
2929enddef
2930
Bram Moolenaara5d00772020-05-14 23:20:55 +02002931def Test_forward_declaration()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002932 var lines =<< trim END
Bram Moolenaara5d00772020-05-14 23:20:55 +02002933 vim9script
Bram Moolenaara5d00772020-05-14 23:20:55 +02002934 def GetValue(): string
2935 return theVal
2936 enddef
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002937 var theVal = 'something'
Bram Moolenaar822ba242020-05-24 23:00:18 +02002938 g:initVal = GetValue()
Bram Moolenaara5d00772020-05-14 23:20:55 +02002939 theVal = 'else'
2940 g:laterVal = GetValue()
2941 END
2942 writefile(lines, 'Xforward')
2943 source Xforward
2944 assert_equal('something', g:initVal)
2945 assert_equal('else', g:laterVal)
2946
2947 unlet g:initVal
2948 unlet g:laterVal
2949 delete('Xforward')
2950enddef
2951
Bram Moolenaar9721fb42020-06-11 23:10:46 +02002952def Test_source_vim9_from_legacy()
Bram Moolenaara6294952020-12-27 13:39:50 +01002953 var vim9_lines =<< trim END
2954 vim9script
2955 var local = 'local'
2956 g:global = 'global'
2957 export var exported = 'exported'
2958 export def GetText(): string
2959 return 'text'
2960 enddef
2961 END
2962 writefile(vim9_lines, 'Xvim9_script.vim')
2963
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002964 var legacy_lines =<< trim END
Bram Moolenaar9721fb42020-06-11 23:10:46 +02002965 source Xvim9_script.vim
2966
2967 call assert_false(exists('local'))
2968 call assert_false(exists('exported'))
2969 call assert_false(exists('s:exported'))
2970 call assert_equal('global', global)
2971 call assert_equal('global', g:global)
2972
2973 " imported variable becomes script-local
2974 import exported from './Xvim9_script.vim'
2975 call assert_equal('exported', s:exported)
2976 call assert_false(exists('exported'))
2977
2978 " imported function becomes script-local
2979 import GetText from './Xvim9_script.vim'
2980 call assert_equal('text', s:GetText())
2981 call assert_false(exists('*GetText'))
2982 END
2983 writefile(legacy_lines, 'Xlegacy_script.vim')
2984
Bram Moolenaar9721fb42020-06-11 23:10:46 +02002985 source Xlegacy_script.vim
Bram Moolenaar9721fb42020-06-11 23:10:46 +02002986 assert_equal('global', g:global)
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002987 unlet g:global
Bram Moolenaar9721fb42020-06-11 23:10:46 +02002988
2989 delete('Xlegacy_script.vim')
2990 delete('Xvim9_script.vim')
2991enddef
Bram Moolenaara5d00772020-05-14 23:20:55 +02002992
Bram Moolenaar7d699702020-08-14 20:52:28 +02002993func Test_vim9script_not_global()
2994 " check that items defined in Vim9 script are script-local, not global
2995 let vim9lines =<< trim END
2996 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002997 var name = 'local'
Bram Moolenaar7d699702020-08-14 20:52:28 +02002998 func TheFunc()
2999 echo 'local'
3000 endfunc
3001 def DefFunc()
3002 echo 'local'
3003 enddef
3004 END
3005 call writefile(vim9lines, 'Xvim9script.vim')
3006 source Xvim9script.vim
3007 try
3008 echo g:var
3009 assert_report('did not fail')
3010 catch /E121:/
3011 " caught
3012 endtry
3013 try
3014 call TheFunc()
3015 assert_report('did not fail')
3016 catch /E117:/
3017 " caught
3018 endtry
3019 try
3020 call DefFunc()
3021 assert_report('did not fail')
3022 catch /E117:/
3023 " caught
3024 endtry
3025
Bram Moolenaar25859dd2020-08-30 12:54:53 +02003026 call delete('Xvim9script.vim')
Bram Moolenaar7d699702020-08-14 20:52:28 +02003027endfunc
3028
Bram Moolenaareeb27bf2020-07-04 17:39:10 +02003029def Test_vim9_copen()
3030 # this was giving an error for setting w:quickfix_title
3031 copen
3032 quit
3033enddef
3034
Bram Moolenaar03290b82020-12-19 16:30:44 +01003035" test using an auto-loaded function and variable
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02003036def Test_vim9_autoload()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003037 var lines =<< trim END
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02003038 vim9script
Bram Moolenaar03290b82020-12-19 16:30:44 +01003039 def some#gettest(): string
3040 return 'test'
3041 enddef
3042 g:some#name = 'name'
3043 END
3044
3045 mkdir('Xdir/autoload', 'p')
3046 writefile(lines, 'Xdir/autoload/some.vim')
3047 var save_rtp = &rtp
3048 exe 'set rtp^=' .. getcwd() .. '/Xdir'
3049
3050 assert_equal('test', g:some#gettest())
3051 assert_equal('name', g:some#name)
3052 g:some#other = 'other'
3053 assert_equal('other', g:some#other)
3054
Bram Moolenaar17f700a2020-12-19 21:23:42 +01003055 # upper case script name works
3056 lines =<< trim END
3057 vim9script
3058 def Other#getOther(): string
3059 return 'other'
3060 enddef
3061 END
3062 writefile(lines, 'Xdir/autoload/Other.vim')
3063 assert_equal('other', g:Other#getOther())
3064
Bram Moolenaar03290b82020-12-19 16:30:44 +01003065 delete('Xdir', 'rf')
3066 &rtp = save_rtp
3067enddef
3068
3069" test using a vim9script that is auto-loaded from an autocmd
3070def Test_vim9_aucmd_autoload()
3071 var lines =<< trim END
3072 vim9script
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02003073 def foo#test()
3074 echomsg getreg('"')
3075 enddef
3076 END
3077
3078 mkdir('Xdir/autoload', 'p')
3079 writefile(lines, 'Xdir/autoload/foo.vim')
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003080 var save_rtp = &rtp
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02003081 exe 'set rtp^=' .. getcwd() .. '/Xdir'
3082 augroup test
3083 autocmd TextYankPost * call foo#test()
3084 augroup END
3085
3086 normal Y
3087
3088 augroup test
3089 autocmd!
3090 augroup END
3091 delete('Xdir', 'rf')
3092 &rtp = save_rtp
3093enddef
3094
Bram Moolenaar77e5dcc2020-09-17 21:29:03 +02003095" This was causing a crash because suppress_errthrow wasn't reset.
3096def Test_vim9_autoload_error()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003097 var lines =<< trim END
Bram Moolenaar77e5dcc2020-09-17 21:29:03 +02003098 vim9script
3099 def crash#func()
3100 try
3101 for x in List()
3102 endfor
3103 catch
3104 endtry
3105 g:ok = true
3106 enddef
3107 fu List()
3108 invalid
3109 endfu
3110 try
Bram Moolenaar48e11c12021-01-11 18:47:00 +01003111 alsoinvalid
Bram Moolenaar77e5dcc2020-09-17 21:29:03 +02003112 catch /wontmatch/
3113 endtry
3114 END
3115 call mkdir('Xruntime/autoload', 'p')
3116 call writefile(lines, 'Xruntime/autoload/crash.vim')
3117
3118 # run in a separate Vim to avoid the side effects of assert_fails()
3119 lines =<< trim END
3120 exe 'set rtp^=' .. getcwd() .. '/Xruntime'
3121 call crash#func()
3122 call writefile(['ok'], 'Xdidit')
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02003123 qall!
Bram Moolenaar77e5dcc2020-09-17 21:29:03 +02003124 END
3125 writefile(lines, 'Xscript')
3126 RunVim([], [], '-S Xscript')
3127 assert_equal(['ok'], readfile('Xdidit'))
3128
3129 delete('Xdidit')
3130 delete('Xscript')
3131 delete('Xruntime', 'rf')
Bram Moolenaar03290b82020-12-19 16:30:44 +01003132
3133 lines =<< trim END
3134 vim9script
3135 var foo#bar = 'asdf'
3136 END
3137 CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
Bram Moolenaar77e5dcc2020-09-17 21:29:03 +02003138enddef
3139
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02003140def Test_script_var_in_autocmd()
3141 # using a script variable from an autocommand, defined in a :def function in a
3142 # legacy Vim script, cannot check the variable type.
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003143 var lines =<< trim END
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02003144 let s:counter = 1
3145 def s:Func()
3146 au! CursorHold
3147 au CursorHold * s:counter += 1
3148 enddef
3149 call s:Func()
3150 doau CursorHold
3151 call assert_equal(2, s:counter)
3152 au! CursorHold
3153 END
3154 CheckScriptSuccess(lines)
3155enddef
3156
Bram Moolenaar3896a102020-08-09 14:33:55 +02003157def Test_cmdline_win()
3158 # if the Vim syntax highlighting uses Vim9 constructs they can be used from
3159 # the command line window.
3160 mkdir('rtp/syntax', 'p')
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003161 var export_lines =<< trim END
Bram Moolenaar3896a102020-08-09 14:33:55 +02003162 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003163 export var That = 'yes'
Bram Moolenaar3896a102020-08-09 14:33:55 +02003164 END
3165 writefile(export_lines, 'rtp/syntax/Xexport.vim')
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003166 var import_lines =<< trim END
Bram Moolenaar3896a102020-08-09 14:33:55 +02003167 vim9script
3168 import That from './Xexport.vim'
3169 END
3170 writefile(import_lines, 'rtp/syntax/vim.vim')
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003171 var save_rtp = &rtp
Bram Moolenaar3896a102020-08-09 14:33:55 +02003172 &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
3173 syntax on
3174 augroup CmdWin
3175 autocmd CmdwinEnter * g:got_there = 'yes'
3176 augroup END
3177 # this will open and also close the cmdline window
3178 feedkeys('q:', 'xt')
3179 assert_equal('yes', g:got_there)
3180
3181 augroup CmdWin
3182 au!
3183 augroup END
3184 &rtp = save_rtp
3185 delete('rtp', 'rf')
3186enddef
3187
Bram Moolenaare3d46852020-08-29 13:39:17 +02003188def Test_invalid_sid()
3189 assert_fails('func <SNR>1234_func', 'E123:')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02003190
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02003191 if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
Bram Moolenaard2c61702020-09-06 15:58:36 +02003192 assert_equal([], readfile('Xdidit'))
Bram Moolenaare3d46852020-08-29 13:39:17 +02003193 endif
3194 delete('Xdidit')
3195enddef
3196
Bram Moolenaar9ec70262020-12-09 17:16:59 +01003197def Test_restoring_cpo()
3198 writefile(['vim9script', 'set nocp'], 'Xsourced')
3199 writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
3200 if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
3201 assert_equal(['done'], readfile('Xdone'))
3202 endif
3203 delete('Xsourced')
3204 delete('Xclose')
Bram Moolenaar090728a2020-12-20 15:43:31 +01003205 delete('Xdone')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003206
3207 writefile(['vim9script'], 'XanotherScript')
3208 set cpo=aABceFsMny>
3209 edit XanotherScript
3210 so %
3211 assert_equal('aABceFsMny>', &cpo)
3212 :1del
3213 w
3214 so %
3215 assert_equal('aABceFsMny>', &cpo)
3216
3217 delete('XanotherScript')
3218 set cpo&vim
Bram Moolenaar9ec70262020-12-09 17:16:59 +01003219enddef
3220
3221
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02003222def Test_unset_any_variable()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003223 var lines =<< trim END
3224 var name: any
3225 assert_equal(0, name)
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02003226 END
3227 CheckDefAndScriptSuccess(lines)
3228enddef
3229
Bram Moolenaar7e9210e2020-09-25 23:12:51 +02003230func Test_define_func_at_command_line()
Bram Moolenaar58dbef32020-09-25 22:13:05 +02003231 CheckRunVimInTerminal
3232
Bram Moolenaar7e9210e2020-09-25 23:12:51 +02003233 " call indirectly to avoid compilation error for missing functions
3234 call Run_Test_define_func_at_command_line()
3235endfunc
3236
3237def Run_Test_define_func_at_command_line()
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02003238 # run in a separate Vim instance to avoid the script context
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003239 var lines =<< trim END
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02003240 func CheckAndQuit()
3241 call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
3242 call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
3243 endfunc
3244 END
3245 writefile([''], 'Xdidcmd')
3246 writefile(lines, 'XcallFunc')
Bram Moolenaare0de1712020-12-02 17:36:54 +01003247 var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02003248 # define Afunc() on the command line
3249 term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
3250 term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01003251 WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02003252
3253 call StopVimInTerminal(buf)
3254 delete('XcallFunc')
3255 delete('Xdidcmd')
3256enddef
3257
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02003258def Test_script_var_scope()
3259 var lines =<< trim END
3260 vim9script
3261 if true
3262 if true
3263 var one = 'one'
3264 echo one
3265 endif
3266 echo one
3267 endif
3268 END
3269 CheckScriptFailure(lines, 'E121:', 7)
3270
3271 lines =<< trim END
3272 vim9script
3273 if true
3274 if false
3275 var one = 'one'
3276 echo one
3277 else
3278 var one = 'one'
3279 echo one
3280 endif
3281 echo one
3282 endif
3283 END
3284 CheckScriptFailure(lines, 'E121:', 10)
3285
3286 lines =<< trim END
3287 vim9script
3288 while true
3289 var one = 'one'
3290 echo one
3291 break
3292 endwhile
3293 echo one
3294 END
3295 CheckScriptFailure(lines, 'E121:', 7)
3296
3297 lines =<< trim END
3298 vim9script
3299 for i in range(1)
3300 var one = 'one'
3301 echo one
3302 endfor
3303 echo one
3304 END
3305 CheckScriptFailure(lines, 'E121:', 6)
Bram Moolenaar9becdf22020-10-10 21:33:48 +02003306
3307 lines =<< trim END
3308 vim9script
3309 {
3310 var one = 'one'
3311 assert_equal('one', one)
3312 }
3313 assert_false(exists('one'))
3314 assert_false(exists('s:one'))
3315 END
3316 CheckScriptSuccess(lines)
3317
3318 lines =<< trim END
3319 vim9script
3320 {
3321 var one = 'one'
3322 echo one
3323 }
3324 echo one
3325 END
3326 CheckScriptFailure(lines, 'E121:', 6)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02003327enddef
3328
Bram Moolenaar352134b2020-10-17 22:04:08 +02003329def Test_catch_exception_in_callback()
3330 var lines =<< trim END
3331 vim9script
3332 def Callback(...l: any)
3333 try
3334 var x: string
3335 var y: string
3336 # this error should be caught with CHECKLEN
3337 [x, y] = ['']
3338 catch
3339 g:caught = 'yes'
3340 endtry
3341 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01003342 popup_menu('popup', {callback: Callback})
Bram Moolenaar352134b2020-10-17 22:04:08 +02003343 feedkeys("\r", 'xt')
3344 END
3345 CheckScriptSuccess(lines)
3346
3347 unlet g:caught
3348enddef
3349
Bram Moolenaar631e8f92020-11-04 15:07:16 +01003350def Test_no_unknown_error_after_error()
3351 if !has('unix') || !has('job')
3352 throw 'Skipped: not unix of missing +job feature'
3353 endif
3354 var lines =<< trim END
3355 vim9script
3356 var source: list<number>
3357 def Out_cb(...l: any)
3358 eval [][0]
3359 enddef
3360 def Exit_cb(...l: any)
3361 sleep 1m
3362 source += l
3363 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01003364 var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
Bram Moolenaar6f17a3f2020-12-21 18:11:24 +01003365 while job_status(myjob) == 'run'
3366 sleep 10m
3367 endwhile
Bram Moolenaar206c2a62021-01-31 14:04:44 +01003368 # wait for Exit_cb() to be called
3369 sleep 100m
Bram Moolenaar631e8f92020-11-04 15:07:16 +01003370 END
3371 writefile(lines, 'Xdef')
3372 assert_fails('so Xdef', ['E684:', 'E1012:'])
3373 delete('Xdef')
3374enddef
3375
Bram Moolenaar4324d872020-12-01 20:12:24 +01003376def InvokeNormal()
3377 exe "norm! :m+1\r"
3378enddef
3379
3380def Test_invoke_normal_in_visual_mode()
3381 xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
3382 new
3383 setline(1, ['aaa', 'bbb'])
3384 feedkeys("V\<F3>", 'xt')
3385 assert_equal(['bbb', 'aaa'], getline(1, 2))
3386 xunmap <F3>
3387enddef
3388
Bram Moolenaarb5b94802020-12-13 17:50:20 +01003389def Test_white_space_after_command()
3390 var lines =<< trim END
3391 exit_cb: Func})
3392 END
3393 CheckDefAndScriptFailure(lines, 'E1144:', 1)
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003394
3395 lines =<< trim END
3396 e#
3397 END
3398 CheckDefAndScriptFailure(lines, 'E1144:', 1)
Bram Moolenaarb5b94802020-12-13 17:50:20 +01003399enddef
3400
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01003401def Test_script_var_gone_when_sourced_twice()
3402 var lines =<< trim END
3403 vim9script
3404 if exists('g:guard')
3405 finish
3406 endif
3407 g:guard = 1
3408 var name = 'thename'
3409 def g:GetName(): string
3410 return name
3411 enddef
3412 def g:SetName(arg: string)
3413 name = arg
3414 enddef
3415 END
3416 writefile(lines, 'XscriptTwice.vim')
3417 so XscriptTwice.vim
3418 assert_equal('thename', g:GetName())
3419 g:SetName('newname')
3420 assert_equal('newname', g:GetName())
3421 so XscriptTwice.vim
3422 assert_fails('call g:GetName()', 'E1149:')
3423 assert_fails('call g:SetName("x")', 'E1149:')
3424
3425 delfunc g:GetName
3426 delfunc g:SetName
3427 delete('XscriptTwice.vim')
3428 unlet g:guard
3429enddef
3430
3431def Test_import_gone_when_sourced_twice()
3432 var exportlines =<< trim END
3433 vim9script
3434 if exists('g:guard')
3435 finish
3436 endif
3437 g:guard = 1
3438 export var name = 'someName'
3439 END
3440 writefile(exportlines, 'XexportScript.vim')
3441
3442 var lines =<< trim END
3443 vim9script
3444 import name from './XexportScript.vim'
3445 def g:GetName(): string
3446 return name
3447 enddef
3448 END
3449 writefile(lines, 'XscriptImport.vim')
3450 so XscriptImport.vim
3451 assert_equal('someName', g:GetName())
3452
3453 so XexportScript.vim
3454 assert_fails('call g:GetName()', 'E1149:')
3455
3456 delfunc g:GetName
3457 delete('XexportScript.vim')
3458 delete('XscriptImport.vim')
3459 unlet g:guard
3460enddef
3461
Bram Moolenaar585fea72020-04-02 22:33:21 +02003462" Keep this last, it messes up highlighting.
3463def Test_substitute_cmd()
3464 new
3465 setline(1, 'something')
3466 :substitute(some(other(
3467 assert_equal('otherthing', getline(1))
3468 bwipe!
3469
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003470 # also when the context is Vim9 script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003471 var lines =<< trim END
Bram Moolenaar585fea72020-04-02 22:33:21 +02003472 vim9script
3473 new
3474 setline(1, 'something')
3475 :substitute(some(other(
3476 assert_equal('otherthing', getline(1))
3477 bwipe!
3478 END
3479 writefile(lines, 'Xvim9lines')
3480 source Xvim9lines
3481
3482 delete('Xvim9lines')
3483enddef
3484
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01003485" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker