blob: d9013ddf54ead91043ad2f3c8cd9bb0427fdcb06 [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 Moolenaar09d94212022-05-05 15:20:03 +010070def Test_invalid_range()
71 var lines =<< trim END
72 :123 eval 1 + 2
73 END
74 v9.CheckDefAndScriptFailure(lines, 'E481:', 1)
75
76 lines =<< trim END
77 :123 if true
78 endif
79 END
80 v9.CheckDefAndScriptFailure(lines, 'E481:', 1)
81
82 lines =<< trim END
83 :123 echo 'yes'
84 END
85 v9.CheckDefAndScriptFailure(lines, 'E481:', 1)
86
87 lines =<< trim END
88 :123 cd there
89 END
90 v9.CheckDefAndScriptFailure(lines, 'E481:', 1)
91enddef
92
Bram Moolenaara6e67e42020-05-15 23:36:40 +020093let g:alist = [7]
94let g:astring = 'text'
Bram Moolenaarf0b9f432020-07-17 23:03:17 +020095let g:anumber = 123
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010096
Bram Moolenaar4c17ad92020-04-27 22:47:51 +020097def Test_delfunction()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +020098 # Check function is defined in script namespace
Bram Moolenaar62aec932022-01-29 21:45:34 +000099 v9.CheckScriptSuccess([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200100 'vim9script',
101 'func CheckMe()',
102 ' return 123',
103 'endfunc',
Bram Moolenaara749a422022-02-12 19:52:25 +0000104 'func DoTest()',
105 ' call assert_equal(123, s:CheckMe())',
106 'endfunc',
107 'DoTest()',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200108 ])
109
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200110 # Check function in script namespace cannot be deleted
Bram Moolenaar62aec932022-01-29 21:45:34 +0000111 v9.CheckScriptFailure([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200112 'vim9script',
113 'func DeleteMe1()',
114 'endfunc',
115 'delfunction DeleteMe1',
116 ], 'E1084:')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000117 v9.CheckScriptFailure([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200118 'vim9script',
119 'func DeleteMe2()',
120 'endfunc',
121 'def DoThat()',
122 ' delfunction DeleteMe2',
123 'enddef',
124 'DoThat()',
125 ], 'E1084:')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000126 v9.CheckScriptFailure([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200127 'vim9script',
128 'def DeleteMe3()',
129 'enddef',
130 'delfunction DeleteMe3',
131 ], 'E1084:')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000132 v9.CheckScriptFailure([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200133 'vim9script',
134 'def DeleteMe4()',
135 'enddef',
136 'def DoThat()',
137 ' delfunction DeleteMe4',
138 'enddef',
139 'DoThat()',
140 ], 'E1084:')
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200141
142 # Check that global :def function can be replaced and deleted
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200143 var lines =<< trim END
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200144 vim9script
145 def g:Global(): string
146 return "yes"
147 enddef
148 assert_equal("yes", g:Global())
149 def! g:Global(): string
150 return "no"
151 enddef
152 assert_equal("no", g:Global())
153 delfunc g:Global
154 assert_false(exists('*g:Global'))
155 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000156 v9.CheckScriptSuccess(lines)
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200157
158 # Check that global function can be replaced by a :def function and deleted
159 lines =<< trim END
160 vim9script
161 func g:Global()
162 return "yes"
163 endfunc
164 assert_equal("yes", g:Global())
165 def! g:Global(): string
166 return "no"
167 enddef
168 assert_equal("no", g:Global())
169 delfunc g:Global
170 assert_false(exists('*g:Global'))
171 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000172 v9.CheckScriptSuccess(lines)
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200173
174 # Check that global :def function can be replaced by a function and deleted
175 lines =<< trim END
176 vim9script
177 def g:Global(): string
178 return "yes"
179 enddef
180 assert_equal("yes", g:Global())
181 func! g:Global()
182 return "no"
183 endfunc
184 assert_equal("no", g:Global())
185 delfunc g:Global
186 assert_false(exists('*g:Global'))
187 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000188 v9.CheckScriptSuccess(lines)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200189enddef
190
Bram Moolenaar08052222020-09-14 17:04:31 +0200191def Test_wrong_type()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000192 v9.CheckDefFailure(['var name: list<nothing>'], 'E1010:')
193 v9.CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
194 v9.CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
195 v9.CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100196
Bram Moolenaar62aec932022-01-29 21:45:34 +0000197 v9.CheckDefFailure(['var name: dict<number'], 'E1009:')
198 v9.CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100199
Bram Moolenaar62aec932022-01-29 21:45:34 +0000200 v9.CheckDefFailure(['var name: ally'], 'E1010:')
201 v9.CheckDefFailure(['var name: bram'], 'E1010:')
202 v9.CheckDefFailure(['var name: cathy'], 'E1010:')
203 v9.CheckDefFailure(['var name: dom'], 'E1010:')
204 v9.CheckDefFailure(['var name: freddy'], 'E1010:')
205 v9.CheckDefFailure(['var name: john'], 'E1010:')
206 v9.CheckDefFailure(['var name: larry'], 'E1010:')
207 v9.CheckDefFailure(['var name: ned'], 'E1010:')
208 v9.CheckDefFailure(['var name: pam'], 'E1010:')
209 v9.CheckDefFailure(['var name: sam'], 'E1010:')
210 v9.CheckDefFailure(['var name: vim'], 'E1010:')
Bram Moolenaara0a9f432020-04-28 21:29:34 +0200211
Bram Moolenaar62aec932022-01-29 21:45:34 +0000212 v9.CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
213 v9.CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
Bram Moolenaar08052222020-09-14 17:04:31 +0200214enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100215
Bram Moolenaara749a422022-02-12 19:52:25 +0000216def Test_script_namespace()
217 # defining a function or variable with s: is not allowed
218 var lines =<< trim END
219 vim9script
220 def s:Function()
221 enddef
222 END
223 v9.CheckScriptFailure(lines, 'E1268:')
224
225 for decl in ['var', 'const', 'final']
226 lines =<< trim END
227 vim9script
228 var s:var = 'var'
229 END
230 v9.CheckScriptFailure([
231 'vim9script',
232 decl .. ' s:var = "var"',
233 ], 'E1268:')
234 endfor
235
236 # Calling a function or using a variable with s: is not allowed at script
237 # level
238 lines =<< trim END
239 vim9script
240 def Function()
241 enddef
242 s:Function()
243 END
244 v9.CheckScriptFailure(lines, 'E1268:')
245 lines =<< trim END
246 vim9script
247 def Function()
248 enddef
249 call s:Function()
250 END
251 v9.CheckScriptFailure(lines, 'E1268:')
252 lines =<< trim END
253 vim9script
254 var var = 'var'
255 echo s:var
256 END
257 v9.CheckScriptFailure(lines, 'E1268:')
258enddef
259
Bram Moolenaar10c65862020-10-08 21:16:42 +0200260def Test_script_wrong_type()
261 var lines =<< trim END
262 vim9script
Bram Moolenaara749a422022-02-12 19:52:25 +0000263 var dict: dict<string>
264 dict['a'] = ['x']
Bram Moolenaar10c65862020-10-08 21:16:42 +0200265 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000266 v9.CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3)
Bram Moolenaar10c65862020-10-08 21:16:42 +0200267enddef
268
Bram Moolenaar08052222020-09-14 17:04:31 +0200269def Test_const()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000270 v9.CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
271 v9.CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
272 v9.CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
273 v9.CheckDefFailure(['final two'], 'E1125:')
274 v9.CheckDefFailure(['final &option'], 'E996:')
Bram Moolenaardbeecb22020-09-14 18:15:09 +0200275
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200276 var lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200277 final list = [1, 2, 3]
Bram Moolenaardbeecb22020-09-14 18:15:09 +0200278 list[0] = 4
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200279 list->assert_equal([4, 2, 3])
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200280 const other = [5, 6, 7]
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200281 other->assert_equal([5, 6, 7])
Bram Moolenaar71abe482020-09-14 22:28:30 +0200282
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200283 var varlist = [7, 8]
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200284 const constlist = [1, varlist, 3]
Bram Moolenaar71abe482020-09-14 22:28:30 +0200285 varlist[0] = 77
Bram Moolenaar23e2e112021-08-03 21:16:18 +0200286 constlist[1][1] = 88
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200287 var cl = constlist[1]
Bram Moolenaar71abe482020-09-14 22:28:30 +0200288 cl[1] = 88
289 constlist->assert_equal([1, [77, 88], 3])
290
Bram Moolenaare0de1712020-12-02 17:36:54 +0100291 var vardict = {five: 5, six: 6}
292 const constdict = {one: 1, two: vardict, three: 3}
Bram Moolenaar71abe482020-09-14 22:28:30 +0200293 vardict['five'] = 55
Bram Moolenaar23e2e112021-08-03 21:16:18 +0200294 constdict['two']['six'] = 66
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200295 var cd = constdict['two']
Bram Moolenaar71abe482020-09-14 22:28:30 +0200296 cd['six'] = 66
Bram Moolenaare0de1712020-12-02 17:36:54 +0100297 constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3})
Bram Moolenaardbeecb22020-09-14 18:15:09 +0200298 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000299 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar0089ce22022-10-08 14:39:36 +0100300
301 # "any" type with const flag is recognized as "any"
302 lines =<< trim END
303 const dict: dict<any> = {foo: {bar: 42}}
304 const foo = dict.foo
305 assert_equal(v:t_number, type(foo.bar))
306 END
307 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar330d64d2022-10-09 12:55:33 +0100308
309 # also when used as a builtin function argument
310 lines =<< trim END
311 vim9script
312
313 def SorterFunc(lhs: dict<string>, rhs: dict<string>): number
314 return lhs.name <# rhs.name ? -1 : 1
315 enddef
316
317 def Run(): void
318 var list = [{name: "3"}, {name: "2"}]
319 const Sorter = get({}, "unknown", SorterFunc)
320 sort(list, Sorter)
321 assert_equal([{name: "2"}, {name: "3"}], list)
322 enddef
323
324 Run()
325 END
326 v9.CheckScriptSuccess(lines)
Bram Moolenaar08052222020-09-14 17:04:31 +0200327enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100328
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200329def Test_const_bang()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200330 var lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200331 const var = 234
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200332 var = 99
333 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000334 v9.CheckDefExecFailure(lines, 'E1018:', 2)
335 v9.CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200336
337 lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200338 const ll = [2, 3, 4]
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200339 ll[0] = 99
340 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000341 v9.CheckDefExecFailure(lines, 'E1119:', 2)
342 v9.CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200343
344 lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200345 const ll = [2, 3, 4]
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200346 ll[3] = 99
347 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000348 v9.CheckDefExecFailure(lines, 'E1118:', 2)
349 v9.CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200350
351 lines =<< trim END
Bram Moolenaare0de1712020-12-02 17:36:54 +0100352 const dd = {one: 1, two: 2}
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200353 dd["one"] = 99
354 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000355 v9.CheckDefExecFailure(lines, 'E1121:', 2)
356 v9.CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200357
358 lines =<< trim END
Bram Moolenaare0de1712020-12-02 17:36:54 +0100359 const dd = {one: 1, two: 2}
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200360 dd["three"] = 99
361 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000362 v9.CheckDefExecFailure(lines, 'E1120:')
363 v9.CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200364enddef
365
Bram Moolenaardf069ee2020-06-22 23:02:51 +0200366def Test_range_no_colon()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000367 v9.CheckDefFailure(['%s/a/b/'], 'E1050:')
368 v9.CheckDefFailure(['+ s/a/b/'], 'E1050:')
369 v9.CheckDefFailure(['- s/a/b/'], 'E1050:')
370 v9.CheckDefFailure(['. s/a/b/'], 'E1050:')
Bram Moolenaardf069ee2020-06-22 23:02:51 +0200371enddef
372
373
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100374def Test_block()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200375 var outer = 1
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100376 {
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200377 var inner = 2
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100378 assert_equal(1, outer)
379 assert_equal(2, inner)
380 }
381 assert_equal(1, outer)
Bram Moolenaar3f1e9f02021-02-27 22:36:43 +0100382
383 {|echo 'yes'|}
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100384enddef
385
Bram Moolenaar08052222020-09-14 17:04:31 +0200386def Test_block_failure()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000387 v9.CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
388 v9.CheckDefFailure(['}'], 'E1025:')
389 v9.CheckDefFailure(['{', 'echo 1'], 'E1026:')
Bram Moolenaar08052222020-09-14 17:04:31 +0200390enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100391
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200392def Test_block_local_vars()
393 var lines =<< trim END
394 vim9script
Bram Moolenaared234f22020-10-15 20:42:20 +0200395 v:testing = 1
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200396 if true
Bram Moolenaared234f22020-10-15 20:42:20 +0200397 var text = ['hello']
398 def SayHello(): list<string>
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200399 return text
400 enddef
401 def SetText(v: string)
Bram Moolenaared234f22020-10-15 20:42:20 +0200402 text = [v]
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200403 enddef
404 endif
405
406 if true
Bram Moolenaared234f22020-10-15 20:42:20 +0200407 var text = ['again']
408 def SayAgain(): list<string>
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200409 return text
410 enddef
411 endif
Bram Moolenaared234f22020-10-15 20:42:20 +0200412
413 # test that the "text" variables are not cleaned up
414 test_garbagecollect_now()
415
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200416 defcompile
417
Bram Moolenaared234f22020-10-15 20:42:20 +0200418 assert_equal(['hello'], SayHello())
419 assert_equal(['again'], SayAgain())
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200420
421 SetText('foobar')
Bram Moolenaared234f22020-10-15 20:42:20 +0200422 assert_equal(['foobar'], SayHello())
423
424 call writefile(['ok'], 'Xdidit')
425 qall!
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200426 END
Bram Moolenaared234f22020-10-15 20:42:20 +0200427
428 # need to execute this with a separate Vim instance to avoid the current
429 # context gets garbage collected.
Bram Moolenaardd674772022-09-15 22:26:18 +0100430 writefile(lines, 'Xscript', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000431 g:RunVim([], [], '-S Xscript')
Bram Moolenaared234f22020-10-15 20:42:20 +0200432 assert_equal(['ok'], readfile('Xdidit'))
433
Bram Moolenaared234f22020-10-15 20:42:20 +0200434 delete('Xdidit')
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200435enddef
436
Bram Moolenaar39ca4122020-10-20 14:25:07 +0200437def Test_block_local_vars_with_func()
438 var lines =<< trim END
439 vim9script
440 if true
441 var foo = 'foo'
442 if true
443 var bar = 'bar'
444 def Func(): list<string>
445 return [foo, bar]
446 enddef
447 endif
448 endif
449 # function is compiled here, after blocks have finished, can still access
450 # "foo" and "bar"
451 assert_equal(['foo', 'bar'], Func())
452 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000453 v9.CheckScriptSuccess(lines)
Bram Moolenaar39ca4122020-10-20 14:25:07 +0200454enddef
455
Bram Moolenaare4db17f2021-08-01 21:19:43 +0200456" legacy func for command that's defined later
Bram Moolenaar62aec932022-01-29 21:45:34 +0000457func s:InvokeSomeCommand()
Bram Moolenaare4db17f2021-08-01 21:19:43 +0200458 SomeCommand
459endfunc
460
Yegappan Lakshmanane74cad32024-04-12 18:48:35 +0200461def Test_command_block()
Bram Moolenaare4db17f2021-08-01 21:19:43 +0200462 com SomeCommand {
463 g:someVar = 'some'
464 }
465 InvokeSomeCommand()
466 assert_equal('some', g:someVar)
467
468 delcommand SomeCommand
469 unlet g:someVar
470enddef
471
Yegappan Lakshmanane74cad32024-04-12 18:48:35 +0200472" Test for using heredoc in a :command command block
473def Test_command_block_heredoc()
474 var lines =<< trim CODE
475 vim9script
476 com SomeCommand {
477 g:someVar =<< trim END
478 aaa
479 bbb
480 END
481 }
482 SomeCommand
483 assert_equal(['aaa', 'bbb'], g:someVar)
484 def Foo()
485 g:someVar = []
486 SomeCommand
487 assert_equal(['aaa', 'bbb'], g:someVar)
488 enddef
489 Foo()
490 delcommand SomeCommand
491 unlet g:someVar
492 CODE
493 v9.CheckSourceSuccess( lines)
494
495 # Execute a command with heredoc in a block
496 lines =<< trim CODE
497 vim9script
498 com SomeCommand {
499 g:someVar =<< trim END
500 aaa
501 bbb
502 END
503 }
504 execute('SomeCommand')
505 assert_equal(['aaa', 'bbb'], g:someVar)
506 delcommand SomeCommand
507 unlet g:someVar
508 CODE
509 v9.CheckSourceSuccess(lines)
510
zeertzjq1f5175d2024-04-13 17:52:26 +0200511 # Heredoc with comment
512 lines =<< trim CODE
513 vim9script
514 com SomeCommand {
515 g:someVar =<< trim END # comment
516 aaa
517 bbb
518 END
519 }
520 execute('SomeCommand')
521 assert_equal(['aaa', 'bbb'], g:someVar)
522 delcommand SomeCommand
523 unlet g:someVar
524 CODE
525 v9.CheckSourceSuccess(lines)
526
Yegappan Lakshmanane74cad32024-04-12 18:48:35 +0200527 # heredoc evaluation
528 lines =<< trim CODE
529 vim9script
530 com SomeCommand {
531 var suffix = '---'
532 g:someVar =<< trim eval END
533 ccc{suffix}
534 ddd
535 END
536 }
537 SomeCommand
538 assert_equal(['ccc---', 'ddd'], g:someVar)
539 def Foo()
540 g:someVar = []
541 SomeCommand
542 assert_equal(['ccc---', 'ddd'], g:someVar)
543 enddef
544 Foo()
545 delcommand SomeCommand
546 unlet g:someVar
547 CODE
548 v9.CheckSourceSuccess(lines)
549
550 # command following heredoc
551 lines =<< trim CODE
552 vim9script
553 com SomeCommand {
554 var l =<< trim END
555 eee
556 fff
557 END
558 g:someVar = l
559 }
560 SomeCommand
561 assert_equal(['eee', 'fff'], g:someVar)
562 delcommand SomeCommand
563 unlet g:someVar
564 CODE
565 v9.CheckSourceSuccess(lines)
566
567 # Error in heredoc
568 lines =<< trim CODE
569 vim9script
570 com SomeCommand {
571 g:someVar =<< trim END
572 eee
573 fff
574 }
575 try
576 SomeCommand
577 catch
578 assert_match("E990: Missing end marker 'END'", v:exception)
579 endtry
580 delcommand SomeCommand
581 unlet g:someVar
582 CODE
583 v9.CheckSourceSuccess(lines)
584enddef
585
586def Test_autocommand_block()
Bram Moolenaare4db17f2021-08-01 21:19:43 +0200587 au BufNew *.xml {
588 g:otherVar = 'other'
589 }
590 split other.xml
591 assert_equal('other', g:otherVar)
592
593 bwipe!
594 au! BufNew *.xml
595 unlet g:otherVar
596enddef
597
Yegappan Lakshmanan0072cee2025-01-07 20:22:32 +0100598def Test_block_in_a_string()
599 var lines =<< trim END
600 vim9script
601
602 def Foo(): string
603 var x = ' => { # abc'
604 return x
605 enddef
606
607 assert_equal(' => { # abc', Foo())
608
609 def Bar(): string
610 var x = " => { # abc"
611 return x
612 enddef
613
614 assert_equal(" => { # abc", Bar())
615 END
616 v9.CheckSourceSuccess(lines)
617enddef
618
Bram Moolenaard032f342020-07-18 18:13:02 +0200619func g:NoSuchFunc()
620 echo 'none'
621endfunc
622
Bram Moolenaar9e1d9e32021-01-11 20:17:34 +0100623def Test_try_catch_throw()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200624 var l = []
Bram Moolenaar7a092242020-04-16 22:10:49 +0200625 try # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100626 add(l, '1')
627 throw 'wrong'
Bram Moolenaar9d383f32023-05-14 21:38:12 +0100628 add(l, '2') # "unreachable code"
Bram Moolenaar7a092242020-04-16 22:10:49 +0200629 catch # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100630 add(l, v:exception)
Bram Moolenaar7a092242020-04-16 22:10:49 +0200631 finally # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100632 add(l, '3')
Bram Moolenaar7a092242020-04-16 22:10:49 +0200633 endtry # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100634 assert_equal(['1', 'wrong', '3'], l)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200635
Bram Moolenaare8593122020-07-18 15:17:02 +0200636 l = []
637 try
638 try
639 add(l, '1')
640 throw 'wrong'
Bram Moolenaar9d383f32023-05-14 21:38:12 +0100641 add(l, '2') # "unreachable code"
Bram Moolenaare8593122020-07-18 15:17:02 +0200642 catch /right/
643 add(l, v:exception)
644 endtry
645 catch /wrong/
646 add(l, 'caught')
Bram Moolenaar204852a2022-03-05 12:56:44 +0000647 finally
Bram Moolenaare8593122020-07-18 15:17:02 +0200648 add(l, 'finally')
649 endtry
650 assert_equal(['1', 'caught', 'finally'], l)
651
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200652 var n: number
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200653 try
654 n = l[3]
655 catch /E684:/
656 n = 99
657 endtry
658 assert_equal(99, n)
659
Bram Moolenaar69f70502021-01-01 16:10:46 +0100660 var done = 'no'
661 if 0
662 try | catch | endtry
663 else
664 done = 'yes'
665 endif
666 assert_equal('yes', done)
667
668 done = 'no'
669 if 1
670 done = 'yes'
671 else
672 try | catch | endtry
673 done = 'never'
674 endif
675 assert_equal('yes', done)
676
677 if 1
678 else
679 try | catch /pat/ | endtry
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000680 try | catch /pat/
Bram Moolenaar69f70502021-01-01 16:10:46 +0100681 endtry
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000682 try
Bram Moolenaar69f70502021-01-01 16:10:46 +0100683 catch /pat/ | endtry
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000684 try
685 catch /pat/
Bram Moolenaar69f70502021-01-01 16:10:46 +0100686 endtry
687 endif
688
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200689 try
Bram Moolenaarcc673e72020-08-16 17:33:35 +0200690 # string slice returns a string, not a number
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200691 n = g:astring[3]
Bram Moolenaar5e654232020-09-16 15:22:00 +0200692 catch /E1012:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200693 n = 77
694 endtry
695 assert_equal(77, n)
696
697 try
698 n = l[g:astring]
Bram Moolenaar5e654232020-09-16 15:22:00 +0200699 catch /E1012:/
Bram Moolenaar56acb092020-08-16 14:48:19 +0200700 n = 88
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200701 endtry
Bram Moolenaar56acb092020-08-16 14:48:19 +0200702 assert_equal(88, n)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200703
704 try
705 n = s:does_not_exist
706 catch /E121:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200707 n = 111
708 endtry
709 assert_equal(111, n)
710
711 try
712 n = g:does_not_exist
713 catch /E121:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200714 n = 121
715 endtry
716 assert_equal(121, n)
717
Bram Moolenaare0de1712020-12-02 17:36:54 +0100718 var d = {one: 1}
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200719 try
720 n = d[g:astring]
721 catch /E716:/
722 n = 222
723 endtry
724 assert_equal(222, n)
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200725
726 try
727 n = -g:astring
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200728 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200729 n = 233
730 endtry
731 assert_equal(233, n)
732
733 try
734 n = +g:astring
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200735 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200736 n = 244
737 endtry
738 assert_equal(244, n)
739
740 try
741 n = +g:alist
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200742 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200743 n = 255
744 endtry
745 assert_equal(255, n)
746
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200747 var nd: dict<any>
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200748 try
Bram Moolenaar2e5910b2021-02-03 17:41:24 +0100749 nd = {[g:alist]: 1}
750 catch /E1105:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200751 n = 266
752 endtry
753 assert_equal(266, n)
754
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000755 l = [1, 2, 3]
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200756 try
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +0000757 [n] = l
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200758 catch /E1093:/
759 n = 277
760 endtry
761 assert_equal(277, n)
762
Bram Moolenaare8593122020-07-18 15:17:02 +0200763 try
764 &ts = g:astring
Bram Moolenaar5e654232020-09-16 15:22:00 +0200765 catch /E1012:/
Bram Moolenaare8593122020-07-18 15:17:02 +0200766 n = 288
767 endtry
768 assert_equal(288, n)
769
770 try
771 &backspace = 'asdf'
772 catch /E474:/
773 n = 299
774 endtry
775 assert_equal(299, n)
776
777 l = [1]
778 try
779 l[3] = 3
780 catch /E684:/
781 n = 300
782 endtry
783 assert_equal(300, n)
784
785 try
Bram Moolenaare8593122020-07-18 15:17:02 +0200786 unlet g:does_not_exist
787 catch /E108:/
788 n = 322
789 endtry
790 assert_equal(322, n)
791
792 try
Bram Moolenaar2bede172020-11-19 18:53:18 +0100793 d = {text: 1, [g:astring]: 2}
Bram Moolenaare8593122020-07-18 15:17:02 +0200794 catch /E721:/
795 n = 333
796 endtry
797 assert_equal(333, n)
798
799 try
Bram Moolenaar62aec932022-01-29 21:45:34 +0000800 l = g:DeletedFunc()
Bram Moolenaare8593122020-07-18 15:17:02 +0200801 catch /E933:/
802 n = 344
803 endtry
804 assert_equal(344, n)
Bram Moolenaard032f342020-07-18 18:13:02 +0200805
806 try
Yegappan Lakshmanana764e732021-07-25 15:57:32 +0200807 echo range(1, 2, 0)
808 catch /E726:/
Bram Moolenaard032f342020-07-18 18:13:02 +0200809 n = 355
810 endtry
811 assert_equal(355, n)
812
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200813 var P = function('g:NoSuchFunc')
Bram Moolenaard032f342020-07-18 18:13:02 +0200814 delfunc g:NoSuchFunc
815 try
816 echo P()
817 catch /E117:/
818 n = 366
819 endtry
820 assert_equal(366, n)
821
822 try
823 echo g:NoSuchFunc()
824 catch /E117:/
825 n = 377
826 endtry
827 assert_equal(377, n)
828
829 try
830 echo g:alist + 4
831 catch /E745:/
832 n = 388
833 endtry
834 assert_equal(388, n)
835
836 try
837 echo 4 + g:alist
838 catch /E745:/
839 n = 399
840 endtry
841 assert_equal(399, n)
842
843 try
844 echo g:alist.member
845 catch /E715:/
846 n = 400
847 endtry
848 assert_equal(400, n)
849
850 try
851 echo d.member
852 catch /E716:/
853 n = 411
854 endtry
855 assert_equal(411, n)
Bram Moolenaard9d77892021-02-12 21:32:47 +0100856
857 var counter = 0
858 for i in range(4)
859 try
860 eval [][0]
861 catch
862 endtry
863 counter += 1
864 endfor
865 assert_equal(4, counter)
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100866
Bram Moolenaar9fa5dab2021-07-20 19:18:44 +0200867 # no requirement for spaces before |
868 try|echo 0|catch|endtry
869
Bram Moolenaar003312b2021-12-20 10:55:35 +0000870 # return in try with finally
871 def ReturnInTry(): number
872 var ret = 4
873 try
874 return ret
875 catch /this/
876 return -1
877 catch /that/
878 return -1
879 finally
880 # changing ret has no effect
881 ret = 7
882 endtry
883 return -2
884 enddef
885 assert_equal(4, ReturnInTry())
886
887 # return in catch with finally
888 def ReturnInCatch(): number
889 var ret = 5
890 try
891 throw 'getout'
Bram Moolenaar9d383f32023-05-14 21:38:12 +0100892 return -1 # "unreachable code"
Bram Moolenaar003312b2021-12-20 10:55:35 +0000893 catch /getout/
894 # ret is evaluated here
895 return ret
896 finally
897 # changing ret later has no effect
898 ret = -3
899 endtry
900 return -2
901 enddef
902 assert_equal(5, ReturnInCatch())
903
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100904 # return in finally after empty catch
905 def ReturnInFinally(): number
906 try
907 finally
Bram Moolenaar003312b2021-12-20 10:55:35 +0000908 return 6
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100909 endtry
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100910 enddef
Bram Moolenaar003312b2021-12-20 10:55:35 +0000911 assert_equal(6, ReturnInFinally())
Bram Moolenaar8ac681a2021-06-15 20:06:34 +0200912
913 var lines =<< trim END
914 vim9script
915 try
916 acos('0.5')
917 ->setline(1)
918 catch
919 g:caught = v:exception
920 endtry
921 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000922 v9.CheckScriptSuccess(lines)
Yegappan Lakshmanan4490ec42021-07-27 22:00:44 +0200923 assert_match('E1219: Float or Number required for argument 1', g:caught)
Bram Moolenaar8ac681a2021-06-15 20:06:34 +0200924 unlet g:caught
Bram Moolenaar41978282021-07-04 14:47:30 +0200925
926 # missing catch and/or finally
927 lines =<< trim END
928 vim9script
929 try
930 echo 'something'
931 endtry
932 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000933 v9.CheckScriptFailure(lines, 'E1032:')
rbtnn84934992021-08-07 13:26:53 +0200934
935 # skipping try-finally-endtry when try-finally-endtry is used in another block
936 lines =<< trim END
937 if v:true
938 try
939 finally
940 endtry
941 else
942 try
943 finally
944 endtry
945 endif
946 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000947 v9.CheckDefAndScriptSuccess(lines)
Yee Cheng Chin2051af12025-01-09 22:14:34 +0100948
949 # test that the v:exception stacks are correctly restored
950 try
951 try
952 throw 101
953 catch
954 assert_equal('101', v:exception)
955 try
956 catch
957 finally
958 assert_equal('101', v:exception) # finally shouldn't clear if it doesn't own it
959 endtry
960 assert_equal('101', v:exception)
961 throw 102 # Re-throw inside catch block
962 endtry
963 catch
964 assert_equal('102', v:exception)
965 try
966 throw 103 # throw inside nested exception stack
967 catch
968 assert_equal('103', v:exception)
969 endtry
970 assert_equal('102', v:exception) # restored stack
971 finally
972 assert_equal('', v:exception) # finally should clear if it owns the exception
973 endtry
974 try
975 try
976 throw 104
977 catch
978 try
979 exec 'nonexistent_cmd' # normal exception inside nested exception stack
980 catch
981 assert_match('E492:', v:exception)
982 endtry
983 eval [][0] # normal exception inside catch block
984 endtry
985 catch
986 assert_match('E684:', v:exception)
987 endtry
988 assert_equal('', v:exception) # All exceptions properly popped
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100989enddef
990
Bram Moolenaara2c00282023-05-14 22:05:15 +0100991def Test_unreachable_after()
992 var lines =<< trim END
993 try
994 throw 'Error'
995 echo 'not reached'
996 catch /Error/
997 endtry
998 END
999 v9.CheckDefFailure(lines, 'E1095: Unreachable code after :throw')
1000
1001 lines =<< trim END
1002 def SomeFunc(): number
1003 try
1004 return 3
1005 echo 'not reached'
1006 catch /Error/
1007 endtry
1008 return 4
1009 enddef
1010 defcompile
1011 END
1012 v9.CheckScriptFailure(lines, 'E1095: Unreachable code after :return')
1013enddef
1014
Bram Moolenaar3ef2e412023-04-30 18:50:48 +01001015def Test_throw_in_nested_try()
1016 var lines =<< trim END
1017 vim9script
1018
1019 def Try(F: func(): void)
1020 try
1021 F()
1022 catch
1023 endtry
1024 enddef
1025
1026 class X
1027 def F()
1028 try
1029 throw 'Foobar'
1030 catch
1031 throw v:exception
1032 endtry
1033 enddef
1034 endclass
1035
1036 def Test_TryMethod()
1037 var x = X.new()
1038 Try(() => x.F())
1039 enddef
1040
1041
1042 try
1043 Test_TryMethod()
1044 catch
1045 endtry
1046 END
1047 v9.CheckScriptSuccess(lines)
1048enddef
1049
Bram Moolenaar28bf6492022-03-03 15:11:20 +00001050def Test_try_var_decl()
1051 var lines =<< trim END
1052 vim9script
1053 try
1054 var in_try = 1
1055 assert_equal(1, get(s:, 'in_try', -1))
1056 throw "getout"
1057 catch
1058 var in_catch = 2
1059 assert_equal(-1, get(s:, 'in_try', -1))
1060 assert_equal(2, get(s:, 'in_catch', -1))
1061 finally
1062 var in_finally = 3
1063 assert_equal(-1, get(s:, 'in_try', -1))
1064 assert_equal(-1, get(s:, 'in_catch', -1))
1065 assert_equal(3, get(s:, 'in_finally', -1))
1066 endtry
1067 assert_equal(-1, get(s:, 'in_try', -1))
1068 assert_equal(-1, get(s:, 'in_catch', -1))
1069 assert_equal(-1, get(s:, 'in_finally', -1))
1070 END
1071 v9.CheckScriptSuccess(lines)
1072enddef
1073
Bram Moolenaar53c29612022-01-12 16:18:18 +00001074def Test_try_ends_in_return()
1075 var lines =<< trim END
1076 vim9script
1077 def Foo(): string
1078 try
1079 return 'foo'
1080 catch
1081 return 'caught'
1082 endtry
1083 enddef
1084 assert_equal('foo', Foo())
1085 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001086 v9.CheckScriptSuccess(lines)
Bram Moolenaar53c29612022-01-12 16:18:18 +00001087
1088 lines =<< trim END
1089 vim9script
1090 def Foo(): string
1091 try
1092 return 'foo'
1093 catch
1094 return 'caught'
1095 endtry
1096 echo 'notreached'
1097 enddef
1098 assert_equal('foo', Foo())
1099 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001100 v9.CheckScriptFailure(lines, 'E1095:')
Bram Moolenaar53c29612022-01-12 16:18:18 +00001101
1102 lines =<< trim END
1103 vim9script
1104 def Foo(): string
1105 try
1106 return 'foo'
1107 catch /x/
1108 return 'caught'
1109 endtry
1110 enddef
1111 assert_equal('foo', Foo())
1112 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001113 v9.CheckScriptFailure(lines, 'E1027:')
Bram Moolenaar53c29612022-01-12 16:18:18 +00001114
1115 lines =<< trim END
1116 vim9script
1117 def Foo(): string
1118 try
1119 echo 'foo'
1120 catch
1121 echo 'caught'
1122 finally
1123 return 'done'
1124 endtry
1125 enddef
1126 assert_equal('done', Foo())
1127 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001128 v9.CheckScriptSuccess(lines)
Bram Moolenaar53c29612022-01-12 16:18:18 +00001129
1130enddef
1131
Bram Moolenaar3f987b52021-06-30 12:02:24 +02001132def Test_try_in_catch()
1133 var lines =<< trim END
1134 vim9script
1135 var seq = []
1136 def DoIt()
1137 try
1138 seq->add('throw 1')
1139 eval [][0]
1140 seq->add('notreached')
1141 catch
1142 seq->add('catch')
1143 try
1144 seq->add('throw 2')
1145 eval [][0]
1146 seq->add('notreached')
1147 catch /nothing/
1148 seq->add('notreached')
1149 endtry
1150 seq->add('done')
1151 endtry
1152 enddef
1153 DoIt()
1154 assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq)
1155 END
1156enddef
1157
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001158def Test_error_in_catch()
1159 var lines =<< trim END
1160 try
1161 eval [][0]
1162 catch /E684:/
1163 eval [][0]
1164 endtry
1165 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001166 v9.CheckDefExecFailure(lines, 'E684:', 4)
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001167enddef
1168
Bram Moolenaar2e34c342021-03-14 12:13:33 +01001169" :while at the very start of a function that :continue jumps to
Bram Moolenaar62aec932022-01-29 21:45:34 +00001170def s:TryContinueFunc()
Bram Moolenaar2e34c342021-03-14 12:13:33 +01001171 while g:Count < 2
1172 g:sequence ..= 't'
1173 try
1174 echoerr 'Test'
1175 catch
1176 g:Count += 1
1177 g:sequence ..= 'c'
1178 continue
1179 endtry
1180 g:sequence ..= 'e'
1181 g:Count += 1
1182 endwhile
1183enddef
1184
1185def Test_continue_in_try_in_while()
1186 g:Count = 0
1187 g:sequence = ''
1188 TryContinueFunc()
1189 assert_equal('tctc', g:sequence)
1190 unlet g:Count
1191 unlet g:sequence
1192enddef
1193
Bram Moolenaar873f8242022-03-10 21:53:44 +00001194def Test_break_in_try_in_for()
1195 var lines =<< trim END
1196 vim9script
1197 def Ls(): list<string>
1198 var ls: list<string>
1199 for s in ['abc', 'def']
1200 for _ in [123, 456]
1201 try
1202 eval [][0]
1203 catch
1204 break
1205 endtry
1206 endfor
1207 ls += [s]
1208 endfor
1209 return ls
1210 enddef
1211 assert_equal(['abc', 'def'], Ls())
1212 END
1213 v9.CheckScriptSuccess(lines)
1214enddef
1215
Bram Moolenaar9cb577a2021-02-22 22:45:10 +01001216def Test_nocatch_return_in_try()
1217 # return in try block returns normally
1218 def ReturnInTry(): string
1219 try
1220 return '"some message"'
1221 catch
1222 endtry
1223 return 'not reached'
1224 enddef
1225 exe 'echoerr ' .. ReturnInTry()
1226enddef
1227
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001228def Test_cnext_works_in_catch()
John Marriott45377e22025-03-27 18:12:32 +01001229 CheckFeature quickfix
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001230 var lines =<< trim END
1231 vim9script
Bram Moolenaarc3235272021-07-10 19:42:03 +02001232 au BufEnter * eval 1 + 2
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001233 writefile(['text'], 'Xcncfile1')
1234 writefile(['text'], 'Xcncfile2')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001235 var items = [
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001236 {lnum: 1, filename: 'Xcncfile1', valid: true},
1237 {lnum: 1, filename: 'Xcncfile2', valid: true}
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001238 ]
1239 setqflist([], ' ', {items: items})
1240 cwindow
1241
1242 def CnextOrCfirst()
1243 # if cnext fails, cfirst is used
1244 try
1245 cnext
1246 catch
1247 cfirst
1248 endtry
1249 enddef
1250
1251 CnextOrCfirst()
1252 CnextOrCfirst()
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001253 writefile([getqflist({idx: 0}).idx], 'Xcncresult')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001254 qall
1255 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001256 writefile(lines, 'XCatchCnext', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001257 g:RunVim([], [], '--clean -S XCatchCnext')
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001258 assert_equal(['1'], readfile('Xcncresult'))
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001259
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001260 delete('Xcncfile1')
1261 delete('Xcncfile2')
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001262 delete('Xcncresult')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001263enddef
1264
Bram Moolenaar9e1d9e32021-01-11 20:17:34 +01001265def Test_throw_skipped()
1266 if 0
1267 throw dontgethere
1268 endif
1269enddef
1270
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001271def Test_nocatch_throw_silenced()
1272 var lines =<< trim END
1273 vim9script
1274 def Func()
1275 throw 'error'
1276 enddef
1277 silent! Func()
1278 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001279 writefile(lines, 'XthrowSilenced', 'D')
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001280 source XthrowSilenced
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001281enddef
1282
Bram Moolenaara2c00282023-05-14 22:05:15 +01001283" g:DeletedFunc() is found when compiling Test_try_catch_throw() and then
1284" deleted, this should give a runtime error.
Bram Moolenaare8593122020-07-18 15:17:02 +02001285def DeletedFunc(): list<any>
1286 return ['delete me']
1287enddef
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001288defcompile DeletedFunc
1289
1290call test_override('unreachable', 1)
1291defcompile Test_try_catch_throw
1292call test_override('unreachable', 0)
1293
Bram Moolenaare8593122020-07-18 15:17:02 +02001294delfunc DeletedFunc
1295
Bram Moolenaar62aec932022-01-29 21:45:34 +00001296def s:ThrowFromDef()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001297 throw "getout" # comment
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001298enddef
1299
Bram Moolenaar62aec932022-01-29 21:45:34 +00001300func s:CatchInFunc()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001301 try
Bram Moolenaar62aec932022-01-29 21:45:34 +00001302 call s:ThrowFromDef()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001303 catch
1304 let g:thrown_func = v:exception
1305 endtry
1306endfunc
1307
Bram Moolenaar62aec932022-01-29 21:45:34 +00001308def s:CatchInDef()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001309 try
1310 ThrowFromDef()
1311 catch
1312 g:thrown_def = v:exception
1313 endtry
1314enddef
1315
Bram Moolenaar62aec932022-01-29 21:45:34 +00001316def s:ReturnFinally(): string
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001317 try
1318 return 'intry'
Bram Moolenaar204852a2022-03-05 12:56:44 +00001319 finally
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001320 g:in_finally = 'finally'
1321 endtry
1322 return 'end'
1323enddef
1324
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001325def Test_try_catch_nested()
1326 CatchInFunc()
1327 assert_equal('getout', g:thrown_func)
1328
1329 CatchInDef()
1330 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001331
1332 assert_equal('intry', ReturnFinally())
1333 assert_equal('finally', g:in_finally)
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001334
1335 var l = []
1336 try
1337 l->add('1')
1338 throw 'bad'
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001339 l->add('x') # "unreachable code"
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001340 catch /bad/
1341 l->add('2')
1342 try
1343 l->add('3')
1344 throw 'one'
1345 l->add('x')
1346 catch /one/
1347 l->add('4')
1348 try
1349 l->add('5')
1350 throw 'more'
1351 l->add('x')
1352 catch /more/
1353 l->add('6')
1354 endtry
1355 endtry
1356 endtry
1357 assert_equal(['1', '2', '3', '4', '5', '6'], l)
Bram Moolenaar834193a2021-06-30 20:39:15 +02001358
1359 l = []
1360 try
1361 try
1362 l->add('1')
1363 throw 'foo'
1364 l->add('x')
1365 catch
1366 l->add('2')
1367 throw 'bar'
1368 l->add('x')
1369 finally
1370 l->add('3')
1371 endtry
1372 l->add('x')
1373 catch /bar/
1374 l->add('4')
1375 endtry
1376 assert_equal(['1', '2', '3', '4'], l)
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001377enddef
1378
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001379call test_override('unreachable', 1)
1380defcompile Test_try_catch_nested
1381call test_override('unreachable', 0)
1382
Bram Moolenaar62aec932022-01-29 21:45:34 +00001383def s:TryOne(): number
Bram Moolenaar9939f572020-09-16 22:29:52 +02001384 try
1385 return 0
1386 catch
1387 endtry
1388 return 0
1389enddef
1390
Bram Moolenaar62aec932022-01-29 21:45:34 +00001391def s:TryTwo(n: number): string
Bram Moolenaar9939f572020-09-16 22:29:52 +02001392 try
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001393 var x = {}
Bram Moolenaar9939f572020-09-16 22:29:52 +02001394 catch
1395 endtry
1396 return 'text'
1397enddef
1398
1399def Test_try_catch_twice()
1400 assert_equal('text', TryOne()->TryTwo())
1401enddef
1402
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001403def Test_try_catch_match()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001404 var seq = 'a'
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001405 try
1406 throw 'something'
1407 catch /nothing/
1408 seq ..= 'x'
1409 catch /some/
1410 seq ..= 'b'
1411 catch /asdf/
1412 seq ..= 'x'
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001413 catch ?a\?sdf?
1414 seq ..= 'y'
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001415 finally
1416 seq ..= 'c'
1417 endtry
1418 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001419enddef
1420
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001421def Test_try_catch_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001422 v9.CheckDefFailure(['catch'], 'E603:')
1423 v9.CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1424 v9.CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1425 v9.CheckDefFailure(['finally'], 'E606:')
1426 v9.CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1427 v9.CheckDefFailure(['endtry'], 'E602:')
1428 v9.CheckDefFailure(['while 1', 'endtry'], 'E170:')
1429 v9.CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1430 v9.CheckDefFailure(['if 1', 'endtry'], 'E171:')
1431 v9.CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001432
Bram Moolenaar62aec932022-01-29 21:45:34 +00001433 v9.CheckDefFailure(['throw'], 'E1143:')
1434 v9.CheckDefFailure(['throw xxx'], 'E1001:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001435enddef
1436
Bram Moolenaar7c5b3c0362021-02-14 22:40:57 +01001437def Try_catch_skipped()
1438 var l = []
1439 try
1440 finally
1441 endtry
1442
1443 if 1
1444 else
1445 try
1446 endtry
1447 endif
1448enddef
1449
1450" The skipped try/endtry was updating the wrong instruction.
1451def Test_try_catch_skipped()
1452 var instr = execute('disassemble Try_catch_skipped')
1453 assert_match("NEWLIST size 0\n", instr)
1454enddef
1455
Bram Moolenaar90a57162022-02-12 14:23:17 +00001456def Test_throw_line_number()
1457 def Func()
1458 eval 1 + 1
1459 eval 2 + 2
1460 throw 'exception'
1461 enddef
Yee Cheng Chin2051af12025-01-09 22:14:34 +01001462 def Func2()
1463 eval 1 + 1
1464 eval 2 + 2
1465 eval 3 + 3
1466 throw 'exception'
1467 enddef
Bram Moolenaar90a57162022-02-12 14:23:17 +00001468 try
1469 Func()
1470 catch /exception/
Yee Cheng Chin2051af12025-01-09 22:14:34 +01001471 try
1472 Func2()
1473 catch /exception/
1474 assert_match('line 4', v:throwpoint)
1475 endtry
Bram Moolenaar90a57162022-02-12 14:23:17 +00001476 assert_match('line 3', v:throwpoint)
1477 endtry
Yee Cheng Chin2051af12025-01-09 22:14:34 +01001478 assert_match('', v:throwpoint)
Bram Moolenaar90a57162022-02-12 14:23:17 +00001479enddef
Bram Moolenaar7c5b3c0362021-02-14 22:40:57 +01001480
1481
Bram Moolenaar006ad482020-06-30 20:55:15 +02001482def Test_throw_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001483 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001484 var lines =<< trim END
Bram Moolenaar006ad482020-06-30 20:55:15 +02001485 vim9script
1486 try
1487 throw 'one'
1488 .. 'two'
1489 catch
1490 assert_equal('onetwo', v:exception)
1491 endtry
1492 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001493 v9.CheckScriptSuccess(lines)
Bram Moolenaar1e021e62020-10-16 20:25:23 +02001494
1495 lines =<< trim END
1496 vim9script
Bram Moolenaar352134b2020-10-17 22:04:08 +02001497 @r = ''
Bram Moolenaar1e021e62020-10-16 20:25:23 +02001498 def Func()
1499 throw @r
1500 enddef
1501 var result = ''
1502 try
1503 Func()
1504 catch /E1129:/
1505 result = 'caught'
1506 endtry
1507 assert_equal('caught', result)
1508 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001509 v9.CheckScriptSuccess(lines)
Bram Moolenaar006ad482020-06-30 20:55:15 +02001510enddef
1511
Bram Moolenaared677f52020-08-12 16:38:10 +02001512def Test_error_in_nested_function()
Bram Moolenaar03dfde22021-02-14 13:17:22 +01001513 # an error in a nested :function aborts executing in the calling :def function
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001514 var lines =<< trim END
Bram Moolenaared677f52020-08-12 16:38:10 +02001515 vim9script
1516 def Func()
1517 Error()
1518 g:test_var = 1
1519 enddef
1520 func Error() abort
1521 eval [][0]
1522 endfunc
1523 Func()
1524 END
1525 g:test_var = 0
Bram Moolenaar62aec932022-01-29 21:45:34 +00001526 v9.CheckScriptFailure(lines, 'E684:')
Bram Moolenaared677f52020-08-12 16:38:10 +02001527 assert_equal(0, g:test_var)
1528enddef
1529
Bram Moolenaar227c58a2021-04-28 20:40:44 +02001530def Test_abort_after_error()
1531 var lines =<< trim END
1532 vim9script
1533 while true
1534 echo notfound
1535 endwhile
1536 g:gotthere = true
1537 END
1538 g:gotthere = false
Bram Moolenaar62aec932022-01-29 21:45:34 +00001539 v9.CheckScriptFailure(lines, 'E121:')
Bram Moolenaar227c58a2021-04-28 20:40:44 +02001540 assert_false(g:gotthere)
1541 unlet g:gotthere
1542enddef
1543
Bram Moolenaar37c83712020-06-30 21:18:36 +02001544def Test_cexpr_vimscript()
John Marriott45377e22025-03-27 18:12:32 +01001545 CheckFeature quickfix
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001546 # only checks line continuation
Bram Moolenaar37c83712020-06-30 21:18:36 +02001547 set errorformat=File\ %f\ line\ %l
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001548 var lines =<< trim END
Bram Moolenaar37c83712020-06-30 21:18:36 +02001549 vim9script
1550 cexpr 'File'
1551 .. ' someFile' ..
1552 ' line 19'
1553 assert_equal(19, getqflist()[0].lnum)
1554 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001555 v9.CheckScriptSuccess(lines)
Bram Moolenaar397a87a2022-03-20 21:14:15 +00001556
1557 lines =<< trim END
1558 vim9script
1559 def CexprFail()
1560 au QuickfixCmdPre * echo g:doesnotexist
1561 cexpr 'File otherFile line 99'
1562 g:didContinue = 'yes'
1563 enddef
1564 CexprFail()
1565 g:didContinue = 'also'
1566 END
1567 g:didContinue = 'no'
1568 v9.CheckScriptFailure(lines, 'E121: Undefined variable: g:doesnotexist')
1569 assert_equal('no', g:didContinue)
1570 au! QuickfixCmdPre
1571
1572 lines =<< trim END
1573 vim9script
1574 def CexprFail()
1575 cexpr g:aNumber
1576 g:didContinue = 'yes'
1577 enddef
1578 CexprFail()
1579 g:didContinue = 'also'
1580 END
1581 g:aNumber = 123
1582 g:didContinue = 'no'
1583 v9.CheckScriptFailure(lines, 'E777: String or List expected')
1584 assert_equal('no', g:didContinue)
1585 unlet g:didContinue
1586
Bram Moolenaar37c83712020-06-30 21:18:36 +02001587 set errorformat&
1588enddef
1589
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001590def Test_statusline_syntax()
1591 # legacy syntax is used for 'statusline'
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001592 var lines =<< trim END
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001593 vim9script
1594 func g:Status()
1595 return '%{"x" is# "x"}'
1596 endfunc
1597 set laststatus=2 statusline=%!Status()
1598 redrawstatus
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00001599 set laststatus statusline=
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001600 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001601 v9.CheckScriptSuccess(lines)
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001602enddef
1603
Bram Moolenaarb2097502020-07-19 17:17:02 +02001604def Test_list_vimscript()
1605 # checks line continuation and comments
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001606 var lines =<< trim END
Bram Moolenaarb2097502020-07-19 17:17:02 +02001607 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001608 var mylist = [
Bram Moolenaarb2097502020-07-19 17:17:02 +02001609 'one',
1610 # comment
1611 'two', # empty line follows
1612
1613 'three',
1614 ]
1615 assert_equal(['one', 'two', 'three'], mylist)
1616 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001617 v9.CheckScriptSuccess(lines)
Bram Moolenaar66250c92020-08-20 15:02:42 +02001618
1619 # check all lines from heredoc are kept
1620 lines =<< trim END
1621 # comment 1
1622 two
1623 # comment 3
1624
1625 five
1626 # comment 6
1627 END
1628 assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
Bram Moolenaar4bce26b2021-01-22 22:06:56 +01001629
1630 lines =<< trim END
1631 [{
1632 a: 0}]->string()->assert_equal("[{'a': 0}]")
1633 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001634 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarb2097502020-07-19 17:17:02 +02001635enddef
1636
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001637if has('channel')
1638 let someJob = test_null_job()
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001639
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001640 def FuncWithError()
1641 echomsg g:someJob
1642 enddef
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001643
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001644 func Test_convert_emsg_to_exception()
1645 try
1646 call FuncWithError()
1647 catch
1648 call assert_match('Vim:E908:', v:exception)
1649 endtry
1650 endfunc
1651endif
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001652
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001653def Test_vim9script_mix()
1654 var lines =<< trim END
1655 if has(g:feature)
1656 " legacy script
1657 let g:legacy = 1
1658 finish
1659 endif
1660 vim9script
1661 g:legacy = 0
1662 END
1663 g:feature = 'eval'
1664 g:legacy = -1
Bram Moolenaar62aec932022-01-29 21:45:34 +00001665 v9.CheckScriptSuccess(lines)
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001666 assert_equal(1, g:legacy)
1667
1668 g:feature = 'noteval'
1669 g:legacy = -1
Bram Moolenaar62aec932022-01-29 21:45:34 +00001670 v9.CheckScriptSuccess(lines)
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001671 assert_equal(0, g:legacy)
1672enddef
1673
Bram Moolenaar750802b2020-02-23 18:08:33 +01001674def Test_vim9script_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001675 v9.CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
1676 v9.CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +01001677
Bram Moolenaar62aec932022-01-29 21:45:34 +00001678 v9.CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1679 v9.CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
Bram Moolenaarc785b9a2020-06-19 18:34:15 +02001680
Bram Moolenaare2e40752020-09-04 21:18:46 +02001681 assert_fails('vim9script', 'E1038:')
Bram Moolenaar107f7322022-02-06 17:30:41 +00001682 v9.CheckDefFailure(['vim9script'], 'E1038:')
Bram Moolenaar8cbf2492022-02-06 20:28:13 +00001683
1684 # no error when skipping
1685 if has('nothing')
1686 vim9script
1687 endif
Bram Moolenaarc970e422021-03-17 15:03:04 +01001688enddef
1689
Bram Moolenaar6c3843c2021-03-04 12:38:21 +01001690def Test_script_var_shadows_function()
1691 var lines =<< trim END
1692 vim9script
1693 def Func(): number
1694 return 123
1695 enddef
1696 var Func = 1
1697 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001698 v9.CheckScriptFailure(lines, 'E1041:', 5)
Bram Moolenaar6c3843c2021-03-04 12:38:21 +01001699enddef
1700
Bram Moolenaar052ff292021-12-11 13:54:46 +00001701def Test_function_shadows_script_var()
1702 var lines =<< trim END
1703 vim9script
1704 var Func = 1
1705 def Func(): number
1706 return 123
1707 enddef
1708 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001709 v9.CheckScriptFailure(lines, 'E1041:', 3)
Bram Moolenaar052ff292021-12-11 13:54:46 +00001710enddef
1711
Bram Moolenaarc3235272021-07-10 19:42:03 +02001712def Test_script_var_shadows_command()
1713 var lines =<< trim END
1714 var undo = 1
1715 undo = 2
1716 assert_equal(2, undo)
1717 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001718 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc3235272021-07-10 19:42:03 +02001719
1720 lines =<< trim END
1721 var undo = 1
1722 undo
1723 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001724 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaarc3235272021-07-10 19:42:03 +02001725enddef
1726
Bram Moolenaar2ef91562021-12-11 16:14:07 +00001727def Test_vim9script_call_wrong_type()
1728 var lines =<< trim END
1729 vim9script
1730 var Time = 'localtime'
1731 Time()
1732 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001733 v9.CheckScriptFailure(lines, 'E1085:')
Bram Moolenaar2ef91562021-12-11 16:14:07 +00001734enddef
1735
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001736def Test_vim9script_reload_delfunc()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001737 var first_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001738 vim9script
1739 def FuncYes(): string
1740 return 'yes'
1741 enddef
1742 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001743 var withno_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001744 def FuncNo(): string
1745 return 'no'
1746 enddef
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001747 def g:DoCheck(no_exists: bool)
1748 assert_equal('yes', FuncYes())
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001749 assert_equal('no', FuncNo())
1750 enddef
1751 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001752 var nono_lines =<< trim END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001753 def g:DoCheck(no_exists: bool)
1754 assert_equal('yes', FuncYes())
Bram Moolenaar44d66522020-09-06 22:26:57 +02001755 assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001756 enddef
1757 END
1758
1759 # FuncNo() is defined
Bram Moolenaardd674772022-09-15 22:26:18 +01001760 writefile(first_lines + withno_lines, 'Xreloaded.vim', 'D')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001761 source Xreloaded.vim
1762 g:DoCheck(true)
1763
1764 # FuncNo() is not redefined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001765 writefile(first_lines + nono_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001766 source Xreloaded.vim
Bram Moolenaar50824712020-12-20 21:10:17 +01001767 g:DoCheck(false)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001768
1769 # FuncNo() is back
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001770 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001771 source Xreloaded.vim
Bram Moolenaar50824712020-12-20 21:10:17 +01001772 g:DoCheck(false)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001773enddef
1774
Bram Moolenaar89483d42020-05-10 15:24:44 +02001775def Test_vim9script_reload_delvar()
1776 # write the script with a script-local variable
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001777 var lines =<< trim END
Bram Moolenaar89483d42020-05-10 15:24:44 +02001778 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001779 var name = 'string'
Bram Moolenaar89483d42020-05-10 15:24:44 +02001780 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001781 writefile(lines, 'XreloadVar.vim', 'D')
Bram Moolenaar89483d42020-05-10 15:24:44 +02001782 source XreloadVar.vim
1783
1784 # now write the script using the same variable locally - works
1785 lines =<< trim END
1786 vim9script
1787 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001788 var name = 'string'
Bram Moolenaar89483d42020-05-10 15:24:44 +02001789 enddef
1790 END
1791 writefile(lines, 'XreloadVar.vim')
1792 source XreloadVar.vim
Bram Moolenaar89483d42020-05-10 15:24:44 +02001793enddef
1794
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001795def Test_func_redefine_error()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001796 var lines = [
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001797 'vim9script',
1798 'def Func()',
1799 ' eval [][0]',
1800 'enddef',
1801 'Func()',
1802 ]
Bram Moolenaardd674772022-09-15 22:26:18 +01001803 writefile(lines, 'Xtestscript.vim', 'D')
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001804
1805 for count in range(3)
1806 try
1807 source Xtestscript.vim
1808 catch /E684/
1809 # function name should contain <SNR> every time
Bram Moolenaarec892232022-05-06 17:53:06 +01001810 assert_match('E684: List index out of range', v:exception)
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001811 assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1812 endtry
1813 endfor
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001814enddef
1815
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001816def Test_func_redefine_fails()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001817 var lines =<< trim END
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001818 vim9script
1819 def Func()
1820 echo 'one'
1821 enddef
1822 def Func()
1823 echo 'two'
1824 enddef
1825 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001826 v9.CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001827
1828 lines =<< trim END
1829 vim9script
1830 def Foo(): string
1831 return 'foo'
Bram Moolenaar052ff292021-12-11 13:54:46 +00001832 enddef
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001833 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001834 var Foo = {-> 'lambda'}
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001835 enddef
1836 defcompile
1837 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001838 v9.CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001839enddef
1840
Bram Moolenaar91c7cbf2022-08-18 13:28:31 +01001841def Test_lambda_split()
1842 # this was using freed memory, because of the split expression
1843 var lines =<< trim END
1844 vim9script
1845 try
1846 0
1847 0->(0
1848 ->a.0(
1849 ->u
1850 END
1851 v9.CheckScriptFailure(lines, 'E1050:')
1852enddef
1853
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001854def Test_fixed_size_list()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001855 # will be allocated as one piece of memory, check that changes work
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001856 var l = [1, 2, 3, 4]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001857 l->remove(0)
1858 l->add(5)
1859 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001860 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001861enddef
1862
Bram Moolenaarae616492020-07-28 20:07:27 +02001863def Test_no_insert_xit()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001864 v9.CheckDefExecFailure(['a = 1'], 'E1100:')
1865 v9.CheckDefExecFailure(['c = 1'], 'E1100:')
1866 v9.CheckDefExecFailure(['i = 1'], 'E1100:')
1867 v9.CheckDefExecFailure(['t = 1'], 'E1100:')
1868 v9.CheckDefExecFailure(['x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02001869
Bram Moolenaar62aec932022-01-29 21:45:34 +00001870 v9.CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1871 v9.CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1872 v9.CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1873 v9.CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1874 v9.CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1875 v9.CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1876 v9.CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
1877 v9.CheckScriptFailure(['vim9script', 'o'], 'E1100:')
1878 v9.CheckScriptFailure(['vim9script', 't'], 'E1100:')
1879 v9.CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1880 v9.CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02001881enddef
1882
Bram Moolenaar62aec932022-01-29 21:45:34 +00001883def s:IfElse(what: number): string
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001884 var res = ''
Bram Moolenaar158906c2020-02-06 20:39:45 +01001885 if what == 1
1886 res = "one"
1887 elseif what == 2
1888 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001889 else
Bram Moolenaar158906c2020-02-06 20:39:45 +01001890 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001891 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +01001892 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001893enddef
1894
Bram Moolenaar158906c2020-02-06 20:39:45 +01001895def Test_if_elseif_else()
1896 assert_equal('one', IfElse(1))
1897 assert_equal('two', IfElse(2))
1898 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001899enddef
1900
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001901def Test_if_elseif_else_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001902 v9.CheckDefFailure(['elseif true'], 'E582:')
1903 v9.CheckDefFailure(['else'], 'E581:')
1904 v9.CheckDefFailure(['endif'], 'E580:')
1905 v9.CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
1906 v9.CheckDefFailure(['if true', 'echo 1'], 'E171:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01001907
1908 var lines =<< trim END
1909 var s = ''
1910 if s = ''
1911 endif
1912 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001913 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01001914
1915 lines =<< trim END
1916 var s = ''
1917 if s == ''
1918 elseif s = ''
1919 endif
1920 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001921 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaarfa010cd2022-04-03 16:13:07 +01001922
1923 lines =<< trim END
1924 var cond = true
1925 if cond
1926 echo 'true'
1927 elseif
1928 echo 'false'
1929 endif
1930 END
1931 v9.CheckDefAndScriptFailure(lines, ['E1143:', 'E15:'], 4)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001932enddef
1933
Bram Moolenaar505ed0c2022-05-05 17:02:46 +01001934def Test_if_else_func_using_var()
1935 var lines =<< trim END
1936 vim9script
1937
1938 const debug = true
1939 if debug
1940 var mode_chars = 'something'
1941 def Bits2Ascii()
1942 var x = mode_chars
1943 g:where = 'in true'
1944 enddef
1945 else
1946 def Bits2Ascii()
1947 g:where = 'in false'
1948 enddef
1949 endif
1950
1951 Bits2Ascii()
1952 END
1953 v9.CheckScriptSuccess(lines)
1954 assert_equal('in true', g:where)
1955 unlet g:where
1956
1957 lines =<< trim END
1958 vim9script
1959
1960 const debug = false
1961 if debug
1962 var mode_chars = 'something'
1963 def Bits2Ascii()
1964 g:where = 'in true'
1965 enddef
1966 else
1967 def Bits2Ascii()
1968 var x = mode_chars
1969 g:where = 'in false'
1970 enddef
1971 endif
1972
1973 Bits2Ascii()
1974 END
1975 v9.CheckScriptFailure(lines, 'E1001: Variable not found: mode_chars')
1976enddef
1977
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001978let g:bool_true = v:true
1979let g:bool_false = v:false
1980
1981def Test_if_const_expr()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001982 var res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001983 if true ? true : false
1984 res = true
1985 endif
1986 assert_equal(true, res)
1987
Bram Moolenaar585fea72020-04-02 22:33:21 +02001988 g:glob = 2
1989 if false
Bram Moolenaar67979662020-06-20 22:50:47 +02001990 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001991 endif
1992 assert_equal(2, g:glob)
1993 if true
Bram Moolenaar67979662020-06-20 22:50:47 +02001994 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001995 endif
1996 assert_equal(3, g:glob)
1997
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001998 res = false
1999 if g:bool_true ? true : false
2000 res = true
2001 endif
2002 assert_equal(true, res)
2003
2004 res = false
2005 if true ? g:bool_true : false
2006 res = true
2007 endif
2008 assert_equal(true, res)
2009
2010 res = false
2011 if true ? true : g:bool_false
2012 res = true
2013 endif
2014 assert_equal(true, res)
2015
2016 res = false
2017 if true ? false : true
2018 res = true
2019 endif
2020 assert_equal(false, res)
2021
2022 res = false
2023 if false ? false : true
2024 res = true
2025 endif
2026 assert_equal(true, res)
2027
2028 res = false
2029 if false ? true : false
2030 res = true
2031 endif
2032 assert_equal(false, res)
2033
2034 res = false
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002035 if has('xyz') ? true : false
2036 res = true
2037 endif
2038 assert_equal(false, res)
2039
2040 res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002041 if true && true
2042 res = true
2043 endif
2044 assert_equal(true, res)
2045
2046 res = false
2047 if true && false
2048 res = true
2049 endif
2050 assert_equal(false, res)
2051
2052 res = false
2053 if g:bool_true && false
2054 res = true
2055 endif
2056 assert_equal(false, res)
2057
2058 res = false
2059 if true && g:bool_false
2060 res = true
2061 endif
2062 assert_equal(false, res)
2063
2064 res = false
2065 if false && false
2066 res = true
2067 endif
2068 assert_equal(false, res)
2069
2070 res = false
2071 if true || false
2072 res = true
2073 endif
2074 assert_equal(true, res)
2075
2076 res = false
2077 if g:bool_true || false
2078 res = true
2079 endif
2080 assert_equal(true, res)
2081
2082 res = false
2083 if true || g:bool_false
2084 res = true
2085 endif
2086 assert_equal(true, res)
2087
2088 res = false
2089 if false || false
2090 res = true
2091 endif
2092 assert_equal(false, res)
Bram Moolenaar3988f642020-08-27 22:43:03 +02002093
2094 # with constant "false" expression may be invalid so long as the syntax is OK
Bram Moolenaarc3235272021-07-10 19:42:03 +02002095 if false | eval 1 + 2 | endif
Bram Moolenaar3988f642020-08-27 22:43:03 +02002096 if false | eval burp + 234 | endif
2097 if false | echo burp 234 'asd' | endif
2098 if false
2099 burp
2100 endif
Bram Moolenaare525bdd2021-08-07 18:12:40 +02002101
Bram Moolenaar21ebb082022-02-04 21:58:58 +00002102 if 0
2103 if 1
2104 echo nothing
2105 elseif 1
2106 echo still nothing
2107 endif
2108 endif
2109
Bram Moolenaare525bdd2021-08-07 18:12:40 +02002110 # expression with line breaks skipped
2111 if false
2112 ('aaa'
2113 .. 'bbb'
2114 .. 'ccc'
2115 )->setline(1)
2116 endif
Yegappan Lakshmanane2038412024-12-14 19:59:24 +01002117
2118 if 1
2119 # do nothing
2120 else
2121 var [a] = [10]
2122 endif
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02002123enddef
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002124
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02002125def Test_if_const_expr_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00002126 v9.CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2127 v9.CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2128 v9.CheckDefFailure(["if has('aaa'"], 'E110:')
2129 v9.CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002130enddef
2131
Bram Moolenaar62aec932022-01-29 21:45:34 +00002132def s:RunNested(i: number): number
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002133 var x: number = 0
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002134 if i % 2
2135 if 1
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002136 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002137 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002138 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002139 endif
2140 x += 1
2141 else
2142 x += 1000
2143 endif
2144 return x
2145enddef
2146
2147def Test_nested_if()
2148 assert_equal(1, RunNested(1))
2149 assert_equal(1000, RunNested(2))
2150enddef
2151
Bram Moolenaarad39c092020-02-26 18:23:43 +01002152def Test_execute_cmd()
Bram Moolenaare4984292020-12-13 14:19:25 +01002153 # missing argument is ignored
2154 execute
2155 execute # comment
2156
Bram Moolenaarad39c092020-02-26 18:23:43 +01002157 new
2158 setline(1, 'default')
Bram Moolenaard2c61702020-09-06 15:58:36 +02002159 execute 'setline(1, "execute-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002160 assert_equal('execute-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002161
Bram Moolenaard2c61702020-09-06 15:58:36 +02002162 execute "setline(1, 'execute-string')"
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002163 assert_equal('execute-string', getline(1))
2164
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002165 var cmd1 = 'setline(1,'
2166 var cmd2 = '"execute-var")'
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002167 execute cmd1 cmd2 # comment
Bram Moolenaarad39c092020-02-26 18:23:43 +01002168 assert_equal('execute-var', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002169
Bram Moolenaard2c61702020-09-06 15:58:36 +02002170 execute cmd1 cmd2 '|setline(1, "execute-var-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002171 assert_equal('execute-var-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002172
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002173 var cmd_first = 'call '
2174 var cmd_last = 'setline(1, "execute-var-var")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002175 execute cmd_first .. cmd_last
2176 assert_equal('execute-var-var', getline(1))
2177 bwipe!
Bram Moolenaar585fea72020-04-02 22:33:21 +02002178
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002179 var n = true
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02002180 execute 'echomsg' (n ? '"true"' : '"no"')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002181 assert_match('^true$', g:Screenline(&lines))
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02002182
Bram Moolenaare0de1712020-12-02 17:36:54 +01002183 echomsg [1, 2, 3] {a: 1, b: 2}
Bram Moolenaar62aec932022-01-29 21:45:34 +00002184 assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', g:Screenline(&lines))
Bram Moolenaare5abf7a2020-08-16 18:29:35 +02002185
Bram Moolenaar62aec932022-01-29 21:45:34 +00002186 v9.CheckDefFailure(['execute xxx'], 'E1001:', 1)
2187 v9.CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2188 v9.CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
Bram Moolenaar0c7f2612022-02-17 19:44:07 +00002189 if has('channel')
2190 v9.CheckDefExecFailure(['execute test_null_channel()'], 'E908:', 1)
2191 endif
Bram Moolenaarad39c092020-02-26 18:23:43 +01002192enddef
2193
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002194def Test_execute_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002195 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002196 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002197 vim9script
2198 execute 'g:someVar'
2199 .. ' = ' ..
2200 '28'
2201 assert_equal(28, g:someVar)
2202 unlet g:someVar
2203 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002204 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002205enddef
2206
Bram Moolenaar43216612022-03-25 11:16:28 +00002207def Test_execute_finish()
2208 # the empty lines are relevant here
2209 var lines =<< trim END
2210 vim9script
2211
2212 var vname = "g:hello"
2213
2214 if exists(vname) | finish | endif | execute vname '= "world"'
2215
2216 assert_equal('world', g:hello)
2217
2218 if exists(vname) | finish | endif | execute vname '= "world"'
2219
2220 assert_report('should not be reached')
2221 END
2222 v9.CheckScriptSuccess(lines)
2223enddef
2224
Bram Moolenaarad39c092020-02-26 18:23:43 +01002225def Test_echo_cmd()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002226 echo 'some' # comment
Bram Moolenaar585fea72020-04-02 22:33:21 +02002227 echon 'thing'
Bram Moolenaar62aec932022-01-29 21:45:34 +00002228 assert_match('^something$', g:Screenline(&lines))
Bram Moolenaarad39c092020-02-26 18:23:43 +01002229
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002230 echo "some" # comment
2231 echon "thing"
Bram Moolenaar62aec932022-01-29 21:45:34 +00002232 assert_match('^something$', g:Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002233
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002234 var str1 = 'some'
2235 var str2 = 'more'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002236 echo str1 str2
Bram Moolenaar62aec932022-01-29 21:45:34 +00002237 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002238
Bram Moolenaar397a87a2022-03-20 21:14:15 +00002239 echo "one\ntwo"
2240 assert_match('^one$', g:Screenline(&lines - 1))
2241 assert_match('^two$', g:Screenline(&lines))
2242
Bram Moolenaar62aec932022-01-29 21:45:34 +00002243 v9.CheckDefFailure(['echo "xxx"# comment'], 'E488:')
Yegappan Lakshmanan22029ed2024-05-20 13:57:11 +02002244
2245 # Test for echoing a script local function name
2246 var lines =<< trim END
2247 vim9script
2248 def ScriptLocalEcho()
2249 enddef
2250 echo ScriptLocalEcho
2251 END
2252 new
2253 setline(1, lines)
2254 assert_match('<SNR>\d\+_ScriptLocalEcho', execute('source')->split("\n")[0])
2255 bw!
Bram Moolenaarad39c092020-02-26 18:23:43 +01002256enddef
2257
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002258def Test_echomsg_cmd()
2259 echomsg 'some' 'more' # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00002260 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002261 echo 'clear'
Bram Moolenaardf069ee2020-06-22 23:02:51 +02002262 :1messages
Bram Moolenaar62aec932022-01-29 21:45:34 +00002263 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002264
Bram Moolenaar62aec932022-01-29 21:45:34 +00002265 v9.CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002266enddef
2267
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002268def Test_echomsg_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002269 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002270 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002271 vim9script
2272 echomsg 'here'
2273 .. ' is ' ..
2274 'a message'
Bram Moolenaar62aec932022-01-29 21:45:34 +00002275 assert_match('^here is a message$', g:Screenline(&lines))
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002276 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002277 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002278enddef
2279
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002280def Test_echoerr_cmd()
Bram Moolenaar7de62622021-08-07 15:05:47 +02002281 var local = 'local'
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002282 try
Bram Moolenaar7de62622021-08-07 15:05:47 +02002283 echoerr 'something' local 'wrong' # comment
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002284 catch
Bram Moolenaar7de62622021-08-07 15:05:47 +02002285 assert_match('something local wrong', v:exception)
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002286 endtry
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002287enddef
2288
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002289def Test_echoerr_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002290 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002291 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002292 vim9script
2293 try
2294 echoerr 'this'
2295 .. ' is ' ..
2296 'wrong'
2297 catch
2298 assert_match('this is wrong', v:exception)
2299 endtry
2300 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002301 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002302enddef
2303
Bram Moolenaar7de62622021-08-07 15:05:47 +02002304def Test_echoconsole_cmd()
2305 var local = 'local'
2306 echoconsole 'something' local # comment
2307 # output goes anywhere
2308enddef
2309
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002310def Test_echowindow_cmd()
2311 var local = 'local'
2312 echowindow 'something' local # comment
Bram Moolenaar2435adf2022-10-21 12:05:46 +01002313
2314 # with modifier
2315 unsilent echowin 'loud'
2316
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002317 # output goes in message window
2318 popup_clear()
Yegappan Lakshmanane2038412024-12-14 19:59:24 +01002319
2320 # Invalid range
2321 var lines =<< trim END
2322 def Foo()
2323 :$echowindow "foo"
2324 enddef
2325 defcompile
2326 END
2327 v9.CheckDefAndScriptFailure(lines, 'E16: Invalid range')
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002328enddef
2329
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002330def Test_for_outside_of_function()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002331 var lines =<< trim END
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002332 vim9script
2333 new
2334 for var in range(0, 3)
2335 append(line('$'), var)
2336 endfor
2337 assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
2338 bwipe!
Bram Moolenaar522eefd2021-03-26 18:49:22 +01002339
2340 var result = ''
2341 for i in [1, 2, 3]
2342 var loop = ' loop ' .. i
2343 result ..= loop
2344 endfor
2345 assert_equal(' loop 1 loop 2 loop 3', result)
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002346 END
Bram Moolenaardd674772022-09-15 22:26:18 +01002347 writefile(lines, 'Xvim9for.vim', 'D')
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002348 source Xvim9for.vim
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002349enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002350
rbtnnbebf0692021-08-21 17:26:50 +02002351def Test_for_skipped_block()
2352 # test skipped blocks at outside of function
2353 var lines =<< trim END
2354 var result = []
2355 if true
2356 for n in [1, 2]
2357 result += [n]
2358 endfor
2359 else
2360 for n in [3, 4]
2361 result += [n]
2362 endfor
2363 endif
2364 assert_equal([1, 2], result)
2365
2366 result = []
2367 if false
2368 for n in [1, 2]
2369 result += [n]
2370 endfor
2371 else
2372 for n in [3, 4]
2373 result += [n]
2374 endfor
2375 endif
2376 assert_equal([3, 4], result)
2377 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002378 v9.CheckDefAndScriptSuccess(lines)
rbtnnbebf0692021-08-21 17:26:50 +02002379
2380 # test skipped blocks at inside of function
2381 lines =<< trim END
2382 def DefTrue()
2383 var result = []
2384 if true
2385 for n in [1, 2]
2386 result += [n]
2387 endfor
2388 else
2389 for n in [3, 4]
2390 result += [n]
2391 endfor
2392 endif
2393 assert_equal([1, 2], result)
2394 enddef
2395 DefTrue()
2396
2397 def DefFalse()
2398 var result = []
2399 if false
2400 for n in [1, 2]
2401 result += [n]
2402 endfor
2403 else
2404 for n in [3, 4]
2405 result += [n]
2406 endfor
2407 endif
2408 assert_equal([3, 4], result)
2409 enddef
2410 DefFalse()
Bram Moolenaar97f8c102022-04-02 19:43:57 +01002411
2412 def BuildDiagrams()
2413 var diagrams: list<any>
2414 if false
2415 var max = 0
2416 for v in diagrams
2417 var l = 3
2418 if max < l | max = l | endif
2419 v->add(l)
2420 endfor
2421 endif
2422 enddef
2423 BuildDiagrams()
rbtnnbebf0692021-08-21 17:26:50 +02002424 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002425 v9.CheckDefAndScriptSuccess(lines)
rbtnnbebf0692021-08-21 17:26:50 +02002426enddef
2427
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002428def Test_skipped_redir()
2429 var lines =<< trim END
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002430 def Tredir()
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002431 if 0
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002432 redir => l[0]
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002433 redir END
2434 endif
2435 enddef
2436 defcompile
2437 END
2438 v9.CheckScriptSuccess(lines)
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002439 delfunc g:Tredir
2440
2441 lines =<< trim END
2442 def Tredir()
2443 if 0
2444 redir => l[0]
2445 endif
2446 echo 'executed'
2447 if 0
2448 redir END
2449 endif
2450 enddef
2451 defcompile
2452 END
2453 v9.CheckScriptSuccess(lines)
2454 delfunc g:Tredir
2455
2456 lines =<< trim END
2457 def Tredir()
2458 var l = ['']
2459 if 1
2460 redir => l[0]
2461 endif
2462 echo 'executed'
2463 if 0
2464 redir END
2465 else
2466 redir END
2467 endif
2468 enddef
2469 defcompile
2470 END
2471 v9.CheckScriptSuccess(lines)
2472 delfunc g:Tredir
2473
2474 lines =<< trim END
2475 let doit = 1
2476 def Tredir()
2477 var l = ['']
2478 if g:doit
2479 redir => l[0]
2480 endif
2481 echo 'executed'
2482 if g:doit
2483 redir END
2484 endif
2485 enddef
2486 defcompile
2487 END
2488 v9.CheckScriptSuccess(lines)
2489 delfunc g:Tredir
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002490enddef
2491
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002492def Test_for_loop()
Bram Moolenaarf2253962021-04-13 20:53:13 +02002493 var lines =<< trim END
2494 var result = ''
2495 for cnt in range(7)
2496 if cnt == 4
2497 break
2498 endif
2499 if cnt == 2
2500 continue
2501 endif
2502 result ..= cnt .. '_'
2503 endfor
2504 assert_equal('0_1_3_', result)
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02002505
Bram Moolenaarf2253962021-04-13 20:53:13 +02002506 var concat = ''
2507 for str in eval('["one", "two"]')
2508 concat ..= str
2509 endfor
2510 assert_equal('onetwo', concat)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002511
Bram Moolenaarf2253962021-04-13 20:53:13 +02002512 var total = 0
2513 for nr in
2514 [1, 2, 3]
2515 total += nr
2516 endfor
2517 assert_equal(6, total)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002518
Bram Moolenaarf2253962021-04-13 20:53:13 +02002519 total = 0
2520 for nr
2521 in [1, 2, 3]
2522 total += nr
2523 endfor
2524 assert_equal(6, total)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002525
Bram Moolenaarf2253962021-04-13 20:53:13 +02002526 total = 0
2527 for nr
2528 in
2529 [1, 2, 3]
2530 total += nr
2531 endfor
2532 assert_equal(6, total)
Bram Moolenaar036d0712021-01-17 20:23:38 +01002533
Bram Moolenaara3589a02021-04-14 13:30:46 +02002534 # with type
2535 total = 0
2536 for n: number in [1, 2, 3]
2537 total += n
2538 endfor
2539 assert_equal(6, total)
2540
Bram Moolenaarefd73ae2022-03-20 18:51:00 +00002541 total = 0
2542 for b in 0z010203
2543 total += b
2544 endfor
2545 assert_equal(6, total)
2546
Bram Moolenaarfe090eb2021-04-15 21:48:32 +02002547 var chars = ''
2548 for s: string in 'foobar'
2549 chars ..= s
2550 endfor
2551 assert_equal('foobar', chars)
2552
Bram Moolenaar5ede5b22021-07-07 21:55:25 +02002553 chars = ''
2554 for x: string in {a: 'a', b: 'b'}->values()
2555 chars ..= x
2556 endfor
2557 assert_equal('ab', chars)
2558
Bram Moolenaara3589a02021-04-14 13:30:46 +02002559 # unpack with type
Bram Moolenaarf2253962021-04-13 20:53:13 +02002560 var res = ''
Bram Moolenaara3589a02021-04-14 13:30:46 +02002561 for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2562 res ..= n .. s
2563 endfor
2564 assert_equal('1a2b', res)
2565
Bram Moolenaar444d8782021-06-26 12:40:56 +02002566 # unpack with one var
2567 var reslist = []
2568 for [x] in [['aaa'], ['bbb']]
2569 reslist->add(x)
2570 endfor
2571 assert_equal(['aaa', 'bbb'], reslist)
2572
Bram Moolenaara3589a02021-04-14 13:30:46 +02002573 # loop over string
2574 res = ''
Bram Moolenaarf2253962021-04-13 20:53:13 +02002575 for c in 'aéc̀d'
2576 res ..= c .. '-'
2577 endfor
2578 assert_equal('a-é-c̀-d-', res)
2579
2580 res = ''
2581 for c in ''
2582 res ..= c .. '-'
2583 endfor
2584 assert_equal('', res)
2585
2586 res = ''
2587 for c in test_null_string()
2588 res ..= c .. '-'
2589 endfor
2590 assert_equal('', res)
2591
Bram Moolenaar10611952022-04-03 21:11:34 +01002592 total = 0
2593 for c in null_list
2594 total += 1
2595 endfor
2596 assert_equal(0, total)
2597
2598 for c in null_blob
2599 total += 1
2600 endfor
2601 assert_equal(0, total)
2602
Bram Moolenaarf2253962021-04-13 20:53:13 +02002603 var foo: list<dict<any>> = [
2604 {a: 'Cat'}
2605 ]
2606 for dd in foo
2607 dd.counter = 12
2608 endfor
2609 assert_equal([{a: 'Cat', counter: 12}], foo)
Bram Moolenaarad2d4962021-07-18 17:08:50 +02002610
2611 reslist = []
2612 for _ in range(3)
2613 reslist->add('x')
2614 endfor
2615 assert_equal(['x', 'x', 'x'], reslist)
Yegappan Lakshmanan4776e642024-05-19 09:06:50 +02002616
2617 # Test for trying to use the loop variable "_" inside the loop
2618 for _ in "a"
2619 assert_fails('echo _', 'E1181: Cannot use an underscore here')
2620 endfor
Bram Moolenaarf2253962021-04-13 20:53:13 +02002621 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002622 v9.CheckDefAndScriptSuccess(lines)
Yegappan Lakshmananfe424d12024-05-17 18:20:43 +02002623
2624 lines =<< trim END
2625 for i : number : [1, 2]
2626 echo i
2627 endfor
2628 END
2629 v9.CheckSourceDefAndScriptFailure(lines, 'E1059: No white space allowed before colon: : [1, 2]', 1)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002630enddef
2631
Bram Moolenaar159b2d52022-10-11 21:41:25 +01002632def Test_for_loop_list_of_lists()
2633 # loop variable is final, not const
2634 var lines =<< trim END
2635 # Filter out all odd numbers in each sublist
2636 var list: list<list<number>> = [[1], [1, 2], [1, 2, 3], [1, 2, 3, 4]]
2637 for i in list
2638 filter(i, (_, n: number): bool => n % 2 == 0)
2639 endfor
2640
2641 assert_equal([[], [2], [2], [2, 4]], list)
2642 END
2643 v9.CheckDefAndScriptSuccess(lines)
2644enddef
2645
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002646def Test_for_loop_with_closure()
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002647 # using the loop variable in a closure results in the last used value
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002648 var lines =<< trim END
2649 var flist: list<func>
2650 for i in range(5)
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002651 flist[i] = () => i
2652 endfor
2653 for i in range(5)
2654 assert_equal(4, flist[i]())
2655 endfor
2656 END
2657 v9.CheckDefAndScriptSuccess(lines)
2658
Bram Moolenaardd674772022-09-15 22:26:18 +01002659 # also works when the loop variable is used only once halfway the loops
2660 lines =<< trim END
2661 var Clo: func
2662 for i in range(5)
2663 if i == 3
2664 Clo = () => i
2665 endif
2666 endfor
2667 assert_equal(4, Clo())
2668 END
2669 v9.CheckDefAndScriptSuccess(lines)
2670
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002671 # using a local variable set to the loop variable in a closure results in the
2672 # value at that moment
2673 lines =<< trim END
2674 var flist: list<func>
2675 for i in range(5)
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002676 var inloop = i
2677 flist[i] = () => inloop
2678 endfor
2679 for i in range(5)
Bram Moolenaar353b68a2022-09-13 21:10:45 +01002680 assert_equal(i, flist[i]())
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002681 endfor
2682 END
Bram Moolenaar0cdfb7c2022-09-17 15:44:52 +01002683 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002684
Bram Moolenaara275f2c2022-10-11 20:04:09 +01002685 # also with an extra block level
2686 lines =<< trim END
2687 var flist: list<func>
2688 for i in range(5)
2689 {
2690 var inloop = i
2691 flist[i] = () => inloop
2692 }
2693 endfor
2694 for i in range(5)
2695 assert_equal(i, flist[i]())
2696 endfor
2697 END
2698 v9.CheckDefAndScriptSuccess(lines)
2699
2700 # and declaration in higher block
2701 lines =<< trim END
2702 var flist: list<func>
2703 for i in range(5)
2704 var inloop = i
2705 {
2706 flist[i] = () => inloop
2707 }
2708 endfor
2709 for i in range(5)
2710 assert_equal(i, flist[i]())
2711 endfor
2712 END
2713 v9.CheckDefAndScriptSuccess(lines)
2714
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002715 lines =<< trim END
2716 var flist: list<func>
2717 for i in range(5)
2718 var inloop = i
2719 flist[i] = () => {
2720 return inloop
2721 }
2722 endfor
2723 for i in range(5)
Bram Moolenaar353b68a2022-09-13 21:10:45 +01002724 assert_equal(i, flist[i]())
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002725 endfor
2726 END
Bram Moolenaar0cdfb7c2022-09-17 15:44:52 +01002727 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaardbbb02b2022-09-18 12:00:21 +01002728
2729 # Also works for a nested loop
2730 lines =<< trim END
2731 var flist: list<func>
2732 var n = 0
2733 for i in range(3)
2734 var ii = i
2735 for a in ['a', 'b', 'c']
2736 var aa = a
2737 flist[n] = () => ii .. aa
2738 ++n
2739 endfor
2740 endfor
2741
2742 n = 0
2743 for i in range(3)
2744 for a in ['a', 'b', 'c']
2745 assert_equal(i .. a, flist[n]())
2746 ++n
2747 endfor
2748 endfor
2749 END
Bram Moolenaarcc341812022-09-19 15:54:34 +01002750 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaare8e369a2022-09-21 18:59:14 +01002751
2752 # using two loop variables
2753 lines =<< trim END
2754 var lv_list: list<func>
2755 var copy_list: list<func>
2756 for [idx, c] in items('word')
2757 var lidx = idx
2758 var lc = c
2759 lv_list[idx] = () => {
2760 return idx .. c
2761 }
2762 copy_list[idx] = () => {
2763 return lidx .. lc
2764 }
2765 endfor
2766 for [i, c] in items('word')
2767 assert_equal(3 .. 'd', lv_list[i]())
2768 assert_equal(i .. c, copy_list[i]())
2769 endfor
2770 END
2771 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarcc341812022-09-19 15:54:34 +01002772enddef
2773
2774def Test_define_global_closure_in_loops()
2775 var lines =<< trim END
2776 vim9script
2777
2778 def Func()
2779 for i in range(3)
2780 var ii = i
2781 for a in ['a', 'b', 'c']
2782 var aa = a
2783 if ii == 0 && aa == 'a'
2784 def g:Global_0a(): string
2785 return ii .. aa
2786 enddef
2787 endif
2788 if ii == 1 && aa == 'b'
2789 def g:Global_1b(): string
2790 return ii .. aa
2791 enddef
2792 endif
2793 if ii == 2 && aa == 'c'
2794 def g:Global_2c(): string
2795 return ii .. aa
2796 enddef
2797 endif
2798 endfor
2799 endfor
2800 enddef
2801 Func()
2802 END
2803 v9.CheckScriptSuccess(lines)
2804 assert_equal("0a", g:Global_0a())
2805 assert_equal("1b", g:Global_1b())
2806 assert_equal("2c", g:Global_2c())
2807
2808 delfunc g:Global_0a
2809 delfunc g:Global_1b
2810 delfunc g:Global_2c
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002811enddef
2812
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002813def Test_for_loop_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00002814 v9.CheckDefAndScriptFailure(['for '], ['E1097:', 'E690:'])
2815 v9.CheckDefAndScriptFailure(['for x'], ['E1097:', 'E690:'])
2816 v9.CheckDefAndScriptFailure(['for x in'], ['E1097:', 'E15:'])
2817 v9.CheckDefAndScriptFailure(['for # in range(5)'], 'E690:')
2818 v9.CheckDefAndScriptFailure(['for i In range(5)'], 'E690:')
2819 v9.CheckDefAndScriptFailure(['var x = 5', 'for x in range(5)', 'endfor'], ['E1017:', 'E1041:'])
2820 v9.CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3)
2821 v9.CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01002822 delfunc! g:Func
Bram Moolenaar62aec932022-01-29 21:45:34 +00002823 v9.CheckDefFailure(['for i in xxx'], 'E1001:')
2824 v9.CheckDefFailure(['endfor'], 'E588:')
2825 v9.CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002826
2827 # wrong type detected at compile time
Bram Moolenaar62aec932022-01-29 21:45:34 +00002828 v9.CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002829
2830 # wrong type detected at runtime
2831 g:adict = {a: 1}
Bram Moolenaar62aec932022-01-29 21:45:34 +00002832 v9.CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002833 unlet g:adict
Bram Moolenaarf6a8d422021-04-13 21:48:03 +02002834
2835 var lines =<< trim END
2836 var d: list<dict<any>> = [{a: 0}]
2837 for e in d
2838 e = {a: 0, b: ''}
2839 endfor
2840 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002841 v9.CheckDefAndScriptFailure(lines, ['E1018:', 'E46:'], 3)
Bram Moolenaarfe090eb2021-04-15 21:48:32 +02002842
2843 lines =<< trim END
2844 for nr: number in ['foo']
2845 endfor
2846 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002847 v9.CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
Bram Moolenaar404557e2021-07-05 21:41:48 +02002848
2849 lines =<< trim END
2850 for n : number in [1, 2]
2851 echo n
2852 endfor
2853 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002854 v9.CheckDefAndScriptFailure(lines, 'E1059:', 1)
Bram Moolenaarefc5db52021-07-07 21:21:30 +02002855
2856 lines =<< trim END
2857 var d: dict<number> = {a: 1, b: 2}
2858 for [k: job, v: job] in d->items()
2859 echo k v
2860 endfor
2861 END
Bram Moolenaarbd3a9d22022-05-17 16:12:39 +01002862 v9.CheckDefExecAndScriptFailure(lines, ['E1163: Variable 1: type mismatch, expected job but got string', 'E1012: Type mismatch; expected job but got string'], 2)
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002863
2864 lines =<< trim END
2865 var i = 0
2866 for i in [1, 2, 3]
2867 echo i
2868 endfor
2869 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002870 v9.CheckDefExecAndScriptFailure(lines, ['E1017:', 'E1041:'])
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002871
2872 lines =<< trim END
2873 var l = [0]
2874 for l[0] in [1, 2, 3]
2875 echo l[0]
2876 endfor
2877 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002878 v9.CheckDefExecAndScriptFailure(lines, ['E461:', 'E1017:'])
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002879
2880 lines =<< trim END
2881 var d = {x: 0}
2882 for d.x in [1, 2, 3]
2883 echo d.x
2884 endfor
2885 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002886 v9.CheckDefExecAndScriptFailure(lines, ['E461:', 'E1017:'])
Bram Moolenaara1c51952022-02-02 16:20:26 +00002887
2888 lines =<< trim END
2889 var l: list<dict<any>> = [{a: 1, b: 'x'}]
2890 for item: dict<number> in l
2891 echo item
2892 endfor
2893 END
2894 v9.CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected dict<number> but got dict<any>')
2895
2896 lines =<< trim END
2897 var l: list<dict<any>> = [{n: 1}]
2898 for item: dict<number> in l
Bram Moolenaarfa103972022-09-29 19:14:42 +01002899 var d = {s: ''}
2900 d->extend(item)
Bram Moolenaara1c51952022-02-02 16:20:26 +00002901 endfor
2902 END
Bram Moolenaarfa103972022-09-29 19:14:42 +01002903 v9.CheckDefExecAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected dict<string> but got dict<number>')
Bram Moolenaarcc341812022-09-19 15:54:34 +01002904
2905 lines =<< trim END
2906 for a in range(3)
2907 while a > 3
2908 for b in range(2)
2909 while b < 0
2910 for c in range(5)
2911 while c > 6
2912 while c < 0
2913 for d in range(1)
2914 for e in range(3)
2915 while e > 3
2916 endwhile
2917 endfor
2918 endfor
2919 endwhile
2920 endwhile
2921 endfor
2922 endwhile
2923 endfor
2924 endwhile
2925 endfor
2926 END
2927 v9.CheckDefSuccess(lines)
2928
2929 v9.CheckDefFailure(['for x in range(3)'] + lines + ['endfor'], 'E1306:')
Yegappan Lakshmanan062bb6b2023-12-16 14:46:40 +01002930
2931 # Test for too many for loops
2932 lines =<< trim END
2933 vim9script
2934 def Foo()
2935 for a in range(1)
2936 for b in range(1)
2937 for c in range(1)
2938 for d in range(1)
2939 for e in range(1)
2940 for f in range(1)
2941 for g in range(1)
2942 for h in range(1)
2943 for i in range(1)
2944 for j in range(1)
2945 for k in range(1)
2946 endfor
2947 endfor
2948 endfor
2949 endfor
2950 endfor
2951 endfor
2952 endfor
2953 endfor
2954 endfor
2955 endfor
2956 endfor
2957 enddef
2958 defcompile
2959 END
2960 v9.CheckSourceFailure(lines, 'E1306: Loop nesting too deep', 11)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002961enddef
2962
Bram Moolenaarea870692020-12-02 14:24:30 +01002963def Test_for_loop_script_var()
2964 # cannot use s:var in a :def function
Bram Moolenaar62aec932022-01-29 21:45:34 +00002965 v9.CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1254:')
Bram Moolenaarea870692020-12-02 14:24:30 +01002966
2967 # can use s:var in Vim9 script, with or without s:
2968 var lines =<< trim END
2969 vim9script
2970 var total = 0
2971 for s:var in [1, 2, 3]
2972 total += s:var
2973 endfor
2974 assert_equal(6, total)
2975
2976 total = 0
2977 for var in [1, 2, 3]
2978 total += var
2979 endfor
2980 assert_equal(6, total)
2981 END
2982enddef
2983
Bram Moolenaar792f7862020-11-23 08:31:18 +01002984def Test_for_loop_unpack()
Bram Moolenaar792f7862020-11-23 08:31:18 +01002985 var lines =<< trim END
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002986 var result = []
2987 for [v1, v2] in [[1, 2], [3, 4]]
2988 result->add(v1)
2989 result->add(v2)
2990 endfor
2991 assert_equal([1, 2, 3, 4], result)
2992
2993 result = []
2994 for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2995 result->add(v1)
2996 result->add(v2)
2997 result->add(v3)
2998 endfor
2999 assert_equal([1, 2, [], 3, 4, [5, 6]], result)
3000
3001 result = []
3002 for [&ts, &sw] in [[1, 2], [3, 4]]
3003 result->add(&ts)
3004 result->add(&sw)
3005 endfor
3006 assert_equal([1, 2, 3, 4], result)
3007
3008 var slist: list<string>
3009 for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
3010 slist->add($LOOPVAR)
3011 slist->add(@r)
3012 slist->add(v:errmsg)
3013 endfor
3014 assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
3015
3016 slist = []
3017 for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
3018 slist->add(g:globalvar)
3019 slist->add(b:bufvar)
3020 slist->add(w:winvar)
3021 slist->add(t:tabvar)
3022 endfor
3023 assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
Bram Moolenaarf6c177a2020-12-04 17:38:00 +01003024 unlet! g:globalvar b:bufvar w:winvar t:tabvar
Bram Moolenaarb777da92021-05-22 21:40:39 +02003025
3026 var res = []
3027 for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
3028 res->add(n)
3029 endfor
3030 assert_equal([2, 5], res)
Bram Moolenaar61efa162022-03-18 13:10:48 +00003031
3032 var text: list<string> = ["hello there", "goodbye now"]
3033 var splitted = ''
3034 for [first; next] in mapnew(text, (i, v) => split(v))
3035 splitted ..= string(first) .. string(next) .. '/'
3036 endfor
3037 assert_equal("'hello'['there']/'goodbye'['now']/", splitted)
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01003038 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003039 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01003040
3041 lines =<< trim END
Bram Moolenaar792f7862020-11-23 08:31:18 +01003042 for [v1, v2] in [[1, 2, 3], [3, 4]]
3043 echo v1 v2
3044 endfor
3045 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003046 v9.CheckDefExecFailure(lines, 'E710:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01003047
3048 lines =<< trim END
3049 for [v1, v2] in [[1], [3, 4]]
3050 echo v1 v2
3051 endfor
3052 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003053 v9.CheckDefExecFailure(lines, 'E711:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01003054
3055 lines =<< trim END
3056 for [v1, v1] in [[1, 2], [3, 4]]
3057 echo v1
3058 endfor
3059 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003060 v9.CheckDefExecFailure(lines, 'E1017:', 1)
Bram Moolenaar95e4dd82022-04-27 22:15:40 +01003061
3062 lines =<< trim END
3063 for [a, b] in g:listlist
3064 echo a
3065 endfor
3066 END
3067 g:listlist = [1, 2, 3]
3068 v9.CheckDefExecFailure(lines, 'E1140:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01003069enddef
3070
Bram Moolenaarc150c092021-02-13 15:02:46 +01003071def Test_for_loop_with_try_continue()
Bram Moolenaarf2253962021-04-13 20:53:13 +02003072 var lines =<< trim END
3073 var looped = 0
3074 var cleanup = 0
3075 for i in range(3)
3076 looped += 1
3077 try
3078 eval [][0]
3079 catch
3080 continue
3081 finally
3082 cleanup += 1
3083 endtry
3084 endfor
3085 assert_equal(3, looped)
3086 assert_equal(3, cleanup)
3087 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003088 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc150c092021-02-13 15:02:46 +01003089enddef
3090
rbtnnd895b1d2021-08-20 20:54:25 +02003091def Test_while_skipped_block()
3092 # test skipped blocks at outside of function
3093 var lines =<< trim END
3094 var result = []
3095 var n = 0
3096 if true
3097 n = 1
3098 while n < 3
3099 result += [n]
3100 n += 1
3101 endwhile
3102 else
3103 n = 3
3104 while n < 5
3105 result += [n]
3106 n += 1
3107 endwhile
3108 endif
3109 assert_equal([1, 2], result)
3110
3111 result = []
3112 if false
3113 n = 1
3114 while n < 3
3115 result += [n]
3116 n += 1
3117 endwhile
3118 else
3119 n = 3
3120 while n < 5
3121 result += [n]
3122 n += 1
3123 endwhile
3124 endif
3125 assert_equal([3, 4], result)
3126 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003127 v9.CheckDefAndScriptSuccess(lines)
rbtnnd895b1d2021-08-20 20:54:25 +02003128
3129 # test skipped blocks at inside of function
3130 lines =<< trim END
3131 def DefTrue()
3132 var result = []
3133 var n = 0
3134 if true
3135 n = 1
3136 while n < 3
3137 result += [n]
3138 n += 1
3139 endwhile
3140 else
3141 n = 3
3142 while n < 5
3143 result += [n]
3144 n += 1
3145 endwhile
3146 endif
3147 assert_equal([1, 2], result)
3148 enddef
3149 DefTrue()
3150
3151 def DefFalse()
3152 var result = []
3153 var n = 0
3154 if false
3155 n = 1
3156 while n < 3
3157 result += [n]
3158 n += 1
3159 endwhile
3160 else
3161 n = 3
3162 while n < 5
3163 result += [n]
3164 n += 1
3165 endwhile
3166 endif
3167 assert_equal([3, 4], result)
3168 enddef
3169 DefFalse()
3170 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003171 v9.CheckDefAndScriptSuccess(lines)
rbtnnd895b1d2021-08-20 20:54:25 +02003172enddef
3173
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003174def Test_while_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003175 var result = ''
3176 var cnt = 0
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003177 while cnt < 555
3178 if cnt == 3
3179 break
3180 endif
3181 cnt += 1
3182 if cnt == 2
3183 continue
3184 endif
3185 result ..= cnt .. '_'
3186 endwhile
3187 assert_equal('1_3_', result)
Bram Moolenaardee37dc2021-02-07 16:40:05 +01003188
3189 var s = ''
Bram Moolenaar4b3e1962021-03-18 21:37:55 +01003190 while s == 'x' # {comment}
Bram Moolenaardee37dc2021-02-07 16:40:05 +01003191 endwhile
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003192enddef
3193
Bram Moolenaar7a53f292021-11-22 18:31:02 +00003194def Test_while_loop_in_script()
3195 var lines =<< trim END
3196 vim9script
3197 var result = ''
3198 var cnt = 0
3199 while cnt < 3
3200 var s = 'v' .. cnt
3201 result ..= s
3202 cnt += 1
3203 endwhile
3204 assert_equal('v0v1v2', result)
3205 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003206 v9.CheckScriptSuccess(lines)
Bram Moolenaar7a53f292021-11-22 18:31:02 +00003207enddef
3208
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02003209def Test_while_loop_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00003210 v9.CheckDefFailure(['while xxx'], 'E1001:')
3211 v9.CheckDefFailure(['endwhile'], 'E588:')
3212 v9.CheckDefFailure(['continue'], 'E586:')
3213 v9.CheckDefFailure(['if true', 'continue'], 'E586:')
3214 v9.CheckDefFailure(['break'], 'E587:')
3215 v9.CheckDefFailure(['if true', 'break'], 'E587:')
3216 v9.CheckDefFailure(['while 1', 'echo 3'], 'E170:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01003217
3218 var lines =<< trim END
3219 var s = ''
3220 while s = ''
3221 endwhile
3222 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003223 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaarbd5da372020-03-31 23:13:10 +02003224enddef
3225
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01003226def Test_interrupt_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003227 var caught = false
3228 var x = 0
Bram Moolenaar97acfc72020-03-22 13:44:28 +01003229 try
3230 while 1
3231 x += 1
3232 if x == 100
3233 feedkeys("\<C-C>", 'Lt')
3234 endif
3235 endwhile
3236 catch
3237 caught = true
3238 assert_equal(100, x)
3239 endtry
3240 assert_true(caught, 'should have caught an exception')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02003241 # consume the CTRL-C
3242 getchar(0)
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01003243enddef
Bram Moolenaar20431c92020-03-20 18:39:46 +01003244
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003245def Test_automatic_line_continuation()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003246 var mylist = [
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003247 'one',
3248 'two',
3249 'three',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003250 ] # comment
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003251 assert_equal(['one', 'two', 'three'], mylist)
3252
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003253 var mydict = {
Bram Moolenaare0de1712020-12-02 17:36:54 +01003254 ['one']: 1,
3255 ['two']: 2,
3256 ['three']:
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003257 3,
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003258 } # comment
Bram Moolenaare0de1712020-12-02 17:36:54 +01003259 assert_equal({one: 1, two: 2, three: 3}, mydict)
3260 mydict = {
Bram Moolenaar2c330432020-04-13 14:41:35 +02003261 one: 1, # comment
3262 two: # comment
3263 2, # comment
3264 three: 3 # comment
3265 }
Bram Moolenaare0de1712020-12-02 17:36:54 +01003266 assert_equal({one: 1, two: 2, three: 3}, mydict)
3267 mydict = {
Bram Moolenaar2c330432020-04-13 14:41:35 +02003268 one: 1,
3269 two:
3270 2,
3271 three: 3
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003272 }
Bram Moolenaare0de1712020-12-02 17:36:54 +01003273 assert_equal({one: 1, two: 2, three: 3}, mydict)
Bram Moolenaare6085c52020-04-12 20:19:16 +02003274
3275 assert_equal(
3276 ['one', 'two', 'three'],
3277 split('one two three')
3278 )
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003279enddef
3280
Bram Moolenaar7a092242020-04-16 22:10:49 +02003281def Test_vim9_comment()
Bram Moolenaar62aec932022-01-29 21:45:34 +00003282 v9.CheckScriptSuccess([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003283 'vim9script',
3284 '# something',
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003285 '#something',
Bram Moolenaar3f74c0a2022-08-06 18:12:06 +01003286 '#{{something',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003287 ])
Bram Moolenaar3f74c0a2022-08-06 18:12:06 +01003288 v9.CheckScriptFailure([
3289 'vim9script',
3290 '#{something',
3291 ], 'E1170:')
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003292
Bram Moolenaarb18b4962022-09-02 21:55:50 +01003293 split Xv9cfile
Bram Moolenaar62aec932022-01-29 21:45:34 +00003294 v9.CheckScriptSuccess([
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003295 'vim9script',
3296 'edit #something',
3297 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003298 v9.CheckScriptSuccess([
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003299 'vim9script',
3300 'edit #{something',
3301 ])
3302 close
3303
Bram Moolenaar62aec932022-01-29 21:45:34 +00003304 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003305 'vim9script',
3306 ':# something',
3307 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003308 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003309 '# something',
3310 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003311 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003312 ':# something',
3313 ], 'E488:')
3314
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003315 { # block start
3316 } # block end
Bram Moolenaar62aec932022-01-29 21:45:34 +00003317 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003318 '{# comment',
3319 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003320 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003321 '{',
3322 '}# comment',
3323 ], 'E488:')
3324
3325 echo "yes" # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00003326 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003327 'echo "yes"# comment',
3328 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003329 v9.CheckScriptSuccess([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003330 'vim9script',
3331 'echo "yes" # something',
3332 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003333 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003334 'vim9script',
3335 'echo "yes"# something',
3336 ], 'E121:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003337 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003338 'vim9script',
3339 'echo# something',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003340 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003341 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003342 'echo "yes" # something',
3343 ], 'E121:')
3344
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003345 exe "echo" # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00003346 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003347 'exe "echo"# comment',
3348 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003349 v9.CheckScriptSuccess([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003350 'vim9script',
3351 'exe "echo" # something',
3352 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003353 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003354 'vim9script',
3355 'exe "echo"# something',
3356 ], 'E121:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003357 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003358 'vim9script',
3359 'exe# something',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003360 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003361 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003362 'exe "echo" # something',
3363 ], 'E121:')
3364
Bram Moolenaar62aec932022-01-29 21:45:34 +00003365 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003366 'try# comment',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003367 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003368 'catch',
3369 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003370 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003371 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003372 'vim9script',
3373 'try# comment',
3374 'echo "yes"',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003375 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003376 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003377 'try',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003378 ' throw#comment',
3379 'catch',
3380 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003381 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003382 v9.CheckDefFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003383 'try',
3384 ' throw "yes"#comment',
3385 'catch',
3386 'endtry',
3387 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003388 v9.CheckDefFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003389 'try',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003390 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003391 'catch# comment',
3392 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003393 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003394 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003395 'vim9script',
3396 'try',
3397 ' echo "yes"',
3398 'catch# comment',
3399 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003400 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003401 v9.CheckDefFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003402 'try',
3403 ' echo "yes"',
3404 'catch /pat/# comment',
3405 'endtry',
3406 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003407 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003408 'try',
3409 'echo "yes"',
3410 'catch',
3411 'endtry# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003412 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003413 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003414 'vim9script',
3415 'try',
3416 ' echo "yes"',
3417 'catch',
3418 'endtry# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003419 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003420
Bram Moolenaar62aec932022-01-29 21:45:34 +00003421 v9.CheckScriptSuccess([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003422 'vim9script',
3423 'hi # comment',
3424 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003425 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003426 'vim9script',
3427 'hi# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003428 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003429 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003430 'vim9script',
3431 'hi Search # comment',
3432 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003433 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003434 'vim9script',
3435 'hi Search# comment',
3436 ], 'E416:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003437 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003438 'vim9script',
3439 'hi link This Search # comment',
3440 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003441 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003442 'vim9script',
3443 'hi link This That# comment',
3444 ], 'E413:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003445 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003446 'vim9script',
3447 'hi clear This # comment',
3448 'hi clear # comment',
3449 ])
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003450 # not tested, because it doesn't give an error but a warning:
3451 # hi clear This# comment',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003452 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003453 'vim9script',
3454 'hi clear# comment',
3455 ], 'E416:')
3456
Bram Moolenaar62aec932022-01-29 21:45:34 +00003457 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003458 'vim9script',
3459 'hi Group term=bold',
3460 'match Group /todo/ # comment',
3461 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003462 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003463 'vim9script',
3464 'hi Group term=bold',
3465 'match Group /todo/# comment',
3466 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003467 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003468 'vim9script',
3469 'match # comment',
3470 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003471 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003472 'vim9script',
3473 'match# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003474 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003475 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003476 'vim9script',
3477 'match none # comment',
3478 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003479 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003480 'vim9script',
3481 'match none# comment',
3482 ], 'E475:')
3483
Bram Moolenaar62aec932022-01-29 21:45:34 +00003484 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003485 'vim9script',
3486 'menutrans clear # comment',
3487 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003488 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003489 'vim9script',
3490 'menutrans clear# comment text',
3491 ], 'E474:')
3492
Bram Moolenaar62aec932022-01-29 21:45:34 +00003493 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003494 'vim9script',
3495 'syntax clear # comment',
3496 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003497 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003498 'vim9script',
3499 'syntax clear# comment text',
3500 ], 'E28:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003501 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003502 'vim9script',
3503 'syntax keyword Word some',
3504 'syntax clear Word # comment',
3505 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003506 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003507 'vim9script',
3508 'syntax keyword Word some',
3509 'syntax clear Word# comment text',
3510 ], 'E28:')
3511
Bram Moolenaar62aec932022-01-29 21:45:34 +00003512 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003513 'vim9script',
3514 'syntax list # comment',
3515 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003516 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003517 'vim9script',
3518 'syntax list# comment text',
3519 ], 'E28:')
3520
Bram Moolenaar62aec932022-01-29 21:45:34 +00003521 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003522 'vim9script',
3523 'syntax match Word /pat/ oneline # comment',
3524 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003525 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003526 'vim9script',
3527 'syntax match Word /pat/ oneline# comment',
3528 ], 'E475:')
3529
Bram Moolenaar62aec932022-01-29 21:45:34 +00003530 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003531 'vim9script',
3532 'syntax keyword Word word # comm[ent',
3533 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003534 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003535 'vim9script',
3536 'syntax keyword Word word# comm[ent',
3537 ], 'E789:')
3538
Bram Moolenaar62aec932022-01-29 21:45:34 +00003539 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003540 'vim9script',
3541 'syntax match Word /pat/ # comment',
3542 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003543 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003544 'vim9script',
3545 'syntax match Word /pat/# comment',
3546 ], 'E402:')
3547
Bram Moolenaar62aec932022-01-29 21:45:34 +00003548 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003549 'vim9script',
3550 'syntax match Word /pat/ contains=Something # comment',
3551 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003552 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003553 'vim9script',
3554 'syntax match Word /pat/ contains=Something# comment',
3555 ], 'E475:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003556 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003557 'vim9script',
3558 'syntax match Word /pat/ contains= # comment',
3559 ], 'E406:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003560 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003561 'vim9script',
3562 'syntax match Word /pat/ contains=# comment',
3563 ], 'E475:')
3564
Bram Moolenaar62aec932022-01-29 21:45:34 +00003565 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003566 'vim9script',
3567 'syntax region Word start=/pat/ end=/pat/ # comment',
3568 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003569 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003570 'vim9script',
3571 'syntax region Word start=/pat/ end=/pat/# comment',
Bram Moolenaard032f342020-07-18 18:13:02 +02003572 ], 'E402:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02003573
Bram Moolenaar62aec932022-01-29 21:45:34 +00003574 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003575 'vim9script',
3576 'syntax sync # comment',
3577 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003578 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003579 'vim9script',
3580 'syntax sync# comment',
3581 ], 'E404:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003582 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003583 'vim9script',
3584 'syntax sync ccomment # comment',
3585 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003586 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003587 'vim9script',
3588 'syntax sync ccomment# comment',
3589 ], 'E404:')
3590
Bram Moolenaar62aec932022-01-29 21:45:34 +00003591 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003592 'vim9script',
3593 'syntax cluster Some contains=Word # comment',
3594 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003595 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003596 'vim9script',
3597 'syntax cluster Some contains=Word# comment',
3598 ], 'E475:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003599
Bram Moolenaar62aec932022-01-29 21:45:34 +00003600 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003601 'vim9script',
3602 'command Echo echo # comment',
3603 'command Echo # comment',
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003604 'delcommand Echo',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003605 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003606 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003607 'vim9script',
3608 'command Echo echo# comment',
3609 'Echo',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003610 ], 'E1144:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003611 delcommand Echo
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003612
3613 var curdir = getcwd()
Bram Moolenaar62aec932022-01-29 21:45:34 +00003614 v9.CheckScriptSuccess([
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003615 'command Echo cd " comment',
3616 'Echo',
3617 'delcommand Echo',
3618 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003619 v9.CheckScriptSuccess([
Bram Moolenaar090728a2020-12-20 15:43:31 +01003620 'vim9script',
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003621 'command Echo cd # comment',
3622 'Echo',
3623 'delcommand Echo',
3624 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003625 v9.CheckScriptFailure([
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003626 'vim9script',
3627 'command Echo cd " comment',
3628 'Echo',
3629 ], 'E344:')
3630 delcommand Echo
3631 chdir(curdir)
3632
Bram Moolenaar62aec932022-01-29 21:45:34 +00003633 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003634 'vim9script',
3635 'command Echo# comment',
3636 ], 'E182:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003637 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003638 'vim9script',
3639 'command Echo echo',
3640 'command Echo# comment',
3641 ], 'E182:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003642 delcommand Echo
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003643
Bram Moolenaar62aec932022-01-29 21:45:34 +00003644 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003645 'vim9script',
3646 'function # comment',
3647 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003648 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003649 'vim9script',
Bram Moolenaar98981072020-07-29 14:40:25 +02003650 'function " comment',
3651 ], 'E129:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003652 v9.CheckScriptFailure([
Bram Moolenaar98981072020-07-29 14:40:25 +02003653 'vim9script',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003654 'function# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003655 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003656 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003657 'vim9script',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003658 'import "./vim9.vim" as v9',
3659 'function v9.CheckScriptSuccess # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003660 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003661 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003662 'vim9script',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003663 'import "./vim9.vim" as v9',
3664 'function v9.CheckScriptSuccess# comment',
3665 ], 'E1048: Item not found in script: CheckScriptSuccess#')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003666
Bram Moolenaar62aec932022-01-29 21:45:34 +00003667 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003668 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003669 'func g:DeleteMeA()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003670 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003671 'delfunction g:DeleteMeA # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003672 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003673 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003674 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003675 'func g:DeleteMeB()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003676 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003677 'delfunction g:DeleteMeB# comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003678 ], 'E488:')
3679
Bram Moolenaar62aec932022-01-29 21:45:34 +00003680 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003681 'vim9script',
3682 'call execute("ls") # comment',
3683 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003684 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003685 'vim9script',
3686 'call execute("ls")# comment',
3687 ], 'E488:')
Bram Moolenaare7e48382020-07-22 18:17:08 +02003688
Bram Moolenaar62aec932022-01-29 21:45:34 +00003689 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003690 'def Test() " comment',
3691 'enddef',
3692 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003693 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003694 'vim9script',
3695 'def Test() " comment',
3696 'enddef',
3697 ], 'E488:')
3698
Bram Moolenaar62aec932022-01-29 21:45:34 +00003699 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003700 'func Test() " comment',
3701 'endfunc',
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003702 'delfunc Test',
Bram Moolenaare7e48382020-07-22 18:17:08 +02003703 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003704 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003705 'vim9script',
3706 'func Test() " comment',
3707 'endfunc',
Bram Moolenaar98981072020-07-29 14:40:25 +02003708 ])
Bram Moolenaare7e48382020-07-22 18:17:08 +02003709
Bram Moolenaar62aec932022-01-29 21:45:34 +00003710 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003711 'def Test() # comment',
3712 'enddef',
3713 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003714 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003715 'func Test() # comment',
3716 'endfunc',
3717 ], 'E488:')
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003718
3719 var lines =<< trim END
3720 vim9script
3721 syn region Text
3722 \ start='foo'
3723 #\ comment
3724 \ end='bar'
Bram Moolenaar5072b472021-06-03 21:56:10 +02003725 syn region Text start='foo'
3726 #\ comment
3727 \ end='bar'
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003728 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003729 v9.CheckScriptSuccess(lines)
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003730
3731 lines =<< trim END
3732 vim9script
3733 syn region Text
3734 \ start='foo'
3735 "\ comment
3736 \ end='bar'
3737 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003738 v9.CheckScriptFailure(lines, 'E399:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003739enddef
3740
3741def Test_vim9_comment_gui()
3742 CheckCanRunGui
3743
Bram Moolenaar62aec932022-01-29 21:45:34 +00003744 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003745 'vim9script',
3746 'gui#comment'
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003747 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003748 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003749 'vim9script',
3750 'gui -f#comment'
Bram Moolenaarb8bd2e62021-08-21 17:13:14 +02003751 ], 'E194:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02003752enddef
3753
Bram Moolenaara26b9702020-04-18 19:53:28 +02003754def Test_vim9_comment_not_compiled()
Bram Moolenaar67979662020-06-20 22:50:47 +02003755 au TabEnter *.vim g:entered = 1
3756 au TabEnter *.x g:entered = 2
Bram Moolenaara26b9702020-04-18 19:53:28 +02003757
3758 edit test.vim
3759 doautocmd TabEnter #comment
3760 assert_equal(1, g:entered)
3761
3762 doautocmd TabEnter f.x
3763 assert_equal(2, g:entered)
3764
3765 g:entered = 0
3766 doautocmd TabEnter f.x #comment
3767 assert_equal(2, g:entered)
3768
3769 assert_fails('doautocmd Syntax#comment', 'E216:')
3770
3771 au! TabEnter
3772 unlet g:entered
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003773
Bram Moolenaar62aec932022-01-29 21:45:34 +00003774 v9.CheckScriptSuccess([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003775 'vim9script',
Bram Moolenaar67979662020-06-20 22:50:47 +02003776 'g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003777 'b:var = 456',
3778 'w:var = 777',
3779 't:var = 888',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003780 'unlet g:var w:var # something',
3781 ])
3782
Bram Moolenaar62aec932022-01-29 21:45:34 +00003783 v9.CheckScriptFailure([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003784 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003785 'let var = 123',
3786 ], 'E1126: Cannot use :let in Vim9 script')
3787
Bram Moolenaar62aec932022-01-29 21:45:34 +00003788 v9.CheckScriptFailure([
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003789 'vim9script',
3790 'var g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003791 ], 'E1016: Cannot declare a global variable:')
3792
Bram Moolenaar62aec932022-01-29 21:45:34 +00003793 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003794 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003795 'var b:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003796 ], 'E1016: Cannot declare a buffer variable:')
3797
Bram Moolenaar62aec932022-01-29 21:45:34 +00003798 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003799 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003800 'var w:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003801 ], 'E1016: Cannot declare a window variable:')
3802
Bram Moolenaar62aec932022-01-29 21:45:34 +00003803 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003804 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003805 'var t:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003806 ], 'E1016: Cannot declare a tab variable:')
3807
Bram Moolenaar62aec932022-01-29 21:45:34 +00003808 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003809 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003810 'var v:version = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003811 ], 'E1016: Cannot declare a v: variable:')
3812
Bram Moolenaar62aec932022-01-29 21:45:34 +00003813 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003814 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003815 'var $VARIABLE = "text"',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003816 ], 'E1016: Cannot declare an environment variable:')
Bram Moolenaar67979662020-06-20 22:50:47 +02003817
Bram Moolenaar62aec932022-01-29 21:45:34 +00003818 v9.CheckScriptFailure([
Bram Moolenaar67979662020-06-20 22:50:47 +02003819 'vim9script',
3820 'g:var = 123',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003821 'unlet g:var# comment1',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003822 ], 'E108:')
3823
Bram Moolenaar62aec932022-01-29 21:45:34 +00003824 v9.CheckScriptFailure([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003825 'let g:var = 123',
3826 'unlet g:var # something',
3827 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003828
Bram Moolenaar62aec932022-01-29 21:45:34 +00003829 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003830 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003831 'if 1 # comment2',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003832 ' echo "yes"',
3833 'elseif 2 #comment',
3834 ' echo "no"',
3835 'endif',
3836 ])
3837
Bram Moolenaar62aec932022-01-29 21:45:34 +00003838 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003839 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003840 'if 1# comment3',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003841 ' echo "yes"',
3842 'endif',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003843 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003844
Bram Moolenaar62aec932022-01-29 21:45:34 +00003845 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003846 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003847 'if 0 # comment4',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003848 ' echo "yes"',
3849 'elseif 2#comment',
3850 ' echo "no"',
3851 'endif',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003852 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003853
Bram Moolenaar62aec932022-01-29 21:45:34 +00003854 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003855 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003856 'var v = 1 # comment5',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003857 ])
3858
Bram Moolenaar62aec932022-01-29 21:45:34 +00003859 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003860 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003861 'var v = 1# comment6',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003862 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003863
Bram Moolenaar62aec932022-01-29 21:45:34 +00003864 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003865 'vim9script',
Bram Moolenaar2984ed32022-08-20 14:51:17 +01003866 'new',
Bram Moolenaard2c61702020-09-06 15:58:36 +02003867 'setline(1, ["# define pat", "last"])',
Bram Moolenaardf069ee2020-06-22 23:02:51 +02003868 ':$',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003869 'dsearch /pat/ #comment',
3870 'bwipe!',
3871 ])
3872
Bram Moolenaar62aec932022-01-29 21:45:34 +00003873 v9.CheckScriptFailure([
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003874 'vim9script',
Bram Moolenaar2984ed32022-08-20 14:51:17 +01003875 'new',
Bram Moolenaard2c61702020-09-06 15:58:36 +02003876 'setline(1, ["# define pat", "last"])',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003877 ':$',
3878 'dsearch /pat/#comment',
3879 'bwipe!',
3880 ], 'E488:')
3881
Bram Moolenaar62aec932022-01-29 21:45:34 +00003882 v9.CheckScriptFailure([
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003883 'vim9script',
3884 'func! SomeFunc()',
3885 ], 'E477:')
Bram Moolenaara26b9702020-04-18 19:53:28 +02003886enddef
3887
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003888def Test_finish()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003889 var lines =<< trim END
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003890 vim9script
Bram Moolenaar67979662020-06-20 22:50:47 +02003891 g:res = 'one'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003892 if v:false | finish | endif
Bram Moolenaar67979662020-06-20 22:50:47 +02003893 g:res = 'two'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003894 finish
Bram Moolenaar67979662020-06-20 22:50:47 +02003895 g:res = 'three'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003896 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003897 writefile(lines, 'Xfinished', 'D')
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003898 source Xfinished
3899 assert_equal('two', g:res)
3900
3901 unlet g:res
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003902enddef
3903
Bram Moolenaara5d00772020-05-14 23:20:55 +02003904def Test_forward_declaration()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003905 var lines =<< trim END
Bram Moolenaara5d00772020-05-14 23:20:55 +02003906 vim9script
Bram Moolenaara5d00772020-05-14 23:20:55 +02003907 def GetValue(): string
3908 return theVal
3909 enddef
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003910 var theVal = 'something'
Bram Moolenaar822ba242020-05-24 23:00:18 +02003911 g:initVal = GetValue()
Bram Moolenaara5d00772020-05-14 23:20:55 +02003912 theVal = 'else'
3913 g:laterVal = GetValue()
3914 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003915 writefile(lines, 'Xforward', 'D')
Bram Moolenaara5d00772020-05-14 23:20:55 +02003916 source Xforward
3917 assert_equal('something', g:initVal)
3918 assert_equal('else', g:laterVal)
3919
3920 unlet g:initVal
3921 unlet g:laterVal
Bram Moolenaara5d00772020-05-14 23:20:55 +02003922enddef
3923
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003924def Test_declare_script_var_in_func()
Bram Moolenaare535db82021-03-31 21:07:24 +02003925 var lines =<< trim END
3926 vim9script
3927 func Declare()
3928 let s:local = 123
3929 endfunc
3930 Declare()
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003931 END
3932 v9.CheckScriptFailure(lines, 'E1269:')
3933enddef
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00003934
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003935def Test_lock_script_var()
3936 var lines =<< trim END
3937 vim9script
3938 var local = 123
Bram Moolenaare535db82021-03-31 21:07:24 +02003939 assert_equal(123, local)
3940
3941 var error: string
3942 try
3943 local = 'asdf'
3944 catch
3945 error = v:exception
3946 endtry
3947 assert_match('E1012: Type mismatch; expected number but got string', error)
3948
3949 lockvar local
3950 try
3951 local = 999
3952 catch
3953 error = v:exception
3954 endtry
3955 assert_match('E741: Value is locked: local', error)
3956 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003957 v9.CheckScriptSuccess(lines)
Bram Moolenaare535db82021-03-31 21:07:24 +02003958enddef
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00003959
Bram Moolenaare535db82021-03-31 21:07:24 +02003960
Bram Moolenaar7d699702020-08-14 20:52:28 +02003961func Test_vim9script_not_global()
3962 " check that items defined in Vim9 script are script-local, not global
3963 let vim9lines =<< trim END
3964 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003965 var name = 'local'
Bram Moolenaar7d699702020-08-14 20:52:28 +02003966 func TheFunc()
3967 echo 'local'
3968 endfunc
3969 def DefFunc()
3970 echo 'local'
3971 enddef
3972 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003973 call writefile(vim9lines, 'Xvim9script.vim', 'D')
Bram Moolenaar7d699702020-08-14 20:52:28 +02003974 source Xvim9script.vim
3975 try
3976 echo g:var
3977 assert_report('did not fail')
3978 catch /E121:/
3979 " caught
3980 endtry
3981 try
3982 call TheFunc()
3983 assert_report('did not fail')
3984 catch /E117:/
3985 " caught
3986 endtry
3987 try
3988 call DefFunc()
3989 assert_report('did not fail')
3990 catch /E117:/
3991 " caught
3992 endtry
Bram Moolenaar7d699702020-08-14 20:52:28 +02003993endfunc
3994
Bram Moolenaareeb27bf2020-07-04 17:39:10 +02003995def Test_vim9_copen()
John Marriott45377e22025-03-27 18:12:32 +01003996 CheckFeature quickfix
Bram Moolenaareeb27bf2020-07-04 17:39:10 +02003997 # this was giving an error for setting w:quickfix_title
3998 copen
3999 quit
4000enddef
4001
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02004002def Test_script_var_in_autocmd()
4003 # using a script variable from an autocommand, defined in a :def function in a
4004 # legacy Vim script, cannot check the variable type.
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004005 var lines =<< trim END
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02004006 let s:counter = 1
4007 def s:Func()
4008 au! CursorHold
4009 au CursorHold * s:counter += 1
4010 enddef
4011 call s:Func()
4012 doau CursorHold
4013 call assert_equal(2, s:counter)
4014 au! CursorHold
4015 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004016 v9.CheckScriptSuccess(lines)
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02004017enddef
4018
Bram Moolenaarb5841b92021-07-15 18:09:53 +02004019def Test_error_in_autoload_script()
4020 var save_rtp = &rtp
4021 var dir = getcwd() .. '/Xruntime'
4022 &rtp = dir
Bram Moolenaardd674772022-09-15 22:26:18 +01004023 mkdir(dir .. '/autoload', 'pR')
Bram Moolenaarb5841b92021-07-15 18:09:53 +02004024
4025 var lines =<< trim END
4026 vim9script noclear
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00004027 export def Autoloaded()
Bram Moolenaarb5841b92021-07-15 18:09:53 +02004028 enddef
4029 def Broken()
4030 var x: any = ''
4031 eval x != 0
4032 enddef
4033 Broken()
4034 END
4035 writefile(lines, dir .. '/autoload/script.vim')
4036
4037 lines =<< trim END
4038 vim9script
4039 def CallAutoloaded()
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00004040 script#Autoloaded()
Bram Moolenaarb5841b92021-07-15 18:09:53 +02004041 enddef
4042
4043 function Legacy()
4044 try
4045 call s:CallAutoloaded()
4046 catch
4047 call assert_match('E1030: Using a String as a Number', v:exception)
4048 endtry
4049 endfunction
4050
4051 Legacy()
4052 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004053 v9.CheckScriptSuccess(lines)
Bram Moolenaarb5841b92021-07-15 18:09:53 +02004054
4055 &rtp = save_rtp
Bram Moolenaarb5841b92021-07-15 18:09:53 +02004056enddef
4057
Bram Moolenaar6809ff92022-07-26 15:10:56 +01004058def Test_error_in_autoload_script_foldexpr()
4059 var save_rtp = &rtp
Bram Moolenaardd674772022-09-15 22:26:18 +01004060 mkdir('Xvim/autoload', 'pR')
Bram Moolenaar6809ff92022-07-26 15:10:56 +01004061 &runtimepath = 'Xvim'
4062
4063 var lines =<< trim END
4064 vim9script
4065 eval [][0]
4066 echomsg 'no error'
4067 END
4068 lines->writefile('Xvim/autoload/script.vim')
4069
4070 lines =<< trim END
4071 vim9script
4072 import autoload 'script.vim'
4073 &foldmethod = 'expr'
4074 &foldexpr = 'script.Func()'
4075 redraw
4076 END
4077 v9.CheckScriptFailure(lines, 'E684: List index out of range: 0')
Bram Moolenaar6809ff92022-07-26 15:10:56 +01004078enddef
4079
Bram Moolenaare3d46852020-08-29 13:39:17 +02004080def Test_invalid_sid()
4081 assert_fails('func <SNR>1234_func', 'E123:')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02004082
Bram Moolenaar62aec932022-01-29 21:45:34 +00004083 if g:RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
Bram Moolenaard2c61702020-09-06 15:58:36 +02004084 assert_equal([], readfile('Xdidit'))
Bram Moolenaare3d46852020-08-29 13:39:17 +02004085 endif
4086 delete('Xdidit')
4087enddef
4088
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004089def Test_restoring_cpo()
Bram Moolenaardd674772022-09-15 22:26:18 +01004090 writefile(['vim9script', 'set nocp'], 'Xsourced', 'D')
4091 writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00004092 if g:RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004093 assert_equal(['done'], readfile('Xdone'))
4094 endif
Bram Moolenaar090728a2020-12-20 15:43:31 +01004095 delete('Xdone')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004096
Bram Moolenaardd674772022-09-15 22:26:18 +01004097 writefile(['vim9script', 'g:cpoval = &cpo'], 'XanotherScript', 'D')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004098 set cpo=aABceFsMny>
4099 edit XanotherScript
4100 so %
4101 assert_equal('aABceFsMny>', &cpo)
Christian Brabandt22105fd2024-07-15 20:51:11 +02004102 assert_equal('aABceFsz', g:cpoval)
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004103 :1del
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004104 setline(1, 'let g:cpoval = &cpo')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004105 w
4106 so %
4107 assert_equal('aABceFsMny>', &cpo)
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004108 assert_equal('aABceFsMny>', g:cpoval)
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004109
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004110 set cpo&vim
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004111 unlet g:cpoval
4112
4113 if has('unix')
4114 # 'cpo' is not restored in main vimrc
4115 var save_HOME = $HOME
4116 $HOME = getcwd() .. '/Xhome'
Bram Moolenaardd674772022-09-15 22:26:18 +01004117 mkdir('Xhome', 'R')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004118 var lines =<< trim END
4119 vim9script
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004120 writefile(['before: ' .. &cpo], 'Xrporesult')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004121 set cpo+=M
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004122 writefile(['after: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004123 END
4124 writefile(lines, 'Xhome/.vimrc')
4125
4126 lines =<< trim END
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004127 call writefile(['later: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004128 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004129 writefile(lines, 'Xlegacy', 'D')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004130
4131 lines =<< trim END
4132 vim9script
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004133 call writefile(['vim9: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004134 qa
4135 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004136 writefile(lines, 'Xvim9', 'D')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004137
Bram Moolenaar62aec932022-01-29 21:45:34 +00004138 var cmd = g:GetVimCommand() .. " -S Xlegacy -S Xvim9"
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004139 cmd = substitute(cmd, '-u NONE', '', '')
4140 exe "silent !" .. cmd
4141
4142 assert_equal([
Christian Brabandt22105fd2024-07-15 20:51:11 +02004143 'before: aABceFsz',
4144 'after: aABceFszM',
4145 'later: aABceFszM',
4146 'vim9: aABceFsz'], readfile('Xrporesult'))
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004147
4148 $HOME = save_HOME
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004149 delete('Xrporesult')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004150 endif
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004151enddef
4152
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004153" Use :function so we can use Check commands
4154func Test_no_redraw_when_restoring_cpo()
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004155 CheckScreendump
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004156 CheckFeature timers
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004157 call Run_test_no_redraw_when_restoring_cpo()
4158endfunc
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004159
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004160def Run_test_no_redraw_when_restoring_cpo()
4161 var lines =<< trim END
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004162 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00004163 export def Func()
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004164 enddef
4165 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004166 mkdir('Xnordir/autoload', 'pR')
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01004167 writefile(lines, 'Xnordir/autoload/script.vim')
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004168
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004169 lines =<< trim END
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004170 vim9script
4171 set cpo+=M
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01004172 exe 'set rtp^=' .. getcwd() .. '/Xnordir'
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00004173 au CmdlineEnter : ++once timer_start(0, (_) => script#Func())
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004174 setline(1, 'some text')
4175 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004176 writefile(lines, 'XTest_redraw_cpo', 'D')
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004177 var buf = g:RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
4178 term_sendkeys(buf, "V:")
4179 g:VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004180
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004181 # clean up
4182 term_sendkeys(buf, "\<Esc>u")
4183 g:StopVimInTerminal(buf)
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004184enddef
4185
4186func Test_reject_declaration()
4187 CheckScreendump
4188 call Run_test_reject_declaration()
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004189endfunc
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004190
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004191def Run_test_reject_declaration()
4192 var buf = g:RunVimInTerminal('', {'rows': 6})
4193 term_sendkeys(buf, ":vim9cmd var x: number\<CR>")
Bram Moolenaar330a3882022-03-05 11:05:57 +00004194 g:VerifyScreenDump(buf, 'Test_vim9_reject_declaration_1', {})
4195 term_sendkeys(buf, ":\<CR>")
4196 term_sendkeys(buf, ":vim9cmd g:foo = 123 | echo g:foo\<CR>")
4197 g:VerifyScreenDump(buf, 'Test_vim9_reject_declaration_2', {})
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004198
4199 # clean up
4200 g:StopVimInTerminal(buf)
4201enddef
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004202
Bram Moolenaar204852a2022-03-05 12:56:44 +00004203def Test_minimal_command_name_length()
4204 var names = [
4205 'cons',
4206 'brea',
4207 'cat',
4208 'catc',
4209 'con',
Bram Moolenaarb2175222022-03-05 20:24:41 +00004210 'cont',
4211 'conti',
4212 'contin',
4213 'continu',
Bram Moolenaar204852a2022-03-05 12:56:44 +00004214 'el',
4215 'els',
4216 'elsei',
4217 'endfo',
4218 'en',
4219 'end',
4220 'endi',
4221 'endw',
4222 'endt',
4223 'endtr',
Bram Moolenaarb2175222022-03-05 20:24:41 +00004224 'exp',
4225 'expo',
4226 'expor',
Bram Moolenaar204852a2022-03-05 12:56:44 +00004227 'fina',
4228 'finall',
Bram Moolenaard523c7b2022-03-06 14:51:22 +00004229 'fini',
4230 'finis',
Bram Moolenaarb2175222022-03-05 20:24:41 +00004231 'imp',
4232 'impo',
4233 'impor',
4234 'retu',
4235 'retur',
Bram Moolenaar204852a2022-03-05 12:56:44 +00004236 'th',
4237 'thr',
4238 'thro',
4239 'wh',
4240 'whi',
4241 'whil',
4242 ]
4243 for name in names
4244 v9.CheckDefAndScriptFailure([name .. ' '], 'E1065:')
4245 endfor
Bram Moolenaarb2175222022-03-05 20:24:41 +00004246
4247 var lines =<< trim END
4248 vim9script
4249 def SomeFunc()
4250 endd
4251 END
4252 v9.CheckScriptFailure(lines, 'E1065:')
4253 lines =<< trim END
4254 vim9script
4255 def SomeFunc()
4256 endde
4257 END
4258 v9.CheckScriptFailure(lines, 'E1065:')
Bram Moolenaar204852a2022-03-05 12:56:44 +00004259enddef
4260
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004261def Test_unset_any_variable()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004262 var lines =<< trim END
4263 var name: any
4264 assert_equal(0, name)
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004265 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004266 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004267enddef
4268
Bram Moolenaar7e9210e2020-09-25 23:12:51 +02004269func Test_define_func_at_command_line()
Bram Moolenaar58dbef32020-09-25 22:13:05 +02004270 CheckRunVimInTerminal
4271
Bram Moolenaar7e9210e2020-09-25 23:12:51 +02004272 " call indirectly to avoid compilation error for missing functions
4273 call Run_Test_define_func_at_command_line()
4274endfunc
4275
4276def Run_Test_define_func_at_command_line()
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004277 # run in a separate Vim instance to avoid the script context
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004278 var lines =<< trim END
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004279 func CheckAndQuit()
4280 call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
4281 call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
4282 endfunc
4283 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004284 writefile([''], 'Xdidcmd', 'D')
4285 writefile(lines, 'XcallFunc', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00004286 var buf = g:RunVimInTerminal('-S XcallFunc', {rows: 6})
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004287 # define Afunc() on the command line
4288 term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
4289 term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004290 g:WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004291
Bram Moolenaar62aec932022-01-29 21:45:34 +00004292 call g:StopVimInTerminal(buf)
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004293enddef
4294
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004295def Test_script_var_scope()
4296 var lines =<< trim END
4297 vim9script
4298 if true
4299 if true
4300 var one = 'one'
4301 echo one
4302 endif
4303 echo one
4304 endif
4305 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004306 v9.CheckScriptFailure(lines, 'E121:', 7)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004307
4308 lines =<< trim END
4309 vim9script
4310 if true
4311 if false
4312 var one = 'one'
4313 echo one
4314 else
4315 var one = 'one'
4316 echo one
4317 endif
4318 echo one
4319 endif
4320 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004321 v9.CheckScriptFailure(lines, 'E121:', 10)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004322
4323 lines =<< trim END
4324 vim9script
4325 while true
4326 var one = 'one'
4327 echo one
4328 break
4329 endwhile
4330 echo one
4331 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004332 v9.CheckScriptFailure(lines, 'E121:', 7)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004333
4334 lines =<< trim END
4335 vim9script
4336 for i in range(1)
4337 var one = 'one'
4338 echo one
4339 endfor
4340 echo one
4341 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004342 v9.CheckScriptFailure(lines, 'E121:', 6)
Bram Moolenaar9becdf22020-10-10 21:33:48 +02004343
4344 lines =<< trim END
4345 vim9script
4346 {
4347 var one = 'one'
4348 assert_equal('one', one)
4349 }
4350 assert_false(exists('one'))
4351 assert_false(exists('s:one'))
4352 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004353 v9.CheckScriptSuccess(lines)
Bram Moolenaar9becdf22020-10-10 21:33:48 +02004354
4355 lines =<< trim END
4356 vim9script
4357 {
4358 var one = 'one'
4359 echo one
4360 }
4361 echo one
4362 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004363 v9.CheckScriptFailure(lines, 'E121:', 6)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004364enddef
4365
Bram Moolenaar352134b2020-10-17 22:04:08 +02004366def Test_catch_exception_in_callback()
4367 var lines =<< trim END
4368 vim9script
Bram Moolenaar2a389082021-04-09 20:24:31 +02004369 def Callback(...l: list<any>)
Bram Moolenaar352134b2020-10-17 22:04:08 +02004370 try
4371 var x: string
4372 var y: string
4373 # this error should be caught with CHECKLEN
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +00004374 var sl = ['']
4375 [x, y] = sl
Bram Moolenaar352134b2020-10-17 22:04:08 +02004376 catch
4377 g:caught = 'yes'
4378 endtry
4379 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01004380 popup_menu('popup', {callback: Callback})
Bram Moolenaar352134b2020-10-17 22:04:08 +02004381 feedkeys("\r", 'xt')
4382 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004383 v9.CheckScriptSuccess(lines)
Bram Moolenaar352134b2020-10-17 22:04:08 +02004384
4385 unlet g:caught
4386enddef
4387
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004388def Test_no_unknown_error_after_error()
4389 if !has('unix') || !has('job')
4390 throw 'Skipped: not unix of missing +job feature'
4391 endif
Bram Moolenaarb16ff292021-09-26 20:14:39 +01004392 # FIXME: this check should not be needed
4393 if has('win32')
4394 throw 'Skipped: does not work on MS-Windows'
4395 endif
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004396 var lines =<< trim END
4397 vim9script
4398 var source: list<number>
Bram Moolenaar2a389082021-04-09 20:24:31 +02004399 def Out_cb(...l: list<any>)
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004400 eval [][0]
4401 enddef
Bram Moolenaar2a389082021-04-09 20:24:31 +02004402 def Exit_cb(...l: list<any>)
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004403 sleep 1m
Bram Moolenaar23d44492022-05-04 16:24:57 +01004404 g:did_call_exit_cb = true
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004405 source += l
4406 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01004407 var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
Bram Moolenaar6f17a3f2020-12-21 18:11:24 +01004408 while job_status(myjob) == 'run'
4409 sleep 10m
4410 endwhile
Bram Moolenaar206c2a62021-01-31 14:04:44 +01004411 # wait for Exit_cb() to be called
Bram Moolenaar23d44492022-05-04 16:24:57 +01004412 for x in range(100)
4413 if exists('g:did_call_exit_cb')
4414 unlet g:did_call_exit_cb
4415 break
4416 endif
4417 sleep 10m
4418 endfor
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004419 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004420 writefile(lines, 'Xdef', 'D')
Yee Cheng Chin69a8bb82022-11-06 12:25:47 +00004421 # Either the exit or out callback is called first, accept them in any order
4422 assert_fails('so Xdef', ['E684:\|E1012:', 'E1012:\|E684:'])
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004423enddef
4424
Bram Moolenaar4324d872020-12-01 20:12:24 +01004425def InvokeNormal()
4426 exe "norm! :m+1\r"
4427enddef
4428
4429def Test_invoke_normal_in_visual_mode()
4430 xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
4431 new
4432 setline(1, ['aaa', 'bbb'])
4433 feedkeys("V\<F3>", 'xt')
4434 assert_equal(['bbb', 'aaa'], getline(1, 2))
4435 xunmap <F3>
4436enddef
4437
Bram Moolenaarb5b94802020-12-13 17:50:20 +01004438def Test_white_space_after_command()
4439 var lines =<< trim END
4440 exit_cb: Func})
4441 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004442 v9.CheckDefAndScriptFailure(lines, 'E1144:', 1)
Bram Moolenaarf8103f22020-12-25 17:36:27 +01004443
4444 lines =<< trim END
4445 e#
4446 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004447 v9.CheckDefAndScriptFailure(lines, 'E1144:', 1)
Bram Moolenaarb5b94802020-12-13 17:50:20 +01004448enddef
4449
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004450def Test_script_var_gone_when_sourced_twice()
4451 var lines =<< trim END
4452 vim9script
4453 if exists('g:guard')
4454 finish
4455 endif
4456 g:guard = 1
4457 var name = 'thename'
4458 def g:GetName(): string
4459 return name
4460 enddef
4461 def g:SetName(arg: string)
4462 name = arg
4463 enddef
4464 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004465 writefile(lines, 'XscriptTwice.vim', 'D')
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004466 so XscriptTwice.vim
4467 assert_equal('thename', g:GetName())
4468 g:SetName('newname')
4469 assert_equal('newname', g:GetName())
4470 so XscriptTwice.vim
4471 assert_fails('call g:GetName()', 'E1149:')
4472 assert_fails('call g:SetName("x")', 'E1149:')
4473
4474 delfunc g:GetName
4475 delfunc g:SetName
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004476 unlet g:guard
4477enddef
4478
Bram Moolenaar10b94212021-02-19 21:42:57 +01004479def Test_unsupported_commands()
4480 var lines =<< trim END
4481 ka
4482 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004483 v9.CheckDefAndScriptFailure(lines, ['E476:', 'E492:'])
Bram Moolenaar10b94212021-02-19 21:42:57 +01004484
4485 lines =<< trim END
Bram Moolenaarada1d872021-02-20 08:16:51 +01004486 :1ka
4487 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004488 v9.CheckDefAndScriptFailure(lines, ['E476:', 'E492:'])
Bram Moolenaarada1d872021-02-20 08:16:51 +01004489
4490 lines =<< trim END
Yegappan Lakshmanan885de442022-04-23 10:51:14 +01004491 :k a
4492 END
4493 v9.CheckDefAndScriptFailure(lines, 'E1100:')
4494
4495 lines =<< trim END
4496 :1k a
4497 END
4498 v9.CheckDefAndScriptFailure(lines, 'E481:')
4499
4500 lines =<< trim END
Bram Moolenaar10b94212021-02-19 21:42:57 +01004501 t
4502 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004503 v9.CheckDefAndScriptFailure(lines, 'E1100:')
Bram Moolenaar10b94212021-02-19 21:42:57 +01004504
4505 lines =<< trim END
4506 x
4507 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004508 v9.CheckDefAndScriptFailure(lines, 'E1100:')
Bram Moolenaar10b94212021-02-19 21:42:57 +01004509
4510 lines =<< trim END
4511 xit
4512 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004513 v9.CheckDefAndScriptFailure(lines, 'E1100:')
4514
4515 lines =<< trim END
4516 Print
4517 END
4518 v9.CheckDefAndScriptFailure(lines, ['E476: Invalid command: Print', 'E492: Not an editor command: Print'])
4519
4520 lines =<< trim END
4521 mode 4
4522 END
4523 v9.CheckDefAndScriptFailure(lines, ['E476: Invalid command: mode 4', 'E492: Not an editor command: mode 4'])
Bram Moolenaar10b94212021-02-19 21:42:57 +01004524enddef
4525
Bram Moolenaarc70fe462021-04-17 17:59:19 +02004526def Test_mapping_line_number()
4527 var lines =<< trim END
4528 vim9script
4529 def g:FuncA()
4530 # Some comment
4531 FuncB(0)
4532 enddef
4533 # Some comment
4534 def FuncB(
4535 # Some comment
4536 n: number
4537 )
4538 exe 'nno '
4539 # Some comment
4540 .. '<F3> a'
4541 .. 'b'
4542 .. 'c'
4543 enddef
4544 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004545 v9.CheckScriptSuccess(lines)
Bram Moolenaarc70fe462021-04-17 17:59:19 +02004546 var res = execute('verbose nmap <F3>')
4547 assert_match('No mapping found', res)
4548
4549 g:FuncA()
4550 res = execute('verbose nmap <F3>')
4551 assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
4552
4553 nunmap <F3>
4554 delfunc g:FuncA
4555enddef
4556
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004557def Test_option_set()
4558 # legacy script allows for white space
4559 var lines =<< trim END
4560 set foldlevel =11
4561 call assert_equal(11, &foldlevel)
4562 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004563 v9.CheckScriptSuccess(lines)
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004564
4565 set foldlevel
4566 set foldlevel=12
4567 assert_equal(12, &foldlevel)
4568 set foldlevel+=2
4569 assert_equal(14, &foldlevel)
4570 set foldlevel-=3
4571 assert_equal(11, &foldlevel)
4572
4573 lines =<< trim END
4574 set foldlevel =1
4575 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004576 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004577
4578 lines =<< trim END
4579 set foldlevel +=1
4580 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004581 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004582
4583 lines =<< trim END
4584 set foldlevel ^=1
4585 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004586 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004587
4588 lines =<< trim END
4589 set foldlevel -=1
4590 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004591 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004592
4593 set foldlevel&
4594enddef
4595
LemonBoy32f34612023-09-02 21:52:05 +02004596def Test_option_set_line_number()
4597 var lines =<< trim END
4598 vim9script
4599 # line2
4600 # line3
4601 def F()
4602 # line5
4603 &foldlevel = -128
4604 enddef
4605 F()
4606 END
4607 v9.CheckScriptSuccess(lines)
4608
4609 var res = execute('verbose set foldlevel')
4610 assert_match(' foldlevel.*Last set from .*XScriptSuccess\d\+ line 6', res)
4611enddef
4612
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004613def Test_option_modifier()
Bram Moolenaar1594f312021-07-08 16:40:13 +02004614 # legacy script allows for white space
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004615 var lines =<< trim END
4616 set hlsearch & hlsearch !
4617 call assert_equal(1, &hlsearch)
4618 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004619 v9.CheckScriptSuccess(lines)
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004620
Bram Moolenaar1594f312021-07-08 16:40:13 +02004621 set hlsearch
4622 set hlsearch!
4623 assert_equal(false, &hlsearch)
4624
4625 set hlsearch
4626 set hlsearch&
4627 assert_equal(false, &hlsearch)
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004628
4629 lines =<< trim END
Bram Moolenaar1594f312021-07-08 16:40:13 +02004630 set hlsearch &
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004631 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004632 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &')
Bram Moolenaar1594f312021-07-08 16:40:13 +02004633
4634 lines =<< trim END
4635 set hlsearch !
4636 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004637 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !')
Bram Moolenaar1594f312021-07-08 16:40:13 +02004638
4639 set hlsearch&
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004640enddef
4641
Bram Moolenaarc03fe662021-07-11 16:52:45 +02004642" This must be called last, it may cause following :def functions to fail
4643def Test_xxx_echoerr_line_number()
4644 var lines =<< trim END
4645 echoerr 'some'
4646 .. ' error'
4647 .. ' continued'
4648 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004649 v9.CheckDefExecAndScriptFailure(lines, 'some error continued', 1)
Bram Moolenaarc03fe662021-07-11 16:52:45 +02004650enddef
4651
Bram Moolenaar9537e372021-12-10 21:05:53 +00004652func Test_debug_with_lambda()
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004653 CheckRunVimInTerminal
4654
Bram Moolenaar9537e372021-12-10 21:05:53 +00004655 " call indirectly to avoid compilation error for missing functions
4656 call Run_Test_debug_with_lambda()
4657endfunc
4658
4659def Run_Test_debug_with_lambda()
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004660 var lines =<< trim END
4661 vim9script
4662 def Func()
4663 var n = 0
4664 echo [0]->filter((_, v) => v == n)
4665 enddef
4666 breakadd func Func
4667 Func()
4668 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004669 writefile(lines, 'XdebugFunc', 'D')
Christian Brabandt7edde3f2024-05-04 09:38:59 +02004670 var buf = g:RunVimInTerminal('-S XdebugFunc', {rows: 10, wait_for_ruler: 0})
4671 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 10)))
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004672
4673 term_sendkeys(buf, "cont\<CR>")
Christian Brabandt7edde3f2024-05-04 09:38:59 +02004674 g:WaitForAssert(() => assert_match('\[0\]', term_getline(buf, 9)))
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004675
Bram Moolenaar62aec932022-01-29 21:45:34 +00004676 g:StopVimInTerminal(buf)
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004677enddef
4678
Bram Moolenaar310091d2021-12-23 21:14:37 +00004679func Test_debug_running_out_of_lines()
4680 CheckRunVimInTerminal
4681
4682 " call indirectly to avoid compilation error for missing functions
4683 call Run_Test_debug_running_out_of_lines()
4684endfunc
4685
4686def Run_Test_debug_running_out_of_lines()
4687 var lines =<< trim END
4688 vim9script
4689 def Crash()
4690 #
4691 #
4692 #
4693 #
4694 #
4695 #
4696 #
4697 if true
4698 #
4699 endif
4700 enddef
4701 breakadd func Crash
4702 Crash()
4703 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004704 writefile(lines, 'XdebugFunc', 'D')
Christian Brabandt7edde3f2024-05-04 09:38:59 +02004705 var buf = g:RunVimInTerminal('-S XdebugFunc', {rows: 10, wait_for_ruler: 0})
4706 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 10)))
Bram Moolenaar310091d2021-12-23 21:14:37 +00004707
4708 term_sendkeys(buf, "next\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004709 g:TermWait(buf)
Christian Brabandt7edde3f2024-05-04 09:38:59 +02004710 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 10)))
Bram Moolenaar310091d2021-12-23 21:14:37 +00004711
4712 term_sendkeys(buf, "cont\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004713 g:TermWait(buf)
Bram Moolenaar310091d2021-12-23 21:14:37 +00004714
Bram Moolenaar62aec932022-01-29 21:45:34 +00004715 g:StopVimInTerminal(buf)
Bram Moolenaar310091d2021-12-23 21:14:37 +00004716enddef
4717
dundargocc57b5bc2022-11-02 13:30:51 +00004718def Test_ambiguous_command_error()
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004719 var lines =<< trim END
4720 vim9script
4721 command CmdA echomsg 'CmdA'
4722 command CmdB echomsg 'CmdB'
4723 Cmd
4724 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004725 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 4)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004726
4727 lines =<< trim END
4728 vim9script
4729 def Func()
4730 Cmd
4731 enddef
4732 Func()
4733 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004734 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 1)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004735
4736 lines =<< trim END
4737 vim9script
4738 nnoremap <F3> <ScriptCmd>Cmd<CR>
4739 feedkeys("\<F3>", 'xt')
4740 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004741 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 3)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004742
4743 delcommand CmdA
4744 delcommand CmdB
4745 nunmap <F3>
4746enddef
4747
Dominique Pelle923dce22021-11-21 11:36:04 +00004748" Execute this near the end, profiling doesn't stop until Vim exits.
Bram Moolenaard9162552021-07-11 15:26:13 +02004749" This only tests that it works, not the profiling output.
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004750def Test_profile_with_lambda()
Bram Moolenaar4ece1522021-07-11 16:31:51 +02004751 CheckFeature profile
4752
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004753 var lines =<< trim END
4754 vim9script
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004755
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004756 def ProfiledWithLambda()
4757 var n = 3
4758 echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n)
4759 enddef
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004760
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004761 def ProfiledNested()
4762 var x = 0
4763 def Nested(): any
4764 return x
4765 enddef
4766 Nested()
4767 enddef
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004768
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004769 def g:ProfiledNestedProfiled()
4770 var x = 0
4771 def Nested(): any
4772 return x
4773 enddef
4774 Nested()
4775 enddef
4776
4777 def Profile()
Bram Moolenaar48f69cd2022-03-15 16:16:47 +00004778 ProfiledWithLambda()
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004779 ProfiledNested()
4780
Bram Moolenaar48f69cd2022-03-15 16:16:47 +00004781 # Also profile the nested function. Use a different function, although
4782 # the contents is the same, to make sure it was not already compiled.
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004783 profile func *
4784 g:ProfiledNestedProfiled()
4785
4786 profdel func *
4787 profile pause
4788 enddef
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004789
4790 var result = 'done'
4791 try
4792 # mark functions for profiling now to avoid E1271
4793 profile start Xprofile.log
4794 profile func ProfiledWithLambda
4795 profile func ProfiledNested
4796
4797 Profile()
4798 catch
4799 result = 'failed: ' .. v:exception
4800 finally
4801 writefile([result], 'Xdidprofile')
4802 endtry
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004803 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004804 writefile(lines, 'Xprofile.vim', 'D')
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004805 call system(g:GetVimCommand()
4806 .. ' --clean'
4807 .. ' -c "so Xprofile.vim"'
4808 .. ' -c "qall!"')
4809 call assert_equal(0, v:shell_error)
4810
4811 assert_equal(['done'], readfile('Xdidprofile'))
4812 assert_true(filereadable('Xprofile.log'))
4813 delete('Xdidprofile')
4814 delete('Xprofile.log')
Bram Moolenaard9162552021-07-11 15:26:13 +02004815enddef
4816
Bram Moolenaar4f6e7722022-03-16 20:26:02 +00004817func Test_misplaced_type()
4818 CheckRunVimInTerminal
4819 call Run_Test_misplaced_type()
4820endfunc
4821
4822def Run_Test_misplaced_type()
Bram Moolenaar9510d222022-09-11 15:14:05 +01004823 writefile(['let g:somevar = "asdf"'], 'XTest_misplaced_type', 'D')
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004824 var buf = g:RunVimInTerminal('-S XTest_misplaced_type', {'rows': 6})
Bram Moolenaar9510d222022-09-11 15:14:05 +01004825 term_sendkeys(buf, ":vim9cmd echo islocked('somevar: string')\<CR>")
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004826 g:VerifyScreenDump(buf, 'Test_misplaced_type', {})
4827
4828 g:StopVimInTerminal(buf)
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004829enddef
4830
LemonBoya5d35902022-04-29 21:15:02 +01004831" Ensure echo doesn't crash when stringifying empty variables.
4832def Test_echo_uninit_variables()
4833 var res: string
4834
4835 var var_bool: bool
4836 var var_num: number
4837 var var_float: float
4838 var Var_func: func
4839 var var_string: string
4840 var var_blob: blob
LemonBoya5d35902022-04-29 21:15:02 +01004841 var var_list: list<any>
4842 var var_dict: dict<any>
4843
4844 redir => res
4845 echo var_bool
4846 echo var_num
4847 echo var_float
4848 echo Var_func
4849 echo var_string
4850 echo var_blob
LemonBoya5d35902022-04-29 21:15:02 +01004851 echo var_list
4852 echo var_dict
4853 redir END
4854
Bram Moolenaarf1d63b92022-05-06 13:37:42 +01004855 assert_equal(['false', '0', '0.0', 'function()', '', '0z', '[]', '{}'], res->split('\n'))
4856
4857 if has('job')
4858 var var_job: job
4859 var var_channel: channel
4860
4861 redir => res
4862 echo var_job
4863 echo var_channel
4864 redir END
4865
4866 assert_equal(['no process', 'channel fail'], res->split('\n'))
4867 endif
LemonBoya5d35902022-04-29 21:15:02 +01004868enddef
4869
Bram Moolenaar6342e2c2022-12-12 18:56:32 +00004870def Test_free_type_before_use()
4871 # this rather complicated script was freeing a type before using it
4872 var lines =<< trim END
4873 vim9script
4874
4875 def Scan(rel: list<dict<any>>): func(func(dict<any>))
4876 return (Emit: func(dict<any>)) => {
4877 for t in rel
4878 Emit(t)
4879 endfor
4880 }
4881 enddef
4882
4883 def Build(Cont: func(func(dict<any>))): list<dict<any>>
4884 var rel: list<dict<any>> = []
4885 Cont((t) => {
4886 add(rel, t)
4887 })
4888 return rel
4889 enddef
4890
4891 var R = [{A: 0}]
4892 var result = Scan(R)->Build()
4893 result = Scan(R)->Build()
4894
4895 assert_equal(R, result)
4896 END
4897 v9.CheckScriptSuccess(lines)
4898enddef
4899
Yegappan Lakshmanana76fbe62023-09-27 18:51:43 +02004900" The following complicated script used to cause an internal error (E340)
4901" because the funcref instruction memory was referenced after the instruction
4902" memory was reallocated (Github issue #13178)
4903def Test_refer_funcref_instr_after_realloc()
4904 var lines =<< trim END
4905 vim9script
4906 def A(d: bool)
4907 var e = abs(0)
4908 var f = &emoji
4909 &emoji = true
4910 if ['', '', '']->index('xxx') == 0
4911 eval 0 + 0
4912 endif
4913 if &filetype == 'xxx'
4914 var g = abs(0)
4915 while g > 0
4916 if getline(g) == ''
4917 break
4918 endif
4919 --g
4920 endwhile
4921 if g == 0
4922 return
4923 endif
4924 if d
4925 feedkeys($'{g}G')
4926 g = abs(0)
4927 endif
4928 var h = abs(0)
4929 var i = abs(0)
4930 var j = abs(0)
4931 while j < 0
4932 if abs(0) < h && getline(j) != ''
4933 break
4934 endif
4935 ++j
4936 endwhile
4937 feedkeys($'{g}G{j}G')
4938 return
4939 endif
4940 def B()
4941 enddef
4942 def C()
4943 enddef
4944 enddef
4945 A(false)
4946 END
4947 v9.CheckScriptSuccess(lines)
4948enddef
4949
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004950" Test for calling a deferred function after an exception
4951def Test_defer_after_exception()
4952 var lines =<< trim END
4953 vim9script
4954
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004955 var callTrace: list<number> = []
4956 def Bar()
4957 callTrace += [1]
4958 throw 'InnerException'
4959 enddef
4960
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004961 def Defer()
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004962 callTrace += [2]
4963 callTrace += [3]
4964 try
4965 Bar()
4966 catch /InnerException/
4967 callTrace += [4]
4968 endtry
4969 callTrace += [5]
4970 callTrace += [6]
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004971 enddef
4972
4973 def Foo()
4974 defer Defer()
4975 throw "TestException"
4976 enddef
4977
4978 try
4979 Foo()
4980 catch /TestException/
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004981 callTrace += [7]
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004982 endtry
4983
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004984 assert_equal([2, 3, 1, 4, 5, 6, 7], callTrace)
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004985 END
Yegappan Lakshmananec3cebb2023-10-27 19:35:26 +02004986 v9.CheckSourceSuccess(lines)
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004987enddef
4988
Yegappan Lakshmanan0ab500d2023-10-21 11:59:42 +02004989" Test for multiple deferred function which throw exceptions.
4990" Exceptions thrown by deferred functions should result in error messages but
4991" not propagated into the calling functions.
4992def Test_multidefer_with_exception()
4993 var lines =<< trim END
4994 vim9script
4995
4996 var callTrace: list<number> = []
4997 def Except()
4998 callTrace += [1]
4999 throw 'InnerException'
5000 callTrace += [2]
5001 enddef
5002
5003 def FirstDefer()
5004 callTrace += [3]
5005 callTrace += [4]
5006 enddef
5007
5008 def SecondDeferWithExcept()
5009 callTrace += [5]
5010 Except()
5011 callTrace += [6]
5012 enddef
5013
5014 def ThirdDefer()
5015 callTrace += [7]
5016 callTrace += [8]
5017 enddef
5018
5019 def Foo()
5020 callTrace += [9]
5021 defer FirstDefer()
5022 defer SecondDeferWithExcept()
5023 defer ThirdDefer()
5024 callTrace += [10]
5025 enddef
5026
5027 v:errmsg = ''
5028 try
5029 callTrace += [11]
5030 Foo()
5031 callTrace += [12]
5032 catch /TestException/
5033 callTrace += [13]
5034 catch
5035 callTrace += [14]
5036 finally
5037 callTrace += [15]
5038 endtry
5039 callTrace += [16]
5040
5041 assert_equal('E605: Exception not caught: InnerException', v:errmsg)
5042 assert_equal([11, 9, 10, 7, 8, 5, 1, 3, 4, 12, 15, 16], callTrace)
5043 END
Yegappan Lakshmananec3cebb2023-10-27 19:35:26 +02005044 v9.CheckSourceSuccess(lines)
5045enddef
5046
Yegappan Lakshmanana185a312023-12-16 14:36:08 +01005047" Test for using ":defer" inside an if statement with a false condition
5048def Test_defer_skipped()
5049 var lines =<< trim END
5050 def Foo()
5051 if false
5052 defer execute('echow "hello"', "")
5053 endif
5054 enddef
5055 defcompile
5056 END
5057 v9.CheckSourceSuccess(lines)
5058enddef
5059
Yegappan Lakshmanan062bb6b2023-12-16 14:46:40 +01005060" Test for using defer without parenthesis for the function name
5061def Test_defer_func_without_paren()
5062 var lines =<< trim END
5063 vim9script
5064 def Foo()
5065 defer Bar
5066 enddef
5067 defcompile
5068 END
5069 v9.CheckScriptFailure(lines, 'E107: Missing parentheses: Bar', 1)
5070enddef
5071
5072" Test for using defer without parenthesis for the function name
5073def Test_defer_non_existing_func()
5074 var lines =<< trim END
5075 vim9script
5076 def Foo()
5077 defer Bar()
5078 enddef
5079 defcompile
5080 END
5081 v9.CheckScriptFailure(lines, 'E1001: Variable not found: Bar', 1)
5082enddef
5083
5084" Test for using defer with an invalid function name
5085def Test_defer_invalid_func()
5086 var lines =<< trim END
5087 vim9script
5088 def Foo()
5089 var Abc = 10
5090 defer Abc()
5091 enddef
5092 defcompile
5093 END
5094 v9.CheckScriptFailure(lines, 'E129: Function name required', 2)
5095enddef
5096
5097" Test for using defer with an invalid argument to a function
5098def Test_defer_invalid_func_arg()
5099 var lines =<< trim END
5100 vim9script
5101 def Bar(x: number)
5102 enddef
5103 def Foo()
5104 defer Bar(a)
5105 enddef
5106 defcompile
5107 END
5108 v9.CheckScriptFailure(lines, 'E1001: Variable not found: a', 1)
5109enddef
5110
5111" Test for using an non-existing type in a "for" statement.
5112def Test_invalid_type_in_for()
5113 var lines =<< trim END
5114 vim9script
5115 def Foo()
5116 for b: x in range(10)
5117 endfor
5118 enddef
5119 defcompile
5120 END
Yegappan Lakshmanan1b531722024-05-09 09:12:31 +02005121 v9.CheckSourceFailure(lines, 'E1010: Type not recognized: x', 1)
Yegappan Lakshmanan062bb6b2023-12-16 14:46:40 +01005122enddef
5123
5124" Test for using a line break between the variable name and the type in a for
5125" statement.
5126def Test_for_stmt_space_before_type()
5127 var lines =<< trim END
5128 vim9script
5129 def Foo()
5130 for a
5131 :number in range(10)
5132 endfor
5133 enddef
5134 defcompile
5135 END
5136 v9.CheckSourceFailure(lines, 'E1059: No white space allowed before colon: :number in range(10)', 2)
5137enddef
5138
zeertzjqc029c132024-03-28 11:37:26 +01005139" This test used to cause a use-after-free memory access
Yegappan Lakshmanan28d71b52024-01-12 17:21:55 +01005140def Test_for_empty_line_after_lambda()
5141 var lines =<< trim END
5142 vim9script
5143 echomsg range(0, 2)->map((_, v) => {
5144 return 1
5145 })
5146
5147 assert_equal('[1, 1, 1]', v:statusmsg)
5148 END
5149 v9.CheckSourceSuccess(lines)
5150
5151 lines =<< trim END
5152 vim9script
5153 echomsg range(0, 1)->map((_, v) => {
5154 return 1
5155 }) range(0, 1)->map((_, v) => {
5156 return 2
5157 }) # comment
5158
5159 assert_equal('[1, 1] [2, 2]', v:statusmsg)
5160 END
5161 v9.CheckSourceSuccess(lines)
5162enddef
5163
Yegappan Lakshmanan3fa8f772024-04-04 21:42:07 +02005164" Test for evaluating a lambda block from a string
5165def Test_eval_lambda_block()
5166 var lines =<< trim END
5167 vim9script
5168 var Fn = eval("(x: number): number => {\nreturn x * 2\n}")
5169 assert_equal(6, Fn(3))
5170 END
5171 v9.CheckSourceSuccess(lines)
5172enddef
5173
Yegappan Lakshmananda9d3452024-05-02 13:02:36 +02005174" Test for using various null values
5175def Test_null_values()
5176 var lines =<< trim END
5177 var nullValues = [
5178 [null, 1, 'null', 7, 'special'],
5179 [null_blob, 1, '0z', 10, 'blob'],
Yegappan Lakshmananda9d3452024-05-02 13:02:36 +02005180 [null_dict, 1, '{}', 4, 'dict<any>'],
5181 [null_function, 1, "function('')", 2, 'func(...): unknown'],
Yegappan Lakshmananda9d3452024-05-02 13:02:36 +02005182 [null_list, 1, '[]', 3, 'list<any>'],
5183 [null_object, 1, 'object of [unknown]', 13, 'object<Unknown>'],
5184 [null_partial, 1, "function('')", 2, 'func(...): unknown'],
5185 [null_string, 1, "''", 1, 'string']
5186 ]
Dominique Pellé52123872024-07-07 20:37:12 +02005187 if has('channel')
5188 nullValues->add([null_channel, 1, 'channel fail', 9, 'channel'])
5189 endif
5190 if has('job')
5191 nullValues->add([null_job, 1, 'no process', 8, 'job'])
5192 endif
Yegappan Lakshmananda9d3452024-05-02 13:02:36 +02005193
5194 for [Val, emptyExp, stringExp, typeExp, typenameExp] in nullValues
5195 assert_equal(emptyExp, empty(Val))
5196 assert_equal(stringExp, string(Val))
5197 assert_equal(typeExp, type(Val))
5198 assert_equal(typenameExp, typename(Val))
5199 assert_equal(Val, copy(Val))
5200 assert_equal(-1, test_refcount(Val))
5201 endfor
5202 END
5203 v9.CheckSourceDefAndScriptSuccess(lines)
5204enddef
5205
Yegappan Lakshmanan1b531722024-05-09 09:12:31 +02005206" Test for using an unknown type in a typecast
5207def Test_unknown_type_in_typecast()
5208 var lines =<< trim END
5209 vim9script
5210 var a = <MyType>b
5211 END
5212 v9.CheckSourceFailure(lines, 'E1010: Type not recognized: MyType', 2)
5213
5214 lines =<< trim END
5215 vim9script
5216 var Fn = <funcx(number, number): number>b
5217 END
5218 v9.CheckSourceFailure(lines, 'E1010: Type not recognized: funcx(number, number): number', 2)
Yegappan Lakshmananfe424d12024-05-17 18:20:43 +02005219
5220 # Wrong type in a type cast
5221 lines =<< trim END
5222 vim9script
5223 var i: number = <number>true
5224 END
5225 v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected number but got bool', 2)
Yegappan Lakshmanan1b531722024-05-09 09:12:31 +02005226enddef
5227
Yegappan Lakshmanane2038412024-12-14 19:59:24 +01005228" Test for calling a function as a method with a list argument
5229" This exercises some conditions in the assignment statement parsing code.
5230def Test_method_call_with_list_arg()
5231 var lines =<< trim END
5232 vim9script
5233
5234 def Foo(l: list<number>)
5235 g:save_list = l
5236 enddef
5237
5238 def Bar()
5239 var a = 10
5240 var b = 20
5241 [a, b]->Foo()
5242 enddef
5243
5244 g:save_list = []
5245 Bar()
5246 assert_equal([10, 20], g:save_list)
5247 END
5248 v9.CheckSourceSuccess(lines)
5249enddef
5250
Bram Moolenaar585fea72020-04-02 22:33:21 +02005251" Keep this last, it messes up highlighting.
5252def Test_substitute_cmd()
5253 new
5254 setline(1, 'something')
5255 :substitute(some(other(
5256 assert_equal('otherthing', getline(1))
5257 bwipe!
5258
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02005259 # also when the context is Vim9 script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02005260 var lines =<< trim END
Bram Moolenaar585fea72020-04-02 22:33:21 +02005261 vim9script
5262 new
5263 setline(1, 'something')
5264 :substitute(some(other(
5265 assert_equal('otherthing', getline(1))
5266 bwipe!
5267 END
Bram Moolenaardd674772022-09-15 22:26:18 +01005268 writefile(lines, 'Xvim9lines', 'D')
Bram Moolenaar585fea72020-04-02 22:33:21 +02005269 source Xvim9lines
Bram Moolenaar585fea72020-04-02 22:33:21 +02005270enddef
5271
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01005272" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker