blob: 4c5d9e9a0d416e0aebd77e5a6a9eecaf301c6832 [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 Moolenaarcfcd0112020-09-27 15:19:27 +02001268 var import_star_as_lines =<< trim END
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001269 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001270 import './Xexport.vim' as Export
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001271 def UseExport()
Bram Moolenaar24e93162021-07-18 20:40:33 +02001272 g:exported_def = Export.exported
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001273 enddef
Bram Moolenaar24e93162021-07-18 20:40:33 +02001274 g:exported_script = Export.exported
Bram Moolenaarcb4e80f2021-03-13 20:57:19 +01001275 assert_equal(1, exists('Export.exported'))
1276 assert_equal(0, exists('Export.notexported'))
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001277 UseExport()
1278 END
1279 writefile(import_star_as_lines, 'Ximport.vim')
1280 source Ximport.vim
Bram Moolenaar24e93162021-07-18 20:40:33 +02001281
1282 assert_equal(18, g:exported_def)
1283 assert_equal(18, g:exported_script)
1284 unlet g:exported_def
1285 unlet g:exported_script
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001286
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001287 var import_star_as_lines_no_dot =<< trim END
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001288 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001289 import './Xexport.vim' as Export
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001290 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001291 var dummy = 1
1292 var imported = Export + dummy
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001293 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +02001294 defcompile
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001295 END
1296 writefile(import_star_as_lines_no_dot, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001297 assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001298
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001299 var import_star_as_lines_dot_space =<< trim END
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001300 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001301 import './Xexport.vim' as Export
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001302 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001303 var imported = Export . exported
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001304 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +02001305 defcompile
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001306 END
1307 writefile(import_star_as_lines_dot_space, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001308 assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001309
Bram Moolenaar921ba522021-07-29 22:25:05 +02001310 var import_func_duplicated =<< trim END
1311 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001312 import './Xexport.vim' as expo
1313 import './Xexport.vim' as expo
Bram Moolenaar921ba522021-07-29 22:25:05 +02001314
1315 ExportedInc()
1316 END
1317 writefile(import_func_duplicated, 'Ximport.vim')
1318 assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
1319
Bram Moolenaara6294952020-12-27 13:39:50 +01001320 var import_star_as_duplicated =<< trim END
1321 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001322 import './Xexport.vim' as Export
Bram Moolenaara6294952020-12-27 13:39:50 +01001323 var some = 'other'
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001324 import './Xexport.vim' as Export
Bram Moolenaara6294952020-12-27 13:39:50 +01001325 defcompile
1326 END
1327 writefile(import_star_as_duplicated, 'Ximport.vim')
1328 assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim')
1329
Bram Moolenaarcb4e80f2021-03-13 20:57:19 +01001330 var import_star_as_lines_script_no_dot =<< trim END
1331 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001332 import './Xexport.vim' as Export
Bram Moolenaarcb4e80f2021-03-13 20:57:19 +01001333 g:imported_script = Export exported
1334 END
1335 writefile(import_star_as_lines_script_no_dot, 'Ximport.vim')
1336 assert_fails('source Ximport.vim', 'E1029:')
1337
1338 var import_star_as_lines_script_space_after_dot =<< trim END
1339 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001340 import './Xexport.vim' as Export
Bram Moolenaarcb4e80f2021-03-13 20:57:19 +01001341 g:imported_script = Export. exported
1342 END
1343 writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim')
1344 assert_fails('source Ximport.vim', 'E1074:')
1345
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001346 var import_star_as_lines_missing_name =<< trim END
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001347 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001348 import './Xexport.vim' as Export
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001349 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001350 var imported = Export.
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001351 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +02001352 defcompile
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001353 END
1354 writefile(import_star_as_lines_missing_name, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001355 assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001356
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001357 var import_star_as_lbr_lines =<< trim END
Bram Moolenaar1c991142020-07-04 13:15:31 +02001358 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001359 import './Xexport.vim'
Bram Moolenaar1c991142020-07-04 13:15:31 +02001360 as Export
Bram Moolenaar1c991142020-07-04 13:15:31 +02001361 def UseExport()
Bram Moolenaar24e93162021-07-18 20:40:33 +02001362 g:exported = Export.exported
Bram Moolenaar1c991142020-07-04 13:15:31 +02001363 enddef
1364 UseExport()
1365 END
1366 writefile(import_star_as_lbr_lines, 'Ximport.vim')
1367 source Ximport.vim
Bram Moolenaar24e93162021-07-18 20:40:33 +02001368 assert_equal(18, g:exported)
1369 unlet g:exported
Bram Moolenaar1c991142020-07-04 13:15:31 +02001370
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001371 # try to use something that exists but is not exported
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001372 var import_not_exported_lines =<< trim END
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001373 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001374 import './Xexport.vim' as expo
1375 echo expo.name
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001376 END
1377 writefile(import_not_exported_lines, 'Ximport.vim')
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001378 assert_fails('source Ximport.vim', 'E1049:', '', 3, 'Ximport.vim')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001379
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001380 # try to import something that is already defined
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001381 var import_already_defined =<< trim END
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001382 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001383 var exported = 'something'
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001384 import './Xexport.vim' as exported
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001385 END
1386 writefile(import_already_defined, 'Ximport.vim')
Bram Moolenaar057e84a2021-02-28 16:55:11 +01001387 assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001388
Bram Moolenaar918a4242020-12-06 14:37:08 +01001389 # try changing an imported const
1390 var import_assign_to_const =<< trim END
1391 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001392 import './Xexport.vim' as expo
Bram Moolenaar918a4242020-12-06 14:37:08 +01001393 def Assign()
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001394 expo.CONST = 987
Bram Moolenaar918a4242020-12-06 14:37:08 +01001395 enddef
1396 defcompile
1397 END
1398 writefile(import_assign_to_const, 'Ximport.vim')
1399 assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1400
Bram Moolenaar0f2a5cc2021-02-27 22:33:21 +01001401 # try changing an imported final
1402 var import_assign_to_final =<< trim END
1403 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001404 import './Xexport.vim' as expo
Bram Moolenaar0f2a5cc2021-02-27 22:33:21 +01001405 def Assign()
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001406 expo.theList = [2]
Bram Moolenaar0f2a5cc2021-02-27 22:33:21 +01001407 enddef
1408 defcompile
1409 END
1410 writefile(import_assign_to_final, 'Ximport.vim')
1411 assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
1412
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001413 var import_no_as_lines =<< trim END
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001414 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001415 import './Xexport.vim' name
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001416 END
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001417 writefile(import_no_as_lines, 'Ximport.vim')
1418 assert_fails('source Ximport.vim', 'E488:', '', 2, 'Ximport.vim')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001419
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001420 var import_invalid_string_lines =<< trim END
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001421 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001422 import Xexport.vim
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001423 END
1424 writefile(import_invalid_string_lines, 'Ximport.vim')
Bram Moolenaar4db572e2021-07-18 18:21:38 +02001425 assert_fails('source Ximport.vim', 'E121:', '', 2, 'Ximport.vim')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001426
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001427 var import_wrong_name_lines =<< trim END
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001428 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001429 import './XnoExport.vim'
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001430 END
1431 writefile(import_wrong_name_lines, 'Ximport.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001432 assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001433
Bram Moolenaar60579352021-07-19 21:45:07 +02001434 var import_redefining_lines =<< trim END
1435 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001436 import './Xexport.vim' as exported
Bram Moolenaar60579352021-07-19 21:45:07 +02001437 var exported = 5
1438 END
1439 writefile(import_redefining_lines, 'Ximport.vim')
1440 assert_fails('source Ximport.vim', 'E1213: Redefining imported item "exported"', '', 3)
1441
1442 var import_assign_wrong_type_lines =<< trim END
1443 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001444 import './Xexport.vim' as expo
1445 expo.exported = 'xxx'
Bram Moolenaar60579352021-07-19 21:45:07 +02001446 END
1447 writefile(import_assign_wrong_type_lines, 'Ximport.vim')
1448 assert_fails('source Ximport.vim', 'E1012: Type mismatch; expected number but got string', '', 3)
1449
1450 var import_assign_const_lines =<< trim END
1451 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001452 import './Xexport.vim' as expo
1453 expo.CONST = 4321
Bram Moolenaar60579352021-07-19 21:45:07 +02001454 END
1455 writefile(import_assign_const_lines, 'Ximport.vim')
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001456 assert_fails('source Ximport.vim', 'E46: Cannot change read-only variable "CONST"', '', 3)
Bram Moolenaar60579352021-07-19 21:45:07 +02001457
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001458 delete('Ximport.vim')
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001459 delete('Ximport3.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001460 delete('Xexport.vim')
1461
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001462 # Check that in a Vim9 script 'cpo' is set to the Vim default.
Bram Moolenaar3e191692021-03-17 17:46:00 +01001463 # Flags added or removed are also applied to the restored value.
1464 set cpo=abcd
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001465 var lines =<< trim END
Bram Moolenaar750802b2020-02-23 18:08:33 +01001466 vim9script
1467 g:cpo_in_vim9script = &cpo
Bram Moolenaar3e191692021-03-17 17:46:00 +01001468 set cpo+=f
1469 set cpo-=c
1470 g:cpo_after_vim9script = &cpo
Bram Moolenaar750802b2020-02-23 18:08:33 +01001471 END
1472 writefile(lines, 'Xvim9_script')
1473 source Xvim9_script
Bram Moolenaar3e191692021-03-17 17:46:00 +01001474 assert_equal('fabd', &cpo)
Bram Moolenaar750802b2020-02-23 18:08:33 +01001475 set cpo&vim
1476 assert_equal(&cpo, g:cpo_in_vim9script)
Bram Moolenaar3e191692021-03-17 17:46:00 +01001477 var newcpo = substitute(&cpo, 'c', '', '') .. 'f'
1478 assert_equal(newcpo, g:cpo_after_vim9script)
1479
Bram Moolenaar750802b2020-02-23 18:08:33 +01001480 delete('Xvim9_script')
1481enddef
1482
Bram Moolenaar5fe07d22021-10-22 22:17:53 +01001483def Test_import_funcref()
1484 var lines =<< trim END
1485 vim9script
1486 export def F(): number
1487 return 42
1488 enddef
1489 export const G = F
1490 END
1491 writefile(lines, 'Xlib.vim')
1492
1493 lines =<< trim END
1494 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001495 import './Xlib.vim' as lib
1496 const Foo = lib.G()
Bram Moolenaar5fe07d22021-10-22 22:17:53 +01001497 assert_equal(42, Foo)
1498
1499 def DoTest()
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001500 const Goo = lib.G()
Bram Moolenaar06ca48a2021-10-23 10:25:21 +01001501 assert_equal(42, Goo)
Bram Moolenaar5fe07d22021-10-22 22:17:53 +01001502 enddef
1503 DoTest()
1504 END
1505 CheckScriptSuccess(lines)
1506
1507 delete('Xlib.vim')
1508enddef
1509
Bram Moolenaar6853c382021-09-07 22:12:19 +02001510def Test_import_star_fails()
1511 writefile([], 'Xfoo.vim')
1512 var lines =<< trim END
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001513 import './Xfoo.vim' as foo
Bram Moolenaar6853c382021-09-07 22:12:19 +02001514 foo = 'bar'
1515 END
Bram Moolenaar86b3ab42021-12-19 18:33:23 +00001516 CheckDefAndScriptFailure(lines, ['E1094:', 'E1236: Cannot use foo itself'])
Bram Moolenaar6853c382021-09-07 22:12:19 +02001517 lines =<< trim END
1518 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001519 import './Xfoo.vim' as foo
Bram Moolenaar6853c382021-09-07 22:12:19 +02001520 var that = foo
1521 END
1522 CheckScriptFailure(lines, 'E1029: Expected ''.''')
Bram Moolenaara9e3d562021-09-08 12:31:35 +02001523
1524 lines =<< trim END
1525 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001526 import './Xfoo.vim' as 9foo
Bram Moolenaara9e3d562021-09-08 12:31:35 +02001527 END
1528 CheckScriptFailure(lines, 'E1047:')
1529 lines =<< trim END
1530 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001531 import './Xfoo.vim' as the#foo
Bram Moolenaara9e3d562021-09-08 12:31:35 +02001532 END
1533 CheckScriptFailure(lines, 'E1047:')
1534 lines =<< trim END
1535 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001536 import './Xfoo.vim' as g:foo
Bram Moolenaara9e3d562021-09-08 12:31:35 +02001537 END
1538 CheckScriptFailure(lines, 'E1047:')
1539
Bram Moolenaaraf2d5d22021-09-07 22:35:34 +02001540 delete('Xfoo.vim')
Bram Moolenaarf8a79fc2021-12-14 12:06:16 +00001541
1542 lines =<< trim END
1543 vim9script
1544 def TheFunc()
1545 echo 'the func'
1546 enddef
1547 export var Ref = TheFunc
1548 END
1549 writefile([], 'Xthat.vim')
1550 lines =<< trim END
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001551 import './Xthat.vim' as That
Bram Moolenaarf8a79fc2021-12-14 12:06:16 +00001552 That()
1553 END
Bram Moolenaar86b3ab42021-12-19 18:33:23 +00001554 CheckDefAndScriptFailure(lines, ['E1094:', 'E1236: Cannot use That itself'])
Bram Moolenaarf8a79fc2021-12-14 12:06:16 +00001555 delete('Xthat.vim')
Bram Moolenaar6853c382021-09-07 22:12:19 +02001556enddef
1557
Bram Moolenaar803af682020-08-05 16:20:03 +02001558func g:Trigger()
1559 source Ximport.vim
1560 return "echo 'yes'\<CR>"
1561endfunc
1562
1563def Test_import_export_expr_map()
1564 # check that :import and :export work when buffer is locked
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001565 var export_lines =<< trim END
Bram Moolenaar803af682020-08-05 16:20:03 +02001566 vim9script
1567 export def That(): string
1568 return 'yes'
1569 enddef
1570 END
1571 writefile(export_lines, 'Xexport_that.vim')
1572
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001573 var import_lines =<< trim END
Bram Moolenaar803af682020-08-05 16:20:03 +02001574 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001575 import './Xexport_that.vim' as that
1576 assert_equal('yes', that.That())
Bram Moolenaar803af682020-08-05 16:20:03 +02001577 END
1578 writefile(import_lines, 'Ximport.vim')
1579
1580 nnoremap <expr> trigger g:Trigger()
1581 feedkeys('trigger', "xt")
1582
Bram Moolenaar730b2482020-08-09 13:02:10 +02001583 delete('Xexport_that.vim')
Bram Moolenaar803af682020-08-05 16:20:03 +02001584 delete('Ximport.vim')
1585 nunmap trigger
1586enddef
1587
Bram Moolenaar8e1986e2020-08-06 22:11:06 +02001588def Test_import_in_filetype()
1589 # check that :import works when the buffer is locked
1590 mkdir('ftplugin', 'p')
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001591 var export_lines =<< trim END
Bram Moolenaar8e1986e2020-08-06 22:11:06 +02001592 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001593 export var That = 'yes'
Bram Moolenaar8e1986e2020-08-06 22:11:06 +02001594 END
Bram Moolenaar730b2482020-08-09 13:02:10 +02001595 writefile(export_lines, 'ftplugin/Xexport_ft.vim')
Bram Moolenaar8e1986e2020-08-06 22:11:06 +02001596
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001597 var import_lines =<< trim END
Bram Moolenaar8e1986e2020-08-06 22:11:06 +02001598 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001599 import './Xexport_ft.vim' as ft
1600 assert_equal('yes', ft.That)
Bram Moolenaar8e1986e2020-08-06 22:11:06 +02001601 g:did_load_mytpe = 1
1602 END
1603 writefile(import_lines, 'ftplugin/qf.vim')
1604
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001605 var save_rtp = &rtp
Bram Moolenaar8e1986e2020-08-06 22:11:06 +02001606 &rtp = getcwd() .. ',' .. &rtp
1607
1608 filetype plugin on
1609 copen
1610 assert_equal(1, g:did_load_mytpe)
1611
1612 quit!
Bram Moolenaar730b2482020-08-09 13:02:10 +02001613 delete('Xexport_ft.vim')
Bram Moolenaar8e1986e2020-08-06 22:11:06 +02001614 delete('ftplugin', 'rf')
1615 &rtp = save_rtp
1616enddef
1617
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001618" FIXME
1619"def Test_use_import_in_mapping()
1620" var lines =<< trim END
1621" vim9script
1622" export def Funcx()
1623" g:result = 42
1624" enddef
1625" END
1626" writefile(lines, 'XsomeExport.vim')
1627" lines =<< trim END
1628" vim9script
1629" import './XsomeExport.vim' as some
1630" var Funcy = some.Funcx
1631" nnoremap <F3> :call <sid>Funcy()<cr>
1632" END
1633" writefile(lines, 'Xmapscript.vim')
1634"
1635" source Xmapscript.vim
1636" feedkeys("\<F3>", "xt")
1637" assert_equal(42, g:result)
1638"
1639" unlet g:result
1640" delete('XsomeExport.vim')
1641" delete('Xmapscript.vim')
1642" nunmap <F3>
1643"enddef
Bram Moolenaarefa94442020-08-08 22:16:00 +02001644
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001645def Test_vim9script_mix()
1646 var lines =<< trim END
1647 if has(g:feature)
1648 " legacy script
1649 let g:legacy = 1
1650 finish
1651 endif
1652 vim9script
1653 g:legacy = 0
1654 END
1655 g:feature = 'eval'
1656 g:legacy = -1
1657 CheckScriptSuccess(lines)
1658 assert_equal(1, g:legacy)
1659
1660 g:feature = 'noteval'
1661 g:legacy = -1
1662 CheckScriptSuccess(lines)
1663 assert_equal(0, g:legacy)
1664enddef
1665
Bram Moolenaar750802b2020-02-23 18:08:33 +01001666def Test_vim9script_fails()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001667 CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
1668 CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001669 CheckScriptFailure(['export var some = 123'], 'E1042:')
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001670 CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
Bram Moolenaar750802b2020-02-23 18:08:33 +01001671 CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1672
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001673 CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
Bram Moolenaarc785b9a2020-06-19 18:34:15 +02001674 CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1675
Bram Moolenaare2e40752020-09-04 21:18:46 +02001676 assert_fails('vim9script', 'E1038:')
1677 assert_fails('export something', 'E1043:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001678enddef
1679
Bram Moolenaarf7d267e2020-06-17 12:04:54 +02001680func Test_import_fails_without_script()
Bram Moolenaar101f4812020-06-16 23:18:51 +02001681 CheckRunVimInTerminal
1682
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001683 " call indirectly to avoid compilation error for missing functions
Bram Moolenaarc620c052020-07-08 15:16:19 +02001684 call Run_Test_import_fails_on_command_line()
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001685endfunc
1686
Bram Moolenaarc620c052020-07-08 15:16:19 +02001687def Run_Test_import_fails_on_command_line()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001688 var export =<< trim END
Bram Moolenaar101f4812020-06-16 23:18:51 +02001689 vim9script
1690 export def Foo(): number
1691 return 0
1692 enddef
1693 END
Bram Moolenaar730b2482020-08-09 13:02:10 +02001694 writefile(export, 'XexportCmd.vim')
Bram Moolenaar101f4812020-06-16 23:18:51 +02001695
Bram Moolenaare0de1712020-12-02 17:36:54 +01001696 var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001697 rows: 6, wait_for_ruler: 0})
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001698 WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
Bram Moolenaar101f4812020-06-16 23:18:51 +02001699
Bram Moolenaar730b2482020-08-09 13:02:10 +02001700 delete('XexportCmd.vim')
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001701 StopVimInTerminal(buf)
1702enddef
Bram Moolenaar101f4812020-06-16 23:18:51 +02001703
Bram Moolenaar2b327002020-12-26 15:39:31 +01001704def Test_vim9script_reload_noclear()
1705 var lines =<< trim END
Bram Moolenaara6294952020-12-27 13:39:50 +01001706 vim9script
1707 export var exported = 'thexport'
Bram Moolenaar60dc8272021-07-29 22:48:54 +02001708
1709 export def TheFunc(x = 0)
1710 enddef
Bram Moolenaara6294952020-12-27 13:39:50 +01001711 END
1712 writefile(lines, 'XExportReload')
1713 lines =<< trim END
Bram Moolenaar2b327002020-12-26 15:39:31 +01001714 vim9script noclear
1715 g:loadCount += 1
1716 var s:reloaded = 'init'
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001717 import './XExportReload' as exp
Bram Moolenaar2b327002020-12-26 15:39:31 +01001718
1719 def Again(): string
1720 return 'again'
1721 enddef
1722
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001723 exp.TheFunc()
Bram Moolenaar60dc8272021-07-29 22:48:54 +02001724
Bram Moolenaar2b327002020-12-26 15:39:31 +01001725 if exists('s:loaded') | finish | endif
1726 var s:loaded = true
1727
1728 var s:notReloaded = 'yes'
1729 s:reloaded = 'first'
1730 def g:Values(): list<string>
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001731 return [s:reloaded, s:notReloaded, Again(), Once(), exp.exported]
Bram Moolenaar2b327002020-12-26 15:39:31 +01001732 enddef
1733
1734 def Once(): string
1735 return 'once'
1736 enddef
1737 END
1738 writefile(lines, 'XReloaded')
1739 g:loadCount = 0
1740 source XReloaded
1741 assert_equal(1, g:loadCount)
Bram Moolenaara6294952020-12-27 13:39:50 +01001742 assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
Bram Moolenaar2b327002020-12-26 15:39:31 +01001743 source XReloaded
1744 assert_equal(2, g:loadCount)
Bram Moolenaara6294952020-12-27 13:39:50 +01001745 assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
Bram Moolenaar2b327002020-12-26 15:39:31 +01001746 source XReloaded
1747 assert_equal(3, g:loadCount)
Bram Moolenaara6294952020-12-27 13:39:50 +01001748 assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
Bram Moolenaar2b327002020-12-26 15:39:31 +01001749
Bram Moolenaar48e11c12021-01-11 18:47:00 +01001750 delete('XReloaded')
Bram Moolenaara6294952020-12-27 13:39:50 +01001751 delete('XExportReload')
Bram Moolenaar2b327002020-12-26 15:39:31 +01001752 delfunc g:Values
Bram Moolenaar2b327002020-12-26 15:39:31 +01001753 unlet g:loadCount
Bram Moolenaar577dc932021-06-27 15:35:40 +02001754
1755 lines =<< trim END
1756 vim9script
1757 def Inner()
1758 enddef
1759 END
1760 lines->writefile('XreloadScript.vim')
1761 source XreloadScript.vim
1762
1763 lines =<< trim END
1764 vim9script
1765 def Outer()
1766 def Inner()
1767 enddef
1768 enddef
1769 defcompile
1770 END
1771 lines->writefile('XreloadScript.vim')
1772 source XreloadScript.vim
1773
1774 delete('XreloadScript.vim')
Bram Moolenaar2b327002020-12-26 15:39:31 +01001775enddef
1776
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001777def Test_vim9script_reload_import()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001778 var lines =<< trim END
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001779 vim9script
1780 const var = ''
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001781 var valone = 1234
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001782 def MyFunc(arg: string)
1783 valone = 5678
1784 enddef
1785 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001786 var morelines =<< trim END
1787 var valtwo = 222
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001788 export def GetValtwo(): number
1789 return valtwo
1790 enddef
1791 END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001792 writefile(lines + morelines, 'Xreload.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001793 source Xreload.vim
1794 source Xreload.vim
1795 source Xreload.vim
1796
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001797 # cannot declare a var twice
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001798 lines =<< trim END
1799 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001800 var valone = 1234
1801 var valone = 5678
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001802 END
1803 writefile(lines, 'Xreload.vim')
Bram Moolenaar44d66522020-09-06 22:26:57 +02001804 assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001805
1806 delete('Xreload.vim')
1807 delete('Ximport.vim')
1808enddef
1809
Bram Moolenaar07a65d22020-12-26 20:09:15 +01001810" if a script is reloaded with a script-local variable that changed its type, a
1811" compiled function using that variable must fail.
1812def Test_script_reload_change_type()
1813 var lines =<< trim END
1814 vim9script noclear
1815 var str = 'string'
1816 def g:GetStr(): string
1817 return str .. 'xxx'
1818 enddef
1819 END
1820 writefile(lines, 'Xreload.vim')
1821 source Xreload.vim
1822 echo g:GetStr()
1823
1824 lines =<< trim END
1825 vim9script noclear
1826 var str = 1234
1827 END
1828 writefile(lines, 'Xreload.vim')
1829 source Xreload.vim
1830 assert_fails('echo g:GetStr()', 'E1150:')
1831
1832 delfunc g:GetStr
1833 delete('Xreload.vim')
1834enddef
1835
Bram Moolenaarc970e422021-03-17 15:03:04 +01001836" Define CallFunc so that the test can be compiled
1837command CallFunc echo 'nop'
1838
1839def Test_script_reload_from_function()
1840 var lines =<< trim END
1841 vim9script
1842
1843 if exists('g:loaded')
1844 finish
1845 endif
1846 g:loaded = 1
1847 delcommand CallFunc
1848 command CallFunc Func()
1849 def Func()
Bram Moolenaara4c81be2021-03-17 15:23:16 +01001850 so XreloadFunc.vim
Bram Moolenaarc970e422021-03-17 15:03:04 +01001851 g:didTheFunc = 1
1852 enddef
1853 END
1854 writefile(lines, 'XreloadFunc.vim')
1855 source XreloadFunc.vim
1856 CallFunc
1857 assert_equal(1, g:didTheFunc)
1858
1859 delete('XreloadFunc.vim')
1860 delcommand CallFunc
1861 unlet g:loaded
1862 unlet g:didTheFunc
1863enddef
1864
Bram Moolenaar6c3843c2021-03-04 12:38:21 +01001865def Test_script_var_shadows_function()
1866 var lines =<< trim END
1867 vim9script
1868 def Func(): number
1869 return 123
1870 enddef
1871 var Func = 1
1872 END
1873 CheckScriptFailure(lines, 'E1041:', 5)
1874enddef
1875
Bram Moolenaar052ff292021-12-11 13:54:46 +00001876def Test_function_shadows_script_var()
1877 var lines =<< trim END
1878 vim9script
1879 var Func = 1
1880 def Func(): number
1881 return 123
1882 enddef
1883 END
1884 CheckScriptFailure(lines, 'E1041:', 3)
1885enddef
1886
Bram Moolenaarc3235272021-07-10 19:42:03 +02001887def Test_script_var_shadows_command()
1888 var lines =<< trim END
1889 var undo = 1
1890 undo = 2
1891 assert_equal(2, undo)
1892 END
1893 CheckDefAndScriptSuccess(lines)
1894
1895 lines =<< trim END
1896 var undo = 1
1897 undo
1898 END
1899 CheckDefAndScriptFailure(lines, 'E1207:', 2)
1900enddef
1901
Bram Moolenaar2ef91562021-12-11 16:14:07 +00001902def Test_vim9script_call_wrong_type()
1903 var lines =<< trim END
1904 vim9script
1905 var Time = 'localtime'
1906 Time()
1907 END
1908 CheckScriptFailure(lines, 'E1085:')
1909enddef
1910
Bram Moolenaar95006e32020-08-29 17:47:08 +02001911def s:RetSome(): string
1912 return 'some'
1913enddef
1914
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001915" Not exported function that is referenced needs to be accessed by the
1916" script-local name.
1917def Test_vim9script_funcref()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001918 var sortlines =<< trim END
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001919 vim9script
1920 def Compare(i1: number, i2: number): number
Bram Moolenaarbed36b92020-07-07 23:31:36 +02001921 return i2 - i1
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001922 enddef
1923
1924 export def FastSort(): list<number>
1925 return range(5)->sort(Compare)
1926 enddef
Bram Moolenaar529fb5a2021-04-01 12:57:57 +02001927
1928 export def GetString(arg: string): string
1929 return arg
1930 enddef
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001931 END
1932 writefile(sortlines, 'Xsort.vim')
1933
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001934 var lines =<< trim END
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001935 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001936 import './Xsort.vim'
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001937 def Test()
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001938 g:result = Xsort.FastSort()
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001939 enddef
1940 Test()
Bram Moolenaar529fb5a2021-04-01 12:57:57 +02001941
1942 # using a function imported with "as"
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001943 import './Xsort.vim' as anAlias
Bram Moolenaar529fb5a2021-04-01 12:57:57 +02001944 assert_equal('yes', anAlias.GetString('yes'))
1945
1946 # using the function from a compiled function
1947 def TestMore(): string
Bram Moolenaarca51cc02021-04-01 21:38:53 +02001948 var s = s:anAlias.GetString('foo')
1949 return s .. anAlias.GetString('bar')
Bram Moolenaar529fb5a2021-04-01 12:57:57 +02001950 enddef
Bram Moolenaarca51cc02021-04-01 21:38:53 +02001951 assert_equal('foobar', TestMore())
Bram Moolenaar529fb5a2021-04-01 12:57:57 +02001952
1953 # error when using a function that isn't exported
1954 assert_fails('anAlias.Compare(1, 2)', 'E1049:')
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001955 END
1956 writefile(lines, 'Xscript.vim')
1957
1958 source Xscript.vim
1959 assert_equal([4, 3, 2, 1, 0], g:result)
1960
1961 unlet g:result
1962 delete('Xsort.vim')
1963 delete('Xscript.vim')
Bram Moolenaar95006e32020-08-29 17:47:08 +02001964
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001965 var Funcref = function('s:RetSome')
Bram Moolenaar95006e32020-08-29 17:47:08 +02001966 assert_equal('some', Funcref())
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001967enddef
1968
Bram Moolenaar601e76a2020-08-27 21:33:10 +02001969" Check that when searching for "FilterFunc" it finds the import in the
1970" script where FastFilter() is called from, both as a string and as a direct
1971" function reference.
Bram Moolenaarc620c052020-07-08 15:16:19 +02001972def Test_vim9script_funcref_other_script()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001973 var filterLines =<< trim END
Bram Moolenaarc620c052020-07-08 15:16:19 +02001974 vim9script
1975 export def FilterFunc(idx: number, val: number): bool
1976 return idx % 2 == 1
1977 enddef
1978 export def FastFilter(): list<number>
Bram Moolenaar18024052021-12-25 21:43:28 +00001979 return range(10)->filter('FilterFunc(v:key, v:val)')
Bram Moolenaarc620c052020-07-08 15:16:19 +02001980 enddef
Bram Moolenaar601e76a2020-08-27 21:33:10 +02001981 export def FastFilterDirect(): list<number>
1982 return range(10)->filter(FilterFunc)
1983 enddef
Bram Moolenaarc620c052020-07-08 15:16:19 +02001984 END
1985 writefile(filterLines, 'Xfilter.vim')
1986
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001987 var lines =<< trim END
Bram Moolenaarc620c052020-07-08 15:16:19 +02001988 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001989 import './Xfilter.vim' as filter
Bram Moolenaarc620c052020-07-08 15:16:19 +02001990 def Test()
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001991 var x: list<number> = filter.FastFilter()
Bram Moolenaarc620c052020-07-08 15:16:19 +02001992 enddef
1993 Test()
Bram Moolenaar601e76a2020-08-27 21:33:10 +02001994 def TestDirect()
Bram Moolenaard5f400c2022-01-06 21:10:28 +00001995 var x: list<number> = filter.FastFilterDirect()
Bram Moolenaar601e76a2020-08-27 21:33:10 +02001996 enddef
1997 TestDirect()
Bram Moolenaarc620c052020-07-08 15:16:19 +02001998 END
Bram Moolenaar601e76a2020-08-27 21:33:10 +02001999 CheckScriptSuccess(lines)
Bram Moolenaarc620c052020-07-08 15:16:19 +02002000 delete('Xfilter.vim')
Bram Moolenaarc620c052020-07-08 15:16:19 +02002001enddef
2002
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002003def Test_vim9script_reload_delfunc()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002004 var first_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002005 vim9script
2006 def FuncYes(): string
2007 return 'yes'
2008 enddef
2009 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002010 var withno_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002011 def FuncNo(): string
2012 return 'no'
2013 enddef
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002014 def g:DoCheck(no_exists: bool)
2015 assert_equal('yes', FuncYes())
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02002016 assert_equal('no', FuncNo())
2017 enddef
2018 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002019 var nono_lines =<< trim END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02002020 def g:DoCheck(no_exists: bool)
2021 assert_equal('yes', FuncYes())
Bram Moolenaar44d66522020-09-06 22:26:57 +02002022 assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002023 enddef
2024 END
2025
2026 # FuncNo() is defined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02002027 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002028 source Xreloaded.vim
2029 g:DoCheck(true)
2030
2031 # FuncNo() is not redefined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02002032 writefile(first_lines + nono_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002033 source Xreloaded.vim
Bram Moolenaar50824712020-12-20 21:10:17 +01002034 g:DoCheck(false)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002035
2036 # FuncNo() is back
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02002037 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002038 source Xreloaded.vim
Bram Moolenaar50824712020-12-20 21:10:17 +01002039 g:DoCheck(false)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002040
2041 delete('Xreloaded.vim')
2042enddef
2043
Bram Moolenaar89483d42020-05-10 15:24:44 +02002044def Test_vim9script_reload_delvar()
2045 # write the script with a script-local variable
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002046 var lines =<< trim END
Bram Moolenaar89483d42020-05-10 15:24:44 +02002047 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002048 var name = 'string'
Bram Moolenaar89483d42020-05-10 15:24:44 +02002049 END
2050 writefile(lines, 'XreloadVar.vim')
2051 source XreloadVar.vim
2052
2053 # now write the script using the same variable locally - works
2054 lines =<< trim END
2055 vim9script
2056 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002057 var name = 'string'
Bram Moolenaar89483d42020-05-10 15:24:44 +02002058 enddef
2059 END
2060 writefile(lines, 'XreloadVar.vim')
2061 source XreloadVar.vim
2062
2063 delete('XreloadVar.vim')
2064enddef
2065
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002066def Test_import_absolute()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002067 var import_lines = [
Bram Moolenaare6085c52020-04-12 20:19:16 +02002068 'vim9script',
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002069 'import "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim" as abs',
Bram Moolenaare6085c52020-04-12 20:19:16 +02002070 'def UseExported()',
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002071 ' g:imported_abs = abs.exported',
2072 ' abs.exported = 8888',
2073 ' g:imported_after = abs.exported',
Bram Moolenaare6085c52020-04-12 20:19:16 +02002074 'enddef',
2075 'UseExported()',
2076 'g:import_disassembled = execute("disass UseExported")',
2077 ]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002078 writefile(import_lines, 'Ximport_abs.vim')
2079 writefile(s:export_script_lines, 'Xexport_abs.vim')
2080
2081 source Ximport_abs.vim
2082
2083 assert_equal(9876, g:imported_abs)
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +01002084 assert_equal(8888, g:imported_after)
Bram Moolenaarfbbcd002020-10-15 12:46:44 +02002085 assert_match('<SNR>\d\+_UseExported\_s*' ..
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002086 'g:imported_abs = abs.exported\_s*' ..
Bram Moolenaarfbbcd002020-10-15 12:46:44 +02002087 '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
2088 '1 STOREG g:imported_abs\_s*' ..
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002089 'abs.exported = 8888\_s*' ..
Bram Moolenaarfbbcd002020-10-15 12:46:44 +02002090 '2 PUSHNR 8888\_s*' ..
2091 '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002092 'g:imported_after = abs.exported\_s*' ..
Bram Moolenaarfbbcd002020-10-15 12:46:44 +02002093 '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
2094 '5 STOREG g:imported_after',
Bram Moolenaare6085c52020-04-12 20:19:16 +02002095 g:import_disassembled)
Bram Moolenaarb3ca9822020-08-09 14:43:58 +02002096
2097 Undo_export_script_lines()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002098 unlet g:imported_abs
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +01002099 unlet g:import_disassembled
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002100
2101 delete('Ximport_abs.vim')
2102 delete('Xexport_abs.vim')
2103enddef
2104
2105def Test_import_rtp()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002106 var import_lines = [
Bram Moolenaare6085c52020-04-12 20:19:16 +02002107 'vim9script',
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002108 'import "Xexport_rtp.vim" as rtp',
2109 'g:imported_rtp = rtp.exported',
Bram Moolenaare6085c52020-04-12 20:19:16 +02002110 ]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002111 writefile(import_lines, 'Ximport_rtp.vim')
Bram Moolenaarb885a7c2021-07-08 22:02:11 +02002112 mkdir('import', 'p')
2113 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002114
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002115 var save_rtp = &rtp
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002116 &rtp = getcwd()
2117 source Ximport_rtp.vim
2118 &rtp = save_rtp
2119
2120 assert_equal(9876, g:imported_rtp)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002121
Bram Moolenaarb3ca9822020-08-09 14:43:58 +02002122 Undo_export_script_lines()
2123 unlet g:imported_rtp
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002124 delete('Ximport_rtp.vim')
Bram Moolenaarb885a7c2021-07-08 22:02:11 +02002125 delete('import', 'rf')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002126enddef
2127
Bram Moolenaar25e0f582020-05-25 22:36:50 +02002128def Test_import_compile_error()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002129 var export_lines = [
Bram Moolenaar25e0f582020-05-25 22:36:50 +02002130 'vim9script',
2131 'export def ExpFunc(): string',
2132 ' return notDefined',
2133 'enddef',
2134 ]
2135 writefile(export_lines, 'Xexported.vim')
2136
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002137 var import_lines = [
Bram Moolenaar25e0f582020-05-25 22:36:50 +02002138 'vim9script',
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002139 'import "./Xexported.vim" as expo',
Bram Moolenaar25e0f582020-05-25 22:36:50 +02002140 'def ImpFunc()',
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002141 ' echo expo.ExpFunc()',
Bram Moolenaar25e0f582020-05-25 22:36:50 +02002142 'enddef',
2143 'defcompile',
2144 ]
2145 writefile(import_lines, 'Ximport.vim')
2146
2147 try
2148 source Ximport.vim
2149 catch /E1001/
Dominique Pelle923dce22021-11-21 11:36:04 +00002150 # Error should be before the Xexported.vim file.
Bram Moolenaar77072282020-09-16 17:55:40 +02002151 assert_match('E1001: Variable not found: notDefined', v:exception)
Bram Moolenaar25e0f582020-05-25 22:36:50 +02002152 assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
2153 endtry
2154
2155 delete('Xexported.vim')
2156 delete('Ximport.vim')
2157enddef
2158
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02002159def Test_func_redefine_error()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002160 var lines = [
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02002161 'vim9script',
2162 'def Func()',
2163 ' eval [][0]',
2164 'enddef',
2165 'Func()',
2166 ]
2167 writefile(lines, 'Xtestscript.vim')
2168
2169 for count in range(3)
2170 try
2171 source Xtestscript.vim
2172 catch /E684/
2173 # function name should contain <SNR> every time
2174 assert_match('E684: list index out of range', v:exception)
2175 assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
2176 endtry
2177 endfor
2178
2179 delete('Xtestscript.vim')
2180enddef
2181
Bram Moolenaareef21022020-08-01 22:16:43 +02002182def Test_func_overrules_import_fails()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002183 var export_lines =<< trim END
Bram Moolenaareef21022020-08-01 22:16:43 +02002184 vim9script
2185 export def Func()
2186 echo 'imported'
2187 enddef
2188 END
2189 writefile(export_lines, 'XexportedFunc.vim')
2190
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002191 var lines =<< trim END
Bram Moolenaareef21022020-08-01 22:16:43 +02002192 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002193 import './XexportedFunc.vim' as Func
Bram Moolenaareef21022020-08-01 22:16:43 +02002194 def Func()
2195 echo 'local to function'
2196 enddef
2197 END
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002198 CheckScriptFailure(lines, 'E1236:')
Bram Moolenaareef21022020-08-01 22:16:43 +02002199
2200 lines =<< trim END
2201 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002202 import './XexportedFunc.vim' as Func
Bram Moolenaareef21022020-08-01 22:16:43 +02002203 def Outer()
2204 def Func()
2205 echo 'local to function'
2206 enddef
2207 enddef
2208 defcompile
2209 END
Bram Moolenaard5f400c2022-01-06 21:10:28 +00002210 CheckScriptFailure(lines, 'E1236:')
Bram Moolenaareef21022020-08-01 22:16:43 +02002211
2212 delete('XexportedFunc.vim')
2213enddef
2214
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02002215def Test_func_redefine_fails()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002216 var lines =<< trim END
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02002217 vim9script
2218 def Func()
2219 echo 'one'
2220 enddef
2221 def Func()
2222 echo 'two'
2223 enddef
2224 END
2225 CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarfa211f32020-08-07 22:00:26 +02002226
2227 lines =<< trim END
2228 vim9script
2229 def Foo(): string
2230 return 'foo'
Bram Moolenaar052ff292021-12-11 13:54:46 +00002231 enddef
Bram Moolenaarfa211f32020-08-07 22:00:26 +02002232 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002233 var Foo = {-> 'lambda'}
Bram Moolenaarfa211f32020-08-07 22:00:26 +02002234 enddef
2235 defcompile
2236 END
2237 CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02002238enddef
2239
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002240def Test_fixed_size_list()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002241 # will be allocated as one piece of memory, check that changes work
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002242 var l = [1, 2, 3, 4]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002243 l->remove(0)
2244 l->add(5)
2245 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01002246 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002247enddef
2248
Bram Moolenaarae616492020-07-28 20:07:27 +02002249def Test_no_insert_xit()
Bram Moolenaard2c61702020-09-06 15:58:36 +02002250 CheckDefExecFailure(['a = 1'], 'E1100:')
2251 CheckDefExecFailure(['c = 1'], 'E1100:')
2252 CheckDefExecFailure(['i = 1'], 'E1100:')
2253 CheckDefExecFailure(['t = 1'], 'E1100:')
2254 CheckDefExecFailure(['x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02002255
Bram Moolenaarae616492020-07-28 20:07:27 +02002256 CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
2257 CheckScriptFailure(['vim9script', 'a'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02002258 CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
2259 CheckScriptFailure(['vim9script', 'c'], 'E1100:')
Bram Moolenaarf5a48012020-08-01 17:00:03 +02002260 CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
2261 CheckScriptFailure(['vim9script', 'i'], 'E1100:')
Bram Moolenaar65088802021-03-13 21:07:21 +01002262 CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
2263 CheckScriptFailure(['vim9script', 'o'], 'E1100:')
Bram Moolenaarf5a48012020-08-01 17:00:03 +02002264 CheckScriptFailure(['vim9script', 't'], 'E1100:')
2265 CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
2266 CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02002267enddef
2268
Bram Moolenaar158906c2020-02-06 20:39:45 +01002269def IfElse(what: number): string
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002270 var res = ''
Bram Moolenaar158906c2020-02-06 20:39:45 +01002271 if what == 1
2272 res = "one"
2273 elseif what == 2
2274 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01002275 else
Bram Moolenaar158906c2020-02-06 20:39:45 +01002276 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01002277 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +01002278 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +01002279enddef
2280
Bram Moolenaar158906c2020-02-06 20:39:45 +01002281def Test_if_elseif_else()
2282 assert_equal('one', IfElse(1))
2283 assert_equal('two', IfElse(2))
2284 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01002285enddef
2286
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002287def Test_if_elseif_else_fails()
Bram Moolenaard2c61702020-09-06 15:58:36 +02002288 CheckDefFailure(['elseif true'], 'E582:')
2289 CheckDefFailure(['else'], 'E581:')
2290 CheckDefFailure(['endif'], 'E580:')
Bram Moolenaarced68a02021-01-24 17:53:47 +01002291 CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
Bram Moolenaard2c61702020-09-06 15:58:36 +02002292 CheckDefFailure(['if true', 'echo 1'], 'E171:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01002293
2294 var lines =<< trim END
2295 var s = ''
2296 if s = ''
2297 endif
2298 END
2299 CheckDefFailure(lines, 'E488:')
2300
2301 lines =<< trim END
2302 var s = ''
2303 if s == ''
2304 elseif s = ''
2305 endif
2306 END
2307 CheckDefFailure(lines, 'E488:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002308enddef
2309
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002310let g:bool_true = v:true
2311let g:bool_false = v:false
2312
2313def Test_if_const_expr()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002314 var res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002315 if true ? true : false
2316 res = true
2317 endif
2318 assert_equal(true, res)
2319
Bram Moolenaar585fea72020-04-02 22:33:21 +02002320 g:glob = 2
2321 if false
Bram Moolenaar67979662020-06-20 22:50:47 +02002322 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02002323 endif
2324 assert_equal(2, g:glob)
2325 if true
Bram Moolenaar67979662020-06-20 22:50:47 +02002326 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02002327 endif
2328 assert_equal(3, g:glob)
2329
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002330 res = false
2331 if g:bool_true ? true : false
2332 res = true
2333 endif
2334 assert_equal(true, res)
2335
2336 res = false
2337 if true ? g:bool_true : false
2338 res = true
2339 endif
2340 assert_equal(true, res)
2341
2342 res = false
2343 if true ? true : g:bool_false
2344 res = true
2345 endif
2346 assert_equal(true, res)
2347
2348 res = false
2349 if true ? false : true
2350 res = true
2351 endif
2352 assert_equal(false, res)
2353
2354 res = false
2355 if false ? false : true
2356 res = true
2357 endif
2358 assert_equal(true, res)
2359
2360 res = false
2361 if false ? true : false
2362 res = true
2363 endif
2364 assert_equal(false, res)
2365
2366 res = false
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002367 if has('xyz') ? true : false
2368 res = true
2369 endif
2370 assert_equal(false, res)
2371
2372 res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002373 if true && true
2374 res = true
2375 endif
2376 assert_equal(true, res)
2377
2378 res = false
2379 if true && false
2380 res = true
2381 endif
2382 assert_equal(false, res)
2383
2384 res = false
2385 if g:bool_true && false
2386 res = true
2387 endif
2388 assert_equal(false, res)
2389
2390 res = false
2391 if true && g:bool_false
2392 res = true
2393 endif
2394 assert_equal(false, res)
2395
2396 res = false
2397 if false && false
2398 res = true
2399 endif
2400 assert_equal(false, res)
2401
2402 res = false
2403 if true || false
2404 res = true
2405 endif
2406 assert_equal(true, res)
2407
2408 res = false
2409 if g:bool_true || false
2410 res = true
2411 endif
2412 assert_equal(true, res)
2413
2414 res = false
2415 if true || g:bool_false
2416 res = true
2417 endif
2418 assert_equal(true, res)
2419
2420 res = false
2421 if false || false
2422 res = true
2423 endif
2424 assert_equal(false, res)
Bram Moolenaar3988f642020-08-27 22:43:03 +02002425
2426 # with constant "false" expression may be invalid so long as the syntax is OK
Bram Moolenaarc3235272021-07-10 19:42:03 +02002427 if false | eval 1 + 2 | endif
Bram Moolenaar3988f642020-08-27 22:43:03 +02002428 if false | eval burp + 234 | endif
2429 if false | echo burp 234 'asd' | endif
2430 if false
2431 burp
2432 endif
Bram Moolenaare525bdd2021-08-07 18:12:40 +02002433
2434 # expression with line breaks skipped
2435 if false
2436 ('aaa'
2437 .. 'bbb'
2438 .. 'ccc'
2439 )->setline(1)
2440 endif
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02002441enddef
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002442
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02002443def Test_if_const_expr_fails()
Bram Moolenaard2c61702020-09-06 15:58:36 +02002444 CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2445 CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2446 CheckDefFailure(["if has('aaa'"], 'E110:')
2447 CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002448enddef
2449
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002450def RunNested(i: number): number
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002451 var x: number = 0
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002452 if i % 2
2453 if 1
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002454 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002455 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002456 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002457 endif
2458 x += 1
2459 else
2460 x += 1000
2461 endif
2462 return x
2463enddef
2464
2465def Test_nested_if()
2466 assert_equal(1, RunNested(1))
2467 assert_equal(1000, RunNested(2))
2468enddef
2469
Bram Moolenaarad39c092020-02-26 18:23:43 +01002470def Test_execute_cmd()
Bram Moolenaare4984292020-12-13 14:19:25 +01002471 # missing argument is ignored
2472 execute
2473 execute # comment
2474
Bram Moolenaarad39c092020-02-26 18:23:43 +01002475 new
2476 setline(1, 'default')
Bram Moolenaard2c61702020-09-06 15:58:36 +02002477 execute 'setline(1, "execute-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002478 assert_equal('execute-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002479
Bram Moolenaard2c61702020-09-06 15:58:36 +02002480 execute "setline(1, 'execute-string')"
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002481 assert_equal('execute-string', getline(1))
2482
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002483 var cmd1 = 'setline(1,'
2484 var cmd2 = '"execute-var")'
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002485 execute cmd1 cmd2 # comment
Bram Moolenaarad39c092020-02-26 18:23:43 +01002486 assert_equal('execute-var', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002487
Bram Moolenaard2c61702020-09-06 15:58:36 +02002488 execute cmd1 cmd2 '|setline(1, "execute-var-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002489 assert_equal('execute-var-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002490
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002491 var cmd_first = 'call '
2492 var cmd_last = 'setline(1, "execute-var-var")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002493 execute cmd_first .. cmd_last
2494 assert_equal('execute-var-var', getline(1))
2495 bwipe!
Bram Moolenaar585fea72020-04-02 22:33:21 +02002496
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002497 var n = true
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02002498 execute 'echomsg' (n ? '"true"' : '"no"')
2499 assert_match('^true$', Screenline(&lines))
2500
Bram Moolenaare0de1712020-12-02 17:36:54 +01002501 echomsg [1, 2, 3] {a: 1, b: 2}
Bram Moolenaare5abf7a2020-08-16 18:29:35 +02002502 assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines))
2503
Bram Moolenaard2c61702020-09-06 15:58:36 +02002504 CheckDefFailure(['execute xxx'], 'E1001:', 1)
2505 CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2506 CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
Bram Moolenaarad39c092020-02-26 18:23:43 +01002507enddef
2508
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002509def Test_execute_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002510 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002511 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002512 vim9script
2513 execute 'g:someVar'
2514 .. ' = ' ..
2515 '28'
2516 assert_equal(28, g:someVar)
2517 unlet g:someVar
2518 END
2519 CheckScriptSuccess(lines)
2520enddef
2521
Bram Moolenaarad39c092020-02-26 18:23:43 +01002522def Test_echo_cmd()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002523 echo 'some' # comment
Bram Moolenaar585fea72020-04-02 22:33:21 +02002524 echon 'thing'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002525 assert_match('^something$', Screenline(&lines))
2526
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002527 echo "some" # comment
2528 echon "thing"
2529 assert_match('^something$', Screenline(&lines))
2530
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002531 var str1 = 'some'
2532 var str2 = 'more'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002533 echo str1 str2
2534 assert_match('^some more$', Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002535
Bram Moolenaard2c61702020-09-06 15:58:36 +02002536 CheckDefFailure(['echo "xxx"# comment'], 'E488:')
Bram Moolenaarad39c092020-02-26 18:23:43 +01002537enddef
2538
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002539def Test_echomsg_cmd()
2540 echomsg 'some' 'more' # comment
2541 assert_match('^some more$', Screenline(&lines))
2542 echo 'clear'
Bram Moolenaardf069ee2020-06-22 23:02:51 +02002543 :1messages
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002544 assert_match('^some more$', Screenline(&lines))
2545
Bram Moolenaard2c61702020-09-06 15:58:36 +02002546 CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002547enddef
2548
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002549def Test_echomsg_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002550 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002551 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002552 vim9script
2553 echomsg 'here'
2554 .. ' is ' ..
2555 'a message'
2556 assert_match('^here is a message$', Screenline(&lines))
2557 END
2558 CheckScriptSuccess(lines)
2559enddef
2560
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002561def Test_echoerr_cmd()
Bram Moolenaar7de62622021-08-07 15:05:47 +02002562 var local = 'local'
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002563 try
Bram Moolenaar7de62622021-08-07 15:05:47 +02002564 echoerr 'something' local 'wrong' # comment
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002565 catch
Bram Moolenaar7de62622021-08-07 15:05:47 +02002566 assert_match('something local wrong', v:exception)
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002567 endtry
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002568enddef
2569
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002570def Test_echoerr_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002571 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002572 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002573 vim9script
2574 try
2575 echoerr 'this'
2576 .. ' is ' ..
2577 'wrong'
2578 catch
2579 assert_match('this is wrong', v:exception)
2580 endtry
2581 END
2582 CheckScriptSuccess(lines)
2583enddef
2584
Bram Moolenaar7de62622021-08-07 15:05:47 +02002585def Test_echoconsole_cmd()
2586 var local = 'local'
2587 echoconsole 'something' local # comment
2588 # output goes anywhere
2589enddef
2590
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002591def Test_for_outside_of_function()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002592 var lines =<< trim END
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002593 vim9script
2594 new
2595 for var in range(0, 3)
2596 append(line('$'), var)
2597 endfor
2598 assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
2599 bwipe!
Bram Moolenaar522eefd2021-03-26 18:49:22 +01002600
2601 var result = ''
2602 for i in [1, 2, 3]
2603 var loop = ' loop ' .. i
2604 result ..= loop
2605 endfor
2606 assert_equal(' loop 1 loop 2 loop 3', result)
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002607 END
2608 writefile(lines, 'Xvim9for.vim')
2609 source Xvim9for.vim
2610 delete('Xvim9for.vim')
2611enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002612
rbtnnbebf0692021-08-21 17:26:50 +02002613def Test_for_skipped_block()
2614 # test skipped blocks at outside of function
2615 var lines =<< trim END
2616 var result = []
2617 if true
2618 for n in [1, 2]
2619 result += [n]
2620 endfor
2621 else
2622 for n in [3, 4]
2623 result += [n]
2624 endfor
2625 endif
2626 assert_equal([1, 2], result)
2627
2628 result = []
2629 if false
2630 for n in [1, 2]
2631 result += [n]
2632 endfor
2633 else
2634 for n in [3, 4]
2635 result += [n]
2636 endfor
2637 endif
2638 assert_equal([3, 4], result)
2639 END
2640 CheckDefAndScriptSuccess(lines)
2641
2642 # test skipped blocks at inside of function
2643 lines =<< trim END
2644 def DefTrue()
2645 var result = []
2646 if true
2647 for n in [1, 2]
2648 result += [n]
2649 endfor
2650 else
2651 for n in [3, 4]
2652 result += [n]
2653 endfor
2654 endif
2655 assert_equal([1, 2], result)
2656 enddef
2657 DefTrue()
2658
2659 def DefFalse()
2660 var result = []
2661 if false
2662 for n in [1, 2]
2663 result += [n]
2664 endfor
2665 else
2666 for n in [3, 4]
2667 result += [n]
2668 endfor
2669 endif
2670 assert_equal([3, 4], result)
2671 enddef
2672 DefFalse()
2673 END
2674 CheckDefAndScriptSuccess(lines)
2675enddef
2676
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002677def Test_for_loop()
Bram Moolenaarf2253962021-04-13 20:53:13 +02002678 var lines =<< trim END
2679 var result = ''
2680 for cnt in range(7)
2681 if cnt == 4
2682 break
2683 endif
2684 if cnt == 2
2685 continue
2686 endif
2687 result ..= cnt .. '_'
2688 endfor
2689 assert_equal('0_1_3_', result)
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02002690
Bram Moolenaarf2253962021-04-13 20:53:13 +02002691 var concat = ''
2692 for str in eval('["one", "two"]')
2693 concat ..= str
2694 endfor
2695 assert_equal('onetwo', concat)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002696
Bram Moolenaarf2253962021-04-13 20:53:13 +02002697 var total = 0
2698 for nr in
2699 [1, 2, 3]
2700 total += nr
2701 endfor
2702 assert_equal(6, total)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002703
Bram Moolenaarf2253962021-04-13 20:53:13 +02002704 total = 0
2705 for nr
2706 in [1, 2, 3]
2707 total += nr
2708 endfor
2709 assert_equal(6, total)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002710
Bram Moolenaarf2253962021-04-13 20:53:13 +02002711 total = 0
2712 for nr
2713 in
2714 [1, 2, 3]
2715 total += nr
2716 endfor
2717 assert_equal(6, total)
Bram Moolenaar036d0712021-01-17 20:23:38 +01002718
Bram Moolenaara3589a02021-04-14 13:30:46 +02002719 # with type
2720 total = 0
2721 for n: number in [1, 2, 3]
2722 total += n
2723 endfor
2724 assert_equal(6, total)
2725
Bram Moolenaarfe090eb2021-04-15 21:48:32 +02002726 var chars = ''
2727 for s: string in 'foobar'
2728 chars ..= s
2729 endfor
2730 assert_equal('foobar', chars)
2731
Bram Moolenaar5ede5b22021-07-07 21:55:25 +02002732 chars = ''
2733 for x: string in {a: 'a', b: 'b'}->values()
2734 chars ..= x
2735 endfor
2736 assert_equal('ab', chars)
2737
Bram Moolenaara3589a02021-04-14 13:30:46 +02002738 # unpack with type
Bram Moolenaarf2253962021-04-13 20:53:13 +02002739 var res = ''
Bram Moolenaara3589a02021-04-14 13:30:46 +02002740 for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2741 res ..= n .. s
2742 endfor
2743 assert_equal('1a2b', res)
2744
Bram Moolenaar444d8782021-06-26 12:40:56 +02002745 # unpack with one var
2746 var reslist = []
2747 for [x] in [['aaa'], ['bbb']]
2748 reslist->add(x)
2749 endfor
2750 assert_equal(['aaa', 'bbb'], reslist)
2751
Bram Moolenaara3589a02021-04-14 13:30:46 +02002752 # loop over string
2753 res = ''
Bram Moolenaarf2253962021-04-13 20:53:13 +02002754 for c in 'aéc̀d'
2755 res ..= c .. '-'
2756 endfor
2757 assert_equal('a-é-c̀-d-', res)
2758
2759 res = ''
2760 for c in ''
2761 res ..= c .. '-'
2762 endfor
2763 assert_equal('', res)
2764
2765 res = ''
2766 for c in test_null_string()
2767 res ..= c .. '-'
2768 endfor
2769 assert_equal('', res)
2770
2771 var foo: list<dict<any>> = [
2772 {a: 'Cat'}
2773 ]
2774 for dd in foo
2775 dd.counter = 12
2776 endfor
2777 assert_equal([{a: 'Cat', counter: 12}], foo)
Bram Moolenaarad2d4962021-07-18 17:08:50 +02002778
2779 reslist = []
2780 for _ in range(3)
2781 reslist->add('x')
2782 endfor
2783 assert_equal(['x', 'x', 'x'], reslist)
Bram Moolenaarf2253962021-04-13 20:53:13 +02002784 END
2785 CheckDefAndScriptSuccess(lines)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002786enddef
2787
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002788def Test_for_loop_with_closure()
2789 var lines =<< trim END
2790 var flist: list<func>
2791 for i in range(5)
2792 var inloop = i
2793 flist[i] = () => inloop
2794 endfor
2795 for i in range(5)
2796 assert_equal(4, flist[i]())
2797 endfor
2798 END
2799 CheckDefAndScriptSuccess(lines)
2800
2801 lines =<< trim END
2802 var flist: list<func>
2803 for i in range(5)
2804 var inloop = i
2805 flist[i] = () => {
2806 return inloop
2807 }
2808 endfor
2809 for i in range(5)
2810 assert_equal(4, flist[i]())
2811 endfor
2812 END
2813 CheckDefAndScriptSuccess(lines)
2814enddef
2815
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002816def Test_for_loop_fails()
Bram Moolenaar86b3ab42021-12-19 18:33:23 +00002817 CheckDefAndScriptFailure(['for '], ['E1097:', 'E690:'])
2818 CheckDefAndScriptFailure(['for x'], ['E1097:', 'E690:'])
2819 CheckDefAndScriptFailure(['for x in'], ['E1097:', 'E15:'])
Bram Moolenaar442b29c2021-07-05 22:23:00 +02002820 CheckDefAndScriptFailure(['for # in range(5)'], 'E690:')
2821 CheckDefAndScriptFailure(['for i In range(5)'], 'E690:')
Bram Moolenaar86b3ab42021-12-19 18:33:23 +00002822 CheckDefAndScriptFailure(['var x = 5', 'for x in range(5)', 'endfor'], ['E1017:', 'E1041:'])
Bram Moolenaard4ab8072021-07-08 19:22:12 +02002823 CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3)
Bram Moolenaar822ba242020-05-24 23:00:18 +02002824 CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01002825 delfunc! g:Func
Bram Moolenaar675f7162020-04-12 22:53:54 +02002826 CheckDefFailure(['for i in xxx'], 'E1001:')
2827 CheckDefFailure(['endfor'], 'E588:')
2828 CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002829
2830 # wrong type detected at compile time
2831 CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
2832
2833 # wrong type detected at runtime
2834 g:adict = {a: 1}
2835 CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
2836 unlet g:adict
Bram Moolenaarf6a8d422021-04-13 21:48:03 +02002837
2838 var lines =<< trim END
2839 var d: list<dict<any>> = [{a: 0}]
2840 for e in d
2841 e = {a: 0, b: ''}
2842 endfor
2843 END
Bram Moolenaar86b3ab42021-12-19 18:33:23 +00002844 CheckDefAndScriptFailure(lines, ['E1018:', 'E46:'], 3)
Bram Moolenaarfe090eb2021-04-15 21:48:32 +02002845
2846 lines =<< trim END
2847 for nr: number in ['foo']
2848 endfor
2849 END
2850 CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
Bram Moolenaar404557e2021-07-05 21:41:48 +02002851
2852 lines =<< trim END
2853 for n : number in [1, 2]
2854 echo n
2855 endfor
2856 END
2857 CheckDefAndScriptFailure(lines, 'E1059:', 1)
Bram Moolenaarefc5db52021-07-07 21:21:30 +02002858
2859 lines =<< trim END
2860 var d: dict<number> = {a: 1, b: 2}
2861 for [k: job, v: job] in d->items()
2862 echo k v
2863 endfor
2864 END
2865 CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected job but got string', 2)
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002866
2867 lines =<< trim END
2868 var i = 0
2869 for i in [1, 2, 3]
2870 echo i
2871 endfor
2872 END
Bram Moolenaar86b3ab42021-12-19 18:33:23 +00002873 CheckDefExecAndScriptFailure(lines, ['E1017:', 'E1041:'])
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002874
2875 lines =<< trim END
2876 var l = [0]
2877 for l[0] in [1, 2, 3]
2878 echo l[0]
2879 endfor
2880 END
Bram Moolenaar86b3ab42021-12-19 18:33:23 +00002881 CheckDefExecAndScriptFailure(lines, ['E461:', 'E1017:'])
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002882
2883 lines =<< trim END
2884 var d = {x: 0}
2885 for d.x in [1, 2, 3]
2886 echo d.x
2887 endfor
2888 END
Bram Moolenaar86b3ab42021-12-19 18:33:23 +00002889 CheckDefExecAndScriptFailure(lines, ['E461:', 'E1017:'])
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002890enddef
2891
Bram Moolenaarea870692020-12-02 14:24:30 +01002892def Test_for_loop_script_var()
2893 # cannot use s:var in a :def function
Bram Moolenaara99fb232021-12-20 12:25:03 +00002894 CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1254:')
Bram Moolenaarea870692020-12-02 14:24:30 +01002895
2896 # can use s:var in Vim9 script, with or without s:
2897 var lines =<< trim END
2898 vim9script
2899 var total = 0
2900 for s:var in [1, 2, 3]
2901 total += s:var
2902 endfor
2903 assert_equal(6, total)
2904
2905 total = 0
2906 for var in [1, 2, 3]
2907 total += var
2908 endfor
2909 assert_equal(6, total)
2910 END
2911enddef
2912
Bram Moolenaar792f7862020-11-23 08:31:18 +01002913def Test_for_loop_unpack()
Bram Moolenaar792f7862020-11-23 08:31:18 +01002914 var lines =<< trim END
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002915 var result = []
2916 for [v1, v2] in [[1, 2], [3, 4]]
2917 result->add(v1)
2918 result->add(v2)
2919 endfor
2920 assert_equal([1, 2, 3, 4], result)
2921
2922 result = []
2923 for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2924 result->add(v1)
2925 result->add(v2)
2926 result->add(v3)
2927 endfor
2928 assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2929
2930 result = []
2931 for [&ts, &sw] in [[1, 2], [3, 4]]
2932 result->add(&ts)
2933 result->add(&sw)
2934 endfor
2935 assert_equal([1, 2, 3, 4], result)
2936
2937 var slist: list<string>
2938 for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
2939 slist->add($LOOPVAR)
2940 slist->add(@r)
2941 slist->add(v:errmsg)
2942 endfor
2943 assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
2944
2945 slist = []
2946 for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
2947 slist->add(g:globalvar)
2948 slist->add(b:bufvar)
2949 slist->add(w:winvar)
2950 slist->add(t:tabvar)
2951 endfor
2952 assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
Bram Moolenaarf6c177a2020-12-04 17:38:00 +01002953 unlet! g:globalvar b:bufvar w:winvar t:tabvar
Bram Moolenaarb777da92021-05-22 21:40:39 +02002954
2955 var res = []
2956 for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
2957 res->add(n)
2958 endfor
2959 assert_equal([2, 5], res)
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002960 END
2961 CheckDefAndScriptSuccess(lines)
2962
2963 lines =<< trim END
Bram Moolenaar792f7862020-11-23 08:31:18 +01002964 for [v1, v2] in [[1, 2, 3], [3, 4]]
2965 echo v1 v2
2966 endfor
2967 END
2968 CheckDefExecFailure(lines, 'E710:', 1)
2969
2970 lines =<< trim END
2971 for [v1, v2] in [[1], [3, 4]]
2972 echo v1 v2
2973 endfor
2974 END
2975 CheckDefExecFailure(lines, 'E711:', 1)
2976
2977 lines =<< trim END
2978 for [v1, v1] in [[1, 2], [3, 4]]
2979 echo v1
2980 endfor
2981 END
2982 CheckDefExecFailure(lines, 'E1017:', 1)
2983enddef
2984
Bram Moolenaarc150c092021-02-13 15:02:46 +01002985def Test_for_loop_with_try_continue()
Bram Moolenaarf2253962021-04-13 20:53:13 +02002986 var lines =<< trim END
2987 var looped = 0
2988 var cleanup = 0
2989 for i in range(3)
2990 looped += 1
2991 try
2992 eval [][0]
2993 catch
2994 continue
2995 finally
2996 cleanup += 1
2997 endtry
2998 endfor
2999 assert_equal(3, looped)
3000 assert_equal(3, cleanup)
3001 END
3002 CheckDefAndScriptSuccess(lines)
Bram Moolenaarc150c092021-02-13 15:02:46 +01003003enddef
3004
rbtnnd895b1d2021-08-20 20:54:25 +02003005def Test_while_skipped_block()
3006 # test skipped blocks at outside of function
3007 var lines =<< trim END
3008 var result = []
3009 var n = 0
3010 if true
3011 n = 1
3012 while n < 3
3013 result += [n]
3014 n += 1
3015 endwhile
3016 else
3017 n = 3
3018 while n < 5
3019 result += [n]
3020 n += 1
3021 endwhile
3022 endif
3023 assert_equal([1, 2], result)
3024
3025 result = []
3026 if false
3027 n = 1
3028 while n < 3
3029 result += [n]
3030 n += 1
3031 endwhile
3032 else
3033 n = 3
3034 while n < 5
3035 result += [n]
3036 n += 1
3037 endwhile
3038 endif
3039 assert_equal([3, 4], result)
3040 END
3041 CheckDefAndScriptSuccess(lines)
3042
3043 # test skipped blocks at inside of function
3044 lines =<< trim END
3045 def DefTrue()
3046 var result = []
3047 var n = 0
3048 if true
3049 n = 1
3050 while n < 3
3051 result += [n]
3052 n += 1
3053 endwhile
3054 else
3055 n = 3
3056 while n < 5
3057 result += [n]
3058 n += 1
3059 endwhile
3060 endif
3061 assert_equal([1, 2], result)
3062 enddef
3063 DefTrue()
3064
3065 def DefFalse()
3066 var result = []
3067 var n = 0
3068 if false
3069 n = 1
3070 while n < 3
3071 result += [n]
3072 n += 1
3073 endwhile
3074 else
3075 n = 3
3076 while n < 5
3077 result += [n]
3078 n += 1
3079 endwhile
3080 endif
3081 assert_equal([3, 4], result)
3082 enddef
3083 DefFalse()
3084 END
3085 CheckDefAndScriptSuccess(lines)
3086enddef
3087
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003088def Test_while_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003089 var result = ''
3090 var cnt = 0
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003091 while cnt < 555
3092 if cnt == 3
3093 break
3094 endif
3095 cnt += 1
3096 if cnt == 2
3097 continue
3098 endif
3099 result ..= cnt .. '_'
3100 endwhile
3101 assert_equal('1_3_', result)
Bram Moolenaardee37dc2021-02-07 16:40:05 +01003102
3103 var s = ''
Bram Moolenaar4b3e1962021-03-18 21:37:55 +01003104 while s == 'x' # {comment}
Bram Moolenaardee37dc2021-02-07 16:40:05 +01003105 endwhile
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003106enddef
3107
Bram Moolenaar7a53f292021-11-22 18:31:02 +00003108def Test_while_loop_in_script()
3109 var lines =<< trim END
3110 vim9script
3111 var result = ''
3112 var cnt = 0
3113 while cnt < 3
3114 var s = 'v' .. cnt
3115 result ..= s
3116 cnt += 1
3117 endwhile
3118 assert_equal('v0v1v2', result)
3119 END
3120 CheckScriptSuccess(lines)
3121enddef
3122
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02003123def Test_while_loop_fails()
Bram Moolenaar675f7162020-04-12 22:53:54 +02003124 CheckDefFailure(['while xxx'], 'E1001:')
3125 CheckDefFailure(['endwhile'], 'E588:')
3126 CheckDefFailure(['continue'], 'E586:')
3127 CheckDefFailure(['if true', 'continue'], 'E586:')
3128 CheckDefFailure(['break'], 'E587:')
3129 CheckDefFailure(['if true', 'break'], 'E587:')
3130 CheckDefFailure(['while 1', 'echo 3'], 'E170:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01003131
3132 var lines =<< trim END
3133 var s = ''
3134 while s = ''
3135 endwhile
3136 END
3137 CheckDefFailure(lines, 'E488:')
Bram Moolenaarbd5da372020-03-31 23:13:10 +02003138enddef
3139
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01003140def Test_interrupt_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003141 var caught = false
3142 var x = 0
Bram Moolenaar97acfc72020-03-22 13:44:28 +01003143 try
3144 while 1
3145 x += 1
3146 if x == 100
3147 feedkeys("\<C-C>", 'Lt')
3148 endif
3149 endwhile
3150 catch
3151 caught = true
3152 assert_equal(100, x)
3153 endtry
3154 assert_true(caught, 'should have caught an exception')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02003155 # consume the CTRL-C
3156 getchar(0)
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01003157enddef
Bram Moolenaar20431c92020-03-20 18:39:46 +01003158
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003159def Test_automatic_line_continuation()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003160 var mylist = [
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003161 'one',
3162 'two',
3163 'three',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003164 ] # comment
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003165 assert_equal(['one', 'two', 'three'], mylist)
3166
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003167 var mydict = {
Bram Moolenaare0de1712020-12-02 17:36:54 +01003168 ['one']: 1,
3169 ['two']: 2,
3170 ['three']:
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003171 3,
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003172 } # comment
Bram Moolenaare0de1712020-12-02 17:36:54 +01003173 assert_equal({one: 1, two: 2, three: 3}, mydict)
3174 mydict = {
Bram Moolenaar2c330432020-04-13 14:41:35 +02003175 one: 1, # comment
3176 two: # comment
3177 2, # comment
3178 three: 3 # comment
3179 }
Bram Moolenaare0de1712020-12-02 17:36:54 +01003180 assert_equal({one: 1, two: 2, three: 3}, mydict)
3181 mydict = {
Bram Moolenaar2c330432020-04-13 14:41:35 +02003182 one: 1,
3183 two:
3184 2,
3185 three: 3
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003186 }
Bram Moolenaare0de1712020-12-02 17:36:54 +01003187 assert_equal({one: 1, two: 2, three: 3}, mydict)
Bram Moolenaare6085c52020-04-12 20:19:16 +02003188
3189 assert_equal(
3190 ['one', 'two', 'three'],
3191 split('one two three')
3192 )
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003193enddef
3194
Bram Moolenaar7a092242020-04-16 22:10:49 +02003195def Test_vim9_comment()
3196 CheckScriptSuccess([
3197 'vim9script',
3198 '# something',
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003199 '#something',
3200 '#{something',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003201 ])
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003202
3203 split Xfile
3204 CheckScriptSuccess([
3205 'vim9script',
3206 'edit #something',
3207 ])
3208 CheckScriptSuccess([
3209 'vim9script',
3210 'edit #{something',
3211 ])
3212 close
3213
Bram Moolenaar7a092242020-04-16 22:10:49 +02003214 CheckScriptFailure([
3215 'vim9script',
3216 ':# something',
3217 ], 'E488:')
3218 CheckScriptFailure([
3219 '# something',
3220 ], 'E488:')
3221 CheckScriptFailure([
3222 ':# something',
3223 ], 'E488:')
3224
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003225 { # block start
3226 } # block end
3227 CheckDefFailure([
3228 '{# comment',
3229 ], 'E488:')
3230 CheckDefFailure([
3231 '{',
3232 '}# comment',
3233 ], 'E488:')
3234
3235 echo "yes" # comment
3236 CheckDefFailure([
3237 'echo "yes"# comment',
3238 ], 'E488:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02003239 CheckScriptSuccess([
3240 'vim9script',
3241 'echo "yes" # something',
3242 ])
3243 CheckScriptFailure([
3244 'vim9script',
3245 'echo "yes"# something',
3246 ], 'E121:')
3247 CheckScriptFailure([
3248 'vim9script',
3249 'echo# something',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003250 ], 'E1144:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02003251 CheckScriptFailure([
3252 'echo "yes" # something',
3253 ], 'E121:')
3254
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003255 exe "echo" # comment
3256 CheckDefFailure([
3257 'exe "echo"# comment',
3258 ], 'E488:')
3259 CheckScriptSuccess([
3260 'vim9script',
3261 'exe "echo" # something',
3262 ])
3263 CheckScriptFailure([
3264 'vim9script',
3265 'exe "echo"# something',
3266 ], 'E121:')
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003267 CheckScriptFailure([
3268 'vim9script',
3269 'exe# something',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003270 ], 'E1144:')
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003271 CheckScriptFailure([
3272 'exe "echo" # something',
3273 ], 'E121:')
3274
Bram Moolenaar7a092242020-04-16 22:10:49 +02003275 CheckDefFailure([
3276 'try# comment',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003277 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003278 'catch',
3279 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003280 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003281 CheckScriptFailure([
3282 'vim9script',
3283 'try# comment',
3284 'echo "yes"',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003285 ], 'E1144:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02003286 CheckDefFailure([
3287 'try',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003288 ' throw#comment',
3289 'catch',
3290 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003291 ], 'E1144:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003292 CheckDefFailure([
3293 'try',
3294 ' throw "yes"#comment',
3295 'catch',
3296 'endtry',
3297 ], 'E488:')
3298 CheckDefFailure([
3299 'try',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003300 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003301 'catch# comment',
3302 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003303 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003304 CheckScriptFailure([
3305 'vim9script',
3306 'try',
3307 ' echo "yes"',
3308 'catch# comment',
3309 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003310 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003311 CheckDefFailure([
3312 'try',
3313 ' echo "yes"',
3314 'catch /pat/# comment',
3315 'endtry',
3316 ], 'E488:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02003317 CheckDefFailure([
3318 'try',
3319 'echo "yes"',
3320 'catch',
3321 'endtry# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003322 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003323 CheckScriptFailure([
3324 'vim9script',
3325 'try',
3326 ' echo "yes"',
3327 'catch',
3328 'endtry# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003329 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003330
3331 CheckScriptSuccess([
3332 'vim9script',
3333 'hi # comment',
3334 ])
3335 CheckScriptFailure([
3336 'vim9script',
3337 'hi# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003338 ], 'E1144:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02003339 CheckScriptSuccess([
3340 'vim9script',
3341 'hi Search # comment',
3342 ])
3343 CheckScriptFailure([
3344 'vim9script',
3345 'hi Search# comment',
3346 ], 'E416:')
3347 CheckScriptSuccess([
3348 'vim9script',
3349 'hi link This Search # comment',
3350 ])
3351 CheckScriptFailure([
3352 'vim9script',
3353 'hi link This That# comment',
3354 ], 'E413:')
3355 CheckScriptSuccess([
3356 'vim9script',
3357 'hi clear This # comment',
3358 'hi clear # comment',
3359 ])
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003360 # not tested, because it doesn't give an error but a warning:
3361 # hi clear This# comment',
Bram Moolenaar1966c242020-04-20 22:42:32 +02003362 CheckScriptFailure([
3363 'vim9script',
3364 'hi clear# comment',
3365 ], 'E416:')
3366
3367 CheckScriptSuccess([
3368 'vim9script',
3369 'hi Group term=bold',
3370 'match Group /todo/ # comment',
3371 ])
3372 CheckScriptFailure([
3373 'vim9script',
3374 'hi Group term=bold',
3375 'match Group /todo/# comment',
3376 ], 'E488:')
3377 CheckScriptSuccess([
3378 'vim9script',
3379 'match # comment',
3380 ])
3381 CheckScriptFailure([
3382 'vim9script',
3383 'match# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003384 ], 'E1144:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02003385 CheckScriptSuccess([
3386 'vim9script',
3387 'match none # comment',
3388 ])
3389 CheckScriptFailure([
3390 'vim9script',
3391 'match none# comment',
3392 ], 'E475:')
3393
3394 CheckScriptSuccess([
3395 'vim9script',
3396 'menutrans clear # comment',
3397 ])
3398 CheckScriptFailure([
3399 'vim9script',
3400 'menutrans clear# comment text',
3401 ], 'E474:')
3402
3403 CheckScriptSuccess([
3404 'vim9script',
3405 'syntax clear # comment',
3406 ])
3407 CheckScriptFailure([
3408 'vim9script',
3409 'syntax clear# comment text',
3410 ], 'E28:')
3411 CheckScriptSuccess([
3412 'vim9script',
3413 'syntax keyword Word some',
3414 'syntax clear Word # comment',
3415 ])
3416 CheckScriptFailure([
3417 'vim9script',
3418 'syntax keyword Word some',
3419 'syntax clear Word# comment text',
3420 ], 'E28:')
3421
3422 CheckScriptSuccess([
3423 'vim9script',
3424 'syntax list # comment',
3425 ])
3426 CheckScriptFailure([
3427 'vim9script',
3428 'syntax list# comment text',
3429 ], 'E28:')
3430
3431 CheckScriptSuccess([
3432 'vim9script',
3433 'syntax match Word /pat/ oneline # comment',
3434 ])
3435 CheckScriptFailure([
3436 'vim9script',
3437 'syntax match Word /pat/ oneline# comment',
3438 ], 'E475:')
3439
3440 CheckScriptSuccess([
3441 'vim9script',
3442 'syntax keyword Word word # comm[ent',
3443 ])
3444 CheckScriptFailure([
3445 'vim9script',
3446 'syntax keyword Word word# comm[ent',
3447 ], 'E789:')
3448
3449 CheckScriptSuccess([
3450 'vim9script',
3451 'syntax match Word /pat/ # comment',
3452 ])
3453 CheckScriptFailure([
3454 'vim9script',
3455 'syntax match Word /pat/# comment',
3456 ], 'E402:')
3457
3458 CheckScriptSuccess([
3459 'vim9script',
3460 'syntax match Word /pat/ contains=Something # comment',
3461 ])
3462 CheckScriptFailure([
3463 'vim9script',
3464 'syntax match Word /pat/ contains=Something# comment',
3465 ], 'E475:')
3466 CheckScriptFailure([
3467 'vim9script',
3468 'syntax match Word /pat/ contains= # comment',
3469 ], 'E406:')
3470 CheckScriptFailure([
3471 'vim9script',
3472 'syntax match Word /pat/ contains=# comment',
3473 ], 'E475:')
3474
3475 CheckScriptSuccess([
3476 'vim9script',
3477 'syntax region Word start=/pat/ end=/pat/ # comment',
3478 ])
3479 CheckScriptFailure([
3480 'vim9script',
3481 'syntax region Word start=/pat/ end=/pat/# comment',
Bram Moolenaard032f342020-07-18 18:13:02 +02003482 ], 'E402:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02003483
3484 CheckScriptSuccess([
3485 'vim9script',
3486 'syntax sync # comment',
3487 ])
3488 CheckScriptFailure([
3489 'vim9script',
3490 'syntax sync# comment',
3491 ], 'E404:')
3492 CheckScriptSuccess([
3493 'vim9script',
3494 'syntax sync ccomment # comment',
3495 ])
3496 CheckScriptFailure([
3497 'vim9script',
3498 'syntax sync ccomment# comment',
3499 ], 'E404:')
3500
3501 CheckScriptSuccess([
3502 'vim9script',
3503 'syntax cluster Some contains=Word # comment',
3504 ])
3505 CheckScriptFailure([
3506 'vim9script',
3507 'syntax cluster Some contains=Word# comment',
3508 ], 'E475:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003509
3510 CheckScriptSuccess([
3511 'vim9script',
3512 'command Echo echo # comment',
3513 'command Echo # comment',
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003514 'delcommand Echo',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003515 ])
3516 CheckScriptFailure([
3517 'vim9script',
3518 'command Echo echo# comment',
3519 'Echo',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003520 ], 'E1144:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003521 delcommand Echo
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003522
3523 var curdir = getcwd()
3524 CheckScriptSuccess([
3525 'command Echo cd " comment',
3526 'Echo',
3527 'delcommand Echo',
3528 ])
3529 CheckScriptSuccess([
Bram Moolenaar090728a2020-12-20 15:43:31 +01003530 'vim9script',
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003531 'command Echo cd # comment',
3532 'Echo',
3533 'delcommand Echo',
3534 ])
3535 CheckScriptFailure([
3536 'vim9script',
3537 'command Echo cd " comment',
3538 'Echo',
3539 ], 'E344:')
3540 delcommand Echo
3541 chdir(curdir)
3542
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003543 CheckScriptFailure([
3544 'vim9script',
3545 'command Echo# comment',
3546 ], 'E182:')
3547 CheckScriptFailure([
3548 'vim9script',
3549 'command Echo echo',
3550 'command Echo# comment',
3551 ], 'E182:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003552 delcommand Echo
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003553
3554 CheckScriptSuccess([
3555 'vim9script',
3556 'function # comment',
3557 ])
3558 CheckScriptFailure([
3559 'vim9script',
Bram Moolenaar98981072020-07-29 14:40:25 +02003560 'function " comment',
3561 ], 'E129:')
3562 CheckScriptFailure([
3563 'vim9script',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003564 'function# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003565 ], 'E1144:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003566 CheckScriptSuccess([
3567 'vim9script',
3568 'function CheckScriptSuccess # comment',
3569 ])
3570 CheckScriptFailure([
3571 'vim9script',
3572 'function CheckScriptSuccess# comment',
3573 ], 'E488:')
3574
3575 CheckScriptSuccess([
3576 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003577 'func g:DeleteMeA()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003578 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003579 'delfunction g:DeleteMeA # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003580 ])
3581 CheckScriptFailure([
3582 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003583 'func g:DeleteMeB()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003584 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003585 'delfunction g:DeleteMeB# comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003586 ], 'E488:')
3587
3588 CheckScriptSuccess([
3589 'vim9script',
3590 'call execute("ls") # comment',
3591 ])
3592 CheckScriptFailure([
3593 'vim9script',
3594 'call execute("ls")# comment',
3595 ], 'E488:')
Bram Moolenaare7e48382020-07-22 18:17:08 +02003596
3597 CheckScriptFailure([
3598 'def Test() " comment',
3599 'enddef',
3600 ], 'E488:')
3601 CheckScriptFailure([
3602 'vim9script',
3603 'def Test() " comment',
3604 'enddef',
3605 ], 'E488:')
3606
3607 CheckScriptSuccess([
3608 'func Test() " comment',
3609 'endfunc',
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003610 'delfunc Test',
Bram Moolenaare7e48382020-07-22 18:17:08 +02003611 ])
Bram Moolenaar98981072020-07-29 14:40:25 +02003612 CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003613 'vim9script',
3614 'func Test() " comment',
3615 'endfunc',
Bram Moolenaar98981072020-07-29 14:40:25 +02003616 ])
Bram Moolenaare7e48382020-07-22 18:17:08 +02003617
3618 CheckScriptSuccess([
3619 'def Test() # comment',
3620 'enddef',
3621 ])
3622 CheckScriptFailure([
3623 'func Test() # comment',
3624 'endfunc',
3625 ], 'E488:')
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003626
3627 var lines =<< trim END
3628 vim9script
3629 syn region Text
3630 \ start='foo'
3631 #\ comment
3632 \ end='bar'
Bram Moolenaar5072b472021-06-03 21:56:10 +02003633 syn region Text start='foo'
3634 #\ comment
3635 \ end='bar'
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003636 END
3637 CheckScriptSuccess(lines)
3638
3639 lines =<< trim END
3640 vim9script
3641 syn region Text
3642 \ start='foo'
3643 "\ comment
3644 \ end='bar'
3645 END
3646 CheckScriptFailure(lines, 'E399:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003647enddef
3648
3649def Test_vim9_comment_gui()
3650 CheckCanRunGui
3651
3652 CheckScriptFailure([
3653 'vim9script',
3654 'gui#comment'
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003655 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003656 CheckScriptFailure([
3657 'vim9script',
3658 'gui -f#comment'
Bram Moolenaarb8bd2e62021-08-21 17:13:14 +02003659 ], 'E194:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02003660enddef
3661
Bram Moolenaara26b9702020-04-18 19:53:28 +02003662def Test_vim9_comment_not_compiled()
Bram Moolenaar67979662020-06-20 22:50:47 +02003663 au TabEnter *.vim g:entered = 1
3664 au TabEnter *.x g:entered = 2
Bram Moolenaara26b9702020-04-18 19:53:28 +02003665
3666 edit test.vim
3667 doautocmd TabEnter #comment
3668 assert_equal(1, g:entered)
3669
3670 doautocmd TabEnter f.x
3671 assert_equal(2, g:entered)
3672
3673 g:entered = 0
3674 doautocmd TabEnter f.x #comment
3675 assert_equal(2, g:entered)
3676
3677 assert_fails('doautocmd Syntax#comment', 'E216:')
3678
3679 au! TabEnter
3680 unlet g:entered
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003681
3682 CheckScriptSuccess([
3683 'vim9script',
Bram Moolenaar67979662020-06-20 22:50:47 +02003684 'g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003685 'b:var = 456',
3686 'w:var = 777',
3687 't:var = 888',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003688 'unlet g:var w:var # something',
3689 ])
3690
3691 CheckScriptFailure([
3692 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003693 'let var = 123',
3694 ], 'E1126: Cannot use :let in Vim9 script')
3695
3696 CheckScriptFailure([
3697 'vim9script',
3698 'var g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003699 ], 'E1016: Cannot declare a global variable:')
3700
3701 CheckScriptFailure([
3702 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003703 'var b:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003704 ], 'E1016: Cannot declare a buffer variable:')
3705
3706 CheckScriptFailure([
3707 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003708 'var w:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003709 ], 'E1016: Cannot declare a window variable:')
3710
3711 CheckScriptFailure([
3712 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003713 'var t:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003714 ], 'E1016: Cannot declare a tab variable:')
3715
3716 CheckScriptFailure([
3717 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003718 'var v:version = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003719 ], 'E1016: Cannot declare a v: variable:')
3720
3721 CheckScriptFailure([
3722 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003723 'var $VARIABLE = "text"',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003724 ], 'E1016: Cannot declare an environment variable:')
Bram Moolenaar67979662020-06-20 22:50:47 +02003725
3726 CheckScriptFailure([
3727 'vim9script',
3728 'g:var = 123',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003729 'unlet g:var# comment1',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003730 ], 'E108:')
3731
3732 CheckScriptFailure([
3733 'let g:var = 123',
3734 'unlet g:var # something',
3735 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003736
3737 CheckScriptSuccess([
3738 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003739 'if 1 # comment2',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003740 ' echo "yes"',
3741 'elseif 2 #comment',
3742 ' echo "no"',
3743 'endif',
3744 ])
3745
3746 CheckScriptFailure([
3747 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003748 'if 1# comment3',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003749 ' echo "yes"',
3750 'endif',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003751 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003752
3753 CheckScriptFailure([
3754 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003755 'if 0 # comment4',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003756 ' echo "yes"',
3757 'elseif 2#comment',
3758 ' echo "no"',
3759 'endif',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003760 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003761
3762 CheckScriptSuccess([
3763 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003764 'var v = 1 # comment5',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003765 ])
3766
3767 CheckScriptFailure([
3768 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003769 'var v = 1# comment6',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003770 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003771
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003772 CheckScriptSuccess([
3773 'vim9script',
3774 'new'
Bram Moolenaard2c61702020-09-06 15:58:36 +02003775 'setline(1, ["# define pat", "last"])',
Bram Moolenaardf069ee2020-06-22 23:02:51 +02003776 ':$',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003777 'dsearch /pat/ #comment',
3778 'bwipe!',
3779 ])
3780
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003781 CheckScriptFailure([
3782 'vim9script',
3783 'new'
Bram Moolenaard2c61702020-09-06 15:58:36 +02003784 'setline(1, ["# define pat", "last"])',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003785 ':$',
3786 'dsearch /pat/#comment',
3787 'bwipe!',
3788 ], 'E488:')
3789
3790 CheckScriptFailure([
3791 'vim9script',
3792 'func! SomeFunc()',
3793 ], 'E477:')
Bram Moolenaara26b9702020-04-18 19:53:28 +02003794enddef
3795
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003796def Test_finish()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003797 var lines =<< trim END
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003798 vim9script
Bram Moolenaar67979662020-06-20 22:50:47 +02003799 g:res = 'one'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003800 if v:false | finish | endif
Bram Moolenaar67979662020-06-20 22:50:47 +02003801 g:res = 'two'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003802 finish
Bram Moolenaar67979662020-06-20 22:50:47 +02003803 g:res = 'three'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003804 END
3805 writefile(lines, 'Xfinished')
3806 source Xfinished
3807 assert_equal('two', g:res)
3808
3809 unlet g:res
3810 delete('Xfinished')
3811enddef
3812
Bram Moolenaara5d00772020-05-14 23:20:55 +02003813def Test_forward_declaration()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003814 var lines =<< trim END
Bram Moolenaara5d00772020-05-14 23:20:55 +02003815 vim9script
Bram Moolenaara5d00772020-05-14 23:20:55 +02003816 def GetValue(): string
3817 return theVal
3818 enddef
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003819 var theVal = 'something'
Bram Moolenaar822ba242020-05-24 23:00:18 +02003820 g:initVal = GetValue()
Bram Moolenaara5d00772020-05-14 23:20:55 +02003821 theVal = 'else'
3822 g:laterVal = GetValue()
3823 END
3824 writefile(lines, 'Xforward')
3825 source Xforward
3826 assert_equal('something', g:initVal)
3827 assert_equal('else', g:laterVal)
3828
3829 unlet g:initVal
3830 unlet g:laterVal
3831 delete('Xforward')
3832enddef
3833
Bram Moolenaar9721fb42020-06-11 23:10:46 +02003834def Test_source_vim9_from_legacy()
Bram Moolenaara6294952020-12-27 13:39:50 +01003835 var vim9_lines =<< trim END
3836 vim9script
3837 var local = 'local'
3838 g:global = 'global'
3839 export var exported = 'exported'
3840 export def GetText(): string
3841 return 'text'
3842 enddef
3843 END
3844 writefile(vim9_lines, 'Xvim9_script.vim')
3845
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003846 var legacy_lines =<< trim END
Bram Moolenaar9721fb42020-06-11 23:10:46 +02003847 source Xvim9_script.vim
3848
3849 call assert_false(exists('local'))
3850 call assert_false(exists('exported'))
3851 call assert_false(exists('s:exported'))
3852 call assert_equal('global', global)
3853 call assert_equal('global', g:global)
3854
Bram Moolenaard5f400c2022-01-06 21:10:28 +00003855 "" imported variable becomes script-local
3856 "import exported from './Xvim9_script.vim'
3857 "call assert_equal('exported', s:exported)
3858 "call assert_false(exists('exported'))
Bram Moolenaar9721fb42020-06-11 23:10:46 +02003859
Bram Moolenaard5f400c2022-01-06 21:10:28 +00003860 "" imported function becomes script-local
3861 "import GetText from './Xvim9_script.vim'
3862 "call assert_equal('text', s:GetText())
3863 "call assert_false(exists('*GetText'))
Bram Moolenaar9721fb42020-06-11 23:10:46 +02003864 END
3865 writefile(legacy_lines, 'Xlegacy_script.vim')
3866
Bram Moolenaar9721fb42020-06-11 23:10:46 +02003867 source Xlegacy_script.vim
Bram Moolenaar9721fb42020-06-11 23:10:46 +02003868 assert_equal('global', g:global)
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003869 unlet g:global
Bram Moolenaar9721fb42020-06-11 23:10:46 +02003870
3871 delete('Xlegacy_script.vim')
3872 delete('Xvim9_script.vim')
3873enddef
Bram Moolenaara5d00772020-05-14 23:20:55 +02003874
Bram Moolenaare535db82021-03-31 21:07:24 +02003875def Test_declare_script_in_func()
3876 var lines =<< trim END
3877 vim9script
3878 func Declare()
3879 let s:local = 123
3880 endfunc
3881 Declare()
3882 assert_equal(123, local)
3883
3884 var error: string
3885 try
3886 local = 'asdf'
3887 catch
3888 error = v:exception
3889 endtry
3890 assert_match('E1012: Type mismatch; expected number but got string', error)
3891
3892 lockvar local
3893 try
3894 local = 999
3895 catch
3896 error = v:exception
3897 endtry
3898 assert_match('E741: Value is locked: local', error)
3899 END
3900 CheckScriptSuccess(lines)
3901enddef
3902
3903
Bram Moolenaar7d699702020-08-14 20:52:28 +02003904func Test_vim9script_not_global()
3905 " check that items defined in Vim9 script are script-local, not global
3906 let vim9lines =<< trim END
3907 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003908 var name = 'local'
Bram Moolenaar7d699702020-08-14 20:52:28 +02003909 func TheFunc()
3910 echo 'local'
3911 endfunc
3912 def DefFunc()
3913 echo 'local'
3914 enddef
3915 END
3916 call writefile(vim9lines, 'Xvim9script.vim')
3917 source Xvim9script.vim
3918 try
3919 echo g:var
3920 assert_report('did not fail')
3921 catch /E121:/
3922 " caught
3923 endtry
3924 try
3925 call TheFunc()
3926 assert_report('did not fail')
3927 catch /E117:/
3928 " caught
3929 endtry
3930 try
3931 call DefFunc()
3932 assert_report('did not fail')
3933 catch /E117:/
3934 " caught
3935 endtry
3936
Bram Moolenaar25859dd2020-08-30 12:54:53 +02003937 call delete('Xvim9script.vim')
Bram Moolenaar7d699702020-08-14 20:52:28 +02003938endfunc
3939
Bram Moolenaareeb27bf2020-07-04 17:39:10 +02003940def Test_vim9_copen()
3941 # this was giving an error for setting w:quickfix_title
3942 copen
3943 quit
3944enddef
3945
Bram Moolenaar03290b82020-12-19 16:30:44 +01003946" test using an auto-loaded function and variable
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02003947def Test_vim9_autoload()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003948 var lines =<< trim END
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02003949 vim9script
Bram Moolenaar03290b82020-12-19 16:30:44 +01003950 def some#gettest(): string
3951 return 'test'
3952 enddef
3953 g:some#name = 'name'
Bram Moolenaar227c58a2021-04-28 20:40:44 +02003954 g:some#dict = {key: 'value'}
Bram Moolenaare3ffcd92021-03-08 21:47:13 +01003955
3956 def some#varargs(a1: string, ...l: list<string>): string
3957 return a1 .. l[0] .. l[1]
3958 enddef
Bram Moolenaar03290b82020-12-19 16:30:44 +01003959 END
3960
3961 mkdir('Xdir/autoload', 'p')
3962 writefile(lines, 'Xdir/autoload/some.vim')
3963 var save_rtp = &rtp
3964 exe 'set rtp^=' .. getcwd() .. '/Xdir'
3965
3966 assert_equal('test', g:some#gettest())
3967 assert_equal('name', g:some#name)
Bram Moolenaar227c58a2021-04-28 20:40:44 +02003968 assert_equal('value', g:some#dict.key)
Bram Moolenaar03290b82020-12-19 16:30:44 +01003969 g:some#other = 'other'
3970 assert_equal('other', g:some#other)
3971
Bram Moolenaare3ffcd92021-03-08 21:47:13 +01003972 assert_equal('abc', some#varargs('a', 'b', 'c'))
3973
Bram Moolenaar17f700a2020-12-19 21:23:42 +01003974 # upper case script name works
3975 lines =<< trim END
3976 vim9script
3977 def Other#getOther(): string
3978 return 'other'
3979 enddef
3980 END
3981 writefile(lines, 'Xdir/autoload/Other.vim')
3982 assert_equal('other', g:Other#getOther())
3983
Bram Moolenaar03290b82020-12-19 16:30:44 +01003984 delete('Xdir', 'rf')
3985 &rtp = save_rtp
3986enddef
3987
Bram Moolenaarc7d5fc82021-12-05 17:20:24 +00003988" test disassembling an auto-loaded function starting with "debug"
3989def Test_vim9_autoload_disass()
3990 mkdir('Xdir/autoload', 'p')
3991 var save_rtp = &rtp
3992 exe 'set rtp^=' .. getcwd() .. '/Xdir'
3993
3994 var lines =<< trim END
3995 vim9script
3996 def debugit#test(): string
3997 return 'debug'
3998 enddef
3999 END
4000 writefile(lines, 'Xdir/autoload/debugit.vim')
4001
4002 lines =<< trim END
4003 vim9script
4004 def profileit#test(): string
4005 return 'profile'
4006 enddef
4007 END
4008 writefile(lines, 'Xdir/autoload/profileit.vim')
4009
4010 lines =<< trim END
4011 vim9script
4012 assert_equal('debug', debugit#test())
4013 disass debugit#test
4014 assert_equal('profile', profileit#test())
4015 disass profileit#test
4016 END
4017 CheckScriptSuccess(lines)
4018
4019 delete('Xdir', 'rf')
4020 &rtp = save_rtp
4021enddef
4022
Bram Moolenaar03290b82020-12-19 16:30:44 +01004023" test using a vim9script that is auto-loaded from an autocmd
4024def Test_vim9_aucmd_autoload()
4025 var lines =<< trim END
4026 vim9script
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02004027 def foo#test()
4028 echomsg getreg('"')
4029 enddef
4030 END
4031
4032 mkdir('Xdir/autoload', 'p')
4033 writefile(lines, 'Xdir/autoload/foo.vim')
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004034 var save_rtp = &rtp
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02004035 exe 'set rtp^=' .. getcwd() .. '/Xdir'
4036 augroup test
4037 autocmd TextYankPost * call foo#test()
4038 augroup END
4039
4040 normal Y
4041
4042 augroup test
4043 autocmd!
4044 augroup END
4045 delete('Xdir', 'rf')
4046 &rtp = save_rtp
4047enddef
4048
Bram Moolenaar77e5dcc2020-09-17 21:29:03 +02004049" This was causing a crash because suppress_errthrow wasn't reset.
4050def Test_vim9_autoload_error()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004051 var lines =<< trim END
Bram Moolenaar77e5dcc2020-09-17 21:29:03 +02004052 vim9script
4053 def crash#func()
4054 try
4055 for x in List()
4056 endfor
4057 catch
4058 endtry
4059 g:ok = true
4060 enddef
4061 fu List()
4062 invalid
4063 endfu
4064 try
Bram Moolenaar48e11c12021-01-11 18:47:00 +01004065 alsoinvalid
Bram Moolenaar77e5dcc2020-09-17 21:29:03 +02004066 catch /wontmatch/
4067 endtry
4068 END
4069 call mkdir('Xruntime/autoload', 'p')
4070 call writefile(lines, 'Xruntime/autoload/crash.vim')
4071
4072 # run in a separate Vim to avoid the side effects of assert_fails()
4073 lines =<< trim END
4074 exe 'set rtp^=' .. getcwd() .. '/Xruntime'
4075 call crash#func()
4076 call writefile(['ok'], 'Xdidit')
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004077 qall!
Bram Moolenaar77e5dcc2020-09-17 21:29:03 +02004078 END
4079 writefile(lines, 'Xscript')
4080 RunVim([], [], '-S Xscript')
4081 assert_equal(['ok'], readfile('Xdidit'))
4082
4083 delete('Xdidit')
4084 delete('Xscript')
4085 delete('Xruntime', 'rf')
Bram Moolenaar03290b82020-12-19 16:30:44 +01004086
4087 lines =<< trim END
4088 vim9script
4089 var foo#bar = 'asdf'
4090 END
4091 CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
Bram Moolenaar77e5dcc2020-09-17 21:29:03 +02004092enddef
4093
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02004094def Test_script_var_in_autocmd()
4095 # using a script variable from an autocommand, defined in a :def function in a
4096 # legacy Vim script, cannot check the variable type.
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004097 var lines =<< trim END
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02004098 let s:counter = 1
4099 def s:Func()
4100 au! CursorHold
4101 au CursorHold * s:counter += 1
4102 enddef
4103 call s:Func()
4104 doau CursorHold
4105 call assert_equal(2, s:counter)
4106 au! CursorHold
4107 END
4108 CheckScriptSuccess(lines)
4109enddef
4110
Bram Moolenaarb5841b92021-07-15 18:09:53 +02004111def Test_error_in_autoload_script()
4112 var save_rtp = &rtp
4113 var dir = getcwd() .. '/Xruntime'
4114 &rtp = dir
4115 mkdir(dir .. '/autoload', 'p')
4116
4117 var lines =<< trim END
4118 vim9script noclear
4119 def script#autoloaded()
4120 enddef
4121 def Broken()
4122 var x: any = ''
4123 eval x != 0
4124 enddef
4125 Broken()
4126 END
4127 writefile(lines, dir .. '/autoload/script.vim')
4128
4129 lines =<< trim END
4130 vim9script
4131 def CallAutoloaded()
4132 script#autoloaded()
4133 enddef
4134
4135 function Legacy()
4136 try
4137 call s:CallAutoloaded()
4138 catch
4139 call assert_match('E1030: Using a String as a Number', v:exception)
4140 endtry
4141 endfunction
4142
4143 Legacy()
4144 END
4145 CheckScriptSuccess(lines)
4146
4147 &rtp = save_rtp
4148 delete(dir, 'rf')
4149enddef
4150
Bram Moolenaar3896a102020-08-09 14:33:55 +02004151def Test_cmdline_win()
4152 # if the Vim syntax highlighting uses Vim9 constructs they can be used from
4153 # the command line window.
4154 mkdir('rtp/syntax', 'p')
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004155 var export_lines =<< trim END
Bram Moolenaar3896a102020-08-09 14:33:55 +02004156 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004157 export var That = 'yes'
Bram Moolenaar3896a102020-08-09 14:33:55 +02004158 END
4159 writefile(export_lines, 'rtp/syntax/Xexport.vim')
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004160 var import_lines =<< trim END
Bram Moolenaar3896a102020-08-09 14:33:55 +02004161 vim9script
Bram Moolenaard5f400c2022-01-06 21:10:28 +00004162 import './Xexport.vim' as exp
4163 echo exp.That
Bram Moolenaar3896a102020-08-09 14:33:55 +02004164 END
4165 writefile(import_lines, 'rtp/syntax/vim.vim')
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004166 var save_rtp = &rtp
Bram Moolenaar3896a102020-08-09 14:33:55 +02004167 &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
4168 syntax on
4169 augroup CmdWin
4170 autocmd CmdwinEnter * g:got_there = 'yes'
4171 augroup END
4172 # this will open and also close the cmdline window
4173 feedkeys('q:', 'xt')
4174 assert_equal('yes', g:got_there)
4175
4176 augroup CmdWin
4177 au!
4178 augroup END
4179 &rtp = save_rtp
4180 delete('rtp', 'rf')
4181enddef
4182
Bram Moolenaare3d46852020-08-29 13:39:17 +02004183def Test_invalid_sid()
4184 assert_fails('func <SNR>1234_func', 'E123:')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02004185
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004186 if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
Bram Moolenaard2c61702020-09-06 15:58:36 +02004187 assert_equal([], readfile('Xdidit'))
Bram Moolenaare3d46852020-08-29 13:39:17 +02004188 endif
4189 delete('Xdidit')
4190enddef
4191
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004192def Test_restoring_cpo()
4193 writefile(['vim9script', 'set nocp'], 'Xsourced')
4194 writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
4195 if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
4196 assert_equal(['done'], readfile('Xdone'))
4197 endif
4198 delete('Xsourced')
4199 delete('Xclose')
Bram Moolenaar090728a2020-12-20 15:43:31 +01004200 delete('Xdone')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004201
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004202 writefile(['vim9script', 'g:cpoval = &cpo'], 'XanotherScript')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004203 set cpo=aABceFsMny>
4204 edit XanotherScript
4205 so %
4206 assert_equal('aABceFsMny>', &cpo)
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004207 assert_equal('aABceFs', g:cpoval)
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004208 :1del
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004209 setline(1, 'let g:cpoval = &cpo')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004210 w
4211 so %
4212 assert_equal('aABceFsMny>', &cpo)
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004213 assert_equal('aABceFsMny>', g:cpoval)
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004214
4215 delete('XanotherScript')
4216 set cpo&vim
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004217 unlet g:cpoval
4218
4219 if has('unix')
4220 # 'cpo' is not restored in main vimrc
4221 var save_HOME = $HOME
4222 $HOME = getcwd() .. '/Xhome'
4223 mkdir('Xhome')
4224 var lines =<< trim END
4225 vim9script
4226 writefile(['before: ' .. &cpo], 'Xresult')
4227 set cpo+=M
4228 writefile(['after: ' .. &cpo], 'Xresult', 'a')
4229 END
4230 writefile(lines, 'Xhome/.vimrc')
4231
4232 lines =<< trim END
4233 call writefile(['later: ' .. &cpo], 'Xresult', 'a')
4234 END
4235 writefile(lines, 'Xlegacy')
4236
4237 lines =<< trim END
4238 vim9script
4239 call writefile(['vim9: ' .. &cpo], 'Xresult', 'a')
4240 qa
4241 END
4242 writefile(lines, 'Xvim9')
4243
4244 var cmd = GetVimCommand() .. " -S Xlegacy -S Xvim9"
4245 cmd = substitute(cmd, '-u NONE', '', '')
4246 exe "silent !" .. cmd
4247
4248 assert_equal([
4249 'before: aABceFs',
4250 'after: aABceFsM',
4251 'later: aABceFsM',
4252 'vim9: aABceFs'], readfile('Xresult'))
4253
4254 $HOME = save_HOME
4255 delete('Xhome', 'rf')
4256 delete('Xlegacy')
4257 delete('Xvim9')
4258 delete('Xresult')
4259 endif
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004260enddef
4261
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004262" Use :function so we can use Check commands
4263func Test_no_redraw_when_restoring_cpo()
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004264 CheckScreendump
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004265 CheckFeature timers
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004266
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004267 let lines =<< trim END
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004268 vim9script
4269 def script#func()
4270 enddef
4271 END
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004272 call mkdir('Xdir/autoload', 'p')
4273 call writefile(lines, 'Xdir/autoload/script.vim')
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004274
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004275 let lines =<< trim END
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004276 vim9script
4277 set cpo+=M
4278 exe 'set rtp^=' .. getcwd() .. '/Xdir'
Bram Moolenaar767034c2021-04-09 17:24:52 +02004279 au CmdlineEnter : ++once timer_start(0, (_) => script#func())
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004280 setline(1, 'some text')
4281 END
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004282 call writefile(lines, 'XTest_redraw_cpo')
4283 let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
4284 call term_sendkeys(buf, "V:")
4285 call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004286
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004287 " clean up
4288 call term_sendkeys(buf, "\<Esc>u")
4289 call StopVimInTerminal(buf)
4290 call delete('XTest_redraw_cpo')
4291 call delete('Xdir', 'rf')
4292endfunc
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004293
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004294
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004295def Test_unset_any_variable()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004296 var lines =<< trim END
4297 var name: any
4298 assert_equal(0, name)
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004299 END
4300 CheckDefAndScriptSuccess(lines)
4301enddef
4302
Bram Moolenaar7e9210e2020-09-25 23:12:51 +02004303func Test_define_func_at_command_line()
Bram Moolenaar58dbef32020-09-25 22:13:05 +02004304 CheckRunVimInTerminal
4305
Bram Moolenaar7e9210e2020-09-25 23:12:51 +02004306 " call indirectly to avoid compilation error for missing functions
4307 call Run_Test_define_func_at_command_line()
4308endfunc
4309
4310def Run_Test_define_func_at_command_line()
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004311 # run in a separate Vim instance to avoid the script context
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004312 var lines =<< trim END
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004313 func CheckAndQuit()
4314 call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
4315 call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
4316 endfunc
4317 END
4318 writefile([''], 'Xdidcmd')
4319 writefile(lines, 'XcallFunc')
Bram Moolenaare0de1712020-12-02 17:36:54 +01004320 var buf = RunVimInTerminal('-S XcallFunc', {rows: 6})
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004321 # define Afunc() on the command line
4322 term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
4323 term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01004324 WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004325
4326 call StopVimInTerminal(buf)
4327 delete('XcallFunc')
4328 delete('Xdidcmd')
4329enddef
4330
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004331def Test_script_var_scope()
4332 var lines =<< trim END
4333 vim9script
4334 if true
4335 if true
4336 var one = 'one'
4337 echo one
4338 endif
4339 echo one
4340 endif
4341 END
4342 CheckScriptFailure(lines, 'E121:', 7)
4343
4344 lines =<< trim END
4345 vim9script
4346 if true
4347 if false
4348 var one = 'one'
4349 echo one
4350 else
4351 var one = 'one'
4352 echo one
4353 endif
4354 echo one
4355 endif
4356 END
4357 CheckScriptFailure(lines, 'E121:', 10)
4358
4359 lines =<< trim END
4360 vim9script
4361 while true
4362 var one = 'one'
4363 echo one
4364 break
4365 endwhile
4366 echo one
4367 END
4368 CheckScriptFailure(lines, 'E121:', 7)
4369
4370 lines =<< trim END
4371 vim9script
4372 for i in range(1)
4373 var one = 'one'
4374 echo one
4375 endfor
4376 echo one
4377 END
4378 CheckScriptFailure(lines, 'E121:', 6)
Bram Moolenaar9becdf22020-10-10 21:33:48 +02004379
4380 lines =<< trim END
4381 vim9script
4382 {
4383 var one = 'one'
4384 assert_equal('one', one)
4385 }
4386 assert_false(exists('one'))
4387 assert_false(exists('s:one'))
4388 END
4389 CheckScriptSuccess(lines)
4390
4391 lines =<< trim END
4392 vim9script
4393 {
4394 var one = 'one'
4395 echo one
4396 }
4397 echo one
4398 END
4399 CheckScriptFailure(lines, 'E121:', 6)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004400enddef
4401
Bram Moolenaar352134b2020-10-17 22:04:08 +02004402def Test_catch_exception_in_callback()
4403 var lines =<< trim END
4404 vim9script
Bram Moolenaar2a389082021-04-09 20:24:31 +02004405 def Callback(...l: list<any>)
Bram Moolenaar352134b2020-10-17 22:04:08 +02004406 try
4407 var x: string
4408 var y: string
4409 # this error should be caught with CHECKLEN
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +00004410 var sl = ['']
4411 [x, y] = sl
Bram Moolenaar352134b2020-10-17 22:04:08 +02004412 catch
4413 g:caught = 'yes'
4414 endtry
4415 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01004416 popup_menu('popup', {callback: Callback})
Bram Moolenaar352134b2020-10-17 22:04:08 +02004417 feedkeys("\r", 'xt')
4418 END
4419 CheckScriptSuccess(lines)
4420
4421 unlet g:caught
4422enddef
4423
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004424def Test_no_unknown_error_after_error()
4425 if !has('unix') || !has('job')
4426 throw 'Skipped: not unix of missing +job feature'
4427 endif
Bram Moolenaarb16ff292021-09-26 20:14:39 +01004428 # FIXME: this check should not be needed
4429 if has('win32')
4430 throw 'Skipped: does not work on MS-Windows'
4431 endif
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004432 var lines =<< trim END
4433 vim9script
4434 var source: list<number>
Bram Moolenaar2a389082021-04-09 20:24:31 +02004435 def Out_cb(...l: list<any>)
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004436 eval [][0]
4437 enddef
Bram Moolenaar2a389082021-04-09 20:24:31 +02004438 def Exit_cb(...l: list<any>)
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004439 sleep 1m
4440 source += l
4441 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01004442 var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
Bram Moolenaar6f17a3f2020-12-21 18:11:24 +01004443 while job_status(myjob) == 'run'
4444 sleep 10m
4445 endwhile
Bram Moolenaar206c2a62021-01-31 14:04:44 +01004446 # wait for Exit_cb() to be called
Bram Moolenaarfe95b942021-04-10 20:52:43 +02004447 sleep 200m
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004448 END
4449 writefile(lines, 'Xdef')
4450 assert_fails('so Xdef', ['E684:', 'E1012:'])
4451 delete('Xdef')
4452enddef
4453
Bram Moolenaar4324d872020-12-01 20:12:24 +01004454def InvokeNormal()
4455 exe "norm! :m+1\r"
4456enddef
4457
4458def Test_invoke_normal_in_visual_mode()
4459 xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
4460 new
4461 setline(1, ['aaa', 'bbb'])
4462 feedkeys("V\<F3>", 'xt')
4463 assert_equal(['bbb', 'aaa'], getline(1, 2))
4464 xunmap <F3>
4465enddef
4466
Bram Moolenaarb5b94802020-12-13 17:50:20 +01004467def Test_white_space_after_command()
4468 var lines =<< trim END
4469 exit_cb: Func})
4470 END
4471 CheckDefAndScriptFailure(lines, 'E1144:', 1)
Bram Moolenaarf8103f22020-12-25 17:36:27 +01004472
4473 lines =<< trim END
4474 e#
4475 END
4476 CheckDefAndScriptFailure(lines, 'E1144:', 1)
Bram Moolenaarb5b94802020-12-13 17:50:20 +01004477enddef
4478
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004479def Test_script_var_gone_when_sourced_twice()
4480 var lines =<< trim END
4481 vim9script
4482 if exists('g:guard')
4483 finish
4484 endif
4485 g:guard = 1
4486 var name = 'thename'
4487 def g:GetName(): string
4488 return name
4489 enddef
4490 def g:SetName(arg: string)
4491 name = arg
4492 enddef
4493 END
4494 writefile(lines, 'XscriptTwice.vim')
4495 so XscriptTwice.vim
4496 assert_equal('thename', g:GetName())
4497 g:SetName('newname')
4498 assert_equal('newname', g:GetName())
4499 so XscriptTwice.vim
4500 assert_fails('call g:GetName()', 'E1149:')
4501 assert_fails('call g:SetName("x")', 'E1149:')
4502
4503 delfunc g:GetName
4504 delfunc g:SetName
4505 delete('XscriptTwice.vim')
4506 unlet g:guard
4507enddef
4508
Bram Moolenaard5f400c2022-01-06 21:10:28 +00004509"def Test_import_gone_when_sourced_twice()
4510" var exportlines =<< trim END
4511" vim9script
4512" if exists('g:guard')
4513" finish
4514" endif
4515" g:guard = 1
4516" export var name = 'someName'
4517" END
4518" writefile(exportlines, 'XexportScript.vim')
4519"
4520" var lines =<< trim END
4521" vim9script
4522" import name from './XexportScript.vim'
4523" def g:GetName(): string
4524" return name
4525" enddef
4526" END
4527" writefile(lines, 'XscriptImport.vim')
4528" so XscriptImport.vim
4529" assert_equal('someName', g:GetName())
4530"
4531" so XexportScript.vim
4532" assert_fails('call g:GetName()', 'E1149:')
4533"
4534" delfunc g:GetName
4535" delete('XexportScript.vim')
4536" delete('XscriptImport.vim')
4537" unlet g:guard
4538"enddef
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004539
Bram Moolenaar10b94212021-02-19 21:42:57 +01004540def Test_unsupported_commands()
4541 var lines =<< trim END
4542 ka
4543 END
Bram Moolenaar7d840e92021-05-26 21:10:11 +02004544 CheckDefFailure(lines, 'E476:')
4545 CheckScriptFailure(['vim9script'] + lines, 'E492:')
Bram Moolenaar10b94212021-02-19 21:42:57 +01004546
4547 lines =<< trim END
Bram Moolenaarada1d872021-02-20 08:16:51 +01004548 :1ka
4549 END
Bram Moolenaar7d840e92021-05-26 21:10:11 +02004550 CheckDefFailure(lines, 'E476:')
4551 CheckScriptFailure(['vim9script'] + lines, 'E492:')
Bram Moolenaarada1d872021-02-20 08:16:51 +01004552
4553 lines =<< trim END
Bram Moolenaar10b94212021-02-19 21:42:57 +01004554 t
4555 END
4556 CheckDefFailure(lines, 'E1100:')
4557 CheckScriptFailure(['vim9script'] + lines, 'E1100:')
4558
4559 lines =<< trim END
4560 x
4561 END
4562 CheckDefFailure(lines, 'E1100:')
4563 CheckScriptFailure(['vim9script'] + lines, 'E1100:')
4564
4565 lines =<< trim END
4566 xit
4567 END
4568 CheckDefFailure(lines, 'E1100:')
4569 CheckScriptFailure(['vim9script'] + lines, 'E1100:')
4570enddef
4571
Bram Moolenaarc70fe462021-04-17 17:59:19 +02004572def Test_mapping_line_number()
4573 var lines =<< trim END
4574 vim9script
4575 def g:FuncA()
4576 # Some comment
4577 FuncB(0)
4578 enddef
4579 # Some comment
4580 def FuncB(
4581 # Some comment
4582 n: number
4583 )
4584 exe 'nno '
4585 # Some comment
4586 .. '<F3> a'
4587 .. 'b'
4588 .. 'c'
4589 enddef
4590 END
4591 CheckScriptSuccess(lines)
4592 var res = execute('verbose nmap <F3>')
4593 assert_match('No mapping found', res)
4594
4595 g:FuncA()
4596 res = execute('verbose nmap <F3>')
4597 assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
4598
4599 nunmap <F3>
4600 delfunc g:FuncA
4601enddef
4602
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004603def Test_option_set()
4604 # legacy script allows for white space
4605 var lines =<< trim END
4606 set foldlevel =11
4607 call assert_equal(11, &foldlevel)
4608 END
4609 CheckScriptSuccess(lines)
4610
4611 set foldlevel
4612 set foldlevel=12
4613 assert_equal(12, &foldlevel)
4614 set foldlevel+=2
4615 assert_equal(14, &foldlevel)
4616 set foldlevel-=3
4617 assert_equal(11, &foldlevel)
4618
4619 lines =<< trim END
4620 set foldlevel =1
4621 END
4622 CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1')
4623
4624 lines =<< trim END
4625 set foldlevel +=1
4626 END
4627 CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1')
4628
4629 lines =<< trim END
4630 set foldlevel ^=1
4631 END
4632 CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1')
4633
4634 lines =<< trim END
4635 set foldlevel -=1
4636 END
4637 CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1')
4638
4639 set foldlevel&
4640enddef
4641
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004642def Test_option_modifier()
Bram Moolenaar1594f312021-07-08 16:40:13 +02004643 # legacy script allows for white space
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004644 var lines =<< trim END
4645 set hlsearch & hlsearch !
4646 call assert_equal(1, &hlsearch)
4647 END
4648 CheckScriptSuccess(lines)
4649
Bram Moolenaar1594f312021-07-08 16:40:13 +02004650 set hlsearch
4651 set hlsearch!
4652 assert_equal(false, &hlsearch)
4653
4654 set hlsearch
4655 set hlsearch&
4656 assert_equal(false, &hlsearch)
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004657
4658 lines =<< trim END
Bram Moolenaar1594f312021-07-08 16:40:13 +02004659 set hlsearch &
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004660 END
Bram Moolenaar1594f312021-07-08 16:40:13 +02004661 CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &')
4662
4663 lines =<< trim END
4664 set hlsearch !
4665 END
4666 CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !')
4667
4668 set hlsearch&
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004669enddef
4670
Bram Moolenaarc03fe662021-07-11 16:52:45 +02004671" This must be called last, it may cause following :def functions to fail
4672def Test_xxx_echoerr_line_number()
4673 var lines =<< trim END
4674 echoerr 'some'
4675 .. ' error'
4676 .. ' continued'
4677 END
4678 CheckDefExecAndScriptFailure(lines, 'some error continued', 1)
4679enddef
4680
Bram Moolenaar9537e372021-12-10 21:05:53 +00004681func Test_debug_with_lambda()
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004682 CheckRunVimInTerminal
4683
Bram Moolenaar9537e372021-12-10 21:05:53 +00004684 " call indirectly to avoid compilation error for missing functions
4685 call Run_Test_debug_with_lambda()
4686endfunc
4687
4688def Run_Test_debug_with_lambda()
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004689 var lines =<< trim END
4690 vim9script
4691 def Func()
4692 var n = 0
4693 echo [0]->filter((_, v) => v == n)
4694 enddef
4695 breakadd func Func
4696 Func()
4697 END
4698 writefile(lines, 'XdebugFunc')
4699 var buf = RunVimInTerminal('-S XdebugFunc', {rows: 6, wait_for_ruler: 0})
4700 WaitForAssert(() => assert_match('^>', term_getline(buf, 6)))
4701
4702 term_sendkeys(buf, "cont\<CR>")
4703 WaitForAssert(() => assert_match('\[0\]', term_getline(buf, 5)))
4704
4705 StopVimInTerminal(buf)
4706 delete('XdebugFunc')
4707enddef
4708
Bram Moolenaar310091d2021-12-23 21:14:37 +00004709func Test_debug_running_out_of_lines()
4710 CheckRunVimInTerminal
4711
4712 " call indirectly to avoid compilation error for missing functions
4713 call Run_Test_debug_running_out_of_lines()
4714endfunc
4715
4716def Run_Test_debug_running_out_of_lines()
4717 var lines =<< trim END
4718 vim9script
4719 def Crash()
4720 #
4721 #
4722 #
4723 #
4724 #
4725 #
4726 #
4727 if true
4728 #
4729 endif
4730 enddef
4731 breakadd func Crash
4732 Crash()
4733 END
4734 writefile(lines, 'XdebugFunc')
4735 var buf = RunVimInTerminal('-S XdebugFunc', {rows: 6, wait_for_ruler: 0})
4736 WaitForAssert(() => assert_match('^>', term_getline(buf, 6)))
4737
4738 term_sendkeys(buf, "next\<CR>")
4739 TermWait(buf)
4740 WaitForAssert(() => assert_match('^>', term_getline(buf, 6)))
4741
4742 term_sendkeys(buf, "cont\<CR>")
4743 TermWait(buf)
4744
4745 StopVimInTerminal(buf)
4746 delete('XdebugFunc')
4747enddef
4748
Bram Moolenaar648594e2021-07-11 17:55:01 +02004749def ProfiledWithLambda()
Bram Moolenaard9162552021-07-11 15:26:13 +02004750 var n = 3
4751 echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n)
4752enddef
4753
Bram Moolenaar648594e2021-07-11 17:55:01 +02004754def ProfiledNested()
4755 var x = 0
4756 def Nested(): any
4757 return x
4758 enddef
4759 Nested()
4760enddef
4761
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004762def ProfiledNestedProfiled()
4763 var x = 0
4764 def Nested(): any
4765 return x
4766 enddef
4767 Nested()
4768enddef
4769
Dominique Pelle923dce22021-11-21 11:36:04 +00004770" Execute this near the end, profiling doesn't stop until Vim exits.
Bram Moolenaard9162552021-07-11 15:26:13 +02004771" This only tests that it works, not the profiling output.
4772def Test_xx_profile_with_lambda()
Bram Moolenaar4ece1522021-07-11 16:31:51 +02004773 CheckFeature profile
4774
Bram Moolenaard9162552021-07-11 15:26:13 +02004775 profile start Xprofile.log
Bram Moolenaar648594e2021-07-11 17:55:01 +02004776 profile func ProfiledWithLambda
4777 ProfiledWithLambda()
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004778
Bram Moolenaar648594e2021-07-11 17:55:01 +02004779 profile func ProfiledNested
4780 ProfiledNested()
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004781
4782 # Also profile the nested function. Use a different function, although the
4783 # contents is the same, to make sure it was not already compiled.
4784 profile func *
4785 ProfiledNestedProfiled()
4786
4787 profdel func *
4788 profile pause
Bram Moolenaard9162552021-07-11 15:26:13 +02004789enddef
4790
Bram Moolenaar585fea72020-04-02 22:33:21 +02004791" Keep this last, it messes up highlighting.
4792def Test_substitute_cmd()
4793 new
4794 setline(1, 'something')
4795 :substitute(some(other(
4796 assert_equal('otherthing', getline(1))
4797 bwipe!
4798
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02004799 # also when the context is Vim9 script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004800 var lines =<< trim END
Bram Moolenaar585fea72020-04-02 22:33:21 +02004801 vim9script
4802 new
4803 setline(1, 'something')
4804 :substitute(some(other(
4805 assert_equal('otherthing', getline(1))
4806 bwipe!
4807 END
4808 writefile(lines, 'Xvim9lines')
4809 source Xvim9lines
4810
4811 delete('Xvim9lines')
4812enddef
4813
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01004814" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker