blob: b6dcf36212c178104205b1373bd03eb8dfb46a98 [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 Moolenaar37294bd2021-03-10 13:40:08 +01008source screendump.vim
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01009
Bram Moolenaarb79ee0c2022-01-01 12:17:00 +000010def Test_vim9script_feature()
11 # example from the help, here the feature is always present
12 var lines =<< trim END
13 " old style comment
14 if !has('vim9script')
15 " legacy commands would go here
16 finish
17 endif
18 vim9script
19 # Vim9 script commands go here
20 g:didit = true
21 END
22 CheckScriptSuccess(lines)
23 assert_equal(true, g:didit)
24 unlet g:didit
25enddef
26
Bram Moolenaar5d72ce62020-08-20 23:04:06 +020027def Test_range_only()
28 new
29 setline(1, ['blah', 'Blah'])
30 :/Blah/
31 assert_equal(2, getcurpos()[1])
Bram Moolenaarc2af0af2020-08-23 21:06:02 +020032 bwipe!
33
34 # without range commands use current line
35 new
36 setline(1, ['one', 'two', 'three'])
37 :2
38 print
39 assert_equal('two', Screenline(&lines))
40 :3
41 list
42 assert_equal('three$', Screenline(&lines))
Bram Moolenaarb8554302021-02-15 21:30:30 +010043
44 # missing command does not print the line
45 var lines =<< trim END
46 vim9script
47 :1|
48 assert_equal('three$', Screenline(&lines))
49 :|
50 assert_equal('three$', Screenline(&lines))
51 END
52 CheckScriptSuccess(lines)
53
Bram Moolenaarc2af0af2020-08-23 21:06:02 +020054 bwipe!
Bram Moolenaar025cb1c2020-12-14 18:31:27 +010055
56 # won't generate anything
57 if false
58 :123
59 endif
Bram Moolenaar5d72ce62020-08-20 23:04:06 +020060enddef
61
Bram Moolenaara6e67e42020-05-15 23:36:40 +020062let g:alist = [7]
63let g:astring = 'text'
Bram Moolenaarf0b9f432020-07-17 23:03:17 +020064let g:anumber = 123
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010065
Bram Moolenaar4c17ad92020-04-27 22:47:51 +020066def Test_delfunction()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +020067 # Check function is defined in script namespace
Bram Moolenaar4c17ad92020-04-27 22:47:51 +020068 CheckScriptSuccess([
69 'vim9script',
70 'func CheckMe()',
71 ' return 123',
72 'endfunc',
73 'assert_equal(123, s:CheckMe())',
74 ])
75
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +020076 # Check function in script namespace cannot be deleted
Bram Moolenaar4c17ad92020-04-27 22:47:51 +020077 CheckScriptFailure([
78 'vim9script',
79 'func DeleteMe1()',
80 'endfunc',
81 'delfunction DeleteMe1',
82 ], 'E1084:')
83 CheckScriptFailure([
84 'vim9script',
85 'func DeleteMe2()',
86 'endfunc',
87 'def DoThat()',
88 ' delfunction DeleteMe2',
89 'enddef',
90 'DoThat()',
91 ], 'E1084:')
92 CheckScriptFailure([
93 'vim9script',
94 'def DeleteMe3()',
95 'enddef',
96 'delfunction DeleteMe3',
97 ], 'E1084:')
98 CheckScriptFailure([
99 'vim9script',
100 'def DeleteMe4()',
101 'enddef',
102 'def DoThat()',
103 ' delfunction DeleteMe4',
104 'enddef',
105 'DoThat()',
106 ], 'E1084:')
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200107
108 # Check that global :def function can be replaced and deleted
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200109 var lines =<< trim END
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200110 vim9script
111 def g:Global(): string
112 return "yes"
113 enddef
114 assert_equal("yes", g:Global())
115 def! g:Global(): string
116 return "no"
117 enddef
118 assert_equal("no", g:Global())
119 delfunc g:Global
120 assert_false(exists('*g:Global'))
121 END
122 CheckScriptSuccess(lines)
123
124 # Check that global function can be replaced by a :def function and deleted
125 lines =<< trim END
126 vim9script
127 func g:Global()
128 return "yes"
129 endfunc
130 assert_equal("yes", g:Global())
131 def! g:Global(): string
132 return "no"
133 enddef
134 assert_equal("no", g:Global())
135 delfunc g:Global
136 assert_false(exists('*g:Global'))
137 END
138 CheckScriptSuccess(lines)
139
140 # Check that global :def function can be replaced by a function and deleted
141 lines =<< trim END
142 vim9script
143 def g:Global(): string
144 return "yes"
145 enddef
146 assert_equal("yes", g:Global())
147 func! g:Global()
148 return "no"
149 endfunc
150 assert_equal("no", g:Global())
151 delfunc g:Global
152 assert_false(exists('*g:Global'))
153 END
154 CheckScriptSuccess(lines)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200155enddef
156
Bram Moolenaar08052222020-09-14 17:04:31 +0200157def Test_wrong_type()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200158 CheckDefFailure(['var name: list<nothing>'], 'E1010:')
159 CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
160 CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
161 CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100162
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200163 CheckDefFailure(['var name: dict<number'], 'E1009:')
164 CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100165
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200166 CheckDefFailure(['var name: ally'], 'E1010:')
167 CheckDefFailure(['var name: bram'], 'E1010:')
168 CheckDefFailure(['var name: cathy'], 'E1010:')
169 CheckDefFailure(['var name: dom'], 'E1010:')
170 CheckDefFailure(['var name: freddy'], 'E1010:')
171 CheckDefFailure(['var name: john'], 'E1010:')
172 CheckDefFailure(['var name: larry'], 'E1010:')
173 CheckDefFailure(['var name: ned'], 'E1010:')
174 CheckDefFailure(['var name: pam'], 'E1010:')
175 CheckDefFailure(['var name: sam'], 'E1010:')
176 CheckDefFailure(['var name: vim'], 'E1010:')
Bram Moolenaara0a9f432020-04-28 21:29:34 +0200177
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200178 CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
179 CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
Bram Moolenaar08052222020-09-14 17:04:31 +0200180enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100181
Bram Moolenaar10c65862020-10-08 21:16:42 +0200182def Test_script_wrong_type()
183 var lines =<< trim END
184 vim9script
185 var s:dict: dict<string>
186 s:dict['a'] = ['x']
187 END
188 CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3)
189enddef
190
Bram Moolenaar08052222020-09-14 17:04:31 +0200191def Test_const()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200192 CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
193 CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
194 CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200195 CheckDefFailure(['final two'], 'E1125:')
196 CheckDefFailure(['final &option'], 'E996:')
Bram Moolenaardbeecb22020-09-14 18:15:09 +0200197
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200198 var lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200199 final list = [1, 2, 3]
Bram Moolenaardbeecb22020-09-14 18:15:09 +0200200 list[0] = 4
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200201 list->assert_equal([4, 2, 3])
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200202 const other = [5, 6, 7]
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200203 other->assert_equal([5, 6, 7])
Bram Moolenaar71abe482020-09-14 22:28:30 +0200204
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200205 var varlist = [7, 8]
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200206 const constlist = [1, varlist, 3]
Bram Moolenaar71abe482020-09-14 22:28:30 +0200207 varlist[0] = 77
Bram Moolenaar23e2e112021-08-03 21:16:18 +0200208 constlist[1][1] = 88
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200209 var cl = constlist[1]
Bram Moolenaar71abe482020-09-14 22:28:30 +0200210 cl[1] = 88
211 constlist->assert_equal([1, [77, 88], 3])
212
Bram Moolenaare0de1712020-12-02 17:36:54 +0100213 var vardict = {five: 5, six: 6}
214 const constdict = {one: 1, two: vardict, three: 3}
Bram Moolenaar71abe482020-09-14 22:28:30 +0200215 vardict['five'] = 55
Bram Moolenaar23e2e112021-08-03 21:16:18 +0200216 constdict['two']['six'] = 66
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200217 var cd = constdict['two']
Bram Moolenaar71abe482020-09-14 22:28:30 +0200218 cd['six'] = 66
Bram Moolenaare0de1712020-12-02 17:36:54 +0100219 constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3})
Bram Moolenaardbeecb22020-09-14 18:15:09 +0200220 END
221 CheckDefAndScriptSuccess(lines)
Bram Moolenaar08052222020-09-14 17:04:31 +0200222enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100223
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200224def Test_const_bang()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200225 var lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200226 const var = 234
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200227 var = 99
228 END
229 CheckDefExecFailure(lines, 'E1018:', 2)
230 CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
231
232 lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200233 const ll = [2, 3, 4]
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200234 ll[0] = 99
235 END
236 CheckDefExecFailure(lines, 'E1119:', 2)
237 CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
238
239 lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200240 const ll = [2, 3, 4]
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200241 ll[3] = 99
242 END
243 CheckDefExecFailure(lines, 'E1118:', 2)
244 CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
245
246 lines =<< trim END
Bram Moolenaare0de1712020-12-02 17:36:54 +0100247 const dd = {one: 1, two: 2}
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200248 dd["one"] = 99
249 END
250 CheckDefExecFailure(lines, 'E1121:', 2)
251 CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
252
253 lines =<< trim END
Bram Moolenaare0de1712020-12-02 17:36:54 +0100254 const dd = {one: 1, two: 2}
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200255 dd["three"] = 99
256 END
257 CheckDefExecFailure(lines, 'E1120:')
258 CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
259enddef
260
Bram Moolenaardf069ee2020-06-22 23:02:51 +0200261def Test_range_no_colon()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200262 CheckDefFailure(['%s/a/b/'], 'E1050:')
263 CheckDefFailure(['+ s/a/b/'], 'E1050:')
264 CheckDefFailure(['- s/a/b/'], 'E1050:')
265 CheckDefFailure(['. s/a/b/'], 'E1050:')
Bram Moolenaardf069ee2020-06-22 23:02:51 +0200266enddef
267
268
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100269def Test_block()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200270 var outer = 1
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100271 {
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200272 var inner = 2
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100273 assert_equal(1, outer)
274 assert_equal(2, inner)
275 }
276 assert_equal(1, outer)
Bram Moolenaar3f1e9f02021-02-27 22:36:43 +0100277
278 {|echo 'yes'|}
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100279enddef
280
Bram Moolenaar08052222020-09-14 17:04:31 +0200281def Test_block_failure()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200282 CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
Bram Moolenaar08052222020-09-14 17:04:31 +0200283 CheckDefFailure(['}'], 'E1025:')
284 CheckDefFailure(['{', 'echo 1'], 'E1026:')
285enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100286
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200287def Test_block_local_vars()
288 var lines =<< trim END
289 vim9script
Bram Moolenaared234f22020-10-15 20:42:20 +0200290 v:testing = 1
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200291 if true
Bram Moolenaared234f22020-10-15 20:42:20 +0200292 var text = ['hello']
293 def SayHello(): list<string>
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200294 return text
295 enddef
296 def SetText(v: string)
Bram Moolenaared234f22020-10-15 20:42:20 +0200297 text = [v]
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200298 enddef
299 endif
300
301 if true
Bram Moolenaared234f22020-10-15 20:42:20 +0200302 var text = ['again']
303 def SayAgain(): list<string>
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200304 return text
305 enddef
306 endif
Bram Moolenaared234f22020-10-15 20:42:20 +0200307
308 # test that the "text" variables are not cleaned up
309 test_garbagecollect_now()
310
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200311 defcompile
312
Bram Moolenaared234f22020-10-15 20:42:20 +0200313 assert_equal(['hello'], SayHello())
314 assert_equal(['again'], SayAgain())
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200315
316 SetText('foobar')
Bram Moolenaared234f22020-10-15 20:42:20 +0200317 assert_equal(['foobar'], SayHello())
318
319 call writefile(['ok'], 'Xdidit')
320 qall!
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200321 END
Bram Moolenaared234f22020-10-15 20:42:20 +0200322
323 # need to execute this with a separate Vim instance to avoid the current
324 # context gets garbage collected.
325 writefile(lines, 'Xscript')
326 RunVim([], [], '-S Xscript')
327 assert_equal(['ok'], readfile('Xdidit'))
328
329 delete('Xscript')
330 delete('Xdidit')
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200331enddef
332
Bram Moolenaar39ca4122020-10-20 14:25:07 +0200333def Test_block_local_vars_with_func()
334 var lines =<< trim END
335 vim9script
336 if true
337 var foo = 'foo'
338 if true
339 var bar = 'bar'
340 def Func(): list<string>
341 return [foo, bar]
342 enddef
343 endif
344 endif
345 # function is compiled here, after blocks have finished, can still access
346 # "foo" and "bar"
347 assert_equal(['foo', 'bar'], Func())
348 END
349 CheckScriptSuccess(lines)
350enddef
351
Bram Moolenaare4db17f2021-08-01 21:19:43 +0200352" legacy func for command that's defined later
353func InvokeSomeCommand()
354 SomeCommand
355endfunc
356
357def Test_autocommand_block()
358 com SomeCommand {
359 g:someVar = 'some'
360 }
361 InvokeSomeCommand()
362 assert_equal('some', g:someVar)
363
364 delcommand SomeCommand
365 unlet g:someVar
366enddef
367
368def Test_command_block()
369 au BufNew *.xml {
370 g:otherVar = 'other'
371 }
372 split other.xml
373 assert_equal('other', g:otherVar)
374
375 bwipe!
376 au! BufNew *.xml
377 unlet g:otherVar
378enddef
379
Bram Moolenaard032f342020-07-18 18:13:02 +0200380func g:NoSuchFunc()
381 echo 'none'
382endfunc
383
Bram Moolenaar9e1d9e32021-01-11 20:17:34 +0100384def Test_try_catch_throw()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200385 var l = []
Bram Moolenaar7a092242020-04-16 22:10:49 +0200386 try # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100387 add(l, '1')
388 throw 'wrong'
389 add(l, '2')
Bram Moolenaar7a092242020-04-16 22:10:49 +0200390 catch # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100391 add(l, v:exception)
Bram Moolenaar7a092242020-04-16 22:10:49 +0200392 finally # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100393 add(l, '3')
Bram Moolenaar7a092242020-04-16 22:10:49 +0200394 endtry # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100395 assert_equal(['1', 'wrong', '3'], l)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200396
Bram Moolenaare8593122020-07-18 15:17:02 +0200397 l = []
398 try
399 try
400 add(l, '1')
401 throw 'wrong'
402 add(l, '2')
403 catch /right/
404 add(l, v:exception)
405 endtry
406 catch /wrong/
407 add(l, 'caught')
Bram Moolenaar373863e2020-09-26 17:20:53 +0200408 fina
Bram Moolenaare8593122020-07-18 15:17:02 +0200409 add(l, 'finally')
410 endtry
411 assert_equal(['1', 'caught', 'finally'], l)
412
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200413 var n: number
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200414 try
415 n = l[3]
416 catch /E684:/
417 n = 99
418 endtry
419 assert_equal(99, n)
420
Bram Moolenaar69f70502021-01-01 16:10:46 +0100421 var done = 'no'
422 if 0
423 try | catch | endtry
424 else
425 done = 'yes'
426 endif
427 assert_equal('yes', done)
428
429 done = 'no'
430 if 1
431 done = 'yes'
432 else
433 try | catch | endtry
434 done = 'never'
435 endif
436 assert_equal('yes', done)
437
438 if 1
439 else
440 try | catch /pat/ | endtry
441 try | catch /pat/
442 endtry
443 try
444 catch /pat/ | endtry
445 try
446 catch /pat/
447 endtry
448 endif
449
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200450 try
Bram Moolenaarcc673e72020-08-16 17:33:35 +0200451 # string slice returns a string, not a number
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200452 n = g:astring[3]
Bram Moolenaar5e654232020-09-16 15:22:00 +0200453 catch /E1012:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200454 n = 77
455 endtry
456 assert_equal(77, n)
457
458 try
459 n = l[g:astring]
Bram Moolenaar5e654232020-09-16 15:22:00 +0200460 catch /E1012:/
Bram Moolenaar56acb092020-08-16 14:48:19 +0200461 n = 88
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200462 endtry
Bram Moolenaar56acb092020-08-16 14:48:19 +0200463 assert_equal(88, n)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200464
465 try
466 n = s:does_not_exist
467 catch /E121:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200468 n = 111
469 endtry
470 assert_equal(111, n)
471
472 try
473 n = g:does_not_exist
474 catch /E121:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200475 n = 121
476 endtry
477 assert_equal(121, n)
478
Bram Moolenaare0de1712020-12-02 17:36:54 +0100479 var d = {one: 1}
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200480 try
481 n = d[g:astring]
482 catch /E716:/
483 n = 222
484 endtry
485 assert_equal(222, n)
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200486
487 try
488 n = -g:astring
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200489 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200490 n = 233
491 endtry
492 assert_equal(233, n)
493
494 try
495 n = +g:astring
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200496 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200497 n = 244
498 endtry
499 assert_equal(244, n)
500
501 try
502 n = +g:alist
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200503 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200504 n = 255
505 endtry
506 assert_equal(255, n)
507
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200508 var nd: dict<any>
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200509 try
Bram Moolenaar2e5910b2021-02-03 17:41:24 +0100510 nd = {[g:alist]: 1}
511 catch /E1105:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200512 n = 266
513 endtry
514 assert_equal(266, n)
515
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +0000516 l = [1, 2, 3]
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200517 try
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +0000518 [n] = l
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200519 catch /E1093:/
520 n = 277
521 endtry
522 assert_equal(277, n)
523
Bram Moolenaare8593122020-07-18 15:17:02 +0200524 try
525 &ts = g:astring
Bram Moolenaar5e654232020-09-16 15:22:00 +0200526 catch /E1012:/
Bram Moolenaare8593122020-07-18 15:17:02 +0200527 n = 288
528 endtry
529 assert_equal(288, n)
530
531 try
532 &backspace = 'asdf'
533 catch /E474:/
534 n = 299
535 endtry
536 assert_equal(299, n)
537
538 l = [1]
539 try
540 l[3] = 3
541 catch /E684:/
542 n = 300
543 endtry
544 assert_equal(300, n)
545
546 try
Bram Moolenaare8593122020-07-18 15:17:02 +0200547 unlet g:does_not_exist
548 catch /E108:/
549 n = 322
550 endtry
551 assert_equal(322, n)
552
553 try
Bram Moolenaar2bede172020-11-19 18:53:18 +0100554 d = {text: 1, [g:astring]: 2}
Bram Moolenaare8593122020-07-18 15:17:02 +0200555 catch /E721:/
556 n = 333
557 endtry
558 assert_equal(333, n)
559
560 try
561 l = DeletedFunc()
562 catch /E933:/
563 n = 344
564 endtry
565 assert_equal(344, n)
Bram Moolenaard032f342020-07-18 18:13:02 +0200566
567 try
Yegappan Lakshmanana764e732021-07-25 15:57:32 +0200568 echo range(1, 2, 0)
569 catch /E726:/
Bram Moolenaard032f342020-07-18 18:13:02 +0200570 n = 355
571 endtry
572 assert_equal(355, n)
573
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200574 var P = function('g:NoSuchFunc')
Bram Moolenaard032f342020-07-18 18:13:02 +0200575 delfunc g:NoSuchFunc
576 try
577 echo P()
578 catch /E117:/
579 n = 366
580 endtry
581 assert_equal(366, n)
582
583 try
584 echo g:NoSuchFunc()
585 catch /E117:/
586 n = 377
587 endtry
588 assert_equal(377, n)
589
590 try
591 echo g:alist + 4
592 catch /E745:/
593 n = 388
594 endtry
595 assert_equal(388, n)
596
597 try
598 echo 4 + g:alist
599 catch /E745:/
600 n = 399
601 endtry
602 assert_equal(399, n)
603
604 try
605 echo g:alist.member
606 catch /E715:/
607 n = 400
608 endtry
609 assert_equal(400, n)
610
611 try
612 echo d.member
613 catch /E716:/
614 n = 411
615 endtry
616 assert_equal(411, n)
Bram Moolenaard9d77892021-02-12 21:32:47 +0100617
618 var counter = 0
619 for i in range(4)
620 try
621 eval [][0]
622 catch
623 endtry
624 counter += 1
625 endfor
626 assert_equal(4, counter)
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100627
Bram Moolenaar9fa5dab2021-07-20 19:18:44 +0200628 # no requirement for spaces before |
629 try|echo 0|catch|endtry
630
Bram Moolenaar003312b2021-12-20 10:55:35 +0000631 # return in try with finally
632 def ReturnInTry(): number
633 var ret = 4
634 try
635 return ret
636 catch /this/
637 return -1
638 catch /that/
639 return -1
640 finally
641 # changing ret has no effect
642 ret = 7
643 endtry
644 return -2
645 enddef
646 assert_equal(4, ReturnInTry())
647
648 # return in catch with finally
649 def ReturnInCatch(): number
650 var ret = 5
651 try
652 throw 'getout'
653 return -1
654 catch /getout/
655 # ret is evaluated here
656 return ret
657 finally
658 # changing ret later has no effect
659 ret = -3
660 endtry
661 return -2
662 enddef
663 assert_equal(5, ReturnInCatch())
664
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100665 # return in finally after empty catch
666 def ReturnInFinally(): number
667 try
668 finally
Bram Moolenaar003312b2021-12-20 10:55:35 +0000669 return 6
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100670 endtry
Bram Moolenaar003312b2021-12-20 10:55:35 +0000671 return -1
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100672 enddef
Bram Moolenaar003312b2021-12-20 10:55:35 +0000673 assert_equal(6, ReturnInFinally())
Bram Moolenaar8ac681a2021-06-15 20:06:34 +0200674
675 var lines =<< trim END
676 vim9script
677 try
678 acos('0.5')
679 ->setline(1)
680 catch
681 g:caught = v:exception
682 endtry
683 END
684 CheckScriptSuccess(lines)
Yegappan Lakshmanan4490ec42021-07-27 22:00:44 +0200685 assert_match('E1219: Float or Number required for argument 1', g:caught)
Bram Moolenaar8ac681a2021-06-15 20:06:34 +0200686 unlet g:caught
Bram Moolenaar41978282021-07-04 14:47:30 +0200687
688 # missing catch and/or finally
689 lines =<< trim END
690 vim9script
691 try
692 echo 'something'
693 endtry
694 END
695 CheckScriptFailure(lines, 'E1032:')
rbtnn84934992021-08-07 13:26:53 +0200696
697 # skipping try-finally-endtry when try-finally-endtry is used in another block
698 lines =<< trim END
699 if v:true
700 try
701 finally
702 endtry
703 else
704 try
705 finally
706 endtry
707 endif
708 END
709 CheckDefAndScriptSuccess(lines)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100710enddef
711
Bram Moolenaar3f987b52021-06-30 12:02:24 +0200712def Test_try_in_catch()
713 var lines =<< trim END
714 vim9script
715 var seq = []
716 def DoIt()
717 try
718 seq->add('throw 1')
719 eval [][0]
720 seq->add('notreached')
721 catch
722 seq->add('catch')
723 try
724 seq->add('throw 2')
725 eval [][0]
726 seq->add('notreached')
727 catch /nothing/
728 seq->add('notreached')
729 endtry
730 seq->add('done')
731 endtry
732 enddef
733 DoIt()
734 assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq)
735 END
736enddef
737
Bram Moolenaard3d8fee2021-06-30 19:54:43 +0200738def Test_error_in_catch()
739 var lines =<< trim END
740 try
741 eval [][0]
742 catch /E684:/
743 eval [][0]
744 endtry
745 END
746 CheckDefExecFailure(lines, 'E684:', 4)
747enddef
748
Bram Moolenaar2e34c342021-03-14 12:13:33 +0100749" :while at the very start of a function that :continue jumps to
750def TryContinueFunc()
751 while g:Count < 2
752 g:sequence ..= 't'
753 try
754 echoerr 'Test'
755 catch
756 g:Count += 1
757 g:sequence ..= 'c'
758 continue
759 endtry
760 g:sequence ..= 'e'
761 g:Count += 1
762 endwhile
763enddef
764
765def Test_continue_in_try_in_while()
766 g:Count = 0
767 g:sequence = ''
768 TryContinueFunc()
769 assert_equal('tctc', g:sequence)
770 unlet g:Count
771 unlet g:sequence
772enddef
773
Bram Moolenaar9cb577a2021-02-22 22:45:10 +0100774def Test_nocatch_return_in_try()
775 # return in try block returns normally
776 def ReturnInTry(): string
777 try
778 return '"some message"'
779 catch
780 endtry
781 return 'not reached'
782 enddef
783 exe 'echoerr ' .. ReturnInTry()
784enddef
785
Bram Moolenaar1430cee2021-01-17 19:20:32 +0100786def Test_cnext_works_in_catch()
787 var lines =<< trim END
788 vim9script
Bram Moolenaarc3235272021-07-10 19:42:03 +0200789 au BufEnter * eval 1 + 2
Bram Moolenaar1430cee2021-01-17 19:20:32 +0100790 writefile(['text'], 'Xfile1')
791 writefile(['text'], 'Xfile2')
792 var items = [
793 {lnum: 1, filename: 'Xfile1', valid: true},
794 {lnum: 1, filename: 'Xfile2', valid: true}
795 ]
796 setqflist([], ' ', {items: items})
797 cwindow
798
799 def CnextOrCfirst()
800 # if cnext fails, cfirst is used
801 try
802 cnext
803 catch
804 cfirst
805 endtry
806 enddef
807
808 CnextOrCfirst()
809 CnextOrCfirst()
810 writefile([getqflist({idx: 0}).idx], 'Xresult')
811 qall
812 END
813 writefile(lines, 'XCatchCnext')
814 RunVim([], [], '--clean -S XCatchCnext')
815 assert_equal(['1'], readfile('Xresult'))
816
817 delete('Xfile1')
818 delete('Xfile2')
819 delete('XCatchCnext')
820 delete('Xresult')
821enddef
822
Bram Moolenaar9e1d9e32021-01-11 20:17:34 +0100823def Test_throw_skipped()
824 if 0
825 throw dontgethere
826 endif
827enddef
828
Bram Moolenaar8f81b222021-01-14 21:47:06 +0100829def Test_nocatch_throw_silenced()
830 var lines =<< trim END
831 vim9script
832 def Func()
833 throw 'error'
834 enddef
835 silent! Func()
836 END
837 writefile(lines, 'XthrowSilenced')
838 source XthrowSilenced
839 delete('XthrowSilenced')
840enddef
841
Bram Moolenaare8593122020-07-18 15:17:02 +0200842def DeletedFunc(): list<any>
843 return ['delete me']
844enddef
845defcompile
846delfunc DeletedFunc
847
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100848def ThrowFromDef()
Bram Moolenaara72cfb82020-04-23 17:07:30 +0200849 throw "getout" # comment
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100850enddef
851
852func CatchInFunc()
853 try
854 call ThrowFromDef()
855 catch
856 let g:thrown_func = v:exception
857 endtry
858endfunc
859
860def CatchInDef()
861 try
862 ThrowFromDef()
863 catch
864 g:thrown_def = v:exception
865 endtry
866enddef
867
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100868def ReturnFinally(): string
869 try
870 return 'intry'
Bram Moolenaar373863e2020-09-26 17:20:53 +0200871 finall
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100872 g:in_finally = 'finally'
873 endtry
874 return 'end'
875enddef
876
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100877def Test_try_catch_nested()
878 CatchInFunc()
879 assert_equal('getout', g:thrown_func)
880
881 CatchInDef()
882 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100883
884 assert_equal('intry', ReturnFinally())
885 assert_equal('finally', g:in_finally)
Bram Moolenaard3d8fee2021-06-30 19:54:43 +0200886
887 var l = []
888 try
889 l->add('1')
890 throw 'bad'
891 l->add('x')
892 catch /bad/
893 l->add('2')
894 try
895 l->add('3')
896 throw 'one'
897 l->add('x')
898 catch /one/
899 l->add('4')
900 try
901 l->add('5')
902 throw 'more'
903 l->add('x')
904 catch /more/
905 l->add('6')
906 endtry
907 endtry
908 endtry
909 assert_equal(['1', '2', '3', '4', '5', '6'], l)
Bram Moolenaar834193a2021-06-30 20:39:15 +0200910
911 l = []
912 try
913 try
914 l->add('1')
915 throw 'foo'
916 l->add('x')
917 catch
918 l->add('2')
919 throw 'bar'
920 l->add('x')
921 finally
922 l->add('3')
923 endtry
924 l->add('x')
925 catch /bar/
926 l->add('4')
927 endtry
928 assert_equal(['1', '2', '3', '4'], l)
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100929enddef
930
Bram Moolenaar9939f572020-09-16 22:29:52 +0200931def TryOne(): number
932 try
933 return 0
934 catch
935 endtry
936 return 0
937enddef
938
939def TryTwo(n: number): string
940 try
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200941 var x = {}
Bram Moolenaar9939f572020-09-16 22:29:52 +0200942 catch
943 endtry
944 return 'text'
945enddef
946
947def Test_try_catch_twice()
948 assert_equal('text', TryOne()->TryTwo())
949enddef
950
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100951def Test_try_catch_match()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200952 var seq = 'a'
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100953 try
954 throw 'something'
955 catch /nothing/
956 seq ..= 'x'
957 catch /some/
958 seq ..= 'b'
959 catch /asdf/
960 seq ..= 'x'
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200961 catch ?a\?sdf?
962 seq ..= 'y'
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100963 finally
964 seq ..= 'c'
965 endtry
966 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100967enddef
968
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200969def Test_try_catch_fails()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200970 CheckDefFailure(['catch'], 'E603:')
971 CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
972 CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
973 CheckDefFailure(['finally'], 'E606:')
974 CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
975 CheckDefFailure(['endtry'], 'E602:')
976 CheckDefFailure(['while 1', 'endtry'], 'E170:')
977 CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
Bram Moolenaar13106602020-10-04 16:06:05 +0200978 CheckDefFailure(['if 1', 'endtry'], 'E171:')
Bram Moolenaard2c61702020-09-06 15:58:36 +0200979 CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200980
Bram Moolenaare4984292020-12-13 14:19:25 +0100981 CheckDefFailure(['throw'], 'E1143:')
Bram Moolenaard2c61702020-09-06 15:58:36 +0200982 CheckDefFailure(['throw xxx'], 'E1001:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200983enddef
984
Bram Moolenaar7c5b3c0362021-02-14 22:40:57 +0100985def Try_catch_skipped()
986 var l = []
987 try
988 finally
989 endtry
990
991 if 1
992 else
993 try
994 endtry
995 endif
996enddef
997
998" The skipped try/endtry was updating the wrong instruction.
999def Test_try_catch_skipped()
1000 var instr = execute('disassemble Try_catch_skipped')
1001 assert_match("NEWLIST size 0\n", instr)
1002enddef
1003
1004
1005
Bram Moolenaar006ad482020-06-30 20:55:15 +02001006def Test_throw_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001007 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001008 var lines =<< trim END
Bram Moolenaar006ad482020-06-30 20:55:15 +02001009 vim9script
1010 try
1011 throw 'one'
1012 .. 'two'
1013 catch
1014 assert_equal('onetwo', v:exception)
1015 endtry
1016 END
1017 CheckScriptSuccess(lines)
Bram Moolenaar1e021e62020-10-16 20:25:23 +02001018
1019 lines =<< trim END
1020 vim9script
Bram Moolenaar352134b2020-10-17 22:04:08 +02001021 @r = ''
Bram Moolenaar1e021e62020-10-16 20:25:23 +02001022 def Func()
1023 throw @r
1024 enddef
1025 var result = ''
1026 try
1027 Func()
1028 catch /E1129:/
1029 result = 'caught'
1030 endtry
1031 assert_equal('caught', result)
1032 END
1033 CheckScriptSuccess(lines)
Bram Moolenaar006ad482020-06-30 20:55:15 +02001034enddef
1035
Bram Moolenaared677f52020-08-12 16:38:10 +02001036def Test_error_in_nested_function()
Bram Moolenaar03dfde22021-02-14 13:17:22 +01001037 # an error in a nested :function aborts executing in the calling :def function
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001038 var lines =<< trim END
Bram Moolenaared677f52020-08-12 16:38:10 +02001039 vim9script
1040 def Func()
1041 Error()
1042 g:test_var = 1
1043 enddef
1044 func Error() abort
1045 eval [][0]
1046 endfunc
1047 Func()
1048 END
1049 g:test_var = 0
1050 CheckScriptFailure(lines, 'E684:')
1051 assert_equal(0, g:test_var)
1052enddef
1053
Bram Moolenaar227c58a2021-04-28 20:40:44 +02001054def Test_abort_after_error()
1055 var lines =<< trim END
1056 vim9script
1057 while true
1058 echo notfound
1059 endwhile
1060 g:gotthere = true
1061 END
1062 g:gotthere = false
1063 CheckScriptFailure(lines, 'E121:')
1064 assert_false(g:gotthere)
1065 unlet g:gotthere
1066enddef
1067
Bram Moolenaar37c83712020-06-30 21:18:36 +02001068def Test_cexpr_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001069 # only checks line continuation
Bram Moolenaar37c83712020-06-30 21:18:36 +02001070 set errorformat=File\ %f\ line\ %l
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001071 var lines =<< trim END
Bram Moolenaar37c83712020-06-30 21:18:36 +02001072 vim9script
1073 cexpr 'File'
1074 .. ' someFile' ..
1075 ' line 19'
1076 assert_equal(19, getqflist()[0].lnum)
1077 END
1078 CheckScriptSuccess(lines)
1079 set errorformat&
1080enddef
1081
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001082def Test_statusline_syntax()
1083 # legacy syntax is used for 'statusline'
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001084 var lines =<< trim END
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001085 vim9script
1086 func g:Status()
1087 return '%{"x" is# "x"}'
1088 endfunc
1089 set laststatus=2 statusline=%!Status()
1090 redrawstatus
1091 set laststatus statusline=
1092 END
1093 CheckScriptSuccess(lines)
1094enddef
1095
Bram Moolenaarb2097502020-07-19 17:17:02 +02001096def Test_list_vimscript()
1097 # checks line continuation and comments
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001098 var lines =<< trim END
Bram Moolenaarb2097502020-07-19 17:17:02 +02001099 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001100 var mylist = [
Bram Moolenaarb2097502020-07-19 17:17:02 +02001101 'one',
1102 # comment
1103 'two', # empty line follows
1104
1105 'three',
1106 ]
1107 assert_equal(['one', 'two', 'three'], mylist)
1108 END
1109 CheckScriptSuccess(lines)
Bram Moolenaar66250c92020-08-20 15:02:42 +02001110
1111 # check all lines from heredoc are kept
1112 lines =<< trim END
1113 # comment 1
1114 two
1115 # comment 3
1116
1117 five
1118 # comment 6
1119 END
1120 assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
Bram Moolenaar4bce26b2021-01-22 22:06:56 +01001121
1122 lines =<< trim END
1123 [{
1124 a: 0}]->string()->assert_equal("[{'a': 0}]")
1125 END
1126 CheckDefAndScriptSuccess(lines)
Bram Moolenaarb2097502020-07-19 17:17:02 +02001127enddef
1128
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001129if has('channel')
1130 let someJob = test_null_job()
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001131
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001132 def FuncWithError()
1133 echomsg g:someJob
1134 enddef
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001135
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001136 func Test_convert_emsg_to_exception()
1137 try
1138 call FuncWithError()
1139 catch
1140 call assert_match('Vim:E908:', v:exception)
1141 endtry
1142 endfunc
1143endif
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001144
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001145let s:export_script_lines =<< trim END
1146 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001147 var name: string = 'bob'
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001148 def Concat(arg: string): string
1149 return name .. arg
1150 enddef
Bram Moolenaar227a69d2020-05-15 18:17:28 +02001151 g:result = Concat('bie')
1152 g:localname = name
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001153
1154 export const CONST = 1234
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001155 export var exported = 9876
1156 export var exp_name = 'John'
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001157 export def Exported(): string
1158 return 'Exported'
1159 enddef
Bram Moolenaar24e93162021-07-18 20:40:33 +02001160 export def ExportedValue(): number
1161 return exported
1162 enddef
1163 export def ExportedInc()
1164 exported += 5
1165 enddef
Bram Moolenaar0f2a5cc2021-02-27 22:33:21 +01001166 export final theList = [1]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001167END
1168
Bram Moolenaarb3ca9822020-08-09 14:43:58 +02001169def Undo_export_script_lines()
1170 unlet g:result
1171 unlet g:localname
1172enddef
1173
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001174def Test_vim9_import_export()
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001175 writefile(s:export_script_lines, 'Xexport.vim')
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001176 var import_script_lines =<< trim END
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001177 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001178 var dir = './'
1179 var ext = ".vim"
1180 import dir .. 'Xexport' .. ext as expo
Bram Moolenaar24e93162021-07-18 20:40:33 +02001181
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001182 g:exported1 = expo.exported
1183 expo.exported += 3
1184 g:exported2 = expo.exported
1185 g:exported3 = expo.ExportedValue()
Bram Moolenaar24e93162021-07-18 20:40:33 +02001186
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001187 expo.ExportedInc()
1188 g:exported_i1 = expo.exported
1189 g:exported_i2 = expo.ExportedValue()
Bram Moolenaar24e93162021-07-18 20:40:33 +02001190
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001191 expo.exported = 11
1192 g:exported_s1 = expo.exported
1193 g:exported_s2 = expo.ExportedValue()
1194
1195 g:imported_func = expo.Exported()
Bram Moolenaar6e587dc2020-02-06 13:15:52 +01001196
Bram Moolenaar40f4f7a2020-07-23 22:41:43 +02001197 def GetExported(): string
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001198 var local_dict = {ref: expo.Exported}
Bram Moolenaar40f4f7a2020-07-23 22:41:43 +02001199 return local_dict.ref()
1200 enddef
1201 g:funcref_result = GetExported()
1202
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001203 g:imported_name = expo.exp_name
1204 expo.exp_name ..= ' Doe'
1205 g:imported_name_appended = expo.exp_name
1206 g:exported_later = expo.exported
Bram Moolenaar0f2a5cc2021-02-27 22:33:21 +01001207
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001208 expo.theList->add(2)
1209 assert_equal([1, 2], expo.theList)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001210 END
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001211 writefile(import_script_lines, 'Ximport.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001212 source Ximport.vim
1213
1214 assert_equal('bobbie', g:result)
1215 assert_equal('bob', g:localname)
Bram Moolenaar24e93162021-07-18 20:40:33 +02001216 assert_equal(9876, g:exported1)
1217 assert_equal(9879, g:exported2)
1218 assert_equal(9879, g:exported3)
1219
1220 assert_equal(9884, g:exported_i1)
1221 assert_equal(9884, g:exported_i2)
1222
1223 assert_equal(11, g:exported_s1)
1224 assert_equal(11, g:exported_s2)
1225 assert_equal(11, g:exported_later)
1226
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001227 assert_equal('Exported', g:imported_func)
Bram Moolenaar40f4f7a2020-07-23 22:41:43 +02001228 assert_equal('Exported', g:funcref_result)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +01001229 assert_equal('John', g:imported_name)
1230 assert_equal('John Doe', g:imported_name_appended)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001231 assert_false(exists('g:name'))
1232
Bram Moolenaarb3ca9822020-08-09 14:43:58 +02001233 Undo_export_script_lines()
Bram Moolenaar24e93162021-07-18 20:40:33 +02001234 unlet g:exported1
1235 unlet g:exported2
1236 unlet g:exported3
1237 unlet g:exported_i1
1238 unlet g:exported_i2
1239 unlet g:exported_later
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001240 unlet g:imported_func
Bram Moolenaar6e587dc2020-02-06 13:15:52 +01001241 unlet g:imported_name g:imported_name_appended
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001242 delete('Ximport.vim')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001243
Bram Moolenaar1c991142020-07-04 13:15:31 +02001244 # similar, with line breaks
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001245 var import_line_break_script_lines =<< trim END
Bram Moolenaar1c991142020-07-04 13:15:31 +02001246 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001247 import './Xexport.vim'
1248 as expo
1249 g:exported = expo.exported
1250 expo.exported += 7
1251 g:exported_added = expo.exported
1252 g:imported_func = expo.Exported()
Bram Moolenaar1c991142020-07-04 13:15:31 +02001253 END
1254 writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
1255 source Ximport_lbr.vim
1256
Bram Moolenaar24e93162021-07-18 20:40:33 +02001257 assert_equal(11, g:exported)
1258 assert_equal(18, g:exported_added)
Bram Moolenaar1c991142020-07-04 13:15:31 +02001259 assert_equal('Exported', g:imported_func)
1260
1261 # exported script not sourced again
1262 assert_false(exists('g:result'))
Bram Moolenaar24e93162021-07-18 20:40:33 +02001263 unlet g:exported
1264 unlet g:exported_added
Bram Moolenaar1c991142020-07-04 13:15:31 +02001265 unlet g:imported_func
1266 delete('Ximport_lbr.vim')
1267
Bram Moolenaar32884ad2022-01-07 12:45:29 +00001268 var line_break_before_dot =<< trim END
1269 vim9script
1270 import './Xexport.vim' as expo
1271 g:exported = expo
1272 .exported
1273 END
1274 writefile(line_break_before_dot, 'Ximport_lbr_before_dot.vim')
1275 assert_fails('source Ximport_lbr_before_dot.vim', 'E1060:', '', 3)
1276 delete('Ximport_lbr_before_dot.vim')
1277
1278 var line_break_after_dot =<< trim END
1279 vim9script
1280 import './Xexport.vim' as expo
1281 g:exported = expo.
1282 exported
1283 END
1284 writefile(line_break_after_dot, 'Ximport_lbr_after_dot.vim')
1285 assert_fails('source Ximport_lbr_after_dot.vim', 'E1074:', '', 3)
1286 delete('Ximport_lbr_after_dot.vim')
1287
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001288 var import_star_as_lines =<< trim END
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001289 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001290 import './Xexport.vim' as Export
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001291 def UseExport()
Bram Moolenaar24e93162021-07-18 20:40:33 +02001292 g:exported_def = Export.exported
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001293 enddef
Bram Moolenaar24e93162021-07-18 20:40:33 +02001294 g:exported_script = Export.exported
Bram Moolenaarcb4e80f2021-03-13 20:57:19 +01001295 assert_equal(1, exists('Export.exported'))
1296 assert_equal(0, exists('Export.notexported'))
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001297 UseExport()
1298 END
1299 writefile(import_star_as_lines, 'Ximport.vim')
1300 source Ximport.vim
Bram Moolenaar24e93162021-07-18 20:40:33 +02001301
1302 assert_equal(18, g:exported_def)
1303 assert_equal(18, g:exported_script)
1304 unlet g:exported_def
1305 unlet g:exported_script
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001306
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001307 var import_star_as_lines_no_dot =<< trim END
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001308 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001309 import './Xexport.vim' as Export
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001310 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001311 var dummy = 1
1312 var imported = Export + dummy
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001313 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +02001314 defcompile
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001315 END
1316 writefile(import_star_as_lines_no_dot, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001317 assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001318
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001319 var import_star_as_lines_dot_space =<< trim END
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001320 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001321 import './Xexport.vim' as Export
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001322 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001323 var imported = Export . exported
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001324 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +02001325 defcompile
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001326 END
1327 writefile(import_star_as_lines_dot_space, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001328 assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001329
Bram Moolenaar921ba522021-07-29 22:25:05 +02001330 var import_func_duplicated =<< trim END
1331 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001332 import './Xexport.vim' as expo
1333 import './Xexport.vim' as expo
Bram Moolenaar921ba522021-07-29 22:25:05 +02001334
1335 ExportedInc()
1336 END
1337 writefile(import_func_duplicated, 'Ximport.vim')
1338 assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
1339
Bram Moolenaara6294952020-12-27 13:39:50 +01001340 var import_star_as_duplicated =<< trim END
1341 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001342 import './Xexport.vim' as Export
Bram Moolenaara6294952020-12-27 13:39:50 +01001343 var some = 'other'
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001344 import './Xexport.vim' as Export
Bram Moolenaara6294952020-12-27 13:39:50 +01001345 defcompile
1346 END
1347 writefile(import_star_as_duplicated, 'Ximport.vim')
1348 assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
1349
Bram Moolenaarcb4e80f2021-03-13 20:57:19 +01001350 var import_star_as_lines_script_no_dot =<< trim END
1351 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001352 import './Xexport.vim' as Export
Bram Moolenaarcb4e80f2021-03-13 20:57:19 +01001353 g:imported_script = Export exported
1354 END
1355 writefile(import_star_as_lines_script_no_dot, 'Ximport.vim')
Bram Moolenaar32884ad2022-01-07 12:45:29 +00001356 assert_fails('source Ximport.vim', 'E1060: Expected dot after name: Export exported')
Bram Moolenaarcb4e80f2021-03-13 20:57:19 +01001357
1358 var import_star_as_lines_script_space_after_dot =<< trim END
1359 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001360 import './Xexport.vim' as Export
Bram Moolenaarcb4e80f2021-03-13 20:57:19 +01001361 g:imported_script = Export. exported
1362 END
1363 writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim')
1364 assert_fails('source Ximport.vim', 'E1074:')
1365
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001366 var import_star_as_lines_missing_name =<< trim END
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001367 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001368 import './Xexport.vim' as Export
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001369 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001370 var imported = Export.
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001371 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +02001372 defcompile
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001373 END
1374 writefile(import_star_as_lines_missing_name, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001375 assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001376
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001377 var import_star_as_lbr_lines =<< trim END
Bram Moolenaar1c991142020-07-04 13:15:31 +02001378 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001379 import './Xexport.vim'
Bram Moolenaar1c991142020-07-04 13:15:31 +02001380 as Export
Bram Moolenaar1c991142020-07-04 13:15:31 +02001381 def UseExport()
Bram Moolenaar24e93162021-07-18 20:40:33 +02001382 g:exported = Export.exported
Bram Moolenaar1c991142020-07-04 13:15:31 +02001383 enddef
1384 UseExport()
1385 END
1386 writefile(import_star_as_lbr_lines, 'Ximport.vim')
1387 source Ximport.vim
Bram Moolenaar24e93162021-07-18 20:40:33 +02001388 assert_equal(18, g:exported)
1389 unlet g:exported
Bram Moolenaar1c991142020-07-04 13:15:31 +02001390
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001391 # try to use something that exists but is not exported
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001392 var import_not_exported_lines =<< trim END
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001393 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001394 import './Xexport.vim' as expo
1395 echo expo.name
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001396 END
1397 writefile(import_not_exported_lines, 'Ximport.vim')
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001398 assert_fails('source Ximport.vim', 'E1049:', '', 3, 'Ximport.vim')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001399
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001400 # try to import something that is already defined
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001401 var import_already_defined =<< trim END
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001402 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001403 var exported = 'something'
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001404 import './Xexport.vim' as exported
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001405 END
1406 writefile(import_already_defined, 'Ximport.vim')
Bram Moolenaar057e84a2021-02-28 16:55:11 +01001407 assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001408
Bram Moolenaar918a4242020-12-06 14:37:08 +01001409 # try changing an imported const
1410 var import_assign_to_const =<< trim END
1411 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001412 import './Xexport.vim' as expo
Bram Moolenaar918a4242020-12-06 14:37:08 +01001413 def Assign()
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001414 expo.CONST = 987
Bram Moolenaar918a4242020-12-06 14:37:08 +01001415 enddef
1416 defcompile
1417 END
1418 writefile(import_assign_to_const, 'Ximport.vim')
1419 assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1420
Bram Moolenaar0f2a5cc2021-02-27 22:33:21 +01001421 # try changing an imported final
1422 var import_assign_to_final =<< trim END
1423 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001424 import './Xexport.vim' as expo
Bram Moolenaar0f2a5cc2021-02-27 22:33:21 +01001425 def Assign()
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001426 expo.theList = [2]
Bram Moolenaar0f2a5cc2021-02-27 22:33:21 +01001427 enddef
1428 defcompile
1429 END
1430 writefile(import_assign_to_final, 'Ximport.vim')
1431 assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1432
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001433 var import_no_as_lines =<< trim END
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001434 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001435 import './Xexport.vim' name
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001436 END
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001437 writefile(import_no_as_lines, 'Ximport.vim')
1438 assert_fails('source Ximport.vim', 'E488:', '', 2, 'Ximport.vim')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001439
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001440 var import_invalid_string_lines =<< trim END
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001441 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001442 import Xexport.vim
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001443 END
1444 writefile(import_invalid_string_lines, 'Ximport.vim')
Bram Moolenaar4db572e2021-07-18 18:21:38 +02001445 assert_fails('source Ximport.vim', 'E121:', '', 2, 'Ximport.vim')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001446
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001447 var import_wrong_name_lines =<< trim END
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001448 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001449 import './XnoExport.vim'
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001450 END
1451 writefile(import_wrong_name_lines, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001452 assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001453
Bram Moolenaar60579352021-07-19 21:45:07 +02001454 var import_redefining_lines =<< trim END
1455 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001456 import './Xexport.vim' as exported
Bram Moolenaar60579352021-07-19 21:45:07 +02001457 var exported = 5
1458 END
1459 writefile(import_redefining_lines, 'Ximport.vim')
1460 assert_fails('source Ximport.vim', 'E1213: Redefining imported item "exported"', '', 3)
1461
1462 var import_assign_wrong_type_lines =<< trim END
1463 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001464 import './Xexport.vim' as expo
1465 expo.exported = 'xxx'
Bram Moolenaar60579352021-07-19 21:45:07 +02001466 END
1467 writefile(import_assign_wrong_type_lines, 'Ximport.vim')
1468 assert_fails('source Ximport.vim', 'E1012: Type mismatch; expected number but got string', '', 3)
1469
1470 var import_assign_const_lines =<< trim END
1471 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001472 import './Xexport.vim' as expo
1473 expo.CONST = 4321
Bram Moolenaar60579352021-07-19 21:45:07 +02001474 END
1475 writefile(import_assign_const_lines, 'Ximport.vim')
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001476 assert_fails('source Ximport.vim', 'E46: Cannot change read-only variable "CONST"', '', 3)
Bram Moolenaar60579352021-07-19 21:45:07 +02001477
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001478 delete('Ximport.vim')
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001479 delete('Ximport3.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001480 delete('Xexport.vim')
1481
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001482 # Check that in a Vim9 script 'cpo' is set to the Vim default.
Bram Moolenaar3e191692021-03-17 17:46:00 +01001483 # Flags added or removed are also applied to the restored value.
1484 set cpo=abcd
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001485 var lines =<< trim END
Bram Moolenaar750802b2020-02-23 18:08:33 +01001486 vim9script
1487 g:cpo_in_vim9script = &cpo
Bram Moolenaar3e191692021-03-17 17:46:00 +01001488 set cpo+=f
1489 set cpo-=c
1490 g:cpo_after_vim9script = &cpo
Bram Moolenaar750802b2020-02-23 18:08:33 +01001491 END
1492 writefile(lines, 'Xvim9_script')
1493 source Xvim9_script
Bram Moolenaar3e191692021-03-17 17:46:00 +01001494 assert_equal('fabd', &cpo)
Bram Moolenaar750802b2020-02-23 18:08:33 +01001495 set cpo&vim
1496 assert_equal(&cpo, g:cpo_in_vim9script)
Bram Moolenaar3e191692021-03-17 17:46:00 +01001497 var newcpo = substitute(&cpo, 'c', '', '') .. 'f'
1498 assert_equal(newcpo, g:cpo_after_vim9script)
1499
Bram Moolenaar750802b2020-02-23 18:08:33 +01001500 delete('Xvim9_script')
1501enddef
1502
Bram Moolenaar5fe07d22021-10-22 22:17:53 +01001503def Test_import_funcref()
1504 var lines =<< trim END
1505 vim9script
1506 export def F(): number
1507 return 42
1508 enddef
1509 export const G = F
1510 END
1511 writefile(lines, 'Xlib.vim')
1512
1513 lines =<< trim END
1514 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001515 import './Xlib.vim' as lib
1516 const Foo = lib.G()
Bram Moolenaar5fe07d22021-10-22 22:17:53 +01001517 assert_equal(42, Foo)
1518
1519 def DoTest()
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001520 const Goo = lib.G()
Bram Moolenaar06ca48a2021-10-23 10:25:21 +01001521 assert_equal(42, Goo)
Bram Moolenaar5fe07d22021-10-22 22:17:53 +01001522 enddef
1523 DoTest()
1524 END
1525 CheckScriptSuccess(lines)
1526
1527 delete('Xlib.vim')
1528enddef
1529
Bram Moolenaar834d4182022-01-07 13:38:24 +00001530def Test_import_fails()
Bram Moolenaar6853c382021-09-07 22:12:19 +02001531 writefile([], 'Xfoo.vim')
1532 var lines =<< trim END
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001533 import './Xfoo.vim' as foo
Bram Moolenaar6853c382021-09-07 22:12:19 +02001534 foo = 'bar'
1535 END
Bram Moolenaar86b3ab42021-12-19 18:33:23 +00001536 CheckDefAndScriptFailure(lines, ['E1094:', 'E1236: Cannot use foo itself'])
Bram Moolenaar6853c382021-09-07 22:12:19 +02001537 lines =<< trim END
1538 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001539 import './Xfoo.vim' as foo
Bram Moolenaar6853c382021-09-07 22:12:19 +02001540 var that = foo
1541 END
Bram Moolenaar32884ad2022-01-07 12:45:29 +00001542 CheckScriptFailure(lines, 'E1060: Expected dot after name: foo')
Bram Moolenaara9e3d562021-09-08 12:31:35 +02001543
1544 lines =<< trim END
1545 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001546 import './Xfoo.vim' as 9foo
Bram Moolenaara9e3d562021-09-08 12:31:35 +02001547 END
1548 CheckScriptFailure(lines, 'E1047:')
1549 lines =<< trim END
1550 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001551 import './Xfoo.vim' as the#foo
Bram Moolenaara9e3d562021-09-08 12:31:35 +02001552 END
1553 CheckScriptFailure(lines, 'E1047:')
1554 lines =<< trim END
1555 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001556 import './Xfoo.vim' as g:foo
Bram Moolenaara9e3d562021-09-08 12:31:35 +02001557 END
1558 CheckScriptFailure(lines, 'E1047:')
1559
Bram Moolenaaraf2d5d22021-09-07 22:35:34 +02001560 delete('Xfoo.vim')
Bram Moolenaarf8a79fc2021-12-14 12:06:16 +00001561
1562 lines =<< trim END
1563 vim9script
1564 def TheFunc()
1565 echo 'the func'
1566 enddef
1567 export var Ref = TheFunc
1568 END
1569 writefile([], 'Xthat.vim')
1570 lines =<< trim END
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001571 import './Xthat.vim' as That
Bram Moolenaarf8a79fc2021-12-14 12:06:16 +00001572 That()
1573 END
Bram Moolenaar86b3ab42021-12-19 18:33:23 +00001574 CheckDefAndScriptFailure(lines, ['E1094:', 'E1236: Cannot use That itself'])
Bram Moolenaar834d4182022-01-07 13:38:24 +00001575
Bram Moolenaar2b04d5f2022-01-07 14:39:56 +00001576 mkdir('Ximport')
Bram Moolenaar834d4182022-01-07 13:38:24 +00001577
Bram Moolenaar2b04d5f2022-01-07 14:39:56 +00001578 writefile(['vim9script'], 'Ximport/.vim')
Bram Moolenaar834d4182022-01-07 13:38:24 +00001579 lines =<< trim END
1580 vim9script
Bram Moolenaar2b04d5f2022-01-07 14:39:56 +00001581 import './Ximport/.vim'
Bram Moolenaar834d4182022-01-07 13:38:24 +00001582 END
1583 CheckScriptFailure(lines, 'E1261: Cannot import .vim without using "as"')
1584 lines =<< trim END
1585 vim9script
Bram Moolenaar2b04d5f2022-01-07 14:39:56 +00001586 import './Ximport/.vim' as vim
Bram Moolenaar834d4182022-01-07 13:38:24 +00001587 END
1588 CheckScriptSuccess(lines)
1589
Bram Moolenaar2b04d5f2022-01-07 14:39:56 +00001590 writefile(['vim9script'], 'Ximport/.vimrc')
Bram Moolenaar834d4182022-01-07 13:38:24 +00001591 lines =<< trim END
1592 vim9script
Bram Moolenaar2b04d5f2022-01-07 14:39:56 +00001593 import './Ximport/.vimrc'
Bram Moolenaar834d4182022-01-07 13:38:24 +00001594 END
1595 CheckScriptFailure(lines, 'E1257: Imported script must use "as" or end in .vim')
1596 lines =<< trim END
1597 vim9script
Bram Moolenaar2b04d5f2022-01-07 14:39:56 +00001598 import './Ximport/.vimrc' as vimrc
Bram Moolenaar834d4182022-01-07 13:38:24 +00001599 END
1600 CheckScriptSuccess(lines)
1601
Bram Moolenaar2b04d5f2022-01-07 14:39:56 +00001602 delete('Ximport', 'rf')
Bram Moolenaar6853c382021-09-07 22:12:19 +02001603enddef
1604
Bram Moolenaar803af682020-08-05 16:20:03 +02001605func g:Trigger()
1606 source Ximport.vim
1607 return "echo 'yes'\<CR>"
1608endfunc
1609
1610def Test_import_export_expr_map()
1611 # check that :import and :export work when buffer is locked
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001612 var export_lines =<< trim END
Bram Moolenaar803af682020-08-05 16:20:03 +02001613 vim9script
1614 export def That(): string
1615 return 'yes'
1616 enddef
1617 END
1618 writefile(export_lines, 'Xexport_that.vim')
1619
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001620 var import_lines =<< trim END
Bram Moolenaar803af682020-08-05 16:20:03 +02001621 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001622 import './Xexport_that.vim' as that
1623 assert_equal('yes', that.That())
Bram Moolenaar803af682020-08-05 16:20:03 +02001624 END
1625 writefile(import_lines, 'Ximport.vim')
1626
1627 nnoremap <expr> trigger g:Trigger()
1628 feedkeys('trigger', "xt")
1629
Bram Moolenaar730b2482020-08-09 13:02:10 +02001630 delete('Xexport_that.vim')
Bram Moolenaar803af682020-08-05 16:20:03 +02001631 delete('Ximport.vim')
1632 nunmap trigger
1633enddef
1634
Bram Moolenaar8e1986e2020-08-06 22:11:06 +02001635def Test_import_in_filetype()
1636 # check that :import works when the buffer is locked
1637 mkdir('ftplugin', 'p')
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001638 var export_lines =<< trim END
Bram Moolenaar8e1986e2020-08-06 22:11:06 +02001639 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001640 export var That = 'yes'
Bram Moolenaar8e1986e2020-08-06 22:11:06 +02001641 END
Bram Moolenaar730b2482020-08-09 13:02:10 +02001642 writefile(export_lines, 'ftplugin/Xexport_ft.vim')
Bram Moolenaar8e1986e2020-08-06 22:11:06 +02001643
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001644 var import_lines =<< trim END
Bram Moolenaar8e1986e2020-08-06 22:11:06 +02001645 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001646 import './Xexport_ft.vim' as ft
1647 assert_equal('yes', ft.That)
Bram Moolenaar8e1986e2020-08-06 22:11:06 +02001648 g:did_load_mytpe = 1
1649 END
1650 writefile(import_lines, 'ftplugin/qf.vim')
1651
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001652 var save_rtp = &rtp
Bram Moolenaar8e1986e2020-08-06 22:11:06 +02001653 &rtp = getcwd() .. ',' .. &rtp
1654
1655 filetype plugin on
1656 copen
1657 assert_equal(1, g:did_load_mytpe)
1658
1659 quit!
Bram Moolenaar730b2482020-08-09 13:02:10 +02001660 delete('Xexport_ft.vim')
Bram Moolenaar8e1986e2020-08-06 22:11:06 +02001661 delete('ftplugin', 'rf')
1662 &rtp = save_rtp
1663enddef
1664
Bram Moolenaar71f21932022-01-07 18:20:55 +00001665def Test_use_import_in_mapping()
1666 var lines =<< trim END
1667 vim9script
1668 export def Funcx()
1669 g:result = 42
1670 enddef
1671 END
1672 writefile(lines, 'XsomeExport.vim')
1673 lines =<< trim END
1674 vim9script
1675 import './XsomeExport.vim' as some
1676 var Funcy = some.Funcx
1677 nnoremap <F3> :call <sid>Funcy()<cr>
1678 END
1679 writefile(lines, 'Xmapscript.vim')
1680
1681 source Xmapscript.vim
1682 feedkeys("\<F3>", "xt")
1683 assert_equal(42, g:result)
1684
1685 unlet g:result
1686 delete('XsomeExport.vim')
1687 delete('Xmapscript.vim')
1688 nunmap <F3>
1689enddef
Bram Moolenaarefa94442020-08-08 22:16:00 +02001690
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001691def Test_vim9script_mix()
1692 var lines =<< trim END
1693 if has(g:feature)
1694 " legacy script
1695 let g:legacy = 1
1696 finish
1697 endif
1698 vim9script
1699 g:legacy = 0
1700 END
1701 g:feature = 'eval'
1702 g:legacy = -1
1703 CheckScriptSuccess(lines)
1704 assert_equal(1, g:legacy)
1705
1706 g:feature = 'noteval'
1707 g:legacy = -1
1708 CheckScriptSuccess(lines)
1709 assert_equal(0, g:legacy)
1710enddef
1711
Bram Moolenaar750802b2020-02-23 18:08:33 +01001712def Test_vim9script_fails()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001713 CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
1714 CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001715 CheckScriptFailure(['export var some = 123'], 'E1042:')
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001716 CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
Bram Moolenaar750802b2020-02-23 18:08:33 +01001717 CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1718
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001719 CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
Bram Moolenaarc785b9a2020-06-19 18:34:15 +02001720 CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1721
Bram Moolenaare2e40752020-09-04 21:18:46 +02001722 assert_fails('vim9script', 'E1038:')
1723 assert_fails('export something', 'E1043:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001724enddef
1725
Bram Moolenaarf7d267e2020-06-17 12:04:54 +02001726func Test_import_fails_without_script()
Bram Moolenaar101f4812020-06-16 23:18:51 +02001727 CheckRunVimInTerminal
1728
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001729 " call indirectly to avoid compilation error for missing functions
Bram Moolenaarc620c052020-07-08 15:16:19 +02001730 call Run_Test_import_fails_on_command_line()
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001731endfunc
1732
Bram Moolenaarc620c052020-07-08 15:16:19 +02001733def Run_Test_import_fails_on_command_line()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001734 var export =<< trim END
Bram Moolenaar101f4812020-06-16 23:18:51 +02001735 vim9script
1736 export def Foo(): number
1737 return 0
1738 enddef
1739 END
Bram Moolenaar730b2482020-08-09 13:02:10 +02001740 writefile(export, 'XexportCmd.vim')
Bram Moolenaar101f4812020-06-16 23:18:51 +02001741
Bram Moolenaare0de1712020-12-02 17:36:54 +01001742 var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001743 rows: 6, wait_for_ruler: 0})
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001744 WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
Bram Moolenaar101f4812020-06-16 23:18:51 +02001745
Bram Moolenaar730b2482020-08-09 13:02:10 +02001746 delete('XexportCmd.vim')
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001747 StopVimInTerminal(buf)
1748enddef
Bram Moolenaar101f4812020-06-16 23:18:51 +02001749
Bram Moolenaar2b327002020-12-26 15:39:31 +01001750def Test_vim9script_reload_noclear()
1751 var lines =<< trim END
Bram Moolenaara6294952020-12-27 13:39:50 +01001752 vim9script
1753 export var exported = 'thexport'
Bram Moolenaar60dc8272021-07-29 22:48:54 +02001754
1755 export def TheFunc(x = 0)
1756 enddef
Bram Moolenaara6294952020-12-27 13:39:50 +01001757 END
1758 writefile(lines, 'XExportReload')
1759 lines =<< trim END
Bram Moolenaar2b327002020-12-26 15:39:31 +01001760 vim9script noclear
1761 g:loadCount += 1
1762 var s:reloaded = 'init'
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001763 import './XExportReload' as exp
Bram Moolenaar2b327002020-12-26 15:39:31 +01001764
1765 def Again(): string
1766 return 'again'
1767 enddef
1768
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001769 exp.TheFunc()
Bram Moolenaar60dc8272021-07-29 22:48:54 +02001770
Bram Moolenaar2b327002020-12-26 15:39:31 +01001771 if exists('s:loaded') | finish | endif
1772 var s:loaded = true
1773
1774 var s:notReloaded = 'yes'
1775 s:reloaded = 'first'
1776 def g:Values(): list<string>
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001777 return [s:reloaded, s:notReloaded, Again(), Once(), exp.exported]
Bram Moolenaar2b327002020-12-26 15:39:31 +01001778 enddef
1779
1780 def Once(): string
1781 return 'once'
1782 enddef
1783 END
1784 writefile(lines, 'XReloaded')
1785 g:loadCount = 0
1786 source XReloaded
1787 assert_equal(1, g:loadCount)
Bram Moolenaara6294952020-12-27 13:39:50 +01001788 assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
Bram Moolenaar2b327002020-12-26 15:39:31 +01001789 source XReloaded
1790 assert_equal(2, g:loadCount)
Bram Moolenaara6294952020-12-27 13:39:50 +01001791 assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
Bram Moolenaar2b327002020-12-26 15:39:31 +01001792 source XReloaded
1793 assert_equal(3, g:loadCount)
Bram Moolenaara6294952020-12-27 13:39:50 +01001794 assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
Bram Moolenaar2b327002020-12-26 15:39:31 +01001795
Bram Moolenaar48e11c12021-01-11 18:47:00 +01001796 delete('XReloaded')
Bram Moolenaara6294952020-12-27 13:39:50 +01001797 delete('XExportReload')
Bram Moolenaar2b327002020-12-26 15:39:31 +01001798 delfunc g:Values
Bram Moolenaar2b327002020-12-26 15:39:31 +01001799 unlet g:loadCount
Bram Moolenaar577dc932021-06-27 15:35:40 +02001800
1801 lines =<< trim END
1802 vim9script
1803 def Inner()
1804 enddef
1805 END
1806 lines->writefile('XreloadScript.vim')
1807 source XreloadScript.vim
1808
1809 lines =<< trim END
1810 vim9script
1811 def Outer()
1812 def Inner()
1813 enddef
1814 enddef
1815 defcompile
1816 END
1817 lines->writefile('XreloadScript.vim')
1818 source XreloadScript.vim
1819
1820 delete('XreloadScript.vim')
Bram Moolenaar2b327002020-12-26 15:39:31 +01001821enddef
1822
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001823def Test_vim9script_reload_import()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001824 var lines =<< trim END
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001825 vim9script
1826 const var = ''
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001827 var valone = 1234
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001828 def MyFunc(arg: string)
1829 valone = 5678
1830 enddef
1831 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001832 var morelines =<< trim END
1833 var valtwo = 222
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001834 export def GetValtwo(): number
1835 return valtwo
1836 enddef
1837 END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001838 writefile(lines + morelines, 'Xreload.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001839 source Xreload.vim
1840 source Xreload.vim
1841 source Xreload.vim
1842
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001843 # cannot declare a var twice
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001844 lines =<< trim END
1845 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001846 var valone = 1234
1847 var valone = 5678
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001848 END
1849 writefile(lines, 'Xreload.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001850 assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001851
1852 delete('Xreload.vim')
1853 delete('Ximport.vim')
1854enddef
1855
Bram Moolenaar07a65d22020-12-26 20:09:15 +01001856" if a script is reloaded with a script-local variable that changed its type, a
1857" compiled function using that variable must fail.
1858def Test_script_reload_change_type()
1859 var lines =<< trim END
1860 vim9script noclear
1861 var str = 'string'
1862 def g:GetStr(): string
1863 return str .. 'xxx'
1864 enddef
1865 END
1866 writefile(lines, 'Xreload.vim')
1867 source Xreload.vim
1868 echo g:GetStr()
1869
1870 lines =<< trim END
1871 vim9script noclear
1872 var str = 1234
1873 END
1874 writefile(lines, 'Xreload.vim')
1875 source Xreload.vim
1876 assert_fails('echo g:GetStr()', 'E1150:')
1877
1878 delfunc g:GetStr
1879 delete('Xreload.vim')
1880enddef
1881
Bram Moolenaarc970e422021-03-17 15:03:04 +01001882" Define CallFunc so that the test can be compiled
1883command CallFunc echo 'nop'
1884
1885def Test_script_reload_from_function()
1886 var lines =<< trim END
1887 vim9script
1888
1889 if exists('g:loaded')
1890 finish
1891 endif
1892 g:loaded = 1
1893 delcommand CallFunc
1894 command CallFunc Func()
1895 def Func()
Bram Moolenaara4c81be2021-03-17 15:23:16 +01001896 so XreloadFunc.vim
Bram Moolenaarc970e422021-03-17 15:03:04 +01001897 g:didTheFunc = 1
1898 enddef
1899 END
1900 writefile(lines, 'XreloadFunc.vim')
1901 source XreloadFunc.vim
1902 CallFunc
1903 assert_equal(1, g:didTheFunc)
1904
1905 delete('XreloadFunc.vim')
1906 delcommand CallFunc
1907 unlet g:loaded
1908 unlet g:didTheFunc
1909enddef
1910
Bram Moolenaar6c3843c2021-03-04 12:38:21 +01001911def Test_script_var_shadows_function()
1912 var lines =<< trim END
1913 vim9script
1914 def Func(): number
1915 return 123
1916 enddef
1917 var Func = 1
1918 END
1919 CheckScriptFailure(lines, 'E1041:', 5)
1920enddef
1921
Bram Moolenaar052ff292021-12-11 13:54:46 +00001922def Test_function_shadows_script_var()
1923 var lines =<< trim END
1924 vim9script
1925 var Func = 1
1926 def Func(): number
1927 return 123
1928 enddef
1929 END
1930 CheckScriptFailure(lines, 'E1041:', 3)
1931enddef
1932
Bram Moolenaarc3235272021-07-10 19:42:03 +02001933def Test_script_var_shadows_command()
1934 var lines =<< trim END
1935 var undo = 1
1936 undo = 2
1937 assert_equal(2, undo)
1938 END
1939 CheckDefAndScriptSuccess(lines)
1940
1941 lines =<< trim END
1942 var undo = 1
1943 undo
1944 END
1945 CheckDefAndScriptFailure(lines, 'E1207:', 2)
1946enddef
1947
Bram Moolenaar2ef91562021-12-11 16:14:07 +00001948def Test_vim9script_call_wrong_type()
1949 var lines =<< trim END
1950 vim9script
1951 var Time = 'localtime'
1952 Time()
1953 END
1954 CheckScriptFailure(lines, 'E1085:')
1955enddef
1956
Bram Moolenaar95006e32020-08-29 17:47:08 +02001957def s:RetSome(): string
1958 return 'some'
1959enddef
1960
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001961" Not exported function that is referenced needs to be accessed by the
1962" script-local name.
1963def Test_vim9script_funcref()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001964 var sortlines =<< trim END
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001965 vim9script
1966 def Compare(i1: number, i2: number): number
Bram Moolenaarbed36b92020-07-07 23:31:36 +02001967 return i2 - i1
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001968 enddef
1969
1970 export def FastSort(): list<number>
1971 return range(5)->sort(Compare)
1972 enddef
Bram Moolenaar529fb5a2021-04-01 12:57:57 +02001973
1974 export def GetString(arg: string): string
1975 return arg
1976 enddef
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001977 END
1978 writefile(sortlines, 'Xsort.vim')
1979
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001980 var lines =<< trim END
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001981 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001982 import './Xsort.vim'
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001983 def Test()
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001984 g:result = Xsort.FastSort()
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001985 enddef
1986 Test()
Bram Moolenaar529fb5a2021-04-01 12:57:57 +02001987
1988 # using a function imported with "as"
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001989 import './Xsort.vim' as anAlias
Bram Moolenaar529fb5a2021-04-01 12:57:57 +02001990 assert_equal('yes', anAlias.GetString('yes'))
1991
1992 # using the function from a compiled function
1993 def TestMore(): string
Bram Moolenaarca51cc02021-04-01 21:38:53 +02001994 var s = s:anAlias.GetString('foo')
1995 return s .. anAlias.GetString('bar')
Bram Moolenaar529fb5a2021-04-01 12:57:57 +02001996 enddef
Bram Moolenaarca51cc02021-04-01 21:38:53 +02001997 assert_equal('foobar', TestMore())
Bram Moolenaar529fb5a2021-04-01 12:57:57 +02001998
1999 # error when using a function that isn't exported
2000 assert_fails('anAlias.Compare(1, 2)', 'E1049:')
Bram Moolenaarfe465a02020-07-07 22:50:12 +02002001 END
2002 writefile(lines, 'Xscript.vim')
2003
2004 source Xscript.vim
2005 assert_equal([4, 3, 2, 1, 0], g:result)
2006
2007 unlet g:result
2008 delete('Xsort.vim')
2009 delete('Xscript.vim')
Bram Moolenaar95006e32020-08-29 17:47:08 +02002010
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002011 var Funcref = function('s:RetSome')
Bram Moolenaar95006e32020-08-29 17:47:08 +02002012 assert_equal('some', Funcref())
Bram Moolenaarfe465a02020-07-07 22:50:12 +02002013enddef
2014
Bram Moolenaar601e76a2020-08-27 21:33:10 +02002015" Check that when searching for "FilterFunc" it finds the import in the
2016" script where FastFilter() is called from, both as a string and as a direct
2017" function reference.
Bram Moolenaarc620c052020-07-08 15:16:19 +02002018def Test_vim9script_funcref_other_script()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002019 var filterLines =<< trim END
Bram Moolenaarc620c052020-07-08 15:16:19 +02002020 vim9script
2021 export def FilterFunc(idx: number, val: number): bool
2022 return idx % 2 == 1
2023 enddef
2024 export def FastFilter(): list<number>
Bram Moolenaar18024052021-12-25 21:43:28 +00002025 return range(10)->filter('FilterFunc(v:key, v:val)')
Bram Moolenaarc620c052020-07-08 15:16:19 +02002026 enddef
Bram Moolenaar601e76a2020-08-27 21:33:10 +02002027 export def FastFilterDirect(): list<number>
2028 return range(10)->filter(FilterFunc)
2029 enddef
Bram Moolenaarc620c052020-07-08 15:16:19 +02002030 END
2031 writefile(filterLines, 'Xfilter.vim')
2032
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002033 var lines =<< trim END
Bram Moolenaarc620c052020-07-08 15:16:19 +02002034 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002035 import './Xfilter.vim' as filter
Bram Moolenaarc620c052020-07-08 15:16:19 +02002036 def Test()
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002037 var x: list<number> = filter.FastFilter()
Bram Moolenaarc620c052020-07-08 15:16:19 +02002038 enddef
2039 Test()
Bram Moolenaar601e76a2020-08-27 21:33:10 +02002040 def TestDirect()
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002041 var x: list<number> = filter.FastFilterDirect()
Bram Moolenaar601e76a2020-08-27 21:33:10 +02002042 enddef
2043 TestDirect()
Bram Moolenaarc620c052020-07-08 15:16:19 +02002044 END
Bram Moolenaar601e76a2020-08-27 21:33:10 +02002045 CheckScriptSuccess(lines)
Bram Moolenaarc620c052020-07-08 15:16:19 +02002046 delete('Xfilter.vim')
Bram Moolenaarc620c052020-07-08 15:16:19 +02002047enddef
2048
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002049def Test_vim9script_reload_delfunc()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002050 var first_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002051 vim9script
2052 def FuncYes(): string
2053 return 'yes'
2054 enddef
2055 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002056 var withno_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002057 def FuncNo(): string
2058 return 'no'
2059 enddef
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002060 def g:DoCheck(no_exists: bool)
2061 assert_equal('yes', FuncYes())
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02002062 assert_equal('no', FuncNo())
2063 enddef
2064 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002065 var nono_lines =<< trim END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02002066 def g:DoCheck(no_exists: bool)
2067 assert_equal('yes', FuncYes())
Bram Moolenaar44d66522020-09-06 22:26:57 +02002068 assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002069 enddef
2070 END
2071
2072 # FuncNo() is defined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02002073 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002074 source Xreloaded.vim
2075 g:DoCheck(true)
2076
2077 # FuncNo() is not redefined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02002078 writefile(first_lines + nono_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002079 source Xreloaded.vim
Bram Moolenaar50824712020-12-20 21:10:17 +01002080 g:DoCheck(false)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002081
2082 # FuncNo() is back
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02002083 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002084 source Xreloaded.vim
Bram Moolenaar50824712020-12-20 21:10:17 +01002085 g:DoCheck(false)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002086
2087 delete('Xreloaded.vim')
2088enddef
2089
Bram Moolenaar89483d42020-05-10 15:24:44 +02002090def Test_vim9script_reload_delvar()
2091 # write the script with a script-local variable
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002092 var lines =<< trim END
Bram Moolenaar89483d42020-05-10 15:24:44 +02002093 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002094 var name = 'string'
Bram Moolenaar89483d42020-05-10 15:24:44 +02002095 END
2096 writefile(lines, 'XreloadVar.vim')
2097 source XreloadVar.vim
2098
2099 # now write the script using the same variable locally - works
2100 lines =<< trim END
2101 vim9script
2102 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002103 var name = 'string'
Bram Moolenaar89483d42020-05-10 15:24:44 +02002104 enddef
2105 END
2106 writefile(lines, 'XreloadVar.vim')
2107 source XreloadVar.vim
2108
2109 delete('XreloadVar.vim')
2110enddef
2111
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002112def Test_import_absolute()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002113 var import_lines = [
Bram Moolenaare6085c52020-04-12 20:19:16 +02002114 'vim9script',
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002115 'import "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim" as abs',
Bram Moolenaare6085c52020-04-12 20:19:16 +02002116 'def UseExported()',
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002117 ' g:imported_abs = abs.exported',
2118 ' abs.exported = 8888',
2119 ' g:imported_after = abs.exported',
Bram Moolenaare6085c52020-04-12 20:19:16 +02002120 'enddef',
2121 'UseExported()',
2122 'g:import_disassembled = execute("disass UseExported")',
2123 ]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002124 writefile(import_lines, 'Ximport_abs.vim')
2125 writefile(s:export_script_lines, 'Xexport_abs.vim')
2126
2127 source Ximport_abs.vim
2128
2129 assert_equal(9876, g:imported_abs)
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +01002130 assert_equal(8888, g:imported_after)
Bram Moolenaarfbbcd002020-10-15 12:46:44 +02002131 assert_match('<SNR>\d\+_UseExported\_s*' ..
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002132 'g:imported_abs = abs.exported\_s*' ..
Bram Moolenaarfbbcd002020-10-15 12:46:44 +02002133 '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
2134 '1 STOREG g:imported_abs\_s*' ..
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002135 'abs.exported = 8888\_s*' ..
Bram Moolenaarfbbcd002020-10-15 12:46:44 +02002136 '2 PUSHNR 8888\_s*' ..
2137 '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002138 'g:imported_after = abs.exported\_s*' ..
Bram Moolenaarfbbcd002020-10-15 12:46:44 +02002139 '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
2140 '5 STOREG g:imported_after',
Bram Moolenaare6085c52020-04-12 20:19:16 +02002141 g:import_disassembled)
Bram Moolenaarb3ca9822020-08-09 14:43:58 +02002142
2143 Undo_export_script_lines()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002144 unlet g:imported_abs
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +01002145 unlet g:import_disassembled
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002146
2147 delete('Ximport_abs.vim')
2148 delete('Xexport_abs.vim')
2149enddef
2150
2151def Test_import_rtp()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002152 var import_lines = [
Bram Moolenaare6085c52020-04-12 20:19:16 +02002153 'vim9script',
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002154 'import "Xexport_rtp.vim" as rtp',
2155 'g:imported_rtp = rtp.exported',
Bram Moolenaare6085c52020-04-12 20:19:16 +02002156 ]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002157 writefile(import_lines, 'Ximport_rtp.vim')
Bram Moolenaarb885a7c2021-07-08 22:02:11 +02002158 mkdir('import', 'p')
2159 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002160
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002161 var save_rtp = &rtp
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002162 &rtp = getcwd()
2163 source Ximport_rtp.vim
2164 &rtp = save_rtp
2165
2166 assert_equal(9876, g:imported_rtp)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002167
Bram Moolenaarb3ca9822020-08-09 14:43:58 +02002168 Undo_export_script_lines()
2169 unlet g:imported_rtp
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002170 delete('Ximport_rtp.vim')
Bram Moolenaarb885a7c2021-07-08 22:02:11 +02002171 delete('import', 'rf')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002172enddef
2173
Bram Moolenaar25e0f582020-05-25 22:36:50 +02002174def Test_import_compile_error()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002175 var export_lines = [
Bram Moolenaar25e0f582020-05-25 22:36:50 +02002176 'vim9script',
2177 'export def ExpFunc(): string',
2178 ' return notDefined',
2179 'enddef',
2180 ]
2181 writefile(export_lines, 'Xexported.vim')
2182
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002183 var import_lines = [
Bram Moolenaar25e0f582020-05-25 22:36:50 +02002184 'vim9script',
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002185 'import "./Xexported.vim" as expo',
Bram Moolenaar25e0f582020-05-25 22:36:50 +02002186 'def ImpFunc()',
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002187 ' echo expo.ExpFunc()',
Bram Moolenaar25e0f582020-05-25 22:36:50 +02002188 'enddef',
2189 'defcompile',
2190 ]
2191 writefile(import_lines, 'Ximport.vim')
2192
2193 try
2194 source Ximport.vim
2195 catch /E1001/
Dominique Pelle923dce22021-11-21 11:36:04 +00002196 # Error should be before the Xexported.vim file.
Bram Moolenaar77072282020-09-16 17:55:40 +02002197 assert_match('E1001: Variable not found: notDefined', v:exception)
Bram Moolenaar25e0f582020-05-25 22:36:50 +02002198 assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
2199 endtry
2200
2201 delete('Xexported.vim')
2202 delete('Ximport.vim')
2203enddef
2204
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02002205def Test_func_redefine_error()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002206 var lines = [
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02002207 'vim9script',
2208 'def Func()',
2209 ' eval [][0]',
2210 'enddef',
2211 'Func()',
2212 ]
2213 writefile(lines, 'Xtestscript.vim')
2214
2215 for count in range(3)
2216 try
2217 source Xtestscript.vim
2218 catch /E684/
2219 # function name should contain <SNR> every time
2220 assert_match('E684: list index out of range', v:exception)
2221 assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
2222 endtry
2223 endfor
2224
2225 delete('Xtestscript.vim')
2226enddef
2227
Bram Moolenaareef21022020-08-01 22:16:43 +02002228def Test_func_overrules_import_fails()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002229 var export_lines =<< trim END
Bram Moolenaareef21022020-08-01 22:16:43 +02002230 vim9script
2231 export def Func()
2232 echo 'imported'
2233 enddef
2234 END
2235 writefile(export_lines, 'XexportedFunc.vim')
2236
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002237 var lines =<< trim END
Bram Moolenaareef21022020-08-01 22:16:43 +02002238 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002239 import './XexportedFunc.vim' as Func
Bram Moolenaareef21022020-08-01 22:16:43 +02002240 def Func()
2241 echo 'local to function'
2242 enddef
2243 END
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002244 CheckScriptFailure(lines, 'E1236:')
Bram Moolenaareef21022020-08-01 22:16:43 +02002245
2246 lines =<< trim END
2247 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002248 import './XexportedFunc.vim' as Func
Bram Moolenaareef21022020-08-01 22:16:43 +02002249 def Outer()
2250 def Func()
2251 echo 'local to function'
2252 enddef
2253 enddef
2254 defcompile
2255 END
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002256 CheckScriptFailure(lines, 'E1236:')
Bram Moolenaareef21022020-08-01 22:16:43 +02002257
2258 delete('XexportedFunc.vim')
2259enddef
2260
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02002261def Test_func_redefine_fails()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002262 var lines =<< trim END
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02002263 vim9script
2264 def Func()
2265 echo 'one'
2266 enddef
2267 def Func()
2268 echo 'two'
2269 enddef
2270 END
2271 CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarfa211f32020-08-07 22:00:26 +02002272
2273 lines =<< trim END
2274 vim9script
2275 def Foo(): string
2276 return 'foo'
Bram Moolenaar052ff292021-12-11 13:54:46 +00002277 enddef
Bram Moolenaarfa211f32020-08-07 22:00:26 +02002278 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002279 var Foo = {-> 'lambda'}
Bram Moolenaarfa211f32020-08-07 22:00:26 +02002280 enddef
2281 defcompile
2282 END
2283 CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02002284enddef
2285
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002286def Test_fixed_size_list()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002287 # will be allocated as one piece of memory, check that changes work
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002288 var l = [1, 2, 3, 4]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002289 l->remove(0)
2290 l->add(5)
2291 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01002292 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002293enddef
2294
Bram Moolenaarae616492020-07-28 20:07:27 +02002295def Test_no_insert_xit()
Bram Moolenaard2c61702020-09-06 15:58:36 +02002296 CheckDefExecFailure(['a = 1'], 'E1100:')
2297 CheckDefExecFailure(['c = 1'], 'E1100:')
2298 CheckDefExecFailure(['i = 1'], 'E1100:')
2299 CheckDefExecFailure(['t = 1'], 'E1100:')
2300 CheckDefExecFailure(['x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02002301
Bram Moolenaarae616492020-07-28 20:07:27 +02002302 CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
2303 CheckScriptFailure(['vim9script', 'a'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02002304 CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
2305 CheckScriptFailure(['vim9script', 'c'], 'E1100:')
Bram Moolenaarf5a48012020-08-01 17:00:03 +02002306 CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
2307 CheckScriptFailure(['vim9script', 'i'], 'E1100:')
Bram Moolenaar65088802021-03-13 21:07:21 +01002308 CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
2309 CheckScriptFailure(['vim9script', 'o'], 'E1100:')
Bram Moolenaarf5a48012020-08-01 17:00:03 +02002310 CheckScriptFailure(['vim9script', 't'], 'E1100:')
2311 CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
2312 CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02002313enddef
2314
Bram Moolenaar158906c2020-02-06 20:39:45 +01002315def IfElse(what: number): string
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002316 var res = ''
Bram Moolenaar158906c2020-02-06 20:39:45 +01002317 if what == 1
2318 res = "one"
2319 elseif what == 2
2320 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01002321 else
Bram Moolenaar158906c2020-02-06 20:39:45 +01002322 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01002323 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +01002324 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +01002325enddef
2326
Bram Moolenaar158906c2020-02-06 20:39:45 +01002327def Test_if_elseif_else()
2328 assert_equal('one', IfElse(1))
2329 assert_equal('two', IfElse(2))
2330 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01002331enddef
2332
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002333def Test_if_elseif_else_fails()
Bram Moolenaard2c61702020-09-06 15:58:36 +02002334 CheckDefFailure(['elseif true'], 'E582:')
2335 CheckDefFailure(['else'], 'E581:')
2336 CheckDefFailure(['endif'], 'E580:')
Bram Moolenaarced68a02021-01-24 17:53:47 +01002337 CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
Bram Moolenaard2c61702020-09-06 15:58:36 +02002338 CheckDefFailure(['if true', 'echo 1'], 'E171:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01002339
2340 var lines =<< trim END
2341 var s = ''
2342 if s = ''
2343 endif
2344 END
2345 CheckDefFailure(lines, 'E488:')
2346
2347 lines =<< trim END
2348 var s = ''
2349 if s == ''
2350 elseif s = ''
2351 endif
2352 END
2353 CheckDefFailure(lines, 'E488:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002354enddef
2355
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002356let g:bool_true = v:true
2357let g:bool_false = v:false
2358
2359def Test_if_const_expr()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002360 var res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002361 if true ? true : false
2362 res = true
2363 endif
2364 assert_equal(true, res)
2365
Bram Moolenaar585fea72020-04-02 22:33:21 +02002366 g:glob = 2
2367 if false
Bram Moolenaar67979662020-06-20 22:50:47 +02002368 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02002369 endif
2370 assert_equal(2, g:glob)
2371 if true
Bram Moolenaar67979662020-06-20 22:50:47 +02002372 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02002373 endif
2374 assert_equal(3, g:glob)
2375
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002376 res = false
2377 if g:bool_true ? true : false
2378 res = true
2379 endif
2380 assert_equal(true, res)
2381
2382 res = false
2383 if true ? g:bool_true : false
2384 res = true
2385 endif
2386 assert_equal(true, res)
2387
2388 res = false
2389 if true ? true : g:bool_false
2390 res = true
2391 endif
2392 assert_equal(true, res)
2393
2394 res = false
2395 if true ? false : true
2396 res = true
2397 endif
2398 assert_equal(false, res)
2399
2400 res = false
2401 if false ? false : true
2402 res = true
2403 endif
2404 assert_equal(true, res)
2405
2406 res = false
2407 if false ? true : false
2408 res = true
2409 endif
2410 assert_equal(false, res)
2411
2412 res = false
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002413 if has('xyz') ? true : false
2414 res = true
2415 endif
2416 assert_equal(false, res)
2417
2418 res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002419 if true && true
2420 res = true
2421 endif
2422 assert_equal(true, res)
2423
2424 res = false
2425 if true && false
2426 res = true
2427 endif
2428 assert_equal(false, res)
2429
2430 res = false
2431 if g:bool_true && false
2432 res = true
2433 endif
2434 assert_equal(false, res)
2435
2436 res = false
2437 if true && g:bool_false
2438 res = true
2439 endif
2440 assert_equal(false, res)
2441
2442 res = false
2443 if false && false
2444 res = true
2445 endif
2446 assert_equal(false, res)
2447
2448 res = false
2449 if true || false
2450 res = true
2451 endif
2452 assert_equal(true, res)
2453
2454 res = false
2455 if g:bool_true || false
2456 res = true
2457 endif
2458 assert_equal(true, res)
2459
2460 res = false
2461 if true || g:bool_false
2462 res = true
2463 endif
2464 assert_equal(true, res)
2465
2466 res = false
2467 if false || false
2468 res = true
2469 endif
2470 assert_equal(false, res)
Bram Moolenaar3988f642020-08-27 22:43:03 +02002471
2472 # with constant "false" expression may be invalid so long as the syntax is OK
Bram Moolenaarc3235272021-07-10 19:42:03 +02002473 if false | eval 1 + 2 | endif
Bram Moolenaar3988f642020-08-27 22:43:03 +02002474 if false | eval burp + 234 | endif
2475 if false | echo burp 234 'asd' | endif
2476 if false
2477 burp
2478 endif
Bram Moolenaare525bdd2021-08-07 18:12:40 +02002479
2480 # expression with line breaks skipped
2481 if false
2482 ('aaa'
2483 .. 'bbb'
2484 .. 'ccc'
2485 )->setline(1)
2486 endif
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02002487enddef
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002488
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02002489def Test_if_const_expr_fails()
Bram Moolenaard2c61702020-09-06 15:58:36 +02002490 CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2491 CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2492 CheckDefFailure(["if has('aaa'"], 'E110:')
2493 CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002494enddef
2495
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002496def RunNested(i: number): number
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002497 var x: number = 0
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002498 if i % 2
2499 if 1
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002500 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002501 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002502 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002503 endif
2504 x += 1
2505 else
2506 x += 1000
2507 endif
2508 return x
2509enddef
2510
2511def Test_nested_if()
2512 assert_equal(1, RunNested(1))
2513 assert_equal(1000, RunNested(2))
2514enddef
2515
Bram Moolenaarad39c092020-02-26 18:23:43 +01002516def Test_execute_cmd()
Bram Moolenaare4984292020-12-13 14:19:25 +01002517 # missing argument is ignored
2518 execute
2519 execute # comment
2520
Bram Moolenaarad39c092020-02-26 18:23:43 +01002521 new
2522 setline(1, 'default')
Bram Moolenaard2c61702020-09-06 15:58:36 +02002523 execute 'setline(1, "execute-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002524 assert_equal('execute-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002525
Bram Moolenaard2c61702020-09-06 15:58:36 +02002526 execute "setline(1, 'execute-string')"
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002527 assert_equal('execute-string', getline(1))
2528
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002529 var cmd1 = 'setline(1,'
2530 var cmd2 = '"execute-var")'
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002531 execute cmd1 cmd2 # comment
Bram Moolenaarad39c092020-02-26 18:23:43 +01002532 assert_equal('execute-var', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002533
Bram Moolenaard2c61702020-09-06 15:58:36 +02002534 execute cmd1 cmd2 '|setline(1, "execute-var-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002535 assert_equal('execute-var-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002536
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002537 var cmd_first = 'call '
2538 var cmd_last = 'setline(1, "execute-var-var")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002539 execute cmd_first .. cmd_last
2540 assert_equal('execute-var-var', getline(1))
2541 bwipe!
Bram Moolenaar585fea72020-04-02 22:33:21 +02002542
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002543 var n = true
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02002544 execute 'echomsg' (n ? '"true"' : '"no"')
2545 assert_match('^true$', Screenline(&lines))
2546
Bram Moolenaare0de1712020-12-02 17:36:54 +01002547 echomsg [1, 2, 3] {a: 1, b: 2}
Bram Moolenaare5abf7a2020-08-16 18:29:35 +02002548 assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2549
Bram Moolenaard2c61702020-09-06 15:58:36 +02002550 CheckDefFailure(['execute xxx'], 'E1001:', 1)
2551 CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2552 CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
Bram Moolenaarad39c092020-02-26 18:23:43 +01002553enddef
2554
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002555def Test_execute_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002556 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002557 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002558 vim9script
2559 execute 'g:someVar'
2560 .. ' = ' ..
2561 '28'
2562 assert_equal(28, g:someVar)
2563 unlet g:someVar
2564 END
2565 CheckScriptSuccess(lines)
2566enddef
2567
Bram Moolenaarad39c092020-02-26 18:23:43 +01002568def Test_echo_cmd()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002569 echo 'some' # comment
Bram Moolenaar585fea72020-04-02 22:33:21 +02002570 echon 'thing'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002571 assert_match('^something$', Screenline(&lines))
2572
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002573 echo "some" # comment
2574 echon "thing"
2575 assert_match('^something$', Screenline(&lines))
2576
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002577 var str1 = 'some'
2578 var str2 = 'more'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002579 echo str1 str2
2580 assert_match('^some more$', Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002581
Bram Moolenaard2c61702020-09-06 15:58:36 +02002582 CheckDefFailure(['echo "xxx"# comment'], 'E488:')
Bram Moolenaarad39c092020-02-26 18:23:43 +01002583enddef
2584
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002585def Test_echomsg_cmd()
2586 echomsg 'some' 'more' # comment
2587 assert_match('^some more$', Screenline(&lines))
2588 echo 'clear'
Bram Moolenaardf069ee2020-06-22 23:02:51 +02002589 :1messages
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002590 assert_match('^some more$', Screenline(&lines))
2591
Bram Moolenaard2c61702020-09-06 15:58:36 +02002592 CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002593enddef
2594
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002595def Test_echomsg_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002596 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002597 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002598 vim9script
2599 echomsg 'here'
2600 .. ' is ' ..
2601 'a message'
2602 assert_match('^here is a message$', Screenline(&lines))
2603 END
2604 CheckScriptSuccess(lines)
2605enddef
2606
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002607def Test_echoerr_cmd()
Bram Moolenaar7de62622021-08-07 15:05:47 +02002608 var local = 'local'
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002609 try
Bram Moolenaar7de62622021-08-07 15:05:47 +02002610 echoerr 'something' local 'wrong' # comment
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002611 catch
Bram Moolenaar7de62622021-08-07 15:05:47 +02002612 assert_match('something local wrong', v:exception)
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002613 endtry
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002614enddef
2615
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002616def Test_echoerr_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002617 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002618 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002619 vim9script
2620 try
2621 echoerr 'this'
2622 .. ' is ' ..
2623 'wrong'
2624 catch
2625 assert_match('this is wrong', v:exception)
2626 endtry
2627 END
2628 CheckScriptSuccess(lines)
2629enddef
2630
Bram Moolenaar7de62622021-08-07 15:05:47 +02002631def Test_echoconsole_cmd()
2632 var local = 'local'
2633 echoconsole 'something' local # comment
2634 # output goes anywhere
2635enddef
2636
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002637def Test_for_outside_of_function()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002638 var lines =<< trim END
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002639 vim9script
2640 new
2641 for var in range(0, 3)
2642 append(line('$'), var)
2643 endfor
2644 assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
2645 bwipe!
Bram Moolenaar522eefd2021-03-26 18:49:22 +01002646
2647 var result = ''
2648 for i in [1, 2, 3]
2649 var loop = ' loop ' .. i
2650 result ..= loop
2651 endfor
2652 assert_equal(' loop 1 loop 2 loop 3', result)
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002653 END
2654 writefile(lines, 'Xvim9for.vim')
2655 source Xvim9for.vim
2656 delete('Xvim9for.vim')
2657enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002658
rbtnnbebf0692021-08-21 17:26:50 +02002659def Test_for_skipped_block()
2660 # test skipped blocks at outside of function
2661 var lines =<< trim END
2662 var result = []
2663 if true
2664 for n in [1, 2]
2665 result += [n]
2666 endfor
2667 else
2668 for n in [3, 4]
2669 result += [n]
2670 endfor
2671 endif
2672 assert_equal([1, 2], result)
2673
2674 result = []
2675 if false
2676 for n in [1, 2]
2677 result += [n]
2678 endfor
2679 else
2680 for n in [3, 4]
2681 result += [n]
2682 endfor
2683 endif
2684 assert_equal([3, 4], result)
2685 END
2686 CheckDefAndScriptSuccess(lines)
2687
2688 # test skipped blocks at inside of function
2689 lines =<< trim END
2690 def DefTrue()
2691 var result = []
2692 if true
2693 for n in [1, 2]
2694 result += [n]
2695 endfor
2696 else
2697 for n in [3, 4]
2698 result += [n]
2699 endfor
2700 endif
2701 assert_equal([1, 2], result)
2702 enddef
2703 DefTrue()
2704
2705 def DefFalse()
2706 var result = []
2707 if false
2708 for n in [1, 2]
2709 result += [n]
2710 endfor
2711 else
2712 for n in [3, 4]
2713 result += [n]
2714 endfor
2715 endif
2716 assert_equal([3, 4], result)
2717 enddef
2718 DefFalse()
2719 END
2720 CheckDefAndScriptSuccess(lines)
2721enddef
2722
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002723def Test_for_loop()
Bram Moolenaarf2253962021-04-13 20:53:13 +02002724 var lines =<< trim END
2725 var result = ''
2726 for cnt in range(7)
2727 if cnt == 4
2728 break
2729 endif
2730 if cnt == 2
2731 continue
2732 endif
2733 result ..= cnt .. '_'
2734 endfor
2735 assert_equal('0_1_3_', result)
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02002736
Bram Moolenaarf2253962021-04-13 20:53:13 +02002737 var concat = ''
2738 for str in eval('["one", "two"]')
2739 concat ..= str
2740 endfor
2741 assert_equal('onetwo', concat)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002742
Bram Moolenaarf2253962021-04-13 20:53:13 +02002743 var total = 0
2744 for nr in
2745 [1, 2, 3]
2746 total += nr
2747 endfor
2748 assert_equal(6, total)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002749
Bram Moolenaarf2253962021-04-13 20:53:13 +02002750 total = 0
2751 for nr
2752 in [1, 2, 3]
2753 total += nr
2754 endfor
2755 assert_equal(6, total)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002756
Bram Moolenaarf2253962021-04-13 20:53:13 +02002757 total = 0
2758 for nr
2759 in
2760 [1, 2, 3]
2761 total += nr
2762 endfor
2763 assert_equal(6, total)
Bram Moolenaar036d0712021-01-17 20:23:38 +01002764
Bram Moolenaara3589a02021-04-14 13:30:46 +02002765 # with type
2766 total = 0
2767 for n: number in [1, 2, 3]
2768 total += n
2769 endfor
2770 assert_equal(6, total)
2771
Bram Moolenaarfe090eb2021-04-15 21:48:32 +02002772 var chars = ''
2773 for s: string in 'foobar'
2774 chars ..= s
2775 endfor
2776 assert_equal('foobar', chars)
2777
Bram Moolenaar5ede5b22021-07-07 21:55:25 +02002778 chars = ''
2779 for x: string in {a: 'a', b: 'b'}->values()
2780 chars ..= x
2781 endfor
2782 assert_equal('ab', chars)
2783
Bram Moolenaara3589a02021-04-14 13:30:46 +02002784 # unpack with type
Bram Moolenaarf2253962021-04-13 20:53:13 +02002785 var res = ''
Bram Moolenaara3589a02021-04-14 13:30:46 +02002786 for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2787 res ..= n .. s
2788 endfor
2789 assert_equal('1a2b', res)
2790
Bram Moolenaar444d8782021-06-26 12:40:56 +02002791 # unpack with one var
2792 var reslist = []
2793 for [x] in [['aaa'], ['bbb']]
2794 reslist->add(x)
2795 endfor
2796 assert_equal(['aaa', 'bbb'], reslist)
2797
Bram Moolenaara3589a02021-04-14 13:30:46 +02002798 # loop over string
2799 res = ''
Bram Moolenaarf2253962021-04-13 20:53:13 +02002800 for c in 'aéc̀d'
2801 res ..= c .. '-'
2802 endfor
2803 assert_equal('a-é-c̀-d-', res)
2804
2805 res = ''
2806 for c in ''
2807 res ..= c .. '-'
2808 endfor
2809 assert_equal('', res)
2810
2811 res = ''
2812 for c in test_null_string()
2813 res ..= c .. '-'
2814 endfor
2815 assert_equal('', res)
2816
2817 var foo: list<dict<any>> = [
2818 {a: 'Cat'}
2819 ]
2820 for dd in foo
2821 dd.counter = 12
2822 endfor
2823 assert_equal([{a: 'Cat', counter: 12}], foo)
Bram Moolenaarad2d4962021-07-18 17:08:50 +02002824
2825 reslist = []
2826 for _ in range(3)
2827 reslist->add('x')
2828 endfor
2829 assert_equal(['x', 'x', 'x'], reslist)
Bram Moolenaarf2253962021-04-13 20:53:13 +02002830 END
2831 CheckDefAndScriptSuccess(lines)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002832enddef
2833
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002834def Test_for_loop_with_closure()
2835 var lines =<< trim END
2836 var flist: list<func>
2837 for i in range(5)
2838 var inloop = i
2839 flist[i] = () => inloop
2840 endfor
2841 for i in range(5)
2842 assert_equal(4, flist[i]())
2843 endfor
2844 END
2845 CheckDefAndScriptSuccess(lines)
2846
2847 lines =<< trim END
2848 var flist: list<func>
2849 for i in range(5)
2850 var inloop = i
2851 flist[i] = () => {
2852 return inloop
2853 }
2854 endfor
2855 for i in range(5)
2856 assert_equal(4, flist[i]())
2857 endfor
2858 END
2859 CheckDefAndScriptSuccess(lines)
2860enddef
2861
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002862def Test_for_loop_fails()
Bram Moolenaar86b3ab42021-12-19 18:33:23 +00002863 CheckDefAndScriptFailure(['for '], ['E1097:', 'E690:'])
2864 CheckDefAndScriptFailure(['for x'], ['E1097:', 'E690:'])
2865 CheckDefAndScriptFailure(['for x in'], ['E1097:', 'E15:'])
Bram Moolenaar442b29c2021-07-05 22:23:00 +02002866 CheckDefAndScriptFailure(['for # in range(5)'], 'E690:')
2867 CheckDefAndScriptFailure(['for i In range(5)'], 'E690:')
Bram Moolenaar86b3ab42021-12-19 18:33:23 +00002868 CheckDefAndScriptFailure(['var x = 5', 'for x in range(5)', 'endfor'], ['E1017:', 'E1041:'])
Bram Moolenaard4ab8072021-07-08 19:22:12 +02002869 CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3)
Bram Moolenaar822ba242020-05-24 23:00:18 +02002870 CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01002871 delfunc! g:Func
Bram Moolenaar675f7162020-04-12 22:53:54 +02002872 CheckDefFailure(['for i in xxx'], 'E1001:')
2873 CheckDefFailure(['endfor'], 'E588:')
2874 CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002875
2876 # wrong type detected at compile time
2877 CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
2878
2879 # wrong type detected at runtime
2880 g:adict = {a: 1}
2881 CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
2882 unlet g:adict
Bram Moolenaarf6a8d422021-04-13 21:48:03 +02002883
2884 var lines =<< trim END
2885 var d: list<dict<any>> = [{a: 0}]
2886 for e in d
2887 e = {a: 0, b: ''}
2888 endfor
2889 END
Bram Moolenaar86b3ab42021-12-19 18:33:23 +00002890 CheckDefAndScriptFailure(lines, ['E1018:', 'E46:'], 3)
Bram Moolenaarfe090eb2021-04-15 21:48:32 +02002891
2892 lines =<< trim END
2893 for nr: number in ['foo']
2894 endfor
2895 END
2896 CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
Bram Moolenaar404557e2021-07-05 21:41:48 +02002897
2898 lines =<< trim END
2899 for n : number in [1, 2]
2900 echo n
2901 endfor
2902 END
2903 CheckDefAndScriptFailure(lines, 'E1059:', 1)
Bram Moolenaarefc5db52021-07-07 21:21:30 +02002904
2905 lines =<< trim END
2906 var d: dict<number> = {a: 1, b: 2}
2907 for [k: job, v: job] in d->items()
2908 echo k v
2909 endfor
2910 END
2911 CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected job but got string', 2)
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002912
2913 lines =<< trim END
2914 var i = 0
2915 for i in [1, 2, 3]
2916 echo i
2917 endfor
2918 END
Bram Moolenaar86b3ab42021-12-19 18:33:23 +00002919 CheckDefExecAndScriptFailure(lines, ['E1017:', 'E1041:'])
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002920
2921 lines =<< trim END
2922 var l = [0]
2923 for l[0] in [1, 2, 3]
2924 echo l[0]
2925 endfor
2926 END
Bram Moolenaar86b3ab42021-12-19 18:33:23 +00002927 CheckDefExecAndScriptFailure(lines, ['E461:', 'E1017:'])
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002928
2929 lines =<< trim END
2930 var d = {x: 0}
2931 for d.x in [1, 2, 3]
2932 echo d.x
2933 endfor
2934 END
Bram Moolenaar86b3ab42021-12-19 18:33:23 +00002935 CheckDefExecAndScriptFailure(lines, ['E461:', 'E1017:'])
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002936enddef
2937
Bram Moolenaarea870692020-12-02 14:24:30 +01002938def Test_for_loop_script_var()
2939 # cannot use s:var in a :def function
Bram Moolenaara99fb232021-12-20 12:25:03 +00002940 CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1254:')
Bram Moolenaarea870692020-12-02 14:24:30 +01002941
2942 # can use s:var in Vim9 script, with or without s:
2943 var lines =<< trim END
2944 vim9script
2945 var total = 0
2946 for s:var in [1, 2, 3]
2947 total += s:var
2948 endfor
2949 assert_equal(6, total)
2950
2951 total = 0
2952 for var in [1, 2, 3]
2953 total += var
2954 endfor
2955 assert_equal(6, total)
2956 END
2957enddef
2958
Bram Moolenaar792f7862020-11-23 08:31:18 +01002959def Test_for_loop_unpack()
Bram Moolenaar792f7862020-11-23 08:31:18 +01002960 var lines =<< trim END
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002961 var result = []
2962 for [v1, v2] in [[1, 2], [3, 4]]
2963 result->add(v1)
2964 result->add(v2)
2965 endfor
2966 assert_equal([1, 2, 3, 4], result)
2967
2968 result = []
2969 for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2970 result->add(v1)
2971 result->add(v2)
2972 result->add(v3)
2973 endfor
2974 assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2975
2976 result = []
2977 for [&ts, &sw] in [[1, 2], [3, 4]]
2978 result->add(&ts)
2979 result->add(&sw)
2980 endfor
2981 assert_equal([1, 2, 3, 4], result)
2982
2983 var slist: list<string>
2984 for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
2985 slist->add($LOOPVAR)
2986 slist->add(@r)
2987 slist->add(v:errmsg)
2988 endfor
2989 assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
2990
2991 slist = []
2992 for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
2993 slist->add(g:globalvar)
2994 slist->add(b:bufvar)
2995 slist->add(w:winvar)
2996 slist->add(t:tabvar)
2997 endfor
2998 assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
Bram Moolenaarf6c177a2020-12-04 17:38:00 +01002999 unlet! g:globalvar b:bufvar w:winvar t:tabvar
Bram Moolenaarb777da92021-05-22 21:40:39 +02003000
3001 var res = []
3002 for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
3003 res->add(n)
3004 endfor
3005 assert_equal([2, 5], res)
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01003006 END
3007 CheckDefAndScriptSuccess(lines)
3008
3009 lines =<< trim END
Bram Moolenaar792f7862020-11-23 08:31:18 +01003010 for [v1, v2] in [[1, 2, 3], [3, 4]]
3011 echo v1 v2
3012 endfor
3013 END
3014 CheckDefExecFailure(lines, 'E710:', 1)
3015
3016 lines =<< trim END
3017 for [v1, v2] in [[1], [3, 4]]
3018 echo v1 v2
3019 endfor
3020 END
3021 CheckDefExecFailure(lines, 'E711:', 1)
3022
3023 lines =<< trim END
3024 for [v1, v1] in [[1, 2], [3, 4]]
3025 echo v1
3026 endfor
3027 END
3028 CheckDefExecFailure(lines, 'E1017:', 1)
3029enddef
3030
Bram Moolenaarc150c092021-02-13 15:02:46 +01003031def Test_for_loop_with_try_continue()
Bram Moolenaarf2253962021-04-13 20:53:13 +02003032 var lines =<< trim END
3033 var looped = 0
3034 var cleanup = 0
3035 for i in range(3)
3036 looped += 1
3037 try
3038 eval [][0]
3039 catch
3040 continue
3041 finally
3042 cleanup += 1
3043 endtry
3044 endfor
3045 assert_equal(3, looped)
3046 assert_equal(3, cleanup)
3047 END
3048 CheckDefAndScriptSuccess(lines)
Bram Moolenaarc150c092021-02-13 15:02:46 +01003049enddef
3050
rbtnnd895b1d2021-08-20 20:54:25 +02003051def Test_while_skipped_block()
3052 # test skipped blocks at outside of function
3053 var lines =<< trim END
3054 var result = []
3055 var n = 0
3056 if true
3057 n = 1
3058 while n < 3
3059 result += [n]
3060 n += 1
3061 endwhile
3062 else
3063 n = 3
3064 while n < 5
3065 result += [n]
3066 n += 1
3067 endwhile
3068 endif
3069 assert_equal([1, 2], result)
3070
3071 result = []
3072 if false
3073 n = 1
3074 while n < 3
3075 result += [n]
3076 n += 1
3077 endwhile
3078 else
3079 n = 3
3080 while n < 5
3081 result += [n]
3082 n += 1
3083 endwhile
3084 endif
3085 assert_equal([3, 4], result)
3086 END
3087 CheckDefAndScriptSuccess(lines)
3088
3089 # test skipped blocks at inside of function
3090 lines =<< trim END
3091 def DefTrue()
3092 var result = []
3093 var n = 0
3094 if true
3095 n = 1
3096 while n < 3
3097 result += [n]
3098 n += 1
3099 endwhile
3100 else
3101 n = 3
3102 while n < 5
3103 result += [n]
3104 n += 1
3105 endwhile
3106 endif
3107 assert_equal([1, 2], result)
3108 enddef
3109 DefTrue()
3110
3111 def DefFalse()
3112 var result = []
3113 var n = 0
3114 if false
3115 n = 1
3116 while n < 3
3117 result += [n]
3118 n += 1
3119 endwhile
3120 else
3121 n = 3
3122 while n < 5
3123 result += [n]
3124 n += 1
3125 endwhile
3126 endif
3127 assert_equal([3, 4], result)
3128 enddef
3129 DefFalse()
3130 END
3131 CheckDefAndScriptSuccess(lines)
3132enddef
3133
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003134def Test_while_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003135 var result = ''
3136 var cnt = 0
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003137 while cnt < 555
3138 if cnt == 3
3139 break
3140 endif
3141 cnt += 1
3142 if cnt == 2
3143 continue
3144 endif
3145 result ..= cnt .. '_'
3146 endwhile
3147 assert_equal('1_3_', result)
Bram Moolenaardee37dc2021-02-07 16:40:05 +01003148
3149 var s = ''
Bram Moolenaar4b3e1962021-03-18 21:37:55 +01003150 while s == 'x' # {comment}
Bram Moolenaardee37dc2021-02-07 16:40:05 +01003151 endwhile
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003152enddef
3153
Bram Moolenaar7a53f292021-11-22 18:31:02 +00003154def Test_while_loop_in_script()
3155 var lines =<< trim END
3156 vim9script
3157 var result = ''
3158 var cnt = 0
3159 while cnt < 3
3160 var s = 'v' .. cnt
3161 result ..= s
3162 cnt += 1
3163 endwhile
3164 assert_equal('v0v1v2', result)
3165 END
3166 CheckScriptSuccess(lines)
3167enddef
3168
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02003169def Test_while_loop_fails()
Bram Moolenaar675f7162020-04-12 22:53:54 +02003170 CheckDefFailure(['while xxx'], 'E1001:')
3171 CheckDefFailure(['endwhile'], 'E588:')
3172 CheckDefFailure(['continue'], 'E586:')
3173 CheckDefFailure(['if true', 'continue'], 'E586:')
3174 CheckDefFailure(['break'], 'E587:')
3175 CheckDefFailure(['if true', 'break'], 'E587:')
3176 CheckDefFailure(['while 1', 'echo 3'], 'E170:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01003177
3178 var lines =<< trim END
3179 var s = ''
3180 while s = ''
3181 endwhile
3182 END
3183 CheckDefFailure(lines, 'E488:')
Bram Moolenaarbd5da372020-03-31 23:13:10 +02003184enddef
3185
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01003186def Test_interrupt_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003187 var caught = false
3188 var x = 0
Bram Moolenaar97acfc72020-03-22 13:44:28 +01003189 try
3190 while 1
3191 x += 1
3192 if x == 100
3193 feedkeys("\<C-C>", 'Lt')
3194 endif
3195 endwhile
3196 catch
3197 caught = true
3198 assert_equal(100, x)
3199 endtry
3200 assert_true(caught, 'should have caught an exception')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02003201 # consume the CTRL-C
3202 getchar(0)
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01003203enddef
Bram Moolenaar20431c92020-03-20 18:39:46 +01003204
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003205def Test_automatic_line_continuation()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003206 var mylist = [
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003207 'one',
3208 'two',
3209 'three',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003210 ] # comment
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003211 assert_equal(['one', 'two', 'three'], mylist)
3212
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003213 var mydict = {
Bram Moolenaare0de1712020-12-02 17:36:54 +01003214 ['one']: 1,
3215 ['two']: 2,
3216 ['three']:
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003217 3,
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003218 } # comment
Bram Moolenaare0de1712020-12-02 17:36:54 +01003219 assert_equal({one: 1, two: 2, three: 3}, mydict)
3220 mydict = {
Bram Moolenaar2c330432020-04-13 14:41:35 +02003221 one: 1, # comment
3222 two: # comment
3223 2, # comment
3224 three: 3 # comment
3225 }
Bram Moolenaare0de1712020-12-02 17:36:54 +01003226 assert_equal({one: 1, two: 2, three: 3}, mydict)
3227 mydict = {
Bram Moolenaar2c330432020-04-13 14:41:35 +02003228 one: 1,
3229 two:
3230 2,
3231 three: 3
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003232 }
Bram Moolenaare0de1712020-12-02 17:36:54 +01003233 assert_equal({one: 1, two: 2, three: 3}, mydict)
Bram Moolenaare6085c52020-04-12 20:19:16 +02003234
3235 assert_equal(
3236 ['one', 'two', 'three'],
3237 split('one two three')
3238 )
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003239enddef
3240
Bram Moolenaar7a092242020-04-16 22:10:49 +02003241def Test_vim9_comment()
3242 CheckScriptSuccess([
3243 'vim9script',
3244 '# something',
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003245 '#something',
3246 '#{something',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003247 ])
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003248
3249 split Xfile
3250 CheckScriptSuccess([
3251 'vim9script',
3252 'edit #something',
3253 ])
3254 CheckScriptSuccess([
3255 'vim9script',
3256 'edit #{something',
3257 ])
3258 close
3259
Bram Moolenaar7a092242020-04-16 22:10:49 +02003260 CheckScriptFailure([
3261 'vim9script',
3262 ':# something',
3263 ], 'E488:')
3264 CheckScriptFailure([
3265 '# something',
3266 ], 'E488:')
3267 CheckScriptFailure([
3268 ':# something',
3269 ], 'E488:')
3270
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003271 { # block start
3272 } # block end
3273 CheckDefFailure([
3274 '{# comment',
3275 ], 'E488:')
3276 CheckDefFailure([
3277 '{',
3278 '}# comment',
3279 ], 'E488:')
3280
3281 echo "yes" # comment
3282 CheckDefFailure([
3283 'echo "yes"# comment',
3284 ], 'E488:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02003285 CheckScriptSuccess([
3286 'vim9script',
3287 'echo "yes" # something',
3288 ])
3289 CheckScriptFailure([
3290 'vim9script',
3291 'echo "yes"# something',
3292 ], 'E121:')
3293 CheckScriptFailure([
3294 'vim9script',
3295 'echo# something',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003296 ], 'E1144:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02003297 CheckScriptFailure([
3298 'echo "yes" # something',
3299 ], 'E121:')
3300
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003301 exe "echo" # comment
3302 CheckDefFailure([
3303 'exe "echo"# comment',
3304 ], 'E488:')
3305 CheckScriptSuccess([
3306 'vim9script',
3307 'exe "echo" # something',
3308 ])
3309 CheckScriptFailure([
3310 'vim9script',
3311 'exe "echo"# something',
3312 ], 'E121:')
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003313 CheckScriptFailure([
3314 'vim9script',
3315 'exe# something',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003316 ], 'E1144:')
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003317 CheckScriptFailure([
3318 'exe "echo" # something',
3319 ], 'E121:')
3320
Bram Moolenaar7a092242020-04-16 22:10:49 +02003321 CheckDefFailure([
3322 'try# comment',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003323 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003324 'catch',
3325 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003326 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003327 CheckScriptFailure([
3328 'vim9script',
3329 'try# comment',
3330 'echo "yes"',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003331 ], 'E1144:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02003332 CheckDefFailure([
3333 'try',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003334 ' throw#comment',
3335 'catch',
3336 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003337 ], 'E1144:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003338 CheckDefFailure([
3339 'try',
3340 ' throw "yes"#comment',
3341 'catch',
3342 'endtry',
3343 ], 'E488:')
3344 CheckDefFailure([
3345 'try',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003346 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003347 'catch# comment',
3348 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003349 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003350 CheckScriptFailure([
3351 'vim9script',
3352 'try',
3353 ' echo "yes"',
3354 'catch# comment',
3355 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003356 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003357 CheckDefFailure([
3358 'try',
3359 ' echo "yes"',
3360 'catch /pat/# comment',
3361 'endtry',
3362 ], 'E488:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02003363 CheckDefFailure([
3364 'try',
3365 'echo "yes"',
3366 'catch',
3367 'endtry# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003368 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003369 CheckScriptFailure([
3370 'vim9script',
3371 'try',
3372 ' echo "yes"',
3373 'catch',
3374 'endtry# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003375 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003376
3377 CheckScriptSuccess([
3378 'vim9script',
3379 'hi # comment',
3380 ])
3381 CheckScriptFailure([
3382 'vim9script',
3383 'hi# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003384 ], 'E1144:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02003385 CheckScriptSuccess([
3386 'vim9script',
3387 'hi Search # comment',
3388 ])
3389 CheckScriptFailure([
3390 'vim9script',
3391 'hi Search# comment',
3392 ], 'E416:')
3393 CheckScriptSuccess([
3394 'vim9script',
3395 'hi link This Search # comment',
3396 ])
3397 CheckScriptFailure([
3398 'vim9script',
3399 'hi link This That# comment',
3400 ], 'E413:')
3401 CheckScriptSuccess([
3402 'vim9script',
3403 'hi clear This # comment',
3404 'hi clear # comment',
3405 ])
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003406 # not tested, because it doesn't give an error but a warning:
3407 # hi clear This# comment',
Bram Moolenaar1966c242020-04-20 22:42:32 +02003408 CheckScriptFailure([
3409 'vim9script',
3410 'hi clear# comment',
3411 ], 'E416:')
3412
3413 CheckScriptSuccess([
3414 'vim9script',
3415 'hi Group term=bold',
3416 'match Group /todo/ # comment',
3417 ])
3418 CheckScriptFailure([
3419 'vim9script',
3420 'hi Group term=bold',
3421 'match Group /todo/# comment',
3422 ], 'E488:')
3423 CheckScriptSuccess([
3424 'vim9script',
3425 'match # comment',
3426 ])
3427 CheckScriptFailure([
3428 'vim9script',
3429 'match# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003430 ], 'E1144:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02003431 CheckScriptSuccess([
3432 'vim9script',
3433 'match none # comment',
3434 ])
3435 CheckScriptFailure([
3436 'vim9script',
3437 'match none# comment',
3438 ], 'E475:')
3439
3440 CheckScriptSuccess([
3441 'vim9script',
3442 'menutrans clear # comment',
3443 ])
3444 CheckScriptFailure([
3445 'vim9script',
3446 'menutrans clear# comment text',
3447 ], 'E474:')
3448
3449 CheckScriptSuccess([
3450 'vim9script',
3451 'syntax clear # comment',
3452 ])
3453 CheckScriptFailure([
3454 'vim9script',
3455 'syntax clear# comment text',
3456 ], 'E28:')
3457 CheckScriptSuccess([
3458 'vim9script',
3459 'syntax keyword Word some',
3460 'syntax clear Word # comment',
3461 ])
3462 CheckScriptFailure([
3463 'vim9script',
3464 'syntax keyword Word some',
3465 'syntax clear Word# comment text',
3466 ], 'E28:')
3467
3468 CheckScriptSuccess([
3469 'vim9script',
3470 'syntax list # comment',
3471 ])
3472 CheckScriptFailure([
3473 'vim9script',
3474 'syntax list# comment text',
3475 ], 'E28:')
3476
3477 CheckScriptSuccess([
3478 'vim9script',
3479 'syntax match Word /pat/ oneline # comment',
3480 ])
3481 CheckScriptFailure([
3482 'vim9script',
3483 'syntax match Word /pat/ oneline# comment',
3484 ], 'E475:')
3485
3486 CheckScriptSuccess([
3487 'vim9script',
3488 'syntax keyword Word word # comm[ent',
3489 ])
3490 CheckScriptFailure([
3491 'vim9script',
3492 'syntax keyword Word word# comm[ent',
3493 ], 'E789:')
3494
3495 CheckScriptSuccess([
3496 'vim9script',
3497 'syntax match Word /pat/ # comment',
3498 ])
3499 CheckScriptFailure([
3500 'vim9script',
3501 'syntax match Word /pat/# comment',
3502 ], 'E402:')
3503
3504 CheckScriptSuccess([
3505 'vim9script',
3506 'syntax match Word /pat/ contains=Something # comment',
3507 ])
3508 CheckScriptFailure([
3509 'vim9script',
3510 'syntax match Word /pat/ contains=Something# comment',
3511 ], 'E475:')
3512 CheckScriptFailure([
3513 'vim9script',
3514 'syntax match Word /pat/ contains= # comment',
3515 ], 'E406:')
3516 CheckScriptFailure([
3517 'vim9script',
3518 'syntax match Word /pat/ contains=# comment',
3519 ], 'E475:')
3520
3521 CheckScriptSuccess([
3522 'vim9script',
3523 'syntax region Word start=/pat/ end=/pat/ # comment',
3524 ])
3525 CheckScriptFailure([
3526 'vim9script',
3527 'syntax region Word start=/pat/ end=/pat/# comment',
Bram Moolenaard032f342020-07-18 18:13:02 +02003528 ], 'E402:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02003529
3530 CheckScriptSuccess([
3531 'vim9script',
3532 'syntax sync # comment',
3533 ])
3534 CheckScriptFailure([
3535 'vim9script',
3536 'syntax sync# comment',
3537 ], 'E404:')
3538 CheckScriptSuccess([
3539 'vim9script',
3540 'syntax sync ccomment # comment',
3541 ])
3542 CheckScriptFailure([
3543 'vim9script',
3544 'syntax sync ccomment# comment',
3545 ], 'E404:')
3546
3547 CheckScriptSuccess([
3548 'vim9script',
3549 'syntax cluster Some contains=Word # comment',
3550 ])
3551 CheckScriptFailure([
3552 'vim9script',
3553 'syntax cluster Some contains=Word# comment',
3554 ], 'E475:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003555
3556 CheckScriptSuccess([
3557 'vim9script',
3558 'command Echo echo # comment',
3559 'command Echo # comment',
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003560 'delcommand Echo',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003561 ])
3562 CheckScriptFailure([
3563 'vim9script',
3564 'command Echo echo# comment',
3565 'Echo',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003566 ], 'E1144:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003567 delcommand Echo
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003568
3569 var curdir = getcwd()
3570 CheckScriptSuccess([
3571 'command Echo cd " comment',
3572 'Echo',
3573 'delcommand Echo',
3574 ])
3575 CheckScriptSuccess([
Bram Moolenaar090728a2020-12-20 15:43:31 +01003576 'vim9script',
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003577 'command Echo cd # comment',
3578 'Echo',
3579 'delcommand Echo',
3580 ])
3581 CheckScriptFailure([
3582 'vim9script',
3583 'command Echo cd " comment',
3584 'Echo',
3585 ], 'E344:')
3586 delcommand Echo
3587 chdir(curdir)
3588
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003589 CheckScriptFailure([
3590 'vim9script',
3591 'command Echo# comment',
3592 ], 'E182:')
3593 CheckScriptFailure([
3594 'vim9script',
3595 'command Echo echo',
3596 'command Echo# comment',
3597 ], 'E182:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003598 delcommand Echo
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003599
3600 CheckScriptSuccess([
3601 'vim9script',
3602 'function # comment',
3603 ])
3604 CheckScriptFailure([
3605 'vim9script',
Bram Moolenaar98981072020-07-29 14:40:25 +02003606 'function " comment',
3607 ], 'E129:')
3608 CheckScriptFailure([
3609 'vim9script',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003610 'function# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003611 ], 'E1144:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003612 CheckScriptSuccess([
3613 'vim9script',
3614 'function CheckScriptSuccess # comment',
3615 ])
3616 CheckScriptFailure([
3617 'vim9script',
3618 'function CheckScriptSuccess# comment',
3619 ], 'E488:')
3620
3621 CheckScriptSuccess([
3622 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003623 'func g:DeleteMeA()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003624 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003625 'delfunction g:DeleteMeA # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003626 ])
3627 CheckScriptFailure([
3628 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003629 'func g:DeleteMeB()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003630 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003631 'delfunction g:DeleteMeB# comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003632 ], 'E488:')
3633
3634 CheckScriptSuccess([
3635 'vim9script',
3636 'call execute("ls") # comment',
3637 ])
3638 CheckScriptFailure([
3639 'vim9script',
3640 'call execute("ls")# comment',
3641 ], 'E488:')
Bram Moolenaare7e48382020-07-22 18:17:08 +02003642
3643 CheckScriptFailure([
3644 'def Test() " comment',
3645 'enddef',
3646 ], 'E488:')
3647 CheckScriptFailure([
3648 'vim9script',
3649 'def Test() " comment',
3650 'enddef',
3651 ], 'E488:')
3652
3653 CheckScriptSuccess([
3654 'func Test() " comment',
3655 'endfunc',
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003656 'delfunc Test',
Bram Moolenaare7e48382020-07-22 18:17:08 +02003657 ])
Bram Moolenaar98981072020-07-29 14:40:25 +02003658 CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003659 'vim9script',
3660 'func Test() " comment',
3661 'endfunc',
Bram Moolenaar98981072020-07-29 14:40:25 +02003662 ])
Bram Moolenaare7e48382020-07-22 18:17:08 +02003663
3664 CheckScriptSuccess([
3665 'def Test() # comment',
3666 'enddef',
3667 ])
3668 CheckScriptFailure([
3669 'func Test() # comment',
3670 'endfunc',
3671 ], 'E488:')
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003672
3673 var lines =<< trim END
3674 vim9script
3675 syn region Text
3676 \ start='foo'
3677 #\ comment
3678 \ end='bar'
Bram Moolenaar5072b472021-06-03 21:56:10 +02003679 syn region Text start='foo'
3680 #\ comment
3681 \ end='bar'
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003682 END
3683 CheckScriptSuccess(lines)
3684
3685 lines =<< trim END
3686 vim9script
3687 syn region Text
3688 \ start='foo'
3689 "\ comment
3690 \ end='bar'
3691 END
3692 CheckScriptFailure(lines, 'E399:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003693enddef
3694
3695def Test_vim9_comment_gui()
3696 CheckCanRunGui
3697
3698 CheckScriptFailure([
3699 'vim9script',
3700 'gui#comment'
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003701 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003702 CheckScriptFailure([
3703 'vim9script',
3704 'gui -f#comment'
Bram Moolenaarb8bd2e62021-08-21 17:13:14 +02003705 ], 'E194:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02003706enddef
3707
Bram Moolenaara26b9702020-04-18 19:53:28 +02003708def Test_vim9_comment_not_compiled()
Bram Moolenaar67979662020-06-20 22:50:47 +02003709 au TabEnter *.vim g:entered = 1
3710 au TabEnter *.x g:entered = 2
Bram Moolenaara26b9702020-04-18 19:53:28 +02003711
3712 edit test.vim
3713 doautocmd TabEnter #comment
3714 assert_equal(1, g:entered)
3715
3716 doautocmd TabEnter f.x
3717 assert_equal(2, g:entered)
3718
3719 g:entered = 0
3720 doautocmd TabEnter f.x #comment
3721 assert_equal(2, g:entered)
3722
3723 assert_fails('doautocmd Syntax#comment', 'E216:')
3724
3725 au! TabEnter
3726 unlet g:entered
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003727
3728 CheckScriptSuccess([
3729 'vim9script',
Bram Moolenaar67979662020-06-20 22:50:47 +02003730 'g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003731 'b:var = 456',
3732 'w:var = 777',
3733 't:var = 888',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003734 'unlet g:var w:var # something',
3735 ])
3736
3737 CheckScriptFailure([
3738 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003739 'let var = 123',
3740 ], 'E1126: Cannot use :let in Vim9 script')
3741
3742 CheckScriptFailure([
3743 'vim9script',
3744 'var g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003745 ], 'E1016: Cannot declare a global variable:')
3746
3747 CheckScriptFailure([
3748 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003749 'var b:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003750 ], 'E1016: Cannot declare a buffer variable:')
3751
3752 CheckScriptFailure([
3753 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003754 'var w:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003755 ], 'E1016: Cannot declare a window variable:')
3756
3757 CheckScriptFailure([
3758 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003759 'var t:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003760 ], 'E1016: Cannot declare a tab variable:')
3761
3762 CheckScriptFailure([
3763 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003764 'var v:version = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003765 ], 'E1016: Cannot declare a v: variable:')
3766
3767 CheckScriptFailure([
3768 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003769 'var $VARIABLE = "text"',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003770 ], 'E1016: Cannot declare an environment variable:')
Bram Moolenaar67979662020-06-20 22:50:47 +02003771
3772 CheckScriptFailure([
3773 'vim9script',
3774 'g:var = 123',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003775 'unlet g:var# comment1',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003776 ], 'E108:')
3777
3778 CheckScriptFailure([
3779 'let g:var = 123',
3780 'unlet g:var # something',
3781 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003782
3783 CheckScriptSuccess([
3784 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003785 'if 1 # comment2',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003786 ' echo "yes"',
3787 'elseif 2 #comment',
3788 ' echo "no"',
3789 'endif',
3790 ])
3791
3792 CheckScriptFailure([
3793 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003794 'if 1# comment3',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003795 ' echo "yes"',
3796 'endif',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003797 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003798
3799 CheckScriptFailure([
3800 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003801 'if 0 # comment4',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003802 ' echo "yes"',
3803 'elseif 2#comment',
3804 ' echo "no"',
3805 'endif',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003806 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003807
3808 CheckScriptSuccess([
3809 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003810 'var v = 1 # comment5',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003811 ])
3812
3813 CheckScriptFailure([
3814 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003815 'var v = 1# comment6',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003816 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003817
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003818 CheckScriptSuccess([
3819 'vim9script',
3820 'new'
Bram Moolenaard2c61702020-09-06 15:58:36 +02003821 'setline(1, ["# define pat", "last"])',
Bram Moolenaardf069ee2020-06-22 23:02:51 +02003822 ':$',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003823 'dsearch /pat/ #comment',
3824 'bwipe!',
3825 ])
3826
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003827 CheckScriptFailure([
3828 'vim9script',
3829 'new'
Bram Moolenaard2c61702020-09-06 15:58:36 +02003830 'setline(1, ["# define pat", "last"])',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003831 ':$',
3832 'dsearch /pat/#comment',
3833 'bwipe!',
3834 ], 'E488:')
3835
3836 CheckScriptFailure([
3837 'vim9script',
3838 'func! SomeFunc()',
3839 ], 'E477:')
Bram Moolenaara26b9702020-04-18 19:53:28 +02003840enddef
3841
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003842def Test_finish()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003843 var lines =<< trim END
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003844 vim9script
Bram Moolenaar67979662020-06-20 22:50:47 +02003845 g:res = 'one'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003846 if v:false | finish | endif
Bram Moolenaar67979662020-06-20 22:50:47 +02003847 g:res = 'two'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003848 finish
Bram Moolenaar67979662020-06-20 22:50:47 +02003849 g:res = 'three'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003850 END
3851 writefile(lines, 'Xfinished')
3852 source Xfinished
3853 assert_equal('two', g:res)
3854
3855 unlet g:res
3856 delete('Xfinished')
3857enddef
3858
Bram Moolenaara5d00772020-05-14 23:20:55 +02003859def Test_forward_declaration()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003860 var lines =<< trim END
Bram Moolenaara5d00772020-05-14 23:20:55 +02003861 vim9script
Bram Moolenaara5d00772020-05-14 23:20:55 +02003862 def GetValue(): string
3863 return theVal
3864 enddef
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003865 var theVal = 'something'
Bram Moolenaar822ba242020-05-24 23:00:18 +02003866 g:initVal = GetValue()
Bram Moolenaara5d00772020-05-14 23:20:55 +02003867 theVal = 'else'
3868 g:laterVal = GetValue()
3869 END
3870 writefile(lines, 'Xforward')
3871 source Xforward
3872 assert_equal('something', g:initVal)
3873 assert_equal('else', g:laterVal)
3874
3875 unlet g:initVal
3876 unlet g:laterVal
3877 delete('Xforward')
3878enddef
3879
Bram Moolenaar9721fb42020-06-11 23:10:46 +02003880def Test_source_vim9_from_legacy()
Bram Moolenaara6294952020-12-27 13:39:50 +01003881 var vim9_lines =<< trim END
3882 vim9script
3883 var local = 'local'
3884 g:global = 'global'
3885 export var exported = 'exported'
3886 export def GetText(): string
3887 return 'text'
3888 enddef
3889 END
3890 writefile(vim9_lines, 'Xvim9_script.vim')
3891
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003892 var legacy_lines =<< trim END
Bram Moolenaar9721fb42020-06-11 23:10:46 +02003893 source Xvim9_script.vim
3894
3895 call assert_false(exists('local'))
3896 call assert_false(exists('exported'))
3897 call assert_false(exists('s:exported'))
3898 call assert_equal('global', global)
3899 call assert_equal('global', g:global)
3900
Bram Moolenaard5f400c2022-01-06 21:10:28 +00003901 "" imported variable becomes script-local
3902 "import exported from './Xvim9_script.vim'
3903 "call assert_equal('exported', s:exported)
3904 "call assert_false(exists('exported'))
Bram Moolenaar9721fb42020-06-11 23:10:46 +02003905
Bram Moolenaard5f400c2022-01-06 21:10:28 +00003906 "" imported function becomes script-local
3907 "import GetText from './Xvim9_script.vim'
3908 "call assert_equal('text', s:GetText())
3909 "call assert_false(exists('*GetText'))
Bram Moolenaar9721fb42020-06-11 23:10:46 +02003910 END
3911 writefile(legacy_lines, 'Xlegacy_script.vim')
3912
Bram Moolenaar9721fb42020-06-11 23:10:46 +02003913 source Xlegacy_script.vim
Bram Moolenaar9721fb42020-06-11 23:10:46 +02003914 assert_equal('global', g:global)
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003915 unlet g:global
Bram Moolenaar9721fb42020-06-11 23:10:46 +02003916
3917 delete('Xlegacy_script.vim')
3918 delete('Xvim9_script.vim')
3919enddef
Bram Moolenaara5d00772020-05-14 23:20:55 +02003920
Bram Moolenaare535db82021-03-31 21:07:24 +02003921def Test_declare_script_in_func()
3922 var lines =<< trim END
3923 vim9script
3924 func Declare()
3925 let s:local = 123
3926 endfunc
3927 Declare()
3928 assert_equal(123, local)
3929
3930 var error: string
3931 try
3932 local = 'asdf'
3933 catch
3934 error = v:exception
3935 endtry
3936 assert_match('E1012: Type mismatch; expected number but got string', error)
3937
3938 lockvar local
3939 try
3940 local = 999
3941 catch
3942 error = v:exception
3943 endtry
3944 assert_match('E741: Value is locked: local', error)
3945 END
3946 CheckScriptSuccess(lines)
3947enddef
3948
3949
Bram Moolenaar7d699702020-08-14 20:52:28 +02003950func Test_vim9script_not_global()
3951 " check that items defined in Vim9 script are script-local, not global
3952 let vim9lines =<< trim END
3953 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003954 var name = 'local'
Bram Moolenaar7d699702020-08-14 20:52:28 +02003955 func TheFunc()
3956 echo 'local'
3957 endfunc
3958 def DefFunc()
3959 echo 'local'
3960 enddef
3961 END
3962 call writefile(vim9lines, 'Xvim9script.vim')
3963 source Xvim9script.vim
3964 try
3965 echo g:var
3966 assert_report('did not fail')
3967 catch /E121:/
3968 " caught
3969 endtry
3970 try
3971 call TheFunc()
3972 assert_report('did not fail')
3973 catch /E117:/
3974 " caught
3975 endtry
3976 try
3977 call DefFunc()
3978 assert_report('did not fail')
3979 catch /E117:/
3980 " caught
3981 endtry
3982
Bram Moolenaar25859dd2020-08-30 12:54:53 +02003983 call delete('Xvim9script.vim')
Bram Moolenaar7d699702020-08-14 20:52:28 +02003984endfunc
3985
Bram Moolenaareeb27bf2020-07-04 17:39:10 +02003986def Test_vim9_copen()
3987 # this was giving an error for setting w:quickfix_title
3988 copen
3989 quit
3990enddef
3991
Bram Moolenaar03290b82020-12-19 16:30:44 +01003992" test using an auto-loaded function and variable
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02003993def Test_vim9_autoload()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003994 var lines =<< trim END
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02003995 vim9script
Bram Moolenaar03290b82020-12-19 16:30:44 +01003996 def some#gettest(): string
3997 return 'test'
3998 enddef
3999 g:some#name = 'name'
Bram Moolenaar227c58a2021-04-28 20:40:44 +02004000 g:some#dict = {key: 'value'}
Bram Moolenaare3ffcd92021-03-08 21:47:13 +01004001
4002 def some#varargs(a1: string, ...l: list<string>): string
4003 return a1 .. l[0] .. l[1]
4004 enddef
Bram Moolenaar03290b82020-12-19 16:30:44 +01004005 END
4006
4007 mkdir('Xdir/autoload', 'p')
4008 writefile(lines, 'Xdir/autoload/some.vim')
4009 var save_rtp = &rtp
4010 exe 'set rtp^=' .. getcwd() .. '/Xdir'
4011
4012 assert_equal('test', g:some#gettest())
4013 assert_equal('name', g:some#name)
Bram Moolenaar227c58a2021-04-28 20:40:44 +02004014 assert_equal('value', g:some#dict.key)
Bram Moolenaar03290b82020-12-19 16:30:44 +01004015 g:some#other = 'other'
4016 assert_equal('other', g:some#other)
4017
Bram Moolenaare3ffcd92021-03-08 21:47:13 +01004018 assert_equal('abc', some#varargs('a', 'b', 'c'))
4019
Bram Moolenaar17f700a2020-12-19 21:23:42 +01004020 # upper case script name works
4021 lines =<< trim END
4022 vim9script
4023 def Other#getOther(): string
4024 return 'other'
4025 enddef
4026 END
4027 writefile(lines, 'Xdir/autoload/Other.vim')
4028 assert_equal('other', g:Other#getOther())
4029
Bram Moolenaar03290b82020-12-19 16:30:44 +01004030 delete('Xdir', 'rf')
4031 &rtp = save_rtp
4032enddef
4033
Bram Moolenaarc7d5fc82021-12-05 17:20:24 +00004034" test disassembling an auto-loaded function starting with "debug"
4035def Test_vim9_autoload_disass()
4036 mkdir('Xdir/autoload', 'p')
4037 var save_rtp = &rtp
4038 exe 'set rtp^=' .. getcwd() .. '/Xdir'
4039
4040 var lines =<< trim END
4041 vim9script
4042 def debugit#test(): string
4043 return 'debug'
4044 enddef
4045 END
4046 writefile(lines, 'Xdir/autoload/debugit.vim')
4047
4048 lines =<< trim END
4049 vim9script
4050 def profileit#test(): string
4051 return 'profile'
4052 enddef
4053 END
4054 writefile(lines, 'Xdir/autoload/profileit.vim')
4055
4056 lines =<< trim END
4057 vim9script
4058 assert_equal('debug', debugit#test())
4059 disass debugit#test
4060 assert_equal('profile', profileit#test())
4061 disass profileit#test
4062 END
4063 CheckScriptSuccess(lines)
4064
4065 delete('Xdir', 'rf')
4066 &rtp = save_rtp
4067enddef
4068
Bram Moolenaar03290b82020-12-19 16:30:44 +01004069" test using a vim9script that is auto-loaded from an autocmd
4070def Test_vim9_aucmd_autoload()
4071 var lines =<< trim END
4072 vim9script
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02004073 def foo#test()
4074 echomsg getreg('"')
4075 enddef
4076 END
4077
4078 mkdir('Xdir/autoload', 'p')
4079 writefile(lines, 'Xdir/autoload/foo.vim')
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004080 var save_rtp = &rtp
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02004081 exe 'set rtp^=' .. getcwd() .. '/Xdir'
4082 augroup test
4083 autocmd TextYankPost * call foo#test()
4084 augroup END
4085
4086 normal Y
4087
4088 augroup test
4089 autocmd!
4090 augroup END
4091 delete('Xdir', 'rf')
4092 &rtp = save_rtp
4093enddef
4094
Bram Moolenaar77e5dcc2020-09-17 21:29:03 +02004095" This was causing a crash because suppress_errthrow wasn't reset.
4096def Test_vim9_autoload_error()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004097 var lines =<< trim END
Bram Moolenaar77e5dcc2020-09-17 21:29:03 +02004098 vim9script
4099 def crash#func()
4100 try
4101 for x in List()
4102 endfor
4103 catch
4104 endtry
4105 g:ok = true
4106 enddef
4107 fu List()
4108 invalid
4109 endfu
4110 try
Bram Moolenaar48e11c12021-01-11 18:47:00 +01004111 alsoinvalid
Bram Moolenaar77e5dcc2020-09-17 21:29:03 +02004112 catch /wontmatch/
4113 endtry
4114 END
4115 call mkdir('Xruntime/autoload', 'p')
4116 call writefile(lines, 'Xruntime/autoload/crash.vim')
4117
4118 # run in a separate Vim to avoid the side effects of assert_fails()
4119 lines =<< trim END
4120 exe 'set rtp^=' .. getcwd() .. '/Xruntime'
4121 call crash#func()
4122 call writefile(['ok'], 'Xdidit')
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004123 qall!
Bram Moolenaar77e5dcc2020-09-17 21:29:03 +02004124 END
4125 writefile(lines, 'Xscript')
4126 RunVim([], [], '-S Xscript')
4127 assert_equal(['ok'], readfile('Xdidit'))
4128
4129 delete('Xdidit')
4130 delete('Xscript')
4131 delete('Xruntime', 'rf')
Bram Moolenaar03290b82020-12-19 16:30:44 +01004132
4133 lines =<< trim END
4134 vim9script
4135 var foo#bar = 'asdf'
4136 END
4137 CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
Bram Moolenaar77e5dcc2020-09-17 21:29:03 +02004138enddef
4139
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02004140def Test_script_var_in_autocmd()
4141 # using a script variable from an autocommand, defined in a :def function in a
4142 # legacy Vim script, cannot check the variable type.
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004143 var lines =<< trim END
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02004144 let s:counter = 1
4145 def s:Func()
4146 au! CursorHold
4147 au CursorHold * s:counter += 1
4148 enddef
4149 call s:Func()
4150 doau CursorHold
4151 call assert_equal(2, s:counter)
4152 au! CursorHold
4153 END
4154 CheckScriptSuccess(lines)
4155enddef
4156
Bram Moolenaarb5841b92021-07-15 18:09:53 +02004157def Test_error_in_autoload_script()
4158 var save_rtp = &rtp
4159 var dir = getcwd() .. '/Xruntime'
4160 &rtp = dir
4161 mkdir(dir .. '/autoload', 'p')
4162
4163 var lines =<< trim END
4164 vim9script noclear
4165 def script#autoloaded()
4166 enddef
4167 def Broken()
4168 var x: any = ''
4169 eval x != 0
4170 enddef
4171 Broken()
4172 END
4173 writefile(lines, dir .. '/autoload/script.vim')
4174
4175 lines =<< trim END
4176 vim9script
4177 def CallAutoloaded()
4178 script#autoloaded()
4179 enddef
4180
4181 function Legacy()
4182 try
4183 call s:CallAutoloaded()
4184 catch
4185 call assert_match('E1030: Using a String as a Number', v:exception)
4186 endtry
4187 endfunction
4188
4189 Legacy()
4190 END
4191 CheckScriptSuccess(lines)
4192
4193 &rtp = save_rtp
4194 delete(dir, 'rf')
4195enddef
4196
Bram Moolenaar3896a102020-08-09 14:33:55 +02004197def Test_cmdline_win()
4198 # if the Vim syntax highlighting uses Vim9 constructs they can be used from
4199 # the command line window.
4200 mkdir('rtp/syntax', 'p')
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004201 var export_lines =<< trim END
Bram Moolenaar3896a102020-08-09 14:33:55 +02004202 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004203 export var That = 'yes'
Bram Moolenaar3896a102020-08-09 14:33:55 +02004204 END
4205 writefile(export_lines, 'rtp/syntax/Xexport.vim')
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004206 var import_lines =<< trim END
Bram Moolenaar3896a102020-08-09 14:33:55 +02004207 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00004208 import './Xexport.vim' as exp
4209 echo exp.That
Bram Moolenaar3896a102020-08-09 14:33:55 +02004210 END
4211 writefile(import_lines, 'rtp/syntax/vim.vim')
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004212 var save_rtp = &rtp
Bram Moolenaar3896a102020-08-09 14:33:55 +02004213 &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
4214 syntax on
4215 augroup CmdWin
4216 autocmd CmdwinEnter * g:got_there = 'yes'
4217 augroup END
4218 # this will open and also close the cmdline window
4219 feedkeys('q:', 'xt')
4220 assert_equal('yes', g:got_there)
4221
4222 augroup CmdWin
4223 au!
4224 augroup END
4225 &rtp = save_rtp
4226 delete('rtp', 'rf')
4227enddef
4228
Bram Moolenaare3d46852020-08-29 13:39:17 +02004229def Test_invalid_sid()
4230 assert_fails('func <SNR>1234_func', 'E123:')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02004231
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004232 if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
Bram Moolenaard2c61702020-09-06 15:58:36 +02004233 assert_equal([], readfile('Xdidit'))
Bram Moolenaare3d46852020-08-29 13:39:17 +02004234 endif
4235 delete('Xdidit')
4236enddef
4237
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004238def Test_restoring_cpo()
4239 writefile(['vim9script', 'set nocp'], 'Xsourced')
4240 writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
4241 if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
4242 assert_equal(['done'], readfile('Xdone'))
4243 endif
4244 delete('Xsourced')
4245 delete('Xclose')
Bram Moolenaar090728a2020-12-20 15:43:31 +01004246 delete('Xdone')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004247
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004248 writefile(['vim9script', 'g:cpoval = &cpo'], 'XanotherScript')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004249 set cpo=aABceFsMny>
4250 edit XanotherScript
4251 so %
4252 assert_equal('aABceFsMny>', &cpo)
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004253 assert_equal('aABceFs', g:cpoval)
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004254 :1del
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004255 setline(1, 'let g:cpoval = &cpo')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004256 w
4257 so %
4258 assert_equal('aABceFsMny>', &cpo)
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004259 assert_equal('aABceFsMny>', g:cpoval)
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004260
4261 delete('XanotherScript')
4262 set cpo&vim
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004263 unlet g:cpoval
4264
4265 if has('unix')
4266 # 'cpo' is not restored in main vimrc
4267 var save_HOME = $HOME
4268 $HOME = getcwd() .. '/Xhome'
4269 mkdir('Xhome')
4270 var lines =<< trim END
4271 vim9script
4272 writefile(['before: ' .. &cpo], 'Xresult')
4273 set cpo+=M
4274 writefile(['after: ' .. &cpo], 'Xresult', 'a')
4275 END
4276 writefile(lines, 'Xhome/.vimrc')
4277
4278 lines =<< trim END
4279 call writefile(['later: ' .. &cpo], 'Xresult', 'a')
4280 END
4281 writefile(lines, 'Xlegacy')
4282
4283 lines =<< trim END
4284 vim9script
4285 call writefile(['vim9: ' .. &cpo], 'Xresult', 'a')
4286 qa
4287 END
4288 writefile(lines, 'Xvim9')
4289
4290 var cmd = GetVimCommand() .. " -S Xlegacy -S Xvim9"
4291 cmd = substitute(cmd, '-u NONE', '', '')
4292 exe "silent !" .. cmd
4293
4294 assert_equal([
4295 'before: aABceFs',
4296 'after: aABceFsM',
4297 'later: aABceFsM',
4298 'vim9: aABceFs'], readfile('Xresult'))
4299
4300 $HOME = save_HOME
4301 delete('Xhome', 'rf')
4302 delete('Xlegacy')
4303 delete('Xvim9')
4304 delete('Xresult')
4305 endif
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004306enddef
4307
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004308" Use :function so we can use Check commands
4309func Test_no_redraw_when_restoring_cpo()
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004310 CheckScreendump
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004311 CheckFeature timers
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004312
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004313 let lines =<< trim END
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004314 vim9script
4315 def script#func()
4316 enddef
4317 END
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004318 call mkdir('Xdir/autoload', 'p')
4319 call writefile(lines, 'Xdir/autoload/script.vim')
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004320
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004321 let lines =<< trim END
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004322 vim9script
4323 set cpo+=M
4324 exe 'set rtp^=' .. getcwd() .. '/Xdir'
Bram Moolenaar767034c2021-04-09 17:24:52 +02004325 au CmdlineEnter : ++once timer_start(0, (_) => script#func())
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004326 setline(1, 'some text')
4327 END
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004328 call writefile(lines, 'XTest_redraw_cpo')
4329 let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
4330 call term_sendkeys(buf, "V:")
4331 call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004332
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004333 " clean up
4334 call term_sendkeys(buf, "\<Esc>u")
4335 call StopVimInTerminal(buf)
4336 call delete('XTest_redraw_cpo')
4337 call delete('Xdir', 'rf')
4338endfunc
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004339
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004340
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004341def Test_unset_any_variable()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004342 var lines =<< trim END
4343 var name: any
4344 assert_equal(0, name)
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004345 END
4346 CheckDefAndScriptSuccess(lines)
4347enddef
4348
Bram Moolenaar7e9210e2020-09-25 23:12:51 +02004349func Test_define_func_at_command_line()
Bram Moolenaar58dbef32020-09-25 22:13:05 +02004350 CheckRunVimInTerminal
4351
Bram Moolenaar7e9210e2020-09-25 23:12:51 +02004352 " call indirectly to avoid compilation error for missing functions
4353 call Run_Test_define_func_at_command_line()
4354endfunc
4355
4356def Run_Test_define_func_at_command_line()
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004357 # run in a separate Vim instance to avoid the script context
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004358 var lines =<< trim END
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004359 func CheckAndQuit()
4360 call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
4361 call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
4362 endfunc
4363 END
4364 writefile([''], 'Xdidcmd')
4365 writefile(lines, 'XcallFunc')
Bram Moolenaare0de1712020-12-02 17:36:54 +01004366 var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004367 # define Afunc() on the command line
4368 term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
4369 term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01004370 WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004371
4372 call StopVimInTerminal(buf)
4373 delete('XcallFunc')
4374 delete('Xdidcmd')
4375enddef
4376
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004377def Test_script_var_scope()
4378 var lines =<< trim END
4379 vim9script
4380 if true
4381 if true
4382 var one = 'one'
4383 echo one
4384 endif
4385 echo one
4386 endif
4387 END
4388 CheckScriptFailure(lines, 'E121:', 7)
4389
4390 lines =<< trim END
4391 vim9script
4392 if true
4393 if false
4394 var one = 'one'
4395 echo one
4396 else
4397 var one = 'one'
4398 echo one
4399 endif
4400 echo one
4401 endif
4402 END
4403 CheckScriptFailure(lines, 'E121:', 10)
4404
4405 lines =<< trim END
4406 vim9script
4407 while true
4408 var one = 'one'
4409 echo one
4410 break
4411 endwhile
4412 echo one
4413 END
4414 CheckScriptFailure(lines, 'E121:', 7)
4415
4416 lines =<< trim END
4417 vim9script
4418 for i in range(1)
4419 var one = 'one'
4420 echo one
4421 endfor
4422 echo one
4423 END
4424 CheckScriptFailure(lines, 'E121:', 6)
Bram Moolenaar9becdf22020-10-10 21:33:48 +02004425
4426 lines =<< trim END
4427 vim9script
4428 {
4429 var one = 'one'
4430 assert_equal('one', one)
4431 }
4432 assert_false(exists('one'))
4433 assert_false(exists('s:one'))
4434 END
4435 CheckScriptSuccess(lines)
4436
4437 lines =<< trim END
4438 vim9script
4439 {
4440 var one = 'one'
4441 echo one
4442 }
4443 echo one
4444 END
4445 CheckScriptFailure(lines, 'E121:', 6)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004446enddef
4447
Bram Moolenaar352134b2020-10-17 22:04:08 +02004448def Test_catch_exception_in_callback()
4449 var lines =<< trim END
4450 vim9script
Bram Moolenaar2a389082021-04-09 20:24:31 +02004451 def Callback(...l: list<any>)
Bram Moolenaar352134b2020-10-17 22:04:08 +02004452 try
4453 var x: string
4454 var y: string
4455 # this error should be caught with CHECKLEN
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +00004456 var sl = ['']
4457 [x, y] = sl
Bram Moolenaar352134b2020-10-17 22:04:08 +02004458 catch
4459 g:caught = 'yes'
4460 endtry
4461 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01004462 popup_menu('popup', {callback: Callback})
Bram Moolenaar352134b2020-10-17 22:04:08 +02004463 feedkeys("\r", 'xt')
4464 END
4465 CheckScriptSuccess(lines)
4466
4467 unlet g:caught
4468enddef
4469
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004470def Test_no_unknown_error_after_error()
4471 if !has('unix') || !has('job')
4472 throw 'Skipped: not unix of missing +job feature'
4473 endif
Bram Moolenaarb16ff292021-09-26 20:14:39 +01004474 # FIXME: this check should not be needed
4475 if has('win32')
4476 throw 'Skipped: does not work on MS-Windows'
4477 endif
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004478 var lines =<< trim END
4479 vim9script
4480 var source: list<number>
Bram Moolenaar2a389082021-04-09 20:24:31 +02004481 def Out_cb(...l: list<any>)
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004482 eval [][0]
4483 enddef
Bram Moolenaar2a389082021-04-09 20:24:31 +02004484 def Exit_cb(...l: list<any>)
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004485 sleep 1m
4486 source += l
4487 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01004488 var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
Bram Moolenaar6f17a3f2020-12-21 18:11:24 +01004489 while job_status(myjob) == 'run'
4490 sleep 10m
4491 endwhile
Bram Moolenaar206c2a62021-01-31 14:04:44 +01004492 # wait for Exit_cb() to be called
Bram Moolenaarfe95b942021-04-10 20:52:43 +02004493 sleep 200m
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004494 END
4495 writefile(lines, 'Xdef')
4496 assert_fails('so Xdef', ['E684:', 'E1012:'])
4497 delete('Xdef')
4498enddef
4499
Bram Moolenaar4324d872020-12-01 20:12:24 +01004500def InvokeNormal()
4501 exe "norm! :m+1\r"
4502enddef
4503
4504def Test_invoke_normal_in_visual_mode()
4505 xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
4506 new
4507 setline(1, ['aaa', 'bbb'])
4508 feedkeys("V\<F3>", 'xt')
4509 assert_equal(['bbb', 'aaa'], getline(1, 2))
4510 xunmap <F3>
4511enddef
4512
Bram Moolenaarb5b94802020-12-13 17:50:20 +01004513def Test_white_space_after_command()
4514 var lines =<< trim END
4515 exit_cb: Func})
4516 END
4517 CheckDefAndScriptFailure(lines, 'E1144:', 1)
Bram Moolenaarf8103f22020-12-25 17:36:27 +01004518
4519 lines =<< trim END
4520 e#
4521 END
4522 CheckDefAndScriptFailure(lines, 'E1144:', 1)
Bram Moolenaarb5b94802020-12-13 17:50:20 +01004523enddef
4524
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004525def Test_script_var_gone_when_sourced_twice()
4526 var lines =<< trim END
4527 vim9script
4528 if exists('g:guard')
4529 finish
4530 endif
4531 g:guard = 1
4532 var name = 'thename'
4533 def g:GetName(): string
4534 return name
4535 enddef
4536 def g:SetName(arg: string)
4537 name = arg
4538 enddef
4539 END
4540 writefile(lines, 'XscriptTwice.vim')
4541 so XscriptTwice.vim
4542 assert_equal('thename', g:GetName())
4543 g:SetName('newname')
4544 assert_equal('newname', g:GetName())
4545 so XscriptTwice.vim
4546 assert_fails('call g:GetName()', 'E1149:')
4547 assert_fails('call g:SetName("x")', 'E1149:')
4548
4549 delfunc g:GetName
4550 delfunc g:SetName
4551 delete('XscriptTwice.vim')
4552 unlet g:guard
4553enddef
4554
Bram Moolenaard5f400c2022-01-06 21:10:28 +00004555"def Test_import_gone_when_sourced_twice()
4556" var exportlines =<< trim END
4557" vim9script
4558" if exists('g:guard')
4559" finish
4560" endif
4561" g:guard = 1
4562" export var name = 'someName'
4563" END
4564" writefile(exportlines, 'XexportScript.vim')
4565"
4566" var lines =<< trim END
4567" vim9script
4568" import name from './XexportScript.vim'
4569" def g:GetName(): string
4570" return name
4571" enddef
4572" END
4573" writefile(lines, 'XscriptImport.vim')
4574" so XscriptImport.vim
4575" assert_equal('someName', g:GetName())
4576"
4577" so XexportScript.vim
4578" assert_fails('call g:GetName()', 'E1149:')
4579"
4580" delfunc g:GetName
4581" delete('XexportScript.vim')
4582" delete('XscriptImport.vim')
4583" unlet g:guard
4584"enddef
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004585
Bram Moolenaar10b94212021-02-19 21:42:57 +01004586def Test_unsupported_commands()
4587 var lines =<< trim END
4588 ka
4589 END
Bram Moolenaar7d840e92021-05-26 21:10:11 +02004590 CheckDefFailure(lines, 'E476:')
4591 CheckScriptFailure(['vim9script'] + lines, 'E492:')
Bram Moolenaar10b94212021-02-19 21:42:57 +01004592
4593 lines =<< trim END
Bram Moolenaarada1d872021-02-20 08:16:51 +01004594 :1ka
4595 END
Bram Moolenaar7d840e92021-05-26 21:10:11 +02004596 CheckDefFailure(lines, 'E476:')
4597 CheckScriptFailure(['vim9script'] + lines, 'E492:')
Bram Moolenaarada1d872021-02-20 08:16:51 +01004598
4599 lines =<< trim END
Bram Moolenaar10b94212021-02-19 21:42:57 +01004600 t
4601 END
4602 CheckDefFailure(lines, 'E1100:')
4603 CheckScriptFailure(['vim9script'] + lines, 'E1100:')
4604
4605 lines =<< trim END
4606 x
4607 END
4608 CheckDefFailure(lines, 'E1100:')
4609 CheckScriptFailure(['vim9script'] + lines, 'E1100:')
4610
4611 lines =<< trim END
4612 xit
4613 END
4614 CheckDefFailure(lines, 'E1100:')
4615 CheckScriptFailure(['vim9script'] + lines, 'E1100:')
4616enddef
4617
Bram Moolenaarc70fe462021-04-17 17:59:19 +02004618def Test_mapping_line_number()
4619 var lines =<< trim END
4620 vim9script
4621 def g:FuncA()
4622 # Some comment
4623 FuncB(0)
4624 enddef
4625 # Some comment
4626 def FuncB(
4627 # Some comment
4628 n: number
4629 )
4630 exe 'nno '
4631 # Some comment
4632 .. '<F3> a'
4633 .. 'b'
4634 .. 'c'
4635 enddef
4636 END
4637 CheckScriptSuccess(lines)
4638 var res = execute('verbose nmap <F3>')
4639 assert_match('No mapping found', res)
4640
4641 g:FuncA()
4642 res = execute('verbose nmap <F3>')
4643 assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
4644
4645 nunmap <F3>
4646 delfunc g:FuncA
4647enddef
4648
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004649def Test_option_set()
4650 # legacy script allows for white space
4651 var lines =<< trim END
4652 set foldlevel =11
4653 call assert_equal(11, &foldlevel)
4654 END
4655 CheckScriptSuccess(lines)
4656
4657 set foldlevel
4658 set foldlevel=12
4659 assert_equal(12, &foldlevel)
4660 set foldlevel+=2
4661 assert_equal(14, &foldlevel)
4662 set foldlevel-=3
4663 assert_equal(11, &foldlevel)
4664
4665 lines =<< trim END
4666 set foldlevel =1
4667 END
4668 CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1')
4669
4670 lines =<< trim END
4671 set foldlevel +=1
4672 END
4673 CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1')
4674
4675 lines =<< trim END
4676 set foldlevel ^=1
4677 END
4678 CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1')
4679
4680 lines =<< trim END
4681 set foldlevel -=1
4682 END
4683 CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1')
4684
4685 set foldlevel&
4686enddef
4687
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004688def Test_option_modifier()
Bram Moolenaar1594f312021-07-08 16:40:13 +02004689 # legacy script allows for white space
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004690 var lines =<< trim END
4691 set hlsearch & hlsearch !
4692 call assert_equal(1, &hlsearch)
4693 END
4694 CheckScriptSuccess(lines)
4695
Bram Moolenaar1594f312021-07-08 16:40:13 +02004696 set hlsearch
4697 set hlsearch!
4698 assert_equal(false, &hlsearch)
4699
4700 set hlsearch
4701 set hlsearch&
4702 assert_equal(false, &hlsearch)
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004703
4704 lines =<< trim END
Bram Moolenaar1594f312021-07-08 16:40:13 +02004705 set hlsearch &
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004706 END
Bram Moolenaar1594f312021-07-08 16:40:13 +02004707 CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &')
4708
4709 lines =<< trim END
4710 set hlsearch !
4711 END
4712 CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !')
4713
4714 set hlsearch&
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004715enddef
4716
Bram Moolenaarc03fe662021-07-11 16:52:45 +02004717" This must be called last, it may cause following :def functions to fail
4718def Test_xxx_echoerr_line_number()
4719 var lines =<< trim END
4720 echoerr 'some'
4721 .. ' error'
4722 .. ' continued'
4723 END
4724 CheckDefExecAndScriptFailure(lines, 'some error continued', 1)
4725enddef
4726
Bram Moolenaar9537e372021-12-10 21:05:53 +00004727func Test_debug_with_lambda()
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004728 CheckRunVimInTerminal
4729
Bram Moolenaar9537e372021-12-10 21:05:53 +00004730 " call indirectly to avoid compilation error for missing functions
4731 call Run_Test_debug_with_lambda()
4732endfunc
4733
4734def Run_Test_debug_with_lambda()
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004735 var lines =<< trim END
4736 vim9script
4737 def Func()
4738 var n = 0
4739 echo [0]->filter((_, v) => v == n)
4740 enddef
4741 breakadd func Func
4742 Func()
4743 END
4744 writefile(lines, 'XdebugFunc')
4745 var buf = RunVimInTerminal('-S XdebugFunc', {rows: 6, wait_for_ruler: 0})
4746 WaitForAssert(() => assert_match('^>', term_getline(buf, 6)))
4747
4748 term_sendkeys(buf, "cont\<CR>")
4749 WaitForAssert(() => assert_match('\[0\]', term_getline(buf, 5)))
4750
4751 StopVimInTerminal(buf)
4752 delete('XdebugFunc')
4753enddef
4754
Bram Moolenaar310091d2021-12-23 21:14:37 +00004755func Test_debug_running_out_of_lines()
4756 CheckRunVimInTerminal
4757
4758 " call indirectly to avoid compilation error for missing functions
4759 call Run_Test_debug_running_out_of_lines()
4760endfunc
4761
4762def Run_Test_debug_running_out_of_lines()
4763 var lines =<< trim END
4764 vim9script
4765 def Crash()
4766 #
4767 #
4768 #
4769 #
4770 #
4771 #
4772 #
4773 if true
4774 #
4775 endif
4776 enddef
4777 breakadd func Crash
4778 Crash()
4779 END
4780 writefile(lines, 'XdebugFunc')
4781 var buf = RunVimInTerminal('-S XdebugFunc', {rows: 6, wait_for_ruler: 0})
4782 WaitForAssert(() => assert_match('^>', term_getline(buf, 6)))
4783
4784 term_sendkeys(buf, "next\<CR>")
4785 TermWait(buf)
4786 WaitForAssert(() => assert_match('^>', term_getline(buf, 6)))
4787
4788 term_sendkeys(buf, "cont\<CR>")
4789 TermWait(buf)
4790
4791 StopVimInTerminal(buf)
4792 delete('XdebugFunc')
4793enddef
4794
Bram Moolenaar648594e2021-07-11 17:55:01 +02004795def ProfiledWithLambda()
Bram Moolenaard9162552021-07-11 15:26:13 +02004796 var n = 3
4797 echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n)
4798enddef
4799
Bram Moolenaar648594e2021-07-11 17:55:01 +02004800def ProfiledNested()
4801 var x = 0
4802 def Nested(): any
4803 return x
4804 enddef
4805 Nested()
4806enddef
4807
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004808def ProfiledNestedProfiled()
4809 var x = 0
4810 def Nested(): any
4811 return x
4812 enddef
4813 Nested()
4814enddef
4815
Dominique Pelle923dce22021-11-21 11:36:04 +00004816" Execute this near the end, profiling doesn't stop until Vim exits.
Bram Moolenaard9162552021-07-11 15:26:13 +02004817" This only tests that it works, not the profiling output.
4818def Test_xx_profile_with_lambda()
Bram Moolenaar4ece1522021-07-11 16:31:51 +02004819 CheckFeature profile
4820
Bram Moolenaard9162552021-07-11 15:26:13 +02004821 profile start Xprofile.log
Bram Moolenaar648594e2021-07-11 17:55:01 +02004822 profile func ProfiledWithLambda
4823 ProfiledWithLambda()
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004824
Bram Moolenaar648594e2021-07-11 17:55:01 +02004825 profile func ProfiledNested
4826 ProfiledNested()
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004827
4828 # Also profile the nested function. Use a different function, although the
4829 # contents is the same, to make sure it was not already compiled.
4830 profile func *
4831 ProfiledNestedProfiled()
4832
4833 profdel func *
4834 profile pause
Bram Moolenaard9162552021-07-11 15:26:13 +02004835enddef
4836
Bram Moolenaar585fea72020-04-02 22:33:21 +02004837" Keep this last, it messes up highlighting.
4838def Test_substitute_cmd()
4839 new
4840 setline(1, 'something')
4841 :substitute(some(other(
4842 assert_equal('otherthing', getline(1))
4843 bwipe!
4844
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02004845 # also when the context is Vim9 script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004846 var lines =<< trim END
Bram Moolenaar585fea72020-04-02 22:33:21 +02004847 vim9script
4848 new
4849 setline(1, 'something')
4850 :substitute(some(other(
4851 assert_equal('otherthing', getline(1))
4852 bwipe!
4853 END
4854 writefile(lines, 'Xvim9lines')
4855 source Xvim9lines
4856
4857 delete('Xvim9lines')
4858enddef
4859
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01004860" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker