blob: d4043d1db64b3c30ef3220069e0ea86c160c8d55 [file] [log] [blame]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001" Test various aspects of the Vim9 script language.
2
Christian Brabandteb380b92025-07-07 20:53:55 +02003import './util/vim9.vim' as v9
4source util/screendump.vim
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01005
Bram Moolenaarb79ee0c2022-01-01 12:17:00 +00006def Test_vim9script_feature()
7 # example from the help, here the feature is always present
8 var lines =<< trim END
9 " old style comment
10 if !has('vim9script')
11 " legacy commands would go here
12 finish
13 endif
14 vim9script
15 # Vim9 script commands go here
16 g:didit = true
17 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000018 v9.CheckScriptSuccess(lines)
Bram Moolenaarb79ee0c2022-01-01 12:17:00 +000019 assert_equal(true, g:didit)
20 unlet g:didit
21enddef
22
Bram Moolenaar5d72ce62020-08-20 23:04:06 +020023def Test_range_only()
24 new
25 setline(1, ['blah', 'Blah'])
26 :/Blah/
27 assert_equal(2, getcurpos()[1])
Bram Moolenaarc2af0af2020-08-23 21:06:02 +020028 bwipe!
29
30 # without range commands use current line
31 new
32 setline(1, ['one', 'two', 'three'])
33 :2
34 print
Bram Moolenaar62aec932022-01-29 21:45:34 +000035 assert_equal('two', g:Screenline(&lines))
Bram Moolenaarc2af0af2020-08-23 21:06:02 +020036 :3
37 list
Bram Moolenaar62aec932022-01-29 21:45:34 +000038 assert_equal('three$', g:Screenline(&lines))
Bram Moolenaarb8554302021-02-15 21:30:30 +010039
40 # missing command does not print the line
41 var lines =<< trim END
42 vim9script
43 :1|
Bram Moolenaar62aec932022-01-29 21:45:34 +000044 assert_equal('three$', g:Screenline(&lines))
Bram Moolenaarb8554302021-02-15 21:30:30 +010045 :|
Bram Moolenaar62aec932022-01-29 21:45:34 +000046 assert_equal('three$', g:Screenline(&lines))
Bram Moolenaarb8554302021-02-15 21:30:30 +010047 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000048 v9.CheckScriptSuccess(lines)
Bram Moolenaarb8554302021-02-15 21:30:30 +010049
Bram Moolenaarc2af0af2020-08-23 21:06:02 +020050 bwipe!
Bram Moolenaar025cb1c2020-12-14 18:31:27 +010051
Bram Moolenaar0c7f2612022-02-17 19:44:07 +000052 lines =<< trim END
53 set cpo+=-
54 :1,999
55 END
56 v9.CheckDefExecAndScriptFailure(lines, 'E16:', 2)
57 set cpo&vim
58
59 v9.CheckDefExecAndScriptFailure([":'x"], 'E20:', 1)
60
Bram Moolenaar025cb1c2020-12-14 18:31:27 +010061 # won't generate anything
62 if false
63 :123
64 endif
Bram Moolenaar5d72ce62020-08-20 23:04:06 +020065enddef
66
Bram Moolenaar09d94212022-05-05 15:20:03 +010067def Test_invalid_range()
68 var lines =<< trim END
69 :123 eval 1 + 2
70 END
71 v9.CheckDefAndScriptFailure(lines, 'E481:', 1)
72
73 lines =<< trim END
74 :123 if true
75 endif
76 END
77 v9.CheckDefAndScriptFailure(lines, 'E481:', 1)
78
79 lines =<< trim END
80 :123 echo 'yes'
81 END
82 v9.CheckDefAndScriptFailure(lines, 'E481:', 1)
83
84 lines =<< trim END
85 :123 cd there
86 END
87 v9.CheckDefAndScriptFailure(lines, 'E481:', 1)
88enddef
89
Bram Moolenaara6e67e42020-05-15 23:36:40 +020090let g:alist = [7]
91let g:astring = 'text'
Bram Moolenaarf0b9f432020-07-17 23:03:17 +020092let g:anumber = 123
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010093
Bram Moolenaar4c17ad92020-04-27 22:47:51 +020094def Test_delfunction()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +020095 # Check function is defined in script namespace
Bram Moolenaar62aec932022-01-29 21:45:34 +000096 v9.CheckScriptSuccess([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +020097 'vim9script',
98 'func CheckMe()',
99 ' return 123',
100 'endfunc',
Bram Moolenaara749a422022-02-12 19:52:25 +0000101 'func DoTest()',
102 ' call assert_equal(123, s:CheckMe())',
103 'endfunc',
104 'DoTest()',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200105 ])
106
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200107 # Check function in script namespace cannot be deleted
Bram Moolenaar62aec932022-01-29 21:45:34 +0000108 v9.CheckScriptFailure([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200109 'vim9script',
110 'func DeleteMe1()',
111 'endfunc',
112 'delfunction DeleteMe1',
113 ], 'E1084:')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000114 v9.CheckScriptFailure([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200115 'vim9script',
116 'func DeleteMe2()',
117 'endfunc',
118 'def DoThat()',
119 ' delfunction DeleteMe2',
120 'enddef',
121 'DoThat()',
122 ], 'E1084:')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000123 v9.CheckScriptFailure([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200124 'vim9script',
125 'def DeleteMe3()',
126 'enddef',
127 'delfunction DeleteMe3',
128 ], 'E1084:')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000129 v9.CheckScriptFailure([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200130 'vim9script',
131 'def DeleteMe4()',
132 'enddef',
133 'def DoThat()',
134 ' delfunction DeleteMe4',
135 'enddef',
136 'DoThat()',
137 ], 'E1084:')
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200138
139 # Check that global :def function can be replaced and deleted
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200140 var lines =<< trim END
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200141 vim9script
142 def g:Global(): string
143 return "yes"
144 enddef
145 assert_equal("yes", g:Global())
146 def! g:Global(): string
147 return "no"
148 enddef
149 assert_equal("no", g:Global())
150 delfunc g:Global
151 assert_false(exists('*g:Global'))
152 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000153 v9.CheckScriptSuccess(lines)
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200154
155 # Check that global function can be replaced by a :def function and deleted
156 lines =<< trim END
157 vim9script
158 func g:Global()
159 return "yes"
160 endfunc
161 assert_equal("yes", g:Global())
162 def! g:Global(): string
163 return "no"
164 enddef
165 assert_equal("no", g:Global())
166 delfunc g:Global
167 assert_false(exists('*g:Global'))
168 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000169 v9.CheckScriptSuccess(lines)
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200170
171 # Check that global :def function can be replaced by a function and deleted
172 lines =<< trim END
173 vim9script
174 def g:Global(): string
175 return "yes"
176 enddef
177 assert_equal("yes", g:Global())
178 func! g:Global()
179 return "no"
180 endfunc
181 assert_equal("no", g:Global())
182 delfunc g:Global
183 assert_false(exists('*g:Global'))
184 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000185 v9.CheckScriptSuccess(lines)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200186enddef
187
Bram Moolenaar08052222020-09-14 17:04:31 +0200188def Test_wrong_type()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000189 v9.CheckDefFailure(['var name: list<nothing>'], 'E1010:')
190 v9.CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
191 v9.CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
192 v9.CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100193
Bram Moolenaar62aec932022-01-29 21:45:34 +0000194 v9.CheckDefFailure(['var name: dict<number'], 'E1009:')
195 v9.CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100196
Bram Moolenaar62aec932022-01-29 21:45:34 +0000197 v9.CheckDefFailure(['var name: ally'], 'E1010:')
198 v9.CheckDefFailure(['var name: bram'], 'E1010:')
199 v9.CheckDefFailure(['var name: cathy'], 'E1010:')
200 v9.CheckDefFailure(['var name: dom'], 'E1010:')
201 v9.CheckDefFailure(['var name: freddy'], 'E1010:')
202 v9.CheckDefFailure(['var name: john'], 'E1010:')
203 v9.CheckDefFailure(['var name: larry'], 'E1010:')
204 v9.CheckDefFailure(['var name: ned'], 'E1010:')
205 v9.CheckDefFailure(['var name: pam'], 'E1010:')
206 v9.CheckDefFailure(['var name: sam'], 'E1010:')
207 v9.CheckDefFailure(['var name: vim'], 'E1010:')
Bram Moolenaara0a9f432020-04-28 21:29:34 +0200208
Bram Moolenaar62aec932022-01-29 21:45:34 +0000209 v9.CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
210 v9.CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
Bram Moolenaar08052222020-09-14 17:04:31 +0200211enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100212
Bram Moolenaara749a422022-02-12 19:52:25 +0000213def Test_script_namespace()
214 # defining a function or variable with s: is not allowed
215 var lines =<< trim END
216 vim9script
217 def s:Function()
218 enddef
219 END
220 v9.CheckScriptFailure(lines, 'E1268:')
221
222 for decl in ['var', 'const', 'final']
223 lines =<< trim END
224 vim9script
225 var s:var = 'var'
226 END
227 v9.CheckScriptFailure([
228 'vim9script',
229 decl .. ' s:var = "var"',
230 ], 'E1268:')
231 endfor
232
233 # Calling a function or using a variable with s: is not allowed at script
234 # level
235 lines =<< trim END
236 vim9script
237 def Function()
238 enddef
239 s:Function()
240 END
241 v9.CheckScriptFailure(lines, 'E1268:')
242 lines =<< trim END
243 vim9script
244 def Function()
245 enddef
246 call s:Function()
247 END
248 v9.CheckScriptFailure(lines, 'E1268:')
249 lines =<< trim END
250 vim9script
251 var var = 'var'
252 echo s:var
253 END
254 v9.CheckScriptFailure(lines, 'E1268:')
255enddef
256
Bram Moolenaar10c65862020-10-08 21:16:42 +0200257def Test_script_wrong_type()
258 var lines =<< trim END
259 vim9script
Bram Moolenaara749a422022-02-12 19:52:25 +0000260 var dict: dict<string>
261 dict['a'] = ['x']
Bram Moolenaar10c65862020-10-08 21:16:42 +0200262 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000263 v9.CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3)
Bram Moolenaar10c65862020-10-08 21:16:42 +0200264enddef
265
Bram Moolenaar08052222020-09-14 17:04:31 +0200266def Test_const()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000267 v9.CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
268 v9.CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
269 v9.CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
270 v9.CheckDefFailure(['final two'], 'E1125:')
271 v9.CheckDefFailure(['final &option'], 'E996:')
Bram Moolenaardbeecb22020-09-14 18:15:09 +0200272
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200273 var lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200274 final list = [1, 2, 3]
Bram Moolenaardbeecb22020-09-14 18:15:09 +0200275 list[0] = 4
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200276 list->assert_equal([4, 2, 3])
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200277 const other = [5, 6, 7]
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200278 other->assert_equal([5, 6, 7])
Bram Moolenaar71abe482020-09-14 22:28:30 +0200279
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200280 var varlist = [7, 8]
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200281 const constlist = [1, varlist, 3]
Bram Moolenaar71abe482020-09-14 22:28:30 +0200282 varlist[0] = 77
Bram Moolenaar23e2e112021-08-03 21:16:18 +0200283 constlist[1][1] = 88
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200284 var cl = constlist[1]
Bram Moolenaar71abe482020-09-14 22:28:30 +0200285 cl[1] = 88
286 constlist->assert_equal([1, [77, 88], 3])
287
Bram Moolenaare0de1712020-12-02 17:36:54 +0100288 var vardict = {five: 5, six: 6}
289 const constdict = {one: 1, two: vardict, three: 3}
Bram Moolenaar71abe482020-09-14 22:28:30 +0200290 vardict['five'] = 55
Bram Moolenaar23e2e112021-08-03 21:16:18 +0200291 constdict['two']['six'] = 66
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200292 var cd = constdict['two']
Bram Moolenaar71abe482020-09-14 22:28:30 +0200293 cd['six'] = 66
Bram Moolenaare0de1712020-12-02 17:36:54 +0100294 constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3})
Bram Moolenaardbeecb22020-09-14 18:15:09 +0200295 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000296 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar0089ce22022-10-08 14:39:36 +0100297
298 # "any" type with const flag is recognized as "any"
299 lines =<< trim END
300 const dict: dict<any> = {foo: {bar: 42}}
301 const foo = dict.foo
302 assert_equal(v:t_number, type(foo.bar))
303 END
304 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar330d64d2022-10-09 12:55:33 +0100305
306 # also when used as a builtin function argument
307 lines =<< trim END
308 vim9script
309
310 def SorterFunc(lhs: dict<string>, rhs: dict<string>): number
311 return lhs.name <# rhs.name ? -1 : 1
312 enddef
313
314 def Run(): void
315 var list = [{name: "3"}, {name: "2"}]
316 const Sorter = get({}, "unknown", SorterFunc)
317 sort(list, Sorter)
318 assert_equal([{name: "2"}, {name: "3"}], list)
319 enddef
320
321 Run()
322 END
323 v9.CheckScriptSuccess(lines)
Bram Moolenaar08052222020-09-14 17:04:31 +0200324enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100325
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200326def Test_const_bang()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200327 var lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200328 const var = 234
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200329 var = 99
330 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000331 v9.CheckDefExecFailure(lines, 'E1018:', 2)
332 v9.CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200333
334 lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200335 const ll = [2, 3, 4]
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200336 ll[0] = 99
337 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000338 v9.CheckDefExecFailure(lines, 'E1119:', 2)
339 v9.CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200340
341 lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200342 const ll = [2, 3, 4]
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200343 ll[3] = 99
344 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000345 v9.CheckDefExecFailure(lines, 'E1118:', 2)
346 v9.CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200347
348 lines =<< trim END
Bram Moolenaare0de1712020-12-02 17:36:54 +0100349 const dd = {one: 1, two: 2}
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200350 dd["one"] = 99
351 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000352 v9.CheckDefExecFailure(lines, 'E1121:', 2)
353 v9.CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200354
355 lines =<< trim END
Bram Moolenaare0de1712020-12-02 17:36:54 +0100356 const dd = {one: 1, two: 2}
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200357 dd["three"] = 99
358 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000359 v9.CheckDefExecFailure(lines, 'E1120:')
360 v9.CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200361enddef
362
Bram Moolenaardf069ee2020-06-22 23:02:51 +0200363def Test_range_no_colon()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000364 v9.CheckDefFailure(['%s/a/b/'], 'E1050:')
365 v9.CheckDefFailure(['+ s/a/b/'], 'E1050:')
366 v9.CheckDefFailure(['- s/a/b/'], 'E1050:')
367 v9.CheckDefFailure(['. s/a/b/'], 'E1050:')
Bram Moolenaardf069ee2020-06-22 23:02:51 +0200368enddef
369
370
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100371def Test_block()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200372 var outer = 1
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100373 {
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200374 var inner = 2
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100375 assert_equal(1, outer)
376 assert_equal(2, inner)
377 }
378 assert_equal(1, outer)
Bram Moolenaar3f1e9f02021-02-27 22:36:43 +0100379
380 {|echo 'yes'|}
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100381enddef
382
Bram Moolenaar08052222020-09-14 17:04:31 +0200383def Test_block_failure()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000384 v9.CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
385 v9.CheckDefFailure(['}'], 'E1025:')
386 v9.CheckDefFailure(['{', 'echo 1'], 'E1026:')
Bram Moolenaar08052222020-09-14 17:04:31 +0200387enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100388
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200389def Test_block_local_vars()
390 var lines =<< trim END
391 vim9script
Bram Moolenaared234f22020-10-15 20:42:20 +0200392 v:testing = 1
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200393 if true
Bram Moolenaared234f22020-10-15 20:42:20 +0200394 var text = ['hello']
395 def SayHello(): list<string>
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200396 return text
397 enddef
398 def SetText(v: string)
Bram Moolenaared234f22020-10-15 20:42:20 +0200399 text = [v]
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200400 enddef
401 endif
402
403 if true
Bram Moolenaared234f22020-10-15 20:42:20 +0200404 var text = ['again']
405 def SayAgain(): list<string>
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200406 return text
407 enddef
408 endif
Bram Moolenaared234f22020-10-15 20:42:20 +0200409
410 # test that the "text" variables are not cleaned up
411 test_garbagecollect_now()
412
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200413 defcompile
414
Bram Moolenaared234f22020-10-15 20:42:20 +0200415 assert_equal(['hello'], SayHello())
416 assert_equal(['again'], SayAgain())
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200417
418 SetText('foobar')
Bram Moolenaared234f22020-10-15 20:42:20 +0200419 assert_equal(['foobar'], SayHello())
420
421 call writefile(['ok'], 'Xdidit')
422 qall!
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200423 END
Bram Moolenaared234f22020-10-15 20:42:20 +0200424
425 # need to execute this with a separate Vim instance to avoid the current
426 # context gets garbage collected.
Bram Moolenaardd674772022-09-15 22:26:18 +0100427 writefile(lines, 'Xscript', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000428 g:RunVim([], [], '-S Xscript')
Bram Moolenaared234f22020-10-15 20:42:20 +0200429 assert_equal(['ok'], readfile('Xdidit'))
430
Bram Moolenaared234f22020-10-15 20:42:20 +0200431 delete('Xdidit')
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200432enddef
433
Bram Moolenaar39ca4122020-10-20 14:25:07 +0200434def Test_block_local_vars_with_func()
435 var lines =<< trim END
436 vim9script
437 if true
438 var foo = 'foo'
439 if true
440 var bar = 'bar'
441 def Func(): list<string>
442 return [foo, bar]
443 enddef
444 endif
445 endif
446 # function is compiled here, after blocks have finished, can still access
447 # "foo" and "bar"
448 assert_equal(['foo', 'bar'], Func())
449 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000450 v9.CheckScriptSuccess(lines)
Bram Moolenaar39ca4122020-10-20 14:25:07 +0200451enddef
452
Bram Moolenaare4db17f2021-08-01 21:19:43 +0200453" legacy func for command that's defined later
Bram Moolenaar62aec932022-01-29 21:45:34 +0000454func s:InvokeSomeCommand()
Bram Moolenaare4db17f2021-08-01 21:19:43 +0200455 SomeCommand
456endfunc
457
Yegappan Lakshmanane74cad32024-04-12 18:48:35 +0200458def Test_command_block()
Bram Moolenaare4db17f2021-08-01 21:19:43 +0200459 com SomeCommand {
460 g:someVar = 'some'
461 }
462 InvokeSomeCommand()
463 assert_equal('some', g:someVar)
464
465 delcommand SomeCommand
466 unlet g:someVar
467enddef
468
Yegappan Lakshmanane74cad32024-04-12 18:48:35 +0200469" Test for using heredoc in a :command command block
470def Test_command_block_heredoc()
471 var lines =<< trim CODE
472 vim9script
473 com SomeCommand {
474 g:someVar =<< trim END
475 aaa
476 bbb
477 END
478 }
479 SomeCommand
480 assert_equal(['aaa', 'bbb'], g:someVar)
481 def Foo()
482 g:someVar = []
483 SomeCommand
484 assert_equal(['aaa', 'bbb'], g:someVar)
485 enddef
486 Foo()
487 delcommand SomeCommand
488 unlet g:someVar
489 CODE
490 v9.CheckSourceSuccess( lines)
491
492 # Execute a command with heredoc in a block
493 lines =<< trim CODE
494 vim9script
495 com SomeCommand {
496 g:someVar =<< trim END
497 aaa
498 bbb
499 END
500 }
501 execute('SomeCommand')
502 assert_equal(['aaa', 'bbb'], g:someVar)
503 delcommand SomeCommand
504 unlet g:someVar
505 CODE
506 v9.CheckSourceSuccess(lines)
507
zeertzjq1f5175d2024-04-13 17:52:26 +0200508 # Heredoc with comment
509 lines =<< trim CODE
510 vim9script
511 com SomeCommand {
512 g:someVar =<< trim END # comment
513 aaa
514 bbb
515 END
516 }
517 execute('SomeCommand')
518 assert_equal(['aaa', 'bbb'], g:someVar)
519 delcommand SomeCommand
520 unlet g:someVar
521 CODE
522 v9.CheckSourceSuccess(lines)
523
Yegappan Lakshmanane74cad32024-04-12 18:48:35 +0200524 # heredoc evaluation
525 lines =<< trim CODE
526 vim9script
527 com SomeCommand {
528 var suffix = '---'
529 g:someVar =<< trim eval END
530 ccc{suffix}
531 ddd
532 END
533 }
534 SomeCommand
535 assert_equal(['ccc---', 'ddd'], g:someVar)
536 def Foo()
537 g:someVar = []
538 SomeCommand
539 assert_equal(['ccc---', 'ddd'], g:someVar)
540 enddef
541 Foo()
542 delcommand SomeCommand
543 unlet g:someVar
544 CODE
545 v9.CheckSourceSuccess(lines)
546
547 # command following heredoc
548 lines =<< trim CODE
549 vim9script
550 com SomeCommand {
551 var l =<< trim END
552 eee
553 fff
554 END
555 g:someVar = l
556 }
557 SomeCommand
558 assert_equal(['eee', 'fff'], g:someVar)
559 delcommand SomeCommand
560 unlet g:someVar
561 CODE
562 v9.CheckSourceSuccess(lines)
563
564 # Error in heredoc
565 lines =<< trim CODE
566 vim9script
567 com SomeCommand {
568 g:someVar =<< trim END
569 eee
570 fff
571 }
572 try
573 SomeCommand
574 catch
575 assert_match("E990: Missing end marker 'END'", v:exception)
576 endtry
577 delcommand SomeCommand
578 unlet g:someVar
579 CODE
580 v9.CheckSourceSuccess(lines)
581enddef
582
583def Test_autocommand_block()
Bram Moolenaare4db17f2021-08-01 21:19:43 +0200584 au BufNew *.xml {
585 g:otherVar = 'other'
586 }
587 split other.xml
588 assert_equal('other', g:otherVar)
589
590 bwipe!
591 au! BufNew *.xml
592 unlet g:otherVar
593enddef
594
Yegappan Lakshmanan0072cee2025-01-07 20:22:32 +0100595def Test_block_in_a_string()
596 var lines =<< trim END
597 vim9script
598
599 def Foo(): string
600 var x = ' => { # abc'
601 return x
602 enddef
603
604 assert_equal(' => { # abc', Foo())
605
606 def Bar(): string
607 var x = " => { # abc"
608 return x
609 enddef
610
611 assert_equal(" => { # abc", Bar())
612 END
613 v9.CheckSourceSuccess(lines)
614enddef
615
Bram Moolenaard032f342020-07-18 18:13:02 +0200616func g:NoSuchFunc()
617 echo 'none'
618endfunc
619
Bram Moolenaar9e1d9e32021-01-11 20:17:34 +0100620def Test_try_catch_throw()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200621 var l = []
Bram Moolenaar7a092242020-04-16 22:10:49 +0200622 try # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100623 add(l, '1')
624 throw 'wrong'
Bram Moolenaar9d383f32023-05-14 21:38:12 +0100625 add(l, '2') # "unreachable code"
Bram Moolenaar7a092242020-04-16 22:10:49 +0200626 catch # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100627 add(l, v:exception)
Bram Moolenaar7a092242020-04-16 22:10:49 +0200628 finally # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100629 add(l, '3')
Bram Moolenaar7a092242020-04-16 22:10:49 +0200630 endtry # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100631 assert_equal(['1', 'wrong', '3'], l)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200632
Bram Moolenaare8593122020-07-18 15:17:02 +0200633 l = []
634 try
635 try
636 add(l, '1')
637 throw 'wrong'
Bram Moolenaar9d383f32023-05-14 21:38:12 +0100638 add(l, '2') # "unreachable code"
Bram Moolenaare8593122020-07-18 15:17:02 +0200639 catch /right/
640 add(l, v:exception)
641 endtry
642 catch /wrong/
643 add(l, 'caught')
Bram Moolenaar204852a2022-03-05 12:56:44 +0000644 finally
Bram Moolenaare8593122020-07-18 15:17:02 +0200645 add(l, 'finally')
646 endtry
647 assert_equal(['1', 'caught', 'finally'], l)
648
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200649 var n: number
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200650 try
651 n = l[3]
652 catch /E684:/
653 n = 99
654 endtry
655 assert_equal(99, n)
656
Bram Moolenaar69f70502021-01-01 16:10:46 +0100657 var done = 'no'
658 if 0
659 try | catch | endtry
660 else
661 done = 'yes'
662 endif
663 assert_equal('yes', done)
664
665 done = 'no'
666 if 1
667 done = 'yes'
668 else
669 try | catch | endtry
670 done = 'never'
671 endif
672 assert_equal('yes', done)
673
674 if 1
675 else
676 try | catch /pat/ | endtry
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000677 try | catch /pat/
Bram Moolenaar69f70502021-01-01 16:10:46 +0100678 endtry
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000679 try
Bram Moolenaar69f70502021-01-01 16:10:46 +0100680 catch /pat/ | endtry
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000681 try
682 catch /pat/
Bram Moolenaar69f70502021-01-01 16:10:46 +0100683 endtry
684 endif
685
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200686 try
Bram Moolenaarcc673e72020-08-16 17:33:35 +0200687 # string slice returns a string, not a number
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200688 n = g:astring[3]
Bram Moolenaar5e654232020-09-16 15:22:00 +0200689 catch /E1012:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200690 n = 77
691 endtry
692 assert_equal(77, n)
693
694 try
695 n = l[g:astring]
Bram Moolenaar5e654232020-09-16 15:22:00 +0200696 catch /E1012:/
Bram Moolenaar56acb092020-08-16 14:48:19 +0200697 n = 88
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200698 endtry
Bram Moolenaar56acb092020-08-16 14:48:19 +0200699 assert_equal(88, n)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200700
701 try
702 n = s:does_not_exist
703 catch /E121:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200704 n = 111
705 endtry
706 assert_equal(111, n)
707
708 try
709 n = g:does_not_exist
710 catch /E121:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200711 n = 121
712 endtry
713 assert_equal(121, n)
714
Bram Moolenaare0de1712020-12-02 17:36:54 +0100715 var d = {one: 1}
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200716 try
717 n = d[g:astring]
718 catch /E716:/
719 n = 222
720 endtry
721 assert_equal(222, n)
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200722
723 try
724 n = -g:astring
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200725 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200726 n = 233
727 endtry
728 assert_equal(233, n)
729
730 try
731 n = +g:astring
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200732 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200733 n = 244
734 endtry
735 assert_equal(244, n)
736
737 try
738 n = +g:alist
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200739 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200740 n = 255
741 endtry
742 assert_equal(255, n)
743
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200744 var nd: dict<any>
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200745 try
Bram Moolenaar2e5910b2021-02-03 17:41:24 +0100746 nd = {[g:alist]: 1}
747 catch /E1105:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200748 n = 266
749 endtry
750 assert_equal(266, n)
751
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000752 l = [1, 2, 3]
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200753 try
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +0000754 [n] = l
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200755 catch /E1093:/
756 n = 277
757 endtry
758 assert_equal(277, n)
759
Bram Moolenaare8593122020-07-18 15:17:02 +0200760 try
761 &ts = g:astring
Bram Moolenaar5e654232020-09-16 15:22:00 +0200762 catch /E1012:/
Bram Moolenaare8593122020-07-18 15:17:02 +0200763 n = 288
764 endtry
765 assert_equal(288, n)
766
767 try
768 &backspace = 'asdf'
769 catch /E474:/
770 n = 299
771 endtry
772 assert_equal(299, n)
773
774 l = [1]
775 try
776 l[3] = 3
777 catch /E684:/
778 n = 300
779 endtry
780 assert_equal(300, n)
781
782 try
Bram Moolenaare8593122020-07-18 15:17:02 +0200783 unlet g:does_not_exist
784 catch /E108:/
785 n = 322
786 endtry
787 assert_equal(322, n)
788
789 try
Bram Moolenaar2bede172020-11-19 18:53:18 +0100790 d = {text: 1, [g:astring]: 2}
Bram Moolenaare8593122020-07-18 15:17:02 +0200791 catch /E721:/
792 n = 333
793 endtry
794 assert_equal(333, n)
795
796 try
Bram Moolenaar62aec932022-01-29 21:45:34 +0000797 l = g:DeletedFunc()
Bram Moolenaare8593122020-07-18 15:17:02 +0200798 catch /E933:/
799 n = 344
800 endtry
801 assert_equal(344, n)
Bram Moolenaard032f342020-07-18 18:13:02 +0200802
803 try
Yegappan Lakshmanana764e732021-07-25 15:57:32 +0200804 echo range(1, 2, 0)
805 catch /E726:/
Bram Moolenaard032f342020-07-18 18:13:02 +0200806 n = 355
807 endtry
808 assert_equal(355, n)
809
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200810 var P = function('g:NoSuchFunc')
Bram Moolenaard032f342020-07-18 18:13:02 +0200811 delfunc g:NoSuchFunc
812 try
813 echo P()
814 catch /E117:/
815 n = 366
816 endtry
817 assert_equal(366, n)
818
819 try
820 echo g:NoSuchFunc()
821 catch /E117:/
822 n = 377
823 endtry
824 assert_equal(377, n)
825
826 try
827 echo g:alist + 4
828 catch /E745:/
829 n = 388
830 endtry
831 assert_equal(388, n)
832
833 try
834 echo 4 + g:alist
835 catch /E745:/
836 n = 399
837 endtry
838 assert_equal(399, n)
839
840 try
841 echo g:alist.member
842 catch /E715:/
843 n = 400
844 endtry
845 assert_equal(400, n)
846
847 try
848 echo d.member
849 catch /E716:/
850 n = 411
851 endtry
852 assert_equal(411, n)
Bram Moolenaard9d77892021-02-12 21:32:47 +0100853
854 var counter = 0
855 for i in range(4)
856 try
857 eval [][0]
858 catch
859 endtry
860 counter += 1
861 endfor
862 assert_equal(4, counter)
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100863
Bram Moolenaar9fa5dab2021-07-20 19:18:44 +0200864 # no requirement for spaces before |
865 try|echo 0|catch|endtry
866
Bram Moolenaar003312b2021-12-20 10:55:35 +0000867 # return in try with finally
868 def ReturnInTry(): number
869 var ret = 4
870 try
871 return ret
872 catch /this/
873 return -1
874 catch /that/
875 return -1
876 finally
877 # changing ret has no effect
878 ret = 7
879 endtry
880 return -2
881 enddef
882 assert_equal(4, ReturnInTry())
883
884 # return in catch with finally
885 def ReturnInCatch(): number
886 var ret = 5
887 try
888 throw 'getout'
Bram Moolenaar9d383f32023-05-14 21:38:12 +0100889 return -1 # "unreachable code"
Bram Moolenaar003312b2021-12-20 10:55:35 +0000890 catch /getout/
891 # ret is evaluated here
892 return ret
893 finally
894 # changing ret later has no effect
895 ret = -3
896 endtry
897 return -2
898 enddef
899 assert_equal(5, ReturnInCatch())
900
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100901 # return in finally after empty catch
902 def ReturnInFinally(): number
903 try
904 finally
Bram Moolenaar003312b2021-12-20 10:55:35 +0000905 return 6
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100906 endtry
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100907 enddef
Bram Moolenaar003312b2021-12-20 10:55:35 +0000908 assert_equal(6, ReturnInFinally())
Bram Moolenaar8ac681a2021-06-15 20:06:34 +0200909
910 var lines =<< trim END
911 vim9script
912 try
913 acos('0.5')
914 ->setline(1)
915 catch
916 g:caught = v:exception
917 endtry
918 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000919 v9.CheckScriptSuccess(lines)
Yegappan Lakshmanan4490ec42021-07-27 22:00:44 +0200920 assert_match('E1219: Float or Number required for argument 1', g:caught)
Bram Moolenaar8ac681a2021-06-15 20:06:34 +0200921 unlet g:caught
Bram Moolenaar41978282021-07-04 14:47:30 +0200922
923 # missing catch and/or finally
924 lines =<< trim END
925 vim9script
926 try
927 echo 'something'
928 endtry
929 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000930 v9.CheckScriptFailure(lines, 'E1032:')
rbtnn84934992021-08-07 13:26:53 +0200931
932 # skipping try-finally-endtry when try-finally-endtry is used in another block
933 lines =<< trim END
934 if v:true
935 try
936 finally
937 endtry
938 else
939 try
940 finally
941 endtry
942 endif
943 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000944 v9.CheckDefAndScriptSuccess(lines)
Yee Cheng Chin2051af12025-01-09 22:14:34 +0100945
946 # test that the v:exception stacks are correctly restored
947 try
948 try
949 throw 101
950 catch
951 assert_equal('101', v:exception)
952 try
953 catch
954 finally
955 assert_equal('101', v:exception) # finally shouldn't clear if it doesn't own it
956 endtry
957 assert_equal('101', v:exception)
958 throw 102 # Re-throw inside catch block
959 endtry
960 catch
961 assert_equal('102', v:exception)
962 try
963 throw 103 # throw inside nested exception stack
964 catch
965 assert_equal('103', v:exception)
966 endtry
967 assert_equal('102', v:exception) # restored stack
968 finally
969 assert_equal('', v:exception) # finally should clear if it owns the exception
970 endtry
971 try
972 try
973 throw 104
974 catch
975 try
976 exec 'nonexistent_cmd' # normal exception inside nested exception stack
977 catch
978 assert_match('E492:', v:exception)
979 endtry
980 eval [][0] # normal exception inside catch block
981 endtry
982 catch
983 assert_match('E684:', v:exception)
984 endtry
985 assert_equal('', v:exception) # All exceptions properly popped
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100986enddef
987
Bram Moolenaara2c00282023-05-14 22:05:15 +0100988def Test_unreachable_after()
989 var lines =<< trim END
990 try
991 throw 'Error'
992 echo 'not reached'
993 catch /Error/
994 endtry
995 END
996 v9.CheckDefFailure(lines, 'E1095: Unreachable code after :throw')
997
998 lines =<< trim END
999 def SomeFunc(): number
1000 try
1001 return 3
1002 echo 'not reached'
1003 catch /Error/
1004 endtry
1005 return 4
1006 enddef
1007 defcompile
1008 END
1009 v9.CheckScriptFailure(lines, 'E1095: Unreachable code after :return')
1010enddef
1011
Bram Moolenaar3ef2e412023-04-30 18:50:48 +01001012def Test_throw_in_nested_try()
1013 var lines =<< trim END
1014 vim9script
1015
1016 def Try(F: func(): void)
1017 try
1018 F()
1019 catch
1020 endtry
1021 enddef
1022
1023 class X
1024 def F()
1025 try
1026 throw 'Foobar'
1027 catch
1028 throw v:exception
1029 endtry
1030 enddef
1031 endclass
1032
1033 def Test_TryMethod()
1034 var x = X.new()
1035 Try(() => x.F())
1036 enddef
1037
1038
1039 try
1040 Test_TryMethod()
1041 catch
1042 endtry
1043 END
1044 v9.CheckScriptSuccess(lines)
1045enddef
1046
Bram Moolenaar28bf6492022-03-03 15:11:20 +00001047def Test_try_var_decl()
1048 var lines =<< trim END
1049 vim9script
1050 try
1051 var in_try = 1
1052 assert_equal(1, get(s:, 'in_try', -1))
1053 throw "getout"
1054 catch
1055 var in_catch = 2
1056 assert_equal(-1, get(s:, 'in_try', -1))
1057 assert_equal(2, get(s:, 'in_catch', -1))
1058 finally
1059 var in_finally = 3
1060 assert_equal(-1, get(s:, 'in_try', -1))
1061 assert_equal(-1, get(s:, 'in_catch', -1))
1062 assert_equal(3, get(s:, 'in_finally', -1))
1063 endtry
1064 assert_equal(-1, get(s:, 'in_try', -1))
1065 assert_equal(-1, get(s:, 'in_catch', -1))
1066 assert_equal(-1, get(s:, 'in_finally', -1))
1067 END
1068 v9.CheckScriptSuccess(lines)
1069enddef
1070
Bram Moolenaar53c29612022-01-12 16:18:18 +00001071def Test_try_ends_in_return()
1072 var lines =<< trim END
1073 vim9script
1074 def Foo(): string
1075 try
1076 return 'foo'
1077 catch
1078 return 'caught'
1079 endtry
1080 enddef
1081 assert_equal('foo', Foo())
1082 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001083 v9.CheckScriptSuccess(lines)
Bram Moolenaar53c29612022-01-12 16:18:18 +00001084
1085 lines =<< trim END
1086 vim9script
1087 def Foo(): string
1088 try
1089 return 'foo'
1090 catch
1091 return 'caught'
1092 endtry
1093 echo 'notreached'
1094 enddef
1095 assert_equal('foo', Foo())
1096 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001097 v9.CheckScriptFailure(lines, 'E1095:')
Bram Moolenaar53c29612022-01-12 16:18:18 +00001098
1099 lines =<< trim END
1100 vim9script
1101 def Foo(): string
1102 try
1103 return 'foo'
1104 catch /x/
1105 return 'caught'
1106 endtry
1107 enddef
1108 assert_equal('foo', Foo())
1109 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001110 v9.CheckScriptFailure(lines, 'E1027:')
Bram Moolenaar53c29612022-01-12 16:18:18 +00001111
1112 lines =<< trim END
1113 vim9script
1114 def Foo(): string
1115 try
1116 echo 'foo'
1117 catch
1118 echo 'caught'
1119 finally
1120 return 'done'
1121 endtry
1122 enddef
1123 assert_equal('done', Foo())
1124 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001125 v9.CheckScriptSuccess(lines)
Bram Moolenaar53c29612022-01-12 16:18:18 +00001126
1127enddef
1128
Bram Moolenaar3f987b52021-06-30 12:02:24 +02001129def Test_try_in_catch()
1130 var lines =<< trim END
1131 vim9script
1132 var seq = []
1133 def DoIt()
1134 try
1135 seq->add('throw 1')
1136 eval [][0]
1137 seq->add('notreached')
1138 catch
1139 seq->add('catch')
1140 try
1141 seq->add('throw 2')
1142 eval [][0]
1143 seq->add('notreached')
1144 catch /nothing/
1145 seq->add('notreached')
1146 endtry
1147 seq->add('done')
1148 endtry
1149 enddef
1150 DoIt()
1151 assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq)
1152 END
1153enddef
1154
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001155def Test_error_in_catch()
1156 var lines =<< trim END
1157 try
1158 eval [][0]
1159 catch /E684:/
1160 eval [][0]
1161 endtry
1162 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001163 v9.CheckDefExecFailure(lines, 'E684:', 4)
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001164enddef
1165
Bram Moolenaar2e34c342021-03-14 12:13:33 +01001166" :while at the very start of a function that :continue jumps to
Bram Moolenaar62aec932022-01-29 21:45:34 +00001167def s:TryContinueFunc()
Bram Moolenaar2e34c342021-03-14 12:13:33 +01001168 while g:Count < 2
1169 g:sequence ..= 't'
1170 try
1171 echoerr 'Test'
1172 catch
1173 g:Count += 1
1174 g:sequence ..= 'c'
1175 continue
1176 endtry
1177 g:sequence ..= 'e'
1178 g:Count += 1
1179 endwhile
1180enddef
1181
1182def Test_continue_in_try_in_while()
1183 g:Count = 0
1184 g:sequence = ''
1185 TryContinueFunc()
1186 assert_equal('tctc', g:sequence)
1187 unlet g:Count
1188 unlet g:sequence
1189enddef
1190
Bram Moolenaar873f8242022-03-10 21:53:44 +00001191def Test_break_in_try_in_for()
1192 var lines =<< trim END
1193 vim9script
1194 def Ls(): list<string>
1195 var ls: list<string>
1196 for s in ['abc', 'def']
1197 for _ in [123, 456]
1198 try
1199 eval [][0]
1200 catch
1201 break
1202 endtry
1203 endfor
1204 ls += [s]
1205 endfor
1206 return ls
1207 enddef
1208 assert_equal(['abc', 'def'], Ls())
1209 END
1210 v9.CheckScriptSuccess(lines)
1211enddef
1212
Bram Moolenaar9cb577a2021-02-22 22:45:10 +01001213def Test_nocatch_return_in_try()
1214 # return in try block returns normally
1215 def ReturnInTry(): string
1216 try
1217 return '"some message"'
1218 catch
1219 endtry
1220 return 'not reached'
1221 enddef
1222 exe 'echoerr ' .. ReturnInTry()
1223enddef
1224
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001225def Test_cnext_works_in_catch()
John Marriott45377e22025-03-27 18:12:32 +01001226 CheckFeature quickfix
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001227 var lines =<< trim END
1228 vim9script
Bram Moolenaarc3235272021-07-10 19:42:03 +02001229 au BufEnter * eval 1 + 2
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001230 writefile(['text'], 'Xcncfile1')
1231 writefile(['text'], 'Xcncfile2')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001232 var items = [
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001233 {lnum: 1, filename: 'Xcncfile1', valid: true},
1234 {lnum: 1, filename: 'Xcncfile2', valid: true}
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001235 ]
1236 setqflist([], ' ', {items: items})
1237 cwindow
1238
1239 def CnextOrCfirst()
1240 # if cnext fails, cfirst is used
1241 try
1242 cnext
1243 catch
1244 cfirst
1245 endtry
1246 enddef
1247
1248 CnextOrCfirst()
1249 CnextOrCfirst()
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001250 writefile([getqflist({idx: 0}).idx], 'Xcncresult')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001251 qall
1252 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001253 writefile(lines, 'XCatchCnext', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001254 g:RunVim([], [], '--clean -S XCatchCnext')
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001255 assert_equal(['1'], readfile('Xcncresult'))
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001256
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001257 delete('Xcncfile1')
1258 delete('Xcncfile2')
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001259 delete('Xcncresult')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001260enddef
1261
Bram Moolenaar9e1d9e32021-01-11 20:17:34 +01001262def Test_throw_skipped()
1263 if 0
1264 throw dontgethere
1265 endif
1266enddef
1267
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001268def Test_nocatch_throw_silenced()
1269 var lines =<< trim END
1270 vim9script
1271 def Func()
1272 throw 'error'
1273 enddef
1274 silent! Func()
1275 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001276 writefile(lines, 'XthrowSilenced', 'D')
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001277 source XthrowSilenced
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001278enddef
1279
Bram Moolenaara2c00282023-05-14 22:05:15 +01001280" g:DeletedFunc() is found when compiling Test_try_catch_throw() and then
1281" deleted, this should give a runtime error.
Bram Moolenaare8593122020-07-18 15:17:02 +02001282def DeletedFunc(): list<any>
1283 return ['delete me']
1284enddef
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001285defcompile DeletedFunc
1286
1287call test_override('unreachable', 1)
1288defcompile Test_try_catch_throw
1289call test_override('unreachable', 0)
1290
Bram Moolenaare8593122020-07-18 15:17:02 +02001291delfunc DeletedFunc
1292
Bram Moolenaar62aec932022-01-29 21:45:34 +00001293def s:ThrowFromDef()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001294 throw "getout" # comment
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001295enddef
1296
Bram Moolenaar62aec932022-01-29 21:45:34 +00001297func s:CatchInFunc()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001298 try
Bram Moolenaar62aec932022-01-29 21:45:34 +00001299 call s:ThrowFromDef()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001300 catch
1301 let g:thrown_func = v:exception
1302 endtry
1303endfunc
1304
Bram Moolenaar62aec932022-01-29 21:45:34 +00001305def s:CatchInDef()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001306 try
1307 ThrowFromDef()
1308 catch
1309 g:thrown_def = v:exception
1310 endtry
1311enddef
1312
Bram Moolenaar62aec932022-01-29 21:45:34 +00001313def s:ReturnFinally(): string
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001314 try
1315 return 'intry'
Bram Moolenaar204852a2022-03-05 12:56:44 +00001316 finally
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001317 g:in_finally = 'finally'
1318 endtry
1319 return 'end'
1320enddef
1321
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001322def Test_try_catch_nested()
1323 CatchInFunc()
1324 assert_equal('getout', g:thrown_func)
1325
1326 CatchInDef()
1327 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001328
1329 assert_equal('intry', ReturnFinally())
1330 assert_equal('finally', g:in_finally)
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001331
1332 var l = []
1333 try
1334 l->add('1')
1335 throw 'bad'
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001336 l->add('x') # "unreachable code"
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001337 catch /bad/
1338 l->add('2')
1339 try
1340 l->add('3')
1341 throw 'one'
1342 l->add('x')
1343 catch /one/
1344 l->add('4')
1345 try
1346 l->add('5')
1347 throw 'more'
1348 l->add('x')
1349 catch /more/
1350 l->add('6')
1351 endtry
1352 endtry
1353 endtry
1354 assert_equal(['1', '2', '3', '4', '5', '6'], l)
Bram Moolenaar834193a2021-06-30 20:39:15 +02001355
1356 l = []
1357 try
1358 try
1359 l->add('1')
1360 throw 'foo'
1361 l->add('x')
1362 catch
1363 l->add('2')
1364 throw 'bar'
1365 l->add('x')
1366 finally
1367 l->add('3')
1368 endtry
1369 l->add('x')
1370 catch /bar/
1371 l->add('4')
1372 endtry
1373 assert_equal(['1', '2', '3', '4'], l)
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001374enddef
1375
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001376call test_override('unreachable', 1)
1377defcompile Test_try_catch_nested
1378call test_override('unreachable', 0)
1379
Bram Moolenaar62aec932022-01-29 21:45:34 +00001380def s:TryOne(): number
Bram Moolenaar9939f572020-09-16 22:29:52 +02001381 try
1382 return 0
1383 catch
1384 endtry
1385 return 0
1386enddef
1387
Bram Moolenaar62aec932022-01-29 21:45:34 +00001388def s:TryTwo(n: number): string
Bram Moolenaar9939f572020-09-16 22:29:52 +02001389 try
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001390 var x = {}
Bram Moolenaar9939f572020-09-16 22:29:52 +02001391 catch
1392 endtry
1393 return 'text'
1394enddef
1395
1396def Test_try_catch_twice()
1397 assert_equal('text', TryOne()->TryTwo())
1398enddef
1399
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001400def Test_try_catch_match()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001401 var seq = 'a'
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001402 try
1403 throw 'something'
1404 catch /nothing/
1405 seq ..= 'x'
1406 catch /some/
1407 seq ..= 'b'
1408 catch /asdf/
1409 seq ..= 'x'
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001410 catch ?a\?sdf?
1411 seq ..= 'y'
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001412 finally
1413 seq ..= 'c'
1414 endtry
1415 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001416enddef
1417
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001418def Test_try_catch_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001419 v9.CheckDefFailure(['catch'], 'E603:')
1420 v9.CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1421 v9.CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1422 v9.CheckDefFailure(['finally'], 'E606:')
1423 v9.CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1424 v9.CheckDefFailure(['endtry'], 'E602:')
1425 v9.CheckDefFailure(['while 1', 'endtry'], 'E170:')
1426 v9.CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1427 v9.CheckDefFailure(['if 1', 'endtry'], 'E171:')
1428 v9.CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001429
Bram Moolenaar62aec932022-01-29 21:45:34 +00001430 v9.CheckDefFailure(['throw'], 'E1143:')
1431 v9.CheckDefFailure(['throw xxx'], 'E1001:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001432enddef
1433
Bram Moolenaar7c5b3c0362021-02-14 22:40:57 +01001434def Try_catch_skipped()
1435 var l = []
1436 try
1437 finally
1438 endtry
1439
1440 if 1
1441 else
1442 try
1443 endtry
1444 endif
1445enddef
1446
1447" The skipped try/endtry was updating the wrong instruction.
1448def Test_try_catch_skipped()
1449 var instr = execute('disassemble Try_catch_skipped')
1450 assert_match("NEWLIST size 0\n", instr)
1451enddef
1452
Bram Moolenaar90a57162022-02-12 14:23:17 +00001453def Test_throw_line_number()
1454 def Func()
1455 eval 1 + 1
1456 eval 2 + 2
1457 throw 'exception'
1458 enddef
Yee Cheng Chin2051af12025-01-09 22:14:34 +01001459 def Func2()
1460 eval 1 + 1
1461 eval 2 + 2
1462 eval 3 + 3
1463 throw 'exception'
1464 enddef
Bram Moolenaar90a57162022-02-12 14:23:17 +00001465 try
1466 Func()
1467 catch /exception/
Yee Cheng Chin2051af12025-01-09 22:14:34 +01001468 try
1469 Func2()
1470 catch /exception/
1471 assert_match('line 4', v:throwpoint)
1472 endtry
Bram Moolenaar90a57162022-02-12 14:23:17 +00001473 assert_match('line 3', v:throwpoint)
1474 endtry
Yee Cheng Chin2051af12025-01-09 22:14:34 +01001475 assert_match('', v:throwpoint)
Bram Moolenaar90a57162022-02-12 14:23:17 +00001476enddef
Bram Moolenaar7c5b3c0362021-02-14 22:40:57 +01001477
1478
Bram Moolenaar006ad482020-06-30 20:55:15 +02001479def Test_throw_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001480 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001481 var lines =<< trim END
Bram Moolenaar006ad482020-06-30 20:55:15 +02001482 vim9script
1483 try
1484 throw 'one'
1485 .. 'two'
1486 catch
1487 assert_equal('onetwo', v:exception)
1488 endtry
1489 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001490 v9.CheckScriptSuccess(lines)
Bram Moolenaar1e021e62020-10-16 20:25:23 +02001491
1492 lines =<< trim END
1493 vim9script
Bram Moolenaar352134b2020-10-17 22:04:08 +02001494 @r = ''
Bram Moolenaar1e021e62020-10-16 20:25:23 +02001495 def Func()
1496 throw @r
1497 enddef
1498 var result = ''
1499 try
1500 Func()
1501 catch /E1129:/
1502 result = 'caught'
1503 endtry
1504 assert_equal('caught', result)
1505 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001506 v9.CheckScriptSuccess(lines)
Bram Moolenaar006ad482020-06-30 20:55:15 +02001507enddef
1508
Bram Moolenaared677f52020-08-12 16:38:10 +02001509def Test_error_in_nested_function()
Bram Moolenaar03dfde22021-02-14 13:17:22 +01001510 # an error in a nested :function aborts executing in the calling :def function
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001511 var lines =<< trim END
Bram Moolenaared677f52020-08-12 16:38:10 +02001512 vim9script
1513 def Func()
1514 Error()
1515 g:test_var = 1
1516 enddef
1517 func Error() abort
1518 eval [][0]
1519 endfunc
1520 Func()
1521 END
1522 g:test_var = 0
Bram Moolenaar62aec932022-01-29 21:45:34 +00001523 v9.CheckScriptFailure(lines, 'E684:')
Bram Moolenaared677f52020-08-12 16:38:10 +02001524 assert_equal(0, g:test_var)
1525enddef
1526
Bram Moolenaar227c58a2021-04-28 20:40:44 +02001527def Test_abort_after_error()
1528 var lines =<< trim END
1529 vim9script
1530 while true
1531 echo notfound
1532 endwhile
1533 g:gotthere = true
1534 END
1535 g:gotthere = false
Bram Moolenaar62aec932022-01-29 21:45:34 +00001536 v9.CheckScriptFailure(lines, 'E121:')
Bram Moolenaar227c58a2021-04-28 20:40:44 +02001537 assert_false(g:gotthere)
1538 unlet g:gotthere
1539enddef
1540
Bram Moolenaar37c83712020-06-30 21:18:36 +02001541def Test_cexpr_vimscript()
John Marriott45377e22025-03-27 18:12:32 +01001542 CheckFeature quickfix
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001543 # only checks line continuation
Bram Moolenaar37c83712020-06-30 21:18:36 +02001544 set errorformat=File\ %f\ line\ %l
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001545 var lines =<< trim END
Bram Moolenaar37c83712020-06-30 21:18:36 +02001546 vim9script
1547 cexpr 'File'
1548 .. ' someFile' ..
1549 ' line 19'
1550 assert_equal(19, getqflist()[0].lnum)
1551 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001552 v9.CheckScriptSuccess(lines)
Bram Moolenaar397a87a2022-03-20 21:14:15 +00001553
1554 lines =<< trim END
1555 vim9script
1556 def CexprFail()
1557 au QuickfixCmdPre * echo g:doesnotexist
1558 cexpr 'File otherFile line 99'
1559 g:didContinue = 'yes'
1560 enddef
1561 CexprFail()
1562 g:didContinue = 'also'
1563 END
1564 g:didContinue = 'no'
1565 v9.CheckScriptFailure(lines, 'E121: Undefined variable: g:doesnotexist')
1566 assert_equal('no', g:didContinue)
1567 au! QuickfixCmdPre
1568
1569 lines =<< trim END
1570 vim9script
1571 def CexprFail()
1572 cexpr g:aNumber
1573 g:didContinue = 'yes'
1574 enddef
1575 CexprFail()
1576 g:didContinue = 'also'
1577 END
1578 g:aNumber = 123
1579 g:didContinue = 'no'
1580 v9.CheckScriptFailure(lines, 'E777: String or List expected')
1581 assert_equal('no', g:didContinue)
1582 unlet g:didContinue
1583
Bram Moolenaar37c83712020-06-30 21:18:36 +02001584 set errorformat&
1585enddef
1586
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001587def Test_statusline_syntax()
1588 # legacy syntax is used for 'statusline'
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001589 var lines =<< trim END
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001590 vim9script
1591 func g:Status()
1592 return '%{"x" is# "x"}'
1593 endfunc
1594 set laststatus=2 statusline=%!Status()
1595 redrawstatus
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00001596 set laststatus statusline=
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001597 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001598 v9.CheckScriptSuccess(lines)
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001599enddef
1600
Bram Moolenaarb2097502020-07-19 17:17:02 +02001601def Test_list_vimscript()
1602 # checks line continuation and comments
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001603 var lines =<< trim END
Bram Moolenaarb2097502020-07-19 17:17:02 +02001604 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001605 var mylist = [
Bram Moolenaarb2097502020-07-19 17:17:02 +02001606 'one',
1607 # comment
1608 'two', # empty line follows
1609
1610 'three',
1611 ]
1612 assert_equal(['one', 'two', 'three'], mylist)
1613 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001614 v9.CheckScriptSuccess(lines)
Bram Moolenaar66250c92020-08-20 15:02:42 +02001615
1616 # check all lines from heredoc are kept
1617 lines =<< trim END
1618 # comment 1
1619 two
1620 # comment 3
1621
1622 five
1623 # comment 6
1624 END
1625 assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
Bram Moolenaar4bce26b2021-01-22 22:06:56 +01001626
1627 lines =<< trim END
1628 [{
1629 a: 0}]->string()->assert_equal("[{'a': 0}]")
1630 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001631 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarb2097502020-07-19 17:17:02 +02001632enddef
1633
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001634if has('channel')
1635 let someJob = test_null_job()
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001636
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001637 def FuncWithError()
1638 echomsg g:someJob
1639 enddef
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001640
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001641 func Test_convert_emsg_to_exception()
1642 try
1643 call FuncWithError()
1644 catch
1645 call assert_match('Vim:E908:', v:exception)
1646 endtry
1647 endfunc
1648endif
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001649
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001650def Test_vim9script_mix()
1651 var lines =<< trim END
1652 if has(g:feature)
1653 " legacy script
1654 let g:legacy = 1
1655 finish
1656 endif
1657 vim9script
1658 g:legacy = 0
1659 END
1660 g:feature = 'eval'
1661 g:legacy = -1
Bram Moolenaar62aec932022-01-29 21:45:34 +00001662 v9.CheckScriptSuccess(lines)
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001663 assert_equal(1, g:legacy)
1664
1665 g:feature = 'noteval'
1666 g:legacy = -1
Bram Moolenaar62aec932022-01-29 21:45:34 +00001667 v9.CheckScriptSuccess(lines)
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001668 assert_equal(0, g:legacy)
1669enddef
1670
Bram Moolenaar750802b2020-02-23 18:08:33 +01001671def Test_vim9script_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001672 v9.CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
1673 v9.CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +01001674
Bram Moolenaar62aec932022-01-29 21:45:34 +00001675 v9.CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1676 v9.CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
Bram Moolenaarc785b9a2020-06-19 18:34:15 +02001677
Bram Moolenaare2e40752020-09-04 21:18:46 +02001678 assert_fails('vim9script', 'E1038:')
Bram Moolenaar107f7322022-02-06 17:30:41 +00001679 v9.CheckDefFailure(['vim9script'], 'E1038:')
Bram Moolenaar8cbf2492022-02-06 20:28:13 +00001680
1681 # no error when skipping
1682 if has('nothing')
1683 vim9script
1684 endif
Bram Moolenaarc970e422021-03-17 15:03:04 +01001685enddef
1686
Bram Moolenaar6c3843c2021-03-04 12:38:21 +01001687def Test_script_var_shadows_function()
1688 var lines =<< trim END
1689 vim9script
1690 def Func(): number
1691 return 123
1692 enddef
1693 var Func = 1
1694 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001695 v9.CheckScriptFailure(lines, 'E1041:', 5)
Bram Moolenaar6c3843c2021-03-04 12:38:21 +01001696enddef
1697
Bram Moolenaar052ff292021-12-11 13:54:46 +00001698def Test_function_shadows_script_var()
1699 var lines =<< trim END
1700 vim9script
1701 var Func = 1
1702 def Func(): number
1703 return 123
1704 enddef
1705 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001706 v9.CheckScriptFailure(lines, 'E1041:', 3)
Bram Moolenaar052ff292021-12-11 13:54:46 +00001707enddef
1708
Bram Moolenaarc3235272021-07-10 19:42:03 +02001709def Test_script_var_shadows_command()
1710 var lines =<< trim END
1711 var undo = 1
1712 undo = 2
1713 assert_equal(2, undo)
1714 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001715 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc3235272021-07-10 19:42:03 +02001716
1717 lines =<< trim END
1718 var undo = 1
1719 undo
1720 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001721 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaarc3235272021-07-10 19:42:03 +02001722enddef
1723
Bram Moolenaar2ef91562021-12-11 16:14:07 +00001724def Test_vim9script_call_wrong_type()
1725 var lines =<< trim END
1726 vim9script
1727 var Time = 'localtime'
1728 Time()
1729 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001730 v9.CheckScriptFailure(lines, 'E1085:')
Bram Moolenaar2ef91562021-12-11 16:14:07 +00001731enddef
1732
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001733def Test_vim9script_reload_delfunc()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001734 var first_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001735 vim9script
1736 def FuncYes(): string
1737 return 'yes'
1738 enddef
1739 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001740 var withno_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001741 def FuncNo(): string
1742 return 'no'
1743 enddef
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001744 def g:DoCheck(no_exists: bool)
1745 assert_equal('yes', FuncYes())
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001746 assert_equal('no', FuncNo())
1747 enddef
1748 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001749 var nono_lines =<< trim END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001750 def g:DoCheck(no_exists: bool)
1751 assert_equal('yes', FuncYes())
Bram Moolenaar44d66522020-09-06 22:26:57 +02001752 assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001753 enddef
1754 END
1755
1756 # FuncNo() is defined
Bram Moolenaardd674772022-09-15 22:26:18 +01001757 writefile(first_lines + withno_lines, 'Xreloaded.vim', 'D')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001758 source Xreloaded.vim
1759 g:DoCheck(true)
1760
1761 # FuncNo() is not redefined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001762 writefile(first_lines + nono_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001763 source Xreloaded.vim
Bram Moolenaar50824712020-12-20 21:10:17 +01001764 g:DoCheck(false)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001765
1766 # FuncNo() is back
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001767 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001768 source Xreloaded.vim
Bram Moolenaar50824712020-12-20 21:10:17 +01001769 g:DoCheck(false)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001770enddef
1771
Bram Moolenaar89483d42020-05-10 15:24:44 +02001772def Test_vim9script_reload_delvar()
1773 # write the script with a script-local variable
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001774 var lines =<< trim END
Bram Moolenaar89483d42020-05-10 15:24:44 +02001775 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001776 var name = 'string'
Bram Moolenaar89483d42020-05-10 15:24:44 +02001777 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001778 writefile(lines, 'XreloadVar.vim', 'D')
Bram Moolenaar89483d42020-05-10 15:24:44 +02001779 source XreloadVar.vim
1780
1781 # now write the script using the same variable locally - works
1782 lines =<< trim END
1783 vim9script
1784 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001785 var name = 'string'
Bram Moolenaar89483d42020-05-10 15:24:44 +02001786 enddef
1787 END
1788 writefile(lines, 'XreloadVar.vim')
1789 source XreloadVar.vim
Bram Moolenaar89483d42020-05-10 15:24:44 +02001790enddef
1791
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001792def Test_func_redefine_error()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001793 var lines = [
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001794 'vim9script',
1795 'def Func()',
1796 ' eval [][0]',
1797 'enddef',
1798 'Func()',
1799 ]
Bram Moolenaardd674772022-09-15 22:26:18 +01001800 writefile(lines, 'Xtestscript.vim', 'D')
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001801
1802 for count in range(3)
1803 try
1804 source Xtestscript.vim
1805 catch /E684/
1806 # function name should contain <SNR> every time
Bram Moolenaarec892232022-05-06 17:53:06 +01001807 assert_match('E684: List index out of range', v:exception)
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001808 assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1809 endtry
1810 endfor
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001811enddef
1812
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001813def Test_func_redefine_fails()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001814 var lines =<< trim END
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001815 vim9script
1816 def Func()
1817 echo 'one'
1818 enddef
1819 def Func()
1820 echo 'two'
1821 enddef
1822 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001823 v9.CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001824
1825 lines =<< trim END
1826 vim9script
1827 def Foo(): string
1828 return 'foo'
Bram Moolenaar052ff292021-12-11 13:54:46 +00001829 enddef
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001830 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001831 var Foo = {-> 'lambda'}
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001832 enddef
1833 defcompile
1834 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001835 v9.CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001836enddef
1837
Bram Moolenaar91c7cbf2022-08-18 13:28:31 +01001838def Test_lambda_split()
1839 # this was using freed memory, because of the split expression
1840 var lines =<< trim END
1841 vim9script
1842 try
1843 0
1844 0->(0
1845 ->a.0(
1846 ->u
1847 END
1848 v9.CheckScriptFailure(lines, 'E1050:')
1849enddef
1850
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001851def Test_fixed_size_list()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001852 # will be allocated as one piece of memory, check that changes work
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001853 var l = [1, 2, 3, 4]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001854 l->remove(0)
1855 l->add(5)
1856 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001857 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001858enddef
1859
Bram Moolenaarae616492020-07-28 20:07:27 +02001860def Test_no_insert_xit()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001861 v9.CheckDefExecFailure(['a = 1'], 'E1100:')
1862 v9.CheckDefExecFailure(['c = 1'], 'E1100:')
1863 v9.CheckDefExecFailure(['i = 1'], 'E1100:')
1864 v9.CheckDefExecFailure(['t = 1'], 'E1100:')
1865 v9.CheckDefExecFailure(['x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02001866
Bram Moolenaar62aec932022-01-29 21:45:34 +00001867 v9.CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1868 v9.CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1869 v9.CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1870 v9.CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1871 v9.CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1872 v9.CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1873 v9.CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
1874 v9.CheckScriptFailure(['vim9script', 'o'], 'E1100:')
1875 v9.CheckScriptFailure(['vim9script', 't'], 'E1100:')
1876 v9.CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1877 v9.CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02001878enddef
1879
Bram Moolenaar62aec932022-01-29 21:45:34 +00001880def s:IfElse(what: number): string
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001881 var res = ''
Bram Moolenaar158906c2020-02-06 20:39:45 +01001882 if what == 1
1883 res = "one"
1884 elseif what == 2
1885 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001886 else
Bram Moolenaar158906c2020-02-06 20:39:45 +01001887 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001888 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +01001889 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001890enddef
1891
Bram Moolenaar158906c2020-02-06 20:39:45 +01001892def Test_if_elseif_else()
1893 assert_equal('one', IfElse(1))
1894 assert_equal('two', IfElse(2))
1895 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001896enddef
1897
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001898def Test_if_elseif_else_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001899 v9.CheckDefFailure(['elseif true'], 'E582:')
1900 v9.CheckDefFailure(['else'], 'E581:')
1901 v9.CheckDefFailure(['endif'], 'E580:')
1902 v9.CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
1903 v9.CheckDefFailure(['if true', 'echo 1'], 'E171:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01001904
1905 var lines =<< trim END
1906 var s = ''
1907 if s = ''
1908 endif
1909 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001910 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01001911
1912 lines =<< trim END
1913 var s = ''
1914 if s == ''
1915 elseif s = ''
1916 endif
1917 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001918 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaarfa010cd2022-04-03 16:13:07 +01001919
1920 lines =<< trim END
1921 var cond = true
1922 if cond
1923 echo 'true'
1924 elseif
1925 echo 'false'
1926 endif
1927 END
1928 v9.CheckDefAndScriptFailure(lines, ['E1143:', 'E15:'], 4)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001929enddef
1930
Bram Moolenaar505ed0c2022-05-05 17:02:46 +01001931def Test_if_else_func_using_var()
1932 var lines =<< trim END
1933 vim9script
1934
1935 const debug = true
1936 if debug
1937 var mode_chars = 'something'
1938 def Bits2Ascii()
1939 var x = mode_chars
1940 g:where = 'in true'
1941 enddef
1942 else
1943 def Bits2Ascii()
1944 g:where = 'in false'
1945 enddef
1946 endif
1947
1948 Bits2Ascii()
1949 END
1950 v9.CheckScriptSuccess(lines)
1951 assert_equal('in true', g:where)
1952 unlet g:where
1953
1954 lines =<< trim END
1955 vim9script
1956
1957 const debug = false
1958 if debug
1959 var mode_chars = 'something'
1960 def Bits2Ascii()
1961 g:where = 'in true'
1962 enddef
1963 else
1964 def Bits2Ascii()
1965 var x = mode_chars
1966 g:where = 'in false'
1967 enddef
1968 endif
1969
1970 Bits2Ascii()
1971 END
1972 v9.CheckScriptFailure(lines, 'E1001: Variable not found: mode_chars')
1973enddef
1974
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001975let g:bool_true = v:true
1976let g:bool_false = v:false
1977
1978def Test_if_const_expr()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001979 var res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001980 if true ? true : false
1981 res = true
1982 endif
1983 assert_equal(true, res)
1984
Bram Moolenaar585fea72020-04-02 22:33:21 +02001985 g:glob = 2
1986 if false
Bram Moolenaar67979662020-06-20 22:50:47 +02001987 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001988 endif
1989 assert_equal(2, g:glob)
1990 if true
Bram Moolenaar67979662020-06-20 22:50:47 +02001991 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001992 endif
1993 assert_equal(3, g:glob)
1994
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001995 res = false
1996 if g:bool_true ? true : false
1997 res = true
1998 endif
1999 assert_equal(true, res)
2000
2001 res = false
2002 if true ? g:bool_true : false
2003 res = true
2004 endif
2005 assert_equal(true, res)
2006
2007 res = false
2008 if true ? true : g:bool_false
2009 res = true
2010 endif
2011 assert_equal(true, res)
2012
2013 res = false
2014 if true ? false : true
2015 res = true
2016 endif
2017 assert_equal(false, res)
2018
2019 res = false
2020 if false ? false : true
2021 res = true
2022 endif
2023 assert_equal(true, res)
2024
2025 res = false
2026 if false ? true : false
2027 res = true
2028 endif
2029 assert_equal(false, res)
2030
2031 res = false
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002032 if has('xyz') ? true : false
2033 res = true
2034 endif
2035 assert_equal(false, res)
2036
2037 res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002038 if true && true
2039 res = true
2040 endif
2041 assert_equal(true, res)
2042
2043 res = false
2044 if true && false
2045 res = true
2046 endif
2047 assert_equal(false, res)
2048
2049 res = false
2050 if g:bool_true && false
2051 res = true
2052 endif
2053 assert_equal(false, res)
2054
2055 res = false
2056 if true && g:bool_false
2057 res = true
2058 endif
2059 assert_equal(false, res)
2060
2061 res = false
2062 if false && false
2063 res = true
2064 endif
2065 assert_equal(false, res)
2066
2067 res = false
2068 if true || false
2069 res = true
2070 endif
2071 assert_equal(true, res)
2072
2073 res = false
2074 if g:bool_true || false
2075 res = true
2076 endif
2077 assert_equal(true, res)
2078
2079 res = false
2080 if true || g:bool_false
2081 res = true
2082 endif
2083 assert_equal(true, res)
2084
2085 res = false
2086 if false || false
2087 res = true
2088 endif
2089 assert_equal(false, res)
Bram Moolenaar3988f642020-08-27 22:43:03 +02002090
2091 # with constant "false" expression may be invalid so long as the syntax is OK
Bram Moolenaarc3235272021-07-10 19:42:03 +02002092 if false | eval 1 + 2 | endif
Bram Moolenaar3988f642020-08-27 22:43:03 +02002093 if false | eval burp + 234 | endif
2094 if false | echo burp 234 'asd' | endif
2095 if false
2096 burp
2097 endif
Bram Moolenaare525bdd2021-08-07 18:12:40 +02002098
Bram Moolenaar21ebb082022-02-04 21:58:58 +00002099 if 0
2100 if 1
2101 echo nothing
2102 elseif 1
2103 echo still nothing
2104 endif
2105 endif
2106
Bram Moolenaare525bdd2021-08-07 18:12:40 +02002107 # expression with line breaks skipped
2108 if false
2109 ('aaa'
2110 .. 'bbb'
2111 .. 'ccc'
2112 )->setline(1)
2113 endif
Yegappan Lakshmanane2038412024-12-14 19:59:24 +01002114
2115 if 1
2116 # do nothing
2117 else
2118 var [a] = [10]
2119 endif
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02002120enddef
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002121
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02002122def Test_if_const_expr_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00002123 v9.CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2124 v9.CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2125 v9.CheckDefFailure(["if has('aaa'"], 'E110:')
2126 v9.CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002127enddef
2128
Bram Moolenaar62aec932022-01-29 21:45:34 +00002129def s:RunNested(i: number): number
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002130 var x: number = 0
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002131 if i % 2
2132 if 1
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002133 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002134 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002135 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002136 endif
2137 x += 1
2138 else
2139 x += 1000
2140 endif
2141 return x
2142enddef
2143
2144def Test_nested_if()
2145 assert_equal(1, RunNested(1))
2146 assert_equal(1000, RunNested(2))
2147enddef
2148
Bram Moolenaarad39c092020-02-26 18:23:43 +01002149def Test_execute_cmd()
Bram Moolenaare4984292020-12-13 14:19:25 +01002150 # missing argument is ignored
2151 execute
2152 execute # comment
2153
Bram Moolenaarad39c092020-02-26 18:23:43 +01002154 new
2155 setline(1, 'default')
Bram Moolenaard2c61702020-09-06 15:58:36 +02002156 execute 'setline(1, "execute-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002157 assert_equal('execute-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002158
Bram Moolenaard2c61702020-09-06 15:58:36 +02002159 execute "setline(1, 'execute-string')"
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002160 assert_equal('execute-string', getline(1))
2161
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002162 var cmd1 = 'setline(1,'
2163 var cmd2 = '"execute-var")'
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002164 execute cmd1 cmd2 # comment
Bram Moolenaarad39c092020-02-26 18:23:43 +01002165 assert_equal('execute-var', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002166
Bram Moolenaard2c61702020-09-06 15:58:36 +02002167 execute cmd1 cmd2 '|setline(1, "execute-var-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002168 assert_equal('execute-var-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002169
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002170 var cmd_first = 'call '
2171 var cmd_last = 'setline(1, "execute-var-var")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002172 execute cmd_first .. cmd_last
2173 assert_equal('execute-var-var', getline(1))
2174 bwipe!
Bram Moolenaar585fea72020-04-02 22:33:21 +02002175
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002176 var n = true
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02002177 execute 'echomsg' (n ? '"true"' : '"no"')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002178 assert_match('^true$', g:Screenline(&lines))
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02002179
Bram Moolenaare0de1712020-12-02 17:36:54 +01002180 echomsg [1, 2, 3] {a: 1, b: 2}
Bram Moolenaar62aec932022-01-29 21:45:34 +00002181 assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', g:Screenline(&lines))
Bram Moolenaare5abf7a2020-08-16 18:29:35 +02002182
Bram Moolenaar62aec932022-01-29 21:45:34 +00002183 v9.CheckDefFailure(['execute xxx'], 'E1001:', 1)
2184 v9.CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2185 v9.CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
Bram Moolenaar0c7f2612022-02-17 19:44:07 +00002186 if has('channel')
2187 v9.CheckDefExecFailure(['execute test_null_channel()'], 'E908:', 1)
2188 endif
Bram Moolenaarad39c092020-02-26 18:23:43 +01002189enddef
2190
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002191def Test_execute_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002192 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002193 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002194 vim9script
2195 execute 'g:someVar'
2196 .. ' = ' ..
2197 '28'
2198 assert_equal(28, g:someVar)
2199 unlet g:someVar
2200 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002201 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002202enddef
2203
Bram Moolenaar43216612022-03-25 11:16:28 +00002204def Test_execute_finish()
2205 # the empty lines are relevant here
2206 var lines =<< trim END
2207 vim9script
2208
2209 var vname = "g:hello"
2210
2211 if exists(vname) | finish | endif | execute vname '= "world"'
2212
2213 assert_equal('world', g:hello)
2214
2215 if exists(vname) | finish | endif | execute vname '= "world"'
2216
2217 assert_report('should not be reached')
2218 END
2219 v9.CheckScriptSuccess(lines)
2220enddef
2221
Bram Moolenaarad39c092020-02-26 18:23:43 +01002222def Test_echo_cmd()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002223 echo 'some' # comment
Bram Moolenaar585fea72020-04-02 22:33:21 +02002224 echon 'thing'
Bram Moolenaar62aec932022-01-29 21:45:34 +00002225 assert_match('^something$', g:Screenline(&lines))
Bram Moolenaarad39c092020-02-26 18:23:43 +01002226
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002227 echo "some" # comment
2228 echon "thing"
Bram Moolenaar62aec932022-01-29 21:45:34 +00002229 assert_match('^something$', g:Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002230
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002231 var str1 = 'some'
2232 var str2 = 'more'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002233 echo str1 str2
Bram Moolenaar62aec932022-01-29 21:45:34 +00002234 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002235
Bram Moolenaar397a87a2022-03-20 21:14:15 +00002236 echo "one\ntwo"
2237 assert_match('^one$', g:Screenline(&lines - 1))
2238 assert_match('^two$', g:Screenline(&lines))
2239
Bram Moolenaar62aec932022-01-29 21:45:34 +00002240 v9.CheckDefFailure(['echo "xxx"# comment'], 'E488:')
Yegappan Lakshmanan22029ed2024-05-20 13:57:11 +02002241
2242 # Test for echoing a script local function name
2243 var lines =<< trim END
2244 vim9script
2245 def ScriptLocalEcho()
2246 enddef
2247 echo ScriptLocalEcho
2248 END
2249 new
2250 setline(1, lines)
2251 assert_match('<SNR>\d\+_ScriptLocalEcho', execute('source')->split("\n")[0])
2252 bw!
Bram Moolenaarad39c092020-02-26 18:23:43 +01002253enddef
2254
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002255def Test_echomsg_cmd()
2256 echomsg 'some' 'more' # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00002257 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002258 echo 'clear'
Bram Moolenaardf069ee2020-06-22 23:02:51 +02002259 :1messages
Bram Moolenaar62aec932022-01-29 21:45:34 +00002260 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002261
Bram Moolenaar62aec932022-01-29 21:45:34 +00002262 v9.CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002263enddef
2264
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002265def Test_echomsg_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002266 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002267 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002268 vim9script
2269 echomsg 'here'
2270 .. ' is ' ..
2271 'a message'
Bram Moolenaar62aec932022-01-29 21:45:34 +00002272 assert_match('^here is a message$', g:Screenline(&lines))
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002273 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002274 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002275enddef
2276
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002277def Test_echoerr_cmd()
Bram Moolenaar7de62622021-08-07 15:05:47 +02002278 var local = 'local'
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002279 try
Bram Moolenaar7de62622021-08-07 15:05:47 +02002280 echoerr 'something' local 'wrong' # comment
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002281 catch
Bram Moolenaar7de62622021-08-07 15:05:47 +02002282 assert_match('something local wrong', v:exception)
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002283 endtry
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002284enddef
2285
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002286def Test_echoerr_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002287 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002288 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002289 vim9script
2290 try
2291 echoerr 'this'
2292 .. ' is ' ..
2293 'wrong'
2294 catch
2295 assert_match('this is wrong', v:exception)
2296 endtry
2297 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002298 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002299enddef
2300
Bram Moolenaar7de62622021-08-07 15:05:47 +02002301def Test_echoconsole_cmd()
2302 var local = 'local'
2303 echoconsole 'something' local # comment
2304 # output goes anywhere
2305enddef
2306
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002307def Test_echowindow_cmd()
2308 var local = 'local'
2309 echowindow 'something' local # comment
Bram Moolenaar2435adf2022-10-21 12:05:46 +01002310
2311 # with modifier
2312 unsilent echowin 'loud'
2313
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002314 # output goes in message window
2315 popup_clear()
Yegappan Lakshmanane2038412024-12-14 19:59:24 +01002316
2317 # Invalid range
2318 var lines =<< trim END
2319 def Foo()
2320 :$echowindow "foo"
2321 enddef
2322 defcompile
2323 END
2324 v9.CheckDefAndScriptFailure(lines, 'E16: Invalid range')
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002325enddef
2326
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002327def Test_for_outside_of_function()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002328 var lines =<< trim END
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002329 vim9script
2330 new
2331 for var in range(0, 3)
2332 append(line('$'), var)
2333 endfor
2334 assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
2335 bwipe!
Bram Moolenaar522eefd2021-03-26 18:49:22 +01002336
2337 var result = ''
2338 for i in [1, 2, 3]
2339 var loop = ' loop ' .. i
2340 result ..= loop
2341 endfor
2342 assert_equal(' loop 1 loop 2 loop 3', result)
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002343 END
Bram Moolenaardd674772022-09-15 22:26:18 +01002344 writefile(lines, 'Xvim9for.vim', 'D')
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002345 source Xvim9for.vim
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002346enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002347
rbtnnbebf0692021-08-21 17:26:50 +02002348def Test_for_skipped_block()
2349 # test skipped blocks at outside of function
2350 var lines =<< trim END
2351 var result = []
2352 if true
2353 for n in [1, 2]
2354 result += [n]
2355 endfor
2356 else
2357 for n in [3, 4]
2358 result += [n]
2359 endfor
2360 endif
2361 assert_equal([1, 2], result)
2362
2363 result = []
2364 if false
2365 for n in [1, 2]
2366 result += [n]
2367 endfor
2368 else
2369 for n in [3, 4]
2370 result += [n]
2371 endfor
2372 endif
2373 assert_equal([3, 4], result)
2374 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002375 v9.CheckDefAndScriptSuccess(lines)
rbtnnbebf0692021-08-21 17:26:50 +02002376
2377 # test skipped blocks at inside of function
2378 lines =<< trim END
2379 def DefTrue()
2380 var result = []
2381 if true
2382 for n in [1, 2]
2383 result += [n]
2384 endfor
2385 else
2386 for n in [3, 4]
2387 result += [n]
2388 endfor
2389 endif
2390 assert_equal([1, 2], result)
2391 enddef
2392 DefTrue()
2393
2394 def DefFalse()
2395 var result = []
2396 if false
2397 for n in [1, 2]
2398 result += [n]
2399 endfor
2400 else
2401 for n in [3, 4]
2402 result += [n]
2403 endfor
2404 endif
2405 assert_equal([3, 4], result)
2406 enddef
2407 DefFalse()
Bram Moolenaar97f8c102022-04-02 19:43:57 +01002408
2409 def BuildDiagrams()
2410 var diagrams: list<any>
2411 if false
2412 var max = 0
2413 for v in diagrams
2414 var l = 3
2415 if max < l | max = l | endif
2416 v->add(l)
2417 endfor
2418 endif
2419 enddef
2420 BuildDiagrams()
rbtnnbebf0692021-08-21 17:26:50 +02002421 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002422 v9.CheckDefAndScriptSuccess(lines)
rbtnnbebf0692021-08-21 17:26:50 +02002423enddef
2424
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002425def Test_skipped_redir()
2426 var lines =<< trim END
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002427 def Tredir()
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002428 if 0
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002429 redir => l[0]
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002430 redir END
2431 endif
2432 enddef
2433 defcompile
2434 END
2435 v9.CheckScriptSuccess(lines)
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002436 delfunc g:Tredir
2437
2438 lines =<< trim END
2439 def Tredir()
2440 if 0
2441 redir => l[0]
2442 endif
2443 echo 'executed'
2444 if 0
2445 redir END
2446 endif
2447 enddef
2448 defcompile
2449 END
2450 v9.CheckScriptSuccess(lines)
2451 delfunc g:Tredir
2452
2453 lines =<< trim END
2454 def Tredir()
2455 var l = ['']
2456 if 1
2457 redir => l[0]
2458 endif
2459 echo 'executed'
2460 if 0
2461 redir END
2462 else
2463 redir END
2464 endif
2465 enddef
2466 defcompile
2467 END
2468 v9.CheckScriptSuccess(lines)
2469 delfunc g:Tredir
2470
2471 lines =<< trim END
2472 let doit = 1
2473 def Tredir()
2474 var l = ['']
2475 if g:doit
2476 redir => l[0]
2477 endif
2478 echo 'executed'
2479 if g:doit
2480 redir END
2481 endif
2482 enddef
2483 defcompile
2484 END
2485 v9.CheckScriptSuccess(lines)
2486 delfunc g:Tredir
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002487enddef
2488
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002489def Test_for_loop()
Bram Moolenaarf2253962021-04-13 20:53:13 +02002490 var lines =<< trim END
2491 var result = ''
2492 for cnt in range(7)
2493 if cnt == 4
2494 break
2495 endif
2496 if cnt == 2
2497 continue
2498 endif
2499 result ..= cnt .. '_'
2500 endfor
2501 assert_equal('0_1_3_', result)
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02002502
Bram Moolenaarf2253962021-04-13 20:53:13 +02002503 var concat = ''
2504 for str in eval('["one", "two"]')
2505 concat ..= str
2506 endfor
2507 assert_equal('onetwo', concat)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002508
Bram Moolenaarf2253962021-04-13 20:53:13 +02002509 var total = 0
2510 for nr in
2511 [1, 2, 3]
2512 total += nr
2513 endfor
2514 assert_equal(6, total)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002515
Bram Moolenaarf2253962021-04-13 20:53:13 +02002516 total = 0
2517 for nr
2518 in [1, 2, 3]
2519 total += nr
2520 endfor
2521 assert_equal(6, total)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002522
Bram Moolenaarf2253962021-04-13 20:53:13 +02002523 total = 0
2524 for nr
2525 in
2526 [1, 2, 3]
2527 total += nr
2528 endfor
2529 assert_equal(6, total)
Bram Moolenaar036d0712021-01-17 20:23:38 +01002530
Bram Moolenaara3589a02021-04-14 13:30:46 +02002531 # with type
2532 total = 0
2533 for n: number in [1, 2, 3]
2534 total += n
2535 endfor
2536 assert_equal(6, total)
2537
Bram Moolenaarefd73ae2022-03-20 18:51:00 +00002538 total = 0
2539 for b in 0z010203
2540 total += b
2541 endfor
2542 assert_equal(6, total)
2543
Bram Moolenaarfe090eb2021-04-15 21:48:32 +02002544 var chars = ''
2545 for s: string in 'foobar'
2546 chars ..= s
2547 endfor
2548 assert_equal('foobar', chars)
2549
Bram Moolenaar5ede5b22021-07-07 21:55:25 +02002550 chars = ''
2551 for x: string in {a: 'a', b: 'b'}->values()
2552 chars ..= x
2553 endfor
2554 assert_equal('ab', chars)
2555
Bram Moolenaara3589a02021-04-14 13:30:46 +02002556 # unpack with type
Bram Moolenaarf2253962021-04-13 20:53:13 +02002557 var res = ''
Bram Moolenaara3589a02021-04-14 13:30:46 +02002558 for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2559 res ..= n .. s
2560 endfor
2561 assert_equal('1a2b', res)
2562
Bram Moolenaar444d8782021-06-26 12:40:56 +02002563 # unpack with one var
2564 var reslist = []
2565 for [x] in [['aaa'], ['bbb']]
2566 reslist->add(x)
2567 endfor
2568 assert_equal(['aaa', 'bbb'], reslist)
2569
Bram Moolenaara3589a02021-04-14 13:30:46 +02002570 # loop over string
2571 res = ''
Bram Moolenaarf2253962021-04-13 20:53:13 +02002572 for c in 'aéc̀d'
2573 res ..= c .. '-'
2574 endfor
2575 assert_equal('a-é-c̀-d-', res)
2576
2577 res = ''
2578 for c in ''
2579 res ..= c .. '-'
2580 endfor
2581 assert_equal('', res)
2582
2583 res = ''
2584 for c in test_null_string()
2585 res ..= c .. '-'
2586 endfor
2587 assert_equal('', res)
2588
Bram Moolenaar10611952022-04-03 21:11:34 +01002589 total = 0
2590 for c in null_list
2591 total += 1
2592 endfor
2593 assert_equal(0, total)
2594
2595 for c in null_blob
2596 total += 1
2597 endfor
2598 assert_equal(0, total)
2599
Bram Moolenaarf2253962021-04-13 20:53:13 +02002600 var foo: list<dict<any>> = [
2601 {a: 'Cat'}
2602 ]
2603 for dd in foo
2604 dd.counter = 12
2605 endfor
2606 assert_equal([{a: 'Cat', counter: 12}], foo)
Bram Moolenaarad2d4962021-07-18 17:08:50 +02002607
2608 reslist = []
2609 for _ in range(3)
2610 reslist->add('x')
2611 endfor
2612 assert_equal(['x', 'x', 'x'], reslist)
Yegappan Lakshmanan4776e642024-05-19 09:06:50 +02002613
2614 # Test for trying to use the loop variable "_" inside the loop
2615 for _ in "a"
2616 assert_fails('echo _', 'E1181: Cannot use an underscore here')
2617 endfor
Bram Moolenaarf2253962021-04-13 20:53:13 +02002618 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002619 v9.CheckDefAndScriptSuccess(lines)
Yegappan Lakshmananfe424d12024-05-17 18:20:43 +02002620
2621 lines =<< trim END
2622 for i : number : [1, 2]
2623 echo i
2624 endfor
2625 END
2626 v9.CheckSourceDefAndScriptFailure(lines, 'E1059: No white space allowed before colon: : [1, 2]', 1)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002627enddef
2628
Bram Moolenaar159b2d52022-10-11 21:41:25 +01002629def Test_for_loop_list_of_lists()
2630 # loop variable is final, not const
2631 var lines =<< trim END
2632 # Filter out all odd numbers in each sublist
2633 var list: list<list<number>> = [[1], [1, 2], [1, 2, 3], [1, 2, 3, 4]]
2634 for i in list
2635 filter(i, (_, n: number): bool => n % 2 == 0)
2636 endfor
2637
2638 assert_equal([[], [2], [2], [2, 4]], list)
2639 END
2640 v9.CheckDefAndScriptSuccess(lines)
2641enddef
2642
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002643def Test_for_loop_with_closure()
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002644 # using the loop variable in a closure results in the last used value
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002645 var lines =<< trim END
2646 var flist: list<func>
2647 for i in range(5)
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002648 flist[i] = () => i
2649 endfor
2650 for i in range(5)
2651 assert_equal(4, flist[i]())
2652 endfor
2653 END
2654 v9.CheckDefAndScriptSuccess(lines)
2655
Bram Moolenaardd674772022-09-15 22:26:18 +01002656 # also works when the loop variable is used only once halfway the loops
2657 lines =<< trim END
2658 var Clo: func
2659 for i in range(5)
2660 if i == 3
2661 Clo = () => i
2662 endif
2663 endfor
2664 assert_equal(4, Clo())
2665 END
2666 v9.CheckDefAndScriptSuccess(lines)
2667
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002668 # using a local variable set to the loop variable in a closure results in the
2669 # value at that moment
2670 lines =<< trim END
2671 var flist: list<func>
2672 for i in range(5)
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002673 var inloop = i
2674 flist[i] = () => inloop
2675 endfor
2676 for i in range(5)
Bram Moolenaar353b68a2022-09-13 21:10:45 +01002677 assert_equal(i, flist[i]())
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002678 endfor
2679 END
Bram Moolenaar0cdfb7c2022-09-17 15:44:52 +01002680 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002681
Bram Moolenaara275f2c2022-10-11 20:04:09 +01002682 # also with an extra block level
2683 lines =<< trim END
2684 var flist: list<func>
2685 for i in range(5)
2686 {
2687 var inloop = i
2688 flist[i] = () => inloop
2689 }
2690 endfor
2691 for i in range(5)
2692 assert_equal(i, flist[i]())
2693 endfor
2694 END
2695 v9.CheckDefAndScriptSuccess(lines)
2696
2697 # and declaration in higher block
2698 lines =<< trim END
2699 var flist: list<func>
2700 for i in range(5)
2701 var inloop = i
2702 {
2703 flist[i] = () => inloop
2704 }
2705 endfor
2706 for i in range(5)
2707 assert_equal(i, flist[i]())
2708 endfor
2709 END
2710 v9.CheckDefAndScriptSuccess(lines)
2711
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002712 lines =<< trim END
2713 var flist: list<func>
2714 for i in range(5)
2715 var inloop = i
2716 flist[i] = () => {
2717 return inloop
2718 }
2719 endfor
2720 for i in range(5)
Bram Moolenaar353b68a2022-09-13 21:10:45 +01002721 assert_equal(i, flist[i]())
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002722 endfor
2723 END
Bram Moolenaar0cdfb7c2022-09-17 15:44:52 +01002724 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaardbbb02b2022-09-18 12:00:21 +01002725
2726 # Also works for a nested loop
2727 lines =<< trim END
2728 var flist: list<func>
2729 var n = 0
2730 for i in range(3)
2731 var ii = i
2732 for a in ['a', 'b', 'c']
2733 var aa = a
2734 flist[n] = () => ii .. aa
2735 ++n
2736 endfor
2737 endfor
2738
2739 n = 0
2740 for i in range(3)
2741 for a in ['a', 'b', 'c']
2742 assert_equal(i .. a, flist[n]())
2743 ++n
2744 endfor
2745 endfor
2746 END
Bram Moolenaarcc341812022-09-19 15:54:34 +01002747 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaare8e369a2022-09-21 18:59:14 +01002748
2749 # using two loop variables
2750 lines =<< trim END
2751 var lv_list: list<func>
2752 var copy_list: list<func>
2753 for [idx, c] in items('word')
2754 var lidx = idx
2755 var lc = c
2756 lv_list[idx] = () => {
2757 return idx .. c
2758 }
2759 copy_list[idx] = () => {
2760 return lidx .. lc
2761 }
2762 endfor
2763 for [i, c] in items('word')
2764 assert_equal(3 .. 'd', lv_list[i]())
2765 assert_equal(i .. c, copy_list[i]())
2766 endfor
2767 END
2768 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarcc341812022-09-19 15:54:34 +01002769enddef
2770
2771def Test_define_global_closure_in_loops()
2772 var lines =<< trim END
2773 vim9script
2774
2775 def Func()
2776 for i in range(3)
2777 var ii = i
2778 for a in ['a', 'b', 'c']
2779 var aa = a
2780 if ii == 0 && aa == 'a'
2781 def g:Global_0a(): string
2782 return ii .. aa
2783 enddef
2784 endif
2785 if ii == 1 && aa == 'b'
2786 def g:Global_1b(): string
2787 return ii .. aa
2788 enddef
2789 endif
2790 if ii == 2 && aa == 'c'
2791 def g:Global_2c(): string
2792 return ii .. aa
2793 enddef
2794 endif
2795 endfor
2796 endfor
2797 enddef
2798 Func()
2799 END
2800 v9.CheckScriptSuccess(lines)
2801 assert_equal("0a", g:Global_0a())
2802 assert_equal("1b", g:Global_1b())
2803 assert_equal("2c", g:Global_2c())
2804
2805 delfunc g:Global_0a
2806 delfunc g:Global_1b
2807 delfunc g:Global_2c
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002808enddef
2809
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002810def Test_for_loop_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00002811 v9.CheckDefAndScriptFailure(['for '], ['E1097:', 'E690:'])
2812 v9.CheckDefAndScriptFailure(['for x'], ['E1097:', 'E690:'])
2813 v9.CheckDefAndScriptFailure(['for x in'], ['E1097:', 'E15:'])
2814 v9.CheckDefAndScriptFailure(['for # in range(5)'], 'E690:')
2815 v9.CheckDefAndScriptFailure(['for i In range(5)'], 'E690:')
2816 v9.CheckDefAndScriptFailure(['var x = 5', 'for x in range(5)', 'endfor'], ['E1017:', 'E1041:'])
2817 v9.CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3)
2818 v9.CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01002819 delfunc! g:Func
Bram Moolenaar62aec932022-01-29 21:45:34 +00002820 v9.CheckDefFailure(['for i in xxx'], 'E1001:')
2821 v9.CheckDefFailure(['endfor'], 'E588:')
2822 v9.CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002823
2824 # wrong type detected at compile time
Bram Moolenaar62aec932022-01-29 21:45:34 +00002825 v9.CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002826
2827 # wrong type detected at runtime
2828 g:adict = {a: 1}
Bram Moolenaar62aec932022-01-29 21:45:34 +00002829 v9.CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002830 unlet g:adict
Bram Moolenaarf6a8d422021-04-13 21:48:03 +02002831
2832 var lines =<< trim END
2833 var d: list<dict<any>> = [{a: 0}]
2834 for e in d
2835 e = {a: 0, b: ''}
2836 endfor
2837 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002838 v9.CheckDefAndScriptFailure(lines, ['E1018:', 'E46:'], 3)
Bram Moolenaarfe090eb2021-04-15 21:48:32 +02002839
2840 lines =<< trim END
2841 for nr: number in ['foo']
2842 endfor
2843 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002844 v9.CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
Bram Moolenaar404557e2021-07-05 21:41:48 +02002845
2846 lines =<< trim END
2847 for n : number in [1, 2]
2848 echo n
2849 endfor
2850 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002851 v9.CheckDefAndScriptFailure(lines, 'E1059:', 1)
Bram Moolenaarefc5db52021-07-07 21:21:30 +02002852
2853 lines =<< trim END
2854 var d: dict<number> = {a: 1, b: 2}
2855 for [k: job, v: job] in d->items()
2856 echo k v
2857 endfor
2858 END
Bram Moolenaarbd3a9d22022-05-17 16:12:39 +01002859 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 +00002860
2861 lines =<< trim END
2862 var i = 0
2863 for i in [1, 2, 3]
2864 echo i
2865 endfor
2866 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002867 v9.CheckDefExecAndScriptFailure(lines, ['E1017:', 'E1041:'])
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002868
2869 lines =<< trim END
2870 var l = [0]
2871 for l[0] in [1, 2, 3]
2872 echo l[0]
2873 endfor
2874 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002875 v9.CheckDefExecAndScriptFailure(lines, ['E461:', 'E1017:'])
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002876
2877 lines =<< trim END
2878 var d = {x: 0}
2879 for d.x in [1, 2, 3]
2880 echo d.x
2881 endfor
2882 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002883 v9.CheckDefExecAndScriptFailure(lines, ['E461:', 'E1017:'])
Bram Moolenaara1c51952022-02-02 16:20:26 +00002884
2885 lines =<< trim END
2886 var l: list<dict<any>> = [{a: 1, b: 'x'}]
2887 for item: dict<number> in l
2888 echo item
2889 endfor
2890 END
2891 v9.CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected dict<number> but got dict<any>')
2892
2893 lines =<< trim END
2894 var l: list<dict<any>> = [{n: 1}]
2895 for item: dict<number> in l
Bram Moolenaarfa103972022-09-29 19:14:42 +01002896 var d = {s: ''}
2897 d->extend(item)
Bram Moolenaara1c51952022-02-02 16:20:26 +00002898 endfor
2899 END
Bram Moolenaarfa103972022-09-29 19:14:42 +01002900 v9.CheckDefExecAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected dict<string> but got dict<number>')
Bram Moolenaarcc341812022-09-19 15:54:34 +01002901
2902 lines =<< trim END
2903 for a in range(3)
2904 while a > 3
2905 for b in range(2)
2906 while b < 0
2907 for c in range(5)
2908 while c > 6
2909 while c < 0
2910 for d in range(1)
2911 for e in range(3)
2912 while e > 3
2913 endwhile
2914 endfor
2915 endfor
2916 endwhile
2917 endwhile
2918 endfor
2919 endwhile
2920 endfor
2921 endwhile
2922 endfor
2923 END
2924 v9.CheckDefSuccess(lines)
2925
2926 v9.CheckDefFailure(['for x in range(3)'] + lines + ['endfor'], 'E1306:')
Yegappan Lakshmanan062bb6b2023-12-16 14:46:40 +01002927
2928 # Test for too many for loops
2929 lines =<< trim END
2930 vim9script
2931 def Foo()
2932 for a in range(1)
2933 for b in range(1)
2934 for c in range(1)
2935 for d in range(1)
2936 for e in range(1)
2937 for f in range(1)
2938 for g in range(1)
2939 for h in range(1)
2940 for i in range(1)
2941 for j in range(1)
2942 for k in range(1)
2943 endfor
2944 endfor
2945 endfor
2946 endfor
2947 endfor
2948 endfor
2949 endfor
2950 endfor
2951 endfor
2952 endfor
2953 endfor
2954 enddef
2955 defcompile
2956 END
2957 v9.CheckSourceFailure(lines, 'E1306: Loop nesting too deep', 11)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002958enddef
2959
Bram Moolenaarea870692020-12-02 14:24:30 +01002960def Test_for_loop_script_var()
2961 # cannot use s:var in a :def function
Bram Moolenaar62aec932022-01-29 21:45:34 +00002962 v9.CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1254:')
Bram Moolenaarea870692020-12-02 14:24:30 +01002963
2964 # can use s:var in Vim9 script, with or without s:
2965 var lines =<< trim END
2966 vim9script
2967 var total = 0
2968 for s:var in [1, 2, 3]
2969 total += s:var
2970 endfor
2971 assert_equal(6, total)
2972
2973 total = 0
2974 for var in [1, 2, 3]
2975 total += var
2976 endfor
2977 assert_equal(6, total)
2978 END
2979enddef
2980
Bram Moolenaar792f7862020-11-23 08:31:18 +01002981def Test_for_loop_unpack()
Bram Moolenaar792f7862020-11-23 08:31:18 +01002982 var lines =<< trim END
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002983 var result = []
2984 for [v1, v2] in [[1, 2], [3, 4]]
2985 result->add(v1)
2986 result->add(v2)
2987 endfor
2988 assert_equal([1, 2, 3, 4], result)
2989
2990 result = []
2991 for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2992 result->add(v1)
2993 result->add(v2)
2994 result->add(v3)
2995 endfor
2996 assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2997
2998 result = []
2999 for [&ts, &sw] in [[1, 2], [3, 4]]
3000 result->add(&ts)
3001 result->add(&sw)
3002 endfor
3003 assert_equal([1, 2, 3, 4], result)
3004
3005 var slist: list<string>
3006 for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
3007 slist->add($LOOPVAR)
3008 slist->add(@r)
3009 slist->add(v:errmsg)
3010 endfor
3011 assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
3012
3013 slist = []
3014 for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
3015 slist->add(g:globalvar)
3016 slist->add(b:bufvar)
3017 slist->add(w:winvar)
3018 slist->add(t:tabvar)
3019 endfor
3020 assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
Bram Moolenaarf6c177a2020-12-04 17:38:00 +01003021 unlet! g:globalvar b:bufvar w:winvar t:tabvar
Bram Moolenaarb777da92021-05-22 21:40:39 +02003022
3023 var res = []
3024 for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
3025 res->add(n)
3026 endfor
3027 assert_equal([2, 5], res)
Bram Moolenaar61efa162022-03-18 13:10:48 +00003028
3029 var text: list<string> = ["hello there", "goodbye now"]
3030 var splitted = ''
3031 for [first; next] in mapnew(text, (i, v) => split(v))
3032 splitted ..= string(first) .. string(next) .. '/'
3033 endfor
3034 assert_equal("'hello'['there']/'goodbye'['now']/", splitted)
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01003035 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003036 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01003037
3038 lines =<< trim END
Bram Moolenaar792f7862020-11-23 08:31:18 +01003039 for [v1, v2] in [[1, 2, 3], [3, 4]]
3040 echo v1 v2
3041 endfor
3042 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003043 v9.CheckDefExecFailure(lines, 'E710:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01003044
3045 lines =<< trim END
3046 for [v1, v2] in [[1], [3, 4]]
3047 echo v1 v2
3048 endfor
3049 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003050 v9.CheckDefExecFailure(lines, 'E711:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01003051
3052 lines =<< trim END
3053 for [v1, v1] in [[1, 2], [3, 4]]
3054 echo v1
3055 endfor
3056 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003057 v9.CheckDefExecFailure(lines, 'E1017:', 1)
Bram Moolenaar95e4dd82022-04-27 22:15:40 +01003058
3059 lines =<< trim END
3060 for [a, b] in g:listlist
3061 echo a
3062 endfor
3063 END
3064 g:listlist = [1, 2, 3]
3065 v9.CheckDefExecFailure(lines, 'E1140:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01003066enddef
3067
Bram Moolenaarc150c092021-02-13 15:02:46 +01003068def Test_for_loop_with_try_continue()
Bram Moolenaarf2253962021-04-13 20:53:13 +02003069 var lines =<< trim END
3070 var looped = 0
3071 var cleanup = 0
3072 for i in range(3)
3073 looped += 1
3074 try
3075 eval [][0]
3076 catch
3077 continue
3078 finally
3079 cleanup += 1
3080 endtry
3081 endfor
3082 assert_equal(3, looped)
3083 assert_equal(3, cleanup)
3084 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003085 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc150c092021-02-13 15:02:46 +01003086enddef
3087
rbtnnd895b1d2021-08-20 20:54:25 +02003088def Test_while_skipped_block()
3089 # test skipped blocks at outside of function
3090 var lines =<< trim END
3091 var result = []
3092 var n = 0
3093 if true
3094 n = 1
3095 while n < 3
3096 result += [n]
3097 n += 1
3098 endwhile
3099 else
3100 n = 3
3101 while n < 5
3102 result += [n]
3103 n += 1
3104 endwhile
3105 endif
3106 assert_equal([1, 2], result)
3107
3108 result = []
3109 if false
3110 n = 1
3111 while n < 3
3112 result += [n]
3113 n += 1
3114 endwhile
3115 else
3116 n = 3
3117 while n < 5
3118 result += [n]
3119 n += 1
3120 endwhile
3121 endif
3122 assert_equal([3, 4], result)
3123 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003124 v9.CheckDefAndScriptSuccess(lines)
rbtnnd895b1d2021-08-20 20:54:25 +02003125
3126 # test skipped blocks at inside of function
3127 lines =<< trim END
3128 def DefTrue()
3129 var result = []
3130 var n = 0
3131 if true
3132 n = 1
3133 while n < 3
3134 result += [n]
3135 n += 1
3136 endwhile
3137 else
3138 n = 3
3139 while n < 5
3140 result += [n]
3141 n += 1
3142 endwhile
3143 endif
3144 assert_equal([1, 2], result)
3145 enddef
3146 DefTrue()
3147
3148 def DefFalse()
3149 var result = []
3150 var n = 0
3151 if false
3152 n = 1
3153 while n < 3
3154 result += [n]
3155 n += 1
3156 endwhile
3157 else
3158 n = 3
3159 while n < 5
3160 result += [n]
3161 n += 1
3162 endwhile
3163 endif
3164 assert_equal([3, 4], result)
3165 enddef
3166 DefFalse()
3167 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003168 v9.CheckDefAndScriptSuccess(lines)
rbtnnd895b1d2021-08-20 20:54:25 +02003169enddef
3170
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003171def Test_while_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003172 var result = ''
3173 var cnt = 0
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003174 while cnt < 555
3175 if cnt == 3
3176 break
3177 endif
3178 cnt += 1
3179 if cnt == 2
3180 continue
3181 endif
3182 result ..= cnt .. '_'
3183 endwhile
3184 assert_equal('1_3_', result)
Bram Moolenaardee37dc2021-02-07 16:40:05 +01003185
3186 var s = ''
Bram Moolenaar4b3e1962021-03-18 21:37:55 +01003187 while s == 'x' # {comment}
Bram Moolenaardee37dc2021-02-07 16:40:05 +01003188 endwhile
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003189enddef
3190
Bram Moolenaar7a53f292021-11-22 18:31:02 +00003191def Test_while_loop_in_script()
3192 var lines =<< trim END
3193 vim9script
3194 var result = ''
3195 var cnt = 0
3196 while cnt < 3
3197 var s = 'v' .. cnt
3198 result ..= s
3199 cnt += 1
3200 endwhile
3201 assert_equal('v0v1v2', result)
3202 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003203 v9.CheckScriptSuccess(lines)
Bram Moolenaar7a53f292021-11-22 18:31:02 +00003204enddef
3205
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02003206def Test_while_loop_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00003207 v9.CheckDefFailure(['while xxx'], 'E1001:')
3208 v9.CheckDefFailure(['endwhile'], 'E588:')
3209 v9.CheckDefFailure(['continue'], 'E586:')
3210 v9.CheckDefFailure(['if true', 'continue'], 'E586:')
3211 v9.CheckDefFailure(['break'], 'E587:')
3212 v9.CheckDefFailure(['if true', 'break'], 'E587:')
3213 v9.CheckDefFailure(['while 1', 'echo 3'], 'E170:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01003214
3215 var lines =<< trim END
3216 var s = ''
3217 while s = ''
3218 endwhile
3219 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003220 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaarbd5da372020-03-31 23:13:10 +02003221enddef
3222
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01003223def Test_interrupt_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003224 var caught = false
3225 var x = 0
Bram Moolenaar97acfc72020-03-22 13:44:28 +01003226 try
3227 while 1
3228 x += 1
3229 if x == 100
3230 feedkeys("\<C-C>", 'Lt')
3231 endif
3232 endwhile
3233 catch
3234 caught = true
3235 assert_equal(100, x)
3236 endtry
3237 assert_true(caught, 'should have caught an exception')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02003238 # consume the CTRL-C
3239 getchar(0)
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01003240enddef
Bram Moolenaar20431c92020-03-20 18:39:46 +01003241
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003242def Test_automatic_line_continuation()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003243 var mylist = [
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003244 'one',
3245 'two',
3246 'three',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003247 ] # comment
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003248 assert_equal(['one', 'two', 'three'], mylist)
3249
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003250 var mydict = {
Bram Moolenaare0de1712020-12-02 17:36:54 +01003251 ['one']: 1,
3252 ['two']: 2,
3253 ['three']:
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003254 3,
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003255 } # comment
Bram Moolenaare0de1712020-12-02 17:36:54 +01003256 assert_equal({one: 1, two: 2, three: 3}, mydict)
3257 mydict = {
Bram Moolenaar2c330432020-04-13 14:41:35 +02003258 one: 1, # comment
3259 two: # comment
3260 2, # comment
3261 three: 3 # comment
3262 }
Bram Moolenaare0de1712020-12-02 17:36:54 +01003263 assert_equal({one: 1, two: 2, three: 3}, mydict)
3264 mydict = {
Bram Moolenaar2c330432020-04-13 14:41:35 +02003265 one: 1,
3266 two:
3267 2,
3268 three: 3
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003269 }
Bram Moolenaare0de1712020-12-02 17:36:54 +01003270 assert_equal({one: 1, two: 2, three: 3}, mydict)
Bram Moolenaare6085c52020-04-12 20:19:16 +02003271
3272 assert_equal(
3273 ['one', 'two', 'three'],
3274 split('one two three')
3275 )
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003276enddef
3277
Bram Moolenaar7a092242020-04-16 22:10:49 +02003278def Test_vim9_comment()
Bram Moolenaar62aec932022-01-29 21:45:34 +00003279 v9.CheckScriptSuccess([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003280 'vim9script',
3281 '# something',
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003282 '#something',
Bram Moolenaar3f74c0a2022-08-06 18:12:06 +01003283 '#{{something',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003284 ])
Bram Moolenaar3f74c0a2022-08-06 18:12:06 +01003285 v9.CheckScriptFailure([
3286 'vim9script',
3287 '#{something',
3288 ], 'E1170:')
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003289
Bram Moolenaarb18b4962022-09-02 21:55:50 +01003290 split Xv9cfile
Bram Moolenaar62aec932022-01-29 21:45:34 +00003291 v9.CheckScriptSuccess([
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003292 'vim9script',
3293 'edit #something',
3294 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003295 v9.CheckScriptSuccess([
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003296 'vim9script',
3297 'edit #{something',
3298 ])
3299 close
3300
Bram Moolenaar62aec932022-01-29 21:45:34 +00003301 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003302 'vim9script',
3303 ':# something',
3304 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003305 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003306 '# something',
3307 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003308 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003309 ':# something',
3310 ], 'E488:')
3311
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003312 { # block start
3313 } # block end
Bram Moolenaar62aec932022-01-29 21:45:34 +00003314 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003315 '{# comment',
3316 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003317 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003318 '{',
3319 '}# comment',
3320 ], 'E488:')
3321
3322 echo "yes" # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00003323 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003324 'echo "yes"# comment',
3325 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003326 v9.CheckScriptSuccess([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003327 'vim9script',
3328 'echo "yes" # something',
3329 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003330 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003331 'vim9script',
3332 'echo "yes"# something',
3333 ], 'E121:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003334 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003335 'vim9script',
3336 'echo# something',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003337 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003338 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003339 'echo "yes" # something',
3340 ], 'E121:')
3341
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003342 exe "echo" # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00003343 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003344 'exe "echo"# comment',
3345 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003346 v9.CheckScriptSuccess([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003347 'vim9script',
3348 'exe "echo" # something',
3349 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003350 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003351 'vim9script',
3352 'exe "echo"# something',
3353 ], 'E121:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003354 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003355 'vim9script',
3356 'exe# something',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003357 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003358 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003359 'exe "echo" # something',
3360 ], 'E121:')
3361
Bram Moolenaar62aec932022-01-29 21:45:34 +00003362 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003363 'try# comment',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003364 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003365 'catch',
3366 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003367 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003368 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003369 'vim9script',
3370 'try# comment',
3371 'echo "yes"',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003372 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003373 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003374 'try',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003375 ' throw#comment',
3376 'catch',
3377 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003378 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003379 v9.CheckDefFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003380 'try',
3381 ' throw "yes"#comment',
3382 'catch',
3383 'endtry',
3384 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003385 v9.CheckDefFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003386 'try',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003387 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003388 'catch# comment',
3389 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003390 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003391 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003392 'vim9script',
3393 'try',
3394 ' echo "yes"',
3395 'catch# comment',
3396 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003397 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003398 v9.CheckDefFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003399 'try',
3400 ' echo "yes"',
3401 'catch /pat/# comment',
3402 'endtry',
3403 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003404 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003405 'try',
3406 'echo "yes"',
3407 'catch',
3408 'endtry# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003409 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003410 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003411 'vim9script',
3412 'try',
3413 ' echo "yes"',
3414 'catch',
3415 'endtry# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003416 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003417
Bram Moolenaar62aec932022-01-29 21:45:34 +00003418 v9.CheckScriptSuccess([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003419 'vim9script',
3420 'hi # comment',
3421 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003422 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003423 'vim9script',
3424 'hi# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003425 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003426 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003427 'vim9script',
3428 'hi Search # comment',
3429 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003430 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003431 'vim9script',
3432 'hi Search# comment',
3433 ], 'E416:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003434 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003435 'vim9script',
3436 'hi link This Search # comment',
3437 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003438 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003439 'vim9script',
3440 'hi link This That# comment',
3441 ], 'E413:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003442 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003443 'vim9script',
3444 'hi clear This # comment',
3445 'hi clear # comment',
3446 ])
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003447 # not tested, because it doesn't give an error but a warning:
3448 # hi clear This# comment',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003449 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003450 'vim9script',
3451 'hi clear# comment',
3452 ], 'E416:')
3453
Bram Moolenaar62aec932022-01-29 21:45:34 +00003454 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003455 'vim9script',
3456 'hi Group term=bold',
3457 'match Group /todo/ # comment',
3458 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003459 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003460 'vim9script',
3461 'hi Group term=bold',
3462 'match Group /todo/# comment',
3463 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003464 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003465 'vim9script',
3466 'match # comment',
3467 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003468 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003469 'vim9script',
3470 'match# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003471 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003472 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003473 'vim9script',
3474 'match none # comment',
3475 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003476 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003477 'vim9script',
3478 'match none# comment',
3479 ], 'E475:')
3480
Bram Moolenaar62aec932022-01-29 21:45:34 +00003481 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003482 'vim9script',
3483 'menutrans clear # comment',
3484 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003485 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003486 'vim9script',
3487 'menutrans clear# comment text',
3488 ], 'E474:')
3489
Bram Moolenaar62aec932022-01-29 21:45:34 +00003490 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003491 'vim9script',
3492 'syntax clear # comment',
3493 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003494 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003495 'vim9script',
3496 'syntax clear# comment text',
3497 ], 'E28:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003498 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003499 'vim9script',
3500 'syntax keyword Word some',
3501 'syntax clear Word # comment',
3502 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003503 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003504 'vim9script',
3505 'syntax keyword Word some',
3506 'syntax clear Word# comment text',
3507 ], 'E28:')
3508
Bram Moolenaar62aec932022-01-29 21:45:34 +00003509 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003510 'vim9script',
3511 'syntax list # comment',
3512 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003513 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003514 'vim9script',
3515 'syntax list# comment text',
3516 ], 'E28:')
3517
Bram Moolenaar62aec932022-01-29 21:45:34 +00003518 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003519 'vim9script',
3520 'syntax match Word /pat/ oneline # comment',
3521 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003522 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003523 'vim9script',
3524 'syntax match Word /pat/ oneline# comment',
3525 ], 'E475:')
3526
Bram Moolenaar62aec932022-01-29 21:45:34 +00003527 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003528 'vim9script',
3529 'syntax keyword Word word # comm[ent',
3530 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003531 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003532 'vim9script',
3533 'syntax keyword Word word# comm[ent',
3534 ], 'E789:')
3535
Bram Moolenaar62aec932022-01-29 21:45:34 +00003536 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003537 'vim9script',
3538 'syntax match Word /pat/ # comment',
3539 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003540 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003541 'vim9script',
3542 'syntax match Word /pat/# comment',
3543 ], 'E402:')
3544
Bram Moolenaar62aec932022-01-29 21:45:34 +00003545 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003546 'vim9script',
3547 'syntax match Word /pat/ contains=Something # comment',
3548 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003549 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003550 'vim9script',
3551 'syntax match Word /pat/ contains=Something# comment',
3552 ], 'E475:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003553 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003554 'vim9script',
3555 'syntax match Word /pat/ contains= # comment',
3556 ], 'E406:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003557 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003558 'vim9script',
3559 'syntax match Word /pat/ contains=# comment',
3560 ], 'E475:')
3561
Bram Moolenaar62aec932022-01-29 21:45:34 +00003562 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003563 'vim9script',
3564 'syntax region Word start=/pat/ end=/pat/ # comment',
3565 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003566 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003567 'vim9script',
3568 'syntax region Word start=/pat/ end=/pat/# comment',
Bram Moolenaard032f342020-07-18 18:13:02 +02003569 ], 'E402:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02003570
Bram Moolenaar62aec932022-01-29 21:45:34 +00003571 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003572 'vim9script',
3573 'syntax sync # comment',
3574 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003575 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003576 'vim9script',
3577 'syntax sync# comment',
3578 ], 'E404:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003579 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003580 'vim9script',
3581 'syntax sync ccomment # comment',
3582 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003583 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003584 'vim9script',
3585 'syntax sync ccomment# comment',
3586 ], 'E404:')
3587
Bram Moolenaar62aec932022-01-29 21:45:34 +00003588 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003589 'vim9script',
3590 'syntax cluster Some contains=Word # comment',
3591 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003592 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003593 'vim9script',
3594 'syntax cluster Some contains=Word# comment',
3595 ], 'E475:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003596
Bram Moolenaar62aec932022-01-29 21:45:34 +00003597 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003598 'vim9script',
3599 'command Echo echo # comment',
3600 'command Echo # comment',
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003601 'delcommand Echo',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003602 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003603 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003604 'vim9script',
3605 'command Echo echo# comment',
3606 'Echo',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003607 ], 'E1144:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003608 delcommand Echo
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003609
3610 var curdir = getcwd()
Bram Moolenaar62aec932022-01-29 21:45:34 +00003611 v9.CheckScriptSuccess([
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003612 'command Echo cd " comment',
3613 'Echo',
3614 'delcommand Echo',
3615 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003616 v9.CheckScriptSuccess([
Bram Moolenaar090728a2020-12-20 15:43:31 +01003617 'vim9script',
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003618 'command Echo cd # comment',
3619 'Echo',
3620 'delcommand Echo',
3621 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003622 v9.CheckScriptFailure([
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003623 'vim9script',
3624 'command Echo cd " comment',
3625 'Echo',
3626 ], 'E344:')
3627 delcommand Echo
3628 chdir(curdir)
3629
Bram Moolenaar62aec932022-01-29 21:45:34 +00003630 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003631 'vim9script',
3632 'command Echo# comment',
3633 ], 'E182:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003634 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003635 'vim9script',
3636 'command Echo echo',
3637 'command Echo# comment',
3638 ], 'E182:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003639 delcommand Echo
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003640
Bram Moolenaar62aec932022-01-29 21:45:34 +00003641 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003642 'vim9script',
3643 'function # comment',
3644 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003645 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003646 'vim9script',
Bram Moolenaar98981072020-07-29 14:40:25 +02003647 'function " comment',
3648 ], 'E129:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003649 v9.CheckScriptFailure([
Bram Moolenaar98981072020-07-29 14:40:25 +02003650 'vim9script',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003651 'function# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003652 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003653 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003654 'vim9script',
Christian Brabandteb380b92025-07-07 20:53:55 +02003655 'import "./util/vim9.vim" as v9',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003656 'function v9.CheckScriptSuccess # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003657 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003658 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003659 'vim9script',
Christian Brabandteb380b92025-07-07 20:53:55 +02003660 'import "./util/vim9.vim" as v9',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003661 'function v9.CheckScriptSuccess# comment',
3662 ], 'E1048: Item not found in script: CheckScriptSuccess#')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003663
Bram Moolenaar62aec932022-01-29 21:45:34 +00003664 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003665 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003666 'func g:DeleteMeA()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003667 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003668 'delfunction g:DeleteMeA # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003669 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003670 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003671 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003672 'func g:DeleteMeB()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003673 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003674 'delfunction g:DeleteMeB# comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003675 ], 'E488:')
3676
Bram Moolenaar62aec932022-01-29 21:45:34 +00003677 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003678 'vim9script',
3679 'call execute("ls") # comment',
3680 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003681 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003682 'vim9script',
3683 'call execute("ls")# comment',
3684 ], 'E488:')
Bram Moolenaare7e48382020-07-22 18:17:08 +02003685
Bram Moolenaar62aec932022-01-29 21:45:34 +00003686 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003687 'def Test() " comment',
3688 'enddef',
3689 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003690 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003691 'vim9script',
3692 'def Test() " comment',
3693 'enddef',
3694 ], 'E488:')
3695
Bram Moolenaar62aec932022-01-29 21:45:34 +00003696 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003697 'func Test() " comment',
3698 'endfunc',
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003699 'delfunc Test',
Bram Moolenaare7e48382020-07-22 18:17:08 +02003700 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003701 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003702 'vim9script',
3703 'func Test() " comment',
3704 'endfunc',
Bram Moolenaar98981072020-07-29 14:40:25 +02003705 ])
Bram Moolenaare7e48382020-07-22 18:17:08 +02003706
Bram Moolenaar62aec932022-01-29 21:45:34 +00003707 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003708 'def Test() # comment',
3709 'enddef',
3710 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003711 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003712 'func Test() # comment',
3713 'endfunc',
3714 ], 'E488:')
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003715
3716 var lines =<< trim END
3717 vim9script
3718 syn region Text
3719 \ start='foo'
3720 #\ comment
3721 \ end='bar'
Bram Moolenaar5072b472021-06-03 21:56:10 +02003722 syn region Text start='foo'
3723 #\ comment
3724 \ end='bar'
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003725 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003726 v9.CheckScriptSuccess(lines)
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003727
3728 lines =<< trim END
3729 vim9script
3730 syn region Text
3731 \ start='foo'
3732 "\ comment
3733 \ end='bar'
3734 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003735 v9.CheckScriptFailure(lines, 'E399:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003736enddef
3737
3738def Test_vim9_comment_gui()
3739 CheckCanRunGui
3740
Bram Moolenaar62aec932022-01-29 21:45:34 +00003741 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003742 'vim9script',
3743 'gui#comment'
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003744 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003745 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003746 'vim9script',
3747 'gui -f#comment'
Bram Moolenaarb8bd2e62021-08-21 17:13:14 +02003748 ], 'E194:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02003749enddef
3750
Bram Moolenaara26b9702020-04-18 19:53:28 +02003751def Test_vim9_comment_not_compiled()
Bram Moolenaar67979662020-06-20 22:50:47 +02003752 au TabEnter *.vim g:entered = 1
3753 au TabEnter *.x g:entered = 2
Bram Moolenaara26b9702020-04-18 19:53:28 +02003754
3755 edit test.vim
3756 doautocmd TabEnter #comment
3757 assert_equal(1, g:entered)
3758
3759 doautocmd TabEnter f.x
3760 assert_equal(2, g:entered)
3761
3762 g:entered = 0
3763 doautocmd TabEnter f.x #comment
3764 assert_equal(2, g:entered)
3765
3766 assert_fails('doautocmd Syntax#comment', 'E216:')
3767
3768 au! TabEnter
3769 unlet g:entered
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003770
Bram Moolenaar62aec932022-01-29 21:45:34 +00003771 v9.CheckScriptSuccess([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003772 'vim9script',
Bram Moolenaar67979662020-06-20 22:50:47 +02003773 'g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003774 'b:var = 456',
3775 'w:var = 777',
3776 't:var = 888',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003777 'unlet g:var w:var # something',
3778 ])
3779
Bram Moolenaar62aec932022-01-29 21:45:34 +00003780 v9.CheckScriptFailure([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003781 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003782 'let var = 123',
3783 ], 'E1126: Cannot use :let in Vim9 script')
3784
Bram Moolenaar62aec932022-01-29 21:45:34 +00003785 v9.CheckScriptFailure([
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003786 'vim9script',
3787 'var g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003788 ], 'E1016: Cannot declare a global variable:')
3789
Bram Moolenaar62aec932022-01-29 21:45:34 +00003790 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003791 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003792 'var b:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003793 ], 'E1016: Cannot declare a buffer variable:')
3794
Bram Moolenaar62aec932022-01-29 21:45:34 +00003795 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003796 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003797 'var w:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003798 ], 'E1016: Cannot declare a window variable:')
3799
Bram Moolenaar62aec932022-01-29 21:45:34 +00003800 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003801 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003802 'var t:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003803 ], 'E1016: Cannot declare a tab variable:')
3804
Bram Moolenaar62aec932022-01-29 21:45:34 +00003805 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003806 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003807 'var v:version = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003808 ], 'E1016: Cannot declare a v: variable:')
3809
Bram Moolenaar62aec932022-01-29 21:45:34 +00003810 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003811 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003812 'var $VARIABLE = "text"',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003813 ], 'E1016: Cannot declare an environment variable:')
Bram Moolenaar67979662020-06-20 22:50:47 +02003814
Bram Moolenaar62aec932022-01-29 21:45:34 +00003815 v9.CheckScriptFailure([
Bram Moolenaar67979662020-06-20 22:50:47 +02003816 'vim9script',
3817 'g:var = 123',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003818 'unlet g:var# comment1',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003819 ], 'E108:')
3820
Bram Moolenaar62aec932022-01-29 21:45:34 +00003821 v9.CheckScriptFailure([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003822 'let g:var = 123',
3823 'unlet g:var # something',
3824 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003825
Bram Moolenaar62aec932022-01-29 21:45:34 +00003826 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003827 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003828 'if 1 # comment2',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003829 ' echo "yes"',
3830 'elseif 2 #comment',
3831 ' echo "no"',
3832 'endif',
3833 ])
3834
Bram Moolenaar62aec932022-01-29 21:45:34 +00003835 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003836 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003837 'if 1# comment3',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003838 ' echo "yes"',
3839 'endif',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003840 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003841
Bram Moolenaar62aec932022-01-29 21:45:34 +00003842 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003843 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003844 'if 0 # comment4',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003845 ' echo "yes"',
3846 'elseif 2#comment',
3847 ' echo "no"',
3848 'endif',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003849 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003850
Bram Moolenaar62aec932022-01-29 21:45:34 +00003851 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003852 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003853 'var v = 1 # comment5',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003854 ])
3855
Bram Moolenaar62aec932022-01-29 21:45:34 +00003856 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003857 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003858 'var v = 1# comment6',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003859 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003860
Bram Moolenaar62aec932022-01-29 21:45:34 +00003861 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003862 'vim9script',
Bram Moolenaar2984ed32022-08-20 14:51:17 +01003863 'new',
Bram Moolenaard2c61702020-09-06 15:58:36 +02003864 'setline(1, ["# define pat", "last"])',
Bram Moolenaardf069ee2020-06-22 23:02:51 +02003865 ':$',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003866 'dsearch /pat/ #comment',
3867 'bwipe!',
3868 ])
3869
Bram Moolenaar62aec932022-01-29 21:45:34 +00003870 v9.CheckScriptFailure([
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003871 'vim9script',
Bram Moolenaar2984ed32022-08-20 14:51:17 +01003872 'new',
Bram Moolenaard2c61702020-09-06 15:58:36 +02003873 'setline(1, ["# define pat", "last"])',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003874 ':$',
3875 'dsearch /pat/#comment',
3876 'bwipe!',
3877 ], 'E488:')
3878
Bram Moolenaar62aec932022-01-29 21:45:34 +00003879 v9.CheckScriptFailure([
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003880 'vim9script',
3881 'func! SomeFunc()',
3882 ], 'E477:')
Bram Moolenaara26b9702020-04-18 19:53:28 +02003883enddef
3884
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003885def Test_finish()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003886 var lines =<< trim END
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003887 vim9script
Bram Moolenaar67979662020-06-20 22:50:47 +02003888 g:res = 'one'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003889 if v:false | finish | endif
Bram Moolenaar67979662020-06-20 22:50:47 +02003890 g:res = 'two'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003891 finish
Bram Moolenaar67979662020-06-20 22:50:47 +02003892 g:res = 'three'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003893 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003894 writefile(lines, 'Xfinished', 'D')
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003895 source Xfinished
3896 assert_equal('two', g:res)
3897
3898 unlet g:res
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003899enddef
3900
Bram Moolenaara5d00772020-05-14 23:20:55 +02003901def Test_forward_declaration()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003902 var lines =<< trim END
Bram Moolenaara5d00772020-05-14 23:20:55 +02003903 vim9script
Bram Moolenaara5d00772020-05-14 23:20:55 +02003904 def GetValue(): string
3905 return theVal
3906 enddef
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003907 var theVal = 'something'
Bram Moolenaar822ba242020-05-24 23:00:18 +02003908 g:initVal = GetValue()
Bram Moolenaara5d00772020-05-14 23:20:55 +02003909 theVal = 'else'
3910 g:laterVal = GetValue()
3911 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003912 writefile(lines, 'Xforward', 'D')
Bram Moolenaara5d00772020-05-14 23:20:55 +02003913 source Xforward
3914 assert_equal('something', g:initVal)
3915 assert_equal('else', g:laterVal)
3916
3917 unlet g:initVal
3918 unlet g:laterVal
Bram Moolenaara5d00772020-05-14 23:20:55 +02003919enddef
3920
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003921def Test_declare_script_var_in_func()
Bram Moolenaare535db82021-03-31 21:07:24 +02003922 var lines =<< trim END
3923 vim9script
3924 func Declare()
3925 let s:local = 123
3926 endfunc
3927 Declare()
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003928 END
3929 v9.CheckScriptFailure(lines, 'E1269:')
3930enddef
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00003931
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003932def Test_lock_script_var()
3933 var lines =<< trim END
3934 vim9script
3935 var local = 123
Bram Moolenaare535db82021-03-31 21:07:24 +02003936 assert_equal(123, local)
3937
3938 var error: string
3939 try
3940 local = 'asdf'
3941 catch
3942 error = v:exception
3943 endtry
3944 assert_match('E1012: Type mismatch; expected number but got string', error)
3945
3946 lockvar local
3947 try
3948 local = 999
3949 catch
3950 error = v:exception
3951 endtry
3952 assert_match('E741: Value is locked: local', error)
3953 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003954 v9.CheckScriptSuccess(lines)
Bram Moolenaare535db82021-03-31 21:07:24 +02003955enddef
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00003956
Bram Moolenaare535db82021-03-31 21:07:24 +02003957
Bram Moolenaar7d699702020-08-14 20:52:28 +02003958func Test_vim9script_not_global()
3959 " check that items defined in Vim9 script are script-local, not global
3960 let vim9lines =<< trim END
3961 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003962 var name = 'local'
Bram Moolenaar7d699702020-08-14 20:52:28 +02003963 func TheFunc()
3964 echo 'local'
3965 endfunc
3966 def DefFunc()
3967 echo 'local'
3968 enddef
3969 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003970 call writefile(vim9lines, 'Xvim9script.vim', 'D')
Bram Moolenaar7d699702020-08-14 20:52:28 +02003971 source Xvim9script.vim
3972 try
3973 echo g:var
3974 assert_report('did not fail')
3975 catch /E121:/
3976 " caught
3977 endtry
3978 try
3979 call TheFunc()
3980 assert_report('did not fail')
3981 catch /E117:/
3982 " caught
3983 endtry
3984 try
3985 call DefFunc()
3986 assert_report('did not fail')
3987 catch /E117:/
3988 " caught
3989 endtry
Bram Moolenaar7d699702020-08-14 20:52:28 +02003990endfunc
3991
Bram Moolenaareeb27bf2020-07-04 17:39:10 +02003992def Test_vim9_copen()
John Marriott45377e22025-03-27 18:12:32 +01003993 CheckFeature quickfix
Bram Moolenaareeb27bf2020-07-04 17:39:10 +02003994 # this was giving an error for setting w:quickfix_title
3995 copen
3996 quit
3997enddef
3998
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02003999def Test_script_var_in_autocmd()
4000 # using a script variable from an autocommand, defined in a :def function in a
4001 # legacy Vim script, cannot check the variable type.
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004002 var lines =<< trim END
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02004003 let s:counter = 1
4004 def s:Func()
4005 au! CursorHold
4006 au CursorHold * s:counter += 1
4007 enddef
4008 call s:Func()
4009 doau CursorHold
4010 call assert_equal(2, s:counter)
4011 au! CursorHold
4012 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004013 v9.CheckScriptSuccess(lines)
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02004014enddef
4015
Bram Moolenaarb5841b92021-07-15 18:09:53 +02004016def Test_error_in_autoload_script()
4017 var save_rtp = &rtp
4018 var dir = getcwd() .. '/Xruntime'
4019 &rtp = dir
Bram Moolenaardd674772022-09-15 22:26:18 +01004020 mkdir(dir .. '/autoload', 'pR')
Bram Moolenaarb5841b92021-07-15 18:09:53 +02004021
4022 var lines =<< trim END
4023 vim9script noclear
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00004024 export def Autoloaded()
Bram Moolenaarb5841b92021-07-15 18:09:53 +02004025 enddef
4026 def Broken()
4027 var x: any = ''
4028 eval x != 0
4029 enddef
4030 Broken()
4031 END
4032 writefile(lines, dir .. '/autoload/script.vim')
4033
4034 lines =<< trim END
4035 vim9script
4036 def CallAutoloaded()
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00004037 script#Autoloaded()
Bram Moolenaarb5841b92021-07-15 18:09:53 +02004038 enddef
4039
4040 function Legacy()
4041 try
4042 call s:CallAutoloaded()
4043 catch
4044 call assert_match('E1030: Using a String as a Number', v:exception)
4045 endtry
4046 endfunction
4047
4048 Legacy()
4049 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004050 v9.CheckScriptSuccess(lines)
Bram Moolenaarb5841b92021-07-15 18:09:53 +02004051
4052 &rtp = save_rtp
Bram Moolenaarb5841b92021-07-15 18:09:53 +02004053enddef
4054
Yegappan Lakshmanan5ce1e4a2025-04-07 21:09:18 +02004055" Test for sourcing a Vim9 script with a function script variable and "noclear".
4056" The type for the variable is dynamically allocated and should be freed.
4057def Test_source_func_script_var()
4058 var lines =<< trim END
4059 vim9script noclear
4060 var Fn: func(list<any>): number
4061 Fn = function('min')
4062 assert_equal(2, Fn([4, 2]))
4063 END
4064 new
4065 setline(1, lines)
4066 source
4067 source
4068 bw!
4069enddef
4070
Bram Moolenaar6809ff92022-07-26 15:10:56 +01004071def Test_error_in_autoload_script_foldexpr()
4072 var save_rtp = &rtp
Bram Moolenaardd674772022-09-15 22:26:18 +01004073 mkdir('Xvim/autoload', 'pR')
Bram Moolenaar6809ff92022-07-26 15:10:56 +01004074 &runtimepath = 'Xvim'
4075
4076 var lines =<< trim END
4077 vim9script
4078 eval [][0]
4079 echomsg 'no error'
4080 END
4081 lines->writefile('Xvim/autoload/script.vim')
4082
4083 lines =<< trim END
4084 vim9script
4085 import autoload 'script.vim'
4086 &foldmethod = 'expr'
4087 &foldexpr = 'script.Func()'
4088 redraw
4089 END
4090 v9.CheckScriptFailure(lines, 'E684: List index out of range: 0')
Bram Moolenaar6809ff92022-07-26 15:10:56 +01004091enddef
4092
Bram Moolenaare3d46852020-08-29 13:39:17 +02004093def Test_invalid_sid()
4094 assert_fails('func <SNR>1234_func', 'E123:')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02004095
Bram Moolenaar62aec932022-01-29 21:45:34 +00004096 if g:RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
Bram Moolenaard2c61702020-09-06 15:58:36 +02004097 assert_equal([], readfile('Xdidit'))
Bram Moolenaare3d46852020-08-29 13:39:17 +02004098 endif
4099 delete('Xdidit')
4100enddef
4101
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004102def Test_restoring_cpo()
Bram Moolenaardd674772022-09-15 22:26:18 +01004103 writefile(['vim9script', 'set nocp'], 'Xsourced', 'D')
4104 writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00004105 if g:RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004106 assert_equal(['done'], readfile('Xdone'))
4107 endif
Bram Moolenaar090728a2020-12-20 15:43:31 +01004108 delete('Xdone')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004109
Bram Moolenaardd674772022-09-15 22:26:18 +01004110 writefile(['vim9script', 'g:cpoval = &cpo'], 'XanotherScript', 'D')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004111 set cpo=aABceFsMny>
4112 edit XanotherScript
4113 so %
4114 assert_equal('aABceFsMny>', &cpo)
Christian Brabandt22105fd2024-07-15 20:51:11 +02004115 assert_equal('aABceFsz', g:cpoval)
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004116 :1del
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004117 setline(1, 'let g:cpoval = &cpo')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004118 w
4119 so %
4120 assert_equal('aABceFsMny>', &cpo)
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004121 assert_equal('aABceFsMny>', g:cpoval)
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004122
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004123 set cpo&vim
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004124 unlet g:cpoval
4125
4126 if has('unix')
4127 # 'cpo' is not restored in main vimrc
4128 var save_HOME = $HOME
4129 $HOME = getcwd() .. '/Xhome'
Bram Moolenaardd674772022-09-15 22:26:18 +01004130 mkdir('Xhome', 'R')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004131 var lines =<< trim END
4132 vim9script
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004133 writefile(['before: ' .. &cpo], 'Xrporesult')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004134 set cpo+=M
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004135 writefile(['after: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004136 END
4137 writefile(lines, 'Xhome/.vimrc')
4138
4139 lines =<< trim END
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004140 call writefile(['later: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004141 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004142 writefile(lines, 'Xlegacy', 'D')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004143
4144 lines =<< trim END
4145 vim9script
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004146 call writefile(['vim9: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004147 qa
4148 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004149 writefile(lines, 'Xvim9', 'D')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004150
Bram Moolenaar62aec932022-01-29 21:45:34 +00004151 var cmd = g:GetVimCommand() .. " -S Xlegacy -S Xvim9"
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004152 cmd = substitute(cmd, '-u NONE', '', '')
4153 exe "silent !" .. cmd
4154
4155 assert_equal([
Christian Brabandt22105fd2024-07-15 20:51:11 +02004156 'before: aABceFsz',
4157 'after: aABceFszM',
4158 'later: aABceFszM',
4159 'vim9: aABceFsz'], readfile('Xrporesult'))
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004160
4161 $HOME = save_HOME
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004162 delete('Xrporesult')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004163 endif
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004164enddef
4165
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004166" Use :function so we can use Check commands
4167func Test_no_redraw_when_restoring_cpo()
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004168 CheckScreendump
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004169 CheckFeature timers
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004170 call Run_test_no_redraw_when_restoring_cpo()
4171endfunc
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004172
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004173def Run_test_no_redraw_when_restoring_cpo()
Drew Vogelea67ba72025-05-07 22:05:17 +02004174 CheckScreendump
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004175 var lines =<< trim END
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004176 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00004177 export def Func()
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004178 enddef
4179 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004180 mkdir('Xnordir/autoload', 'pR')
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01004181 writefile(lines, 'Xnordir/autoload/script.vim')
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004182
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004183 lines =<< trim END
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004184 vim9script
4185 set cpo+=M
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01004186 exe 'set rtp^=' .. getcwd() .. '/Xnordir'
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00004187 au CmdlineEnter : ++once timer_start(0, (_) => script#Func())
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004188 setline(1, 'some text')
4189 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004190 writefile(lines, 'XTest_redraw_cpo', 'D')
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004191 var buf = g:RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
4192 term_sendkeys(buf, "V:")
4193 g:VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004194
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004195 # clean up
4196 term_sendkeys(buf, "\<Esc>u")
4197 g:StopVimInTerminal(buf)
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004198enddef
4199
4200func Test_reject_declaration()
4201 CheckScreendump
4202 call Run_test_reject_declaration()
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004203endfunc
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004204
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004205def Run_test_reject_declaration()
Drew Vogelea67ba72025-05-07 22:05:17 +02004206 CheckScreendump
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004207 var buf = g:RunVimInTerminal('', {'rows': 6})
4208 term_sendkeys(buf, ":vim9cmd var x: number\<CR>")
Bram Moolenaar330a3882022-03-05 11:05:57 +00004209 g:VerifyScreenDump(buf, 'Test_vim9_reject_declaration_1', {})
4210 term_sendkeys(buf, ":\<CR>")
4211 term_sendkeys(buf, ":vim9cmd g:foo = 123 | echo g:foo\<CR>")
4212 g:VerifyScreenDump(buf, 'Test_vim9_reject_declaration_2', {})
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004213
4214 # clean up
4215 g:StopVimInTerminal(buf)
4216enddef
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004217
Bram Moolenaar204852a2022-03-05 12:56:44 +00004218def Test_minimal_command_name_length()
4219 var names = [
4220 'cons',
4221 'brea',
4222 'cat',
4223 'catc',
4224 'con',
Bram Moolenaarb2175222022-03-05 20:24:41 +00004225 'cont',
4226 'conti',
4227 'contin',
4228 'continu',
Bram Moolenaar204852a2022-03-05 12:56:44 +00004229 'el',
4230 'els',
4231 'elsei',
4232 'endfo',
4233 'en',
4234 'end',
4235 'endi',
4236 'endw',
4237 'endt',
4238 'endtr',
Bram Moolenaarb2175222022-03-05 20:24:41 +00004239 'exp',
4240 'expo',
4241 'expor',
Bram Moolenaar204852a2022-03-05 12:56:44 +00004242 'fina',
4243 'finall',
Bram Moolenaard523c7b2022-03-06 14:51:22 +00004244 'fini',
4245 'finis',
Bram Moolenaarb2175222022-03-05 20:24:41 +00004246 'imp',
4247 'impo',
4248 'impor',
4249 'retu',
4250 'retur',
Bram Moolenaar204852a2022-03-05 12:56:44 +00004251 'th',
4252 'thr',
4253 'thro',
4254 'wh',
4255 'whi',
4256 'whil',
4257 ]
4258 for name in names
4259 v9.CheckDefAndScriptFailure([name .. ' '], 'E1065:')
4260 endfor
Bram Moolenaarb2175222022-03-05 20:24:41 +00004261
4262 var lines =<< trim END
4263 vim9script
4264 def SomeFunc()
4265 endd
4266 END
4267 v9.CheckScriptFailure(lines, 'E1065:')
4268 lines =<< trim END
4269 vim9script
4270 def SomeFunc()
4271 endde
4272 END
4273 v9.CheckScriptFailure(lines, 'E1065:')
Bram Moolenaar204852a2022-03-05 12:56:44 +00004274enddef
4275
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004276def Test_unset_any_variable()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004277 var lines =<< trim END
4278 var name: any
4279 assert_equal(0, name)
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004280 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004281 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004282enddef
4283
Bram Moolenaar7e9210e2020-09-25 23:12:51 +02004284func Test_define_func_at_command_line()
Bram Moolenaar58dbef32020-09-25 22:13:05 +02004285 CheckRunVimInTerminal
4286
Bram Moolenaar7e9210e2020-09-25 23:12:51 +02004287 " call indirectly to avoid compilation error for missing functions
4288 call Run_Test_define_func_at_command_line()
4289endfunc
4290
4291def Run_Test_define_func_at_command_line()
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004292 # run in a separate Vim instance to avoid the script context
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004293 var lines =<< trim END
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004294 func CheckAndQuit()
4295 call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
4296 call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
4297 endfunc
4298 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004299 writefile([''], 'Xdidcmd', 'D')
4300 writefile(lines, 'XcallFunc', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00004301 var buf = g:RunVimInTerminal('-S XcallFunc', {rows: 6})
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004302 # define Afunc() on the command line
4303 term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
4304 term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004305 g:WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004306
Bram Moolenaar62aec932022-01-29 21:45:34 +00004307 call g:StopVimInTerminal(buf)
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004308enddef
4309
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004310def Test_script_var_scope()
4311 var lines =<< trim END
4312 vim9script
4313 if true
4314 if true
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:', 7)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004322
4323 lines =<< trim END
4324 vim9script
4325 if true
4326 if false
4327 var one = 'one'
4328 echo one
4329 else
4330 var one = 'one'
4331 echo one
4332 endif
4333 echo one
4334 endif
4335 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004336 v9.CheckScriptFailure(lines, 'E121:', 10)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004337
4338 lines =<< trim END
4339 vim9script
4340 while true
4341 var one = 'one'
4342 echo one
4343 break
4344 endwhile
4345 echo one
4346 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004347 v9.CheckScriptFailure(lines, 'E121:', 7)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004348
4349 lines =<< trim END
4350 vim9script
4351 for i in range(1)
4352 var one = 'one'
4353 echo one
4354 endfor
4355 echo one
4356 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004357 v9.CheckScriptFailure(lines, 'E121:', 6)
Bram Moolenaar9becdf22020-10-10 21:33:48 +02004358
4359 lines =<< trim END
4360 vim9script
4361 {
4362 var one = 'one'
4363 assert_equal('one', one)
4364 }
4365 assert_false(exists('one'))
4366 assert_false(exists('s:one'))
4367 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004368 v9.CheckScriptSuccess(lines)
Bram Moolenaar9becdf22020-10-10 21:33:48 +02004369
4370 lines =<< trim END
4371 vim9script
4372 {
4373 var one = 'one'
4374 echo one
4375 }
4376 echo one
4377 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004378 v9.CheckScriptFailure(lines, 'E121:', 6)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004379enddef
4380
Bram Moolenaar352134b2020-10-17 22:04:08 +02004381def Test_catch_exception_in_callback()
4382 var lines =<< trim END
4383 vim9script
Bram Moolenaar2a389082021-04-09 20:24:31 +02004384 def Callback(...l: list<any>)
Bram Moolenaar352134b2020-10-17 22:04:08 +02004385 try
4386 var x: string
4387 var y: string
4388 # this error should be caught with CHECKLEN
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +00004389 var sl = ['']
4390 [x, y] = sl
Bram Moolenaar352134b2020-10-17 22:04:08 +02004391 catch
4392 g:caught = 'yes'
4393 endtry
4394 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01004395 popup_menu('popup', {callback: Callback})
Bram Moolenaar352134b2020-10-17 22:04:08 +02004396 feedkeys("\r", 'xt')
4397 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004398 v9.CheckScriptSuccess(lines)
Bram Moolenaar352134b2020-10-17 22:04:08 +02004399
4400 unlet g:caught
4401enddef
4402
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004403def Test_no_unknown_error_after_error()
4404 if !has('unix') || !has('job')
4405 throw 'Skipped: not unix of missing +job feature'
4406 endif
Bram Moolenaarb16ff292021-09-26 20:14:39 +01004407 # FIXME: this check should not be needed
4408 if has('win32')
4409 throw 'Skipped: does not work on MS-Windows'
4410 endif
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004411 var lines =<< trim END
4412 vim9script
4413 var source: list<number>
Bram Moolenaar2a389082021-04-09 20:24:31 +02004414 def Out_cb(...l: list<any>)
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004415 eval [][0]
4416 enddef
Bram Moolenaar2a389082021-04-09 20:24:31 +02004417 def Exit_cb(...l: list<any>)
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004418 sleep 1m
Bram Moolenaar23d44492022-05-04 16:24:57 +01004419 g:did_call_exit_cb = true
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004420 source += l
4421 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01004422 var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
Bram Moolenaar6f17a3f2020-12-21 18:11:24 +01004423 while job_status(myjob) == 'run'
4424 sleep 10m
4425 endwhile
Bram Moolenaar206c2a62021-01-31 14:04:44 +01004426 # wait for Exit_cb() to be called
Bram Moolenaar23d44492022-05-04 16:24:57 +01004427 for x in range(100)
4428 if exists('g:did_call_exit_cb')
4429 unlet g:did_call_exit_cb
4430 break
4431 endif
4432 sleep 10m
4433 endfor
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004434 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004435 writefile(lines, 'Xdef', 'D')
Yee Cheng Chin69a8bb82022-11-06 12:25:47 +00004436 # Either the exit or out callback is called first, accept them in any order
4437 assert_fails('so Xdef', ['E684:\|E1012:', 'E1012:\|E684:'])
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004438enddef
4439
Bram Moolenaar4324d872020-12-01 20:12:24 +01004440def InvokeNormal()
4441 exe "norm! :m+1\r"
4442enddef
4443
4444def Test_invoke_normal_in_visual_mode()
4445 xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
4446 new
4447 setline(1, ['aaa', 'bbb'])
4448 feedkeys("V\<F3>", 'xt')
4449 assert_equal(['bbb', 'aaa'], getline(1, 2))
4450 xunmap <F3>
4451enddef
4452
Bram Moolenaarb5b94802020-12-13 17:50:20 +01004453def Test_white_space_after_command()
4454 var lines =<< trim END
4455 exit_cb: Func})
4456 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004457 v9.CheckDefAndScriptFailure(lines, 'E1144:', 1)
Bram Moolenaarf8103f22020-12-25 17:36:27 +01004458
4459 lines =<< trim END
4460 e#
4461 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004462 v9.CheckDefAndScriptFailure(lines, 'E1144:', 1)
Bram Moolenaarb5b94802020-12-13 17:50:20 +01004463enddef
4464
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004465def Test_script_var_gone_when_sourced_twice()
4466 var lines =<< trim END
4467 vim9script
4468 if exists('g:guard')
4469 finish
4470 endif
4471 g:guard = 1
4472 var name = 'thename'
4473 def g:GetName(): string
4474 return name
4475 enddef
4476 def g:SetName(arg: string)
4477 name = arg
4478 enddef
4479 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004480 writefile(lines, 'XscriptTwice.vim', 'D')
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004481 so XscriptTwice.vim
4482 assert_equal('thename', g:GetName())
4483 g:SetName('newname')
4484 assert_equal('newname', g:GetName())
4485 so XscriptTwice.vim
4486 assert_fails('call g:GetName()', 'E1149:')
4487 assert_fails('call g:SetName("x")', 'E1149:')
4488
4489 delfunc g:GetName
4490 delfunc g:SetName
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004491 unlet g:guard
4492enddef
4493
Bram Moolenaar10b94212021-02-19 21:42:57 +01004494def Test_unsupported_commands()
4495 var lines =<< trim END
4496 ka
4497 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004498 v9.CheckDefAndScriptFailure(lines, ['E476:', 'E492:'])
Bram Moolenaar10b94212021-02-19 21:42:57 +01004499
4500 lines =<< trim END
Bram Moolenaarada1d872021-02-20 08:16:51 +01004501 :1ka
4502 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004503 v9.CheckDefAndScriptFailure(lines, ['E476:', 'E492:'])
Bram Moolenaarada1d872021-02-20 08:16:51 +01004504
4505 lines =<< trim END
Yegappan Lakshmanan885de442022-04-23 10:51:14 +01004506 :k a
4507 END
4508 v9.CheckDefAndScriptFailure(lines, 'E1100:')
4509
4510 lines =<< trim END
4511 :1k a
4512 END
4513 v9.CheckDefAndScriptFailure(lines, 'E481:')
4514
4515 lines =<< trim END
Bram Moolenaar10b94212021-02-19 21:42:57 +01004516 t
4517 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004518 v9.CheckDefAndScriptFailure(lines, 'E1100:')
Bram Moolenaar10b94212021-02-19 21:42:57 +01004519
4520 lines =<< trim END
4521 x
4522 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004523 v9.CheckDefAndScriptFailure(lines, 'E1100:')
Bram Moolenaar10b94212021-02-19 21:42:57 +01004524
4525 lines =<< trim END
4526 xit
4527 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004528 v9.CheckDefAndScriptFailure(lines, 'E1100:')
4529
4530 lines =<< trim END
4531 Print
4532 END
4533 v9.CheckDefAndScriptFailure(lines, ['E476: Invalid command: Print', 'E492: Not an editor command: Print'])
4534
4535 lines =<< trim END
4536 mode 4
4537 END
4538 v9.CheckDefAndScriptFailure(lines, ['E476: Invalid command: mode 4', 'E492: Not an editor command: mode 4'])
Bram Moolenaar10b94212021-02-19 21:42:57 +01004539enddef
4540
Bram Moolenaarc70fe462021-04-17 17:59:19 +02004541def Test_mapping_line_number()
4542 var lines =<< trim END
4543 vim9script
4544 def g:FuncA()
4545 # Some comment
4546 FuncB(0)
4547 enddef
4548 # Some comment
4549 def FuncB(
4550 # Some comment
4551 n: number
4552 )
4553 exe 'nno '
4554 # Some comment
4555 .. '<F3> a'
4556 .. 'b'
4557 .. 'c'
4558 enddef
4559 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004560 v9.CheckScriptSuccess(lines)
Bram Moolenaarc70fe462021-04-17 17:59:19 +02004561 var res = execute('verbose nmap <F3>')
4562 assert_match('No mapping found', res)
4563
4564 g:FuncA()
4565 res = execute('verbose nmap <F3>')
4566 assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
4567
4568 nunmap <F3>
4569 delfunc g:FuncA
4570enddef
4571
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004572def Test_option_set()
4573 # legacy script allows for white space
4574 var lines =<< trim END
4575 set foldlevel =11
4576 call assert_equal(11, &foldlevel)
4577 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004578 v9.CheckScriptSuccess(lines)
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004579
4580 set foldlevel
4581 set foldlevel=12
4582 assert_equal(12, &foldlevel)
4583 set foldlevel+=2
4584 assert_equal(14, &foldlevel)
4585 set foldlevel-=3
4586 assert_equal(11, &foldlevel)
4587
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 lines =<< trim END
4594 set foldlevel +=1
4595 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004596 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004597
4598 lines =<< trim END
4599 set foldlevel ^=1
4600 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004601 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004602
4603 lines =<< trim END
4604 set foldlevel -=1
4605 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004606 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004607
4608 set foldlevel&
4609enddef
4610
LemonBoy32f34612023-09-02 21:52:05 +02004611def Test_option_set_line_number()
4612 var lines =<< trim END
4613 vim9script
4614 # line2
4615 # line3
4616 def F()
4617 # line5
4618 &foldlevel = -128
4619 enddef
4620 F()
4621 END
4622 v9.CheckScriptSuccess(lines)
4623
4624 var res = execute('verbose set foldlevel')
4625 assert_match(' foldlevel.*Last set from .*XScriptSuccess\d\+ line 6', res)
4626enddef
4627
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004628def Test_option_modifier()
Bram Moolenaar1594f312021-07-08 16:40:13 +02004629 # legacy script allows for white space
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004630 var lines =<< trim END
4631 set hlsearch & hlsearch !
4632 call assert_equal(1, &hlsearch)
4633 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004634 v9.CheckScriptSuccess(lines)
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004635
Bram Moolenaar1594f312021-07-08 16:40:13 +02004636 set hlsearch
4637 set hlsearch!
4638 assert_equal(false, &hlsearch)
4639
4640 set hlsearch
4641 set hlsearch&
4642 assert_equal(false, &hlsearch)
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004643
4644 lines =<< trim END
Bram Moolenaar1594f312021-07-08 16:40:13 +02004645 set hlsearch &
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004646 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004647 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &')
Bram Moolenaar1594f312021-07-08 16:40:13 +02004648
4649 lines =<< trim END
4650 set hlsearch !
4651 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004652 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !')
Bram Moolenaar1594f312021-07-08 16:40:13 +02004653
4654 set hlsearch&
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004655enddef
4656
Bram Moolenaarc03fe662021-07-11 16:52:45 +02004657" This must be called last, it may cause following :def functions to fail
4658def Test_xxx_echoerr_line_number()
4659 var lines =<< trim END
4660 echoerr 'some'
4661 .. ' error'
4662 .. ' continued'
4663 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004664 v9.CheckDefExecAndScriptFailure(lines, 'some error continued', 1)
Bram Moolenaarc03fe662021-07-11 16:52:45 +02004665enddef
4666
Bram Moolenaar9537e372021-12-10 21:05:53 +00004667func Test_debug_with_lambda()
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004668 CheckRunVimInTerminal
4669
Bram Moolenaar9537e372021-12-10 21:05:53 +00004670 " call indirectly to avoid compilation error for missing functions
4671 call Run_Test_debug_with_lambda()
4672endfunc
4673
4674def Run_Test_debug_with_lambda()
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004675 var lines =<< trim END
4676 vim9script
4677 def Func()
4678 var n = 0
4679 echo [0]->filter((_, v) => v == n)
4680 enddef
4681 breakadd func Func
4682 Func()
4683 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004684 writefile(lines, 'XdebugFunc', 'D')
Christian Brabandt7edde3f2024-05-04 09:38:59 +02004685 var buf = g:RunVimInTerminal('-S XdebugFunc', {rows: 10, wait_for_ruler: 0})
4686 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 10)))
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004687
4688 term_sendkeys(buf, "cont\<CR>")
Christian Brabandt7edde3f2024-05-04 09:38:59 +02004689 g:WaitForAssert(() => assert_match('\[0\]', term_getline(buf, 9)))
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004690
Bram Moolenaar62aec932022-01-29 21:45:34 +00004691 g:StopVimInTerminal(buf)
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004692enddef
4693
Bram Moolenaar310091d2021-12-23 21:14:37 +00004694func Test_debug_running_out_of_lines()
4695 CheckRunVimInTerminal
4696
4697 " call indirectly to avoid compilation error for missing functions
4698 call Run_Test_debug_running_out_of_lines()
4699endfunc
4700
4701def Run_Test_debug_running_out_of_lines()
4702 var lines =<< trim END
4703 vim9script
4704 def Crash()
4705 #
4706 #
4707 #
4708 #
4709 #
4710 #
4711 #
4712 if true
4713 #
4714 endif
4715 enddef
4716 breakadd func Crash
4717 Crash()
4718 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004719 writefile(lines, 'XdebugFunc', 'D')
Christian Brabandt7edde3f2024-05-04 09:38:59 +02004720 var buf = g:RunVimInTerminal('-S XdebugFunc', {rows: 10, wait_for_ruler: 0})
4721 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 10)))
Bram Moolenaar310091d2021-12-23 21:14:37 +00004722
4723 term_sendkeys(buf, "next\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004724 g:TermWait(buf)
Christian Brabandt7edde3f2024-05-04 09:38:59 +02004725 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 10)))
Bram Moolenaar310091d2021-12-23 21:14:37 +00004726
4727 term_sendkeys(buf, "cont\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004728 g:TermWait(buf)
Bram Moolenaar310091d2021-12-23 21:14:37 +00004729
Bram Moolenaar62aec932022-01-29 21:45:34 +00004730 g:StopVimInTerminal(buf)
Bram Moolenaar310091d2021-12-23 21:14:37 +00004731enddef
4732
dundargocc57b5bc2022-11-02 13:30:51 +00004733def Test_ambiguous_command_error()
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004734 var lines =<< trim END
4735 vim9script
4736 command CmdA echomsg 'CmdA'
4737 command CmdB echomsg 'CmdB'
4738 Cmd
4739 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004740 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 4)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004741
4742 lines =<< trim END
4743 vim9script
4744 def Func()
4745 Cmd
4746 enddef
4747 Func()
4748 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004749 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 1)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004750
4751 lines =<< trim END
4752 vim9script
4753 nnoremap <F3> <ScriptCmd>Cmd<CR>
4754 feedkeys("\<F3>", 'xt')
4755 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004756 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 3)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004757
4758 delcommand CmdA
4759 delcommand CmdB
4760 nunmap <F3>
4761enddef
4762
Dominique Pelle923dce22021-11-21 11:36:04 +00004763" Execute this near the end, profiling doesn't stop until Vim exits.
Bram Moolenaard9162552021-07-11 15:26:13 +02004764" This only tests that it works, not the profiling output.
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004765def Test_profile_with_lambda()
Bram Moolenaar4ece1522021-07-11 16:31:51 +02004766 CheckFeature profile
4767
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004768 var lines =<< trim END
4769 vim9script
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004770
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004771 def ProfiledWithLambda()
4772 var n = 3
4773 echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n)
4774 enddef
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004775
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004776 def ProfiledNested()
4777 var x = 0
4778 def Nested(): any
4779 return x
4780 enddef
4781 Nested()
4782 enddef
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004783
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004784 def g:ProfiledNestedProfiled()
4785 var x = 0
4786 def Nested(): any
4787 return x
4788 enddef
4789 Nested()
4790 enddef
4791
4792 def Profile()
Bram Moolenaar48f69cd2022-03-15 16:16:47 +00004793 ProfiledWithLambda()
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004794 ProfiledNested()
4795
Bram Moolenaar48f69cd2022-03-15 16:16:47 +00004796 # Also profile the nested function. Use a different function, although
4797 # the contents is the same, to make sure it was not already compiled.
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004798 profile func *
4799 g:ProfiledNestedProfiled()
4800
4801 profdel func *
4802 profile pause
4803 enddef
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004804
4805 var result = 'done'
4806 try
4807 # mark functions for profiling now to avoid E1271
4808 profile start Xprofile.log
4809 profile func ProfiledWithLambda
4810 profile func ProfiledNested
4811
4812 Profile()
4813 catch
4814 result = 'failed: ' .. v:exception
4815 finally
4816 writefile([result], 'Xdidprofile')
4817 endtry
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004818 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004819 writefile(lines, 'Xprofile.vim', 'D')
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004820 call system(g:GetVimCommand()
4821 .. ' --clean'
4822 .. ' -c "so Xprofile.vim"'
4823 .. ' -c "qall!"')
4824 call assert_equal(0, v:shell_error)
4825
4826 assert_equal(['done'], readfile('Xdidprofile'))
4827 assert_true(filereadable('Xprofile.log'))
4828 delete('Xdidprofile')
4829 delete('Xprofile.log')
Bram Moolenaard9162552021-07-11 15:26:13 +02004830enddef
4831
Bram Moolenaar4f6e7722022-03-16 20:26:02 +00004832func Test_misplaced_type()
Drew Vogelea67ba72025-05-07 22:05:17 +02004833 CheckScreendump
Bram Moolenaar4f6e7722022-03-16 20:26:02 +00004834 CheckRunVimInTerminal
4835 call Run_Test_misplaced_type()
4836endfunc
4837
4838def Run_Test_misplaced_type()
Drew Vogelea67ba72025-05-07 22:05:17 +02004839 CheckScreendump
Bram Moolenaar9510d222022-09-11 15:14:05 +01004840 writefile(['let g:somevar = "asdf"'], 'XTest_misplaced_type', 'D')
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004841 var buf = g:RunVimInTerminal('-S XTest_misplaced_type', {'rows': 6})
Bram Moolenaar9510d222022-09-11 15:14:05 +01004842 term_sendkeys(buf, ":vim9cmd echo islocked('somevar: string')\<CR>")
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004843 g:VerifyScreenDump(buf, 'Test_misplaced_type', {})
4844
4845 g:StopVimInTerminal(buf)
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004846enddef
4847
LemonBoya5d35902022-04-29 21:15:02 +01004848" Ensure echo doesn't crash when stringifying empty variables.
4849def Test_echo_uninit_variables()
4850 var res: string
4851
4852 var var_bool: bool
4853 var var_num: number
4854 var var_float: float
4855 var Var_func: func
4856 var var_string: string
4857 var var_blob: blob
LemonBoya5d35902022-04-29 21:15:02 +01004858 var var_list: list<any>
4859 var var_dict: dict<any>
4860
4861 redir => res
4862 echo var_bool
4863 echo var_num
4864 echo var_float
4865 echo Var_func
4866 echo var_string
4867 echo var_blob
LemonBoya5d35902022-04-29 21:15:02 +01004868 echo var_list
4869 echo var_dict
4870 redir END
4871
Bram Moolenaarf1d63b92022-05-06 13:37:42 +01004872 assert_equal(['false', '0', '0.0', 'function()', '', '0z', '[]', '{}'], res->split('\n'))
4873
4874 if has('job')
4875 var var_job: job
4876 var var_channel: channel
4877
4878 redir => res
4879 echo var_job
4880 echo var_channel
4881 redir END
4882
4883 assert_equal(['no process', 'channel fail'], res->split('\n'))
4884 endif
LemonBoya5d35902022-04-29 21:15:02 +01004885enddef
4886
Bram Moolenaar6342e2c2022-12-12 18:56:32 +00004887def Test_free_type_before_use()
4888 # this rather complicated script was freeing a type before using it
4889 var lines =<< trim END
4890 vim9script
4891
4892 def Scan(rel: list<dict<any>>): func(func(dict<any>))
4893 return (Emit: func(dict<any>)) => {
4894 for t in rel
4895 Emit(t)
4896 endfor
4897 }
4898 enddef
4899
4900 def Build(Cont: func(func(dict<any>))): list<dict<any>>
4901 var rel: list<dict<any>> = []
4902 Cont((t) => {
4903 add(rel, t)
4904 })
4905 return rel
4906 enddef
4907
4908 var R = [{A: 0}]
4909 var result = Scan(R)->Build()
4910 result = Scan(R)->Build()
4911
4912 assert_equal(R, result)
4913 END
4914 v9.CheckScriptSuccess(lines)
4915enddef
4916
Yegappan Lakshmanana76fbe62023-09-27 18:51:43 +02004917" The following complicated script used to cause an internal error (E340)
4918" because the funcref instruction memory was referenced after the instruction
4919" memory was reallocated (Github issue #13178)
4920def Test_refer_funcref_instr_after_realloc()
4921 var lines =<< trim END
4922 vim9script
4923 def A(d: bool)
4924 var e = abs(0)
4925 var f = &emoji
4926 &emoji = true
4927 if ['', '', '']->index('xxx') == 0
4928 eval 0 + 0
4929 endif
4930 if &filetype == 'xxx'
4931 var g = abs(0)
4932 while g > 0
4933 if getline(g) == ''
4934 break
4935 endif
4936 --g
4937 endwhile
4938 if g == 0
4939 return
4940 endif
4941 if d
4942 feedkeys($'{g}G')
4943 g = abs(0)
4944 endif
4945 var h = abs(0)
4946 var i = abs(0)
4947 var j = abs(0)
4948 while j < 0
4949 if abs(0) < h && getline(j) != ''
4950 break
4951 endif
4952 ++j
4953 endwhile
4954 feedkeys($'{g}G{j}G')
4955 return
4956 endif
4957 def B()
4958 enddef
4959 def C()
4960 enddef
4961 enddef
4962 A(false)
4963 END
4964 v9.CheckScriptSuccess(lines)
4965enddef
4966
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004967" Test for calling a deferred function after an exception
4968def Test_defer_after_exception()
4969 var lines =<< trim END
4970 vim9script
4971
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004972 var callTrace: list<number> = []
4973 def Bar()
4974 callTrace += [1]
4975 throw 'InnerException'
4976 enddef
4977
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004978 def Defer()
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004979 callTrace += [2]
4980 callTrace += [3]
4981 try
4982 Bar()
4983 catch /InnerException/
4984 callTrace += [4]
4985 endtry
4986 callTrace += [5]
4987 callTrace += [6]
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004988 enddef
4989
4990 def Foo()
4991 defer Defer()
4992 throw "TestException"
4993 enddef
4994
4995 try
4996 Foo()
4997 catch /TestException/
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004998 callTrace += [7]
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004999 endtry
5000
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02005001 assert_equal([2, 3, 1, 4, 5, 6, 7], callTrace)
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02005002 END
Yegappan Lakshmananec3cebb2023-10-27 19:35:26 +02005003 v9.CheckSourceSuccess(lines)
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02005004enddef
5005
Yegappan Lakshmanan0ab500d2023-10-21 11:59:42 +02005006" Test for multiple deferred function which throw exceptions.
5007" Exceptions thrown by deferred functions should result in error messages but
5008" not propagated into the calling functions.
5009def Test_multidefer_with_exception()
5010 var lines =<< trim END
5011 vim9script
5012
5013 var callTrace: list<number> = []
5014 def Except()
5015 callTrace += [1]
5016 throw 'InnerException'
5017 callTrace += [2]
5018 enddef
5019
5020 def FirstDefer()
5021 callTrace += [3]
5022 callTrace += [4]
5023 enddef
5024
5025 def SecondDeferWithExcept()
5026 callTrace += [5]
5027 Except()
5028 callTrace += [6]
5029 enddef
5030
5031 def ThirdDefer()
5032 callTrace += [7]
5033 callTrace += [8]
5034 enddef
5035
5036 def Foo()
5037 callTrace += [9]
5038 defer FirstDefer()
5039 defer SecondDeferWithExcept()
5040 defer ThirdDefer()
5041 callTrace += [10]
5042 enddef
5043
5044 v:errmsg = ''
5045 try
5046 callTrace += [11]
5047 Foo()
5048 callTrace += [12]
5049 catch /TestException/
5050 callTrace += [13]
5051 catch
5052 callTrace += [14]
5053 finally
5054 callTrace += [15]
5055 endtry
5056 callTrace += [16]
5057
5058 assert_equal('E605: Exception not caught: InnerException', v:errmsg)
5059 assert_equal([11, 9, 10, 7, 8, 5, 1, 3, 4, 12, 15, 16], callTrace)
5060 END
Yegappan Lakshmananec3cebb2023-10-27 19:35:26 +02005061 v9.CheckSourceSuccess(lines)
5062enddef
5063
Yegappan Lakshmanana185a312023-12-16 14:36:08 +01005064" Test for using ":defer" inside an if statement with a false condition
5065def Test_defer_skipped()
5066 var lines =<< trim END
5067 def Foo()
5068 if false
5069 defer execute('echow "hello"', "")
5070 endif
5071 enddef
5072 defcompile
5073 END
5074 v9.CheckSourceSuccess(lines)
5075enddef
5076
Yegappan Lakshmanan062bb6b2023-12-16 14:46:40 +01005077" Test for using defer without parenthesis for the function name
5078def Test_defer_func_without_paren()
5079 var lines =<< trim END
5080 vim9script
5081 def Foo()
5082 defer Bar
5083 enddef
5084 defcompile
5085 END
5086 v9.CheckScriptFailure(lines, 'E107: Missing parentheses: Bar', 1)
5087enddef
5088
5089" Test for using defer without parenthesis for the function name
5090def Test_defer_non_existing_func()
5091 var lines =<< trim END
5092 vim9script
5093 def Foo()
5094 defer Bar()
5095 enddef
5096 defcompile
5097 END
5098 v9.CheckScriptFailure(lines, 'E1001: Variable not found: Bar', 1)
5099enddef
5100
5101" Test for using defer with an invalid function name
5102def Test_defer_invalid_func()
5103 var lines =<< trim END
5104 vim9script
5105 def Foo()
5106 var Abc = 10
5107 defer Abc()
5108 enddef
5109 defcompile
5110 END
5111 v9.CheckScriptFailure(lines, 'E129: Function name required', 2)
5112enddef
5113
5114" Test for using defer with an invalid argument to a function
5115def Test_defer_invalid_func_arg()
5116 var lines =<< trim END
5117 vim9script
5118 def Bar(x: number)
5119 enddef
5120 def Foo()
5121 defer Bar(a)
5122 enddef
5123 defcompile
5124 END
5125 v9.CheckScriptFailure(lines, 'E1001: Variable not found: a', 1)
5126enddef
5127
5128" Test for using an non-existing type in a "for" statement.
5129def Test_invalid_type_in_for()
5130 var lines =<< trim END
5131 vim9script
5132 def Foo()
5133 for b: x in range(10)
5134 endfor
5135 enddef
5136 defcompile
5137 END
Yegappan Lakshmanan1b531722024-05-09 09:12:31 +02005138 v9.CheckSourceFailure(lines, 'E1010: Type not recognized: x', 1)
Yegappan Lakshmanan062bb6b2023-12-16 14:46:40 +01005139enddef
5140
5141" Test for using a line break between the variable name and the type in a for
5142" statement.
5143def Test_for_stmt_space_before_type()
5144 var lines =<< trim END
5145 vim9script
5146 def Foo()
5147 for a
5148 :number in range(10)
5149 endfor
5150 enddef
5151 defcompile
5152 END
5153 v9.CheckSourceFailure(lines, 'E1059: No white space allowed before colon: :number in range(10)', 2)
5154enddef
5155
zeertzjqc029c132024-03-28 11:37:26 +01005156" This test used to cause a use-after-free memory access
Yegappan Lakshmanan28d71b52024-01-12 17:21:55 +01005157def Test_for_empty_line_after_lambda()
5158 var lines =<< trim END
5159 vim9script
5160 echomsg range(0, 2)->map((_, v) => {
5161 return 1
5162 })
5163
5164 assert_equal('[1, 1, 1]', v:statusmsg)
5165 END
5166 v9.CheckSourceSuccess(lines)
5167
5168 lines =<< trim END
5169 vim9script
5170 echomsg range(0, 1)->map((_, v) => {
5171 return 1
5172 }) range(0, 1)->map((_, v) => {
5173 return 2
5174 }) # comment
5175
5176 assert_equal('[1, 1] [2, 2]', v:statusmsg)
5177 END
5178 v9.CheckSourceSuccess(lines)
5179enddef
5180
Yegappan Lakshmanan3fa8f772024-04-04 21:42:07 +02005181" Test for evaluating a lambda block from a string
5182def Test_eval_lambda_block()
5183 var lines =<< trim END
5184 vim9script
5185 var Fn = eval("(x: number): number => {\nreturn x * 2\n}")
5186 assert_equal(6, Fn(3))
5187 END
5188 v9.CheckSourceSuccess(lines)
5189enddef
5190
Yegappan Lakshmananda9d3452024-05-02 13:02:36 +02005191" Test for using various null values
5192def Test_null_values()
5193 var lines =<< trim END
5194 var nullValues = [
5195 [null, 1, 'null', 7, 'special'],
5196 [null_blob, 1, '0z', 10, 'blob'],
Yegappan Lakshmananda9d3452024-05-02 13:02:36 +02005197 [null_dict, 1, '{}', 4, 'dict<any>'],
5198 [null_function, 1, "function('')", 2, 'func(...): unknown'],
Yegappan Lakshmananda9d3452024-05-02 13:02:36 +02005199 [null_list, 1, '[]', 3, 'list<any>'],
Yegappan Lakshmanande8f8f72025-04-01 20:43:36 +02005200 [null_object, 1, 'object of [unknown]', 13, 'object<any>'],
Yegappan Lakshmananda9d3452024-05-02 13:02:36 +02005201 [null_partial, 1, "function('')", 2, 'func(...): unknown'],
5202 [null_string, 1, "''", 1, 'string']
5203 ]
Dominique Pellé52123872024-07-07 20:37:12 +02005204 if has('channel')
5205 nullValues->add([null_channel, 1, 'channel fail', 9, 'channel'])
5206 endif
5207 if has('job')
5208 nullValues->add([null_job, 1, 'no process', 8, 'job'])
5209 endif
Yegappan Lakshmananda9d3452024-05-02 13:02:36 +02005210
5211 for [Val, emptyExp, stringExp, typeExp, typenameExp] in nullValues
5212 assert_equal(emptyExp, empty(Val))
5213 assert_equal(stringExp, string(Val))
5214 assert_equal(typeExp, type(Val))
5215 assert_equal(typenameExp, typename(Val))
5216 assert_equal(Val, copy(Val))
5217 assert_equal(-1, test_refcount(Val))
5218 endfor
5219 END
5220 v9.CheckSourceDefAndScriptSuccess(lines)
5221enddef
5222
Yegappan Lakshmanan1b531722024-05-09 09:12:31 +02005223" Test for using an unknown type in a typecast
5224def Test_unknown_type_in_typecast()
5225 var lines =<< trim END
5226 vim9script
5227 var a = <MyType>b
5228 END
5229 v9.CheckSourceFailure(lines, 'E1010: Type not recognized: MyType', 2)
5230
5231 lines =<< trim END
5232 vim9script
5233 var Fn = <funcx(number, number): number>b
5234 END
5235 v9.CheckSourceFailure(lines, 'E1010: Type not recognized: funcx(number, number): number', 2)
Yegappan Lakshmananfe424d12024-05-17 18:20:43 +02005236
5237 # Wrong type in a type cast
5238 lines =<< trim END
5239 vim9script
5240 var i: number = <number>true
5241 END
5242 v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected number but got bool', 2)
Yegappan Lakshmanan1b531722024-05-09 09:12:31 +02005243enddef
5244
Yegappan Lakshmanane2038412024-12-14 19:59:24 +01005245" Test for calling a function as a method with a list argument
5246" This exercises some conditions in the assignment statement parsing code.
5247def Test_method_call_with_list_arg()
5248 var lines =<< trim END
5249 vim9script
5250
5251 def Foo(l: list<number>)
5252 g:save_list = l
5253 enddef
5254
5255 def Bar()
5256 var a = 10
5257 var b = 20
5258 [a, b]->Foo()
5259 enddef
5260
5261 g:save_list = []
5262 Bar()
5263 assert_equal([10, 20], g:save_list)
5264 END
5265 v9.CheckSourceSuccess(lines)
5266enddef
5267
Bram Moolenaar585fea72020-04-02 22:33:21 +02005268" Keep this last, it messes up highlighting.
5269def Test_substitute_cmd()
5270 new
5271 setline(1, 'something')
5272 :substitute(some(other(
5273 assert_equal('otherthing', getline(1))
5274 bwipe!
5275
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02005276 # also when the context is Vim9 script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02005277 var lines =<< trim END
Bram Moolenaar585fea72020-04-02 22:33:21 +02005278 vim9script
5279 new
5280 setline(1, 'something')
5281 :substitute(some(other(
5282 assert_equal('otherthing', getline(1))
5283 bwipe!
5284 END
Bram Moolenaardd674772022-09-15 22:26:18 +01005285 writefile(lines, 'Xvim9lines', 'D')
Bram Moolenaar585fea72020-04-02 22:33:21 +02005286 source Xvim9lines
Bram Moolenaar585fea72020-04-02 22:33:21 +02005287enddef
5288
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01005289" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker