blob: a503d113ef2dc16d683f57c7b8ddf8d599e8818e [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 Moolenaar62aec932022-01-29 21:45:34 +00005import './vim9.vim' as v9
Bram Moolenaar37294bd2021-03-10 13:40:08 +01006source screendump.vim
Bram Moolenaard8448622022-01-07 21:39:52 +00007source shared.vim
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01008
Bram Moolenaarb79ee0c2022-01-01 12:17:00 +00009def Test_vim9script_feature()
10 # example from the help, here the feature is always present
11 var lines =<< trim END
12 " old style comment
13 if !has('vim9script')
14 " legacy commands would go here
15 finish
16 endif
17 vim9script
18 # Vim9 script commands go here
19 g:didit = true
20 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000021 v9.CheckScriptSuccess(lines)
Bram Moolenaarb79ee0c2022-01-01 12:17:00 +000022 assert_equal(true, g:didit)
23 unlet g:didit
24enddef
25
Bram Moolenaar5d72ce62020-08-20 23:04:06 +020026def Test_range_only()
27 new
28 setline(1, ['blah', 'Blah'])
29 :/Blah/
30 assert_equal(2, getcurpos()[1])
Bram Moolenaarc2af0af2020-08-23 21:06:02 +020031 bwipe!
32
33 # without range commands use current line
34 new
35 setline(1, ['one', 'two', 'three'])
36 :2
37 print
Bram Moolenaar62aec932022-01-29 21:45:34 +000038 assert_equal('two', g:Screenline(&lines))
Bram Moolenaarc2af0af2020-08-23 21:06:02 +020039 :3
40 list
Bram Moolenaar62aec932022-01-29 21:45:34 +000041 assert_equal('three$', g:Screenline(&lines))
Bram Moolenaarb8554302021-02-15 21:30:30 +010042
43 # missing command does not print the line
44 var lines =<< trim END
45 vim9script
46 :1|
Bram Moolenaar62aec932022-01-29 21:45:34 +000047 assert_equal('three$', g:Screenline(&lines))
Bram Moolenaarb8554302021-02-15 21:30:30 +010048 :|
Bram Moolenaar62aec932022-01-29 21:45:34 +000049 assert_equal('three$', g:Screenline(&lines))
Bram Moolenaarb8554302021-02-15 21:30:30 +010050 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000051 v9.CheckScriptSuccess(lines)
Bram Moolenaarb8554302021-02-15 21:30:30 +010052
Bram Moolenaarc2af0af2020-08-23 21:06:02 +020053 bwipe!
Bram Moolenaar025cb1c2020-12-14 18:31:27 +010054
Bram Moolenaar0c7f2612022-02-17 19:44:07 +000055 lines =<< trim END
56 set cpo+=-
57 :1,999
58 END
59 v9.CheckDefExecAndScriptFailure(lines, 'E16:', 2)
60 set cpo&vim
61
62 v9.CheckDefExecAndScriptFailure([":'x"], 'E20:', 1)
63
Bram Moolenaar025cb1c2020-12-14 18:31:27 +010064 # won't generate anything
65 if false
66 :123
67 endif
Bram Moolenaar5d72ce62020-08-20 23:04:06 +020068enddef
69
Bram Moolenaara6e67e42020-05-15 23:36:40 +020070let g:alist = [7]
71let g:astring = 'text'
Bram Moolenaarf0b9f432020-07-17 23:03:17 +020072let g:anumber = 123
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010073
Bram Moolenaar4c17ad92020-04-27 22:47:51 +020074def Test_delfunction()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +020075 # Check function is defined in script namespace
Bram Moolenaar62aec932022-01-29 21:45:34 +000076 v9.CheckScriptSuccess([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +020077 'vim9script',
78 'func CheckMe()',
79 ' return 123',
80 'endfunc',
Bram Moolenaara749a422022-02-12 19:52:25 +000081 'func DoTest()',
82 ' call assert_equal(123, s:CheckMe())',
83 'endfunc',
84 'DoTest()',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +020085 ])
86
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +020087 # Check function in script namespace cannot be deleted
Bram Moolenaar62aec932022-01-29 21:45:34 +000088 v9.CheckScriptFailure([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +020089 'vim9script',
90 'func DeleteMe1()',
91 'endfunc',
92 'delfunction DeleteMe1',
93 ], 'E1084:')
Bram Moolenaar62aec932022-01-29 21:45:34 +000094 v9.CheckScriptFailure([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +020095 'vim9script',
96 'func DeleteMe2()',
97 'endfunc',
98 'def DoThat()',
99 ' delfunction DeleteMe2',
100 'enddef',
101 'DoThat()',
102 ], 'E1084:')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000103 v9.CheckScriptFailure([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200104 'vim9script',
105 'def DeleteMe3()',
106 'enddef',
107 'delfunction DeleteMe3',
108 ], 'E1084:')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000109 v9.CheckScriptFailure([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200110 'vim9script',
111 'def DeleteMe4()',
112 'enddef',
113 'def DoThat()',
114 ' delfunction DeleteMe4',
115 'enddef',
116 'DoThat()',
117 ], 'E1084:')
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200118
119 # Check that global :def function can be replaced and deleted
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200120 var lines =<< trim END
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200121 vim9script
122 def g:Global(): string
123 return "yes"
124 enddef
125 assert_equal("yes", g:Global())
126 def! g:Global(): string
127 return "no"
128 enddef
129 assert_equal("no", g:Global())
130 delfunc g:Global
131 assert_false(exists('*g:Global'))
132 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000133 v9.CheckScriptSuccess(lines)
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200134
135 # Check that global function can be replaced by a :def function and deleted
136 lines =<< trim END
137 vim9script
138 func g:Global()
139 return "yes"
140 endfunc
141 assert_equal("yes", g:Global())
142 def! g:Global(): string
143 return "no"
144 enddef
145 assert_equal("no", g:Global())
146 delfunc g:Global
147 assert_false(exists('*g:Global'))
148 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000149 v9.CheckScriptSuccess(lines)
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200150
151 # Check that global :def function can be replaced by a function and deleted
152 lines =<< trim END
153 vim9script
154 def g:Global(): string
155 return "yes"
156 enddef
157 assert_equal("yes", g:Global())
158 func! g:Global()
159 return "no"
160 endfunc
161 assert_equal("no", g:Global())
162 delfunc g:Global
163 assert_false(exists('*g:Global'))
164 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000165 v9.CheckScriptSuccess(lines)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200166enddef
167
Bram Moolenaar08052222020-09-14 17:04:31 +0200168def Test_wrong_type()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000169 v9.CheckDefFailure(['var name: list<nothing>'], 'E1010:')
170 v9.CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
171 v9.CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
172 v9.CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100173
Bram Moolenaar62aec932022-01-29 21:45:34 +0000174 v9.CheckDefFailure(['var name: dict<number'], 'E1009:')
175 v9.CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100176
Bram Moolenaar62aec932022-01-29 21:45:34 +0000177 v9.CheckDefFailure(['var name: ally'], 'E1010:')
178 v9.CheckDefFailure(['var name: bram'], 'E1010:')
179 v9.CheckDefFailure(['var name: cathy'], 'E1010:')
180 v9.CheckDefFailure(['var name: dom'], 'E1010:')
181 v9.CheckDefFailure(['var name: freddy'], 'E1010:')
182 v9.CheckDefFailure(['var name: john'], 'E1010:')
183 v9.CheckDefFailure(['var name: larry'], 'E1010:')
184 v9.CheckDefFailure(['var name: ned'], 'E1010:')
185 v9.CheckDefFailure(['var name: pam'], 'E1010:')
186 v9.CheckDefFailure(['var name: sam'], 'E1010:')
187 v9.CheckDefFailure(['var name: vim'], 'E1010:')
Bram Moolenaara0a9f432020-04-28 21:29:34 +0200188
Bram Moolenaar62aec932022-01-29 21:45:34 +0000189 v9.CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
190 v9.CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
Bram Moolenaar08052222020-09-14 17:04:31 +0200191enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100192
Bram Moolenaara749a422022-02-12 19:52:25 +0000193def Test_script_namespace()
194 # defining a function or variable with s: is not allowed
195 var lines =<< trim END
196 vim9script
197 def s:Function()
198 enddef
199 END
200 v9.CheckScriptFailure(lines, 'E1268:')
201
202 for decl in ['var', 'const', 'final']
203 lines =<< trim END
204 vim9script
205 var s:var = 'var'
206 END
207 v9.CheckScriptFailure([
208 'vim9script',
209 decl .. ' s:var = "var"',
210 ], 'E1268:')
211 endfor
212
213 # Calling a function or using a variable with s: is not allowed at script
214 # level
215 lines =<< trim END
216 vim9script
217 def Function()
218 enddef
219 s:Function()
220 END
221 v9.CheckScriptFailure(lines, 'E1268:')
222 lines =<< trim END
223 vim9script
224 def Function()
225 enddef
226 call s:Function()
227 END
228 v9.CheckScriptFailure(lines, 'E1268:')
229 lines =<< trim END
230 vim9script
231 var var = 'var'
232 echo s:var
233 END
234 v9.CheckScriptFailure(lines, 'E1268:')
235enddef
236
Bram Moolenaar10c65862020-10-08 21:16:42 +0200237def Test_script_wrong_type()
238 var lines =<< trim END
239 vim9script
Bram Moolenaara749a422022-02-12 19:52:25 +0000240 var dict: dict<string>
241 dict['a'] = ['x']
Bram Moolenaar10c65862020-10-08 21:16:42 +0200242 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000243 v9.CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3)
Bram Moolenaar10c65862020-10-08 21:16:42 +0200244enddef
245
Bram Moolenaar08052222020-09-14 17:04:31 +0200246def Test_const()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000247 v9.CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
248 v9.CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
249 v9.CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
250 v9.CheckDefFailure(['final two'], 'E1125:')
251 v9.CheckDefFailure(['final &option'], 'E996:')
Bram Moolenaardbeecb22020-09-14 18:15:09 +0200252
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200253 var lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200254 final list = [1, 2, 3]
Bram Moolenaardbeecb22020-09-14 18:15:09 +0200255 list[0] = 4
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200256 list->assert_equal([4, 2, 3])
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200257 const other = [5, 6, 7]
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200258 other->assert_equal([5, 6, 7])
Bram Moolenaar71abe482020-09-14 22:28:30 +0200259
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200260 var varlist = [7, 8]
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200261 const constlist = [1, varlist, 3]
Bram Moolenaar71abe482020-09-14 22:28:30 +0200262 varlist[0] = 77
Bram Moolenaar23e2e112021-08-03 21:16:18 +0200263 constlist[1][1] = 88
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200264 var cl = constlist[1]
Bram Moolenaar71abe482020-09-14 22:28:30 +0200265 cl[1] = 88
266 constlist->assert_equal([1, [77, 88], 3])
267
Bram Moolenaare0de1712020-12-02 17:36:54 +0100268 var vardict = {five: 5, six: 6}
269 const constdict = {one: 1, two: vardict, three: 3}
Bram Moolenaar71abe482020-09-14 22:28:30 +0200270 vardict['five'] = 55
Bram Moolenaar23e2e112021-08-03 21:16:18 +0200271 constdict['two']['six'] = 66
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200272 var cd = constdict['two']
Bram Moolenaar71abe482020-09-14 22:28:30 +0200273 cd['six'] = 66
Bram Moolenaare0de1712020-12-02 17:36:54 +0100274 constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3})
Bram Moolenaardbeecb22020-09-14 18:15:09 +0200275 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000276 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar08052222020-09-14 17:04:31 +0200277enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100278
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200279def Test_const_bang()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200280 var lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200281 const var = 234
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200282 var = 99
283 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000284 v9.CheckDefExecFailure(lines, 'E1018:', 2)
285 v9.CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200286
287 lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200288 const ll = [2, 3, 4]
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200289 ll[0] = 99
290 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000291 v9.CheckDefExecFailure(lines, 'E1119:', 2)
292 v9.CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200293
294 lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200295 const ll = [2, 3, 4]
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200296 ll[3] = 99
297 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000298 v9.CheckDefExecFailure(lines, 'E1118:', 2)
299 v9.CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200300
301 lines =<< trim END
Bram Moolenaare0de1712020-12-02 17:36:54 +0100302 const dd = {one: 1, two: 2}
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200303 dd["one"] = 99
304 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000305 v9.CheckDefExecFailure(lines, 'E1121:', 2)
306 v9.CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200307
308 lines =<< trim END
Bram Moolenaare0de1712020-12-02 17:36:54 +0100309 const dd = {one: 1, two: 2}
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200310 dd["three"] = 99
311 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000312 v9.CheckDefExecFailure(lines, 'E1120:')
313 v9.CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200314enddef
315
Bram Moolenaardf069ee2020-06-22 23:02:51 +0200316def Test_range_no_colon()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000317 v9.CheckDefFailure(['%s/a/b/'], 'E1050:')
318 v9.CheckDefFailure(['+ s/a/b/'], 'E1050:')
319 v9.CheckDefFailure(['- s/a/b/'], 'E1050:')
320 v9.CheckDefFailure(['. s/a/b/'], 'E1050:')
Bram Moolenaardf069ee2020-06-22 23:02:51 +0200321enddef
322
323
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100324def Test_block()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200325 var outer = 1
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100326 {
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200327 var inner = 2
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100328 assert_equal(1, outer)
329 assert_equal(2, inner)
330 }
331 assert_equal(1, outer)
Bram Moolenaar3f1e9f02021-02-27 22:36:43 +0100332
333 {|echo 'yes'|}
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100334enddef
335
Bram Moolenaar08052222020-09-14 17:04:31 +0200336def Test_block_failure()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000337 v9.CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
338 v9.CheckDefFailure(['}'], 'E1025:')
339 v9.CheckDefFailure(['{', 'echo 1'], 'E1026:')
Bram Moolenaar08052222020-09-14 17:04:31 +0200340enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100341
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200342def Test_block_local_vars()
343 var lines =<< trim END
344 vim9script
Bram Moolenaared234f22020-10-15 20:42:20 +0200345 v:testing = 1
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200346 if true
Bram Moolenaared234f22020-10-15 20:42:20 +0200347 var text = ['hello']
348 def SayHello(): list<string>
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200349 return text
350 enddef
351 def SetText(v: string)
Bram Moolenaared234f22020-10-15 20:42:20 +0200352 text = [v]
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200353 enddef
354 endif
355
356 if true
Bram Moolenaared234f22020-10-15 20:42:20 +0200357 var text = ['again']
358 def SayAgain(): list<string>
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200359 return text
360 enddef
361 endif
Bram Moolenaared234f22020-10-15 20:42:20 +0200362
363 # test that the "text" variables are not cleaned up
364 test_garbagecollect_now()
365
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200366 defcompile
367
Bram Moolenaared234f22020-10-15 20:42:20 +0200368 assert_equal(['hello'], SayHello())
369 assert_equal(['again'], SayAgain())
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200370
371 SetText('foobar')
Bram Moolenaared234f22020-10-15 20:42:20 +0200372 assert_equal(['foobar'], SayHello())
373
374 call writefile(['ok'], 'Xdidit')
375 qall!
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200376 END
Bram Moolenaared234f22020-10-15 20:42:20 +0200377
378 # need to execute this with a separate Vim instance to avoid the current
379 # context gets garbage collected.
380 writefile(lines, 'Xscript')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000381 g:RunVim([], [], '-S Xscript')
Bram Moolenaared234f22020-10-15 20:42:20 +0200382 assert_equal(['ok'], readfile('Xdidit'))
383
384 delete('Xscript')
385 delete('Xdidit')
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200386enddef
387
Bram Moolenaar39ca4122020-10-20 14:25:07 +0200388def Test_block_local_vars_with_func()
389 var lines =<< trim END
390 vim9script
391 if true
392 var foo = 'foo'
393 if true
394 var bar = 'bar'
395 def Func(): list<string>
396 return [foo, bar]
397 enddef
398 endif
399 endif
400 # function is compiled here, after blocks have finished, can still access
401 # "foo" and "bar"
402 assert_equal(['foo', 'bar'], Func())
403 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000404 v9.CheckScriptSuccess(lines)
Bram Moolenaar39ca4122020-10-20 14:25:07 +0200405enddef
406
Bram Moolenaare4db17f2021-08-01 21:19:43 +0200407" legacy func for command that's defined later
Bram Moolenaar62aec932022-01-29 21:45:34 +0000408func s:InvokeSomeCommand()
Bram Moolenaare4db17f2021-08-01 21:19:43 +0200409 SomeCommand
410endfunc
411
412def Test_autocommand_block()
413 com SomeCommand {
414 g:someVar = 'some'
415 }
416 InvokeSomeCommand()
417 assert_equal('some', g:someVar)
418
419 delcommand SomeCommand
420 unlet g:someVar
421enddef
422
423def Test_command_block()
424 au BufNew *.xml {
425 g:otherVar = 'other'
426 }
427 split other.xml
428 assert_equal('other', g:otherVar)
429
430 bwipe!
431 au! BufNew *.xml
432 unlet g:otherVar
433enddef
434
Bram Moolenaard032f342020-07-18 18:13:02 +0200435func g:NoSuchFunc()
436 echo 'none'
437endfunc
438
Bram Moolenaar9e1d9e32021-01-11 20:17:34 +0100439def Test_try_catch_throw()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200440 var l = []
Bram Moolenaar7a092242020-04-16 22:10:49 +0200441 try # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100442 add(l, '1')
443 throw 'wrong'
444 add(l, '2')
Bram Moolenaar7a092242020-04-16 22:10:49 +0200445 catch # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100446 add(l, v:exception)
Bram Moolenaar7a092242020-04-16 22:10:49 +0200447 finally # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100448 add(l, '3')
Bram Moolenaar7a092242020-04-16 22:10:49 +0200449 endtry # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100450 assert_equal(['1', 'wrong', '3'], l)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200451
Bram Moolenaare8593122020-07-18 15:17:02 +0200452 l = []
453 try
454 try
455 add(l, '1')
456 throw 'wrong'
457 add(l, '2')
458 catch /right/
459 add(l, v:exception)
460 endtry
461 catch /wrong/
462 add(l, 'caught')
Bram Moolenaar204852a2022-03-05 12:56:44 +0000463 finally
Bram Moolenaare8593122020-07-18 15:17:02 +0200464 add(l, 'finally')
465 endtry
466 assert_equal(['1', 'caught', 'finally'], l)
467
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200468 var n: number
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200469 try
470 n = l[3]
471 catch /E684:/
472 n = 99
473 endtry
474 assert_equal(99, n)
475
Bram Moolenaar69f70502021-01-01 16:10:46 +0100476 var done = 'no'
477 if 0
478 try | catch | endtry
479 else
480 done = 'yes'
481 endif
482 assert_equal('yes', done)
483
484 done = 'no'
485 if 1
486 done = 'yes'
487 else
488 try | catch | endtry
489 done = 'never'
490 endif
491 assert_equal('yes', done)
492
493 if 1
494 else
495 try | catch /pat/ | endtry
496 try | catch /pat/
497 endtry
498 try
499 catch /pat/ | endtry
500 try
501 catch /pat/
502 endtry
503 endif
504
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200505 try
Bram Moolenaarcc673e72020-08-16 17:33:35 +0200506 # string slice returns a string, not a number
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200507 n = g:astring[3]
Bram Moolenaar5e654232020-09-16 15:22:00 +0200508 catch /E1012:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200509 n = 77
510 endtry
511 assert_equal(77, n)
512
513 try
514 n = l[g:astring]
Bram Moolenaar5e654232020-09-16 15:22:00 +0200515 catch /E1012:/
Bram Moolenaar56acb092020-08-16 14:48:19 +0200516 n = 88
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200517 endtry
Bram Moolenaar56acb092020-08-16 14:48:19 +0200518 assert_equal(88, n)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200519
520 try
521 n = s:does_not_exist
522 catch /E121:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200523 n = 111
524 endtry
525 assert_equal(111, n)
526
527 try
528 n = g:does_not_exist
529 catch /E121:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200530 n = 121
531 endtry
532 assert_equal(121, n)
533
Bram Moolenaare0de1712020-12-02 17:36:54 +0100534 var d = {one: 1}
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200535 try
536 n = d[g:astring]
537 catch /E716:/
538 n = 222
539 endtry
540 assert_equal(222, n)
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200541
542 try
543 n = -g:astring
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200544 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200545 n = 233
546 endtry
547 assert_equal(233, n)
548
549 try
550 n = +g:astring
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200551 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200552 n = 244
553 endtry
554 assert_equal(244, n)
555
556 try
557 n = +g:alist
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200558 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200559 n = 255
560 endtry
561 assert_equal(255, n)
562
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200563 var nd: dict<any>
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200564 try
Bram Moolenaar2e5910b2021-02-03 17:41:24 +0100565 nd = {[g:alist]: 1}
566 catch /E1105:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200567 n = 266
568 endtry
569 assert_equal(266, n)
570
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +0000571 l = [1, 2, 3]
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200572 try
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +0000573 [n] = l
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200574 catch /E1093:/
575 n = 277
576 endtry
577 assert_equal(277, n)
578
Bram Moolenaare8593122020-07-18 15:17:02 +0200579 try
580 &ts = g:astring
Bram Moolenaar5e654232020-09-16 15:22:00 +0200581 catch /E1012:/
Bram Moolenaare8593122020-07-18 15:17:02 +0200582 n = 288
583 endtry
584 assert_equal(288, n)
585
586 try
587 &backspace = 'asdf'
588 catch /E474:/
589 n = 299
590 endtry
591 assert_equal(299, n)
592
593 l = [1]
594 try
595 l[3] = 3
596 catch /E684:/
597 n = 300
598 endtry
599 assert_equal(300, n)
600
601 try
Bram Moolenaare8593122020-07-18 15:17:02 +0200602 unlet g:does_not_exist
603 catch /E108:/
604 n = 322
605 endtry
606 assert_equal(322, n)
607
608 try
Bram Moolenaar2bede172020-11-19 18:53:18 +0100609 d = {text: 1, [g:astring]: 2}
Bram Moolenaare8593122020-07-18 15:17:02 +0200610 catch /E721:/
611 n = 333
612 endtry
613 assert_equal(333, n)
614
615 try
Bram Moolenaar62aec932022-01-29 21:45:34 +0000616 l = g:DeletedFunc()
Bram Moolenaare8593122020-07-18 15:17:02 +0200617 catch /E933:/
618 n = 344
619 endtry
620 assert_equal(344, n)
Bram Moolenaard032f342020-07-18 18:13:02 +0200621
622 try
Yegappan Lakshmanana764e732021-07-25 15:57:32 +0200623 echo range(1, 2, 0)
624 catch /E726:/
Bram Moolenaard032f342020-07-18 18:13:02 +0200625 n = 355
626 endtry
627 assert_equal(355, n)
628
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200629 var P = function('g:NoSuchFunc')
Bram Moolenaard032f342020-07-18 18:13:02 +0200630 delfunc g:NoSuchFunc
631 try
632 echo P()
633 catch /E117:/
634 n = 366
635 endtry
636 assert_equal(366, n)
637
638 try
639 echo g:NoSuchFunc()
640 catch /E117:/
641 n = 377
642 endtry
643 assert_equal(377, n)
644
645 try
646 echo g:alist + 4
647 catch /E745:/
648 n = 388
649 endtry
650 assert_equal(388, n)
651
652 try
653 echo 4 + g:alist
654 catch /E745:/
655 n = 399
656 endtry
657 assert_equal(399, n)
658
659 try
660 echo g:alist.member
661 catch /E715:/
662 n = 400
663 endtry
664 assert_equal(400, n)
665
666 try
667 echo d.member
668 catch /E716:/
669 n = 411
670 endtry
671 assert_equal(411, n)
Bram Moolenaard9d77892021-02-12 21:32:47 +0100672
673 var counter = 0
674 for i in range(4)
675 try
676 eval [][0]
677 catch
678 endtry
679 counter += 1
680 endfor
681 assert_equal(4, counter)
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100682
Bram Moolenaar9fa5dab2021-07-20 19:18:44 +0200683 # no requirement for spaces before |
684 try|echo 0|catch|endtry
685
Bram Moolenaar003312b2021-12-20 10:55:35 +0000686 # return in try with finally
687 def ReturnInTry(): number
688 var ret = 4
689 try
690 return ret
691 catch /this/
692 return -1
693 catch /that/
694 return -1
695 finally
696 # changing ret has no effect
697 ret = 7
698 endtry
699 return -2
700 enddef
701 assert_equal(4, ReturnInTry())
702
703 # return in catch with finally
704 def ReturnInCatch(): number
705 var ret = 5
706 try
707 throw 'getout'
708 return -1
709 catch /getout/
710 # ret is evaluated here
711 return ret
712 finally
713 # changing ret later has no effect
714 ret = -3
715 endtry
716 return -2
717 enddef
718 assert_equal(5, ReturnInCatch())
719
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100720 # return in finally after empty catch
721 def ReturnInFinally(): number
722 try
723 finally
Bram Moolenaar003312b2021-12-20 10:55:35 +0000724 return 6
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100725 endtry
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100726 enddef
Bram Moolenaar003312b2021-12-20 10:55:35 +0000727 assert_equal(6, ReturnInFinally())
Bram Moolenaar8ac681a2021-06-15 20:06:34 +0200728
729 var lines =<< trim END
730 vim9script
731 try
732 acos('0.5')
733 ->setline(1)
734 catch
735 g:caught = v:exception
736 endtry
737 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000738 v9.CheckScriptSuccess(lines)
Yegappan Lakshmanan4490ec42021-07-27 22:00:44 +0200739 assert_match('E1219: Float or Number required for argument 1', g:caught)
Bram Moolenaar8ac681a2021-06-15 20:06:34 +0200740 unlet g:caught
Bram Moolenaar41978282021-07-04 14:47:30 +0200741
742 # missing catch and/or finally
743 lines =<< trim END
744 vim9script
745 try
746 echo 'something'
747 endtry
748 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000749 v9.CheckScriptFailure(lines, 'E1032:')
rbtnn84934992021-08-07 13:26:53 +0200750
751 # skipping try-finally-endtry when try-finally-endtry is used in another block
752 lines =<< trim END
753 if v:true
754 try
755 finally
756 endtry
757 else
758 try
759 finally
760 endtry
761 endif
762 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000763 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100764enddef
765
Bram Moolenaar28bf6492022-03-03 15:11:20 +0000766def Test_try_var_decl()
767 var lines =<< trim END
768 vim9script
769 try
770 var in_try = 1
771 assert_equal(1, get(s:, 'in_try', -1))
772 throw "getout"
773 catch
774 var in_catch = 2
775 assert_equal(-1, get(s:, 'in_try', -1))
776 assert_equal(2, get(s:, 'in_catch', -1))
777 finally
778 var in_finally = 3
779 assert_equal(-1, get(s:, 'in_try', -1))
780 assert_equal(-1, get(s:, 'in_catch', -1))
781 assert_equal(3, get(s:, 'in_finally', -1))
782 endtry
783 assert_equal(-1, get(s:, 'in_try', -1))
784 assert_equal(-1, get(s:, 'in_catch', -1))
785 assert_equal(-1, get(s:, 'in_finally', -1))
786 END
787 v9.CheckScriptSuccess(lines)
788enddef
789
Bram Moolenaar53c29612022-01-12 16:18:18 +0000790def Test_try_ends_in_return()
791 var lines =<< trim END
792 vim9script
793 def Foo(): string
794 try
795 return 'foo'
796 catch
797 return 'caught'
798 endtry
799 enddef
800 assert_equal('foo', Foo())
801 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000802 v9.CheckScriptSuccess(lines)
Bram Moolenaar53c29612022-01-12 16:18:18 +0000803
804 lines =<< trim END
805 vim9script
806 def Foo(): string
807 try
808 return 'foo'
809 catch
810 return 'caught'
811 endtry
812 echo 'notreached'
813 enddef
814 assert_equal('foo', Foo())
815 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000816 v9.CheckScriptFailure(lines, 'E1095:')
Bram Moolenaar53c29612022-01-12 16:18:18 +0000817
818 lines =<< trim END
819 vim9script
820 def Foo(): string
821 try
822 return 'foo'
823 catch /x/
824 return 'caught'
825 endtry
826 enddef
827 assert_equal('foo', Foo())
828 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000829 v9.CheckScriptFailure(lines, 'E1027:')
Bram Moolenaar53c29612022-01-12 16:18:18 +0000830
831 lines =<< trim END
832 vim9script
833 def Foo(): string
834 try
835 echo 'foo'
836 catch
837 echo 'caught'
838 finally
839 return 'done'
840 endtry
841 enddef
842 assert_equal('done', Foo())
843 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000844 v9.CheckScriptSuccess(lines)
Bram Moolenaar53c29612022-01-12 16:18:18 +0000845
846enddef
847
Bram Moolenaar3f987b52021-06-30 12:02:24 +0200848def Test_try_in_catch()
849 var lines =<< trim END
850 vim9script
851 var seq = []
852 def DoIt()
853 try
854 seq->add('throw 1')
855 eval [][0]
856 seq->add('notreached')
857 catch
858 seq->add('catch')
859 try
860 seq->add('throw 2')
861 eval [][0]
862 seq->add('notreached')
863 catch /nothing/
864 seq->add('notreached')
865 endtry
866 seq->add('done')
867 endtry
868 enddef
869 DoIt()
870 assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq)
871 END
872enddef
873
Bram Moolenaard3d8fee2021-06-30 19:54:43 +0200874def Test_error_in_catch()
875 var lines =<< trim END
876 try
877 eval [][0]
878 catch /E684:/
879 eval [][0]
880 endtry
881 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000882 v9.CheckDefExecFailure(lines, 'E684:', 4)
Bram Moolenaard3d8fee2021-06-30 19:54:43 +0200883enddef
884
Bram Moolenaar2e34c342021-03-14 12:13:33 +0100885" :while at the very start of a function that :continue jumps to
Bram Moolenaar62aec932022-01-29 21:45:34 +0000886def s:TryContinueFunc()
Bram Moolenaar2e34c342021-03-14 12:13:33 +0100887 while g:Count < 2
888 g:sequence ..= 't'
889 try
890 echoerr 'Test'
891 catch
892 g:Count += 1
893 g:sequence ..= 'c'
894 continue
895 endtry
896 g:sequence ..= 'e'
897 g:Count += 1
898 endwhile
899enddef
900
901def Test_continue_in_try_in_while()
902 g:Count = 0
903 g:sequence = ''
904 TryContinueFunc()
905 assert_equal('tctc', g:sequence)
906 unlet g:Count
907 unlet g:sequence
908enddef
909
Bram Moolenaar9cb577a2021-02-22 22:45:10 +0100910def Test_nocatch_return_in_try()
911 # return in try block returns normally
912 def ReturnInTry(): string
913 try
914 return '"some message"'
915 catch
916 endtry
917 return 'not reached'
918 enddef
919 exe 'echoerr ' .. ReturnInTry()
920enddef
921
Bram Moolenaar1430cee2021-01-17 19:20:32 +0100922def Test_cnext_works_in_catch()
923 var lines =<< trim END
924 vim9script
Bram Moolenaarc3235272021-07-10 19:42:03 +0200925 au BufEnter * eval 1 + 2
Bram Moolenaar1430cee2021-01-17 19:20:32 +0100926 writefile(['text'], 'Xfile1')
927 writefile(['text'], 'Xfile2')
928 var items = [
929 {lnum: 1, filename: 'Xfile1', valid: true},
930 {lnum: 1, filename: 'Xfile2', valid: true}
931 ]
932 setqflist([], ' ', {items: items})
933 cwindow
934
935 def CnextOrCfirst()
936 # if cnext fails, cfirst is used
937 try
938 cnext
939 catch
940 cfirst
941 endtry
942 enddef
943
944 CnextOrCfirst()
945 CnextOrCfirst()
946 writefile([getqflist({idx: 0}).idx], 'Xresult')
947 qall
948 END
949 writefile(lines, 'XCatchCnext')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000950 g:RunVim([], [], '--clean -S XCatchCnext')
Bram Moolenaar1430cee2021-01-17 19:20:32 +0100951 assert_equal(['1'], readfile('Xresult'))
952
953 delete('Xfile1')
954 delete('Xfile2')
955 delete('XCatchCnext')
956 delete('Xresult')
957enddef
958
Bram Moolenaar9e1d9e32021-01-11 20:17:34 +0100959def Test_throw_skipped()
960 if 0
961 throw dontgethere
962 endif
963enddef
964
Bram Moolenaar8f81b222021-01-14 21:47:06 +0100965def Test_nocatch_throw_silenced()
966 var lines =<< trim END
967 vim9script
968 def Func()
969 throw 'error'
970 enddef
971 silent! Func()
972 END
973 writefile(lines, 'XthrowSilenced')
974 source XthrowSilenced
975 delete('XthrowSilenced')
976enddef
977
Bram Moolenaare8593122020-07-18 15:17:02 +0200978def DeletedFunc(): list<any>
979 return ['delete me']
980enddef
981defcompile
982delfunc DeletedFunc
983
Bram Moolenaar62aec932022-01-29 21:45:34 +0000984def s:ThrowFromDef()
Bram Moolenaara72cfb82020-04-23 17:07:30 +0200985 throw "getout" # comment
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100986enddef
987
Bram Moolenaar62aec932022-01-29 21:45:34 +0000988func s:CatchInFunc()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100989 try
Bram Moolenaar62aec932022-01-29 21:45:34 +0000990 call s:ThrowFromDef()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100991 catch
992 let g:thrown_func = v:exception
993 endtry
994endfunc
995
Bram Moolenaar62aec932022-01-29 21:45:34 +0000996def s:CatchInDef()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100997 try
998 ThrowFromDef()
999 catch
1000 g:thrown_def = v:exception
1001 endtry
1002enddef
1003
Bram Moolenaar62aec932022-01-29 21:45:34 +00001004def s:ReturnFinally(): string
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001005 try
1006 return 'intry'
Bram Moolenaar204852a2022-03-05 12:56:44 +00001007 finally
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001008 g:in_finally = 'finally'
1009 endtry
1010 return 'end'
1011enddef
1012
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001013def Test_try_catch_nested()
1014 CatchInFunc()
1015 assert_equal('getout', g:thrown_func)
1016
1017 CatchInDef()
1018 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001019
1020 assert_equal('intry', ReturnFinally())
1021 assert_equal('finally', g:in_finally)
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001022
1023 var l = []
1024 try
1025 l->add('1')
1026 throw 'bad'
1027 l->add('x')
1028 catch /bad/
1029 l->add('2')
1030 try
1031 l->add('3')
1032 throw 'one'
1033 l->add('x')
1034 catch /one/
1035 l->add('4')
1036 try
1037 l->add('5')
1038 throw 'more'
1039 l->add('x')
1040 catch /more/
1041 l->add('6')
1042 endtry
1043 endtry
1044 endtry
1045 assert_equal(['1', '2', '3', '4', '5', '6'], l)
Bram Moolenaar834193a2021-06-30 20:39:15 +02001046
1047 l = []
1048 try
1049 try
1050 l->add('1')
1051 throw 'foo'
1052 l->add('x')
1053 catch
1054 l->add('2')
1055 throw 'bar'
1056 l->add('x')
1057 finally
1058 l->add('3')
1059 endtry
1060 l->add('x')
1061 catch /bar/
1062 l->add('4')
1063 endtry
1064 assert_equal(['1', '2', '3', '4'], l)
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001065enddef
1066
Bram Moolenaar62aec932022-01-29 21:45:34 +00001067def s:TryOne(): number
Bram Moolenaar9939f572020-09-16 22:29:52 +02001068 try
1069 return 0
1070 catch
1071 endtry
1072 return 0
1073enddef
1074
Bram Moolenaar62aec932022-01-29 21:45:34 +00001075def s:TryTwo(n: number): string
Bram Moolenaar9939f572020-09-16 22:29:52 +02001076 try
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001077 var x = {}
Bram Moolenaar9939f572020-09-16 22:29:52 +02001078 catch
1079 endtry
1080 return 'text'
1081enddef
1082
1083def Test_try_catch_twice()
1084 assert_equal('text', TryOne()->TryTwo())
1085enddef
1086
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001087def Test_try_catch_match()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001088 var seq = 'a'
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001089 try
1090 throw 'something'
1091 catch /nothing/
1092 seq ..= 'x'
1093 catch /some/
1094 seq ..= 'b'
1095 catch /asdf/
1096 seq ..= 'x'
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001097 catch ?a\?sdf?
1098 seq ..= 'y'
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001099 finally
1100 seq ..= 'c'
1101 endtry
1102 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001103enddef
1104
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001105def Test_try_catch_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001106 v9.CheckDefFailure(['catch'], 'E603:')
1107 v9.CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1108 v9.CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1109 v9.CheckDefFailure(['finally'], 'E606:')
1110 v9.CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1111 v9.CheckDefFailure(['endtry'], 'E602:')
1112 v9.CheckDefFailure(['while 1', 'endtry'], 'E170:')
1113 v9.CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1114 v9.CheckDefFailure(['if 1', 'endtry'], 'E171:')
1115 v9.CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001116
Bram Moolenaar62aec932022-01-29 21:45:34 +00001117 v9.CheckDefFailure(['throw'], 'E1143:')
1118 v9.CheckDefFailure(['throw xxx'], 'E1001:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001119enddef
1120
Bram Moolenaar7c5b3c0362021-02-14 22:40:57 +01001121def Try_catch_skipped()
1122 var l = []
1123 try
1124 finally
1125 endtry
1126
1127 if 1
1128 else
1129 try
1130 endtry
1131 endif
1132enddef
1133
1134" The skipped try/endtry was updating the wrong instruction.
1135def Test_try_catch_skipped()
1136 var instr = execute('disassemble Try_catch_skipped')
1137 assert_match("NEWLIST size 0\n", instr)
1138enddef
1139
Bram Moolenaar90a57162022-02-12 14:23:17 +00001140def Test_throw_line_number()
1141 def Func()
1142 eval 1 + 1
1143 eval 2 + 2
1144 throw 'exception'
1145 enddef
1146 try
1147 Func()
1148 catch /exception/
1149 assert_match('line 3', v:throwpoint)
1150 endtry
1151enddef
Bram Moolenaar7c5b3c0362021-02-14 22:40:57 +01001152
1153
Bram Moolenaar006ad482020-06-30 20:55:15 +02001154def Test_throw_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001155 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001156 var lines =<< trim END
Bram Moolenaar006ad482020-06-30 20:55:15 +02001157 vim9script
1158 try
1159 throw 'one'
1160 .. 'two'
1161 catch
1162 assert_equal('onetwo', v:exception)
1163 endtry
1164 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001165 v9.CheckScriptSuccess(lines)
Bram Moolenaar1e021e62020-10-16 20:25:23 +02001166
1167 lines =<< trim END
1168 vim9script
Bram Moolenaar352134b2020-10-17 22:04:08 +02001169 @r = ''
Bram Moolenaar1e021e62020-10-16 20:25:23 +02001170 def Func()
1171 throw @r
1172 enddef
1173 var result = ''
1174 try
1175 Func()
1176 catch /E1129:/
1177 result = 'caught'
1178 endtry
1179 assert_equal('caught', result)
1180 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001181 v9.CheckScriptSuccess(lines)
Bram Moolenaar006ad482020-06-30 20:55:15 +02001182enddef
1183
Bram Moolenaared677f52020-08-12 16:38:10 +02001184def Test_error_in_nested_function()
Bram Moolenaar03dfde22021-02-14 13:17:22 +01001185 # an error in a nested :function aborts executing in the calling :def function
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001186 var lines =<< trim END
Bram Moolenaared677f52020-08-12 16:38:10 +02001187 vim9script
1188 def Func()
1189 Error()
1190 g:test_var = 1
1191 enddef
1192 func Error() abort
1193 eval [][0]
1194 endfunc
1195 Func()
1196 END
1197 g:test_var = 0
Bram Moolenaar62aec932022-01-29 21:45:34 +00001198 v9.CheckScriptFailure(lines, 'E684:')
Bram Moolenaared677f52020-08-12 16:38:10 +02001199 assert_equal(0, g:test_var)
1200enddef
1201
Bram Moolenaar227c58a2021-04-28 20:40:44 +02001202def Test_abort_after_error()
1203 var lines =<< trim END
1204 vim9script
1205 while true
1206 echo notfound
1207 endwhile
1208 g:gotthere = true
1209 END
1210 g:gotthere = false
Bram Moolenaar62aec932022-01-29 21:45:34 +00001211 v9.CheckScriptFailure(lines, 'E121:')
Bram Moolenaar227c58a2021-04-28 20:40:44 +02001212 assert_false(g:gotthere)
1213 unlet g:gotthere
1214enddef
1215
Bram Moolenaar37c83712020-06-30 21:18:36 +02001216def Test_cexpr_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001217 # only checks line continuation
Bram Moolenaar37c83712020-06-30 21:18:36 +02001218 set errorformat=File\ %f\ line\ %l
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001219 var lines =<< trim END
Bram Moolenaar37c83712020-06-30 21:18:36 +02001220 vim9script
1221 cexpr 'File'
1222 .. ' someFile' ..
1223 ' line 19'
1224 assert_equal(19, getqflist()[0].lnum)
1225 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001226 v9.CheckScriptSuccess(lines)
Bram Moolenaar37c83712020-06-30 21:18:36 +02001227 set errorformat&
1228enddef
1229
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001230def Test_statusline_syntax()
1231 # legacy syntax is used for 'statusline'
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001232 var lines =<< trim END
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001233 vim9script
1234 func g:Status()
1235 return '%{"x" is# "x"}'
1236 endfunc
1237 set laststatus=2 statusline=%!Status()
1238 redrawstatus
1239 set laststatus statusline=
1240 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001241 v9.CheckScriptSuccess(lines)
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001242enddef
1243
Bram Moolenaarb2097502020-07-19 17:17:02 +02001244def Test_list_vimscript()
1245 # checks line continuation and comments
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001246 var lines =<< trim END
Bram Moolenaarb2097502020-07-19 17:17:02 +02001247 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001248 var mylist = [
Bram Moolenaarb2097502020-07-19 17:17:02 +02001249 'one',
1250 # comment
1251 'two', # empty line follows
1252
1253 'three',
1254 ]
1255 assert_equal(['one', 'two', 'three'], mylist)
1256 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001257 v9.CheckScriptSuccess(lines)
Bram Moolenaar66250c92020-08-20 15:02:42 +02001258
1259 # check all lines from heredoc are kept
1260 lines =<< trim END
1261 # comment 1
1262 two
1263 # comment 3
1264
1265 five
1266 # comment 6
1267 END
1268 assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
Bram Moolenaar4bce26b2021-01-22 22:06:56 +01001269
1270 lines =<< trim END
1271 [{
1272 a: 0}]->string()->assert_equal("[{'a': 0}]")
1273 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001274 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarb2097502020-07-19 17:17:02 +02001275enddef
1276
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001277if has('channel')
1278 let someJob = test_null_job()
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001279
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001280 def FuncWithError()
1281 echomsg g:someJob
1282 enddef
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001283
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001284 func Test_convert_emsg_to_exception()
1285 try
1286 call FuncWithError()
1287 catch
1288 call assert_match('Vim:E908:', v:exception)
1289 endtry
1290 endfunc
1291endif
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001292
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001293def Test_vim9script_mix()
1294 var lines =<< trim END
1295 if has(g:feature)
1296 " legacy script
1297 let g:legacy = 1
1298 finish
1299 endif
1300 vim9script
1301 g:legacy = 0
1302 END
1303 g:feature = 'eval'
1304 g:legacy = -1
Bram Moolenaar62aec932022-01-29 21:45:34 +00001305 v9.CheckScriptSuccess(lines)
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001306 assert_equal(1, g:legacy)
1307
1308 g:feature = 'noteval'
1309 g:legacy = -1
Bram Moolenaar62aec932022-01-29 21:45:34 +00001310 v9.CheckScriptSuccess(lines)
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001311 assert_equal(0, g:legacy)
1312enddef
1313
Bram Moolenaar750802b2020-02-23 18:08:33 +01001314def Test_vim9script_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001315 v9.CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
1316 v9.CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +01001317
Bram Moolenaar62aec932022-01-29 21:45:34 +00001318 v9.CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1319 v9.CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
Bram Moolenaarc785b9a2020-06-19 18:34:15 +02001320
Bram Moolenaare2e40752020-09-04 21:18:46 +02001321 assert_fails('vim9script', 'E1038:')
Bram Moolenaar107f7322022-02-06 17:30:41 +00001322 v9.CheckDefFailure(['vim9script'], 'E1038:')
Bram Moolenaar8cbf2492022-02-06 20:28:13 +00001323
1324 # no error when skipping
1325 if has('nothing')
1326 vim9script
1327 endif
Bram Moolenaarc970e422021-03-17 15:03:04 +01001328enddef
1329
Bram Moolenaar6c3843c2021-03-04 12:38:21 +01001330def Test_script_var_shadows_function()
1331 var lines =<< trim END
1332 vim9script
1333 def Func(): number
1334 return 123
1335 enddef
1336 var Func = 1
1337 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001338 v9.CheckScriptFailure(lines, 'E1041:', 5)
Bram Moolenaar6c3843c2021-03-04 12:38:21 +01001339enddef
1340
Bram Moolenaar052ff292021-12-11 13:54:46 +00001341def Test_function_shadows_script_var()
1342 var lines =<< trim END
1343 vim9script
1344 var Func = 1
1345 def Func(): number
1346 return 123
1347 enddef
1348 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001349 v9.CheckScriptFailure(lines, 'E1041:', 3)
Bram Moolenaar052ff292021-12-11 13:54:46 +00001350enddef
1351
Bram Moolenaarc3235272021-07-10 19:42:03 +02001352def Test_script_var_shadows_command()
1353 var lines =<< trim END
1354 var undo = 1
1355 undo = 2
1356 assert_equal(2, undo)
1357 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001358 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc3235272021-07-10 19:42:03 +02001359
1360 lines =<< trim END
1361 var undo = 1
1362 undo
1363 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001364 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaarc3235272021-07-10 19:42:03 +02001365enddef
1366
Bram Moolenaar2ef91562021-12-11 16:14:07 +00001367def Test_vim9script_call_wrong_type()
1368 var lines =<< trim END
1369 vim9script
1370 var Time = 'localtime'
1371 Time()
1372 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001373 v9.CheckScriptFailure(lines, 'E1085:')
Bram Moolenaar2ef91562021-12-11 16:14:07 +00001374enddef
1375
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001376def Test_vim9script_reload_delfunc()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001377 var first_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001378 vim9script
1379 def FuncYes(): string
1380 return 'yes'
1381 enddef
1382 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001383 var withno_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001384 def FuncNo(): string
1385 return 'no'
1386 enddef
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001387 def g:DoCheck(no_exists: bool)
1388 assert_equal('yes', FuncYes())
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001389 assert_equal('no', FuncNo())
1390 enddef
1391 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001392 var nono_lines =<< trim END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001393 def g:DoCheck(no_exists: bool)
1394 assert_equal('yes', FuncYes())
Bram Moolenaar44d66522020-09-06 22:26:57 +02001395 assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001396 enddef
1397 END
1398
1399 # FuncNo() is defined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001400 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001401 source Xreloaded.vim
1402 g:DoCheck(true)
1403
1404 # FuncNo() is not redefined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001405 writefile(first_lines + nono_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001406 source Xreloaded.vim
Bram Moolenaar50824712020-12-20 21:10:17 +01001407 g:DoCheck(false)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001408
1409 # FuncNo() is back
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001410 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001411 source Xreloaded.vim
Bram Moolenaar50824712020-12-20 21:10:17 +01001412 g:DoCheck(false)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001413
1414 delete('Xreloaded.vim')
1415enddef
1416
Bram Moolenaar89483d42020-05-10 15:24:44 +02001417def Test_vim9script_reload_delvar()
1418 # write the script with a script-local variable
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001419 var lines =<< trim END
Bram Moolenaar89483d42020-05-10 15:24:44 +02001420 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001421 var name = 'string'
Bram Moolenaar89483d42020-05-10 15:24:44 +02001422 END
1423 writefile(lines, 'XreloadVar.vim')
1424 source XreloadVar.vim
1425
1426 # now write the script using the same variable locally - works
1427 lines =<< trim END
1428 vim9script
1429 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001430 var name = 'string'
Bram Moolenaar89483d42020-05-10 15:24:44 +02001431 enddef
1432 END
1433 writefile(lines, 'XreloadVar.vim')
1434 source XreloadVar.vim
1435
1436 delete('XreloadVar.vim')
1437enddef
1438
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001439def Test_func_redefine_error()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001440 var lines = [
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001441 'vim9script',
1442 'def Func()',
1443 ' eval [][0]',
1444 'enddef',
1445 'Func()',
1446 ]
1447 writefile(lines, 'Xtestscript.vim')
1448
1449 for count in range(3)
1450 try
1451 source Xtestscript.vim
1452 catch /E684/
1453 # function name should contain <SNR> every time
1454 assert_match('E684: list index out of range', v:exception)
1455 assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1456 endtry
1457 endfor
1458
1459 delete('Xtestscript.vim')
1460enddef
1461
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001462def Test_func_redefine_fails()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001463 var lines =<< trim END
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001464 vim9script
1465 def Func()
1466 echo 'one'
1467 enddef
1468 def Func()
1469 echo 'two'
1470 enddef
1471 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001472 v9.CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001473
1474 lines =<< trim END
1475 vim9script
1476 def Foo(): string
1477 return 'foo'
Bram Moolenaar052ff292021-12-11 13:54:46 +00001478 enddef
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001479 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001480 var Foo = {-> 'lambda'}
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001481 enddef
1482 defcompile
1483 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001484 v9.CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001485enddef
1486
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001487def Test_fixed_size_list()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001488 # will be allocated as one piece of memory, check that changes work
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001489 var l = [1, 2, 3, 4]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001490 l->remove(0)
1491 l->add(5)
1492 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001493 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001494enddef
1495
Bram Moolenaarae616492020-07-28 20:07:27 +02001496def Test_no_insert_xit()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001497 v9.CheckDefExecFailure(['a = 1'], 'E1100:')
1498 v9.CheckDefExecFailure(['c = 1'], 'E1100:')
1499 v9.CheckDefExecFailure(['i = 1'], 'E1100:')
1500 v9.CheckDefExecFailure(['t = 1'], 'E1100:')
1501 v9.CheckDefExecFailure(['x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02001502
Bram Moolenaar62aec932022-01-29 21:45:34 +00001503 v9.CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1504 v9.CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1505 v9.CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1506 v9.CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1507 v9.CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1508 v9.CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1509 v9.CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
1510 v9.CheckScriptFailure(['vim9script', 'o'], 'E1100:')
1511 v9.CheckScriptFailure(['vim9script', 't'], 'E1100:')
1512 v9.CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1513 v9.CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02001514enddef
1515
Bram Moolenaar62aec932022-01-29 21:45:34 +00001516def s:IfElse(what: number): string
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001517 var res = ''
Bram Moolenaar158906c2020-02-06 20:39:45 +01001518 if what == 1
1519 res = "one"
1520 elseif what == 2
1521 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001522 else
Bram Moolenaar158906c2020-02-06 20:39:45 +01001523 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001524 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +01001525 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001526enddef
1527
Bram Moolenaar158906c2020-02-06 20:39:45 +01001528def Test_if_elseif_else()
1529 assert_equal('one', IfElse(1))
1530 assert_equal('two', IfElse(2))
1531 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001532enddef
1533
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001534def Test_if_elseif_else_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001535 v9.CheckDefFailure(['elseif true'], 'E582:')
1536 v9.CheckDefFailure(['else'], 'E581:')
1537 v9.CheckDefFailure(['endif'], 'E580:')
1538 v9.CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
1539 v9.CheckDefFailure(['if true', 'echo 1'], 'E171:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01001540
1541 var lines =<< trim END
1542 var s = ''
1543 if s = ''
1544 endif
1545 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001546 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01001547
1548 lines =<< trim END
1549 var s = ''
1550 if s == ''
1551 elseif s = ''
1552 endif
1553 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001554 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001555enddef
1556
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001557let g:bool_true = v:true
1558let g:bool_false = v:false
1559
1560def Test_if_const_expr()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001561 var res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001562 if true ? true : false
1563 res = true
1564 endif
1565 assert_equal(true, res)
1566
Bram Moolenaar585fea72020-04-02 22:33:21 +02001567 g:glob = 2
1568 if false
Bram Moolenaar67979662020-06-20 22:50:47 +02001569 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001570 endif
1571 assert_equal(2, g:glob)
1572 if true
Bram Moolenaar67979662020-06-20 22:50:47 +02001573 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001574 endif
1575 assert_equal(3, g:glob)
1576
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001577 res = false
1578 if g:bool_true ? true : false
1579 res = true
1580 endif
1581 assert_equal(true, res)
1582
1583 res = false
1584 if true ? g:bool_true : false
1585 res = true
1586 endif
1587 assert_equal(true, res)
1588
1589 res = false
1590 if true ? true : g:bool_false
1591 res = true
1592 endif
1593 assert_equal(true, res)
1594
1595 res = false
1596 if true ? false : true
1597 res = true
1598 endif
1599 assert_equal(false, res)
1600
1601 res = false
1602 if false ? false : true
1603 res = true
1604 endif
1605 assert_equal(true, res)
1606
1607 res = false
1608 if false ? true : false
1609 res = true
1610 endif
1611 assert_equal(false, res)
1612
1613 res = false
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001614 if has('xyz') ? true : false
1615 res = true
1616 endif
1617 assert_equal(false, res)
1618
1619 res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001620 if true && true
1621 res = true
1622 endif
1623 assert_equal(true, res)
1624
1625 res = false
1626 if true && false
1627 res = true
1628 endif
1629 assert_equal(false, res)
1630
1631 res = false
1632 if g:bool_true && false
1633 res = true
1634 endif
1635 assert_equal(false, res)
1636
1637 res = false
1638 if true && g:bool_false
1639 res = true
1640 endif
1641 assert_equal(false, res)
1642
1643 res = false
1644 if false && false
1645 res = true
1646 endif
1647 assert_equal(false, res)
1648
1649 res = false
1650 if true || false
1651 res = true
1652 endif
1653 assert_equal(true, res)
1654
1655 res = false
1656 if g:bool_true || false
1657 res = true
1658 endif
1659 assert_equal(true, res)
1660
1661 res = false
1662 if true || g:bool_false
1663 res = true
1664 endif
1665 assert_equal(true, res)
1666
1667 res = false
1668 if false || false
1669 res = true
1670 endif
1671 assert_equal(false, res)
Bram Moolenaar3988f642020-08-27 22:43:03 +02001672
1673 # with constant "false" expression may be invalid so long as the syntax is OK
Bram Moolenaarc3235272021-07-10 19:42:03 +02001674 if false | eval 1 + 2 | endif
Bram Moolenaar3988f642020-08-27 22:43:03 +02001675 if false | eval burp + 234 | endif
1676 if false | echo burp 234 'asd' | endif
1677 if false
1678 burp
1679 endif
Bram Moolenaare525bdd2021-08-07 18:12:40 +02001680
Bram Moolenaar21ebb082022-02-04 21:58:58 +00001681 if 0
1682 if 1
1683 echo nothing
1684 elseif 1
1685 echo still nothing
1686 endif
1687 endif
1688
Bram Moolenaare525bdd2021-08-07 18:12:40 +02001689 # expression with line breaks skipped
1690 if false
1691 ('aaa'
1692 .. 'bbb'
1693 .. 'ccc'
1694 )->setline(1)
1695 endif
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02001696enddef
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001697
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02001698def Test_if_const_expr_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001699 v9.CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1700 v9.CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1701 v9.CheckDefFailure(["if has('aaa'"], 'E110:')
1702 v9.CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001703enddef
1704
Bram Moolenaar62aec932022-01-29 21:45:34 +00001705def s:RunNested(i: number): number
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001706 var x: number = 0
Bram Moolenaar72abcf42020-06-18 18:26:24 +02001707 if i % 2
1708 if 1
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001709 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02001710 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001711 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02001712 endif
1713 x += 1
1714 else
1715 x += 1000
1716 endif
1717 return x
1718enddef
1719
1720def Test_nested_if()
1721 assert_equal(1, RunNested(1))
1722 assert_equal(1000, RunNested(2))
1723enddef
1724
Bram Moolenaarad39c092020-02-26 18:23:43 +01001725def Test_execute_cmd()
Bram Moolenaare4984292020-12-13 14:19:25 +01001726 # missing argument is ignored
1727 execute
1728 execute # comment
1729
Bram Moolenaarad39c092020-02-26 18:23:43 +01001730 new
1731 setline(1, 'default')
Bram Moolenaard2c61702020-09-06 15:58:36 +02001732 execute 'setline(1, "execute-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001733 assert_equal('execute-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001734
Bram Moolenaard2c61702020-09-06 15:58:36 +02001735 execute "setline(1, 'execute-string')"
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001736 assert_equal('execute-string', getline(1))
1737
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001738 var cmd1 = 'setline(1,'
1739 var cmd2 = '"execute-var")'
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001740 execute cmd1 cmd2 # comment
Bram Moolenaarad39c092020-02-26 18:23:43 +01001741 assert_equal('execute-var', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001742
Bram Moolenaard2c61702020-09-06 15:58:36 +02001743 execute cmd1 cmd2 '|setline(1, "execute-var-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001744 assert_equal('execute-var-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001745
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001746 var cmd_first = 'call '
1747 var cmd_last = 'setline(1, "execute-var-var")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001748 execute cmd_first .. cmd_last
1749 assert_equal('execute-var-var', getline(1))
1750 bwipe!
Bram Moolenaar585fea72020-04-02 22:33:21 +02001751
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001752 var n = true
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02001753 execute 'echomsg' (n ? '"true"' : '"no"')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001754 assert_match('^true$', g:Screenline(&lines))
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02001755
Bram Moolenaare0de1712020-12-02 17:36:54 +01001756 echomsg [1, 2, 3] {a: 1, b: 2}
Bram Moolenaar62aec932022-01-29 21:45:34 +00001757 assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', g:Screenline(&lines))
Bram Moolenaare5abf7a2020-08-16 18:29:35 +02001758
Bram Moolenaar62aec932022-01-29 21:45:34 +00001759 v9.CheckDefFailure(['execute xxx'], 'E1001:', 1)
1760 v9.CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
1761 v9.CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
Bram Moolenaar0c7f2612022-02-17 19:44:07 +00001762 if has('channel')
1763 v9.CheckDefExecFailure(['execute test_null_channel()'], 'E908:', 1)
1764 endif
Bram Moolenaarad39c092020-02-26 18:23:43 +01001765enddef
1766
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001767def Test_execute_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001768 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001769 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001770 vim9script
1771 execute 'g:someVar'
1772 .. ' = ' ..
1773 '28'
1774 assert_equal(28, g:someVar)
1775 unlet g:someVar
1776 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001777 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001778enddef
1779
Bram Moolenaarad39c092020-02-26 18:23:43 +01001780def Test_echo_cmd()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001781 echo 'some' # comment
Bram Moolenaar585fea72020-04-02 22:33:21 +02001782 echon 'thing'
Bram Moolenaar62aec932022-01-29 21:45:34 +00001783 assert_match('^something$', g:Screenline(&lines))
Bram Moolenaarad39c092020-02-26 18:23:43 +01001784
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001785 echo "some" # comment
1786 echon "thing"
Bram Moolenaar62aec932022-01-29 21:45:34 +00001787 assert_match('^something$', g:Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001788
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001789 var str1 = 'some'
1790 var str2 = 'more'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001791 echo str1 str2
Bram Moolenaar62aec932022-01-29 21:45:34 +00001792 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001793
Bram Moolenaar62aec932022-01-29 21:45:34 +00001794 v9.CheckDefFailure(['echo "xxx"# comment'], 'E488:')
Bram Moolenaarad39c092020-02-26 18:23:43 +01001795enddef
1796
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001797def Test_echomsg_cmd()
1798 echomsg 'some' 'more' # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00001799 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001800 echo 'clear'
Bram Moolenaardf069ee2020-06-22 23:02:51 +02001801 :1messages
Bram Moolenaar62aec932022-01-29 21:45:34 +00001802 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001803
Bram Moolenaar62aec932022-01-29 21:45:34 +00001804 v9.CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001805enddef
1806
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001807def Test_echomsg_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001808 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001809 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001810 vim9script
1811 echomsg 'here'
1812 .. ' is ' ..
1813 'a message'
Bram Moolenaar62aec932022-01-29 21:45:34 +00001814 assert_match('^here is a message$', g:Screenline(&lines))
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001815 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001816 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001817enddef
1818
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001819def Test_echoerr_cmd()
Bram Moolenaar7de62622021-08-07 15:05:47 +02001820 var local = 'local'
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001821 try
Bram Moolenaar7de62622021-08-07 15:05:47 +02001822 echoerr 'something' local 'wrong' # comment
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001823 catch
Bram Moolenaar7de62622021-08-07 15:05:47 +02001824 assert_match('something local wrong', v:exception)
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001825 endtry
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001826enddef
1827
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001828def Test_echoerr_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001829 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001830 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001831 vim9script
1832 try
1833 echoerr 'this'
1834 .. ' is ' ..
1835 'wrong'
1836 catch
1837 assert_match('this is wrong', v:exception)
1838 endtry
1839 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001840 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001841enddef
1842
Bram Moolenaar7de62622021-08-07 15:05:47 +02001843def Test_echoconsole_cmd()
1844 var local = 'local'
1845 echoconsole 'something' local # comment
1846 # output goes anywhere
1847enddef
1848
Bram Moolenaar41fe0612020-03-01 16:22:40 +01001849def Test_for_outside_of_function()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001850 var lines =<< trim END
Bram Moolenaar41fe0612020-03-01 16:22:40 +01001851 vim9script
1852 new
1853 for var in range(0, 3)
1854 append(line('$'), var)
1855 endfor
1856 assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
1857 bwipe!
Bram Moolenaar522eefd2021-03-26 18:49:22 +01001858
1859 var result = ''
1860 for i in [1, 2, 3]
1861 var loop = ' loop ' .. i
1862 result ..= loop
1863 endfor
1864 assert_equal(' loop 1 loop 2 loop 3', result)
Bram Moolenaar41fe0612020-03-01 16:22:40 +01001865 END
1866 writefile(lines, 'Xvim9for.vim')
1867 source Xvim9for.vim
1868 delete('Xvim9for.vim')
1869enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001870
rbtnnbebf0692021-08-21 17:26:50 +02001871def Test_for_skipped_block()
1872 # test skipped blocks at outside of function
1873 var lines =<< trim END
1874 var result = []
1875 if true
1876 for n in [1, 2]
1877 result += [n]
1878 endfor
1879 else
1880 for n in [3, 4]
1881 result += [n]
1882 endfor
1883 endif
1884 assert_equal([1, 2], result)
1885
1886 result = []
1887 if false
1888 for n in [1, 2]
1889 result += [n]
1890 endfor
1891 else
1892 for n in [3, 4]
1893 result += [n]
1894 endfor
1895 endif
1896 assert_equal([3, 4], result)
1897 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001898 v9.CheckDefAndScriptSuccess(lines)
rbtnnbebf0692021-08-21 17:26:50 +02001899
1900 # test skipped blocks at inside of function
1901 lines =<< trim END
1902 def DefTrue()
1903 var result = []
1904 if true
1905 for n in [1, 2]
1906 result += [n]
1907 endfor
1908 else
1909 for n in [3, 4]
1910 result += [n]
1911 endfor
1912 endif
1913 assert_equal([1, 2], result)
1914 enddef
1915 DefTrue()
1916
1917 def DefFalse()
1918 var result = []
1919 if false
1920 for n in [1, 2]
1921 result += [n]
1922 endfor
1923 else
1924 for n in [3, 4]
1925 result += [n]
1926 endfor
1927 endif
1928 assert_equal([3, 4], result)
1929 enddef
1930 DefFalse()
1931 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001932 v9.CheckDefAndScriptSuccess(lines)
rbtnnbebf0692021-08-21 17:26:50 +02001933enddef
1934
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001935def Test_for_loop()
Bram Moolenaarf2253962021-04-13 20:53:13 +02001936 var lines =<< trim END
1937 var result = ''
1938 for cnt in range(7)
1939 if cnt == 4
1940 break
1941 endif
1942 if cnt == 2
1943 continue
1944 endif
1945 result ..= cnt .. '_'
1946 endfor
1947 assert_equal('0_1_3_', result)
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001948
Bram Moolenaarf2253962021-04-13 20:53:13 +02001949 var concat = ''
1950 for str in eval('["one", "two"]')
1951 concat ..= str
1952 endfor
1953 assert_equal('onetwo', concat)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01001954
Bram Moolenaarf2253962021-04-13 20:53:13 +02001955 var total = 0
1956 for nr in
1957 [1, 2, 3]
1958 total += nr
1959 endfor
1960 assert_equal(6, total)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01001961
Bram Moolenaarf2253962021-04-13 20:53:13 +02001962 total = 0
1963 for nr
1964 in [1, 2, 3]
1965 total += nr
1966 endfor
1967 assert_equal(6, total)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01001968
Bram Moolenaarf2253962021-04-13 20:53:13 +02001969 total = 0
1970 for nr
1971 in
1972 [1, 2, 3]
1973 total += nr
1974 endfor
1975 assert_equal(6, total)
Bram Moolenaar036d0712021-01-17 20:23:38 +01001976
Bram Moolenaara3589a02021-04-14 13:30:46 +02001977 # with type
1978 total = 0
1979 for n: number in [1, 2, 3]
1980 total += n
1981 endfor
1982 assert_equal(6, total)
1983
Bram Moolenaarfe090eb2021-04-15 21:48:32 +02001984 var chars = ''
1985 for s: string in 'foobar'
1986 chars ..= s
1987 endfor
1988 assert_equal('foobar', chars)
1989
Bram Moolenaar5ede5b22021-07-07 21:55:25 +02001990 chars = ''
1991 for x: string in {a: 'a', b: 'b'}->values()
1992 chars ..= x
1993 endfor
1994 assert_equal('ab', chars)
1995
Bram Moolenaara3589a02021-04-14 13:30:46 +02001996 # unpack with type
Bram Moolenaarf2253962021-04-13 20:53:13 +02001997 var res = ''
Bram Moolenaara3589a02021-04-14 13:30:46 +02001998 for [n: number, s: string] in [[1, 'a'], [2, 'b']]
1999 res ..= n .. s
2000 endfor
2001 assert_equal('1a2b', res)
2002
Bram Moolenaar444d8782021-06-26 12:40:56 +02002003 # unpack with one var
2004 var reslist = []
2005 for [x] in [['aaa'], ['bbb']]
2006 reslist->add(x)
2007 endfor
2008 assert_equal(['aaa', 'bbb'], reslist)
2009
Bram Moolenaara3589a02021-04-14 13:30:46 +02002010 # loop over string
2011 res = ''
Bram Moolenaarf2253962021-04-13 20:53:13 +02002012 for c in 'aéc̀d'
2013 res ..= c .. '-'
2014 endfor
2015 assert_equal('a-é-c̀-d-', res)
2016
2017 res = ''
2018 for c in ''
2019 res ..= c .. '-'
2020 endfor
2021 assert_equal('', res)
2022
2023 res = ''
2024 for c in test_null_string()
2025 res ..= c .. '-'
2026 endfor
2027 assert_equal('', res)
2028
2029 var foo: list<dict<any>> = [
2030 {a: 'Cat'}
2031 ]
2032 for dd in foo
2033 dd.counter = 12
2034 endfor
2035 assert_equal([{a: 'Cat', counter: 12}], foo)
Bram Moolenaarad2d4962021-07-18 17:08:50 +02002036
2037 reslist = []
2038 for _ in range(3)
2039 reslist->add('x')
2040 endfor
2041 assert_equal(['x', 'x', 'x'], reslist)
Bram Moolenaarf2253962021-04-13 20:53:13 +02002042 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002043 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002044enddef
2045
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002046def Test_for_loop_with_closure()
2047 var lines =<< trim END
2048 var flist: list<func>
2049 for i in range(5)
2050 var inloop = i
2051 flist[i] = () => inloop
2052 endfor
2053 for i in range(5)
2054 assert_equal(4, flist[i]())
2055 endfor
2056 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002057 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002058
2059 lines =<< trim END
2060 var flist: list<func>
2061 for i in range(5)
2062 var inloop = i
2063 flist[i] = () => {
2064 return inloop
2065 }
2066 endfor
2067 for i in range(5)
2068 assert_equal(4, flist[i]())
2069 endfor
2070 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002071 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002072enddef
2073
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002074def Test_for_loop_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00002075 v9.CheckDefAndScriptFailure(['for '], ['E1097:', 'E690:'])
2076 v9.CheckDefAndScriptFailure(['for x'], ['E1097:', 'E690:'])
2077 v9.CheckDefAndScriptFailure(['for x in'], ['E1097:', 'E15:'])
2078 v9.CheckDefAndScriptFailure(['for # in range(5)'], 'E690:')
2079 v9.CheckDefAndScriptFailure(['for i In range(5)'], 'E690:')
2080 v9.CheckDefAndScriptFailure(['var x = 5', 'for x in range(5)', 'endfor'], ['E1017:', 'E1041:'])
2081 v9.CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3)
2082 v9.CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01002083 delfunc! g:Func
Bram Moolenaar62aec932022-01-29 21:45:34 +00002084 v9.CheckDefFailure(['for i in xxx'], 'E1001:')
2085 v9.CheckDefFailure(['endfor'], 'E588:')
2086 v9.CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002087
2088 # wrong type detected at compile time
Bram Moolenaar62aec932022-01-29 21:45:34 +00002089 v9.CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002090
2091 # wrong type detected at runtime
2092 g:adict = {a: 1}
Bram Moolenaar62aec932022-01-29 21:45:34 +00002093 v9.CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002094 unlet g:adict
Bram Moolenaarf6a8d422021-04-13 21:48:03 +02002095
2096 var lines =<< trim END
2097 var d: list<dict<any>> = [{a: 0}]
2098 for e in d
2099 e = {a: 0, b: ''}
2100 endfor
2101 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002102 v9.CheckDefAndScriptFailure(lines, ['E1018:', 'E46:'], 3)
Bram Moolenaarfe090eb2021-04-15 21:48:32 +02002103
2104 lines =<< trim END
2105 for nr: number in ['foo']
2106 endfor
2107 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002108 v9.CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
Bram Moolenaar404557e2021-07-05 21:41:48 +02002109
2110 lines =<< trim END
2111 for n : number in [1, 2]
2112 echo n
2113 endfor
2114 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002115 v9.CheckDefAndScriptFailure(lines, 'E1059:', 1)
Bram Moolenaarefc5db52021-07-07 21:21:30 +02002116
2117 lines =<< trim END
2118 var d: dict<number> = {a: 1, b: 2}
2119 for [k: job, v: job] in d->items()
2120 echo k v
2121 endfor
2122 END
Bram Moolenaara1c51952022-02-02 16:20:26 +00002123 v9.CheckDefExecAndScriptFailure(lines, ['E1013: Argument 1: type mismatch, expected job but got string', 'E1012: Type mismatch; expected job but got string'], 2)
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002124
2125 lines =<< trim END
2126 var i = 0
2127 for i in [1, 2, 3]
2128 echo i
2129 endfor
2130 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002131 v9.CheckDefExecAndScriptFailure(lines, ['E1017:', 'E1041:'])
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002132
2133 lines =<< trim END
2134 var l = [0]
2135 for l[0] in [1, 2, 3]
2136 echo l[0]
2137 endfor
2138 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002139 v9.CheckDefExecAndScriptFailure(lines, ['E461:', 'E1017:'])
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002140
2141 lines =<< trim END
2142 var d = {x: 0}
2143 for d.x in [1, 2, 3]
2144 echo d.x
2145 endfor
2146 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002147 v9.CheckDefExecAndScriptFailure(lines, ['E461:', 'E1017:'])
Bram Moolenaara1c51952022-02-02 16:20:26 +00002148
2149 lines =<< trim END
2150 var l: list<dict<any>> = [{a: 1, b: 'x'}]
2151 for item: dict<number> in l
2152 echo item
2153 endfor
2154 END
2155 v9.CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected dict<number> but got dict<any>')
2156
2157 lines =<< trim END
2158 var l: list<dict<any>> = [{n: 1}]
2159 for item: dict<number> in l
2160 item->extend({s: ''})
2161 endfor
2162 END
2163 v9.CheckDefExecAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected dict<number> but got dict<string>')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002164enddef
2165
Bram Moolenaarea870692020-12-02 14:24:30 +01002166def Test_for_loop_script_var()
2167 # cannot use s:var in a :def function
Bram Moolenaar62aec932022-01-29 21:45:34 +00002168 v9.CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1254:')
Bram Moolenaarea870692020-12-02 14:24:30 +01002169
2170 # can use s:var in Vim9 script, with or without s:
2171 var lines =<< trim END
2172 vim9script
2173 var total = 0
2174 for s:var in [1, 2, 3]
2175 total += s:var
2176 endfor
2177 assert_equal(6, total)
2178
2179 total = 0
2180 for var in [1, 2, 3]
2181 total += var
2182 endfor
2183 assert_equal(6, total)
2184 END
2185enddef
2186
Bram Moolenaar792f7862020-11-23 08:31:18 +01002187def Test_for_loop_unpack()
Bram Moolenaar792f7862020-11-23 08:31:18 +01002188 var lines =<< trim END
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002189 var result = []
2190 for [v1, v2] in [[1, 2], [3, 4]]
2191 result->add(v1)
2192 result->add(v2)
2193 endfor
2194 assert_equal([1, 2, 3, 4], result)
2195
2196 result = []
2197 for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2198 result->add(v1)
2199 result->add(v2)
2200 result->add(v3)
2201 endfor
2202 assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2203
2204 result = []
2205 for [&ts, &sw] in [[1, 2], [3, 4]]
2206 result->add(&ts)
2207 result->add(&sw)
2208 endfor
2209 assert_equal([1, 2, 3, 4], result)
2210
2211 var slist: list<string>
2212 for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
2213 slist->add($LOOPVAR)
2214 slist->add(@r)
2215 slist->add(v:errmsg)
2216 endfor
2217 assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
2218
2219 slist = []
2220 for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
2221 slist->add(g:globalvar)
2222 slist->add(b:bufvar)
2223 slist->add(w:winvar)
2224 slist->add(t:tabvar)
2225 endfor
2226 assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
Bram Moolenaarf6c177a2020-12-04 17:38:00 +01002227 unlet! g:globalvar b:bufvar w:winvar t:tabvar
Bram Moolenaarb777da92021-05-22 21:40:39 +02002228
2229 var res = []
2230 for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
2231 res->add(n)
2232 endfor
2233 assert_equal([2, 5], res)
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002234 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002235 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002236
2237 lines =<< trim END
Bram Moolenaar792f7862020-11-23 08:31:18 +01002238 for [v1, v2] in [[1, 2, 3], [3, 4]]
2239 echo v1 v2
2240 endfor
2241 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002242 v9.CheckDefExecFailure(lines, 'E710:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01002243
2244 lines =<< trim END
2245 for [v1, v2] in [[1], [3, 4]]
2246 echo v1 v2
2247 endfor
2248 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002249 v9.CheckDefExecFailure(lines, 'E711:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01002250
2251 lines =<< trim END
2252 for [v1, v1] in [[1, 2], [3, 4]]
2253 echo v1
2254 endfor
2255 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002256 v9.CheckDefExecFailure(lines, 'E1017:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01002257enddef
2258
Bram Moolenaarc150c092021-02-13 15:02:46 +01002259def Test_for_loop_with_try_continue()
Bram Moolenaarf2253962021-04-13 20:53:13 +02002260 var lines =<< trim END
2261 var looped = 0
2262 var cleanup = 0
2263 for i in range(3)
2264 looped += 1
2265 try
2266 eval [][0]
2267 catch
2268 continue
2269 finally
2270 cleanup += 1
2271 endtry
2272 endfor
2273 assert_equal(3, looped)
2274 assert_equal(3, cleanup)
2275 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002276 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc150c092021-02-13 15:02:46 +01002277enddef
2278
rbtnnd895b1d2021-08-20 20:54:25 +02002279def Test_while_skipped_block()
2280 # test skipped blocks at outside of function
2281 var lines =<< trim END
2282 var result = []
2283 var n = 0
2284 if true
2285 n = 1
2286 while n < 3
2287 result += [n]
2288 n += 1
2289 endwhile
2290 else
2291 n = 3
2292 while n < 5
2293 result += [n]
2294 n += 1
2295 endwhile
2296 endif
2297 assert_equal([1, 2], result)
2298
2299 result = []
2300 if false
2301 n = 1
2302 while n < 3
2303 result += [n]
2304 n += 1
2305 endwhile
2306 else
2307 n = 3
2308 while n < 5
2309 result += [n]
2310 n += 1
2311 endwhile
2312 endif
2313 assert_equal([3, 4], result)
2314 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002315 v9.CheckDefAndScriptSuccess(lines)
rbtnnd895b1d2021-08-20 20:54:25 +02002316
2317 # test skipped blocks at inside of function
2318 lines =<< trim END
2319 def DefTrue()
2320 var result = []
2321 var n = 0
2322 if true
2323 n = 1
2324 while n < 3
2325 result += [n]
2326 n += 1
2327 endwhile
2328 else
2329 n = 3
2330 while n < 5
2331 result += [n]
2332 n += 1
2333 endwhile
2334 endif
2335 assert_equal([1, 2], result)
2336 enddef
2337 DefTrue()
2338
2339 def DefFalse()
2340 var result = []
2341 var n = 0
2342 if false
2343 n = 1
2344 while n < 3
2345 result += [n]
2346 n += 1
2347 endwhile
2348 else
2349 n = 3
2350 while n < 5
2351 result += [n]
2352 n += 1
2353 endwhile
2354 endif
2355 assert_equal([3, 4], result)
2356 enddef
2357 DefFalse()
2358 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002359 v9.CheckDefAndScriptSuccess(lines)
rbtnnd895b1d2021-08-20 20:54:25 +02002360enddef
2361
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01002362def Test_while_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002363 var result = ''
2364 var cnt = 0
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01002365 while cnt < 555
2366 if cnt == 3
2367 break
2368 endif
2369 cnt += 1
2370 if cnt == 2
2371 continue
2372 endif
2373 result ..= cnt .. '_'
2374 endwhile
2375 assert_equal('1_3_', result)
Bram Moolenaardee37dc2021-02-07 16:40:05 +01002376
2377 var s = ''
Bram Moolenaar4b3e1962021-03-18 21:37:55 +01002378 while s == 'x' # {comment}
Bram Moolenaardee37dc2021-02-07 16:40:05 +01002379 endwhile
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01002380enddef
2381
Bram Moolenaar7a53f292021-11-22 18:31:02 +00002382def Test_while_loop_in_script()
2383 var lines =<< trim END
2384 vim9script
2385 var result = ''
2386 var cnt = 0
2387 while cnt < 3
2388 var s = 'v' .. cnt
2389 result ..= s
2390 cnt += 1
2391 endwhile
2392 assert_equal('v0v1v2', result)
2393 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002394 v9.CheckScriptSuccess(lines)
Bram Moolenaar7a53f292021-11-22 18:31:02 +00002395enddef
2396
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002397def Test_while_loop_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00002398 v9.CheckDefFailure(['while xxx'], 'E1001:')
2399 v9.CheckDefFailure(['endwhile'], 'E588:')
2400 v9.CheckDefFailure(['continue'], 'E586:')
2401 v9.CheckDefFailure(['if true', 'continue'], 'E586:')
2402 v9.CheckDefFailure(['break'], 'E587:')
2403 v9.CheckDefFailure(['if true', 'break'], 'E587:')
2404 v9.CheckDefFailure(['while 1', 'echo 3'], 'E170:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01002405
2406 var lines =<< trim END
2407 var s = ''
2408 while s = ''
2409 endwhile
2410 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002411 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaarbd5da372020-03-31 23:13:10 +02002412enddef
2413
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01002414def Test_interrupt_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002415 var caught = false
2416 var x = 0
Bram Moolenaar97acfc72020-03-22 13:44:28 +01002417 try
2418 while 1
2419 x += 1
2420 if x == 100
2421 feedkeys("\<C-C>", 'Lt')
2422 endif
2423 endwhile
2424 catch
2425 caught = true
2426 assert_equal(100, x)
2427 endtry
2428 assert_true(caught, 'should have caught an exception')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02002429 # consume the CTRL-C
2430 getchar(0)
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01002431enddef
Bram Moolenaar20431c92020-03-20 18:39:46 +01002432
Bram Moolenaar4fdae992020-04-12 16:38:57 +02002433def Test_automatic_line_continuation()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002434 var mylist = [
Bram Moolenaar4fdae992020-04-12 16:38:57 +02002435 'one',
2436 'two',
2437 'three',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002438 ] # comment
Bram Moolenaar4fdae992020-04-12 16:38:57 +02002439 assert_equal(['one', 'two', 'three'], mylist)
2440
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002441 var mydict = {
Bram Moolenaare0de1712020-12-02 17:36:54 +01002442 ['one']: 1,
2443 ['two']: 2,
2444 ['three']:
Bram Moolenaar4fdae992020-04-12 16:38:57 +02002445 3,
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002446 } # comment
Bram Moolenaare0de1712020-12-02 17:36:54 +01002447 assert_equal({one: 1, two: 2, three: 3}, mydict)
2448 mydict = {
Bram Moolenaar2c330432020-04-13 14:41:35 +02002449 one: 1, # comment
2450 two: # comment
2451 2, # comment
2452 three: 3 # comment
2453 }
Bram Moolenaare0de1712020-12-02 17:36:54 +01002454 assert_equal({one: 1, two: 2, three: 3}, mydict)
2455 mydict = {
Bram Moolenaar2c330432020-04-13 14:41:35 +02002456 one: 1,
2457 two:
2458 2,
2459 three: 3
Bram Moolenaar4fdae992020-04-12 16:38:57 +02002460 }
Bram Moolenaare0de1712020-12-02 17:36:54 +01002461 assert_equal({one: 1, two: 2, three: 3}, mydict)
Bram Moolenaare6085c52020-04-12 20:19:16 +02002462
2463 assert_equal(
2464 ['one', 'two', 'three'],
2465 split('one two three')
2466 )
Bram Moolenaar4fdae992020-04-12 16:38:57 +02002467enddef
2468
Bram Moolenaar7a092242020-04-16 22:10:49 +02002469def Test_vim9_comment()
Bram Moolenaar62aec932022-01-29 21:45:34 +00002470 v9.CheckScriptSuccess([
Bram Moolenaar7a092242020-04-16 22:10:49 +02002471 'vim9script',
2472 '# something',
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01002473 '#something',
2474 '#{something',
Bram Moolenaar7a092242020-04-16 22:10:49 +02002475 ])
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01002476
2477 split Xfile
Bram Moolenaar62aec932022-01-29 21:45:34 +00002478 v9.CheckScriptSuccess([
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01002479 'vim9script',
2480 'edit #something',
2481 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002482 v9.CheckScriptSuccess([
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01002483 'vim9script',
2484 'edit #{something',
2485 ])
2486 close
2487
Bram Moolenaar62aec932022-01-29 21:45:34 +00002488 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02002489 'vim9script',
2490 ':# something',
2491 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002492 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02002493 '# something',
2494 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002495 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02002496 ':# something',
2497 ], 'E488:')
2498
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02002499 { # block start
2500 } # block end
Bram Moolenaar62aec932022-01-29 21:45:34 +00002501 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02002502 '{# comment',
2503 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002504 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02002505 '{',
2506 '}# comment',
2507 ], 'E488:')
2508
2509 echo "yes" # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00002510 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02002511 'echo "yes"# comment',
2512 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002513 v9.CheckScriptSuccess([
Bram Moolenaar7a092242020-04-16 22:10:49 +02002514 'vim9script',
2515 'echo "yes" # something',
2516 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002517 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02002518 'vim9script',
2519 'echo "yes"# something',
2520 ], 'E121:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002521 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02002522 'vim9script',
2523 'echo# something',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01002524 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002525 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02002526 'echo "yes" # something',
2527 ], 'E121:')
2528
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02002529 exe "echo" # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00002530 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02002531 'exe "echo"# comment',
2532 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002533 v9.CheckScriptSuccess([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02002534 'vim9script',
2535 'exe "echo" # something',
2536 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002537 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02002538 'vim9script',
2539 'exe "echo"# something',
2540 ], 'E121:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002541 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02002542 'vim9script',
2543 'exe# something',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01002544 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002545 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02002546 'exe "echo" # something',
2547 ], 'E121:')
2548
Bram Moolenaar62aec932022-01-29 21:45:34 +00002549 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02002550 'try# comment',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002551 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02002552 'catch',
2553 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01002554 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002555 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002556 'vim9script',
2557 'try# comment',
2558 'echo "yes"',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01002559 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002560 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02002561 'try',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002562 ' throw#comment',
2563 'catch',
2564 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01002565 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002566 v9.CheckDefFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002567 'try',
2568 ' throw "yes"#comment',
2569 'catch',
2570 'endtry',
2571 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002572 v9.CheckDefFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002573 'try',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002574 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02002575 'catch# comment',
2576 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01002577 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002578 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002579 'vim9script',
2580 'try',
2581 ' echo "yes"',
2582 'catch# comment',
2583 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01002584 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002585 v9.CheckDefFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002586 'try',
2587 ' echo "yes"',
2588 'catch /pat/# comment',
2589 'endtry',
2590 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002591 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02002592 'try',
2593 'echo "yes"',
2594 'catch',
2595 'endtry# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01002596 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002597 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002598 'vim9script',
2599 'try',
2600 ' echo "yes"',
2601 'catch',
2602 'endtry# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01002603 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002604
Bram Moolenaar62aec932022-01-29 21:45:34 +00002605 v9.CheckScriptSuccess([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002606 'vim9script',
2607 'hi # comment',
2608 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002609 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002610 'vim9script',
2611 'hi# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01002612 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002613 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002614 'vim9script',
2615 'hi Search # comment',
2616 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002617 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002618 'vim9script',
2619 'hi Search# comment',
2620 ], 'E416:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002621 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002622 'vim9script',
2623 'hi link This Search # comment',
2624 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002625 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002626 'vim9script',
2627 'hi link This That# comment',
2628 ], 'E413:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002629 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002630 'vim9script',
2631 'hi clear This # comment',
2632 'hi clear # comment',
2633 ])
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002634 # not tested, because it doesn't give an error but a warning:
2635 # hi clear This# comment',
Bram Moolenaar62aec932022-01-29 21:45:34 +00002636 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002637 'vim9script',
2638 'hi clear# comment',
2639 ], 'E416:')
2640
Bram Moolenaar62aec932022-01-29 21:45:34 +00002641 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002642 'vim9script',
2643 'hi Group term=bold',
2644 'match Group /todo/ # comment',
2645 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002646 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002647 'vim9script',
2648 'hi Group term=bold',
2649 'match Group /todo/# comment',
2650 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002651 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002652 'vim9script',
2653 'match # comment',
2654 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002655 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002656 'vim9script',
2657 'match# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01002658 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002659 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002660 'vim9script',
2661 'match none # comment',
2662 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002663 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002664 'vim9script',
2665 'match none# comment',
2666 ], 'E475:')
2667
Bram Moolenaar62aec932022-01-29 21:45:34 +00002668 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002669 'vim9script',
2670 'menutrans clear # comment',
2671 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002672 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002673 'vim9script',
2674 'menutrans clear# comment text',
2675 ], 'E474:')
2676
Bram Moolenaar62aec932022-01-29 21:45:34 +00002677 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002678 'vim9script',
2679 'syntax clear # comment',
2680 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002681 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002682 'vim9script',
2683 'syntax clear# comment text',
2684 ], 'E28:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002685 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002686 'vim9script',
2687 'syntax keyword Word some',
2688 'syntax clear Word # comment',
2689 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002690 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002691 'vim9script',
2692 'syntax keyword Word some',
2693 'syntax clear Word# comment text',
2694 ], 'E28:')
2695
Bram Moolenaar62aec932022-01-29 21:45:34 +00002696 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002697 'vim9script',
2698 'syntax list # comment',
2699 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002700 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002701 'vim9script',
2702 'syntax list# comment text',
2703 ], 'E28:')
2704
Bram Moolenaar62aec932022-01-29 21:45:34 +00002705 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002706 'vim9script',
2707 'syntax match Word /pat/ oneline # comment',
2708 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002709 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002710 'vim9script',
2711 'syntax match Word /pat/ oneline# comment',
2712 ], 'E475:')
2713
Bram Moolenaar62aec932022-01-29 21:45:34 +00002714 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002715 'vim9script',
2716 'syntax keyword Word word # comm[ent',
2717 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002718 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002719 'vim9script',
2720 'syntax keyword Word word# comm[ent',
2721 ], 'E789:')
2722
Bram Moolenaar62aec932022-01-29 21:45:34 +00002723 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002724 'vim9script',
2725 'syntax match Word /pat/ # comment',
2726 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002727 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002728 'vim9script',
2729 'syntax match Word /pat/# comment',
2730 ], 'E402:')
2731
Bram Moolenaar62aec932022-01-29 21:45:34 +00002732 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002733 'vim9script',
2734 'syntax match Word /pat/ contains=Something # comment',
2735 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002736 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002737 'vim9script',
2738 'syntax match Word /pat/ contains=Something# comment',
2739 ], 'E475:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002740 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002741 'vim9script',
2742 'syntax match Word /pat/ contains= # comment',
2743 ], 'E406:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002744 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002745 'vim9script',
2746 'syntax match Word /pat/ contains=# comment',
2747 ], 'E475:')
2748
Bram Moolenaar62aec932022-01-29 21:45:34 +00002749 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002750 'vim9script',
2751 'syntax region Word start=/pat/ end=/pat/ # comment',
2752 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002753 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002754 'vim9script',
2755 'syntax region Word start=/pat/ end=/pat/# comment',
Bram Moolenaard032f342020-07-18 18:13:02 +02002756 ], 'E402:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02002757
Bram Moolenaar62aec932022-01-29 21:45:34 +00002758 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002759 'vim9script',
2760 'syntax sync # comment',
2761 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002762 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002763 'vim9script',
2764 'syntax sync# comment',
2765 ], 'E404:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002766 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002767 'vim9script',
2768 'syntax sync ccomment # comment',
2769 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002770 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002771 'vim9script',
2772 'syntax sync ccomment# comment',
2773 ], 'E404:')
2774
Bram Moolenaar62aec932022-01-29 21:45:34 +00002775 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002776 'vim9script',
2777 'syntax cluster Some contains=Word # comment',
2778 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002779 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02002780 'vim9script',
2781 'syntax cluster Some contains=Word# comment',
2782 ], 'E475:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002783
Bram Moolenaar62aec932022-01-29 21:45:34 +00002784 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002785 'vim9script',
2786 'command Echo echo # comment',
2787 'command Echo # comment',
Bram Moolenaar2d870f82020-12-05 13:41:01 +01002788 'delcommand Echo',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002789 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002790 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002791 'vim9script',
2792 'command Echo echo# comment',
2793 'Echo',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01002794 ], 'E1144:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01002795 delcommand Echo
Bram Moolenaar70249ee2020-12-10 21:01:30 +01002796
2797 var curdir = getcwd()
Bram Moolenaar62aec932022-01-29 21:45:34 +00002798 v9.CheckScriptSuccess([
Bram Moolenaar70249ee2020-12-10 21:01:30 +01002799 'command Echo cd " comment',
2800 'Echo',
2801 'delcommand Echo',
2802 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002803 v9.CheckScriptSuccess([
Bram Moolenaar090728a2020-12-20 15:43:31 +01002804 'vim9script',
Bram Moolenaar70249ee2020-12-10 21:01:30 +01002805 'command Echo cd # comment',
2806 'Echo',
2807 'delcommand Echo',
2808 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002809 v9.CheckScriptFailure([
Bram Moolenaar70249ee2020-12-10 21:01:30 +01002810 'vim9script',
2811 'command Echo cd " comment',
2812 'Echo',
2813 ], 'E344:')
2814 delcommand Echo
2815 chdir(curdir)
2816
Bram Moolenaar62aec932022-01-29 21:45:34 +00002817 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002818 'vim9script',
2819 'command Echo# comment',
2820 ], 'E182:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002821 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002822 'vim9script',
2823 'command Echo echo',
2824 'command Echo# comment',
2825 ], 'E182:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01002826 delcommand Echo
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002827
Bram Moolenaar62aec932022-01-29 21:45:34 +00002828 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002829 'vim9script',
2830 'function # comment',
2831 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002832 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002833 'vim9script',
Bram Moolenaar98981072020-07-29 14:40:25 +02002834 'function " comment',
2835 ], 'E129:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002836 v9.CheckScriptFailure([
Bram Moolenaar98981072020-07-29 14:40:25 +02002837 'vim9script',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002838 'function# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01002839 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002840 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002841 'vim9script',
Bram Moolenaar62aec932022-01-29 21:45:34 +00002842 'import "./vim9.vim" as v9',
2843 'function v9.CheckScriptSuccess # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002844 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002845 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002846 'vim9script',
Bram Moolenaar62aec932022-01-29 21:45:34 +00002847 'import "./vim9.vim" as v9',
2848 'function v9.CheckScriptSuccess# comment',
2849 ], 'E1048: Item not found in script: CheckScriptSuccess#')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002850
Bram Moolenaar62aec932022-01-29 21:45:34 +00002851 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002852 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002853 'func g:DeleteMeA()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002854 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002855 'delfunction g:DeleteMeA # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002856 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002857 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002858 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002859 'func g:DeleteMeB()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002860 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002861 'delfunction g:DeleteMeB# comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002862 ], 'E488:')
2863
Bram Moolenaar62aec932022-01-29 21:45:34 +00002864 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002865 'vim9script',
2866 'call execute("ls") # comment',
2867 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002868 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002869 'vim9script',
2870 'call execute("ls")# comment',
2871 ], 'E488:')
Bram Moolenaare7e48382020-07-22 18:17:08 +02002872
Bram Moolenaar62aec932022-01-29 21:45:34 +00002873 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02002874 'def Test() " comment',
2875 'enddef',
2876 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002877 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02002878 'vim9script',
2879 'def Test() " comment',
2880 'enddef',
2881 ], 'E488:')
2882
Bram Moolenaar62aec932022-01-29 21:45:34 +00002883 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02002884 'func Test() " comment',
2885 'endfunc',
Bram Moolenaar2d870f82020-12-05 13:41:01 +01002886 'delfunc Test',
Bram Moolenaare7e48382020-07-22 18:17:08 +02002887 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002888 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02002889 'vim9script',
2890 'func Test() " comment',
2891 'endfunc',
Bram Moolenaar98981072020-07-29 14:40:25 +02002892 ])
Bram Moolenaare7e48382020-07-22 18:17:08 +02002893
Bram Moolenaar62aec932022-01-29 21:45:34 +00002894 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02002895 'def Test() # comment',
2896 'enddef',
2897 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00002898 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02002899 'func Test() # comment',
2900 'endfunc',
2901 ], 'E488:')
Bram Moolenaar0f37e352021-06-02 15:28:15 +02002902
2903 var lines =<< trim END
2904 vim9script
2905 syn region Text
2906 \ start='foo'
2907 #\ comment
2908 \ end='bar'
Bram Moolenaar5072b472021-06-03 21:56:10 +02002909 syn region Text start='foo'
2910 #\ comment
2911 \ end='bar'
Bram Moolenaar0f37e352021-06-02 15:28:15 +02002912 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002913 v9.CheckScriptSuccess(lines)
Bram Moolenaar0f37e352021-06-02 15:28:15 +02002914
2915 lines =<< trim END
2916 vim9script
2917 syn region Text
2918 \ start='foo'
2919 "\ comment
2920 \ end='bar'
2921 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002922 v9.CheckScriptFailure(lines, 'E399:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002923enddef
2924
2925def Test_vim9_comment_gui()
2926 CheckCanRunGui
2927
Bram Moolenaar62aec932022-01-29 21:45:34 +00002928 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002929 'vim9script',
2930 'gui#comment'
Bram Moolenaarf8103f22020-12-25 17:36:27 +01002931 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002932 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002933 'vim9script',
2934 'gui -f#comment'
Bram Moolenaarb8bd2e62021-08-21 17:13:14 +02002935 ], 'E194:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02002936enddef
2937
Bram Moolenaara26b9702020-04-18 19:53:28 +02002938def Test_vim9_comment_not_compiled()
Bram Moolenaar67979662020-06-20 22:50:47 +02002939 au TabEnter *.vim g:entered = 1
2940 au TabEnter *.x g:entered = 2
Bram Moolenaara26b9702020-04-18 19:53:28 +02002941
2942 edit test.vim
2943 doautocmd TabEnter #comment
2944 assert_equal(1, g:entered)
2945
2946 doautocmd TabEnter f.x
2947 assert_equal(2, g:entered)
2948
2949 g:entered = 0
2950 doautocmd TabEnter f.x #comment
2951 assert_equal(2, g:entered)
2952
2953 assert_fails('doautocmd Syntax#comment', 'E216:')
2954
2955 au! TabEnter
2956 unlet g:entered
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02002957
Bram Moolenaar62aec932022-01-29 21:45:34 +00002958 v9.CheckScriptSuccess([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02002959 'vim9script',
Bram Moolenaar67979662020-06-20 22:50:47 +02002960 'g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02002961 'b:var = 456',
2962 'w:var = 777',
2963 't:var = 888',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02002964 'unlet g:var w:var # something',
2965 ])
2966
Bram Moolenaar62aec932022-01-29 21:45:34 +00002967 v9.CheckScriptFailure([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02002968 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002969 'let var = 123',
2970 ], 'E1126: Cannot use :let in Vim9 script')
2971
Bram Moolenaar62aec932022-01-29 21:45:34 +00002972 v9.CheckScriptFailure([
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002973 'vim9script',
2974 'var g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02002975 ], 'E1016: Cannot declare a global variable:')
2976
Bram Moolenaar62aec932022-01-29 21:45:34 +00002977 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02002978 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002979 'var b:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02002980 ], 'E1016: Cannot declare a buffer variable:')
2981
Bram Moolenaar62aec932022-01-29 21:45:34 +00002982 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02002983 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002984 'var w:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02002985 ], 'E1016: Cannot declare a window variable:')
2986
Bram Moolenaar62aec932022-01-29 21:45:34 +00002987 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02002988 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002989 'var t:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02002990 ], 'E1016: Cannot declare a tab variable:')
2991
Bram Moolenaar62aec932022-01-29 21:45:34 +00002992 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02002993 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002994 'var v:version = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02002995 ], 'E1016: Cannot declare a v: variable:')
2996
Bram Moolenaar62aec932022-01-29 21:45:34 +00002997 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02002998 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002999 'var $VARIABLE = "text"',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003000 ], 'E1016: Cannot declare an environment variable:')
Bram Moolenaar67979662020-06-20 22:50:47 +02003001
Bram Moolenaar62aec932022-01-29 21:45:34 +00003002 v9.CheckScriptFailure([
Bram Moolenaar67979662020-06-20 22:50:47 +02003003 'vim9script',
3004 'g:var = 123',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003005 'unlet g:var# comment1',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003006 ], 'E108:')
3007
Bram Moolenaar62aec932022-01-29 21:45:34 +00003008 v9.CheckScriptFailure([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003009 'let g:var = 123',
3010 'unlet g:var # something',
3011 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003012
Bram Moolenaar62aec932022-01-29 21:45:34 +00003013 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003014 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003015 'if 1 # comment2',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003016 ' echo "yes"',
3017 'elseif 2 #comment',
3018 ' echo "no"',
3019 'endif',
3020 ])
3021
Bram Moolenaar62aec932022-01-29 21:45:34 +00003022 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003023 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003024 'if 1# comment3',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003025 ' echo "yes"',
3026 'endif',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003027 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003028
Bram Moolenaar62aec932022-01-29 21:45:34 +00003029 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003030 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003031 'if 0 # comment4',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003032 ' echo "yes"',
3033 'elseif 2#comment',
3034 ' echo "no"',
3035 'endif',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003036 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003037
Bram Moolenaar62aec932022-01-29 21:45:34 +00003038 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003039 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003040 'var v = 1 # comment5',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003041 ])
3042
Bram Moolenaar62aec932022-01-29 21:45:34 +00003043 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003044 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003045 'var v = 1# comment6',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003046 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003047
Bram Moolenaar62aec932022-01-29 21:45:34 +00003048 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003049 'vim9script',
3050 'new'
Bram Moolenaard2c61702020-09-06 15:58:36 +02003051 'setline(1, ["# define pat", "last"])',
Bram Moolenaardf069ee2020-06-22 23:02:51 +02003052 ':$',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003053 'dsearch /pat/ #comment',
3054 'bwipe!',
3055 ])
3056
Bram Moolenaar62aec932022-01-29 21:45:34 +00003057 v9.CheckScriptFailure([
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003058 'vim9script',
3059 'new'
Bram Moolenaard2c61702020-09-06 15:58:36 +02003060 'setline(1, ["# define pat", "last"])',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003061 ':$',
3062 'dsearch /pat/#comment',
3063 'bwipe!',
3064 ], 'E488:')
3065
Bram Moolenaar62aec932022-01-29 21:45:34 +00003066 v9.CheckScriptFailure([
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003067 'vim9script',
3068 'func! SomeFunc()',
3069 ], 'E477:')
Bram Moolenaara26b9702020-04-18 19:53:28 +02003070enddef
3071
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003072def Test_finish()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003073 var lines =<< trim END
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003074 vim9script
Bram Moolenaar67979662020-06-20 22:50:47 +02003075 g:res = 'one'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003076 if v:false | finish | endif
Bram Moolenaar67979662020-06-20 22:50:47 +02003077 g:res = 'two'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003078 finish
Bram Moolenaar67979662020-06-20 22:50:47 +02003079 g:res = 'three'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003080 END
3081 writefile(lines, 'Xfinished')
3082 source Xfinished
3083 assert_equal('two', g:res)
3084
3085 unlet g:res
3086 delete('Xfinished')
3087enddef
3088
Bram Moolenaara5d00772020-05-14 23:20:55 +02003089def Test_forward_declaration()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003090 var lines =<< trim END
Bram Moolenaara5d00772020-05-14 23:20:55 +02003091 vim9script
Bram Moolenaara5d00772020-05-14 23:20:55 +02003092 def GetValue(): string
3093 return theVal
3094 enddef
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003095 var theVal = 'something'
Bram Moolenaar822ba242020-05-24 23:00:18 +02003096 g:initVal = GetValue()
Bram Moolenaara5d00772020-05-14 23:20:55 +02003097 theVal = 'else'
3098 g:laterVal = GetValue()
3099 END
3100 writefile(lines, 'Xforward')
3101 source Xforward
3102 assert_equal('something', g:initVal)
3103 assert_equal('else', g:laterVal)
3104
3105 unlet g:initVal
3106 unlet g:laterVal
3107 delete('Xforward')
3108enddef
3109
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003110def Test_declare_script_var_in_func()
Bram Moolenaare535db82021-03-31 21:07:24 +02003111 var lines =<< trim END
3112 vim9script
3113 func Declare()
3114 let s:local = 123
3115 endfunc
3116 Declare()
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003117 END
3118 v9.CheckScriptFailure(lines, 'E1269:')
3119enddef
3120
3121def Test_lock_script_var()
3122 var lines =<< trim END
3123 vim9script
3124 var local = 123
Bram Moolenaare535db82021-03-31 21:07:24 +02003125 assert_equal(123, local)
3126
3127 var error: string
3128 try
3129 local = 'asdf'
3130 catch
3131 error = v:exception
3132 endtry
3133 assert_match('E1012: Type mismatch; expected number but got string', error)
3134
3135 lockvar local
3136 try
3137 local = 999
3138 catch
3139 error = v:exception
3140 endtry
3141 assert_match('E741: Value is locked: local', error)
3142 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003143 v9.CheckScriptSuccess(lines)
Bram Moolenaare535db82021-03-31 21:07:24 +02003144enddef
3145
3146
Bram Moolenaar7d699702020-08-14 20:52:28 +02003147func Test_vim9script_not_global()
3148 " check that items defined in Vim9 script are script-local, not global
3149 let vim9lines =<< trim END
3150 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003151 var name = 'local'
Bram Moolenaar7d699702020-08-14 20:52:28 +02003152 func TheFunc()
3153 echo 'local'
3154 endfunc
3155 def DefFunc()
3156 echo 'local'
3157 enddef
3158 END
3159 call writefile(vim9lines, 'Xvim9script.vim')
3160 source Xvim9script.vim
3161 try
3162 echo g:var
3163 assert_report('did not fail')
3164 catch /E121:/
3165 " caught
3166 endtry
3167 try
3168 call TheFunc()
3169 assert_report('did not fail')
3170 catch /E117:/
3171 " caught
3172 endtry
3173 try
3174 call DefFunc()
3175 assert_report('did not fail')
3176 catch /E117:/
3177 " caught
3178 endtry
3179
Bram Moolenaar25859dd2020-08-30 12:54:53 +02003180 call delete('Xvim9script.vim')
Bram Moolenaar7d699702020-08-14 20:52:28 +02003181endfunc
3182
Bram Moolenaareeb27bf2020-07-04 17:39:10 +02003183def Test_vim9_copen()
3184 # this was giving an error for setting w:quickfix_title
3185 copen
3186 quit
3187enddef
3188
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02003189def Test_script_var_in_autocmd()
3190 # using a script variable from an autocommand, defined in a :def function in a
3191 # legacy Vim script, cannot check the variable type.
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003192 var lines =<< trim END
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02003193 let s:counter = 1
3194 def s:Func()
3195 au! CursorHold
3196 au CursorHold * s:counter += 1
3197 enddef
3198 call s:Func()
3199 doau CursorHold
3200 call assert_equal(2, s:counter)
3201 au! CursorHold
3202 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003203 v9.CheckScriptSuccess(lines)
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02003204enddef
3205
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003206def Test_error_in_autoload_script()
3207 var save_rtp = &rtp
3208 var dir = getcwd() .. '/Xruntime'
3209 &rtp = dir
3210 mkdir(dir .. '/autoload', 'p')
3211
3212 var lines =<< trim END
3213 vim9script noclear
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003214 export def Autoloaded()
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003215 enddef
3216 def Broken()
3217 var x: any = ''
3218 eval x != 0
3219 enddef
3220 Broken()
3221 END
3222 writefile(lines, dir .. '/autoload/script.vim')
3223
3224 lines =<< trim END
3225 vim9script
3226 def CallAutoloaded()
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003227 script#Autoloaded()
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003228 enddef
3229
3230 function Legacy()
3231 try
3232 call s:CallAutoloaded()
3233 catch
3234 call assert_match('E1030: Using a String as a Number', v:exception)
3235 endtry
3236 endfunction
3237
3238 Legacy()
3239 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003240 v9.CheckScriptSuccess(lines)
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003241
3242 &rtp = save_rtp
3243 delete(dir, 'rf')
3244enddef
3245
Bram Moolenaare3d46852020-08-29 13:39:17 +02003246def Test_invalid_sid()
3247 assert_fails('func <SNR>1234_func', 'E123:')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02003248
Bram Moolenaar62aec932022-01-29 21:45:34 +00003249 if g:RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
Bram Moolenaard2c61702020-09-06 15:58:36 +02003250 assert_equal([], readfile('Xdidit'))
Bram Moolenaare3d46852020-08-29 13:39:17 +02003251 endif
3252 delete('Xdidit')
3253enddef
3254
Bram Moolenaar9ec70262020-12-09 17:16:59 +01003255def Test_restoring_cpo()
3256 writefile(['vim9script', 'set nocp'], 'Xsourced')
3257 writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003258 if g:RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
Bram Moolenaar9ec70262020-12-09 17:16:59 +01003259 assert_equal(['done'], readfile('Xdone'))
3260 endif
3261 delete('Xsourced')
3262 delete('Xclose')
Bram Moolenaar090728a2020-12-20 15:43:31 +01003263 delete('Xdone')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003264
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003265 writefile(['vim9script', 'g:cpoval = &cpo'], 'XanotherScript')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003266 set cpo=aABceFsMny>
3267 edit XanotherScript
3268 so %
3269 assert_equal('aABceFsMny>', &cpo)
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003270 assert_equal('aABceFs', g:cpoval)
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003271 :1del
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003272 setline(1, 'let g:cpoval = &cpo')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003273 w
3274 so %
3275 assert_equal('aABceFsMny>', &cpo)
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003276 assert_equal('aABceFsMny>', g:cpoval)
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003277
3278 delete('XanotherScript')
3279 set cpo&vim
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003280 unlet g:cpoval
3281
3282 if has('unix')
3283 # 'cpo' is not restored in main vimrc
3284 var save_HOME = $HOME
3285 $HOME = getcwd() .. '/Xhome'
3286 mkdir('Xhome')
3287 var lines =<< trim END
3288 vim9script
3289 writefile(['before: ' .. &cpo], 'Xresult')
3290 set cpo+=M
3291 writefile(['after: ' .. &cpo], 'Xresult', 'a')
3292 END
3293 writefile(lines, 'Xhome/.vimrc')
3294
3295 lines =<< trim END
3296 call writefile(['later: ' .. &cpo], 'Xresult', 'a')
3297 END
3298 writefile(lines, 'Xlegacy')
3299
3300 lines =<< trim END
3301 vim9script
3302 call writefile(['vim9: ' .. &cpo], 'Xresult', 'a')
3303 qa
3304 END
3305 writefile(lines, 'Xvim9')
3306
Bram Moolenaar62aec932022-01-29 21:45:34 +00003307 var cmd = g:GetVimCommand() .. " -S Xlegacy -S Xvim9"
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003308 cmd = substitute(cmd, '-u NONE', '', '')
3309 exe "silent !" .. cmd
3310
3311 assert_equal([
3312 'before: aABceFs',
3313 'after: aABceFsM',
3314 'later: aABceFsM',
3315 'vim9: aABceFs'], readfile('Xresult'))
3316
3317 $HOME = save_HOME
3318 delete('Xhome', 'rf')
3319 delete('Xlegacy')
3320 delete('Xvim9')
3321 delete('Xresult')
3322 endif
Bram Moolenaar9ec70262020-12-09 17:16:59 +01003323enddef
3324
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01003325" Use :function so we can use Check commands
3326func Test_no_redraw_when_restoring_cpo()
Bram Moolenaar37294bd2021-03-10 13:40:08 +01003327 CheckScreendump
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01003328 CheckFeature timers
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00003329 call Run_test_no_redraw_when_restoring_cpo()
3330endfunc
Bram Moolenaar37294bd2021-03-10 13:40:08 +01003331
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00003332def Run_test_no_redraw_when_restoring_cpo()
3333 var lines =<< trim END
Bram Moolenaar37294bd2021-03-10 13:40:08 +01003334 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003335 export def Func()
Bram Moolenaar37294bd2021-03-10 13:40:08 +01003336 enddef
3337 END
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00003338 mkdir('Xdir/autoload', 'p')
3339 writefile(lines, 'Xdir/autoload/script.vim')
Bram Moolenaar37294bd2021-03-10 13:40:08 +01003340
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00003341 lines =<< trim END
Bram Moolenaar37294bd2021-03-10 13:40:08 +01003342 vim9script
3343 set cpo+=M
3344 exe 'set rtp^=' .. getcwd() .. '/Xdir'
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003345 au CmdlineEnter : ++once timer_start(0, (_) => script#Func())
Bram Moolenaar37294bd2021-03-10 13:40:08 +01003346 setline(1, 'some text')
3347 END
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00003348 writefile(lines, 'XTest_redraw_cpo')
3349 var buf = g:RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
3350 term_sendkeys(buf, "V:")
3351 g:VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
Bram Moolenaar37294bd2021-03-10 13:40:08 +01003352
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00003353 # clean up
3354 term_sendkeys(buf, "\<Esc>u")
3355 g:StopVimInTerminal(buf)
3356 delete('XTest_redraw_cpo')
3357 delete('Xdir', 'rf')
3358enddef
3359
3360func Test_reject_declaration()
3361 CheckScreendump
3362 call Run_test_reject_declaration()
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01003363endfunc
Bram Moolenaar37294bd2021-03-10 13:40:08 +01003364
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00003365def Run_test_reject_declaration()
3366 var buf = g:RunVimInTerminal('', {'rows': 6})
3367 term_sendkeys(buf, ":vim9cmd var x: number\<CR>")
Bram Moolenaar330a3882022-03-05 11:05:57 +00003368 g:VerifyScreenDump(buf, 'Test_vim9_reject_declaration_1', {})
3369 term_sendkeys(buf, ":\<CR>")
3370 term_sendkeys(buf, ":vim9cmd g:foo = 123 | echo g:foo\<CR>")
3371 g:VerifyScreenDump(buf, 'Test_vim9_reject_declaration_2', {})
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00003372
3373 # clean up
3374 g:StopVimInTerminal(buf)
3375enddef
Bram Moolenaar9ec70262020-12-09 17:16:59 +01003376
Bram Moolenaar204852a2022-03-05 12:56:44 +00003377def Test_minimal_command_name_length()
3378 var names = [
3379 'cons',
3380 'brea',
3381 'cat',
3382 'catc',
3383 'con',
3384 'el',
3385 'els',
3386 'elsei',
3387 'endfo',
3388 'en',
3389 'end',
3390 'endi',
3391 'endw',
3392 'endt',
3393 'endtr',
3394 'fina',
3395 'finall',
3396 'th',
3397 'thr',
3398 'thro',
3399 'wh',
3400 'whi',
3401 'whil',
3402 ]
3403 for name in names
3404 v9.CheckDefAndScriptFailure([name .. ' '], 'E1065:')
3405 endfor
3406enddef
3407
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02003408def Test_unset_any_variable()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003409 var lines =<< trim END
3410 var name: any
3411 assert_equal(0, name)
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02003412 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003413 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02003414enddef
3415
Bram Moolenaar7e9210e2020-09-25 23:12:51 +02003416func Test_define_func_at_command_line()
Bram Moolenaar58dbef32020-09-25 22:13:05 +02003417 CheckRunVimInTerminal
3418
Bram Moolenaar7e9210e2020-09-25 23:12:51 +02003419 " call indirectly to avoid compilation error for missing functions
3420 call Run_Test_define_func_at_command_line()
3421endfunc
3422
3423def Run_Test_define_func_at_command_line()
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02003424 # run in a separate Vim instance to avoid the script context
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003425 var lines =<< trim END
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02003426 func CheckAndQuit()
3427 call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
3428 call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
3429 endfunc
3430 END
3431 writefile([''], 'Xdidcmd')
3432 writefile(lines, 'XcallFunc')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003433 var buf = g:RunVimInTerminal('-S XcallFunc', {rows: 6})
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02003434 # define Afunc() on the command line
3435 term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
3436 term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00003437 g:WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02003438
Bram Moolenaar62aec932022-01-29 21:45:34 +00003439 call g:StopVimInTerminal(buf)
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02003440 delete('XcallFunc')
3441 delete('Xdidcmd')
3442enddef
3443
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02003444def Test_script_var_scope()
3445 var lines =<< trim END
3446 vim9script
3447 if true
3448 if true
3449 var one = 'one'
3450 echo one
3451 endif
3452 echo one
3453 endif
3454 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003455 v9.CheckScriptFailure(lines, 'E121:', 7)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02003456
3457 lines =<< trim END
3458 vim9script
3459 if true
3460 if false
3461 var one = 'one'
3462 echo one
3463 else
3464 var one = 'one'
3465 echo one
3466 endif
3467 echo one
3468 endif
3469 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003470 v9.CheckScriptFailure(lines, 'E121:', 10)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02003471
3472 lines =<< trim END
3473 vim9script
3474 while true
3475 var one = 'one'
3476 echo one
3477 break
3478 endwhile
3479 echo one
3480 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003481 v9.CheckScriptFailure(lines, 'E121:', 7)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02003482
3483 lines =<< trim END
3484 vim9script
3485 for i in range(1)
3486 var one = 'one'
3487 echo one
3488 endfor
3489 echo one
3490 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003491 v9.CheckScriptFailure(lines, 'E121:', 6)
Bram Moolenaar9becdf22020-10-10 21:33:48 +02003492
3493 lines =<< trim END
3494 vim9script
3495 {
3496 var one = 'one'
3497 assert_equal('one', one)
3498 }
3499 assert_false(exists('one'))
3500 assert_false(exists('s:one'))
3501 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003502 v9.CheckScriptSuccess(lines)
Bram Moolenaar9becdf22020-10-10 21:33:48 +02003503
3504 lines =<< trim END
3505 vim9script
3506 {
3507 var one = 'one'
3508 echo one
3509 }
3510 echo one
3511 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003512 v9.CheckScriptFailure(lines, 'E121:', 6)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02003513enddef
3514
Bram Moolenaar352134b2020-10-17 22:04:08 +02003515def Test_catch_exception_in_callback()
3516 var lines =<< trim END
3517 vim9script
Bram Moolenaar2a389082021-04-09 20:24:31 +02003518 def Callback(...l: list<any>)
Bram Moolenaar352134b2020-10-17 22:04:08 +02003519 try
3520 var x: string
3521 var y: string
3522 # this error should be caught with CHECKLEN
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +00003523 var sl = ['']
3524 [x, y] = sl
Bram Moolenaar352134b2020-10-17 22:04:08 +02003525 catch
3526 g:caught = 'yes'
3527 endtry
3528 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01003529 popup_menu('popup', {callback: Callback})
Bram Moolenaar352134b2020-10-17 22:04:08 +02003530 feedkeys("\r", 'xt')
3531 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003532 v9.CheckScriptSuccess(lines)
Bram Moolenaar352134b2020-10-17 22:04:08 +02003533
3534 unlet g:caught
3535enddef
3536
Bram Moolenaar631e8f92020-11-04 15:07:16 +01003537def Test_no_unknown_error_after_error()
3538 if !has('unix') || !has('job')
3539 throw 'Skipped: not unix of missing +job feature'
3540 endif
Bram Moolenaarb16ff292021-09-26 20:14:39 +01003541 # FIXME: this check should not be needed
3542 if has('win32')
3543 throw 'Skipped: does not work on MS-Windows'
3544 endif
Bram Moolenaar631e8f92020-11-04 15:07:16 +01003545 var lines =<< trim END
3546 vim9script
3547 var source: list<number>
Bram Moolenaar2a389082021-04-09 20:24:31 +02003548 def Out_cb(...l: list<any>)
Bram Moolenaar631e8f92020-11-04 15:07:16 +01003549 eval [][0]
3550 enddef
Bram Moolenaar2a389082021-04-09 20:24:31 +02003551 def Exit_cb(...l: list<any>)
Bram Moolenaar631e8f92020-11-04 15:07:16 +01003552 sleep 1m
3553 source += l
3554 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01003555 var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
Bram Moolenaar6f17a3f2020-12-21 18:11:24 +01003556 while job_status(myjob) == 'run'
3557 sleep 10m
3558 endwhile
Bram Moolenaar206c2a62021-01-31 14:04:44 +01003559 # wait for Exit_cb() to be called
Bram Moolenaarfe95b942021-04-10 20:52:43 +02003560 sleep 200m
Bram Moolenaar631e8f92020-11-04 15:07:16 +01003561 END
3562 writefile(lines, 'Xdef')
3563 assert_fails('so Xdef', ['E684:', 'E1012:'])
3564 delete('Xdef')
3565enddef
3566
Bram Moolenaar4324d872020-12-01 20:12:24 +01003567def InvokeNormal()
3568 exe "norm! :m+1\r"
3569enddef
3570
3571def Test_invoke_normal_in_visual_mode()
3572 xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
3573 new
3574 setline(1, ['aaa', 'bbb'])
3575 feedkeys("V\<F3>", 'xt')
3576 assert_equal(['bbb', 'aaa'], getline(1, 2))
3577 xunmap <F3>
3578enddef
3579
Bram Moolenaarb5b94802020-12-13 17:50:20 +01003580def Test_white_space_after_command()
3581 var lines =<< trim END
3582 exit_cb: Func})
3583 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003584 v9.CheckDefAndScriptFailure(lines, 'E1144:', 1)
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003585
3586 lines =<< trim END
3587 e#
3588 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003589 v9.CheckDefAndScriptFailure(lines, 'E1144:', 1)
Bram Moolenaarb5b94802020-12-13 17:50:20 +01003590enddef
3591
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01003592def Test_script_var_gone_when_sourced_twice()
3593 var lines =<< trim END
3594 vim9script
3595 if exists('g:guard')
3596 finish
3597 endif
3598 g:guard = 1
3599 var name = 'thename'
3600 def g:GetName(): string
3601 return name
3602 enddef
3603 def g:SetName(arg: string)
3604 name = arg
3605 enddef
3606 END
3607 writefile(lines, 'XscriptTwice.vim')
3608 so XscriptTwice.vim
3609 assert_equal('thename', g:GetName())
3610 g:SetName('newname')
3611 assert_equal('newname', g:GetName())
3612 so XscriptTwice.vim
3613 assert_fails('call g:GetName()', 'E1149:')
3614 assert_fails('call g:SetName("x")', 'E1149:')
3615
3616 delfunc g:GetName
3617 delfunc g:SetName
3618 delete('XscriptTwice.vim')
3619 unlet g:guard
3620enddef
3621
Bram Moolenaar10b94212021-02-19 21:42:57 +01003622def Test_unsupported_commands()
3623 var lines =<< trim END
3624 ka
3625 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00003626 v9.CheckDefAndScriptFailure(lines, ['E476:', 'E492:'])
Bram Moolenaar10b94212021-02-19 21:42:57 +01003627
3628 lines =<< trim END
Bram Moolenaarada1d872021-02-20 08:16:51 +01003629 :1ka
3630 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00003631 v9.CheckDefAndScriptFailure(lines, ['E476:', 'E492:'])
Bram Moolenaarada1d872021-02-20 08:16:51 +01003632
3633 lines =<< trim END
Bram Moolenaar10b94212021-02-19 21:42:57 +01003634 t
3635 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00003636 v9.CheckDefAndScriptFailure(lines, 'E1100:')
Bram Moolenaar10b94212021-02-19 21:42:57 +01003637
3638 lines =<< trim END
3639 x
3640 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00003641 v9.CheckDefAndScriptFailure(lines, 'E1100:')
Bram Moolenaar10b94212021-02-19 21:42:57 +01003642
3643 lines =<< trim END
3644 xit
3645 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00003646 v9.CheckDefAndScriptFailure(lines, 'E1100:')
3647
3648 lines =<< trim END
3649 Print
3650 END
3651 v9.CheckDefAndScriptFailure(lines, ['E476: Invalid command: Print', 'E492: Not an editor command: Print'])
3652
3653 lines =<< trim END
3654 mode 4
3655 END
3656 v9.CheckDefAndScriptFailure(lines, ['E476: Invalid command: mode 4', 'E492: Not an editor command: mode 4'])
Bram Moolenaar10b94212021-02-19 21:42:57 +01003657enddef
3658
Bram Moolenaarc70fe462021-04-17 17:59:19 +02003659def Test_mapping_line_number()
3660 var lines =<< trim END
3661 vim9script
3662 def g:FuncA()
3663 # Some comment
3664 FuncB(0)
3665 enddef
3666 # Some comment
3667 def FuncB(
3668 # Some comment
3669 n: number
3670 )
3671 exe 'nno '
3672 # Some comment
3673 .. '<F3> a'
3674 .. 'b'
3675 .. 'c'
3676 enddef
3677 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003678 v9.CheckScriptSuccess(lines)
Bram Moolenaarc70fe462021-04-17 17:59:19 +02003679 var res = execute('verbose nmap <F3>')
3680 assert_match('No mapping found', res)
3681
3682 g:FuncA()
3683 res = execute('verbose nmap <F3>')
3684 assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
3685
3686 nunmap <F3>
3687 delfunc g:FuncA
3688enddef
3689
Bram Moolenaardeb108b2021-07-08 17:35:36 +02003690def Test_option_set()
3691 # legacy script allows for white space
3692 var lines =<< trim END
3693 set foldlevel =11
3694 call assert_equal(11, &foldlevel)
3695 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003696 v9.CheckScriptSuccess(lines)
Bram Moolenaardeb108b2021-07-08 17:35:36 +02003697
3698 set foldlevel
3699 set foldlevel=12
3700 assert_equal(12, &foldlevel)
3701 set foldlevel+=2
3702 assert_equal(14, &foldlevel)
3703 set foldlevel-=3
3704 assert_equal(11, &foldlevel)
3705
3706 lines =<< trim END
3707 set foldlevel =1
3708 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003709 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02003710
3711 lines =<< trim END
3712 set foldlevel +=1
3713 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003714 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02003715
3716 lines =<< trim END
3717 set foldlevel ^=1
3718 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003719 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02003720
3721 lines =<< trim END
3722 set foldlevel -=1
3723 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003724 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02003725
3726 set foldlevel&
3727enddef
3728
Bram Moolenaar208f0b42021-06-20 12:40:08 +02003729def Test_option_modifier()
Bram Moolenaar1594f312021-07-08 16:40:13 +02003730 # legacy script allows for white space
Bram Moolenaar208f0b42021-06-20 12:40:08 +02003731 var lines =<< trim END
3732 set hlsearch & hlsearch !
3733 call assert_equal(1, &hlsearch)
3734 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003735 v9.CheckScriptSuccess(lines)
Bram Moolenaar208f0b42021-06-20 12:40:08 +02003736
Bram Moolenaar1594f312021-07-08 16:40:13 +02003737 set hlsearch
3738 set hlsearch!
3739 assert_equal(false, &hlsearch)
3740
3741 set hlsearch
3742 set hlsearch&
3743 assert_equal(false, &hlsearch)
Bram Moolenaar208f0b42021-06-20 12:40:08 +02003744
3745 lines =<< trim END
Bram Moolenaar1594f312021-07-08 16:40:13 +02003746 set hlsearch &
Bram Moolenaar208f0b42021-06-20 12:40:08 +02003747 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003748 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &')
Bram Moolenaar1594f312021-07-08 16:40:13 +02003749
3750 lines =<< trim END
3751 set hlsearch !
3752 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003753 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !')
Bram Moolenaar1594f312021-07-08 16:40:13 +02003754
3755 set hlsearch&
Bram Moolenaar208f0b42021-06-20 12:40:08 +02003756enddef
3757
Bram Moolenaarc03fe662021-07-11 16:52:45 +02003758" This must be called last, it may cause following :def functions to fail
3759def Test_xxx_echoerr_line_number()
3760 var lines =<< trim END
3761 echoerr 'some'
3762 .. ' error'
3763 .. ' continued'
3764 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003765 v9.CheckDefExecAndScriptFailure(lines, 'some error continued', 1)
Bram Moolenaarc03fe662021-07-11 16:52:45 +02003766enddef
3767
Bram Moolenaar9537e372021-12-10 21:05:53 +00003768func Test_debug_with_lambda()
Bram Moolenaar9fffef92021-12-10 16:55:58 +00003769 CheckRunVimInTerminal
3770
Bram Moolenaar9537e372021-12-10 21:05:53 +00003771 " call indirectly to avoid compilation error for missing functions
3772 call Run_Test_debug_with_lambda()
3773endfunc
3774
3775def Run_Test_debug_with_lambda()
Bram Moolenaar9fffef92021-12-10 16:55:58 +00003776 var lines =<< trim END
3777 vim9script
3778 def Func()
3779 var n = 0
3780 echo [0]->filter((_, v) => v == n)
3781 enddef
3782 breakadd func Func
3783 Func()
3784 END
3785 writefile(lines, 'XdebugFunc')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003786 var buf = g:RunVimInTerminal('-S XdebugFunc', {rows: 6, wait_for_ruler: 0})
3787 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 6)))
Bram Moolenaar9fffef92021-12-10 16:55:58 +00003788
3789 term_sendkeys(buf, "cont\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00003790 g:WaitForAssert(() => assert_match('\[0\]', term_getline(buf, 5)))
Bram Moolenaar9fffef92021-12-10 16:55:58 +00003791
Bram Moolenaar62aec932022-01-29 21:45:34 +00003792 g:StopVimInTerminal(buf)
Bram Moolenaar9fffef92021-12-10 16:55:58 +00003793 delete('XdebugFunc')
3794enddef
3795
Bram Moolenaar310091d2021-12-23 21:14:37 +00003796func Test_debug_running_out_of_lines()
3797 CheckRunVimInTerminal
3798
3799 " call indirectly to avoid compilation error for missing functions
3800 call Run_Test_debug_running_out_of_lines()
3801endfunc
3802
3803def Run_Test_debug_running_out_of_lines()
3804 var lines =<< trim END
3805 vim9script
3806 def Crash()
3807 #
3808 #
3809 #
3810 #
3811 #
3812 #
3813 #
3814 if true
3815 #
3816 endif
3817 enddef
3818 breakadd func Crash
3819 Crash()
3820 END
3821 writefile(lines, 'XdebugFunc')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003822 var buf = g:RunVimInTerminal('-S XdebugFunc', {rows: 6, wait_for_ruler: 0})
3823 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 6)))
Bram Moolenaar310091d2021-12-23 21:14:37 +00003824
3825 term_sendkeys(buf, "next\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00003826 g:TermWait(buf)
3827 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 6)))
Bram Moolenaar310091d2021-12-23 21:14:37 +00003828
3829 term_sendkeys(buf, "cont\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00003830 g:TermWait(buf)
Bram Moolenaar310091d2021-12-23 21:14:37 +00003831
Bram Moolenaar62aec932022-01-29 21:45:34 +00003832 g:StopVimInTerminal(buf)
Bram Moolenaar310091d2021-12-23 21:14:37 +00003833 delete('XdebugFunc')
3834enddef
3835
Bram Moolenaar62aec932022-01-29 21:45:34 +00003836def s:ProfiledWithLambda()
Bram Moolenaard9162552021-07-11 15:26:13 +02003837 var n = 3
3838 echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n)
3839enddef
3840
Bram Moolenaar62aec932022-01-29 21:45:34 +00003841def s:ProfiledNested()
Bram Moolenaar648594e2021-07-11 17:55:01 +02003842 var x = 0
3843 def Nested(): any
3844 return x
3845 enddef
3846 Nested()
3847enddef
3848
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02003849def ProfiledNestedProfiled()
3850 var x = 0
3851 def Nested(): any
3852 return x
3853 enddef
3854 Nested()
3855enddef
3856
Bram Moolenaarbed34f02022-01-19 20:48:37 +00003857def Test_ambigous_command_error()
3858 var lines =<< trim END
3859 vim9script
3860 command CmdA echomsg 'CmdA'
3861 command CmdB echomsg 'CmdB'
3862 Cmd
3863 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003864 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 4)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00003865
3866 lines =<< trim END
3867 vim9script
3868 def Func()
3869 Cmd
3870 enddef
3871 Func()
3872 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003873 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 1)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00003874
3875 lines =<< trim END
3876 vim9script
3877 nnoremap <F3> <ScriptCmd>Cmd<CR>
3878 feedkeys("\<F3>", 'xt')
3879 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003880 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 3)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00003881
3882 delcommand CmdA
3883 delcommand CmdB
3884 nunmap <F3>
3885enddef
3886
Dominique Pelle923dce22021-11-21 11:36:04 +00003887" Execute this near the end, profiling doesn't stop until Vim exits.
Bram Moolenaard9162552021-07-11 15:26:13 +02003888" This only tests that it works, not the profiling output.
3889def Test_xx_profile_with_lambda()
Bram Moolenaar4ece1522021-07-11 16:31:51 +02003890 CheckFeature profile
3891
Bram Moolenaard9162552021-07-11 15:26:13 +02003892 profile start Xprofile.log
Bram Moolenaar648594e2021-07-11 17:55:01 +02003893 profile func ProfiledWithLambda
3894 ProfiledWithLambda()
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02003895
Bram Moolenaar648594e2021-07-11 17:55:01 +02003896 profile func ProfiledNested
3897 ProfiledNested()
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02003898
3899 # Also profile the nested function. Use a different function, although the
3900 # contents is the same, to make sure it was not already compiled.
3901 profile func *
Bram Moolenaar62aec932022-01-29 21:45:34 +00003902 g:ProfiledNestedProfiled()
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02003903
3904 profdel func *
3905 profile pause
Bram Moolenaard9162552021-07-11 15:26:13 +02003906enddef
3907
Bram Moolenaar585fea72020-04-02 22:33:21 +02003908" Keep this last, it messes up highlighting.
3909def Test_substitute_cmd()
3910 new
3911 setline(1, 'something')
3912 :substitute(some(other(
3913 assert_equal('otherthing', getline(1))
3914 bwipe!
3915
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003916 # also when the context is Vim9 script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003917 var lines =<< trim END
Bram Moolenaar585fea72020-04-02 22:33:21 +02003918 vim9script
3919 new
3920 setline(1, 'something')
3921 :substitute(some(other(
3922 assert_equal('otherthing', getline(1))
3923 bwipe!
3924 END
3925 writefile(lines, 'Xvim9lines')
3926 source Xvim9lines
3927
3928 delete('Xvim9lines')
3929enddef
3930
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01003931" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker