blob: b29f3cd80c4558357a0ea489d6b77a479453bb2a [file] [log] [blame]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001" Test various aspects of the Vim9 script language.
2
Bram Moolenaar673660a2020-01-26 16:50:05 +01003source check.vim
Bram Moolenaar101f4812020-06-16 23:18:51 +02004source term_util.vim
Bram Moolenaar62aec932022-01-29 21:45:34 +00005import './vim9.vim' as v9
Bram Moolenaar37294bd2021-03-10 13:40:08 +01006source screendump.vim
Bram Moolenaard8448622022-01-07 21:39:52 +00007source shared.vim
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01008
Bram Moolenaarb79ee0c2022-01-01 12:17:00 +00009def Test_vim9script_feature()
10 # example from the help, here the feature is always present
11 var lines =<< trim END
12 " old style comment
13 if !has('vim9script')
14 " legacy commands would go here
15 finish
16 endif
17 vim9script
18 # Vim9 script commands go here
19 g:didit = true
20 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000021 v9.CheckScriptSuccess(lines)
Bram Moolenaarb79ee0c2022-01-01 12:17:00 +000022 assert_equal(true, g:didit)
23 unlet g:didit
24enddef
25
Bram Moolenaar5d72ce62020-08-20 23:04:06 +020026def Test_range_only()
27 new
28 setline(1, ['blah', 'Blah'])
29 :/Blah/
30 assert_equal(2, getcurpos()[1])
Bram Moolenaarc2af0af2020-08-23 21:06:02 +020031 bwipe!
32
33 # without range commands use current line
34 new
35 setline(1, ['one', 'two', 'three'])
36 :2
37 print
Bram Moolenaar62aec932022-01-29 21:45:34 +000038 assert_equal('two', g:Screenline(&lines))
Bram Moolenaarc2af0af2020-08-23 21:06:02 +020039 :3
40 list
Bram Moolenaar62aec932022-01-29 21:45:34 +000041 assert_equal('three$', g:Screenline(&lines))
Bram Moolenaarb8554302021-02-15 21:30:30 +010042
43 # missing command does not print the line
44 var lines =<< trim END
45 vim9script
46 :1|
Bram Moolenaar62aec932022-01-29 21:45:34 +000047 assert_equal('three$', g:Screenline(&lines))
Bram Moolenaarb8554302021-02-15 21:30:30 +010048 :|
Bram Moolenaar62aec932022-01-29 21:45:34 +000049 assert_equal('three$', g:Screenline(&lines))
Bram Moolenaarb8554302021-02-15 21:30:30 +010050 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000051 v9.CheckScriptSuccess(lines)
Bram Moolenaarb8554302021-02-15 21:30:30 +010052
Bram Moolenaarc2af0af2020-08-23 21:06:02 +020053 bwipe!
Bram Moolenaar025cb1c2020-12-14 18:31:27 +010054
Bram Moolenaar0c7f2612022-02-17 19:44:07 +000055 lines =<< trim END
56 set cpo+=-
57 :1,999
58 END
59 v9.CheckDefExecAndScriptFailure(lines, 'E16:', 2)
60 set cpo&vim
61
62 v9.CheckDefExecAndScriptFailure([":'x"], 'E20:', 1)
63
Bram Moolenaar025cb1c2020-12-14 18:31:27 +010064 # won't generate anything
65 if false
66 :123
67 endif
Bram Moolenaar5d72ce62020-08-20 23:04:06 +020068enddef
69
Bram Moolenaar09d94212022-05-05 15:20:03 +010070def Test_invalid_range()
71 var lines =<< trim END
72 :123 eval 1 + 2
73 END
74 v9.CheckDefAndScriptFailure(lines, 'E481:', 1)
75
76 lines =<< trim END
77 :123 if true
78 endif
79 END
80 v9.CheckDefAndScriptFailure(lines, 'E481:', 1)
81
82 lines =<< trim END
83 :123 echo 'yes'
84 END
85 v9.CheckDefAndScriptFailure(lines, 'E481:', 1)
86
87 lines =<< trim END
88 :123 cd there
89 END
90 v9.CheckDefAndScriptFailure(lines, 'E481:', 1)
91enddef
92
Bram Moolenaara6e67e42020-05-15 23:36:40 +020093let g:alist = [7]
94let g:astring = 'text'
Bram Moolenaarf0b9f432020-07-17 23:03:17 +020095let g:anumber = 123
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010096
Bram Moolenaar4c17ad92020-04-27 22:47:51 +020097def Test_delfunction()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +020098 # Check function is defined in script namespace
Bram Moolenaar62aec932022-01-29 21:45:34 +000099 v9.CheckScriptSuccess([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200100 'vim9script',
101 'func CheckMe()',
102 ' return 123',
103 'endfunc',
Bram Moolenaara749a422022-02-12 19:52:25 +0000104 'func DoTest()',
105 ' call assert_equal(123, s:CheckMe())',
106 'endfunc',
107 'DoTest()',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200108 ])
109
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200110 # Check function in script namespace cannot be deleted
Bram Moolenaar62aec932022-01-29 21:45:34 +0000111 v9.CheckScriptFailure([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200112 'vim9script',
113 'func DeleteMe1()',
114 'endfunc',
115 'delfunction DeleteMe1',
116 ], 'E1084:')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000117 v9.CheckScriptFailure([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200118 'vim9script',
119 'func DeleteMe2()',
120 'endfunc',
121 'def DoThat()',
122 ' delfunction DeleteMe2',
123 'enddef',
124 'DoThat()',
125 ], 'E1084:')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000126 v9.CheckScriptFailure([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200127 'vim9script',
128 'def DeleteMe3()',
129 'enddef',
130 'delfunction DeleteMe3',
131 ], 'E1084:')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000132 v9.CheckScriptFailure([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200133 'vim9script',
134 'def DeleteMe4()',
135 'enddef',
136 'def DoThat()',
137 ' delfunction DeleteMe4',
138 'enddef',
139 'DoThat()',
140 ], 'E1084:')
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200141
142 # Check that global :def function can be replaced and deleted
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200143 var lines =<< trim END
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200144 vim9script
145 def g:Global(): string
146 return "yes"
147 enddef
148 assert_equal("yes", g:Global())
149 def! g:Global(): string
150 return "no"
151 enddef
152 assert_equal("no", g:Global())
153 delfunc g:Global
154 assert_false(exists('*g:Global'))
155 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000156 v9.CheckScriptSuccess(lines)
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200157
158 # Check that global function can be replaced by a :def function and deleted
159 lines =<< trim END
160 vim9script
161 func g:Global()
162 return "yes"
163 endfunc
164 assert_equal("yes", g:Global())
165 def! g:Global(): string
166 return "no"
167 enddef
168 assert_equal("no", g:Global())
169 delfunc g:Global
170 assert_false(exists('*g:Global'))
171 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000172 v9.CheckScriptSuccess(lines)
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200173
174 # Check that global :def function can be replaced by a function and deleted
175 lines =<< trim END
176 vim9script
177 def g:Global(): string
178 return "yes"
179 enddef
180 assert_equal("yes", g:Global())
181 func! g:Global()
182 return "no"
183 endfunc
184 assert_equal("no", g:Global())
185 delfunc g:Global
186 assert_false(exists('*g:Global'))
187 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000188 v9.CheckScriptSuccess(lines)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200189enddef
190
Bram Moolenaar08052222020-09-14 17:04:31 +0200191def Test_wrong_type()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000192 v9.CheckDefFailure(['var name: list<nothing>'], 'E1010:')
193 v9.CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
194 v9.CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
195 v9.CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100196
Bram Moolenaar62aec932022-01-29 21:45:34 +0000197 v9.CheckDefFailure(['var name: dict<number'], 'E1009:')
198 v9.CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100199
Bram Moolenaar62aec932022-01-29 21:45:34 +0000200 v9.CheckDefFailure(['var name: ally'], 'E1010:')
201 v9.CheckDefFailure(['var name: bram'], 'E1010:')
202 v9.CheckDefFailure(['var name: cathy'], 'E1010:')
203 v9.CheckDefFailure(['var name: dom'], 'E1010:')
204 v9.CheckDefFailure(['var name: freddy'], 'E1010:')
205 v9.CheckDefFailure(['var name: john'], 'E1010:')
206 v9.CheckDefFailure(['var name: larry'], 'E1010:')
207 v9.CheckDefFailure(['var name: ned'], 'E1010:')
208 v9.CheckDefFailure(['var name: pam'], 'E1010:')
209 v9.CheckDefFailure(['var name: sam'], 'E1010:')
210 v9.CheckDefFailure(['var name: vim'], 'E1010:')
Bram Moolenaara0a9f432020-04-28 21:29:34 +0200211
Bram Moolenaar62aec932022-01-29 21:45:34 +0000212 v9.CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
213 v9.CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
Bram Moolenaar08052222020-09-14 17:04:31 +0200214enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100215
Bram Moolenaara749a422022-02-12 19:52:25 +0000216def Test_script_namespace()
217 # defining a function or variable with s: is not allowed
218 var lines =<< trim END
219 vim9script
220 def s:Function()
221 enddef
222 END
223 v9.CheckScriptFailure(lines, 'E1268:')
224
225 for decl in ['var', 'const', 'final']
226 lines =<< trim END
227 vim9script
228 var s:var = 'var'
229 END
230 v9.CheckScriptFailure([
231 'vim9script',
232 decl .. ' s:var = "var"',
233 ], 'E1268:')
234 endfor
235
236 # Calling a function or using a variable with s: is not allowed at script
237 # level
238 lines =<< trim END
239 vim9script
240 def Function()
241 enddef
242 s:Function()
243 END
244 v9.CheckScriptFailure(lines, 'E1268:')
245 lines =<< trim END
246 vim9script
247 def Function()
248 enddef
249 call s:Function()
250 END
251 v9.CheckScriptFailure(lines, 'E1268:')
252 lines =<< trim END
253 vim9script
254 var var = 'var'
255 echo s:var
256 END
257 v9.CheckScriptFailure(lines, 'E1268:')
258enddef
259
Bram Moolenaar10c65862020-10-08 21:16:42 +0200260def Test_script_wrong_type()
261 var lines =<< trim END
262 vim9script
Bram Moolenaara749a422022-02-12 19:52:25 +0000263 var dict: dict<string>
264 dict['a'] = ['x']
Bram Moolenaar10c65862020-10-08 21:16:42 +0200265 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000266 v9.CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3)
Bram Moolenaar10c65862020-10-08 21:16:42 +0200267enddef
268
Bram Moolenaar08052222020-09-14 17:04:31 +0200269def Test_const()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000270 v9.CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
271 v9.CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
272 v9.CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
273 v9.CheckDefFailure(['final two'], 'E1125:')
274 v9.CheckDefFailure(['final &option'], 'E996:')
Bram Moolenaardbeecb22020-09-14 18:15:09 +0200275
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200276 var lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200277 final list = [1, 2, 3]
Bram Moolenaardbeecb22020-09-14 18:15:09 +0200278 list[0] = 4
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200279 list->assert_equal([4, 2, 3])
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200280 const other = [5, 6, 7]
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200281 other->assert_equal([5, 6, 7])
Bram Moolenaar71abe482020-09-14 22:28:30 +0200282
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200283 var varlist = [7, 8]
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200284 const constlist = [1, varlist, 3]
Bram Moolenaar71abe482020-09-14 22:28:30 +0200285 varlist[0] = 77
Bram Moolenaar23e2e112021-08-03 21:16:18 +0200286 constlist[1][1] = 88
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200287 var cl = constlist[1]
Bram Moolenaar71abe482020-09-14 22:28:30 +0200288 cl[1] = 88
289 constlist->assert_equal([1, [77, 88], 3])
290
Bram Moolenaare0de1712020-12-02 17:36:54 +0100291 var vardict = {five: 5, six: 6}
292 const constdict = {one: 1, two: vardict, three: 3}
Bram Moolenaar71abe482020-09-14 22:28:30 +0200293 vardict['five'] = 55
Bram Moolenaar23e2e112021-08-03 21:16:18 +0200294 constdict['two']['six'] = 66
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200295 var cd = constdict['two']
Bram Moolenaar71abe482020-09-14 22:28:30 +0200296 cd['six'] = 66
Bram Moolenaare0de1712020-12-02 17:36:54 +0100297 constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3})
Bram Moolenaardbeecb22020-09-14 18:15:09 +0200298 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000299 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar0089ce22022-10-08 14:39:36 +0100300
301 # "any" type with const flag is recognized as "any"
302 lines =<< trim END
303 const dict: dict<any> = {foo: {bar: 42}}
304 const foo = dict.foo
305 assert_equal(v:t_number, type(foo.bar))
306 END
307 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar330d64d2022-10-09 12:55:33 +0100308
309 # also when used as a builtin function argument
310 lines =<< trim END
311 vim9script
312
313 def SorterFunc(lhs: dict<string>, rhs: dict<string>): number
314 return lhs.name <# rhs.name ? -1 : 1
315 enddef
316
317 def Run(): void
318 var list = [{name: "3"}, {name: "2"}]
319 const Sorter = get({}, "unknown", SorterFunc)
320 sort(list, Sorter)
321 assert_equal([{name: "2"}, {name: "3"}], list)
322 enddef
323
324 Run()
325 END
326 v9.CheckScriptSuccess(lines)
Bram Moolenaar08052222020-09-14 17:04:31 +0200327enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100328
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200329def Test_const_bang()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200330 var lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200331 const var = 234
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200332 var = 99
333 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000334 v9.CheckDefExecFailure(lines, 'E1018:', 2)
335 v9.CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200336
337 lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200338 const ll = [2, 3, 4]
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200339 ll[0] = 99
340 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000341 v9.CheckDefExecFailure(lines, 'E1119:', 2)
342 v9.CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200343
344 lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200345 const ll = [2, 3, 4]
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200346 ll[3] = 99
347 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000348 v9.CheckDefExecFailure(lines, 'E1118:', 2)
349 v9.CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200350
351 lines =<< trim END
Bram Moolenaare0de1712020-12-02 17:36:54 +0100352 const dd = {one: 1, two: 2}
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200353 dd["one"] = 99
354 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000355 v9.CheckDefExecFailure(lines, 'E1121:', 2)
356 v9.CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200357
358 lines =<< trim END
Bram Moolenaare0de1712020-12-02 17:36:54 +0100359 const dd = {one: 1, two: 2}
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200360 dd["three"] = 99
361 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000362 v9.CheckDefExecFailure(lines, 'E1120:')
363 v9.CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200364enddef
365
Bram Moolenaardf069ee2020-06-22 23:02:51 +0200366def Test_range_no_colon()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000367 v9.CheckDefFailure(['%s/a/b/'], 'E1050:')
368 v9.CheckDefFailure(['+ s/a/b/'], 'E1050:')
369 v9.CheckDefFailure(['- s/a/b/'], 'E1050:')
370 v9.CheckDefFailure(['. s/a/b/'], 'E1050:')
Bram Moolenaardf069ee2020-06-22 23:02:51 +0200371enddef
372
373
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100374def Test_block()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200375 var outer = 1
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100376 {
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200377 var inner = 2
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100378 assert_equal(1, outer)
379 assert_equal(2, inner)
380 }
381 assert_equal(1, outer)
Bram Moolenaar3f1e9f02021-02-27 22:36:43 +0100382
383 {|echo 'yes'|}
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100384enddef
385
Bram Moolenaar08052222020-09-14 17:04:31 +0200386def Test_block_failure()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000387 v9.CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
388 v9.CheckDefFailure(['}'], 'E1025:')
389 v9.CheckDefFailure(['{', 'echo 1'], 'E1026:')
Bram Moolenaar08052222020-09-14 17:04:31 +0200390enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100391
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200392def Test_block_local_vars()
393 var lines =<< trim END
394 vim9script
Bram Moolenaared234f22020-10-15 20:42:20 +0200395 v:testing = 1
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200396 if true
Bram Moolenaared234f22020-10-15 20:42:20 +0200397 var text = ['hello']
398 def SayHello(): list<string>
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200399 return text
400 enddef
401 def SetText(v: string)
Bram Moolenaared234f22020-10-15 20:42:20 +0200402 text = [v]
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200403 enddef
404 endif
405
406 if true
Bram Moolenaared234f22020-10-15 20:42:20 +0200407 var text = ['again']
408 def SayAgain(): list<string>
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200409 return text
410 enddef
411 endif
Bram Moolenaared234f22020-10-15 20:42:20 +0200412
413 # test that the "text" variables are not cleaned up
414 test_garbagecollect_now()
415
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200416 defcompile
417
Bram Moolenaared234f22020-10-15 20:42:20 +0200418 assert_equal(['hello'], SayHello())
419 assert_equal(['again'], SayAgain())
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200420
421 SetText('foobar')
Bram Moolenaared234f22020-10-15 20:42:20 +0200422 assert_equal(['foobar'], SayHello())
423
424 call writefile(['ok'], 'Xdidit')
425 qall!
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200426 END
Bram Moolenaared234f22020-10-15 20:42:20 +0200427
428 # need to execute this with a separate Vim instance to avoid the current
429 # context gets garbage collected.
Bram Moolenaardd674772022-09-15 22:26:18 +0100430 writefile(lines, 'Xscript', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000431 g:RunVim([], [], '-S Xscript')
Bram Moolenaared234f22020-10-15 20:42:20 +0200432 assert_equal(['ok'], readfile('Xdidit'))
433
Bram Moolenaared234f22020-10-15 20:42:20 +0200434 delete('Xdidit')
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200435enddef
436
Bram Moolenaar39ca4122020-10-20 14:25:07 +0200437def Test_block_local_vars_with_func()
438 var lines =<< trim END
439 vim9script
440 if true
441 var foo = 'foo'
442 if true
443 var bar = 'bar'
444 def Func(): list<string>
445 return [foo, bar]
446 enddef
447 endif
448 endif
449 # function is compiled here, after blocks have finished, can still access
450 # "foo" and "bar"
451 assert_equal(['foo', 'bar'], Func())
452 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000453 v9.CheckScriptSuccess(lines)
Bram Moolenaar39ca4122020-10-20 14:25:07 +0200454enddef
455
Bram Moolenaare4db17f2021-08-01 21:19:43 +0200456" legacy func for command that's defined later
Bram Moolenaar62aec932022-01-29 21:45:34 +0000457func s:InvokeSomeCommand()
Bram Moolenaare4db17f2021-08-01 21:19:43 +0200458 SomeCommand
459endfunc
460
Yegappan Lakshmanane74cad32024-04-12 18:48:35 +0200461def Test_command_block()
Bram Moolenaare4db17f2021-08-01 21:19:43 +0200462 com SomeCommand {
463 g:someVar = 'some'
464 }
465 InvokeSomeCommand()
466 assert_equal('some', g:someVar)
467
468 delcommand SomeCommand
469 unlet g:someVar
470enddef
471
Yegappan Lakshmanane74cad32024-04-12 18:48:35 +0200472" Test for using heredoc in a :command command block
473def Test_command_block_heredoc()
474 var lines =<< trim CODE
475 vim9script
476 com SomeCommand {
477 g:someVar =<< trim END
478 aaa
479 bbb
480 END
481 }
482 SomeCommand
483 assert_equal(['aaa', 'bbb'], g:someVar)
484 def Foo()
485 g:someVar = []
486 SomeCommand
487 assert_equal(['aaa', 'bbb'], g:someVar)
488 enddef
489 Foo()
490 delcommand SomeCommand
491 unlet g:someVar
492 CODE
493 v9.CheckSourceSuccess( lines)
494
495 # Execute a command with heredoc in a block
496 lines =<< trim CODE
497 vim9script
498 com SomeCommand {
499 g:someVar =<< trim END
500 aaa
501 bbb
502 END
503 }
504 execute('SomeCommand')
505 assert_equal(['aaa', 'bbb'], g:someVar)
506 delcommand SomeCommand
507 unlet g:someVar
508 CODE
509 v9.CheckSourceSuccess(lines)
510
zeertzjq1f5175d2024-04-13 17:52:26 +0200511 # Heredoc with comment
512 lines =<< trim CODE
513 vim9script
514 com SomeCommand {
515 g:someVar =<< trim END # comment
516 aaa
517 bbb
518 END
519 }
520 execute('SomeCommand')
521 assert_equal(['aaa', 'bbb'], g:someVar)
522 delcommand SomeCommand
523 unlet g:someVar
524 CODE
525 v9.CheckSourceSuccess(lines)
526
Yegappan Lakshmanane74cad32024-04-12 18:48:35 +0200527 # heredoc evaluation
528 lines =<< trim CODE
529 vim9script
530 com SomeCommand {
531 var suffix = '---'
532 g:someVar =<< trim eval END
533 ccc{suffix}
534 ddd
535 END
536 }
537 SomeCommand
538 assert_equal(['ccc---', 'ddd'], g:someVar)
539 def Foo()
540 g:someVar = []
541 SomeCommand
542 assert_equal(['ccc---', 'ddd'], g:someVar)
543 enddef
544 Foo()
545 delcommand SomeCommand
546 unlet g:someVar
547 CODE
548 v9.CheckSourceSuccess(lines)
549
550 # command following heredoc
551 lines =<< trim CODE
552 vim9script
553 com SomeCommand {
554 var l =<< trim END
555 eee
556 fff
557 END
558 g:someVar = l
559 }
560 SomeCommand
561 assert_equal(['eee', 'fff'], g:someVar)
562 delcommand SomeCommand
563 unlet g:someVar
564 CODE
565 v9.CheckSourceSuccess(lines)
566
567 # Error in heredoc
568 lines =<< trim CODE
569 vim9script
570 com SomeCommand {
571 g:someVar =<< trim END
572 eee
573 fff
574 }
575 try
576 SomeCommand
577 catch
578 assert_match("E990: Missing end marker 'END'", v:exception)
579 endtry
580 delcommand SomeCommand
581 unlet g:someVar
582 CODE
583 v9.CheckSourceSuccess(lines)
584enddef
585
586def Test_autocommand_block()
Bram Moolenaare4db17f2021-08-01 21:19:43 +0200587 au BufNew *.xml {
588 g:otherVar = 'other'
589 }
590 split other.xml
591 assert_equal('other', g:otherVar)
592
593 bwipe!
594 au! BufNew *.xml
595 unlet g:otherVar
596enddef
597
Yegappan Lakshmanan0072cee2025-01-07 20:22:32 +0100598def Test_block_in_a_string()
599 var lines =<< trim END
600 vim9script
601
602 def Foo(): string
603 var x = ' => { # abc'
604 return x
605 enddef
606
607 assert_equal(' => { # abc', Foo())
608
609 def Bar(): string
610 var x = " => { # abc"
611 return x
612 enddef
613
614 assert_equal(" => { # abc", Bar())
615 END
616 v9.CheckSourceSuccess(lines)
617enddef
618
Bram Moolenaard032f342020-07-18 18:13:02 +0200619func g:NoSuchFunc()
620 echo 'none'
621endfunc
622
Bram Moolenaar9e1d9e32021-01-11 20:17:34 +0100623def Test_try_catch_throw()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200624 var l = []
Bram Moolenaar7a092242020-04-16 22:10:49 +0200625 try # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100626 add(l, '1')
627 throw 'wrong'
Bram Moolenaar9d383f32023-05-14 21:38:12 +0100628 add(l, '2') # "unreachable code"
Bram Moolenaar7a092242020-04-16 22:10:49 +0200629 catch # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100630 add(l, v:exception)
Bram Moolenaar7a092242020-04-16 22:10:49 +0200631 finally # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100632 add(l, '3')
Bram Moolenaar7a092242020-04-16 22:10:49 +0200633 endtry # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100634 assert_equal(['1', 'wrong', '3'], l)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200635
Bram Moolenaare8593122020-07-18 15:17:02 +0200636 l = []
637 try
638 try
639 add(l, '1')
640 throw 'wrong'
Bram Moolenaar9d383f32023-05-14 21:38:12 +0100641 add(l, '2') # "unreachable code"
Bram Moolenaare8593122020-07-18 15:17:02 +0200642 catch /right/
643 add(l, v:exception)
644 endtry
645 catch /wrong/
646 add(l, 'caught')
Bram Moolenaar204852a2022-03-05 12:56:44 +0000647 finally
Bram Moolenaare8593122020-07-18 15:17:02 +0200648 add(l, 'finally')
649 endtry
650 assert_equal(['1', 'caught', 'finally'], l)
651
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200652 var n: number
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200653 try
654 n = l[3]
655 catch /E684:/
656 n = 99
657 endtry
658 assert_equal(99, n)
659
Bram Moolenaar69f70502021-01-01 16:10:46 +0100660 var done = 'no'
661 if 0
662 try | catch | endtry
663 else
664 done = 'yes'
665 endif
666 assert_equal('yes', done)
667
668 done = 'no'
669 if 1
670 done = 'yes'
671 else
672 try | catch | endtry
673 done = 'never'
674 endif
675 assert_equal('yes', done)
676
677 if 1
678 else
679 try | catch /pat/ | endtry
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000680 try | catch /pat/
Bram Moolenaar69f70502021-01-01 16:10:46 +0100681 endtry
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000682 try
Bram Moolenaar69f70502021-01-01 16:10:46 +0100683 catch /pat/ | endtry
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000684 try
685 catch /pat/
Bram Moolenaar69f70502021-01-01 16:10:46 +0100686 endtry
687 endif
688
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200689 try
Bram Moolenaarcc673e72020-08-16 17:33:35 +0200690 # string slice returns a string, not a number
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200691 n = g:astring[3]
Bram Moolenaar5e654232020-09-16 15:22:00 +0200692 catch /E1012:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200693 n = 77
694 endtry
695 assert_equal(77, n)
696
697 try
698 n = l[g:astring]
Bram Moolenaar5e654232020-09-16 15:22:00 +0200699 catch /E1012:/
Bram Moolenaar56acb092020-08-16 14:48:19 +0200700 n = 88
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200701 endtry
Bram Moolenaar56acb092020-08-16 14:48:19 +0200702 assert_equal(88, n)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200703
704 try
705 n = s:does_not_exist
706 catch /E121:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200707 n = 111
708 endtry
709 assert_equal(111, n)
710
711 try
712 n = g:does_not_exist
713 catch /E121:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200714 n = 121
715 endtry
716 assert_equal(121, n)
717
Bram Moolenaare0de1712020-12-02 17:36:54 +0100718 var d = {one: 1}
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200719 try
720 n = d[g:astring]
721 catch /E716:/
722 n = 222
723 endtry
724 assert_equal(222, n)
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200725
726 try
727 n = -g:astring
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200728 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200729 n = 233
730 endtry
731 assert_equal(233, n)
732
733 try
734 n = +g:astring
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200735 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200736 n = 244
737 endtry
738 assert_equal(244, n)
739
740 try
741 n = +g:alist
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200742 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200743 n = 255
744 endtry
745 assert_equal(255, n)
746
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200747 var nd: dict<any>
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200748 try
Bram Moolenaar2e5910b2021-02-03 17:41:24 +0100749 nd = {[g:alist]: 1}
750 catch /E1105:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200751 n = 266
752 endtry
753 assert_equal(266, n)
754
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000755 l = [1, 2, 3]
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200756 try
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +0000757 [n] = l
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200758 catch /E1093:/
759 n = 277
760 endtry
761 assert_equal(277, n)
762
Bram Moolenaare8593122020-07-18 15:17:02 +0200763 try
764 &ts = g:astring
Bram Moolenaar5e654232020-09-16 15:22:00 +0200765 catch /E1012:/
Bram Moolenaare8593122020-07-18 15:17:02 +0200766 n = 288
767 endtry
768 assert_equal(288, n)
769
770 try
771 &backspace = 'asdf'
772 catch /E474:/
773 n = 299
774 endtry
775 assert_equal(299, n)
776
777 l = [1]
778 try
779 l[3] = 3
780 catch /E684:/
781 n = 300
782 endtry
783 assert_equal(300, n)
784
785 try
Bram Moolenaare8593122020-07-18 15:17:02 +0200786 unlet g:does_not_exist
787 catch /E108:/
788 n = 322
789 endtry
790 assert_equal(322, n)
791
792 try
Bram Moolenaar2bede172020-11-19 18:53:18 +0100793 d = {text: 1, [g:astring]: 2}
Bram Moolenaare8593122020-07-18 15:17:02 +0200794 catch /E721:/
795 n = 333
796 endtry
797 assert_equal(333, n)
798
799 try
Bram Moolenaar62aec932022-01-29 21:45:34 +0000800 l = g:DeletedFunc()
Bram Moolenaare8593122020-07-18 15:17:02 +0200801 catch /E933:/
802 n = 344
803 endtry
804 assert_equal(344, n)
Bram Moolenaard032f342020-07-18 18:13:02 +0200805
806 try
Yegappan Lakshmanana764e732021-07-25 15:57:32 +0200807 echo range(1, 2, 0)
808 catch /E726:/
Bram Moolenaard032f342020-07-18 18:13:02 +0200809 n = 355
810 endtry
811 assert_equal(355, n)
812
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200813 var P = function('g:NoSuchFunc')
Bram Moolenaard032f342020-07-18 18:13:02 +0200814 delfunc g:NoSuchFunc
815 try
816 echo P()
817 catch /E117:/
818 n = 366
819 endtry
820 assert_equal(366, n)
821
822 try
823 echo g:NoSuchFunc()
824 catch /E117:/
825 n = 377
826 endtry
827 assert_equal(377, n)
828
829 try
830 echo g:alist + 4
831 catch /E745:/
832 n = 388
833 endtry
834 assert_equal(388, n)
835
836 try
837 echo 4 + g:alist
838 catch /E745:/
839 n = 399
840 endtry
841 assert_equal(399, n)
842
843 try
844 echo g:alist.member
845 catch /E715:/
846 n = 400
847 endtry
848 assert_equal(400, n)
849
850 try
851 echo d.member
852 catch /E716:/
853 n = 411
854 endtry
855 assert_equal(411, n)
Bram Moolenaard9d77892021-02-12 21:32:47 +0100856
857 var counter = 0
858 for i in range(4)
859 try
860 eval [][0]
861 catch
862 endtry
863 counter += 1
864 endfor
865 assert_equal(4, counter)
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100866
Bram Moolenaar9fa5dab2021-07-20 19:18:44 +0200867 # no requirement for spaces before |
868 try|echo 0|catch|endtry
869
Bram Moolenaar003312b2021-12-20 10:55:35 +0000870 # return in try with finally
871 def ReturnInTry(): number
872 var ret = 4
873 try
874 return ret
875 catch /this/
876 return -1
877 catch /that/
878 return -1
879 finally
880 # changing ret has no effect
881 ret = 7
882 endtry
883 return -2
884 enddef
885 assert_equal(4, ReturnInTry())
886
887 # return in catch with finally
888 def ReturnInCatch(): number
889 var ret = 5
890 try
891 throw 'getout'
Bram Moolenaar9d383f32023-05-14 21:38:12 +0100892 return -1 # "unreachable code"
Bram Moolenaar003312b2021-12-20 10:55:35 +0000893 catch /getout/
894 # ret is evaluated here
895 return ret
896 finally
897 # changing ret later has no effect
898 ret = -3
899 endtry
900 return -2
901 enddef
902 assert_equal(5, ReturnInCatch())
903
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100904 # return in finally after empty catch
905 def ReturnInFinally(): number
906 try
907 finally
Bram Moolenaar003312b2021-12-20 10:55:35 +0000908 return 6
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100909 endtry
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100910 enddef
Bram Moolenaar003312b2021-12-20 10:55:35 +0000911 assert_equal(6, ReturnInFinally())
Bram Moolenaar8ac681a2021-06-15 20:06:34 +0200912
913 var lines =<< trim END
914 vim9script
915 try
916 acos('0.5')
917 ->setline(1)
918 catch
919 g:caught = v:exception
920 endtry
921 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000922 v9.CheckScriptSuccess(lines)
Yegappan Lakshmanan4490ec42021-07-27 22:00:44 +0200923 assert_match('E1219: Float or Number required for argument 1', g:caught)
Bram Moolenaar8ac681a2021-06-15 20:06:34 +0200924 unlet g:caught
Bram Moolenaar41978282021-07-04 14:47:30 +0200925
926 # missing catch and/or finally
927 lines =<< trim END
928 vim9script
929 try
930 echo 'something'
931 endtry
932 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000933 v9.CheckScriptFailure(lines, 'E1032:')
rbtnn84934992021-08-07 13:26:53 +0200934
935 # skipping try-finally-endtry when try-finally-endtry is used in another block
936 lines =<< trim END
937 if v:true
938 try
939 finally
940 endtry
941 else
942 try
943 finally
944 endtry
945 endif
946 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000947 v9.CheckDefAndScriptSuccess(lines)
Yee Cheng Chin2051af12025-01-09 22:14:34 +0100948
949 # test that the v:exception stacks are correctly restored
950 try
951 try
952 throw 101
953 catch
954 assert_equal('101', v:exception)
955 try
956 catch
957 finally
958 assert_equal('101', v:exception) # finally shouldn't clear if it doesn't own it
959 endtry
960 assert_equal('101', v:exception)
961 throw 102 # Re-throw inside catch block
962 endtry
963 catch
964 assert_equal('102', v:exception)
965 try
966 throw 103 # throw inside nested exception stack
967 catch
968 assert_equal('103', v:exception)
969 endtry
970 assert_equal('102', v:exception) # restored stack
971 finally
972 assert_equal('', v:exception) # finally should clear if it owns the exception
973 endtry
974 try
975 try
976 throw 104
977 catch
978 try
979 exec 'nonexistent_cmd' # normal exception inside nested exception stack
980 catch
981 assert_match('E492:', v:exception)
982 endtry
983 eval [][0] # normal exception inside catch block
984 endtry
985 catch
986 assert_match('E684:', v:exception)
987 endtry
988 assert_equal('', v:exception) # All exceptions properly popped
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100989enddef
990
Bram Moolenaara2c00282023-05-14 22:05:15 +0100991def Test_unreachable_after()
992 var lines =<< trim END
993 try
994 throw 'Error'
995 echo 'not reached'
996 catch /Error/
997 endtry
998 END
999 v9.CheckDefFailure(lines, 'E1095: Unreachable code after :throw')
1000
1001 lines =<< trim END
1002 def SomeFunc(): number
1003 try
1004 return 3
1005 echo 'not reached'
1006 catch /Error/
1007 endtry
1008 return 4
1009 enddef
1010 defcompile
1011 END
1012 v9.CheckScriptFailure(lines, 'E1095: Unreachable code after :return')
1013enddef
1014
Bram Moolenaar3ef2e412023-04-30 18:50:48 +01001015def Test_throw_in_nested_try()
1016 var lines =<< trim END
1017 vim9script
1018
1019 def Try(F: func(): void)
1020 try
1021 F()
1022 catch
1023 endtry
1024 enddef
1025
1026 class X
1027 def F()
1028 try
1029 throw 'Foobar'
1030 catch
1031 throw v:exception
1032 endtry
1033 enddef
1034 endclass
1035
1036 def Test_TryMethod()
1037 var x = X.new()
1038 Try(() => x.F())
1039 enddef
1040
1041
1042 try
1043 Test_TryMethod()
1044 catch
1045 endtry
1046 END
1047 v9.CheckScriptSuccess(lines)
1048enddef
1049
Bram Moolenaar28bf6492022-03-03 15:11:20 +00001050def Test_try_var_decl()
1051 var lines =<< trim END
1052 vim9script
1053 try
1054 var in_try = 1
1055 assert_equal(1, get(s:, 'in_try', -1))
1056 throw "getout"
1057 catch
1058 var in_catch = 2
1059 assert_equal(-1, get(s:, 'in_try', -1))
1060 assert_equal(2, get(s:, 'in_catch', -1))
1061 finally
1062 var in_finally = 3
1063 assert_equal(-1, get(s:, 'in_try', -1))
1064 assert_equal(-1, get(s:, 'in_catch', -1))
1065 assert_equal(3, get(s:, 'in_finally', -1))
1066 endtry
1067 assert_equal(-1, get(s:, 'in_try', -1))
1068 assert_equal(-1, get(s:, 'in_catch', -1))
1069 assert_equal(-1, get(s:, 'in_finally', -1))
1070 END
1071 v9.CheckScriptSuccess(lines)
1072enddef
1073
Bram Moolenaar53c29612022-01-12 16:18:18 +00001074def Test_try_ends_in_return()
1075 var lines =<< trim END
1076 vim9script
1077 def Foo(): string
1078 try
1079 return 'foo'
1080 catch
1081 return 'caught'
1082 endtry
1083 enddef
1084 assert_equal('foo', Foo())
1085 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001086 v9.CheckScriptSuccess(lines)
Bram Moolenaar53c29612022-01-12 16:18:18 +00001087
1088 lines =<< trim END
1089 vim9script
1090 def Foo(): string
1091 try
1092 return 'foo'
1093 catch
1094 return 'caught'
1095 endtry
1096 echo 'notreached'
1097 enddef
1098 assert_equal('foo', Foo())
1099 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001100 v9.CheckScriptFailure(lines, 'E1095:')
Bram Moolenaar53c29612022-01-12 16:18:18 +00001101
1102 lines =<< trim END
1103 vim9script
1104 def Foo(): string
1105 try
1106 return 'foo'
1107 catch /x/
1108 return 'caught'
1109 endtry
1110 enddef
1111 assert_equal('foo', Foo())
1112 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001113 v9.CheckScriptFailure(lines, 'E1027:')
Bram Moolenaar53c29612022-01-12 16:18:18 +00001114
1115 lines =<< trim END
1116 vim9script
1117 def Foo(): string
1118 try
1119 echo 'foo'
1120 catch
1121 echo 'caught'
1122 finally
1123 return 'done'
1124 endtry
1125 enddef
1126 assert_equal('done', Foo())
1127 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001128 v9.CheckScriptSuccess(lines)
Bram Moolenaar53c29612022-01-12 16:18:18 +00001129
1130enddef
1131
Bram Moolenaar3f987b52021-06-30 12:02:24 +02001132def Test_try_in_catch()
1133 var lines =<< trim END
1134 vim9script
1135 var seq = []
1136 def DoIt()
1137 try
1138 seq->add('throw 1')
1139 eval [][0]
1140 seq->add('notreached')
1141 catch
1142 seq->add('catch')
1143 try
1144 seq->add('throw 2')
1145 eval [][0]
1146 seq->add('notreached')
1147 catch /nothing/
1148 seq->add('notreached')
1149 endtry
1150 seq->add('done')
1151 endtry
1152 enddef
1153 DoIt()
1154 assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq)
1155 END
1156enddef
1157
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001158def Test_error_in_catch()
1159 var lines =<< trim END
1160 try
1161 eval [][0]
1162 catch /E684:/
1163 eval [][0]
1164 endtry
1165 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001166 v9.CheckDefExecFailure(lines, 'E684:', 4)
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001167enddef
1168
Bram Moolenaar2e34c342021-03-14 12:13:33 +01001169" :while at the very start of a function that :continue jumps to
Bram Moolenaar62aec932022-01-29 21:45:34 +00001170def s:TryContinueFunc()
Bram Moolenaar2e34c342021-03-14 12:13:33 +01001171 while g:Count < 2
1172 g:sequence ..= 't'
1173 try
1174 echoerr 'Test'
1175 catch
1176 g:Count += 1
1177 g:sequence ..= 'c'
1178 continue
1179 endtry
1180 g:sequence ..= 'e'
1181 g:Count += 1
1182 endwhile
1183enddef
1184
1185def Test_continue_in_try_in_while()
1186 g:Count = 0
1187 g:sequence = ''
1188 TryContinueFunc()
1189 assert_equal('tctc', g:sequence)
1190 unlet g:Count
1191 unlet g:sequence
1192enddef
1193
Bram Moolenaar873f8242022-03-10 21:53:44 +00001194def Test_break_in_try_in_for()
1195 var lines =<< trim END
1196 vim9script
1197 def Ls(): list<string>
1198 var ls: list<string>
1199 for s in ['abc', 'def']
1200 for _ in [123, 456]
1201 try
1202 eval [][0]
1203 catch
1204 break
1205 endtry
1206 endfor
1207 ls += [s]
1208 endfor
1209 return ls
1210 enddef
1211 assert_equal(['abc', 'def'], Ls())
1212 END
1213 v9.CheckScriptSuccess(lines)
1214enddef
1215
Bram Moolenaar9cb577a2021-02-22 22:45:10 +01001216def Test_nocatch_return_in_try()
1217 # return in try block returns normally
1218 def ReturnInTry(): string
1219 try
1220 return '"some message"'
1221 catch
1222 endtry
1223 return 'not reached'
1224 enddef
1225 exe 'echoerr ' .. ReturnInTry()
1226enddef
1227
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001228def Test_cnext_works_in_catch()
1229 var lines =<< trim END
1230 vim9script
Bram Moolenaarc3235272021-07-10 19:42:03 +02001231 au BufEnter * eval 1 + 2
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001232 writefile(['text'], 'Xcncfile1')
1233 writefile(['text'], 'Xcncfile2')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001234 var items = [
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001235 {lnum: 1, filename: 'Xcncfile1', valid: true},
1236 {lnum: 1, filename: 'Xcncfile2', valid: true}
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001237 ]
1238 setqflist([], ' ', {items: items})
1239 cwindow
1240
1241 def CnextOrCfirst()
1242 # if cnext fails, cfirst is used
1243 try
1244 cnext
1245 catch
1246 cfirst
1247 endtry
1248 enddef
1249
1250 CnextOrCfirst()
1251 CnextOrCfirst()
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001252 writefile([getqflist({idx: 0}).idx], 'Xcncresult')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001253 qall
1254 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001255 writefile(lines, 'XCatchCnext', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001256 g:RunVim([], [], '--clean -S XCatchCnext')
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001257 assert_equal(['1'], readfile('Xcncresult'))
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001258
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001259 delete('Xcncfile1')
1260 delete('Xcncfile2')
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001261 delete('Xcncresult')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001262enddef
1263
Bram Moolenaar9e1d9e32021-01-11 20:17:34 +01001264def Test_throw_skipped()
1265 if 0
1266 throw dontgethere
1267 endif
1268enddef
1269
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001270def Test_nocatch_throw_silenced()
1271 var lines =<< trim END
1272 vim9script
1273 def Func()
1274 throw 'error'
1275 enddef
1276 silent! Func()
1277 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001278 writefile(lines, 'XthrowSilenced', 'D')
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001279 source XthrowSilenced
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001280enddef
1281
Bram Moolenaara2c00282023-05-14 22:05:15 +01001282" g:DeletedFunc() is found when compiling Test_try_catch_throw() and then
1283" deleted, this should give a runtime error.
Bram Moolenaare8593122020-07-18 15:17:02 +02001284def DeletedFunc(): list<any>
1285 return ['delete me']
1286enddef
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001287defcompile DeletedFunc
1288
1289call test_override('unreachable', 1)
1290defcompile Test_try_catch_throw
1291call test_override('unreachable', 0)
1292
Bram Moolenaare8593122020-07-18 15:17:02 +02001293delfunc DeletedFunc
1294
Bram Moolenaar62aec932022-01-29 21:45:34 +00001295def s:ThrowFromDef()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001296 throw "getout" # comment
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001297enddef
1298
Bram Moolenaar62aec932022-01-29 21:45:34 +00001299func s:CatchInFunc()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001300 try
Bram Moolenaar62aec932022-01-29 21:45:34 +00001301 call s:ThrowFromDef()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001302 catch
1303 let g:thrown_func = v:exception
1304 endtry
1305endfunc
1306
Bram Moolenaar62aec932022-01-29 21:45:34 +00001307def s:CatchInDef()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001308 try
1309 ThrowFromDef()
1310 catch
1311 g:thrown_def = v:exception
1312 endtry
1313enddef
1314
Bram Moolenaar62aec932022-01-29 21:45:34 +00001315def s:ReturnFinally(): string
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001316 try
1317 return 'intry'
Bram Moolenaar204852a2022-03-05 12:56:44 +00001318 finally
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001319 g:in_finally = 'finally'
1320 endtry
1321 return 'end'
1322enddef
1323
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001324def Test_try_catch_nested()
1325 CatchInFunc()
1326 assert_equal('getout', g:thrown_func)
1327
1328 CatchInDef()
1329 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001330
1331 assert_equal('intry', ReturnFinally())
1332 assert_equal('finally', g:in_finally)
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001333
1334 var l = []
1335 try
1336 l->add('1')
1337 throw 'bad'
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001338 l->add('x') # "unreachable code"
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001339 catch /bad/
1340 l->add('2')
1341 try
1342 l->add('3')
1343 throw 'one'
1344 l->add('x')
1345 catch /one/
1346 l->add('4')
1347 try
1348 l->add('5')
1349 throw 'more'
1350 l->add('x')
1351 catch /more/
1352 l->add('6')
1353 endtry
1354 endtry
1355 endtry
1356 assert_equal(['1', '2', '3', '4', '5', '6'], l)
Bram Moolenaar834193a2021-06-30 20:39:15 +02001357
1358 l = []
1359 try
1360 try
1361 l->add('1')
1362 throw 'foo'
1363 l->add('x')
1364 catch
1365 l->add('2')
1366 throw 'bar'
1367 l->add('x')
1368 finally
1369 l->add('3')
1370 endtry
1371 l->add('x')
1372 catch /bar/
1373 l->add('4')
1374 endtry
1375 assert_equal(['1', '2', '3', '4'], l)
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001376enddef
1377
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001378call test_override('unreachable', 1)
1379defcompile Test_try_catch_nested
1380call test_override('unreachable', 0)
1381
Bram Moolenaar62aec932022-01-29 21:45:34 +00001382def s:TryOne(): number
Bram Moolenaar9939f572020-09-16 22:29:52 +02001383 try
1384 return 0
1385 catch
1386 endtry
1387 return 0
1388enddef
1389
Bram Moolenaar62aec932022-01-29 21:45:34 +00001390def s:TryTwo(n: number): string
Bram Moolenaar9939f572020-09-16 22:29:52 +02001391 try
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001392 var x = {}
Bram Moolenaar9939f572020-09-16 22:29:52 +02001393 catch
1394 endtry
1395 return 'text'
1396enddef
1397
1398def Test_try_catch_twice()
1399 assert_equal('text', TryOne()->TryTwo())
1400enddef
1401
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001402def Test_try_catch_match()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001403 var seq = 'a'
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001404 try
1405 throw 'something'
1406 catch /nothing/
1407 seq ..= 'x'
1408 catch /some/
1409 seq ..= 'b'
1410 catch /asdf/
1411 seq ..= 'x'
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001412 catch ?a\?sdf?
1413 seq ..= 'y'
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001414 finally
1415 seq ..= 'c'
1416 endtry
1417 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001418enddef
1419
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001420def Test_try_catch_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001421 v9.CheckDefFailure(['catch'], 'E603:')
1422 v9.CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1423 v9.CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1424 v9.CheckDefFailure(['finally'], 'E606:')
1425 v9.CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1426 v9.CheckDefFailure(['endtry'], 'E602:')
1427 v9.CheckDefFailure(['while 1', 'endtry'], 'E170:')
1428 v9.CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1429 v9.CheckDefFailure(['if 1', 'endtry'], 'E171:')
1430 v9.CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001431
Bram Moolenaar62aec932022-01-29 21:45:34 +00001432 v9.CheckDefFailure(['throw'], 'E1143:')
1433 v9.CheckDefFailure(['throw xxx'], 'E1001:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001434enddef
1435
Bram Moolenaar7c5b3c0362021-02-14 22:40:57 +01001436def Try_catch_skipped()
1437 var l = []
1438 try
1439 finally
1440 endtry
1441
1442 if 1
1443 else
1444 try
1445 endtry
1446 endif
1447enddef
1448
1449" The skipped try/endtry was updating the wrong instruction.
1450def Test_try_catch_skipped()
1451 var instr = execute('disassemble Try_catch_skipped')
1452 assert_match("NEWLIST size 0\n", instr)
1453enddef
1454
Bram Moolenaar90a57162022-02-12 14:23:17 +00001455def Test_throw_line_number()
1456 def Func()
1457 eval 1 + 1
1458 eval 2 + 2
1459 throw 'exception'
1460 enddef
Yee Cheng Chin2051af12025-01-09 22:14:34 +01001461 def Func2()
1462 eval 1 + 1
1463 eval 2 + 2
1464 eval 3 + 3
1465 throw 'exception'
1466 enddef
Bram Moolenaar90a57162022-02-12 14:23:17 +00001467 try
1468 Func()
1469 catch /exception/
Yee Cheng Chin2051af12025-01-09 22:14:34 +01001470 try
1471 Func2()
1472 catch /exception/
1473 assert_match('line 4', v:throwpoint)
1474 endtry
Bram Moolenaar90a57162022-02-12 14:23:17 +00001475 assert_match('line 3', v:throwpoint)
1476 endtry
Yee Cheng Chin2051af12025-01-09 22:14:34 +01001477 assert_match('', v:throwpoint)
Bram Moolenaar90a57162022-02-12 14:23:17 +00001478enddef
Bram Moolenaar7c5b3c0362021-02-14 22:40:57 +01001479
1480
Bram Moolenaar006ad482020-06-30 20:55:15 +02001481def Test_throw_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001482 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001483 var lines =<< trim END
Bram Moolenaar006ad482020-06-30 20:55:15 +02001484 vim9script
1485 try
1486 throw 'one'
1487 .. 'two'
1488 catch
1489 assert_equal('onetwo', v:exception)
1490 endtry
1491 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001492 v9.CheckScriptSuccess(lines)
Bram Moolenaar1e021e62020-10-16 20:25:23 +02001493
1494 lines =<< trim END
1495 vim9script
Bram Moolenaar352134b2020-10-17 22:04:08 +02001496 @r = ''
Bram Moolenaar1e021e62020-10-16 20:25:23 +02001497 def Func()
1498 throw @r
1499 enddef
1500 var result = ''
1501 try
1502 Func()
1503 catch /E1129:/
1504 result = 'caught'
1505 endtry
1506 assert_equal('caught', result)
1507 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001508 v9.CheckScriptSuccess(lines)
Bram Moolenaar006ad482020-06-30 20:55:15 +02001509enddef
1510
Bram Moolenaared677f52020-08-12 16:38:10 +02001511def Test_error_in_nested_function()
Bram Moolenaar03dfde22021-02-14 13:17:22 +01001512 # an error in a nested :function aborts executing in the calling :def function
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001513 var lines =<< trim END
Bram Moolenaared677f52020-08-12 16:38:10 +02001514 vim9script
1515 def Func()
1516 Error()
1517 g:test_var = 1
1518 enddef
1519 func Error() abort
1520 eval [][0]
1521 endfunc
1522 Func()
1523 END
1524 g:test_var = 0
Bram Moolenaar62aec932022-01-29 21:45:34 +00001525 v9.CheckScriptFailure(lines, 'E684:')
Bram Moolenaared677f52020-08-12 16:38:10 +02001526 assert_equal(0, g:test_var)
1527enddef
1528
Bram Moolenaar227c58a2021-04-28 20:40:44 +02001529def Test_abort_after_error()
1530 var lines =<< trim END
1531 vim9script
1532 while true
1533 echo notfound
1534 endwhile
1535 g:gotthere = true
1536 END
1537 g:gotthere = false
Bram Moolenaar62aec932022-01-29 21:45:34 +00001538 v9.CheckScriptFailure(lines, 'E121:')
Bram Moolenaar227c58a2021-04-28 20:40:44 +02001539 assert_false(g:gotthere)
1540 unlet g:gotthere
1541enddef
1542
Bram Moolenaar37c83712020-06-30 21:18:36 +02001543def Test_cexpr_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001544 # only checks line continuation
Bram Moolenaar37c83712020-06-30 21:18:36 +02001545 set errorformat=File\ %f\ line\ %l
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001546 var lines =<< trim END
Bram Moolenaar37c83712020-06-30 21:18:36 +02001547 vim9script
1548 cexpr 'File'
1549 .. ' someFile' ..
1550 ' line 19'
1551 assert_equal(19, getqflist()[0].lnum)
1552 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001553 v9.CheckScriptSuccess(lines)
Bram Moolenaar397a87a2022-03-20 21:14:15 +00001554
1555 lines =<< trim END
1556 vim9script
1557 def CexprFail()
1558 au QuickfixCmdPre * echo g:doesnotexist
1559 cexpr 'File otherFile line 99'
1560 g:didContinue = 'yes'
1561 enddef
1562 CexprFail()
1563 g:didContinue = 'also'
1564 END
1565 g:didContinue = 'no'
1566 v9.CheckScriptFailure(lines, 'E121: Undefined variable: g:doesnotexist')
1567 assert_equal('no', g:didContinue)
1568 au! QuickfixCmdPre
1569
1570 lines =<< trim END
1571 vim9script
1572 def CexprFail()
1573 cexpr g:aNumber
1574 g:didContinue = 'yes'
1575 enddef
1576 CexprFail()
1577 g:didContinue = 'also'
1578 END
1579 g:aNumber = 123
1580 g:didContinue = 'no'
1581 v9.CheckScriptFailure(lines, 'E777: String or List expected')
1582 assert_equal('no', g:didContinue)
1583 unlet g:didContinue
1584
Bram Moolenaar37c83712020-06-30 21:18:36 +02001585 set errorformat&
1586enddef
1587
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001588def Test_statusline_syntax()
1589 # legacy syntax is used for 'statusline'
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001590 var lines =<< trim END
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001591 vim9script
1592 func g:Status()
1593 return '%{"x" is# "x"}'
1594 endfunc
1595 set laststatus=2 statusline=%!Status()
1596 redrawstatus
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00001597 set laststatus statusline=
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001598 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001599 v9.CheckScriptSuccess(lines)
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001600enddef
1601
Bram Moolenaarb2097502020-07-19 17:17:02 +02001602def Test_list_vimscript()
1603 # checks line continuation and comments
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001604 var lines =<< trim END
Bram Moolenaarb2097502020-07-19 17:17:02 +02001605 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001606 var mylist = [
Bram Moolenaarb2097502020-07-19 17:17:02 +02001607 'one',
1608 # comment
1609 'two', # empty line follows
1610
1611 'three',
1612 ]
1613 assert_equal(['one', 'two', 'three'], mylist)
1614 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001615 v9.CheckScriptSuccess(lines)
Bram Moolenaar66250c92020-08-20 15:02:42 +02001616
1617 # check all lines from heredoc are kept
1618 lines =<< trim END
1619 # comment 1
1620 two
1621 # comment 3
1622
1623 five
1624 # comment 6
1625 END
1626 assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
Bram Moolenaar4bce26b2021-01-22 22:06:56 +01001627
1628 lines =<< trim END
1629 [{
1630 a: 0}]->string()->assert_equal("[{'a': 0}]")
1631 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001632 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarb2097502020-07-19 17:17:02 +02001633enddef
1634
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001635if has('channel')
1636 let someJob = test_null_job()
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001637
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001638 def FuncWithError()
1639 echomsg g:someJob
1640 enddef
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001641
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001642 func Test_convert_emsg_to_exception()
1643 try
1644 call FuncWithError()
1645 catch
1646 call assert_match('Vim:E908:', v:exception)
1647 endtry
1648 endfunc
1649endif
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001650
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001651def Test_vim9script_mix()
1652 var lines =<< trim END
1653 if has(g:feature)
1654 " legacy script
1655 let g:legacy = 1
1656 finish
1657 endif
1658 vim9script
1659 g:legacy = 0
1660 END
1661 g:feature = 'eval'
1662 g:legacy = -1
Bram Moolenaar62aec932022-01-29 21:45:34 +00001663 v9.CheckScriptSuccess(lines)
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001664 assert_equal(1, g:legacy)
1665
1666 g:feature = 'noteval'
1667 g:legacy = -1
Bram Moolenaar62aec932022-01-29 21:45:34 +00001668 v9.CheckScriptSuccess(lines)
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001669 assert_equal(0, g:legacy)
1670enddef
1671
Bram Moolenaar750802b2020-02-23 18:08:33 +01001672def Test_vim9script_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001673 v9.CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
1674 v9.CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +01001675
Bram Moolenaar62aec932022-01-29 21:45:34 +00001676 v9.CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1677 v9.CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
Bram Moolenaarc785b9a2020-06-19 18:34:15 +02001678
Bram Moolenaare2e40752020-09-04 21:18:46 +02001679 assert_fails('vim9script', 'E1038:')
Bram Moolenaar107f7322022-02-06 17:30:41 +00001680 v9.CheckDefFailure(['vim9script'], 'E1038:')
Bram Moolenaar8cbf2492022-02-06 20:28:13 +00001681
1682 # no error when skipping
1683 if has('nothing')
1684 vim9script
1685 endif
Bram Moolenaarc970e422021-03-17 15:03:04 +01001686enddef
1687
Bram Moolenaar6c3843c2021-03-04 12:38:21 +01001688def Test_script_var_shadows_function()
1689 var lines =<< trim END
1690 vim9script
1691 def Func(): number
1692 return 123
1693 enddef
1694 var Func = 1
1695 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001696 v9.CheckScriptFailure(lines, 'E1041:', 5)
Bram Moolenaar6c3843c2021-03-04 12:38:21 +01001697enddef
1698
Bram Moolenaar052ff292021-12-11 13:54:46 +00001699def Test_function_shadows_script_var()
1700 var lines =<< trim END
1701 vim9script
1702 var Func = 1
1703 def Func(): number
1704 return 123
1705 enddef
1706 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001707 v9.CheckScriptFailure(lines, 'E1041:', 3)
Bram Moolenaar052ff292021-12-11 13:54:46 +00001708enddef
1709
Bram Moolenaarc3235272021-07-10 19:42:03 +02001710def Test_script_var_shadows_command()
1711 var lines =<< trim END
1712 var undo = 1
1713 undo = 2
1714 assert_equal(2, undo)
1715 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001716 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc3235272021-07-10 19:42:03 +02001717
1718 lines =<< trim END
1719 var undo = 1
1720 undo
1721 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001722 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaarc3235272021-07-10 19:42:03 +02001723enddef
1724
Bram Moolenaar2ef91562021-12-11 16:14:07 +00001725def Test_vim9script_call_wrong_type()
1726 var lines =<< trim END
1727 vim9script
1728 var Time = 'localtime'
1729 Time()
1730 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001731 v9.CheckScriptFailure(lines, 'E1085:')
Bram Moolenaar2ef91562021-12-11 16:14:07 +00001732enddef
1733
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001734def Test_vim9script_reload_delfunc()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001735 var first_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001736 vim9script
1737 def FuncYes(): string
1738 return 'yes'
1739 enddef
1740 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001741 var withno_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001742 def FuncNo(): string
1743 return 'no'
1744 enddef
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001745 def g:DoCheck(no_exists: bool)
1746 assert_equal('yes', FuncYes())
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001747 assert_equal('no', FuncNo())
1748 enddef
1749 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001750 var nono_lines =<< trim END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001751 def g:DoCheck(no_exists: bool)
1752 assert_equal('yes', FuncYes())
Bram Moolenaar44d66522020-09-06 22:26:57 +02001753 assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001754 enddef
1755 END
1756
1757 # FuncNo() is defined
Bram Moolenaardd674772022-09-15 22:26:18 +01001758 writefile(first_lines + withno_lines, 'Xreloaded.vim', 'D')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001759 source Xreloaded.vim
1760 g:DoCheck(true)
1761
1762 # FuncNo() is not redefined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001763 writefile(first_lines + nono_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001764 source Xreloaded.vim
Bram Moolenaar50824712020-12-20 21:10:17 +01001765 g:DoCheck(false)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001766
1767 # FuncNo() is back
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001768 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001769 source Xreloaded.vim
Bram Moolenaar50824712020-12-20 21:10:17 +01001770 g:DoCheck(false)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001771enddef
1772
Bram Moolenaar89483d42020-05-10 15:24:44 +02001773def Test_vim9script_reload_delvar()
1774 # write the script with a script-local variable
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001775 var lines =<< trim END
Bram Moolenaar89483d42020-05-10 15:24:44 +02001776 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001777 var name = 'string'
Bram Moolenaar89483d42020-05-10 15:24:44 +02001778 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001779 writefile(lines, 'XreloadVar.vim', 'D')
Bram Moolenaar89483d42020-05-10 15:24:44 +02001780 source XreloadVar.vim
1781
1782 # now write the script using the same variable locally - works
1783 lines =<< trim END
1784 vim9script
1785 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001786 var name = 'string'
Bram Moolenaar89483d42020-05-10 15:24:44 +02001787 enddef
1788 END
1789 writefile(lines, 'XreloadVar.vim')
1790 source XreloadVar.vim
Bram Moolenaar89483d42020-05-10 15:24:44 +02001791enddef
1792
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001793def Test_func_redefine_error()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001794 var lines = [
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001795 'vim9script',
1796 'def Func()',
1797 ' eval [][0]',
1798 'enddef',
1799 'Func()',
1800 ]
Bram Moolenaardd674772022-09-15 22:26:18 +01001801 writefile(lines, 'Xtestscript.vim', 'D')
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001802
1803 for count in range(3)
1804 try
1805 source Xtestscript.vim
1806 catch /E684/
1807 # function name should contain <SNR> every time
Bram Moolenaarec892232022-05-06 17:53:06 +01001808 assert_match('E684: List index out of range', v:exception)
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001809 assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1810 endtry
1811 endfor
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001812enddef
1813
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001814def Test_func_redefine_fails()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001815 var lines =<< trim END
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001816 vim9script
1817 def Func()
1818 echo 'one'
1819 enddef
1820 def Func()
1821 echo 'two'
1822 enddef
1823 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001824 v9.CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001825
1826 lines =<< trim END
1827 vim9script
1828 def Foo(): string
1829 return 'foo'
Bram Moolenaar052ff292021-12-11 13:54:46 +00001830 enddef
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001831 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001832 var Foo = {-> 'lambda'}
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001833 enddef
1834 defcompile
1835 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001836 v9.CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001837enddef
1838
Bram Moolenaar91c7cbf2022-08-18 13:28:31 +01001839def Test_lambda_split()
1840 # this was using freed memory, because of the split expression
1841 var lines =<< trim END
1842 vim9script
1843 try
1844 0
1845 0->(0
1846 ->a.0(
1847 ->u
1848 END
1849 v9.CheckScriptFailure(lines, 'E1050:')
1850enddef
1851
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001852def Test_fixed_size_list()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001853 # will be allocated as one piece of memory, check that changes work
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001854 var l = [1, 2, 3, 4]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001855 l->remove(0)
1856 l->add(5)
1857 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001858 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001859enddef
1860
Bram Moolenaarae616492020-07-28 20:07:27 +02001861def Test_no_insert_xit()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001862 v9.CheckDefExecFailure(['a = 1'], 'E1100:')
1863 v9.CheckDefExecFailure(['c = 1'], 'E1100:')
1864 v9.CheckDefExecFailure(['i = 1'], 'E1100:')
1865 v9.CheckDefExecFailure(['t = 1'], 'E1100:')
1866 v9.CheckDefExecFailure(['x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02001867
Bram Moolenaar62aec932022-01-29 21:45:34 +00001868 v9.CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1869 v9.CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1870 v9.CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1871 v9.CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1872 v9.CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1873 v9.CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1874 v9.CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
1875 v9.CheckScriptFailure(['vim9script', 'o'], 'E1100:')
1876 v9.CheckScriptFailure(['vim9script', 't'], 'E1100:')
1877 v9.CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1878 v9.CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02001879enddef
1880
Bram Moolenaar62aec932022-01-29 21:45:34 +00001881def s:IfElse(what: number): string
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001882 var res = ''
Bram Moolenaar158906c2020-02-06 20:39:45 +01001883 if what == 1
1884 res = "one"
1885 elseif what == 2
1886 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001887 else
Bram Moolenaar158906c2020-02-06 20:39:45 +01001888 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001889 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +01001890 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001891enddef
1892
Bram Moolenaar158906c2020-02-06 20:39:45 +01001893def Test_if_elseif_else()
1894 assert_equal('one', IfElse(1))
1895 assert_equal('two', IfElse(2))
1896 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001897enddef
1898
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001899def Test_if_elseif_else_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001900 v9.CheckDefFailure(['elseif true'], 'E582:')
1901 v9.CheckDefFailure(['else'], 'E581:')
1902 v9.CheckDefFailure(['endif'], 'E580:')
1903 v9.CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
1904 v9.CheckDefFailure(['if true', 'echo 1'], 'E171:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01001905
1906 var lines =<< trim END
1907 var s = ''
1908 if s = ''
1909 endif
1910 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001911 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01001912
1913 lines =<< trim END
1914 var s = ''
1915 if s == ''
1916 elseif s = ''
1917 endif
1918 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001919 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaarfa010cd2022-04-03 16:13:07 +01001920
1921 lines =<< trim END
1922 var cond = true
1923 if cond
1924 echo 'true'
1925 elseif
1926 echo 'false'
1927 endif
1928 END
1929 v9.CheckDefAndScriptFailure(lines, ['E1143:', 'E15:'], 4)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001930enddef
1931
Bram Moolenaar505ed0c2022-05-05 17:02:46 +01001932def Test_if_else_func_using_var()
1933 var lines =<< trim END
1934 vim9script
1935
1936 const debug = true
1937 if debug
1938 var mode_chars = 'something'
1939 def Bits2Ascii()
1940 var x = mode_chars
1941 g:where = 'in true'
1942 enddef
1943 else
1944 def Bits2Ascii()
1945 g:where = 'in false'
1946 enddef
1947 endif
1948
1949 Bits2Ascii()
1950 END
1951 v9.CheckScriptSuccess(lines)
1952 assert_equal('in true', g:where)
1953 unlet g:where
1954
1955 lines =<< trim END
1956 vim9script
1957
1958 const debug = false
1959 if debug
1960 var mode_chars = 'something'
1961 def Bits2Ascii()
1962 g:where = 'in true'
1963 enddef
1964 else
1965 def Bits2Ascii()
1966 var x = mode_chars
1967 g:where = 'in false'
1968 enddef
1969 endif
1970
1971 Bits2Ascii()
1972 END
1973 v9.CheckScriptFailure(lines, 'E1001: Variable not found: mode_chars')
1974enddef
1975
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001976let g:bool_true = v:true
1977let g:bool_false = v:false
1978
1979def Test_if_const_expr()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001980 var res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001981 if true ? true : false
1982 res = true
1983 endif
1984 assert_equal(true, res)
1985
Bram Moolenaar585fea72020-04-02 22:33:21 +02001986 g:glob = 2
1987 if false
Bram Moolenaar67979662020-06-20 22:50:47 +02001988 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001989 endif
1990 assert_equal(2, g:glob)
1991 if true
Bram Moolenaar67979662020-06-20 22:50:47 +02001992 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001993 endif
1994 assert_equal(3, g:glob)
1995
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001996 res = false
1997 if g:bool_true ? true : false
1998 res = true
1999 endif
2000 assert_equal(true, res)
2001
2002 res = false
2003 if true ? g:bool_true : false
2004 res = true
2005 endif
2006 assert_equal(true, res)
2007
2008 res = false
2009 if true ? true : g:bool_false
2010 res = true
2011 endif
2012 assert_equal(true, res)
2013
2014 res = false
2015 if true ? false : true
2016 res = true
2017 endif
2018 assert_equal(false, res)
2019
2020 res = false
2021 if false ? false : true
2022 res = true
2023 endif
2024 assert_equal(true, res)
2025
2026 res = false
2027 if false ? true : false
2028 res = true
2029 endif
2030 assert_equal(false, res)
2031
2032 res = false
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002033 if has('xyz') ? true : false
2034 res = true
2035 endif
2036 assert_equal(false, res)
2037
2038 res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002039 if true && true
2040 res = true
2041 endif
2042 assert_equal(true, res)
2043
2044 res = false
2045 if true && false
2046 res = true
2047 endif
2048 assert_equal(false, res)
2049
2050 res = false
2051 if g:bool_true && false
2052 res = true
2053 endif
2054 assert_equal(false, res)
2055
2056 res = false
2057 if true && g:bool_false
2058 res = true
2059 endif
2060 assert_equal(false, res)
2061
2062 res = false
2063 if false && false
2064 res = true
2065 endif
2066 assert_equal(false, res)
2067
2068 res = false
2069 if true || false
2070 res = true
2071 endif
2072 assert_equal(true, res)
2073
2074 res = false
2075 if g:bool_true || false
2076 res = true
2077 endif
2078 assert_equal(true, res)
2079
2080 res = false
2081 if true || g:bool_false
2082 res = true
2083 endif
2084 assert_equal(true, res)
2085
2086 res = false
2087 if false || false
2088 res = true
2089 endif
2090 assert_equal(false, res)
Bram Moolenaar3988f642020-08-27 22:43:03 +02002091
2092 # with constant "false" expression may be invalid so long as the syntax is OK
Bram Moolenaarc3235272021-07-10 19:42:03 +02002093 if false | eval 1 + 2 | endif
Bram Moolenaar3988f642020-08-27 22:43:03 +02002094 if false | eval burp + 234 | endif
2095 if false | echo burp 234 'asd' | endif
2096 if false
2097 burp
2098 endif
Bram Moolenaare525bdd2021-08-07 18:12:40 +02002099
Bram Moolenaar21ebb082022-02-04 21:58:58 +00002100 if 0
2101 if 1
2102 echo nothing
2103 elseif 1
2104 echo still nothing
2105 endif
2106 endif
2107
Bram Moolenaare525bdd2021-08-07 18:12:40 +02002108 # expression with line breaks skipped
2109 if false
2110 ('aaa'
2111 .. 'bbb'
2112 .. 'ccc'
2113 )->setline(1)
2114 endif
Yegappan Lakshmanane2038412024-12-14 19:59:24 +01002115
2116 if 1
2117 # do nothing
2118 else
2119 var [a] = [10]
2120 endif
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02002121enddef
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002122
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02002123def Test_if_const_expr_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00002124 v9.CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2125 v9.CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2126 v9.CheckDefFailure(["if has('aaa'"], 'E110:')
2127 v9.CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002128enddef
2129
Bram Moolenaar62aec932022-01-29 21:45:34 +00002130def s:RunNested(i: number): number
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002131 var x: number = 0
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002132 if i % 2
2133 if 1
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002134 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002135 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002136 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002137 endif
2138 x += 1
2139 else
2140 x += 1000
2141 endif
2142 return x
2143enddef
2144
2145def Test_nested_if()
2146 assert_equal(1, RunNested(1))
2147 assert_equal(1000, RunNested(2))
2148enddef
2149
Bram Moolenaarad39c092020-02-26 18:23:43 +01002150def Test_execute_cmd()
Bram Moolenaare4984292020-12-13 14:19:25 +01002151 # missing argument is ignored
2152 execute
2153 execute # comment
2154
Bram Moolenaarad39c092020-02-26 18:23:43 +01002155 new
2156 setline(1, 'default')
Bram Moolenaard2c61702020-09-06 15:58:36 +02002157 execute 'setline(1, "execute-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002158 assert_equal('execute-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002159
Bram Moolenaard2c61702020-09-06 15:58:36 +02002160 execute "setline(1, 'execute-string')"
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002161 assert_equal('execute-string', getline(1))
2162
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002163 var cmd1 = 'setline(1,'
2164 var cmd2 = '"execute-var")'
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002165 execute cmd1 cmd2 # comment
Bram Moolenaarad39c092020-02-26 18:23:43 +01002166 assert_equal('execute-var', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002167
Bram Moolenaard2c61702020-09-06 15:58:36 +02002168 execute cmd1 cmd2 '|setline(1, "execute-var-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002169 assert_equal('execute-var-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002170
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002171 var cmd_first = 'call '
2172 var cmd_last = 'setline(1, "execute-var-var")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002173 execute cmd_first .. cmd_last
2174 assert_equal('execute-var-var', getline(1))
2175 bwipe!
Bram Moolenaar585fea72020-04-02 22:33:21 +02002176
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002177 var n = true
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02002178 execute 'echomsg' (n ? '"true"' : '"no"')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002179 assert_match('^true$', g:Screenline(&lines))
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02002180
Bram Moolenaare0de1712020-12-02 17:36:54 +01002181 echomsg [1, 2, 3] {a: 1, b: 2}
Bram Moolenaar62aec932022-01-29 21:45:34 +00002182 assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', g:Screenline(&lines))
Bram Moolenaare5abf7a2020-08-16 18:29:35 +02002183
Bram Moolenaar62aec932022-01-29 21:45:34 +00002184 v9.CheckDefFailure(['execute xxx'], 'E1001:', 1)
2185 v9.CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2186 v9.CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
Bram Moolenaar0c7f2612022-02-17 19:44:07 +00002187 if has('channel')
2188 v9.CheckDefExecFailure(['execute test_null_channel()'], 'E908:', 1)
2189 endif
Bram Moolenaarad39c092020-02-26 18:23:43 +01002190enddef
2191
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002192def Test_execute_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002193 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002194 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002195 vim9script
2196 execute 'g:someVar'
2197 .. ' = ' ..
2198 '28'
2199 assert_equal(28, g:someVar)
2200 unlet g:someVar
2201 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002202 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002203enddef
2204
Bram Moolenaar43216612022-03-25 11:16:28 +00002205def Test_execute_finish()
2206 # the empty lines are relevant here
2207 var lines =<< trim END
2208 vim9script
2209
2210 var vname = "g:hello"
2211
2212 if exists(vname) | finish | endif | execute vname '= "world"'
2213
2214 assert_equal('world', g:hello)
2215
2216 if exists(vname) | finish | endif | execute vname '= "world"'
2217
2218 assert_report('should not be reached')
2219 END
2220 v9.CheckScriptSuccess(lines)
2221enddef
2222
Bram Moolenaarad39c092020-02-26 18:23:43 +01002223def Test_echo_cmd()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002224 echo 'some' # comment
Bram Moolenaar585fea72020-04-02 22:33:21 +02002225 echon 'thing'
Bram Moolenaar62aec932022-01-29 21:45:34 +00002226 assert_match('^something$', g:Screenline(&lines))
Bram Moolenaarad39c092020-02-26 18:23:43 +01002227
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002228 echo "some" # comment
2229 echon "thing"
Bram Moolenaar62aec932022-01-29 21:45:34 +00002230 assert_match('^something$', g:Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002231
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002232 var str1 = 'some'
2233 var str2 = 'more'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002234 echo str1 str2
Bram Moolenaar62aec932022-01-29 21:45:34 +00002235 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002236
Bram Moolenaar397a87a2022-03-20 21:14:15 +00002237 echo "one\ntwo"
2238 assert_match('^one$', g:Screenline(&lines - 1))
2239 assert_match('^two$', g:Screenline(&lines))
2240
Bram Moolenaar62aec932022-01-29 21:45:34 +00002241 v9.CheckDefFailure(['echo "xxx"# comment'], 'E488:')
Yegappan Lakshmanan22029ed2024-05-20 13:57:11 +02002242
2243 # Test for echoing a script local function name
2244 var lines =<< trim END
2245 vim9script
2246 def ScriptLocalEcho()
2247 enddef
2248 echo ScriptLocalEcho
2249 END
2250 new
2251 setline(1, lines)
2252 assert_match('<SNR>\d\+_ScriptLocalEcho', execute('source')->split("\n")[0])
2253 bw!
Bram Moolenaarad39c092020-02-26 18:23:43 +01002254enddef
2255
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002256def Test_echomsg_cmd()
2257 echomsg 'some' 'more' # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00002258 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002259 echo 'clear'
Bram Moolenaardf069ee2020-06-22 23:02:51 +02002260 :1messages
Bram Moolenaar62aec932022-01-29 21:45:34 +00002261 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002262
Bram Moolenaar62aec932022-01-29 21:45:34 +00002263 v9.CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002264enddef
2265
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002266def Test_echomsg_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002267 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002268 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002269 vim9script
2270 echomsg 'here'
2271 .. ' is ' ..
2272 'a message'
Bram Moolenaar62aec932022-01-29 21:45:34 +00002273 assert_match('^here is a message$', g:Screenline(&lines))
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002274 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002275 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002276enddef
2277
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002278def Test_echoerr_cmd()
Bram Moolenaar7de62622021-08-07 15:05:47 +02002279 var local = 'local'
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002280 try
Bram Moolenaar7de62622021-08-07 15:05:47 +02002281 echoerr 'something' local 'wrong' # comment
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002282 catch
Bram Moolenaar7de62622021-08-07 15:05:47 +02002283 assert_match('something local wrong', v:exception)
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002284 endtry
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002285enddef
2286
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002287def Test_echoerr_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002288 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002289 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002290 vim9script
2291 try
2292 echoerr 'this'
2293 .. ' is ' ..
2294 'wrong'
2295 catch
2296 assert_match('this is wrong', v:exception)
2297 endtry
2298 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002299 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002300enddef
2301
Bram Moolenaar7de62622021-08-07 15:05:47 +02002302def Test_echoconsole_cmd()
2303 var local = 'local'
2304 echoconsole 'something' local # comment
2305 # output goes anywhere
2306enddef
2307
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002308def Test_echowindow_cmd()
2309 var local = 'local'
2310 echowindow 'something' local # comment
Bram Moolenaar2435adf2022-10-21 12:05:46 +01002311
2312 # with modifier
2313 unsilent echowin 'loud'
2314
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002315 # output goes in message window
2316 popup_clear()
Yegappan Lakshmanane2038412024-12-14 19:59:24 +01002317
2318 # Invalid range
2319 var lines =<< trim END
2320 def Foo()
2321 :$echowindow "foo"
2322 enddef
2323 defcompile
2324 END
2325 v9.CheckDefAndScriptFailure(lines, 'E16: Invalid range')
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002326enddef
2327
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002328def Test_for_outside_of_function()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002329 var lines =<< trim END
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002330 vim9script
2331 new
2332 for var in range(0, 3)
2333 append(line('$'), var)
2334 endfor
2335 assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
2336 bwipe!
Bram Moolenaar522eefd2021-03-26 18:49:22 +01002337
2338 var result = ''
2339 for i in [1, 2, 3]
2340 var loop = ' loop ' .. i
2341 result ..= loop
2342 endfor
2343 assert_equal(' loop 1 loop 2 loop 3', result)
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002344 END
Bram Moolenaardd674772022-09-15 22:26:18 +01002345 writefile(lines, 'Xvim9for.vim', 'D')
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002346 source Xvim9for.vim
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002347enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002348
rbtnnbebf0692021-08-21 17:26:50 +02002349def Test_for_skipped_block()
2350 # test skipped blocks at outside of function
2351 var lines =<< trim END
2352 var result = []
2353 if true
2354 for n in [1, 2]
2355 result += [n]
2356 endfor
2357 else
2358 for n in [3, 4]
2359 result += [n]
2360 endfor
2361 endif
2362 assert_equal([1, 2], result)
2363
2364 result = []
2365 if false
2366 for n in [1, 2]
2367 result += [n]
2368 endfor
2369 else
2370 for n in [3, 4]
2371 result += [n]
2372 endfor
2373 endif
2374 assert_equal([3, 4], result)
2375 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002376 v9.CheckDefAndScriptSuccess(lines)
rbtnnbebf0692021-08-21 17:26:50 +02002377
2378 # test skipped blocks at inside of function
2379 lines =<< trim END
2380 def DefTrue()
2381 var result = []
2382 if true
2383 for n in [1, 2]
2384 result += [n]
2385 endfor
2386 else
2387 for n in [3, 4]
2388 result += [n]
2389 endfor
2390 endif
2391 assert_equal([1, 2], result)
2392 enddef
2393 DefTrue()
2394
2395 def DefFalse()
2396 var result = []
2397 if false
2398 for n in [1, 2]
2399 result += [n]
2400 endfor
2401 else
2402 for n in [3, 4]
2403 result += [n]
2404 endfor
2405 endif
2406 assert_equal([3, 4], result)
2407 enddef
2408 DefFalse()
Bram Moolenaar97f8c102022-04-02 19:43:57 +01002409
2410 def BuildDiagrams()
2411 var diagrams: list<any>
2412 if false
2413 var max = 0
2414 for v in diagrams
2415 var l = 3
2416 if max < l | max = l | endif
2417 v->add(l)
2418 endfor
2419 endif
2420 enddef
2421 BuildDiagrams()
rbtnnbebf0692021-08-21 17:26:50 +02002422 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002423 v9.CheckDefAndScriptSuccess(lines)
rbtnnbebf0692021-08-21 17:26:50 +02002424enddef
2425
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002426def Test_skipped_redir()
2427 var lines =<< trim END
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002428 def Tredir()
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002429 if 0
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002430 redir => l[0]
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002431 redir END
2432 endif
2433 enddef
2434 defcompile
2435 END
2436 v9.CheckScriptSuccess(lines)
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002437 delfunc g:Tredir
2438
2439 lines =<< trim END
2440 def Tredir()
2441 if 0
2442 redir => l[0]
2443 endif
2444 echo 'executed'
2445 if 0
2446 redir END
2447 endif
2448 enddef
2449 defcompile
2450 END
2451 v9.CheckScriptSuccess(lines)
2452 delfunc g:Tredir
2453
2454 lines =<< trim END
2455 def Tredir()
2456 var l = ['']
2457 if 1
2458 redir => l[0]
2459 endif
2460 echo 'executed'
2461 if 0
2462 redir END
2463 else
2464 redir END
2465 endif
2466 enddef
2467 defcompile
2468 END
2469 v9.CheckScriptSuccess(lines)
2470 delfunc g:Tredir
2471
2472 lines =<< trim END
2473 let doit = 1
2474 def Tredir()
2475 var l = ['']
2476 if g:doit
2477 redir => l[0]
2478 endif
2479 echo 'executed'
2480 if g:doit
2481 redir END
2482 endif
2483 enddef
2484 defcompile
2485 END
2486 v9.CheckScriptSuccess(lines)
2487 delfunc g:Tredir
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002488enddef
2489
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002490def Test_for_loop()
Bram Moolenaarf2253962021-04-13 20:53:13 +02002491 var lines =<< trim END
2492 var result = ''
2493 for cnt in range(7)
2494 if cnt == 4
2495 break
2496 endif
2497 if cnt == 2
2498 continue
2499 endif
2500 result ..= cnt .. '_'
2501 endfor
2502 assert_equal('0_1_3_', result)
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02002503
Bram Moolenaarf2253962021-04-13 20:53:13 +02002504 var concat = ''
2505 for str in eval('["one", "two"]')
2506 concat ..= str
2507 endfor
2508 assert_equal('onetwo', concat)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002509
Bram Moolenaarf2253962021-04-13 20:53:13 +02002510 var total = 0
2511 for nr in
2512 [1, 2, 3]
2513 total += nr
2514 endfor
2515 assert_equal(6, total)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002516
Bram Moolenaarf2253962021-04-13 20:53:13 +02002517 total = 0
2518 for nr
2519 in [1, 2, 3]
2520 total += nr
2521 endfor
2522 assert_equal(6, total)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002523
Bram Moolenaarf2253962021-04-13 20:53:13 +02002524 total = 0
2525 for nr
2526 in
2527 [1, 2, 3]
2528 total += nr
2529 endfor
2530 assert_equal(6, total)
Bram Moolenaar036d0712021-01-17 20:23:38 +01002531
Bram Moolenaara3589a02021-04-14 13:30:46 +02002532 # with type
2533 total = 0
2534 for n: number in [1, 2, 3]
2535 total += n
2536 endfor
2537 assert_equal(6, total)
2538
Bram Moolenaarefd73ae2022-03-20 18:51:00 +00002539 total = 0
2540 for b in 0z010203
2541 total += b
2542 endfor
2543 assert_equal(6, total)
2544
Bram Moolenaarfe090eb2021-04-15 21:48:32 +02002545 var chars = ''
2546 for s: string in 'foobar'
2547 chars ..= s
2548 endfor
2549 assert_equal('foobar', chars)
2550
Bram Moolenaar5ede5b22021-07-07 21:55:25 +02002551 chars = ''
2552 for x: string in {a: 'a', b: 'b'}->values()
2553 chars ..= x
2554 endfor
2555 assert_equal('ab', chars)
2556
Bram Moolenaara3589a02021-04-14 13:30:46 +02002557 # unpack with type
Bram Moolenaarf2253962021-04-13 20:53:13 +02002558 var res = ''
Bram Moolenaara3589a02021-04-14 13:30:46 +02002559 for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2560 res ..= n .. s
2561 endfor
2562 assert_equal('1a2b', res)
2563
Bram Moolenaar444d8782021-06-26 12:40:56 +02002564 # unpack with one var
2565 var reslist = []
2566 for [x] in [['aaa'], ['bbb']]
2567 reslist->add(x)
2568 endfor
2569 assert_equal(['aaa', 'bbb'], reslist)
2570
Bram Moolenaara3589a02021-04-14 13:30:46 +02002571 # loop over string
2572 res = ''
Bram Moolenaarf2253962021-04-13 20:53:13 +02002573 for c in 'aéc̀d'
2574 res ..= c .. '-'
2575 endfor
2576 assert_equal('a-é-c̀-d-', res)
2577
2578 res = ''
2579 for c in ''
2580 res ..= c .. '-'
2581 endfor
2582 assert_equal('', res)
2583
2584 res = ''
2585 for c in test_null_string()
2586 res ..= c .. '-'
2587 endfor
2588 assert_equal('', res)
2589
Bram Moolenaar10611952022-04-03 21:11:34 +01002590 total = 0
2591 for c in null_list
2592 total += 1
2593 endfor
2594 assert_equal(0, total)
2595
2596 for c in null_blob
2597 total += 1
2598 endfor
2599 assert_equal(0, total)
2600
Bram Moolenaarf2253962021-04-13 20:53:13 +02002601 var foo: list<dict<any>> = [
2602 {a: 'Cat'}
2603 ]
2604 for dd in foo
2605 dd.counter = 12
2606 endfor
2607 assert_equal([{a: 'Cat', counter: 12}], foo)
Bram Moolenaarad2d4962021-07-18 17:08:50 +02002608
2609 reslist = []
2610 for _ in range(3)
2611 reslist->add('x')
2612 endfor
2613 assert_equal(['x', 'x', 'x'], reslist)
Yegappan Lakshmanan4776e642024-05-19 09:06:50 +02002614
2615 # Test for trying to use the loop variable "_" inside the loop
2616 for _ in "a"
2617 assert_fails('echo _', 'E1181: Cannot use an underscore here')
2618 endfor
Bram Moolenaarf2253962021-04-13 20:53:13 +02002619 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002620 v9.CheckDefAndScriptSuccess(lines)
Yegappan Lakshmananfe424d12024-05-17 18:20:43 +02002621
2622 lines =<< trim END
2623 for i : number : [1, 2]
2624 echo i
2625 endfor
2626 END
2627 v9.CheckSourceDefAndScriptFailure(lines, 'E1059: No white space allowed before colon: : [1, 2]', 1)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002628enddef
2629
Bram Moolenaar159b2d52022-10-11 21:41:25 +01002630def Test_for_loop_list_of_lists()
2631 # loop variable is final, not const
2632 var lines =<< trim END
2633 # Filter out all odd numbers in each sublist
2634 var list: list<list<number>> = [[1], [1, 2], [1, 2, 3], [1, 2, 3, 4]]
2635 for i in list
2636 filter(i, (_, n: number): bool => n % 2 == 0)
2637 endfor
2638
2639 assert_equal([[], [2], [2], [2, 4]], list)
2640 END
2641 v9.CheckDefAndScriptSuccess(lines)
2642enddef
2643
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002644def Test_for_loop_with_closure()
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002645 # using the loop variable in a closure results in the last used value
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002646 var lines =<< trim END
2647 var flist: list<func>
2648 for i in range(5)
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002649 flist[i] = () => i
2650 endfor
2651 for i in range(5)
2652 assert_equal(4, flist[i]())
2653 endfor
2654 END
2655 v9.CheckDefAndScriptSuccess(lines)
2656
Bram Moolenaardd674772022-09-15 22:26:18 +01002657 # also works when the loop variable is used only once halfway the loops
2658 lines =<< trim END
2659 var Clo: func
2660 for i in range(5)
2661 if i == 3
2662 Clo = () => i
2663 endif
2664 endfor
2665 assert_equal(4, Clo())
2666 END
2667 v9.CheckDefAndScriptSuccess(lines)
2668
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002669 # using a local variable set to the loop variable in a closure results in the
2670 # value at that moment
2671 lines =<< trim END
2672 var flist: list<func>
2673 for i in range(5)
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002674 var inloop = i
2675 flist[i] = () => inloop
2676 endfor
2677 for i in range(5)
Bram Moolenaar353b68a2022-09-13 21:10:45 +01002678 assert_equal(i, flist[i]())
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002679 endfor
2680 END
Bram Moolenaar0cdfb7c2022-09-17 15:44:52 +01002681 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002682
Bram Moolenaara275f2c2022-10-11 20:04:09 +01002683 # also with an extra block level
2684 lines =<< trim END
2685 var flist: list<func>
2686 for i in range(5)
2687 {
2688 var inloop = i
2689 flist[i] = () => inloop
2690 }
2691 endfor
2692 for i in range(5)
2693 assert_equal(i, flist[i]())
2694 endfor
2695 END
2696 v9.CheckDefAndScriptSuccess(lines)
2697
2698 # and declaration in higher block
2699 lines =<< trim END
2700 var flist: list<func>
2701 for i in range(5)
2702 var inloop = i
2703 {
2704 flist[i] = () => inloop
2705 }
2706 endfor
2707 for i in range(5)
2708 assert_equal(i, flist[i]())
2709 endfor
2710 END
2711 v9.CheckDefAndScriptSuccess(lines)
2712
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002713 lines =<< trim END
2714 var flist: list<func>
2715 for i in range(5)
2716 var inloop = i
2717 flist[i] = () => {
2718 return inloop
2719 }
2720 endfor
2721 for i in range(5)
Bram Moolenaar353b68a2022-09-13 21:10:45 +01002722 assert_equal(i, flist[i]())
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002723 endfor
2724 END
Bram Moolenaar0cdfb7c2022-09-17 15:44:52 +01002725 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaardbbb02b2022-09-18 12:00:21 +01002726
2727 # Also works for a nested loop
2728 lines =<< trim END
2729 var flist: list<func>
2730 var n = 0
2731 for i in range(3)
2732 var ii = i
2733 for a in ['a', 'b', 'c']
2734 var aa = a
2735 flist[n] = () => ii .. aa
2736 ++n
2737 endfor
2738 endfor
2739
2740 n = 0
2741 for i in range(3)
2742 for a in ['a', 'b', 'c']
2743 assert_equal(i .. a, flist[n]())
2744 ++n
2745 endfor
2746 endfor
2747 END
Bram Moolenaarcc341812022-09-19 15:54:34 +01002748 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaare8e369a2022-09-21 18:59:14 +01002749
2750 # using two loop variables
2751 lines =<< trim END
2752 var lv_list: list<func>
2753 var copy_list: list<func>
2754 for [idx, c] in items('word')
2755 var lidx = idx
2756 var lc = c
2757 lv_list[idx] = () => {
2758 return idx .. c
2759 }
2760 copy_list[idx] = () => {
2761 return lidx .. lc
2762 }
2763 endfor
2764 for [i, c] in items('word')
2765 assert_equal(3 .. 'd', lv_list[i]())
2766 assert_equal(i .. c, copy_list[i]())
2767 endfor
2768 END
2769 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarcc341812022-09-19 15:54:34 +01002770enddef
2771
2772def Test_define_global_closure_in_loops()
2773 var lines =<< trim END
2774 vim9script
2775
2776 def Func()
2777 for i in range(3)
2778 var ii = i
2779 for a in ['a', 'b', 'c']
2780 var aa = a
2781 if ii == 0 && aa == 'a'
2782 def g:Global_0a(): string
2783 return ii .. aa
2784 enddef
2785 endif
2786 if ii == 1 && aa == 'b'
2787 def g:Global_1b(): string
2788 return ii .. aa
2789 enddef
2790 endif
2791 if ii == 2 && aa == 'c'
2792 def g:Global_2c(): string
2793 return ii .. aa
2794 enddef
2795 endif
2796 endfor
2797 endfor
2798 enddef
2799 Func()
2800 END
2801 v9.CheckScriptSuccess(lines)
2802 assert_equal("0a", g:Global_0a())
2803 assert_equal("1b", g:Global_1b())
2804 assert_equal("2c", g:Global_2c())
2805
2806 delfunc g:Global_0a
2807 delfunc g:Global_1b
2808 delfunc g:Global_2c
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002809enddef
2810
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002811def Test_for_loop_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00002812 v9.CheckDefAndScriptFailure(['for '], ['E1097:', 'E690:'])
2813 v9.CheckDefAndScriptFailure(['for x'], ['E1097:', 'E690:'])
2814 v9.CheckDefAndScriptFailure(['for x in'], ['E1097:', 'E15:'])
2815 v9.CheckDefAndScriptFailure(['for # in range(5)'], 'E690:')
2816 v9.CheckDefAndScriptFailure(['for i In range(5)'], 'E690:')
2817 v9.CheckDefAndScriptFailure(['var x = 5', 'for x in range(5)', 'endfor'], ['E1017:', 'E1041:'])
2818 v9.CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3)
2819 v9.CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01002820 delfunc! g:Func
Bram Moolenaar62aec932022-01-29 21:45:34 +00002821 v9.CheckDefFailure(['for i in xxx'], 'E1001:')
2822 v9.CheckDefFailure(['endfor'], 'E588:')
2823 v9.CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002824
2825 # wrong type detected at compile time
Bram Moolenaar62aec932022-01-29 21:45:34 +00002826 v9.CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002827
2828 # wrong type detected at runtime
2829 g:adict = {a: 1}
Bram Moolenaar62aec932022-01-29 21:45:34 +00002830 v9.CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002831 unlet g:adict
Bram Moolenaarf6a8d422021-04-13 21:48:03 +02002832
2833 var lines =<< trim END
2834 var d: list<dict<any>> = [{a: 0}]
2835 for e in d
2836 e = {a: 0, b: ''}
2837 endfor
2838 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002839 v9.CheckDefAndScriptFailure(lines, ['E1018:', 'E46:'], 3)
Bram Moolenaarfe090eb2021-04-15 21:48:32 +02002840
2841 lines =<< trim END
2842 for nr: number in ['foo']
2843 endfor
2844 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002845 v9.CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
Bram Moolenaar404557e2021-07-05 21:41:48 +02002846
2847 lines =<< trim END
2848 for n : number in [1, 2]
2849 echo n
2850 endfor
2851 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002852 v9.CheckDefAndScriptFailure(lines, 'E1059:', 1)
Bram Moolenaarefc5db52021-07-07 21:21:30 +02002853
2854 lines =<< trim END
2855 var d: dict<number> = {a: 1, b: 2}
2856 for [k: job, v: job] in d->items()
2857 echo k v
2858 endfor
2859 END
Bram Moolenaarbd3a9d22022-05-17 16:12:39 +01002860 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 +00002861
2862 lines =<< trim END
2863 var i = 0
2864 for i in [1, 2, 3]
2865 echo i
2866 endfor
2867 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002868 v9.CheckDefExecAndScriptFailure(lines, ['E1017:', 'E1041:'])
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002869
2870 lines =<< trim END
2871 var l = [0]
2872 for l[0] in [1, 2, 3]
2873 echo l[0]
2874 endfor
2875 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002876 v9.CheckDefExecAndScriptFailure(lines, ['E461:', 'E1017:'])
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002877
2878 lines =<< trim END
2879 var d = {x: 0}
2880 for d.x in [1, 2, 3]
2881 echo d.x
2882 endfor
2883 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002884 v9.CheckDefExecAndScriptFailure(lines, ['E461:', 'E1017:'])
Bram Moolenaara1c51952022-02-02 16:20:26 +00002885
2886 lines =<< trim END
2887 var l: list<dict<any>> = [{a: 1, b: 'x'}]
2888 for item: dict<number> in l
2889 echo item
2890 endfor
2891 END
2892 v9.CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected dict<number> but got dict<any>')
2893
2894 lines =<< trim END
2895 var l: list<dict<any>> = [{n: 1}]
2896 for item: dict<number> in l
Bram Moolenaarfa103972022-09-29 19:14:42 +01002897 var d = {s: ''}
2898 d->extend(item)
Bram Moolenaara1c51952022-02-02 16:20:26 +00002899 endfor
2900 END
Bram Moolenaarfa103972022-09-29 19:14:42 +01002901 v9.CheckDefExecAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected dict<string> but got dict<number>')
Bram Moolenaarcc341812022-09-19 15:54:34 +01002902
2903 lines =<< trim END
2904 for a in range(3)
2905 while a > 3
2906 for b in range(2)
2907 while b < 0
2908 for c in range(5)
2909 while c > 6
2910 while c < 0
2911 for d in range(1)
2912 for e in range(3)
2913 while e > 3
2914 endwhile
2915 endfor
2916 endfor
2917 endwhile
2918 endwhile
2919 endfor
2920 endwhile
2921 endfor
2922 endwhile
2923 endfor
2924 END
2925 v9.CheckDefSuccess(lines)
2926
2927 v9.CheckDefFailure(['for x in range(3)'] + lines + ['endfor'], 'E1306:')
Yegappan Lakshmanan062bb6b2023-12-16 14:46:40 +01002928
2929 # Test for too many for loops
2930 lines =<< trim END
2931 vim9script
2932 def Foo()
2933 for a in range(1)
2934 for b in range(1)
2935 for c in range(1)
2936 for d in range(1)
2937 for e in range(1)
2938 for f in range(1)
2939 for g in range(1)
2940 for h in range(1)
2941 for i in range(1)
2942 for j in range(1)
2943 for k in range(1)
2944 endfor
2945 endfor
2946 endfor
2947 endfor
2948 endfor
2949 endfor
2950 endfor
2951 endfor
2952 endfor
2953 endfor
2954 endfor
2955 enddef
2956 defcompile
2957 END
2958 v9.CheckSourceFailure(lines, 'E1306: Loop nesting too deep', 11)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002959enddef
2960
Bram Moolenaarea870692020-12-02 14:24:30 +01002961def Test_for_loop_script_var()
2962 # cannot use s:var in a :def function
Bram Moolenaar62aec932022-01-29 21:45:34 +00002963 v9.CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1254:')
Bram Moolenaarea870692020-12-02 14:24:30 +01002964
2965 # can use s:var in Vim9 script, with or without s:
2966 var lines =<< trim END
2967 vim9script
2968 var total = 0
2969 for s:var in [1, 2, 3]
2970 total += s:var
2971 endfor
2972 assert_equal(6, total)
2973
2974 total = 0
2975 for var in [1, 2, 3]
2976 total += var
2977 endfor
2978 assert_equal(6, total)
2979 END
2980enddef
2981
Bram Moolenaar792f7862020-11-23 08:31:18 +01002982def Test_for_loop_unpack()
Bram Moolenaar792f7862020-11-23 08:31:18 +01002983 var lines =<< trim END
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002984 var result = []
2985 for [v1, v2] in [[1, 2], [3, 4]]
2986 result->add(v1)
2987 result->add(v2)
2988 endfor
2989 assert_equal([1, 2, 3, 4], result)
2990
2991 result = []
2992 for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2993 result->add(v1)
2994 result->add(v2)
2995 result->add(v3)
2996 endfor
2997 assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2998
2999 result = []
3000 for [&ts, &sw] in [[1, 2], [3, 4]]
3001 result->add(&ts)
3002 result->add(&sw)
3003 endfor
3004 assert_equal([1, 2, 3, 4], result)
3005
3006 var slist: list<string>
3007 for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
3008 slist->add($LOOPVAR)
3009 slist->add(@r)
3010 slist->add(v:errmsg)
3011 endfor
3012 assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
3013
3014 slist = []
3015 for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
3016 slist->add(g:globalvar)
3017 slist->add(b:bufvar)
3018 slist->add(w:winvar)
3019 slist->add(t:tabvar)
3020 endfor
3021 assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
Bram Moolenaarf6c177a2020-12-04 17:38:00 +01003022 unlet! g:globalvar b:bufvar w:winvar t:tabvar
Bram Moolenaarb777da92021-05-22 21:40:39 +02003023
3024 var res = []
3025 for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
3026 res->add(n)
3027 endfor
3028 assert_equal([2, 5], res)
Bram Moolenaar61efa162022-03-18 13:10:48 +00003029
3030 var text: list<string> = ["hello there", "goodbye now"]
3031 var splitted = ''
3032 for [first; next] in mapnew(text, (i, v) => split(v))
3033 splitted ..= string(first) .. string(next) .. '/'
3034 endfor
3035 assert_equal("'hello'['there']/'goodbye'['now']/", splitted)
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01003036 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003037 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01003038
3039 lines =<< trim END
Bram Moolenaar792f7862020-11-23 08:31:18 +01003040 for [v1, v2] in [[1, 2, 3], [3, 4]]
3041 echo v1 v2
3042 endfor
3043 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003044 v9.CheckDefExecFailure(lines, 'E710:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01003045
3046 lines =<< trim END
3047 for [v1, v2] in [[1], [3, 4]]
3048 echo v1 v2
3049 endfor
3050 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003051 v9.CheckDefExecFailure(lines, 'E711:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01003052
3053 lines =<< trim END
3054 for [v1, v1] in [[1, 2], [3, 4]]
3055 echo v1
3056 endfor
3057 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003058 v9.CheckDefExecFailure(lines, 'E1017:', 1)
Bram Moolenaar95e4dd82022-04-27 22:15:40 +01003059
3060 lines =<< trim END
3061 for [a, b] in g:listlist
3062 echo a
3063 endfor
3064 END
3065 g:listlist = [1, 2, 3]
3066 v9.CheckDefExecFailure(lines, 'E1140:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01003067enddef
3068
Bram Moolenaarc150c092021-02-13 15:02:46 +01003069def Test_for_loop_with_try_continue()
Bram Moolenaarf2253962021-04-13 20:53:13 +02003070 var lines =<< trim END
3071 var looped = 0
3072 var cleanup = 0
3073 for i in range(3)
3074 looped += 1
3075 try
3076 eval [][0]
3077 catch
3078 continue
3079 finally
3080 cleanup += 1
3081 endtry
3082 endfor
3083 assert_equal(3, looped)
3084 assert_equal(3, cleanup)
3085 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003086 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc150c092021-02-13 15:02:46 +01003087enddef
3088
rbtnnd895b1d2021-08-20 20:54:25 +02003089def Test_while_skipped_block()
3090 # test skipped blocks at outside of function
3091 var lines =<< trim END
3092 var result = []
3093 var n = 0
3094 if true
3095 n = 1
3096 while n < 3
3097 result += [n]
3098 n += 1
3099 endwhile
3100 else
3101 n = 3
3102 while n < 5
3103 result += [n]
3104 n += 1
3105 endwhile
3106 endif
3107 assert_equal([1, 2], result)
3108
3109 result = []
3110 if false
3111 n = 1
3112 while n < 3
3113 result += [n]
3114 n += 1
3115 endwhile
3116 else
3117 n = 3
3118 while n < 5
3119 result += [n]
3120 n += 1
3121 endwhile
3122 endif
3123 assert_equal([3, 4], result)
3124 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003125 v9.CheckDefAndScriptSuccess(lines)
rbtnnd895b1d2021-08-20 20:54:25 +02003126
3127 # test skipped blocks at inside of function
3128 lines =<< trim END
3129 def DefTrue()
3130 var result = []
3131 var n = 0
3132 if true
3133 n = 1
3134 while n < 3
3135 result += [n]
3136 n += 1
3137 endwhile
3138 else
3139 n = 3
3140 while n < 5
3141 result += [n]
3142 n += 1
3143 endwhile
3144 endif
3145 assert_equal([1, 2], result)
3146 enddef
3147 DefTrue()
3148
3149 def DefFalse()
3150 var result = []
3151 var n = 0
3152 if false
3153 n = 1
3154 while n < 3
3155 result += [n]
3156 n += 1
3157 endwhile
3158 else
3159 n = 3
3160 while n < 5
3161 result += [n]
3162 n += 1
3163 endwhile
3164 endif
3165 assert_equal([3, 4], result)
3166 enddef
3167 DefFalse()
3168 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003169 v9.CheckDefAndScriptSuccess(lines)
rbtnnd895b1d2021-08-20 20:54:25 +02003170enddef
3171
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003172def Test_while_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003173 var result = ''
3174 var cnt = 0
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003175 while cnt < 555
3176 if cnt == 3
3177 break
3178 endif
3179 cnt += 1
3180 if cnt == 2
3181 continue
3182 endif
3183 result ..= cnt .. '_'
3184 endwhile
3185 assert_equal('1_3_', result)
Bram Moolenaardee37dc2021-02-07 16:40:05 +01003186
3187 var s = ''
Bram Moolenaar4b3e1962021-03-18 21:37:55 +01003188 while s == 'x' # {comment}
Bram Moolenaardee37dc2021-02-07 16:40:05 +01003189 endwhile
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003190enddef
3191
Bram Moolenaar7a53f292021-11-22 18:31:02 +00003192def Test_while_loop_in_script()
3193 var lines =<< trim END
3194 vim9script
3195 var result = ''
3196 var cnt = 0
3197 while cnt < 3
3198 var s = 'v' .. cnt
3199 result ..= s
3200 cnt += 1
3201 endwhile
3202 assert_equal('v0v1v2', result)
3203 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003204 v9.CheckScriptSuccess(lines)
Bram Moolenaar7a53f292021-11-22 18:31:02 +00003205enddef
3206
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02003207def Test_while_loop_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00003208 v9.CheckDefFailure(['while xxx'], 'E1001:')
3209 v9.CheckDefFailure(['endwhile'], 'E588:')
3210 v9.CheckDefFailure(['continue'], 'E586:')
3211 v9.CheckDefFailure(['if true', 'continue'], 'E586:')
3212 v9.CheckDefFailure(['break'], 'E587:')
3213 v9.CheckDefFailure(['if true', 'break'], 'E587:')
3214 v9.CheckDefFailure(['while 1', 'echo 3'], 'E170:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01003215
3216 var lines =<< trim END
3217 var s = ''
3218 while s = ''
3219 endwhile
3220 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003221 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaarbd5da372020-03-31 23:13:10 +02003222enddef
3223
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01003224def Test_interrupt_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003225 var caught = false
3226 var x = 0
Bram Moolenaar97acfc72020-03-22 13:44:28 +01003227 try
3228 while 1
3229 x += 1
3230 if x == 100
3231 feedkeys("\<C-C>", 'Lt')
3232 endif
3233 endwhile
3234 catch
3235 caught = true
3236 assert_equal(100, x)
3237 endtry
3238 assert_true(caught, 'should have caught an exception')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02003239 # consume the CTRL-C
3240 getchar(0)
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01003241enddef
Bram Moolenaar20431c92020-03-20 18:39:46 +01003242
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003243def Test_automatic_line_continuation()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003244 var mylist = [
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003245 'one',
3246 'two',
3247 'three',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003248 ] # comment
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003249 assert_equal(['one', 'two', 'three'], mylist)
3250
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003251 var mydict = {
Bram Moolenaare0de1712020-12-02 17:36:54 +01003252 ['one']: 1,
3253 ['two']: 2,
3254 ['three']:
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003255 3,
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003256 } # comment
Bram Moolenaare0de1712020-12-02 17:36:54 +01003257 assert_equal({one: 1, two: 2, three: 3}, mydict)
3258 mydict = {
Bram Moolenaar2c330432020-04-13 14:41:35 +02003259 one: 1, # comment
3260 two: # comment
3261 2, # comment
3262 three: 3 # comment
3263 }
Bram Moolenaare0de1712020-12-02 17:36:54 +01003264 assert_equal({one: 1, two: 2, three: 3}, mydict)
3265 mydict = {
Bram Moolenaar2c330432020-04-13 14:41:35 +02003266 one: 1,
3267 two:
3268 2,
3269 three: 3
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003270 }
Bram Moolenaare0de1712020-12-02 17:36:54 +01003271 assert_equal({one: 1, two: 2, three: 3}, mydict)
Bram Moolenaare6085c52020-04-12 20:19:16 +02003272
3273 assert_equal(
3274 ['one', 'two', 'three'],
3275 split('one two three')
3276 )
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003277enddef
3278
Bram Moolenaar7a092242020-04-16 22:10:49 +02003279def Test_vim9_comment()
Bram Moolenaar62aec932022-01-29 21:45:34 +00003280 v9.CheckScriptSuccess([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003281 'vim9script',
3282 '# something',
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003283 '#something',
Bram Moolenaar3f74c0a2022-08-06 18:12:06 +01003284 '#{{something',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003285 ])
Bram Moolenaar3f74c0a2022-08-06 18:12:06 +01003286 v9.CheckScriptFailure([
3287 'vim9script',
3288 '#{something',
3289 ], 'E1170:')
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003290
Bram Moolenaarb18b4962022-09-02 21:55:50 +01003291 split Xv9cfile
Bram Moolenaar62aec932022-01-29 21:45:34 +00003292 v9.CheckScriptSuccess([
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003293 'vim9script',
3294 'edit #something',
3295 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003296 v9.CheckScriptSuccess([
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003297 'vim9script',
3298 'edit #{something',
3299 ])
3300 close
3301
Bram Moolenaar62aec932022-01-29 21:45:34 +00003302 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003303 'vim9script',
3304 ':# something',
3305 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003306 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003307 '# something',
3308 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003309 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003310 ':# something',
3311 ], 'E488:')
3312
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003313 { # block start
3314 } # block end
Bram Moolenaar62aec932022-01-29 21:45:34 +00003315 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003316 '{# comment',
3317 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003318 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003319 '{',
3320 '}# comment',
3321 ], 'E488:')
3322
3323 echo "yes" # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00003324 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003325 'echo "yes"# comment',
3326 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003327 v9.CheckScriptSuccess([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003328 'vim9script',
3329 'echo "yes" # something',
3330 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003331 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003332 'vim9script',
3333 'echo "yes"# something',
3334 ], 'E121:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003335 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003336 'vim9script',
3337 'echo# something',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003338 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003339 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003340 'echo "yes" # something',
3341 ], 'E121:')
3342
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003343 exe "echo" # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00003344 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003345 'exe "echo"# comment',
3346 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003347 v9.CheckScriptSuccess([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003348 'vim9script',
3349 'exe "echo" # something',
3350 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003351 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003352 'vim9script',
3353 'exe "echo"# something',
3354 ], 'E121:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003355 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003356 'vim9script',
3357 'exe# something',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003358 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003359 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003360 'exe "echo" # something',
3361 ], 'E121:')
3362
Bram Moolenaar62aec932022-01-29 21:45:34 +00003363 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003364 'try# comment',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003365 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003366 'catch',
3367 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003368 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003369 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003370 'vim9script',
3371 'try# comment',
3372 'echo "yes"',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003373 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003374 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003375 'try',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003376 ' throw#comment',
3377 'catch',
3378 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003379 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003380 v9.CheckDefFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003381 'try',
3382 ' throw "yes"#comment',
3383 'catch',
3384 'endtry',
3385 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003386 v9.CheckDefFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003387 'try',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003388 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003389 'catch# comment',
3390 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003391 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003392 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003393 'vim9script',
3394 'try',
3395 ' echo "yes"',
3396 'catch# comment',
3397 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003398 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003399 v9.CheckDefFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003400 'try',
3401 ' echo "yes"',
3402 'catch /pat/# comment',
3403 'endtry',
3404 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003405 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003406 'try',
3407 'echo "yes"',
3408 'catch',
3409 'endtry# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003410 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003411 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003412 'vim9script',
3413 'try',
3414 ' echo "yes"',
3415 'catch',
3416 'endtry# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003417 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003418
Bram Moolenaar62aec932022-01-29 21:45:34 +00003419 v9.CheckScriptSuccess([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003420 'vim9script',
3421 'hi # comment',
3422 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003423 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003424 'vim9script',
3425 'hi# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003426 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003427 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003428 'vim9script',
3429 'hi Search # comment',
3430 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003431 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003432 'vim9script',
3433 'hi Search# comment',
3434 ], 'E416:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003435 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003436 'vim9script',
3437 'hi link This Search # comment',
3438 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003439 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003440 'vim9script',
3441 'hi link This That# comment',
3442 ], 'E413:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003443 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003444 'vim9script',
3445 'hi clear This # comment',
3446 'hi clear # comment',
3447 ])
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003448 # not tested, because it doesn't give an error but a warning:
3449 # hi clear This# comment',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003450 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003451 'vim9script',
3452 'hi clear# comment',
3453 ], 'E416:')
3454
Bram Moolenaar62aec932022-01-29 21:45:34 +00003455 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003456 'vim9script',
3457 'hi Group term=bold',
3458 'match Group /todo/ # comment',
3459 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003460 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003461 'vim9script',
3462 'hi Group term=bold',
3463 'match Group /todo/# comment',
3464 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003465 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003466 'vim9script',
3467 'match # comment',
3468 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003469 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003470 'vim9script',
3471 'match# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003472 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003473 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003474 'vim9script',
3475 'match none # comment',
3476 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003477 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003478 'vim9script',
3479 'match none# comment',
3480 ], 'E475:')
3481
Bram Moolenaar62aec932022-01-29 21:45:34 +00003482 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003483 'vim9script',
3484 'menutrans clear # comment',
3485 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003486 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003487 'vim9script',
3488 'menutrans clear# comment text',
3489 ], 'E474:')
3490
Bram Moolenaar62aec932022-01-29 21:45:34 +00003491 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003492 'vim9script',
3493 'syntax clear # comment',
3494 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003495 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003496 'vim9script',
3497 'syntax clear# comment text',
3498 ], 'E28:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003499 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003500 'vim9script',
3501 'syntax keyword Word some',
3502 'syntax clear Word # comment',
3503 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003504 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003505 'vim9script',
3506 'syntax keyword Word some',
3507 'syntax clear Word# comment text',
3508 ], 'E28:')
3509
Bram Moolenaar62aec932022-01-29 21:45:34 +00003510 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003511 'vim9script',
3512 'syntax list # comment',
3513 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003514 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003515 'vim9script',
3516 'syntax list# comment text',
3517 ], 'E28:')
3518
Bram Moolenaar62aec932022-01-29 21:45:34 +00003519 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003520 'vim9script',
3521 'syntax match Word /pat/ oneline # comment',
3522 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003523 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003524 'vim9script',
3525 'syntax match Word /pat/ oneline# comment',
3526 ], 'E475:')
3527
Bram Moolenaar62aec932022-01-29 21:45:34 +00003528 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003529 'vim9script',
3530 'syntax keyword Word word # comm[ent',
3531 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003532 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003533 'vim9script',
3534 'syntax keyword Word word# comm[ent',
3535 ], 'E789:')
3536
Bram Moolenaar62aec932022-01-29 21:45:34 +00003537 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003538 'vim9script',
3539 'syntax match Word /pat/ # comment',
3540 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003541 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003542 'vim9script',
3543 'syntax match Word /pat/# comment',
3544 ], 'E402:')
3545
Bram Moolenaar62aec932022-01-29 21:45:34 +00003546 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003547 'vim9script',
3548 'syntax match Word /pat/ contains=Something # comment',
3549 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003550 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003551 'vim9script',
3552 'syntax match Word /pat/ contains=Something# comment',
3553 ], 'E475:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003554 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003555 'vim9script',
3556 'syntax match Word /pat/ contains= # comment',
3557 ], 'E406:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003558 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003559 'vim9script',
3560 'syntax match Word /pat/ contains=# comment',
3561 ], 'E475:')
3562
Bram Moolenaar62aec932022-01-29 21:45:34 +00003563 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003564 'vim9script',
3565 'syntax region Word start=/pat/ end=/pat/ # comment',
3566 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003567 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003568 'vim9script',
3569 'syntax region Word start=/pat/ end=/pat/# comment',
Bram Moolenaard032f342020-07-18 18:13:02 +02003570 ], 'E402:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02003571
Bram Moolenaar62aec932022-01-29 21:45:34 +00003572 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003573 'vim9script',
3574 'syntax sync # comment',
3575 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003576 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003577 'vim9script',
3578 'syntax sync# comment',
3579 ], 'E404:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003580 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003581 'vim9script',
3582 'syntax sync ccomment # comment',
3583 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003584 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003585 'vim9script',
3586 'syntax sync ccomment# comment',
3587 ], 'E404:')
3588
Bram Moolenaar62aec932022-01-29 21:45:34 +00003589 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003590 'vim9script',
3591 'syntax cluster Some contains=Word # comment',
3592 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003593 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003594 'vim9script',
3595 'syntax cluster Some contains=Word# comment',
3596 ], 'E475:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003597
Bram Moolenaar62aec932022-01-29 21:45:34 +00003598 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003599 'vim9script',
3600 'command Echo echo # comment',
3601 'command Echo # comment',
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003602 'delcommand Echo',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003603 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003604 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003605 'vim9script',
3606 'command Echo echo# comment',
3607 'Echo',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003608 ], 'E1144:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003609 delcommand Echo
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003610
3611 var curdir = getcwd()
Bram Moolenaar62aec932022-01-29 21:45:34 +00003612 v9.CheckScriptSuccess([
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003613 'command Echo cd " comment',
3614 'Echo',
3615 'delcommand Echo',
3616 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003617 v9.CheckScriptSuccess([
Bram Moolenaar090728a2020-12-20 15:43:31 +01003618 'vim9script',
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003619 'command Echo cd # comment',
3620 'Echo',
3621 'delcommand Echo',
3622 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003623 v9.CheckScriptFailure([
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003624 'vim9script',
3625 'command Echo cd " comment',
3626 'Echo',
3627 ], 'E344:')
3628 delcommand Echo
3629 chdir(curdir)
3630
Bram Moolenaar62aec932022-01-29 21:45:34 +00003631 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003632 'vim9script',
3633 'command Echo# comment',
3634 ], 'E182:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003635 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003636 'vim9script',
3637 'command Echo echo',
3638 'command Echo# comment',
3639 ], 'E182:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003640 delcommand Echo
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003641
Bram Moolenaar62aec932022-01-29 21:45:34 +00003642 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003643 'vim9script',
3644 'function # comment',
3645 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003646 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003647 'vim9script',
Bram Moolenaar98981072020-07-29 14:40:25 +02003648 'function " comment',
3649 ], 'E129:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003650 v9.CheckScriptFailure([
Bram Moolenaar98981072020-07-29 14:40:25 +02003651 'vim9script',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003652 'function# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003653 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003654 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003655 'vim9script',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003656 'import "./vim9.vim" as v9',
3657 'function v9.CheckScriptSuccess # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003658 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003659 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003660 'vim9script',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003661 'import "./vim9.vim" as v9',
3662 'function v9.CheckScriptSuccess# comment',
3663 ], 'E1048: Item not found in script: CheckScriptSuccess#')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003664
Bram Moolenaar62aec932022-01-29 21:45:34 +00003665 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003666 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003667 'func g:DeleteMeA()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003668 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003669 'delfunction g:DeleteMeA # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003670 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003671 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003672 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003673 'func g:DeleteMeB()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003674 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003675 'delfunction g:DeleteMeB# comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003676 ], 'E488:')
3677
Bram Moolenaar62aec932022-01-29 21:45:34 +00003678 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003679 'vim9script',
3680 'call execute("ls") # comment',
3681 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003682 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003683 'vim9script',
3684 'call execute("ls")# comment',
3685 ], 'E488:')
Bram Moolenaare7e48382020-07-22 18:17:08 +02003686
Bram Moolenaar62aec932022-01-29 21:45:34 +00003687 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003688 'def Test() " comment',
3689 'enddef',
3690 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003691 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003692 'vim9script',
3693 'def Test() " comment',
3694 'enddef',
3695 ], 'E488:')
3696
Bram Moolenaar62aec932022-01-29 21:45:34 +00003697 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003698 'func Test() " comment',
3699 'endfunc',
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003700 'delfunc Test',
Bram Moolenaare7e48382020-07-22 18:17:08 +02003701 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003702 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003703 'vim9script',
3704 'func Test() " comment',
3705 'endfunc',
Bram Moolenaar98981072020-07-29 14:40:25 +02003706 ])
Bram Moolenaare7e48382020-07-22 18:17:08 +02003707
Bram Moolenaar62aec932022-01-29 21:45:34 +00003708 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003709 'def Test() # comment',
3710 'enddef',
3711 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003712 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003713 'func Test() # comment',
3714 'endfunc',
3715 ], 'E488:')
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003716
3717 var lines =<< trim END
3718 vim9script
3719 syn region Text
3720 \ start='foo'
3721 #\ comment
3722 \ end='bar'
Bram Moolenaar5072b472021-06-03 21:56:10 +02003723 syn region Text start='foo'
3724 #\ comment
3725 \ end='bar'
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003726 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003727 v9.CheckScriptSuccess(lines)
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003728
3729 lines =<< trim END
3730 vim9script
3731 syn region Text
3732 \ start='foo'
3733 "\ comment
3734 \ end='bar'
3735 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003736 v9.CheckScriptFailure(lines, 'E399:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003737enddef
3738
3739def Test_vim9_comment_gui()
3740 CheckCanRunGui
3741
Bram Moolenaar62aec932022-01-29 21:45:34 +00003742 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003743 'vim9script',
3744 'gui#comment'
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003745 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003746 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003747 'vim9script',
3748 'gui -f#comment'
Bram Moolenaarb8bd2e62021-08-21 17:13:14 +02003749 ], 'E194:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02003750enddef
3751
Bram Moolenaara26b9702020-04-18 19:53:28 +02003752def Test_vim9_comment_not_compiled()
Bram Moolenaar67979662020-06-20 22:50:47 +02003753 au TabEnter *.vim g:entered = 1
3754 au TabEnter *.x g:entered = 2
Bram Moolenaara26b9702020-04-18 19:53:28 +02003755
3756 edit test.vim
3757 doautocmd TabEnter #comment
3758 assert_equal(1, g:entered)
3759
3760 doautocmd TabEnter f.x
3761 assert_equal(2, g:entered)
3762
3763 g:entered = 0
3764 doautocmd TabEnter f.x #comment
3765 assert_equal(2, g:entered)
3766
3767 assert_fails('doautocmd Syntax#comment', 'E216:')
3768
3769 au! TabEnter
3770 unlet g:entered
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003771
Bram Moolenaar62aec932022-01-29 21:45:34 +00003772 v9.CheckScriptSuccess([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003773 'vim9script',
Bram Moolenaar67979662020-06-20 22:50:47 +02003774 'g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003775 'b:var = 456',
3776 'w:var = 777',
3777 't:var = 888',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003778 'unlet g:var w:var # something',
3779 ])
3780
Bram Moolenaar62aec932022-01-29 21:45:34 +00003781 v9.CheckScriptFailure([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003782 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003783 'let var = 123',
3784 ], 'E1126: Cannot use :let in Vim9 script')
3785
Bram Moolenaar62aec932022-01-29 21:45:34 +00003786 v9.CheckScriptFailure([
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003787 'vim9script',
3788 'var g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003789 ], 'E1016: Cannot declare a global variable:')
3790
Bram Moolenaar62aec932022-01-29 21:45:34 +00003791 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003792 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003793 'var b:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003794 ], 'E1016: Cannot declare a buffer variable:')
3795
Bram Moolenaar62aec932022-01-29 21:45:34 +00003796 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003797 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003798 'var w:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003799 ], 'E1016: Cannot declare a window variable:')
3800
Bram Moolenaar62aec932022-01-29 21:45:34 +00003801 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003802 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003803 'var t:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003804 ], 'E1016: Cannot declare a tab variable:')
3805
Bram Moolenaar62aec932022-01-29 21:45:34 +00003806 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003807 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003808 'var v:version = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003809 ], 'E1016: Cannot declare a v: variable:')
3810
Bram Moolenaar62aec932022-01-29 21:45:34 +00003811 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003812 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003813 'var $VARIABLE = "text"',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003814 ], 'E1016: Cannot declare an environment variable:')
Bram Moolenaar67979662020-06-20 22:50:47 +02003815
Bram Moolenaar62aec932022-01-29 21:45:34 +00003816 v9.CheckScriptFailure([
Bram Moolenaar67979662020-06-20 22:50:47 +02003817 'vim9script',
3818 'g:var = 123',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003819 'unlet g:var# comment1',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003820 ], 'E108:')
3821
Bram Moolenaar62aec932022-01-29 21:45:34 +00003822 v9.CheckScriptFailure([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003823 'let g:var = 123',
3824 'unlet g:var # something',
3825 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003826
Bram Moolenaar62aec932022-01-29 21:45:34 +00003827 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003828 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003829 'if 1 # comment2',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003830 ' echo "yes"',
3831 'elseif 2 #comment',
3832 ' echo "no"',
3833 'endif',
3834 ])
3835
Bram Moolenaar62aec932022-01-29 21:45:34 +00003836 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003837 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003838 'if 1# comment3',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003839 ' echo "yes"',
3840 'endif',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003841 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003842
Bram Moolenaar62aec932022-01-29 21:45:34 +00003843 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003844 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003845 'if 0 # comment4',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003846 ' echo "yes"',
3847 'elseif 2#comment',
3848 ' echo "no"',
3849 'endif',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003850 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003851
Bram Moolenaar62aec932022-01-29 21:45:34 +00003852 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003853 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003854 'var v = 1 # comment5',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003855 ])
3856
Bram Moolenaar62aec932022-01-29 21:45:34 +00003857 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003858 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003859 'var v = 1# comment6',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003860 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003861
Bram Moolenaar62aec932022-01-29 21:45:34 +00003862 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003863 'vim9script',
Bram Moolenaar2984ed32022-08-20 14:51:17 +01003864 'new',
Bram Moolenaard2c61702020-09-06 15:58:36 +02003865 'setline(1, ["# define pat", "last"])',
Bram Moolenaardf069ee2020-06-22 23:02:51 +02003866 ':$',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003867 'dsearch /pat/ #comment',
3868 'bwipe!',
3869 ])
3870
Bram Moolenaar62aec932022-01-29 21:45:34 +00003871 v9.CheckScriptFailure([
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003872 'vim9script',
Bram Moolenaar2984ed32022-08-20 14:51:17 +01003873 'new',
Bram Moolenaard2c61702020-09-06 15:58:36 +02003874 'setline(1, ["# define pat", "last"])',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003875 ':$',
3876 'dsearch /pat/#comment',
3877 'bwipe!',
3878 ], 'E488:')
3879
Bram Moolenaar62aec932022-01-29 21:45:34 +00003880 v9.CheckScriptFailure([
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003881 'vim9script',
3882 'func! SomeFunc()',
3883 ], 'E477:')
Bram Moolenaara26b9702020-04-18 19:53:28 +02003884enddef
3885
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003886def Test_finish()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003887 var lines =<< trim END
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003888 vim9script
Bram Moolenaar67979662020-06-20 22:50:47 +02003889 g:res = 'one'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003890 if v:false | finish | endif
Bram Moolenaar67979662020-06-20 22:50:47 +02003891 g:res = 'two'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003892 finish
Bram Moolenaar67979662020-06-20 22:50:47 +02003893 g:res = 'three'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003894 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003895 writefile(lines, 'Xfinished', 'D')
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003896 source Xfinished
3897 assert_equal('two', g:res)
3898
3899 unlet g:res
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003900enddef
3901
Bram Moolenaara5d00772020-05-14 23:20:55 +02003902def Test_forward_declaration()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003903 var lines =<< trim END
Bram Moolenaara5d00772020-05-14 23:20:55 +02003904 vim9script
Bram Moolenaara5d00772020-05-14 23:20:55 +02003905 def GetValue(): string
3906 return theVal
3907 enddef
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003908 var theVal = 'something'
Bram Moolenaar822ba242020-05-24 23:00:18 +02003909 g:initVal = GetValue()
Bram Moolenaara5d00772020-05-14 23:20:55 +02003910 theVal = 'else'
3911 g:laterVal = GetValue()
3912 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003913 writefile(lines, 'Xforward', 'D')
Bram Moolenaara5d00772020-05-14 23:20:55 +02003914 source Xforward
3915 assert_equal('something', g:initVal)
3916 assert_equal('else', g:laterVal)
3917
3918 unlet g:initVal
3919 unlet g:laterVal
Bram Moolenaara5d00772020-05-14 23:20:55 +02003920enddef
3921
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003922def Test_declare_script_var_in_func()
Bram Moolenaare535db82021-03-31 21:07:24 +02003923 var lines =<< trim END
3924 vim9script
3925 func Declare()
3926 let s:local = 123
3927 endfunc
3928 Declare()
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003929 END
3930 v9.CheckScriptFailure(lines, 'E1269:')
3931enddef
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00003932
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003933def Test_lock_script_var()
3934 var lines =<< trim END
3935 vim9script
3936 var local = 123
Bram Moolenaare535db82021-03-31 21:07:24 +02003937 assert_equal(123, local)
3938
3939 var error: string
3940 try
3941 local = 'asdf'
3942 catch
3943 error = v:exception
3944 endtry
3945 assert_match('E1012: Type mismatch; expected number but got string', error)
3946
3947 lockvar local
3948 try
3949 local = 999
3950 catch
3951 error = v:exception
3952 endtry
3953 assert_match('E741: Value is locked: local', error)
3954 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003955 v9.CheckScriptSuccess(lines)
Bram Moolenaare535db82021-03-31 21:07:24 +02003956enddef
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00003957
Bram Moolenaare535db82021-03-31 21:07:24 +02003958
Bram Moolenaar7d699702020-08-14 20:52:28 +02003959func Test_vim9script_not_global()
3960 " check that items defined in Vim9 script are script-local, not global
3961 let vim9lines =<< trim END
3962 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003963 var name = 'local'
Bram Moolenaar7d699702020-08-14 20:52:28 +02003964 func TheFunc()
3965 echo 'local'
3966 endfunc
3967 def DefFunc()
3968 echo 'local'
3969 enddef
3970 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003971 call writefile(vim9lines, 'Xvim9script.vim', 'D')
Bram Moolenaar7d699702020-08-14 20:52:28 +02003972 source Xvim9script.vim
3973 try
3974 echo g:var
3975 assert_report('did not fail')
3976 catch /E121:/
3977 " caught
3978 endtry
3979 try
3980 call TheFunc()
3981 assert_report('did not fail')
3982 catch /E117:/
3983 " caught
3984 endtry
3985 try
3986 call DefFunc()
3987 assert_report('did not fail')
3988 catch /E117:/
3989 " caught
3990 endtry
Bram Moolenaar7d699702020-08-14 20:52:28 +02003991endfunc
3992
Bram Moolenaareeb27bf2020-07-04 17:39:10 +02003993def Test_vim9_copen()
3994 # 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
Bram Moolenaar6809ff92022-07-26 15:10:56 +01004055def Test_error_in_autoload_script_foldexpr()
4056 var save_rtp = &rtp
Bram Moolenaardd674772022-09-15 22:26:18 +01004057 mkdir('Xvim/autoload', 'pR')
Bram Moolenaar6809ff92022-07-26 15:10:56 +01004058 &runtimepath = 'Xvim'
4059
4060 var lines =<< trim END
4061 vim9script
4062 eval [][0]
4063 echomsg 'no error'
4064 END
4065 lines->writefile('Xvim/autoload/script.vim')
4066
4067 lines =<< trim END
4068 vim9script
4069 import autoload 'script.vim'
4070 &foldmethod = 'expr'
4071 &foldexpr = 'script.Func()'
4072 redraw
4073 END
4074 v9.CheckScriptFailure(lines, 'E684: List index out of range: 0')
Bram Moolenaar6809ff92022-07-26 15:10:56 +01004075enddef
4076
Bram Moolenaare3d46852020-08-29 13:39:17 +02004077def Test_invalid_sid()
4078 assert_fails('func <SNR>1234_func', 'E123:')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02004079
Bram Moolenaar62aec932022-01-29 21:45:34 +00004080 if g:RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
Bram Moolenaard2c61702020-09-06 15:58:36 +02004081 assert_equal([], readfile('Xdidit'))
Bram Moolenaare3d46852020-08-29 13:39:17 +02004082 endif
4083 delete('Xdidit')
4084enddef
4085
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004086def Test_restoring_cpo()
Bram Moolenaardd674772022-09-15 22:26:18 +01004087 writefile(['vim9script', 'set nocp'], 'Xsourced', 'D')
4088 writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00004089 if g:RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004090 assert_equal(['done'], readfile('Xdone'))
4091 endif
Bram Moolenaar090728a2020-12-20 15:43:31 +01004092 delete('Xdone')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004093
Bram Moolenaardd674772022-09-15 22:26:18 +01004094 writefile(['vim9script', 'g:cpoval = &cpo'], 'XanotherScript', 'D')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004095 set cpo=aABceFsMny>
4096 edit XanotherScript
4097 so %
4098 assert_equal('aABceFsMny>', &cpo)
Christian Brabandt22105fd2024-07-15 20:51:11 +02004099 assert_equal('aABceFsz', g:cpoval)
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004100 :1del
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004101 setline(1, 'let g:cpoval = &cpo')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004102 w
4103 so %
4104 assert_equal('aABceFsMny>', &cpo)
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004105 assert_equal('aABceFsMny>', g:cpoval)
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004106
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004107 set cpo&vim
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004108 unlet g:cpoval
4109
4110 if has('unix')
4111 # 'cpo' is not restored in main vimrc
4112 var save_HOME = $HOME
4113 $HOME = getcwd() .. '/Xhome'
Bram Moolenaardd674772022-09-15 22:26:18 +01004114 mkdir('Xhome', 'R')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004115 var lines =<< trim END
4116 vim9script
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004117 writefile(['before: ' .. &cpo], 'Xrporesult')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004118 set cpo+=M
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004119 writefile(['after: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004120 END
4121 writefile(lines, 'Xhome/.vimrc')
4122
4123 lines =<< trim END
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004124 call writefile(['later: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004125 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004126 writefile(lines, 'Xlegacy', 'D')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004127
4128 lines =<< trim END
4129 vim9script
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004130 call writefile(['vim9: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004131 qa
4132 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004133 writefile(lines, 'Xvim9', 'D')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004134
Bram Moolenaar62aec932022-01-29 21:45:34 +00004135 var cmd = g:GetVimCommand() .. " -S Xlegacy -S Xvim9"
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004136 cmd = substitute(cmd, '-u NONE', '', '')
4137 exe "silent !" .. cmd
4138
4139 assert_equal([
Christian Brabandt22105fd2024-07-15 20:51:11 +02004140 'before: aABceFsz',
4141 'after: aABceFszM',
4142 'later: aABceFszM',
4143 'vim9: aABceFsz'], readfile('Xrporesult'))
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004144
4145 $HOME = save_HOME
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004146 delete('Xrporesult')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004147 endif
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004148enddef
4149
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004150" Use :function so we can use Check commands
4151func Test_no_redraw_when_restoring_cpo()
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004152 CheckScreendump
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004153 CheckFeature timers
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004154 call Run_test_no_redraw_when_restoring_cpo()
4155endfunc
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004156
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004157def Run_test_no_redraw_when_restoring_cpo()
4158 var lines =<< trim END
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004159 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00004160 export def Func()
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004161 enddef
4162 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004163 mkdir('Xnordir/autoload', 'pR')
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01004164 writefile(lines, 'Xnordir/autoload/script.vim')
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004165
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004166 lines =<< trim END
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004167 vim9script
4168 set cpo+=M
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01004169 exe 'set rtp^=' .. getcwd() .. '/Xnordir'
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00004170 au CmdlineEnter : ++once timer_start(0, (_) => script#Func())
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004171 setline(1, 'some text')
4172 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004173 writefile(lines, 'XTest_redraw_cpo', 'D')
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004174 var buf = g:RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
4175 term_sendkeys(buf, "V:")
4176 g:VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004177
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004178 # clean up
4179 term_sendkeys(buf, "\<Esc>u")
4180 g:StopVimInTerminal(buf)
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004181enddef
4182
4183func Test_reject_declaration()
4184 CheckScreendump
4185 call Run_test_reject_declaration()
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004186endfunc
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004187
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004188def Run_test_reject_declaration()
4189 var buf = g:RunVimInTerminal('', {'rows': 6})
4190 term_sendkeys(buf, ":vim9cmd var x: number\<CR>")
Bram Moolenaar330a3882022-03-05 11:05:57 +00004191 g:VerifyScreenDump(buf, 'Test_vim9_reject_declaration_1', {})
4192 term_sendkeys(buf, ":\<CR>")
4193 term_sendkeys(buf, ":vim9cmd g:foo = 123 | echo g:foo\<CR>")
4194 g:VerifyScreenDump(buf, 'Test_vim9_reject_declaration_2', {})
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004195
4196 # clean up
4197 g:StopVimInTerminal(buf)
4198enddef
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004199
Bram Moolenaar204852a2022-03-05 12:56:44 +00004200def Test_minimal_command_name_length()
4201 var names = [
4202 'cons',
4203 'brea',
4204 'cat',
4205 'catc',
4206 'con',
Bram Moolenaarb2175222022-03-05 20:24:41 +00004207 'cont',
4208 'conti',
4209 'contin',
4210 'continu',
Bram Moolenaar204852a2022-03-05 12:56:44 +00004211 'el',
4212 'els',
4213 'elsei',
4214 'endfo',
4215 'en',
4216 'end',
4217 'endi',
4218 'endw',
4219 'endt',
4220 'endtr',
Bram Moolenaarb2175222022-03-05 20:24:41 +00004221 'exp',
4222 'expo',
4223 'expor',
Bram Moolenaar204852a2022-03-05 12:56:44 +00004224 'fina',
4225 'finall',
Bram Moolenaard523c7b2022-03-06 14:51:22 +00004226 'fini',
4227 'finis',
Bram Moolenaarb2175222022-03-05 20:24:41 +00004228 'imp',
4229 'impo',
4230 'impor',
4231 'retu',
4232 'retur',
Bram Moolenaar204852a2022-03-05 12:56:44 +00004233 'th',
4234 'thr',
4235 'thro',
4236 'wh',
4237 'whi',
4238 'whil',
4239 ]
4240 for name in names
4241 v9.CheckDefAndScriptFailure([name .. ' '], 'E1065:')
4242 endfor
Bram Moolenaarb2175222022-03-05 20:24:41 +00004243
4244 var lines =<< trim END
4245 vim9script
4246 def SomeFunc()
4247 endd
4248 END
4249 v9.CheckScriptFailure(lines, 'E1065:')
4250 lines =<< trim END
4251 vim9script
4252 def SomeFunc()
4253 endde
4254 END
4255 v9.CheckScriptFailure(lines, 'E1065:')
Bram Moolenaar204852a2022-03-05 12:56:44 +00004256enddef
4257
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004258def Test_unset_any_variable()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004259 var lines =<< trim END
4260 var name: any
4261 assert_equal(0, name)
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004262 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004263 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004264enddef
4265
Bram Moolenaar7e9210e2020-09-25 23:12:51 +02004266func Test_define_func_at_command_line()
Bram Moolenaar58dbef32020-09-25 22:13:05 +02004267 CheckRunVimInTerminal
4268
Bram Moolenaar7e9210e2020-09-25 23:12:51 +02004269 " call indirectly to avoid compilation error for missing functions
4270 call Run_Test_define_func_at_command_line()
4271endfunc
4272
4273def Run_Test_define_func_at_command_line()
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004274 # run in a separate Vim instance to avoid the script context
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004275 var lines =<< trim END
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004276 func CheckAndQuit()
4277 call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
4278 call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
4279 endfunc
4280 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004281 writefile([''], 'Xdidcmd', 'D')
4282 writefile(lines, 'XcallFunc', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00004283 var buf = g:RunVimInTerminal('-S XcallFunc', {rows: 6})
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004284 # define Afunc() on the command line
4285 term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
4286 term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004287 g:WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004288
Bram Moolenaar62aec932022-01-29 21:45:34 +00004289 call g:StopVimInTerminal(buf)
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004290enddef
4291
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004292def Test_script_var_scope()
4293 var lines =<< trim END
4294 vim9script
4295 if true
4296 if true
4297 var one = 'one'
4298 echo one
4299 endif
4300 echo one
4301 endif
4302 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004303 v9.CheckScriptFailure(lines, 'E121:', 7)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004304
4305 lines =<< trim END
4306 vim9script
4307 if true
4308 if false
4309 var one = 'one'
4310 echo one
4311 else
4312 var one = 'one'
4313 echo one
4314 endif
4315 echo one
4316 endif
4317 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004318 v9.CheckScriptFailure(lines, 'E121:', 10)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004319
4320 lines =<< trim END
4321 vim9script
4322 while true
4323 var one = 'one'
4324 echo one
4325 break
4326 endwhile
4327 echo one
4328 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004329 v9.CheckScriptFailure(lines, 'E121:', 7)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004330
4331 lines =<< trim END
4332 vim9script
4333 for i in range(1)
4334 var one = 'one'
4335 echo one
4336 endfor
4337 echo one
4338 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004339 v9.CheckScriptFailure(lines, 'E121:', 6)
Bram Moolenaar9becdf22020-10-10 21:33:48 +02004340
4341 lines =<< trim END
4342 vim9script
4343 {
4344 var one = 'one'
4345 assert_equal('one', one)
4346 }
4347 assert_false(exists('one'))
4348 assert_false(exists('s:one'))
4349 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004350 v9.CheckScriptSuccess(lines)
Bram Moolenaar9becdf22020-10-10 21:33:48 +02004351
4352 lines =<< trim END
4353 vim9script
4354 {
4355 var one = 'one'
4356 echo one
4357 }
4358 echo one
4359 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004360 v9.CheckScriptFailure(lines, 'E121:', 6)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004361enddef
4362
Bram Moolenaar352134b2020-10-17 22:04:08 +02004363def Test_catch_exception_in_callback()
4364 var lines =<< trim END
4365 vim9script
Bram Moolenaar2a389082021-04-09 20:24:31 +02004366 def Callback(...l: list<any>)
Bram Moolenaar352134b2020-10-17 22:04:08 +02004367 try
4368 var x: string
4369 var y: string
4370 # this error should be caught with CHECKLEN
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +00004371 var sl = ['']
4372 [x, y] = sl
Bram Moolenaar352134b2020-10-17 22:04:08 +02004373 catch
4374 g:caught = 'yes'
4375 endtry
4376 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01004377 popup_menu('popup', {callback: Callback})
Bram Moolenaar352134b2020-10-17 22:04:08 +02004378 feedkeys("\r", 'xt')
4379 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004380 v9.CheckScriptSuccess(lines)
Bram Moolenaar352134b2020-10-17 22:04:08 +02004381
4382 unlet g:caught
4383enddef
4384
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004385def Test_no_unknown_error_after_error()
4386 if !has('unix') || !has('job')
4387 throw 'Skipped: not unix of missing +job feature'
4388 endif
Bram Moolenaarb16ff292021-09-26 20:14:39 +01004389 # FIXME: this check should not be needed
4390 if has('win32')
4391 throw 'Skipped: does not work on MS-Windows'
4392 endif
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004393 var lines =<< trim END
4394 vim9script
4395 var source: list<number>
Bram Moolenaar2a389082021-04-09 20:24:31 +02004396 def Out_cb(...l: list<any>)
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004397 eval [][0]
4398 enddef
Bram Moolenaar2a389082021-04-09 20:24:31 +02004399 def Exit_cb(...l: list<any>)
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004400 sleep 1m
Bram Moolenaar23d44492022-05-04 16:24:57 +01004401 g:did_call_exit_cb = true
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004402 source += l
4403 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01004404 var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
Bram Moolenaar6f17a3f2020-12-21 18:11:24 +01004405 while job_status(myjob) == 'run'
4406 sleep 10m
4407 endwhile
Bram Moolenaar206c2a62021-01-31 14:04:44 +01004408 # wait for Exit_cb() to be called
Bram Moolenaar23d44492022-05-04 16:24:57 +01004409 for x in range(100)
4410 if exists('g:did_call_exit_cb')
4411 unlet g:did_call_exit_cb
4412 break
4413 endif
4414 sleep 10m
4415 endfor
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004416 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004417 writefile(lines, 'Xdef', 'D')
Yee Cheng Chin69a8bb82022-11-06 12:25:47 +00004418 # Either the exit or out callback is called first, accept them in any order
4419 assert_fails('so Xdef', ['E684:\|E1012:', 'E1012:\|E684:'])
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004420enddef
4421
Bram Moolenaar4324d872020-12-01 20:12:24 +01004422def InvokeNormal()
4423 exe "norm! :m+1\r"
4424enddef
4425
4426def Test_invoke_normal_in_visual_mode()
4427 xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
4428 new
4429 setline(1, ['aaa', 'bbb'])
4430 feedkeys("V\<F3>", 'xt')
4431 assert_equal(['bbb', 'aaa'], getline(1, 2))
4432 xunmap <F3>
4433enddef
4434
Bram Moolenaarb5b94802020-12-13 17:50:20 +01004435def Test_white_space_after_command()
4436 var lines =<< trim END
4437 exit_cb: Func})
4438 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004439 v9.CheckDefAndScriptFailure(lines, 'E1144:', 1)
Bram Moolenaarf8103f22020-12-25 17:36:27 +01004440
4441 lines =<< trim END
4442 e#
4443 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004444 v9.CheckDefAndScriptFailure(lines, 'E1144:', 1)
Bram Moolenaarb5b94802020-12-13 17:50:20 +01004445enddef
4446
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004447def Test_script_var_gone_when_sourced_twice()
4448 var lines =<< trim END
4449 vim9script
4450 if exists('g:guard')
4451 finish
4452 endif
4453 g:guard = 1
4454 var name = 'thename'
4455 def g:GetName(): string
4456 return name
4457 enddef
4458 def g:SetName(arg: string)
4459 name = arg
4460 enddef
4461 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004462 writefile(lines, 'XscriptTwice.vim', 'D')
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004463 so XscriptTwice.vim
4464 assert_equal('thename', g:GetName())
4465 g:SetName('newname')
4466 assert_equal('newname', g:GetName())
4467 so XscriptTwice.vim
4468 assert_fails('call g:GetName()', 'E1149:')
4469 assert_fails('call g:SetName("x")', 'E1149:')
4470
4471 delfunc g:GetName
4472 delfunc g:SetName
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004473 unlet g:guard
4474enddef
4475
Bram Moolenaar10b94212021-02-19 21:42:57 +01004476def Test_unsupported_commands()
4477 var lines =<< trim END
4478 ka
4479 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004480 v9.CheckDefAndScriptFailure(lines, ['E476:', 'E492:'])
Bram Moolenaar10b94212021-02-19 21:42:57 +01004481
4482 lines =<< trim END
Bram Moolenaarada1d872021-02-20 08:16:51 +01004483 :1ka
4484 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004485 v9.CheckDefAndScriptFailure(lines, ['E476:', 'E492:'])
Bram Moolenaarada1d872021-02-20 08:16:51 +01004486
4487 lines =<< trim END
Yegappan Lakshmanan885de442022-04-23 10:51:14 +01004488 :k a
4489 END
4490 v9.CheckDefAndScriptFailure(lines, 'E1100:')
4491
4492 lines =<< trim END
4493 :1k a
4494 END
4495 v9.CheckDefAndScriptFailure(lines, 'E481:')
4496
4497 lines =<< trim END
Bram Moolenaar10b94212021-02-19 21:42:57 +01004498 t
4499 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004500 v9.CheckDefAndScriptFailure(lines, 'E1100:')
Bram Moolenaar10b94212021-02-19 21:42:57 +01004501
4502 lines =<< trim END
4503 x
4504 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004505 v9.CheckDefAndScriptFailure(lines, 'E1100:')
Bram Moolenaar10b94212021-02-19 21:42:57 +01004506
4507 lines =<< trim END
4508 xit
4509 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004510 v9.CheckDefAndScriptFailure(lines, 'E1100:')
4511
4512 lines =<< trim END
4513 Print
4514 END
4515 v9.CheckDefAndScriptFailure(lines, ['E476: Invalid command: Print', 'E492: Not an editor command: Print'])
4516
4517 lines =<< trim END
4518 mode 4
4519 END
4520 v9.CheckDefAndScriptFailure(lines, ['E476: Invalid command: mode 4', 'E492: Not an editor command: mode 4'])
Bram Moolenaar10b94212021-02-19 21:42:57 +01004521enddef
4522
Bram Moolenaarc70fe462021-04-17 17:59:19 +02004523def Test_mapping_line_number()
4524 var lines =<< trim END
4525 vim9script
4526 def g:FuncA()
4527 # Some comment
4528 FuncB(0)
4529 enddef
4530 # Some comment
4531 def FuncB(
4532 # Some comment
4533 n: number
4534 )
4535 exe 'nno '
4536 # Some comment
4537 .. '<F3> a'
4538 .. 'b'
4539 .. 'c'
4540 enddef
4541 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004542 v9.CheckScriptSuccess(lines)
Bram Moolenaarc70fe462021-04-17 17:59:19 +02004543 var res = execute('verbose nmap <F3>')
4544 assert_match('No mapping found', res)
4545
4546 g:FuncA()
4547 res = execute('verbose nmap <F3>')
4548 assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
4549
4550 nunmap <F3>
4551 delfunc g:FuncA
4552enddef
4553
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004554def Test_option_set()
4555 # legacy script allows for white space
4556 var lines =<< trim END
4557 set foldlevel =11
4558 call assert_equal(11, &foldlevel)
4559 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004560 v9.CheckScriptSuccess(lines)
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004561
4562 set foldlevel
4563 set foldlevel=12
4564 assert_equal(12, &foldlevel)
4565 set foldlevel+=2
4566 assert_equal(14, &foldlevel)
4567 set foldlevel-=3
4568 assert_equal(11, &foldlevel)
4569
4570 lines =<< trim END
4571 set foldlevel =1
4572 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004573 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004574
4575 lines =<< trim END
4576 set foldlevel +=1
4577 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004578 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004579
4580 lines =<< trim END
4581 set foldlevel ^=1
4582 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004583 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004584
4585 lines =<< trim END
4586 set foldlevel -=1
4587 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004588 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004589
4590 set foldlevel&
4591enddef
4592
LemonBoy32f34612023-09-02 21:52:05 +02004593def Test_option_set_line_number()
4594 var lines =<< trim END
4595 vim9script
4596 # line2
4597 # line3
4598 def F()
4599 # line5
4600 &foldlevel = -128
4601 enddef
4602 F()
4603 END
4604 v9.CheckScriptSuccess(lines)
4605
4606 var res = execute('verbose set foldlevel')
4607 assert_match(' foldlevel.*Last set from .*XScriptSuccess\d\+ line 6', res)
4608enddef
4609
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004610def Test_option_modifier()
Bram Moolenaar1594f312021-07-08 16:40:13 +02004611 # legacy script allows for white space
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004612 var lines =<< trim END
4613 set hlsearch & hlsearch !
4614 call assert_equal(1, &hlsearch)
4615 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004616 v9.CheckScriptSuccess(lines)
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004617
Bram Moolenaar1594f312021-07-08 16:40:13 +02004618 set hlsearch
4619 set hlsearch!
4620 assert_equal(false, &hlsearch)
4621
4622 set hlsearch
4623 set hlsearch&
4624 assert_equal(false, &hlsearch)
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004625
4626 lines =<< trim END
Bram Moolenaar1594f312021-07-08 16:40:13 +02004627 set hlsearch &
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004628 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004629 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &')
Bram Moolenaar1594f312021-07-08 16:40:13 +02004630
4631 lines =<< trim END
4632 set hlsearch !
4633 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004634 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !')
Bram Moolenaar1594f312021-07-08 16:40:13 +02004635
4636 set hlsearch&
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004637enddef
4638
Bram Moolenaarc03fe662021-07-11 16:52:45 +02004639" This must be called last, it may cause following :def functions to fail
4640def Test_xxx_echoerr_line_number()
4641 var lines =<< trim END
4642 echoerr 'some'
4643 .. ' error'
4644 .. ' continued'
4645 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004646 v9.CheckDefExecAndScriptFailure(lines, 'some error continued', 1)
Bram Moolenaarc03fe662021-07-11 16:52:45 +02004647enddef
4648
Bram Moolenaar9537e372021-12-10 21:05:53 +00004649func Test_debug_with_lambda()
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004650 CheckRunVimInTerminal
4651
Bram Moolenaar9537e372021-12-10 21:05:53 +00004652 " call indirectly to avoid compilation error for missing functions
4653 call Run_Test_debug_with_lambda()
4654endfunc
4655
4656def Run_Test_debug_with_lambda()
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004657 var lines =<< trim END
4658 vim9script
4659 def Func()
4660 var n = 0
4661 echo [0]->filter((_, v) => v == n)
4662 enddef
4663 breakadd func Func
4664 Func()
4665 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004666 writefile(lines, 'XdebugFunc', 'D')
Christian Brabandt7edde3f2024-05-04 09:38:59 +02004667 var buf = g:RunVimInTerminal('-S XdebugFunc', {rows: 10, wait_for_ruler: 0})
4668 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 10)))
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004669
4670 term_sendkeys(buf, "cont\<CR>")
Christian Brabandt7edde3f2024-05-04 09:38:59 +02004671 g:WaitForAssert(() => assert_match('\[0\]', term_getline(buf, 9)))
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004672
Bram Moolenaar62aec932022-01-29 21:45:34 +00004673 g:StopVimInTerminal(buf)
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004674enddef
4675
Bram Moolenaar310091d2021-12-23 21:14:37 +00004676func Test_debug_running_out_of_lines()
4677 CheckRunVimInTerminal
4678
4679 " call indirectly to avoid compilation error for missing functions
4680 call Run_Test_debug_running_out_of_lines()
4681endfunc
4682
4683def Run_Test_debug_running_out_of_lines()
4684 var lines =<< trim END
4685 vim9script
4686 def Crash()
4687 #
4688 #
4689 #
4690 #
4691 #
4692 #
4693 #
4694 if true
4695 #
4696 endif
4697 enddef
4698 breakadd func Crash
4699 Crash()
4700 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004701 writefile(lines, 'XdebugFunc', 'D')
Christian Brabandt7edde3f2024-05-04 09:38:59 +02004702 var buf = g:RunVimInTerminal('-S XdebugFunc', {rows: 10, wait_for_ruler: 0})
4703 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 10)))
Bram Moolenaar310091d2021-12-23 21:14:37 +00004704
4705 term_sendkeys(buf, "next\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004706 g:TermWait(buf)
Christian Brabandt7edde3f2024-05-04 09:38:59 +02004707 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 10)))
Bram Moolenaar310091d2021-12-23 21:14:37 +00004708
4709 term_sendkeys(buf, "cont\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004710 g:TermWait(buf)
Bram Moolenaar310091d2021-12-23 21:14:37 +00004711
Bram Moolenaar62aec932022-01-29 21:45:34 +00004712 g:StopVimInTerminal(buf)
Bram Moolenaar310091d2021-12-23 21:14:37 +00004713enddef
4714
dundargocc57b5bc2022-11-02 13:30:51 +00004715def Test_ambiguous_command_error()
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004716 var lines =<< trim END
4717 vim9script
4718 command CmdA echomsg 'CmdA'
4719 command CmdB echomsg 'CmdB'
4720 Cmd
4721 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004722 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 4)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004723
4724 lines =<< trim END
4725 vim9script
4726 def Func()
4727 Cmd
4728 enddef
4729 Func()
4730 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004731 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 1)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004732
4733 lines =<< trim END
4734 vim9script
4735 nnoremap <F3> <ScriptCmd>Cmd<CR>
4736 feedkeys("\<F3>", 'xt')
4737 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004738 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 3)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004739
4740 delcommand CmdA
4741 delcommand CmdB
4742 nunmap <F3>
4743enddef
4744
Dominique Pelle923dce22021-11-21 11:36:04 +00004745" Execute this near the end, profiling doesn't stop until Vim exits.
Bram Moolenaard9162552021-07-11 15:26:13 +02004746" This only tests that it works, not the profiling output.
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004747def Test_profile_with_lambda()
Bram Moolenaar4ece1522021-07-11 16:31:51 +02004748 CheckFeature profile
4749
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004750 var lines =<< trim END
4751 vim9script
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004752
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004753 def ProfiledWithLambda()
4754 var n = 3
4755 echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n)
4756 enddef
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004757
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004758 def ProfiledNested()
4759 var x = 0
4760 def Nested(): any
4761 return x
4762 enddef
4763 Nested()
4764 enddef
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004765
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004766 def g:ProfiledNestedProfiled()
4767 var x = 0
4768 def Nested(): any
4769 return x
4770 enddef
4771 Nested()
4772 enddef
4773
4774 def Profile()
Bram Moolenaar48f69cd2022-03-15 16:16:47 +00004775 ProfiledWithLambda()
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004776 ProfiledNested()
4777
Bram Moolenaar48f69cd2022-03-15 16:16:47 +00004778 # Also profile the nested function. Use a different function, although
4779 # the contents is the same, to make sure it was not already compiled.
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004780 profile func *
4781 g:ProfiledNestedProfiled()
4782
4783 profdel func *
4784 profile pause
4785 enddef
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004786
4787 var result = 'done'
4788 try
4789 # mark functions for profiling now to avoid E1271
4790 profile start Xprofile.log
4791 profile func ProfiledWithLambda
4792 profile func ProfiledNested
4793
4794 Profile()
4795 catch
4796 result = 'failed: ' .. v:exception
4797 finally
4798 writefile([result], 'Xdidprofile')
4799 endtry
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004800 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004801 writefile(lines, 'Xprofile.vim', 'D')
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004802 call system(g:GetVimCommand()
4803 .. ' --clean'
4804 .. ' -c "so Xprofile.vim"'
4805 .. ' -c "qall!"')
4806 call assert_equal(0, v:shell_error)
4807
4808 assert_equal(['done'], readfile('Xdidprofile'))
4809 assert_true(filereadable('Xprofile.log'))
4810 delete('Xdidprofile')
4811 delete('Xprofile.log')
Bram Moolenaard9162552021-07-11 15:26:13 +02004812enddef
4813
Bram Moolenaar4f6e7722022-03-16 20:26:02 +00004814func Test_misplaced_type()
4815 CheckRunVimInTerminal
4816 call Run_Test_misplaced_type()
4817endfunc
4818
4819def Run_Test_misplaced_type()
Bram Moolenaar9510d222022-09-11 15:14:05 +01004820 writefile(['let g:somevar = "asdf"'], 'XTest_misplaced_type', 'D')
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004821 var buf = g:RunVimInTerminal('-S XTest_misplaced_type', {'rows': 6})
Bram Moolenaar9510d222022-09-11 15:14:05 +01004822 term_sendkeys(buf, ":vim9cmd echo islocked('somevar: string')\<CR>")
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004823 g:VerifyScreenDump(buf, 'Test_misplaced_type', {})
4824
4825 g:StopVimInTerminal(buf)
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004826enddef
4827
LemonBoya5d35902022-04-29 21:15:02 +01004828" Ensure echo doesn't crash when stringifying empty variables.
4829def Test_echo_uninit_variables()
4830 var res: string
4831
4832 var var_bool: bool
4833 var var_num: number
4834 var var_float: float
4835 var Var_func: func
4836 var var_string: string
4837 var var_blob: blob
LemonBoya5d35902022-04-29 21:15:02 +01004838 var var_list: list<any>
4839 var var_dict: dict<any>
4840
4841 redir => res
4842 echo var_bool
4843 echo var_num
4844 echo var_float
4845 echo Var_func
4846 echo var_string
4847 echo var_blob
LemonBoya5d35902022-04-29 21:15:02 +01004848 echo var_list
4849 echo var_dict
4850 redir END
4851
Bram Moolenaarf1d63b92022-05-06 13:37:42 +01004852 assert_equal(['false', '0', '0.0', 'function()', '', '0z', '[]', '{}'], res->split('\n'))
4853
4854 if has('job')
4855 var var_job: job
4856 var var_channel: channel
4857
4858 redir => res
4859 echo var_job
4860 echo var_channel
4861 redir END
4862
4863 assert_equal(['no process', 'channel fail'], res->split('\n'))
4864 endif
LemonBoya5d35902022-04-29 21:15:02 +01004865enddef
4866
Bram Moolenaar6342e2c2022-12-12 18:56:32 +00004867def Test_free_type_before_use()
4868 # this rather complicated script was freeing a type before using it
4869 var lines =<< trim END
4870 vim9script
4871
4872 def Scan(rel: list<dict<any>>): func(func(dict<any>))
4873 return (Emit: func(dict<any>)) => {
4874 for t in rel
4875 Emit(t)
4876 endfor
4877 }
4878 enddef
4879
4880 def Build(Cont: func(func(dict<any>))): list<dict<any>>
4881 var rel: list<dict<any>> = []
4882 Cont((t) => {
4883 add(rel, t)
4884 })
4885 return rel
4886 enddef
4887
4888 var R = [{A: 0}]
4889 var result = Scan(R)->Build()
4890 result = Scan(R)->Build()
4891
4892 assert_equal(R, result)
4893 END
4894 v9.CheckScriptSuccess(lines)
4895enddef
4896
Yegappan Lakshmanana76fbe62023-09-27 18:51:43 +02004897" The following complicated script used to cause an internal error (E340)
4898" because the funcref instruction memory was referenced after the instruction
4899" memory was reallocated (Github issue #13178)
4900def Test_refer_funcref_instr_after_realloc()
4901 var lines =<< trim END
4902 vim9script
4903 def A(d: bool)
4904 var e = abs(0)
4905 var f = &emoji
4906 &emoji = true
4907 if ['', '', '']->index('xxx') == 0
4908 eval 0 + 0
4909 endif
4910 if &filetype == 'xxx'
4911 var g = abs(0)
4912 while g > 0
4913 if getline(g) == ''
4914 break
4915 endif
4916 --g
4917 endwhile
4918 if g == 0
4919 return
4920 endif
4921 if d
4922 feedkeys($'{g}G')
4923 g = abs(0)
4924 endif
4925 var h = abs(0)
4926 var i = abs(0)
4927 var j = abs(0)
4928 while j < 0
4929 if abs(0) < h && getline(j) != ''
4930 break
4931 endif
4932 ++j
4933 endwhile
4934 feedkeys($'{g}G{j}G')
4935 return
4936 endif
4937 def B()
4938 enddef
4939 def C()
4940 enddef
4941 enddef
4942 A(false)
4943 END
4944 v9.CheckScriptSuccess(lines)
4945enddef
4946
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004947" Test for calling a deferred function after an exception
4948def Test_defer_after_exception()
4949 var lines =<< trim END
4950 vim9script
4951
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004952 var callTrace: list<number> = []
4953 def Bar()
4954 callTrace += [1]
4955 throw 'InnerException'
4956 enddef
4957
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004958 def Defer()
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004959 callTrace += [2]
4960 callTrace += [3]
4961 try
4962 Bar()
4963 catch /InnerException/
4964 callTrace += [4]
4965 endtry
4966 callTrace += [5]
4967 callTrace += [6]
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004968 enddef
4969
4970 def Foo()
4971 defer Defer()
4972 throw "TestException"
4973 enddef
4974
4975 try
4976 Foo()
4977 catch /TestException/
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004978 callTrace += [7]
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004979 endtry
4980
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004981 assert_equal([2, 3, 1, 4, 5, 6, 7], callTrace)
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004982 END
Yegappan Lakshmananec3cebb2023-10-27 19:35:26 +02004983 v9.CheckSourceSuccess(lines)
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004984enddef
4985
Yegappan Lakshmanan0ab500d2023-10-21 11:59:42 +02004986" Test for multiple deferred function which throw exceptions.
4987" Exceptions thrown by deferred functions should result in error messages but
4988" not propagated into the calling functions.
4989def Test_multidefer_with_exception()
4990 var lines =<< trim END
4991 vim9script
4992
4993 var callTrace: list<number> = []
4994 def Except()
4995 callTrace += [1]
4996 throw 'InnerException'
4997 callTrace += [2]
4998 enddef
4999
5000 def FirstDefer()
5001 callTrace += [3]
5002 callTrace += [4]
5003 enddef
5004
5005 def SecondDeferWithExcept()
5006 callTrace += [5]
5007 Except()
5008 callTrace += [6]
5009 enddef
5010
5011 def ThirdDefer()
5012 callTrace += [7]
5013 callTrace += [8]
5014 enddef
5015
5016 def Foo()
5017 callTrace += [9]
5018 defer FirstDefer()
5019 defer SecondDeferWithExcept()
5020 defer ThirdDefer()
5021 callTrace += [10]
5022 enddef
5023
5024 v:errmsg = ''
5025 try
5026 callTrace += [11]
5027 Foo()
5028 callTrace += [12]
5029 catch /TestException/
5030 callTrace += [13]
5031 catch
5032 callTrace += [14]
5033 finally
5034 callTrace += [15]
5035 endtry
5036 callTrace += [16]
5037
5038 assert_equal('E605: Exception not caught: InnerException', v:errmsg)
5039 assert_equal([11, 9, 10, 7, 8, 5, 1, 3, 4, 12, 15, 16], callTrace)
5040 END
Yegappan Lakshmananec3cebb2023-10-27 19:35:26 +02005041 v9.CheckSourceSuccess(lines)
5042enddef
5043
Yegappan Lakshmanana185a312023-12-16 14:36:08 +01005044" Test for using ":defer" inside an if statement with a false condition
5045def Test_defer_skipped()
5046 var lines =<< trim END
5047 def Foo()
5048 if false
5049 defer execute('echow "hello"', "")
5050 endif
5051 enddef
5052 defcompile
5053 END
5054 v9.CheckSourceSuccess(lines)
5055enddef
5056
Yegappan Lakshmanan062bb6b2023-12-16 14:46:40 +01005057" Test for using defer without parenthesis for the function name
5058def Test_defer_func_without_paren()
5059 var lines =<< trim END
5060 vim9script
5061 def Foo()
5062 defer Bar
5063 enddef
5064 defcompile
5065 END
5066 v9.CheckScriptFailure(lines, 'E107: Missing parentheses: Bar', 1)
5067enddef
5068
5069" Test for using defer without parenthesis for the function name
5070def Test_defer_non_existing_func()
5071 var lines =<< trim END
5072 vim9script
5073 def Foo()
5074 defer Bar()
5075 enddef
5076 defcompile
5077 END
5078 v9.CheckScriptFailure(lines, 'E1001: Variable not found: Bar', 1)
5079enddef
5080
5081" Test for using defer with an invalid function name
5082def Test_defer_invalid_func()
5083 var lines =<< trim END
5084 vim9script
5085 def Foo()
5086 var Abc = 10
5087 defer Abc()
5088 enddef
5089 defcompile
5090 END
5091 v9.CheckScriptFailure(lines, 'E129: Function name required', 2)
5092enddef
5093
5094" Test for using defer with an invalid argument to a function
5095def Test_defer_invalid_func_arg()
5096 var lines =<< trim END
5097 vim9script
5098 def Bar(x: number)
5099 enddef
5100 def Foo()
5101 defer Bar(a)
5102 enddef
5103 defcompile
5104 END
5105 v9.CheckScriptFailure(lines, 'E1001: Variable not found: a', 1)
5106enddef
5107
5108" Test for using an non-existing type in a "for" statement.
5109def Test_invalid_type_in_for()
5110 var lines =<< trim END
5111 vim9script
5112 def Foo()
5113 for b: x in range(10)
5114 endfor
5115 enddef
5116 defcompile
5117 END
Yegappan Lakshmanan1b531722024-05-09 09:12:31 +02005118 v9.CheckSourceFailure(lines, 'E1010: Type not recognized: x', 1)
Yegappan Lakshmanan062bb6b2023-12-16 14:46:40 +01005119enddef
5120
5121" Test for using a line break between the variable name and the type in a for
5122" statement.
5123def Test_for_stmt_space_before_type()
5124 var lines =<< trim END
5125 vim9script
5126 def Foo()
5127 for a
5128 :number in range(10)
5129 endfor
5130 enddef
5131 defcompile
5132 END
5133 v9.CheckSourceFailure(lines, 'E1059: No white space allowed before colon: :number in range(10)', 2)
5134enddef
5135
zeertzjqc029c132024-03-28 11:37:26 +01005136" This test used to cause a use-after-free memory access
Yegappan Lakshmanan28d71b52024-01-12 17:21:55 +01005137def Test_for_empty_line_after_lambda()
5138 var lines =<< trim END
5139 vim9script
5140 echomsg range(0, 2)->map((_, v) => {
5141 return 1
5142 })
5143
5144 assert_equal('[1, 1, 1]', v:statusmsg)
5145 END
5146 v9.CheckSourceSuccess(lines)
5147
5148 lines =<< trim END
5149 vim9script
5150 echomsg range(0, 1)->map((_, v) => {
5151 return 1
5152 }) range(0, 1)->map((_, v) => {
5153 return 2
5154 }) # comment
5155
5156 assert_equal('[1, 1] [2, 2]', v:statusmsg)
5157 END
5158 v9.CheckSourceSuccess(lines)
5159enddef
5160
Yegappan Lakshmanan3fa8f772024-04-04 21:42:07 +02005161" Test for evaluating a lambda block from a string
5162def Test_eval_lambda_block()
5163 var lines =<< trim END
5164 vim9script
5165 var Fn = eval("(x: number): number => {\nreturn x * 2\n}")
5166 assert_equal(6, Fn(3))
5167 END
5168 v9.CheckSourceSuccess(lines)
5169enddef
5170
Yegappan Lakshmananda9d3452024-05-02 13:02:36 +02005171" Test for using various null values
5172def Test_null_values()
5173 var lines =<< trim END
5174 var nullValues = [
5175 [null, 1, 'null', 7, 'special'],
5176 [null_blob, 1, '0z', 10, 'blob'],
Yegappan Lakshmananda9d3452024-05-02 13:02:36 +02005177 [null_dict, 1, '{}', 4, 'dict<any>'],
5178 [null_function, 1, "function('')", 2, 'func(...): unknown'],
Yegappan Lakshmananda9d3452024-05-02 13:02:36 +02005179 [null_list, 1, '[]', 3, 'list<any>'],
5180 [null_object, 1, 'object of [unknown]', 13, 'object<Unknown>'],
5181 [null_partial, 1, "function('')", 2, 'func(...): unknown'],
5182 [null_string, 1, "''", 1, 'string']
5183 ]
Dominique Pellé52123872024-07-07 20:37:12 +02005184 if has('channel')
5185 nullValues->add([null_channel, 1, 'channel fail', 9, 'channel'])
5186 endif
5187 if has('job')
5188 nullValues->add([null_job, 1, 'no process', 8, 'job'])
5189 endif
Yegappan Lakshmananda9d3452024-05-02 13:02:36 +02005190
5191 for [Val, emptyExp, stringExp, typeExp, typenameExp] in nullValues
5192 assert_equal(emptyExp, empty(Val))
5193 assert_equal(stringExp, string(Val))
5194 assert_equal(typeExp, type(Val))
5195 assert_equal(typenameExp, typename(Val))
5196 assert_equal(Val, copy(Val))
5197 assert_equal(-1, test_refcount(Val))
5198 endfor
5199 END
5200 v9.CheckSourceDefAndScriptSuccess(lines)
5201enddef
5202
Yegappan Lakshmanan1b531722024-05-09 09:12:31 +02005203" Test for using an unknown type in a typecast
5204def Test_unknown_type_in_typecast()
5205 var lines =<< trim END
5206 vim9script
5207 var a = <MyType>b
5208 END
5209 v9.CheckSourceFailure(lines, 'E1010: Type not recognized: MyType', 2)
5210
5211 lines =<< trim END
5212 vim9script
5213 var Fn = <funcx(number, number): number>b
5214 END
5215 v9.CheckSourceFailure(lines, 'E1010: Type not recognized: funcx(number, number): number', 2)
Yegappan Lakshmananfe424d12024-05-17 18:20:43 +02005216
5217 # Wrong type in a type cast
5218 lines =<< trim END
5219 vim9script
5220 var i: number = <number>true
5221 END
5222 v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected number but got bool', 2)
Yegappan Lakshmanan1b531722024-05-09 09:12:31 +02005223enddef
5224
Yegappan Lakshmanane2038412024-12-14 19:59:24 +01005225" Test for calling a function as a method with a list argument
5226" This exercises some conditions in the assignment statement parsing code.
5227def Test_method_call_with_list_arg()
5228 var lines =<< trim END
5229 vim9script
5230
5231 def Foo(l: list<number>)
5232 g:save_list = l
5233 enddef
5234
5235 def Bar()
5236 var a = 10
5237 var b = 20
5238 [a, b]->Foo()
5239 enddef
5240
5241 g:save_list = []
5242 Bar()
5243 assert_equal([10, 20], g:save_list)
5244 END
5245 v9.CheckSourceSuccess(lines)
5246enddef
5247
Bram Moolenaar585fea72020-04-02 22:33:21 +02005248" Keep this last, it messes up highlighting.
5249def Test_substitute_cmd()
5250 new
5251 setline(1, 'something')
5252 :substitute(some(other(
5253 assert_equal('otherthing', getline(1))
5254 bwipe!
5255
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02005256 # also when the context is Vim9 script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02005257 var lines =<< trim END
Bram Moolenaar585fea72020-04-02 22:33:21 +02005258 vim9script
5259 new
5260 setline(1, 'something')
5261 :substitute(some(other(
5262 assert_equal('otherthing', getline(1))
5263 bwipe!
5264 END
Bram Moolenaardd674772022-09-15 22:26:18 +01005265 writefile(lines, 'Xvim9lines', 'D')
Bram Moolenaar585fea72020-04-02 22:33:21 +02005266 source Xvim9lines
Bram Moolenaar585fea72020-04-02 22:33:21 +02005267enddef
5268
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01005269" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker