blob: d6be8cb693cae80c06a4a2368a9aa25d93e7f7ae [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
461def Test_autocommand_block()
462 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
472def Test_command_block()
473 au BufNew *.xml {
474 g:otherVar = 'other'
475 }
476 split other.xml
477 assert_equal('other', g:otherVar)
478
479 bwipe!
480 au! BufNew *.xml
481 unlet g:otherVar
482enddef
483
Bram Moolenaard032f342020-07-18 18:13:02 +0200484func g:NoSuchFunc()
485 echo 'none'
486endfunc
487
Bram Moolenaar9e1d9e32021-01-11 20:17:34 +0100488def Test_try_catch_throw()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200489 var l = []
Bram Moolenaar7a092242020-04-16 22:10:49 +0200490 try # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100491 add(l, '1')
492 throw 'wrong'
Bram Moolenaar9d383f32023-05-14 21:38:12 +0100493 add(l, '2') # "unreachable code"
Bram Moolenaar7a092242020-04-16 22:10:49 +0200494 catch # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100495 add(l, v:exception)
Bram Moolenaar7a092242020-04-16 22:10:49 +0200496 finally # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100497 add(l, '3')
Bram Moolenaar7a092242020-04-16 22:10:49 +0200498 endtry # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100499 assert_equal(['1', 'wrong', '3'], l)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200500
Bram Moolenaare8593122020-07-18 15:17:02 +0200501 l = []
502 try
503 try
504 add(l, '1')
505 throw 'wrong'
Bram Moolenaar9d383f32023-05-14 21:38:12 +0100506 add(l, '2') # "unreachable code"
Bram Moolenaare8593122020-07-18 15:17:02 +0200507 catch /right/
508 add(l, v:exception)
509 endtry
510 catch /wrong/
511 add(l, 'caught')
Bram Moolenaar204852a2022-03-05 12:56:44 +0000512 finally
Bram Moolenaare8593122020-07-18 15:17:02 +0200513 add(l, 'finally')
514 endtry
515 assert_equal(['1', 'caught', 'finally'], l)
516
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200517 var n: number
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200518 try
519 n = l[3]
520 catch /E684:/
521 n = 99
522 endtry
523 assert_equal(99, n)
524
Bram Moolenaar69f70502021-01-01 16:10:46 +0100525 var done = 'no'
526 if 0
527 try | catch | endtry
528 else
529 done = 'yes'
530 endif
531 assert_equal('yes', done)
532
533 done = 'no'
534 if 1
535 done = 'yes'
536 else
537 try | catch | endtry
538 done = 'never'
539 endif
540 assert_equal('yes', done)
541
542 if 1
543 else
544 try | catch /pat/ | endtry
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000545 try | catch /pat/
Bram Moolenaar69f70502021-01-01 16:10:46 +0100546 endtry
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000547 try
Bram Moolenaar69f70502021-01-01 16:10:46 +0100548 catch /pat/ | endtry
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000549 try
550 catch /pat/
Bram Moolenaar69f70502021-01-01 16:10:46 +0100551 endtry
552 endif
553
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200554 try
Bram Moolenaarcc673e72020-08-16 17:33:35 +0200555 # string slice returns a string, not a number
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200556 n = g:astring[3]
Bram Moolenaar5e654232020-09-16 15:22:00 +0200557 catch /E1012:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200558 n = 77
559 endtry
560 assert_equal(77, n)
561
562 try
563 n = l[g:astring]
Bram Moolenaar5e654232020-09-16 15:22:00 +0200564 catch /E1012:/
Bram Moolenaar56acb092020-08-16 14:48:19 +0200565 n = 88
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200566 endtry
Bram Moolenaar56acb092020-08-16 14:48:19 +0200567 assert_equal(88, n)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200568
569 try
570 n = s:does_not_exist
571 catch /E121:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200572 n = 111
573 endtry
574 assert_equal(111, n)
575
576 try
577 n = g:does_not_exist
578 catch /E121:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200579 n = 121
580 endtry
581 assert_equal(121, n)
582
Bram Moolenaare0de1712020-12-02 17:36:54 +0100583 var d = {one: 1}
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200584 try
585 n = d[g:astring]
586 catch /E716:/
587 n = 222
588 endtry
589 assert_equal(222, n)
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200590
591 try
592 n = -g:astring
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200593 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200594 n = 233
595 endtry
596 assert_equal(233, n)
597
598 try
599 n = +g:astring
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200600 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200601 n = 244
602 endtry
603 assert_equal(244, n)
604
605 try
606 n = +g:alist
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200607 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200608 n = 255
609 endtry
610 assert_equal(255, n)
611
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200612 var nd: dict<any>
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200613 try
Bram Moolenaar2e5910b2021-02-03 17:41:24 +0100614 nd = {[g:alist]: 1}
615 catch /E1105:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200616 n = 266
617 endtry
618 assert_equal(266, n)
619
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000620 l = [1, 2, 3]
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200621 try
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +0000622 [n] = l
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200623 catch /E1093:/
624 n = 277
625 endtry
626 assert_equal(277, n)
627
Bram Moolenaare8593122020-07-18 15:17:02 +0200628 try
629 &ts = g:astring
Bram Moolenaar5e654232020-09-16 15:22:00 +0200630 catch /E1012:/
Bram Moolenaare8593122020-07-18 15:17:02 +0200631 n = 288
632 endtry
633 assert_equal(288, n)
634
635 try
636 &backspace = 'asdf'
637 catch /E474:/
638 n = 299
639 endtry
640 assert_equal(299, n)
641
642 l = [1]
643 try
644 l[3] = 3
645 catch /E684:/
646 n = 300
647 endtry
648 assert_equal(300, n)
649
650 try
Bram Moolenaare8593122020-07-18 15:17:02 +0200651 unlet g:does_not_exist
652 catch /E108:/
653 n = 322
654 endtry
655 assert_equal(322, n)
656
657 try
Bram Moolenaar2bede172020-11-19 18:53:18 +0100658 d = {text: 1, [g:astring]: 2}
Bram Moolenaare8593122020-07-18 15:17:02 +0200659 catch /E721:/
660 n = 333
661 endtry
662 assert_equal(333, n)
663
664 try
Bram Moolenaar62aec932022-01-29 21:45:34 +0000665 l = g:DeletedFunc()
Bram Moolenaare8593122020-07-18 15:17:02 +0200666 catch /E933:/
667 n = 344
668 endtry
669 assert_equal(344, n)
Bram Moolenaard032f342020-07-18 18:13:02 +0200670
671 try
Yegappan Lakshmanana764e732021-07-25 15:57:32 +0200672 echo range(1, 2, 0)
673 catch /E726:/
Bram Moolenaard032f342020-07-18 18:13:02 +0200674 n = 355
675 endtry
676 assert_equal(355, n)
677
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200678 var P = function('g:NoSuchFunc')
Bram Moolenaard032f342020-07-18 18:13:02 +0200679 delfunc g:NoSuchFunc
680 try
681 echo P()
682 catch /E117:/
683 n = 366
684 endtry
685 assert_equal(366, n)
686
687 try
688 echo g:NoSuchFunc()
689 catch /E117:/
690 n = 377
691 endtry
692 assert_equal(377, n)
693
694 try
695 echo g:alist + 4
696 catch /E745:/
697 n = 388
698 endtry
699 assert_equal(388, n)
700
701 try
702 echo 4 + g:alist
703 catch /E745:/
704 n = 399
705 endtry
706 assert_equal(399, n)
707
708 try
709 echo g:alist.member
710 catch /E715:/
711 n = 400
712 endtry
713 assert_equal(400, n)
714
715 try
716 echo d.member
717 catch /E716:/
718 n = 411
719 endtry
720 assert_equal(411, n)
Bram Moolenaard9d77892021-02-12 21:32:47 +0100721
722 var counter = 0
723 for i in range(4)
724 try
725 eval [][0]
726 catch
727 endtry
728 counter += 1
729 endfor
730 assert_equal(4, counter)
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100731
Bram Moolenaar9fa5dab2021-07-20 19:18:44 +0200732 # no requirement for spaces before |
733 try|echo 0|catch|endtry
734
Bram Moolenaar003312b2021-12-20 10:55:35 +0000735 # return in try with finally
736 def ReturnInTry(): number
737 var ret = 4
738 try
739 return ret
740 catch /this/
741 return -1
742 catch /that/
743 return -1
744 finally
745 # changing ret has no effect
746 ret = 7
747 endtry
748 return -2
749 enddef
750 assert_equal(4, ReturnInTry())
751
752 # return in catch with finally
753 def ReturnInCatch(): number
754 var ret = 5
755 try
756 throw 'getout'
Bram Moolenaar9d383f32023-05-14 21:38:12 +0100757 return -1 # "unreachable code"
Bram Moolenaar003312b2021-12-20 10:55:35 +0000758 catch /getout/
759 # ret is evaluated here
760 return ret
761 finally
762 # changing ret later has no effect
763 ret = -3
764 endtry
765 return -2
766 enddef
767 assert_equal(5, ReturnInCatch())
768
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100769 # return in finally after empty catch
770 def ReturnInFinally(): number
771 try
772 finally
Bram Moolenaar003312b2021-12-20 10:55:35 +0000773 return 6
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100774 endtry
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100775 enddef
Bram Moolenaar003312b2021-12-20 10:55:35 +0000776 assert_equal(6, ReturnInFinally())
Bram Moolenaar8ac681a2021-06-15 20:06:34 +0200777
778 var lines =<< trim END
779 vim9script
780 try
781 acos('0.5')
782 ->setline(1)
783 catch
784 g:caught = v:exception
785 endtry
786 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000787 v9.CheckScriptSuccess(lines)
Yegappan Lakshmanan4490ec42021-07-27 22:00:44 +0200788 assert_match('E1219: Float or Number required for argument 1', g:caught)
Bram Moolenaar8ac681a2021-06-15 20:06:34 +0200789 unlet g:caught
Bram Moolenaar41978282021-07-04 14:47:30 +0200790
791 # missing catch and/or finally
792 lines =<< trim END
793 vim9script
794 try
795 echo 'something'
796 endtry
797 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000798 v9.CheckScriptFailure(lines, 'E1032:')
rbtnn84934992021-08-07 13:26:53 +0200799
800 # skipping try-finally-endtry when try-finally-endtry is used in another block
801 lines =<< trim END
802 if v:true
803 try
804 finally
805 endtry
806 else
807 try
808 finally
809 endtry
810 endif
811 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000812 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100813enddef
814
Bram Moolenaar3ef2e412023-04-30 18:50:48 +0100815def Test_throw_in_nested_try()
816 var lines =<< trim END
817 vim9script
818
819 def Try(F: func(): void)
820 try
821 F()
822 catch
823 endtry
824 enddef
825
826 class X
827 def F()
828 try
829 throw 'Foobar'
830 catch
831 throw v:exception
832 endtry
833 enddef
834 endclass
835
836 def Test_TryMethod()
837 var x = X.new()
838 Try(() => x.F())
839 enddef
840
841
842 try
843 Test_TryMethod()
844 catch
845 endtry
846 END
847 v9.CheckScriptSuccess(lines)
848enddef
849
Bram Moolenaar28bf6492022-03-03 15:11:20 +0000850def Test_try_var_decl()
851 var lines =<< trim END
852 vim9script
853 try
854 var in_try = 1
855 assert_equal(1, get(s:, 'in_try', -1))
856 throw "getout"
857 catch
858 var in_catch = 2
859 assert_equal(-1, get(s:, 'in_try', -1))
860 assert_equal(2, get(s:, 'in_catch', -1))
861 finally
862 var in_finally = 3
863 assert_equal(-1, get(s:, 'in_try', -1))
864 assert_equal(-1, get(s:, 'in_catch', -1))
865 assert_equal(3, get(s:, 'in_finally', -1))
866 endtry
867 assert_equal(-1, get(s:, 'in_try', -1))
868 assert_equal(-1, get(s:, 'in_catch', -1))
869 assert_equal(-1, get(s:, 'in_finally', -1))
870 END
871 v9.CheckScriptSuccess(lines)
872enddef
873
Bram Moolenaar53c29612022-01-12 16:18:18 +0000874def Test_try_ends_in_return()
875 var lines =<< trim END
876 vim9script
877 def Foo(): string
878 try
879 return 'foo'
880 catch
881 return 'caught'
882 endtry
883 enddef
884 assert_equal('foo', Foo())
885 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000886 v9.CheckScriptSuccess(lines)
Bram Moolenaar53c29612022-01-12 16:18:18 +0000887
888 lines =<< trim END
889 vim9script
890 def Foo(): string
891 try
892 return 'foo'
893 catch
894 return 'caught'
895 endtry
896 echo 'notreached'
897 enddef
898 assert_equal('foo', Foo())
899 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000900 v9.CheckScriptFailure(lines, 'E1095:')
Bram Moolenaar53c29612022-01-12 16:18:18 +0000901
902 lines =<< trim END
903 vim9script
904 def Foo(): string
905 try
906 return 'foo'
907 catch /x/
908 return 'caught'
909 endtry
910 enddef
911 assert_equal('foo', Foo())
912 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000913 v9.CheckScriptFailure(lines, 'E1027:')
Bram Moolenaar53c29612022-01-12 16:18:18 +0000914
915 lines =<< trim END
916 vim9script
917 def Foo(): string
918 try
919 echo 'foo'
920 catch
921 echo 'caught'
922 finally
923 return 'done'
924 endtry
925 enddef
926 assert_equal('done', Foo())
927 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000928 v9.CheckScriptSuccess(lines)
Bram Moolenaar53c29612022-01-12 16:18:18 +0000929
930enddef
931
Bram Moolenaar3f987b52021-06-30 12:02:24 +0200932def Test_try_in_catch()
933 var lines =<< trim END
934 vim9script
935 var seq = []
936 def DoIt()
937 try
938 seq->add('throw 1')
939 eval [][0]
940 seq->add('notreached')
941 catch
942 seq->add('catch')
943 try
944 seq->add('throw 2')
945 eval [][0]
946 seq->add('notreached')
947 catch /nothing/
948 seq->add('notreached')
949 endtry
950 seq->add('done')
951 endtry
952 enddef
953 DoIt()
954 assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq)
955 END
956enddef
957
Bram Moolenaard3d8fee2021-06-30 19:54:43 +0200958def Test_error_in_catch()
959 var lines =<< trim END
960 try
961 eval [][0]
962 catch /E684:/
963 eval [][0]
964 endtry
965 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000966 v9.CheckDefExecFailure(lines, 'E684:', 4)
Bram Moolenaard3d8fee2021-06-30 19:54:43 +0200967enddef
968
Bram Moolenaar2e34c342021-03-14 12:13:33 +0100969" :while at the very start of a function that :continue jumps to
Bram Moolenaar62aec932022-01-29 21:45:34 +0000970def s:TryContinueFunc()
Bram Moolenaar2e34c342021-03-14 12:13:33 +0100971 while g:Count < 2
972 g:sequence ..= 't'
973 try
974 echoerr 'Test'
975 catch
976 g:Count += 1
977 g:sequence ..= 'c'
978 continue
979 endtry
980 g:sequence ..= 'e'
981 g:Count += 1
982 endwhile
983enddef
984
985def Test_continue_in_try_in_while()
986 g:Count = 0
987 g:sequence = ''
988 TryContinueFunc()
989 assert_equal('tctc', g:sequence)
990 unlet g:Count
991 unlet g:sequence
992enddef
993
Bram Moolenaar873f8242022-03-10 21:53:44 +0000994def Test_break_in_try_in_for()
995 var lines =<< trim END
996 vim9script
997 def Ls(): list<string>
998 var ls: list<string>
999 for s in ['abc', 'def']
1000 for _ in [123, 456]
1001 try
1002 eval [][0]
1003 catch
1004 break
1005 endtry
1006 endfor
1007 ls += [s]
1008 endfor
1009 return ls
1010 enddef
1011 assert_equal(['abc', 'def'], Ls())
1012 END
1013 v9.CheckScriptSuccess(lines)
1014enddef
1015
Bram Moolenaar9cb577a2021-02-22 22:45:10 +01001016def Test_nocatch_return_in_try()
1017 # return in try block returns normally
1018 def ReturnInTry(): string
1019 try
1020 return '"some message"'
1021 catch
1022 endtry
1023 return 'not reached'
1024 enddef
1025 exe 'echoerr ' .. ReturnInTry()
1026enddef
1027
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001028def Test_cnext_works_in_catch()
1029 var lines =<< trim END
1030 vim9script
Bram Moolenaarc3235272021-07-10 19:42:03 +02001031 au BufEnter * eval 1 + 2
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001032 writefile(['text'], 'Xcncfile1')
1033 writefile(['text'], 'Xcncfile2')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001034 var items = [
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001035 {lnum: 1, filename: 'Xcncfile1', valid: true},
1036 {lnum: 1, filename: 'Xcncfile2', valid: true}
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001037 ]
1038 setqflist([], ' ', {items: items})
1039 cwindow
1040
1041 def CnextOrCfirst()
1042 # if cnext fails, cfirst is used
1043 try
1044 cnext
1045 catch
1046 cfirst
1047 endtry
1048 enddef
1049
1050 CnextOrCfirst()
1051 CnextOrCfirst()
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001052 writefile([getqflist({idx: 0}).idx], 'Xcncresult')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001053 qall
1054 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001055 writefile(lines, 'XCatchCnext', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001056 g:RunVim([], [], '--clean -S XCatchCnext')
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001057 assert_equal(['1'], readfile('Xcncresult'))
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001058
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001059 delete('Xcncfile1')
1060 delete('Xcncfile2')
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001061 delete('Xcncresult')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001062enddef
1063
Bram Moolenaar9e1d9e32021-01-11 20:17:34 +01001064def Test_throw_skipped()
1065 if 0
1066 throw dontgethere
1067 endif
1068enddef
1069
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001070def Test_nocatch_throw_silenced()
1071 var lines =<< trim END
1072 vim9script
1073 def Func()
1074 throw 'error'
1075 enddef
1076 silent! Func()
1077 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001078 writefile(lines, 'XthrowSilenced', 'D')
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001079 source XthrowSilenced
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001080enddef
1081
Bram Moolenaare8593122020-07-18 15:17:02 +02001082def DeletedFunc(): list<any>
1083 return ['delete me']
1084enddef
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001085defcompile DeletedFunc
1086
1087call test_override('unreachable', 1)
1088defcompile Test_try_catch_throw
1089call test_override('unreachable', 0)
1090
Bram Moolenaare8593122020-07-18 15:17:02 +02001091delfunc DeletedFunc
1092
Bram Moolenaar62aec932022-01-29 21:45:34 +00001093def s:ThrowFromDef()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001094 throw "getout" # comment
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001095enddef
1096
Bram Moolenaar62aec932022-01-29 21:45:34 +00001097func s:CatchInFunc()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001098 try
Bram Moolenaar62aec932022-01-29 21:45:34 +00001099 call s:ThrowFromDef()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001100 catch
1101 let g:thrown_func = v:exception
1102 endtry
1103endfunc
1104
Bram Moolenaar62aec932022-01-29 21:45:34 +00001105def s:CatchInDef()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001106 try
1107 ThrowFromDef()
1108 catch
1109 g:thrown_def = v:exception
1110 endtry
1111enddef
1112
Bram Moolenaar62aec932022-01-29 21:45:34 +00001113def s:ReturnFinally(): string
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001114 try
1115 return 'intry'
Bram Moolenaar204852a2022-03-05 12:56:44 +00001116 finally
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001117 g:in_finally = 'finally'
1118 endtry
1119 return 'end'
1120enddef
1121
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001122def Test_try_catch_nested()
1123 CatchInFunc()
1124 assert_equal('getout', g:thrown_func)
1125
1126 CatchInDef()
1127 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001128
1129 assert_equal('intry', ReturnFinally())
1130 assert_equal('finally', g:in_finally)
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001131
1132 var l = []
1133 try
1134 l->add('1')
1135 throw 'bad'
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001136 l->add('x') # "unreachable code"
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001137 catch /bad/
1138 l->add('2')
1139 try
1140 l->add('3')
1141 throw 'one'
1142 l->add('x')
1143 catch /one/
1144 l->add('4')
1145 try
1146 l->add('5')
1147 throw 'more'
1148 l->add('x')
1149 catch /more/
1150 l->add('6')
1151 endtry
1152 endtry
1153 endtry
1154 assert_equal(['1', '2', '3', '4', '5', '6'], l)
Bram Moolenaar834193a2021-06-30 20:39:15 +02001155
1156 l = []
1157 try
1158 try
1159 l->add('1')
1160 throw 'foo'
1161 l->add('x')
1162 catch
1163 l->add('2')
1164 throw 'bar'
1165 l->add('x')
1166 finally
1167 l->add('3')
1168 endtry
1169 l->add('x')
1170 catch /bar/
1171 l->add('4')
1172 endtry
1173 assert_equal(['1', '2', '3', '4'], l)
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001174enddef
1175
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001176call test_override('unreachable', 1)
1177defcompile Test_try_catch_nested
1178call test_override('unreachable', 0)
1179
Bram Moolenaar62aec932022-01-29 21:45:34 +00001180def s:TryOne(): number
Bram Moolenaar9939f572020-09-16 22:29:52 +02001181 try
1182 return 0
1183 catch
1184 endtry
1185 return 0
1186enddef
1187
Bram Moolenaar62aec932022-01-29 21:45:34 +00001188def s:TryTwo(n: number): string
Bram Moolenaar9939f572020-09-16 22:29:52 +02001189 try
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001190 var x = {}
Bram Moolenaar9939f572020-09-16 22:29:52 +02001191 catch
1192 endtry
1193 return 'text'
1194enddef
1195
1196def Test_try_catch_twice()
1197 assert_equal('text', TryOne()->TryTwo())
1198enddef
1199
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001200def Test_try_catch_match()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001201 var seq = 'a'
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001202 try
1203 throw 'something'
1204 catch /nothing/
1205 seq ..= 'x'
1206 catch /some/
1207 seq ..= 'b'
1208 catch /asdf/
1209 seq ..= 'x'
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001210 catch ?a\?sdf?
1211 seq ..= 'y'
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001212 finally
1213 seq ..= 'c'
1214 endtry
1215 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001216enddef
1217
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001218def Test_try_catch_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001219 v9.CheckDefFailure(['catch'], 'E603:')
1220 v9.CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1221 v9.CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1222 v9.CheckDefFailure(['finally'], 'E606:')
1223 v9.CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1224 v9.CheckDefFailure(['endtry'], 'E602:')
1225 v9.CheckDefFailure(['while 1', 'endtry'], 'E170:')
1226 v9.CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1227 v9.CheckDefFailure(['if 1', 'endtry'], 'E171:')
1228 v9.CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001229
Bram Moolenaar62aec932022-01-29 21:45:34 +00001230 v9.CheckDefFailure(['throw'], 'E1143:')
1231 v9.CheckDefFailure(['throw xxx'], 'E1001:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001232enddef
1233
Bram Moolenaar7c5b3c0362021-02-14 22:40:57 +01001234def Try_catch_skipped()
1235 var l = []
1236 try
1237 finally
1238 endtry
1239
1240 if 1
1241 else
1242 try
1243 endtry
1244 endif
1245enddef
1246
1247" The skipped try/endtry was updating the wrong instruction.
1248def Test_try_catch_skipped()
1249 var instr = execute('disassemble Try_catch_skipped')
1250 assert_match("NEWLIST size 0\n", instr)
1251enddef
1252
Bram Moolenaar90a57162022-02-12 14:23:17 +00001253def Test_throw_line_number()
1254 def Func()
1255 eval 1 + 1
1256 eval 2 + 2
1257 throw 'exception'
1258 enddef
1259 try
1260 Func()
1261 catch /exception/
1262 assert_match('line 3', v:throwpoint)
1263 endtry
1264enddef
Bram Moolenaar7c5b3c0362021-02-14 22:40:57 +01001265
1266
Bram Moolenaar006ad482020-06-30 20:55:15 +02001267def Test_throw_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001268 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001269 var lines =<< trim END
Bram Moolenaar006ad482020-06-30 20:55:15 +02001270 vim9script
1271 try
1272 throw 'one'
1273 .. 'two'
1274 catch
1275 assert_equal('onetwo', v:exception)
1276 endtry
1277 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001278 v9.CheckScriptSuccess(lines)
Bram Moolenaar1e021e62020-10-16 20:25:23 +02001279
1280 lines =<< trim END
1281 vim9script
Bram Moolenaar352134b2020-10-17 22:04:08 +02001282 @r = ''
Bram Moolenaar1e021e62020-10-16 20:25:23 +02001283 def Func()
1284 throw @r
1285 enddef
1286 var result = ''
1287 try
1288 Func()
1289 catch /E1129:/
1290 result = 'caught'
1291 endtry
1292 assert_equal('caught', result)
1293 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001294 v9.CheckScriptSuccess(lines)
Bram Moolenaar006ad482020-06-30 20:55:15 +02001295enddef
1296
Bram Moolenaared677f52020-08-12 16:38:10 +02001297def Test_error_in_nested_function()
Bram Moolenaar03dfde22021-02-14 13:17:22 +01001298 # an error in a nested :function aborts executing in the calling :def function
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001299 var lines =<< trim END
Bram Moolenaared677f52020-08-12 16:38:10 +02001300 vim9script
1301 def Func()
1302 Error()
1303 g:test_var = 1
1304 enddef
1305 func Error() abort
1306 eval [][0]
1307 endfunc
1308 Func()
1309 END
1310 g:test_var = 0
Bram Moolenaar62aec932022-01-29 21:45:34 +00001311 v9.CheckScriptFailure(lines, 'E684:')
Bram Moolenaared677f52020-08-12 16:38:10 +02001312 assert_equal(0, g:test_var)
1313enddef
1314
Bram Moolenaar227c58a2021-04-28 20:40:44 +02001315def Test_abort_after_error()
1316 var lines =<< trim END
1317 vim9script
1318 while true
1319 echo notfound
1320 endwhile
1321 g:gotthere = true
1322 END
1323 g:gotthere = false
Bram Moolenaar62aec932022-01-29 21:45:34 +00001324 v9.CheckScriptFailure(lines, 'E121:')
Bram Moolenaar227c58a2021-04-28 20:40:44 +02001325 assert_false(g:gotthere)
1326 unlet g:gotthere
1327enddef
1328
Bram Moolenaar37c83712020-06-30 21:18:36 +02001329def Test_cexpr_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001330 # only checks line continuation
Bram Moolenaar37c83712020-06-30 21:18:36 +02001331 set errorformat=File\ %f\ line\ %l
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001332 var lines =<< trim END
Bram Moolenaar37c83712020-06-30 21:18:36 +02001333 vim9script
1334 cexpr 'File'
1335 .. ' someFile' ..
1336 ' line 19'
1337 assert_equal(19, getqflist()[0].lnum)
1338 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001339 v9.CheckScriptSuccess(lines)
Bram Moolenaar397a87a2022-03-20 21:14:15 +00001340
1341 lines =<< trim END
1342 vim9script
1343 def CexprFail()
1344 au QuickfixCmdPre * echo g:doesnotexist
1345 cexpr 'File otherFile line 99'
1346 g:didContinue = 'yes'
1347 enddef
1348 CexprFail()
1349 g:didContinue = 'also'
1350 END
1351 g:didContinue = 'no'
1352 v9.CheckScriptFailure(lines, 'E121: Undefined variable: g:doesnotexist')
1353 assert_equal('no', g:didContinue)
1354 au! QuickfixCmdPre
1355
1356 lines =<< trim END
1357 vim9script
1358 def CexprFail()
1359 cexpr g:aNumber
1360 g:didContinue = 'yes'
1361 enddef
1362 CexprFail()
1363 g:didContinue = 'also'
1364 END
1365 g:aNumber = 123
1366 g:didContinue = 'no'
1367 v9.CheckScriptFailure(lines, 'E777: String or List expected')
1368 assert_equal('no', g:didContinue)
1369 unlet g:didContinue
1370
Bram Moolenaar37c83712020-06-30 21:18:36 +02001371 set errorformat&
1372enddef
1373
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001374def Test_statusline_syntax()
1375 # legacy syntax is used for 'statusline'
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001376 var lines =<< trim END
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001377 vim9script
1378 func g:Status()
1379 return '%{"x" is# "x"}'
1380 endfunc
1381 set laststatus=2 statusline=%!Status()
1382 redrawstatus
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00001383 set laststatus statusline=
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001384 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001385 v9.CheckScriptSuccess(lines)
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001386enddef
1387
Bram Moolenaarb2097502020-07-19 17:17:02 +02001388def Test_list_vimscript()
1389 # checks line continuation and comments
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001390 var lines =<< trim END
Bram Moolenaarb2097502020-07-19 17:17:02 +02001391 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001392 var mylist = [
Bram Moolenaarb2097502020-07-19 17:17:02 +02001393 'one',
1394 # comment
1395 'two', # empty line follows
1396
1397 'three',
1398 ]
1399 assert_equal(['one', 'two', 'three'], mylist)
1400 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001401 v9.CheckScriptSuccess(lines)
Bram Moolenaar66250c92020-08-20 15:02:42 +02001402
1403 # check all lines from heredoc are kept
1404 lines =<< trim END
1405 # comment 1
1406 two
1407 # comment 3
1408
1409 five
1410 # comment 6
1411 END
1412 assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
Bram Moolenaar4bce26b2021-01-22 22:06:56 +01001413
1414 lines =<< trim END
1415 [{
1416 a: 0}]->string()->assert_equal("[{'a': 0}]")
1417 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001418 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarb2097502020-07-19 17:17:02 +02001419enddef
1420
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001421if has('channel')
1422 let someJob = test_null_job()
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001423
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001424 def FuncWithError()
1425 echomsg g:someJob
1426 enddef
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001427
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001428 func Test_convert_emsg_to_exception()
1429 try
1430 call FuncWithError()
1431 catch
1432 call assert_match('Vim:E908:', v:exception)
1433 endtry
1434 endfunc
1435endif
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001436
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001437def Test_vim9script_mix()
1438 var lines =<< trim END
1439 if has(g:feature)
1440 " legacy script
1441 let g:legacy = 1
1442 finish
1443 endif
1444 vim9script
1445 g:legacy = 0
1446 END
1447 g:feature = 'eval'
1448 g:legacy = -1
Bram Moolenaar62aec932022-01-29 21:45:34 +00001449 v9.CheckScriptSuccess(lines)
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001450 assert_equal(1, g:legacy)
1451
1452 g:feature = 'noteval'
1453 g:legacy = -1
Bram Moolenaar62aec932022-01-29 21:45:34 +00001454 v9.CheckScriptSuccess(lines)
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001455 assert_equal(0, g:legacy)
1456enddef
1457
Bram Moolenaar750802b2020-02-23 18:08:33 +01001458def Test_vim9script_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001459 v9.CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
1460 v9.CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +01001461
Bram Moolenaar62aec932022-01-29 21:45:34 +00001462 v9.CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1463 v9.CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
Bram Moolenaarc785b9a2020-06-19 18:34:15 +02001464
Bram Moolenaare2e40752020-09-04 21:18:46 +02001465 assert_fails('vim9script', 'E1038:')
Bram Moolenaar107f7322022-02-06 17:30:41 +00001466 v9.CheckDefFailure(['vim9script'], 'E1038:')
Bram Moolenaar8cbf2492022-02-06 20:28:13 +00001467
1468 # no error when skipping
1469 if has('nothing')
1470 vim9script
1471 endif
Bram Moolenaarc970e422021-03-17 15:03:04 +01001472enddef
1473
Bram Moolenaar6c3843c2021-03-04 12:38:21 +01001474def Test_script_var_shadows_function()
1475 var lines =<< trim END
1476 vim9script
1477 def Func(): number
1478 return 123
1479 enddef
1480 var Func = 1
1481 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001482 v9.CheckScriptFailure(lines, 'E1041:', 5)
Bram Moolenaar6c3843c2021-03-04 12:38:21 +01001483enddef
1484
Bram Moolenaar052ff292021-12-11 13:54:46 +00001485def Test_function_shadows_script_var()
1486 var lines =<< trim END
1487 vim9script
1488 var Func = 1
1489 def Func(): number
1490 return 123
1491 enddef
1492 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001493 v9.CheckScriptFailure(lines, 'E1041:', 3)
Bram Moolenaar052ff292021-12-11 13:54:46 +00001494enddef
1495
Bram Moolenaarc3235272021-07-10 19:42:03 +02001496def Test_script_var_shadows_command()
1497 var lines =<< trim END
1498 var undo = 1
1499 undo = 2
1500 assert_equal(2, undo)
1501 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001502 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc3235272021-07-10 19:42:03 +02001503
1504 lines =<< trim END
1505 var undo = 1
1506 undo
1507 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001508 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaarc3235272021-07-10 19:42:03 +02001509enddef
1510
Bram Moolenaar2ef91562021-12-11 16:14:07 +00001511def Test_vim9script_call_wrong_type()
1512 var lines =<< trim END
1513 vim9script
1514 var Time = 'localtime'
1515 Time()
1516 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001517 v9.CheckScriptFailure(lines, 'E1085:')
Bram Moolenaar2ef91562021-12-11 16:14:07 +00001518enddef
1519
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001520def Test_vim9script_reload_delfunc()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001521 var first_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001522 vim9script
1523 def FuncYes(): string
1524 return 'yes'
1525 enddef
1526 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001527 var withno_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001528 def FuncNo(): string
1529 return 'no'
1530 enddef
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001531 def g:DoCheck(no_exists: bool)
1532 assert_equal('yes', FuncYes())
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001533 assert_equal('no', FuncNo())
1534 enddef
1535 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001536 var nono_lines =<< trim END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001537 def g:DoCheck(no_exists: bool)
1538 assert_equal('yes', FuncYes())
Bram Moolenaar44d66522020-09-06 22:26:57 +02001539 assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001540 enddef
1541 END
1542
1543 # FuncNo() is defined
Bram Moolenaardd674772022-09-15 22:26:18 +01001544 writefile(first_lines + withno_lines, 'Xreloaded.vim', 'D')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001545 source Xreloaded.vim
1546 g:DoCheck(true)
1547
1548 # FuncNo() is not redefined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001549 writefile(first_lines + nono_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001550 source Xreloaded.vim
Bram Moolenaar50824712020-12-20 21:10:17 +01001551 g:DoCheck(false)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001552
1553 # FuncNo() is back
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001554 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001555 source Xreloaded.vim
Bram Moolenaar50824712020-12-20 21:10:17 +01001556 g:DoCheck(false)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001557enddef
1558
Bram Moolenaar89483d42020-05-10 15:24:44 +02001559def Test_vim9script_reload_delvar()
1560 # write the script with a script-local variable
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001561 var lines =<< trim END
Bram Moolenaar89483d42020-05-10 15:24:44 +02001562 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001563 var name = 'string'
Bram Moolenaar89483d42020-05-10 15:24:44 +02001564 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001565 writefile(lines, 'XreloadVar.vim', 'D')
Bram Moolenaar89483d42020-05-10 15:24:44 +02001566 source XreloadVar.vim
1567
1568 # now write the script using the same variable locally - works
1569 lines =<< trim END
1570 vim9script
1571 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001572 var name = 'string'
Bram Moolenaar89483d42020-05-10 15:24:44 +02001573 enddef
1574 END
1575 writefile(lines, 'XreloadVar.vim')
1576 source XreloadVar.vim
Bram Moolenaar89483d42020-05-10 15:24:44 +02001577enddef
1578
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001579def Test_func_redefine_error()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001580 var lines = [
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001581 'vim9script',
1582 'def Func()',
1583 ' eval [][0]',
1584 'enddef',
1585 'Func()',
1586 ]
Bram Moolenaardd674772022-09-15 22:26:18 +01001587 writefile(lines, 'Xtestscript.vim', 'D')
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001588
1589 for count in range(3)
1590 try
1591 source Xtestscript.vim
1592 catch /E684/
1593 # function name should contain <SNR> every time
Bram Moolenaarec892232022-05-06 17:53:06 +01001594 assert_match('E684: List index out of range', v:exception)
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001595 assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1596 endtry
1597 endfor
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001598enddef
1599
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001600def Test_func_redefine_fails()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001601 var lines =<< trim END
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001602 vim9script
1603 def Func()
1604 echo 'one'
1605 enddef
1606 def Func()
1607 echo 'two'
1608 enddef
1609 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001610 v9.CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001611
1612 lines =<< trim END
1613 vim9script
1614 def Foo(): string
1615 return 'foo'
Bram Moolenaar052ff292021-12-11 13:54:46 +00001616 enddef
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001617 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001618 var Foo = {-> 'lambda'}
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001619 enddef
1620 defcompile
1621 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001622 v9.CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001623enddef
1624
Bram Moolenaar91c7cbf2022-08-18 13:28:31 +01001625def Test_lambda_split()
1626 # this was using freed memory, because of the split expression
1627 var lines =<< trim END
1628 vim9script
1629 try
1630 0
1631 0->(0
1632 ->a.0(
1633 ->u
1634 END
1635 v9.CheckScriptFailure(lines, 'E1050:')
1636enddef
1637
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001638def Test_fixed_size_list()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001639 # will be allocated as one piece of memory, check that changes work
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001640 var l = [1, 2, 3, 4]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001641 l->remove(0)
1642 l->add(5)
1643 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001644 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001645enddef
1646
Bram Moolenaarae616492020-07-28 20:07:27 +02001647def Test_no_insert_xit()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001648 v9.CheckDefExecFailure(['a = 1'], 'E1100:')
1649 v9.CheckDefExecFailure(['c = 1'], 'E1100:')
1650 v9.CheckDefExecFailure(['i = 1'], 'E1100:')
1651 v9.CheckDefExecFailure(['t = 1'], 'E1100:')
1652 v9.CheckDefExecFailure(['x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02001653
Bram Moolenaar62aec932022-01-29 21:45:34 +00001654 v9.CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1655 v9.CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1656 v9.CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1657 v9.CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1658 v9.CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1659 v9.CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1660 v9.CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
1661 v9.CheckScriptFailure(['vim9script', 'o'], 'E1100:')
1662 v9.CheckScriptFailure(['vim9script', 't'], 'E1100:')
1663 v9.CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1664 v9.CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02001665enddef
1666
Bram Moolenaar62aec932022-01-29 21:45:34 +00001667def s:IfElse(what: number): string
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001668 var res = ''
Bram Moolenaar158906c2020-02-06 20:39:45 +01001669 if what == 1
1670 res = "one"
1671 elseif what == 2
1672 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001673 else
Bram Moolenaar158906c2020-02-06 20:39:45 +01001674 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001675 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +01001676 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001677enddef
1678
Bram Moolenaar158906c2020-02-06 20:39:45 +01001679def Test_if_elseif_else()
1680 assert_equal('one', IfElse(1))
1681 assert_equal('two', IfElse(2))
1682 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001683enddef
1684
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001685def Test_if_elseif_else_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001686 v9.CheckDefFailure(['elseif true'], 'E582:')
1687 v9.CheckDefFailure(['else'], 'E581:')
1688 v9.CheckDefFailure(['endif'], 'E580:')
1689 v9.CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
1690 v9.CheckDefFailure(['if true', 'echo 1'], 'E171:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01001691
1692 var lines =<< trim END
1693 var s = ''
1694 if s = ''
1695 endif
1696 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001697 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01001698
1699 lines =<< trim END
1700 var s = ''
1701 if s == ''
1702 elseif s = ''
1703 endif
1704 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001705 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaarfa010cd2022-04-03 16:13:07 +01001706
1707 lines =<< trim END
1708 var cond = true
1709 if cond
1710 echo 'true'
1711 elseif
1712 echo 'false'
1713 endif
1714 END
1715 v9.CheckDefAndScriptFailure(lines, ['E1143:', 'E15:'], 4)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001716enddef
1717
Bram Moolenaar505ed0c2022-05-05 17:02:46 +01001718def Test_if_else_func_using_var()
1719 var lines =<< trim END
1720 vim9script
1721
1722 const debug = true
1723 if debug
1724 var mode_chars = 'something'
1725 def Bits2Ascii()
1726 var x = mode_chars
1727 g:where = 'in true'
1728 enddef
1729 else
1730 def Bits2Ascii()
1731 g:where = 'in false'
1732 enddef
1733 endif
1734
1735 Bits2Ascii()
1736 END
1737 v9.CheckScriptSuccess(lines)
1738 assert_equal('in true', g:where)
1739 unlet g:where
1740
1741 lines =<< trim END
1742 vim9script
1743
1744 const debug = false
1745 if debug
1746 var mode_chars = 'something'
1747 def Bits2Ascii()
1748 g:where = 'in true'
1749 enddef
1750 else
1751 def Bits2Ascii()
1752 var x = mode_chars
1753 g:where = 'in false'
1754 enddef
1755 endif
1756
1757 Bits2Ascii()
1758 END
1759 v9.CheckScriptFailure(lines, 'E1001: Variable not found: mode_chars')
1760enddef
1761
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001762let g:bool_true = v:true
1763let g:bool_false = v:false
1764
1765def Test_if_const_expr()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001766 var res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001767 if true ? true : false
1768 res = true
1769 endif
1770 assert_equal(true, res)
1771
Bram Moolenaar585fea72020-04-02 22:33:21 +02001772 g:glob = 2
1773 if false
Bram Moolenaar67979662020-06-20 22:50:47 +02001774 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001775 endif
1776 assert_equal(2, g:glob)
1777 if true
Bram Moolenaar67979662020-06-20 22:50:47 +02001778 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001779 endif
1780 assert_equal(3, g:glob)
1781
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001782 res = false
1783 if g:bool_true ? true : false
1784 res = true
1785 endif
1786 assert_equal(true, res)
1787
1788 res = false
1789 if true ? g:bool_true : false
1790 res = true
1791 endif
1792 assert_equal(true, res)
1793
1794 res = false
1795 if true ? true : g:bool_false
1796 res = true
1797 endif
1798 assert_equal(true, res)
1799
1800 res = false
1801 if true ? false : true
1802 res = true
1803 endif
1804 assert_equal(false, res)
1805
1806 res = false
1807 if false ? false : true
1808 res = true
1809 endif
1810 assert_equal(true, res)
1811
1812 res = false
1813 if false ? true : false
1814 res = true
1815 endif
1816 assert_equal(false, res)
1817
1818 res = false
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001819 if has('xyz') ? true : false
1820 res = true
1821 endif
1822 assert_equal(false, res)
1823
1824 res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001825 if true && true
1826 res = true
1827 endif
1828 assert_equal(true, res)
1829
1830 res = false
1831 if true && false
1832 res = true
1833 endif
1834 assert_equal(false, res)
1835
1836 res = false
1837 if g:bool_true && false
1838 res = true
1839 endif
1840 assert_equal(false, res)
1841
1842 res = false
1843 if true && g:bool_false
1844 res = true
1845 endif
1846 assert_equal(false, res)
1847
1848 res = false
1849 if false && false
1850 res = true
1851 endif
1852 assert_equal(false, res)
1853
1854 res = false
1855 if true || false
1856 res = true
1857 endif
1858 assert_equal(true, res)
1859
1860 res = false
1861 if g:bool_true || false
1862 res = true
1863 endif
1864 assert_equal(true, res)
1865
1866 res = false
1867 if true || g:bool_false
1868 res = true
1869 endif
1870 assert_equal(true, res)
1871
1872 res = false
1873 if false || false
1874 res = true
1875 endif
1876 assert_equal(false, res)
Bram Moolenaar3988f642020-08-27 22:43:03 +02001877
1878 # with constant "false" expression may be invalid so long as the syntax is OK
Bram Moolenaarc3235272021-07-10 19:42:03 +02001879 if false | eval 1 + 2 | endif
Bram Moolenaar3988f642020-08-27 22:43:03 +02001880 if false | eval burp + 234 | endif
1881 if false | echo burp 234 'asd' | endif
1882 if false
1883 burp
1884 endif
Bram Moolenaare525bdd2021-08-07 18:12:40 +02001885
Bram Moolenaar21ebb082022-02-04 21:58:58 +00001886 if 0
1887 if 1
1888 echo nothing
1889 elseif 1
1890 echo still nothing
1891 endif
1892 endif
1893
Bram Moolenaare525bdd2021-08-07 18:12:40 +02001894 # expression with line breaks skipped
1895 if false
1896 ('aaa'
1897 .. 'bbb'
1898 .. 'ccc'
1899 )->setline(1)
1900 endif
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02001901enddef
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001902
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02001903def Test_if_const_expr_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001904 v9.CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1905 v9.CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1906 v9.CheckDefFailure(["if has('aaa'"], 'E110:')
1907 v9.CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001908enddef
1909
Bram Moolenaar62aec932022-01-29 21:45:34 +00001910def s:RunNested(i: number): number
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001911 var x: number = 0
Bram Moolenaar72abcf42020-06-18 18:26:24 +02001912 if i % 2
1913 if 1
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001914 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02001915 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001916 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02001917 endif
1918 x += 1
1919 else
1920 x += 1000
1921 endif
1922 return x
1923enddef
1924
1925def Test_nested_if()
1926 assert_equal(1, RunNested(1))
1927 assert_equal(1000, RunNested(2))
1928enddef
1929
Bram Moolenaarad39c092020-02-26 18:23:43 +01001930def Test_execute_cmd()
Bram Moolenaare4984292020-12-13 14:19:25 +01001931 # missing argument is ignored
1932 execute
1933 execute # comment
1934
Bram Moolenaarad39c092020-02-26 18:23:43 +01001935 new
1936 setline(1, 'default')
Bram Moolenaard2c61702020-09-06 15:58:36 +02001937 execute 'setline(1, "execute-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001938 assert_equal('execute-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001939
Bram Moolenaard2c61702020-09-06 15:58:36 +02001940 execute "setline(1, 'execute-string')"
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001941 assert_equal('execute-string', getline(1))
1942
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001943 var cmd1 = 'setline(1,'
1944 var cmd2 = '"execute-var")'
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001945 execute cmd1 cmd2 # comment
Bram Moolenaarad39c092020-02-26 18:23:43 +01001946 assert_equal('execute-var', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001947
Bram Moolenaard2c61702020-09-06 15:58:36 +02001948 execute cmd1 cmd2 '|setline(1, "execute-var-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001949 assert_equal('execute-var-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001950
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001951 var cmd_first = 'call '
1952 var cmd_last = 'setline(1, "execute-var-var")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001953 execute cmd_first .. cmd_last
1954 assert_equal('execute-var-var', getline(1))
1955 bwipe!
Bram Moolenaar585fea72020-04-02 22:33:21 +02001956
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001957 var n = true
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02001958 execute 'echomsg' (n ? '"true"' : '"no"')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001959 assert_match('^true$', g:Screenline(&lines))
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02001960
Bram Moolenaare0de1712020-12-02 17:36:54 +01001961 echomsg [1, 2, 3] {a: 1, b: 2}
Bram Moolenaar62aec932022-01-29 21:45:34 +00001962 assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', g:Screenline(&lines))
Bram Moolenaare5abf7a2020-08-16 18:29:35 +02001963
Bram Moolenaar62aec932022-01-29 21:45:34 +00001964 v9.CheckDefFailure(['execute xxx'], 'E1001:', 1)
1965 v9.CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
1966 v9.CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
Bram Moolenaar0c7f2612022-02-17 19:44:07 +00001967 if has('channel')
1968 v9.CheckDefExecFailure(['execute test_null_channel()'], 'E908:', 1)
1969 endif
Bram Moolenaarad39c092020-02-26 18:23:43 +01001970enddef
1971
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001972def Test_execute_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001973 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001974 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001975 vim9script
1976 execute 'g:someVar'
1977 .. ' = ' ..
1978 '28'
1979 assert_equal(28, g:someVar)
1980 unlet g:someVar
1981 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001982 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001983enddef
1984
Bram Moolenaar43216612022-03-25 11:16:28 +00001985def Test_execute_finish()
1986 # the empty lines are relevant here
1987 var lines =<< trim END
1988 vim9script
1989
1990 var vname = "g:hello"
1991
1992 if exists(vname) | finish | endif | execute vname '= "world"'
1993
1994 assert_equal('world', g:hello)
1995
1996 if exists(vname) | finish | endif | execute vname '= "world"'
1997
1998 assert_report('should not be reached')
1999 END
2000 v9.CheckScriptSuccess(lines)
2001enddef
2002
Bram Moolenaarad39c092020-02-26 18:23:43 +01002003def Test_echo_cmd()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002004 echo 'some' # comment
Bram Moolenaar585fea72020-04-02 22:33:21 +02002005 echon 'thing'
Bram Moolenaar62aec932022-01-29 21:45:34 +00002006 assert_match('^something$', g:Screenline(&lines))
Bram Moolenaarad39c092020-02-26 18:23:43 +01002007
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002008 echo "some" # comment
2009 echon "thing"
Bram Moolenaar62aec932022-01-29 21:45:34 +00002010 assert_match('^something$', g:Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002011
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002012 var str1 = 'some'
2013 var str2 = 'more'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002014 echo str1 str2
Bram Moolenaar62aec932022-01-29 21:45:34 +00002015 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002016
Bram Moolenaar397a87a2022-03-20 21:14:15 +00002017 echo "one\ntwo"
2018 assert_match('^one$', g:Screenline(&lines - 1))
2019 assert_match('^two$', g:Screenline(&lines))
2020
Bram Moolenaar62aec932022-01-29 21:45:34 +00002021 v9.CheckDefFailure(['echo "xxx"# comment'], 'E488:')
Bram Moolenaarad39c092020-02-26 18:23:43 +01002022enddef
2023
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002024def Test_echomsg_cmd()
2025 echomsg 'some' 'more' # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00002026 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002027 echo 'clear'
Bram Moolenaardf069ee2020-06-22 23:02:51 +02002028 :1messages
Bram Moolenaar62aec932022-01-29 21:45:34 +00002029 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002030
Bram Moolenaar62aec932022-01-29 21:45:34 +00002031 v9.CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002032enddef
2033
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002034def Test_echomsg_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002035 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002036 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002037 vim9script
2038 echomsg 'here'
2039 .. ' is ' ..
2040 'a message'
Bram Moolenaar62aec932022-01-29 21:45:34 +00002041 assert_match('^here is a message$', g:Screenline(&lines))
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002042 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002043 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002044enddef
2045
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002046def Test_echoerr_cmd()
Bram Moolenaar7de62622021-08-07 15:05:47 +02002047 var local = 'local'
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002048 try
Bram Moolenaar7de62622021-08-07 15:05:47 +02002049 echoerr 'something' local 'wrong' # comment
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002050 catch
Bram Moolenaar7de62622021-08-07 15:05:47 +02002051 assert_match('something local wrong', v:exception)
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002052 endtry
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002053enddef
2054
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002055def Test_echoerr_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002056 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002057 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002058 vim9script
2059 try
2060 echoerr 'this'
2061 .. ' is ' ..
2062 'wrong'
2063 catch
2064 assert_match('this is wrong', v:exception)
2065 endtry
2066 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002067 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002068enddef
2069
Bram Moolenaar7de62622021-08-07 15:05:47 +02002070def Test_echoconsole_cmd()
2071 var local = 'local'
2072 echoconsole 'something' local # comment
2073 # output goes anywhere
2074enddef
2075
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002076def Test_echowindow_cmd()
2077 var local = 'local'
2078 echowindow 'something' local # comment
Bram Moolenaar2435adf2022-10-21 12:05:46 +01002079
2080 # with modifier
2081 unsilent echowin 'loud'
2082
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002083 # output goes in message window
2084 popup_clear()
2085enddef
2086
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002087def Test_for_outside_of_function()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002088 var lines =<< trim END
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002089 vim9script
2090 new
2091 for var in range(0, 3)
2092 append(line('$'), var)
2093 endfor
2094 assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
2095 bwipe!
Bram Moolenaar522eefd2021-03-26 18:49:22 +01002096
2097 var result = ''
2098 for i in [1, 2, 3]
2099 var loop = ' loop ' .. i
2100 result ..= loop
2101 endfor
2102 assert_equal(' loop 1 loop 2 loop 3', result)
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002103 END
Bram Moolenaardd674772022-09-15 22:26:18 +01002104 writefile(lines, 'Xvim9for.vim', 'D')
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002105 source Xvim9for.vim
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002106enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002107
rbtnnbebf0692021-08-21 17:26:50 +02002108def Test_for_skipped_block()
2109 # test skipped blocks at outside of function
2110 var lines =<< trim END
2111 var result = []
2112 if true
2113 for n in [1, 2]
2114 result += [n]
2115 endfor
2116 else
2117 for n in [3, 4]
2118 result += [n]
2119 endfor
2120 endif
2121 assert_equal([1, 2], result)
2122
2123 result = []
2124 if false
2125 for n in [1, 2]
2126 result += [n]
2127 endfor
2128 else
2129 for n in [3, 4]
2130 result += [n]
2131 endfor
2132 endif
2133 assert_equal([3, 4], result)
2134 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002135 v9.CheckDefAndScriptSuccess(lines)
rbtnnbebf0692021-08-21 17:26:50 +02002136
2137 # test skipped blocks at inside of function
2138 lines =<< trim END
2139 def DefTrue()
2140 var result = []
2141 if true
2142 for n in [1, 2]
2143 result += [n]
2144 endfor
2145 else
2146 for n in [3, 4]
2147 result += [n]
2148 endfor
2149 endif
2150 assert_equal([1, 2], result)
2151 enddef
2152 DefTrue()
2153
2154 def DefFalse()
2155 var result = []
2156 if false
2157 for n in [1, 2]
2158 result += [n]
2159 endfor
2160 else
2161 for n in [3, 4]
2162 result += [n]
2163 endfor
2164 endif
2165 assert_equal([3, 4], result)
2166 enddef
2167 DefFalse()
Bram Moolenaar97f8c102022-04-02 19:43:57 +01002168
2169 def BuildDiagrams()
2170 var diagrams: list<any>
2171 if false
2172 var max = 0
2173 for v in diagrams
2174 var l = 3
2175 if max < l | max = l | endif
2176 v->add(l)
2177 endfor
2178 endif
2179 enddef
2180 BuildDiagrams()
rbtnnbebf0692021-08-21 17:26:50 +02002181 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002182 v9.CheckDefAndScriptSuccess(lines)
rbtnnbebf0692021-08-21 17:26:50 +02002183enddef
2184
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002185def Test_skipped_redir()
2186 var lines =<< trim END
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002187 def Tredir()
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002188 if 0
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002189 redir => l[0]
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002190 redir END
2191 endif
2192 enddef
2193 defcompile
2194 END
2195 v9.CheckScriptSuccess(lines)
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002196 delfunc g:Tredir
2197
2198 lines =<< trim END
2199 def Tredir()
2200 if 0
2201 redir => l[0]
2202 endif
2203 echo 'executed'
2204 if 0
2205 redir END
2206 endif
2207 enddef
2208 defcompile
2209 END
2210 v9.CheckScriptSuccess(lines)
2211 delfunc g:Tredir
2212
2213 lines =<< trim END
2214 def Tredir()
2215 var l = ['']
2216 if 1
2217 redir => l[0]
2218 endif
2219 echo 'executed'
2220 if 0
2221 redir END
2222 else
2223 redir END
2224 endif
2225 enddef
2226 defcompile
2227 END
2228 v9.CheckScriptSuccess(lines)
2229 delfunc g:Tredir
2230
2231 lines =<< trim END
2232 let doit = 1
2233 def Tredir()
2234 var l = ['']
2235 if g:doit
2236 redir => l[0]
2237 endif
2238 echo 'executed'
2239 if g:doit
2240 redir END
2241 endif
2242 enddef
2243 defcompile
2244 END
2245 v9.CheckScriptSuccess(lines)
2246 delfunc g:Tredir
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002247enddef
2248
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002249def Test_for_loop()
Bram Moolenaarf2253962021-04-13 20:53:13 +02002250 var lines =<< trim END
2251 var result = ''
2252 for cnt in range(7)
2253 if cnt == 4
2254 break
2255 endif
2256 if cnt == 2
2257 continue
2258 endif
2259 result ..= cnt .. '_'
2260 endfor
2261 assert_equal('0_1_3_', result)
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02002262
Bram Moolenaarf2253962021-04-13 20:53:13 +02002263 var concat = ''
2264 for str in eval('["one", "two"]')
2265 concat ..= str
2266 endfor
2267 assert_equal('onetwo', concat)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002268
Bram Moolenaarf2253962021-04-13 20:53:13 +02002269 var total = 0
2270 for nr in
2271 [1, 2, 3]
2272 total += nr
2273 endfor
2274 assert_equal(6, total)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002275
Bram Moolenaarf2253962021-04-13 20:53:13 +02002276 total = 0
2277 for nr
2278 in [1, 2, 3]
2279 total += nr
2280 endfor
2281 assert_equal(6, total)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002282
Bram Moolenaarf2253962021-04-13 20:53:13 +02002283 total = 0
2284 for nr
2285 in
2286 [1, 2, 3]
2287 total += nr
2288 endfor
2289 assert_equal(6, total)
Bram Moolenaar036d0712021-01-17 20:23:38 +01002290
Bram Moolenaara3589a02021-04-14 13:30:46 +02002291 # with type
2292 total = 0
2293 for n: number in [1, 2, 3]
2294 total += n
2295 endfor
2296 assert_equal(6, total)
2297
Bram Moolenaarefd73ae2022-03-20 18:51:00 +00002298 total = 0
2299 for b in 0z010203
2300 total += b
2301 endfor
2302 assert_equal(6, total)
2303
Bram Moolenaarfe090eb2021-04-15 21:48:32 +02002304 var chars = ''
2305 for s: string in 'foobar'
2306 chars ..= s
2307 endfor
2308 assert_equal('foobar', chars)
2309
Bram Moolenaar5ede5b22021-07-07 21:55:25 +02002310 chars = ''
2311 for x: string in {a: 'a', b: 'b'}->values()
2312 chars ..= x
2313 endfor
2314 assert_equal('ab', chars)
2315
Bram Moolenaara3589a02021-04-14 13:30:46 +02002316 # unpack with type
Bram Moolenaarf2253962021-04-13 20:53:13 +02002317 var res = ''
Bram Moolenaara3589a02021-04-14 13:30:46 +02002318 for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2319 res ..= n .. s
2320 endfor
2321 assert_equal('1a2b', res)
2322
Bram Moolenaar444d8782021-06-26 12:40:56 +02002323 # unpack with one var
2324 var reslist = []
2325 for [x] in [['aaa'], ['bbb']]
2326 reslist->add(x)
2327 endfor
2328 assert_equal(['aaa', 'bbb'], reslist)
2329
Bram Moolenaara3589a02021-04-14 13:30:46 +02002330 # loop over string
2331 res = ''
Bram Moolenaarf2253962021-04-13 20:53:13 +02002332 for c in 'aéc̀d'
2333 res ..= c .. '-'
2334 endfor
2335 assert_equal('a-é-c̀-d-', res)
2336
2337 res = ''
2338 for c in ''
2339 res ..= c .. '-'
2340 endfor
2341 assert_equal('', res)
2342
2343 res = ''
2344 for c in test_null_string()
2345 res ..= c .. '-'
2346 endfor
2347 assert_equal('', res)
2348
Bram Moolenaar10611952022-04-03 21:11:34 +01002349 total = 0
2350 for c in null_list
2351 total += 1
2352 endfor
2353 assert_equal(0, total)
2354
2355 for c in null_blob
2356 total += 1
2357 endfor
2358 assert_equal(0, total)
2359
Bram Moolenaarf2253962021-04-13 20:53:13 +02002360 var foo: list<dict<any>> = [
2361 {a: 'Cat'}
2362 ]
2363 for dd in foo
2364 dd.counter = 12
2365 endfor
2366 assert_equal([{a: 'Cat', counter: 12}], foo)
Bram Moolenaarad2d4962021-07-18 17:08:50 +02002367
2368 reslist = []
2369 for _ in range(3)
2370 reslist->add('x')
2371 endfor
2372 assert_equal(['x', 'x', 'x'], reslist)
Bram Moolenaarf2253962021-04-13 20:53:13 +02002373 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002374 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002375enddef
2376
Bram Moolenaar159b2d52022-10-11 21:41:25 +01002377def Test_for_loop_list_of_lists()
2378 # loop variable is final, not const
2379 var lines =<< trim END
2380 # Filter out all odd numbers in each sublist
2381 var list: list<list<number>> = [[1], [1, 2], [1, 2, 3], [1, 2, 3, 4]]
2382 for i in list
2383 filter(i, (_, n: number): bool => n % 2 == 0)
2384 endfor
2385
2386 assert_equal([[], [2], [2], [2, 4]], list)
2387 END
2388 v9.CheckDefAndScriptSuccess(lines)
2389enddef
2390
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002391def Test_for_loop_with_closure()
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002392 # using the loop variable in a closure results in the last used value
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002393 var lines =<< trim END
2394 var flist: list<func>
2395 for i in range(5)
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002396 flist[i] = () => i
2397 endfor
2398 for i in range(5)
2399 assert_equal(4, flist[i]())
2400 endfor
2401 END
2402 v9.CheckDefAndScriptSuccess(lines)
2403
Bram Moolenaardd674772022-09-15 22:26:18 +01002404 # also works when the loop variable is used only once halfway the loops
2405 lines =<< trim END
2406 var Clo: func
2407 for i in range(5)
2408 if i == 3
2409 Clo = () => i
2410 endif
2411 endfor
2412 assert_equal(4, Clo())
2413 END
2414 v9.CheckDefAndScriptSuccess(lines)
2415
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002416 # using a local variable set to the loop variable in a closure results in the
2417 # value at that moment
2418 lines =<< trim END
2419 var flist: list<func>
2420 for i in range(5)
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002421 var inloop = i
2422 flist[i] = () => inloop
2423 endfor
2424 for i in range(5)
Bram Moolenaar353b68a2022-09-13 21:10:45 +01002425 assert_equal(i, flist[i]())
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002426 endfor
2427 END
Bram Moolenaar0cdfb7c2022-09-17 15:44:52 +01002428 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002429
Bram Moolenaara275f2c2022-10-11 20:04:09 +01002430 # also with an extra block level
2431 lines =<< trim END
2432 var flist: list<func>
2433 for i in range(5)
2434 {
2435 var inloop = i
2436 flist[i] = () => inloop
2437 }
2438 endfor
2439 for i in range(5)
2440 assert_equal(i, flist[i]())
2441 endfor
2442 END
2443 v9.CheckDefAndScriptSuccess(lines)
2444
2445 # and declaration in higher block
2446 lines =<< trim END
2447 var flist: list<func>
2448 for i in range(5)
2449 var inloop = i
2450 {
2451 flist[i] = () => inloop
2452 }
2453 endfor
2454 for i in range(5)
2455 assert_equal(i, flist[i]())
2456 endfor
2457 END
2458 v9.CheckDefAndScriptSuccess(lines)
2459
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002460 lines =<< trim END
2461 var flist: list<func>
2462 for i in range(5)
2463 var inloop = i
2464 flist[i] = () => {
2465 return inloop
2466 }
2467 endfor
2468 for i in range(5)
Bram Moolenaar353b68a2022-09-13 21:10:45 +01002469 assert_equal(i, flist[i]())
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002470 endfor
2471 END
Bram Moolenaar0cdfb7c2022-09-17 15:44:52 +01002472 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaardbbb02b2022-09-18 12:00:21 +01002473
2474 # Also works for a nested loop
2475 lines =<< trim END
2476 var flist: list<func>
2477 var n = 0
2478 for i in range(3)
2479 var ii = i
2480 for a in ['a', 'b', 'c']
2481 var aa = a
2482 flist[n] = () => ii .. aa
2483 ++n
2484 endfor
2485 endfor
2486
2487 n = 0
2488 for i in range(3)
2489 for a in ['a', 'b', 'c']
2490 assert_equal(i .. a, flist[n]())
2491 ++n
2492 endfor
2493 endfor
2494 END
Bram Moolenaarcc341812022-09-19 15:54:34 +01002495 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaare8e369a2022-09-21 18:59:14 +01002496
2497 # using two loop variables
2498 lines =<< trim END
2499 var lv_list: list<func>
2500 var copy_list: list<func>
2501 for [idx, c] in items('word')
2502 var lidx = idx
2503 var lc = c
2504 lv_list[idx] = () => {
2505 return idx .. c
2506 }
2507 copy_list[idx] = () => {
2508 return lidx .. lc
2509 }
2510 endfor
2511 for [i, c] in items('word')
2512 assert_equal(3 .. 'd', lv_list[i]())
2513 assert_equal(i .. c, copy_list[i]())
2514 endfor
2515 END
2516 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarcc341812022-09-19 15:54:34 +01002517enddef
2518
2519def Test_define_global_closure_in_loops()
2520 var lines =<< trim END
2521 vim9script
2522
2523 def Func()
2524 for i in range(3)
2525 var ii = i
2526 for a in ['a', 'b', 'c']
2527 var aa = a
2528 if ii == 0 && aa == 'a'
2529 def g:Global_0a(): string
2530 return ii .. aa
2531 enddef
2532 endif
2533 if ii == 1 && aa == 'b'
2534 def g:Global_1b(): string
2535 return ii .. aa
2536 enddef
2537 endif
2538 if ii == 2 && aa == 'c'
2539 def g:Global_2c(): string
2540 return ii .. aa
2541 enddef
2542 endif
2543 endfor
2544 endfor
2545 enddef
2546 Func()
2547 END
2548 v9.CheckScriptSuccess(lines)
2549 assert_equal("0a", g:Global_0a())
2550 assert_equal("1b", g:Global_1b())
2551 assert_equal("2c", g:Global_2c())
2552
2553 delfunc g:Global_0a
2554 delfunc g:Global_1b
2555 delfunc g:Global_2c
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002556enddef
2557
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002558def Test_for_loop_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00002559 v9.CheckDefAndScriptFailure(['for '], ['E1097:', 'E690:'])
2560 v9.CheckDefAndScriptFailure(['for x'], ['E1097:', 'E690:'])
2561 v9.CheckDefAndScriptFailure(['for x in'], ['E1097:', 'E15:'])
2562 v9.CheckDefAndScriptFailure(['for # in range(5)'], 'E690:')
2563 v9.CheckDefAndScriptFailure(['for i In range(5)'], 'E690:')
2564 v9.CheckDefAndScriptFailure(['var x = 5', 'for x in range(5)', 'endfor'], ['E1017:', 'E1041:'])
2565 v9.CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3)
2566 v9.CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01002567 delfunc! g:Func
Bram Moolenaar62aec932022-01-29 21:45:34 +00002568 v9.CheckDefFailure(['for i in xxx'], 'E1001:')
2569 v9.CheckDefFailure(['endfor'], 'E588:')
2570 v9.CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002571
2572 # wrong type detected at compile time
Bram Moolenaar62aec932022-01-29 21:45:34 +00002573 v9.CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002574
2575 # wrong type detected at runtime
2576 g:adict = {a: 1}
Bram Moolenaar62aec932022-01-29 21:45:34 +00002577 v9.CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002578 unlet g:adict
Bram Moolenaarf6a8d422021-04-13 21:48:03 +02002579
2580 var lines =<< trim END
2581 var d: list<dict<any>> = [{a: 0}]
2582 for e in d
2583 e = {a: 0, b: ''}
2584 endfor
2585 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002586 v9.CheckDefAndScriptFailure(lines, ['E1018:', 'E46:'], 3)
Bram Moolenaarfe090eb2021-04-15 21:48:32 +02002587
2588 lines =<< trim END
2589 for nr: number in ['foo']
2590 endfor
2591 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002592 v9.CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
Bram Moolenaar404557e2021-07-05 21:41:48 +02002593
2594 lines =<< trim END
2595 for n : number in [1, 2]
2596 echo n
2597 endfor
2598 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002599 v9.CheckDefAndScriptFailure(lines, 'E1059:', 1)
Bram Moolenaarefc5db52021-07-07 21:21:30 +02002600
2601 lines =<< trim END
2602 var d: dict<number> = {a: 1, b: 2}
2603 for [k: job, v: job] in d->items()
2604 echo k v
2605 endfor
2606 END
Bram Moolenaarbd3a9d22022-05-17 16:12:39 +01002607 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 +00002608
2609 lines =<< trim END
2610 var i = 0
2611 for i in [1, 2, 3]
2612 echo i
2613 endfor
2614 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002615 v9.CheckDefExecAndScriptFailure(lines, ['E1017:', 'E1041:'])
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002616
2617 lines =<< trim END
2618 var l = [0]
2619 for l[0] in [1, 2, 3]
2620 echo l[0]
2621 endfor
2622 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002623 v9.CheckDefExecAndScriptFailure(lines, ['E461:', 'E1017:'])
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002624
2625 lines =<< trim END
2626 var d = {x: 0}
2627 for d.x in [1, 2, 3]
2628 echo d.x
2629 endfor
2630 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002631 v9.CheckDefExecAndScriptFailure(lines, ['E461:', 'E1017:'])
Bram Moolenaara1c51952022-02-02 16:20:26 +00002632
2633 lines =<< trim END
2634 var l: list<dict<any>> = [{a: 1, b: 'x'}]
2635 for item: dict<number> in l
2636 echo item
2637 endfor
2638 END
2639 v9.CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected dict<number> but got dict<any>')
2640
2641 lines =<< trim END
2642 var l: list<dict<any>> = [{n: 1}]
2643 for item: dict<number> in l
Bram Moolenaarfa103972022-09-29 19:14:42 +01002644 var d = {s: ''}
2645 d->extend(item)
Bram Moolenaara1c51952022-02-02 16:20:26 +00002646 endfor
2647 END
Bram Moolenaarfa103972022-09-29 19:14:42 +01002648 v9.CheckDefExecAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected dict<string> but got dict<number>')
Bram Moolenaarcc341812022-09-19 15:54:34 +01002649
2650 lines =<< trim END
2651 for a in range(3)
2652 while a > 3
2653 for b in range(2)
2654 while b < 0
2655 for c in range(5)
2656 while c > 6
2657 while c < 0
2658 for d in range(1)
2659 for e in range(3)
2660 while e > 3
2661 endwhile
2662 endfor
2663 endfor
2664 endwhile
2665 endwhile
2666 endfor
2667 endwhile
2668 endfor
2669 endwhile
2670 endfor
2671 END
2672 v9.CheckDefSuccess(lines)
2673
2674 v9.CheckDefFailure(['for x in range(3)'] + lines + ['endfor'], 'E1306:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002675enddef
2676
Bram Moolenaarea870692020-12-02 14:24:30 +01002677def Test_for_loop_script_var()
2678 # cannot use s:var in a :def function
Bram Moolenaar62aec932022-01-29 21:45:34 +00002679 v9.CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1254:')
Bram Moolenaarea870692020-12-02 14:24:30 +01002680
2681 # can use s:var in Vim9 script, with or without s:
2682 var lines =<< trim END
2683 vim9script
2684 var total = 0
2685 for s:var in [1, 2, 3]
2686 total += s:var
2687 endfor
2688 assert_equal(6, total)
2689
2690 total = 0
2691 for var in [1, 2, 3]
2692 total += var
2693 endfor
2694 assert_equal(6, total)
2695 END
2696enddef
2697
Bram Moolenaar792f7862020-11-23 08:31:18 +01002698def Test_for_loop_unpack()
Bram Moolenaar792f7862020-11-23 08:31:18 +01002699 var lines =<< trim END
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002700 var result = []
2701 for [v1, v2] in [[1, 2], [3, 4]]
2702 result->add(v1)
2703 result->add(v2)
2704 endfor
2705 assert_equal([1, 2, 3, 4], result)
2706
2707 result = []
2708 for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2709 result->add(v1)
2710 result->add(v2)
2711 result->add(v3)
2712 endfor
2713 assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2714
2715 result = []
2716 for [&ts, &sw] in [[1, 2], [3, 4]]
2717 result->add(&ts)
2718 result->add(&sw)
2719 endfor
2720 assert_equal([1, 2, 3, 4], result)
2721
2722 var slist: list<string>
2723 for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
2724 slist->add($LOOPVAR)
2725 slist->add(@r)
2726 slist->add(v:errmsg)
2727 endfor
2728 assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
2729
2730 slist = []
2731 for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
2732 slist->add(g:globalvar)
2733 slist->add(b:bufvar)
2734 slist->add(w:winvar)
2735 slist->add(t:tabvar)
2736 endfor
2737 assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
Bram Moolenaarf6c177a2020-12-04 17:38:00 +01002738 unlet! g:globalvar b:bufvar w:winvar t:tabvar
Bram Moolenaarb777da92021-05-22 21:40:39 +02002739
2740 var res = []
2741 for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
2742 res->add(n)
2743 endfor
2744 assert_equal([2, 5], res)
Bram Moolenaar61efa162022-03-18 13:10:48 +00002745
2746 var text: list<string> = ["hello there", "goodbye now"]
2747 var splitted = ''
2748 for [first; next] in mapnew(text, (i, v) => split(v))
2749 splitted ..= string(first) .. string(next) .. '/'
2750 endfor
2751 assert_equal("'hello'['there']/'goodbye'['now']/", splitted)
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002752 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002753 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002754
2755 lines =<< trim END
Bram Moolenaar792f7862020-11-23 08:31:18 +01002756 for [v1, v2] in [[1, 2, 3], [3, 4]]
2757 echo v1 v2
2758 endfor
2759 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002760 v9.CheckDefExecFailure(lines, 'E710:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01002761
2762 lines =<< trim END
2763 for [v1, v2] in [[1], [3, 4]]
2764 echo v1 v2
2765 endfor
2766 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002767 v9.CheckDefExecFailure(lines, 'E711:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01002768
2769 lines =<< trim END
2770 for [v1, v1] in [[1, 2], [3, 4]]
2771 echo v1
2772 endfor
2773 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002774 v9.CheckDefExecFailure(lines, 'E1017:', 1)
Bram Moolenaar95e4dd82022-04-27 22:15:40 +01002775
2776 lines =<< trim END
2777 for [a, b] in g:listlist
2778 echo a
2779 endfor
2780 END
2781 g:listlist = [1, 2, 3]
2782 v9.CheckDefExecFailure(lines, 'E1140:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01002783enddef
2784
Bram Moolenaarc150c092021-02-13 15:02:46 +01002785def Test_for_loop_with_try_continue()
Bram Moolenaarf2253962021-04-13 20:53:13 +02002786 var lines =<< trim END
2787 var looped = 0
2788 var cleanup = 0
2789 for i in range(3)
2790 looped += 1
2791 try
2792 eval [][0]
2793 catch
2794 continue
2795 finally
2796 cleanup += 1
2797 endtry
2798 endfor
2799 assert_equal(3, looped)
2800 assert_equal(3, cleanup)
2801 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002802 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc150c092021-02-13 15:02:46 +01002803enddef
2804
rbtnnd895b1d2021-08-20 20:54:25 +02002805def Test_while_skipped_block()
2806 # test skipped blocks at outside of function
2807 var lines =<< trim END
2808 var result = []
2809 var n = 0
2810 if true
2811 n = 1
2812 while n < 3
2813 result += [n]
2814 n += 1
2815 endwhile
2816 else
2817 n = 3
2818 while n < 5
2819 result += [n]
2820 n += 1
2821 endwhile
2822 endif
2823 assert_equal([1, 2], result)
2824
2825 result = []
2826 if false
2827 n = 1
2828 while n < 3
2829 result += [n]
2830 n += 1
2831 endwhile
2832 else
2833 n = 3
2834 while n < 5
2835 result += [n]
2836 n += 1
2837 endwhile
2838 endif
2839 assert_equal([3, 4], result)
2840 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002841 v9.CheckDefAndScriptSuccess(lines)
rbtnnd895b1d2021-08-20 20:54:25 +02002842
2843 # test skipped blocks at inside of function
2844 lines =<< trim END
2845 def DefTrue()
2846 var result = []
2847 var n = 0
2848 if true
2849 n = 1
2850 while n < 3
2851 result += [n]
2852 n += 1
2853 endwhile
2854 else
2855 n = 3
2856 while n < 5
2857 result += [n]
2858 n += 1
2859 endwhile
2860 endif
2861 assert_equal([1, 2], result)
2862 enddef
2863 DefTrue()
2864
2865 def DefFalse()
2866 var result = []
2867 var n = 0
2868 if false
2869 n = 1
2870 while n < 3
2871 result += [n]
2872 n += 1
2873 endwhile
2874 else
2875 n = 3
2876 while n < 5
2877 result += [n]
2878 n += 1
2879 endwhile
2880 endif
2881 assert_equal([3, 4], result)
2882 enddef
2883 DefFalse()
2884 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002885 v9.CheckDefAndScriptSuccess(lines)
rbtnnd895b1d2021-08-20 20:54:25 +02002886enddef
2887
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01002888def Test_while_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002889 var result = ''
2890 var cnt = 0
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01002891 while cnt < 555
2892 if cnt == 3
2893 break
2894 endif
2895 cnt += 1
2896 if cnt == 2
2897 continue
2898 endif
2899 result ..= cnt .. '_'
2900 endwhile
2901 assert_equal('1_3_', result)
Bram Moolenaardee37dc2021-02-07 16:40:05 +01002902
2903 var s = ''
Bram Moolenaar4b3e1962021-03-18 21:37:55 +01002904 while s == 'x' # {comment}
Bram Moolenaardee37dc2021-02-07 16:40:05 +01002905 endwhile
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01002906enddef
2907
Bram Moolenaar7a53f292021-11-22 18:31:02 +00002908def Test_while_loop_in_script()
2909 var lines =<< trim END
2910 vim9script
2911 var result = ''
2912 var cnt = 0
2913 while cnt < 3
2914 var s = 'v' .. cnt
2915 result ..= s
2916 cnt += 1
2917 endwhile
2918 assert_equal('v0v1v2', result)
2919 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002920 v9.CheckScriptSuccess(lines)
Bram Moolenaar7a53f292021-11-22 18:31:02 +00002921enddef
2922
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002923def Test_while_loop_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00002924 v9.CheckDefFailure(['while xxx'], 'E1001:')
2925 v9.CheckDefFailure(['endwhile'], 'E588:')
2926 v9.CheckDefFailure(['continue'], 'E586:')
2927 v9.CheckDefFailure(['if true', 'continue'], 'E586:')
2928 v9.CheckDefFailure(['break'], 'E587:')
2929 v9.CheckDefFailure(['if true', 'break'], 'E587:')
2930 v9.CheckDefFailure(['while 1', 'echo 3'], 'E170:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01002931
2932 var lines =<< trim END
2933 var s = ''
2934 while s = ''
2935 endwhile
2936 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002937 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaarbd5da372020-03-31 23:13:10 +02002938enddef
2939
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01002940def Test_interrupt_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002941 var caught = false
2942 var x = 0
Bram Moolenaar97acfc72020-03-22 13:44:28 +01002943 try
2944 while 1
2945 x += 1
2946 if x == 100
2947 feedkeys("\<C-C>", 'Lt')
2948 endif
2949 endwhile
2950 catch
2951 caught = true
2952 assert_equal(100, x)
2953 endtry
2954 assert_true(caught, 'should have caught an exception')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02002955 # consume the CTRL-C
2956 getchar(0)
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01002957enddef
Bram Moolenaar20431c92020-03-20 18:39:46 +01002958
Bram Moolenaar4fdae992020-04-12 16:38:57 +02002959def Test_automatic_line_continuation()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002960 var mylist = [
Bram Moolenaar4fdae992020-04-12 16:38:57 +02002961 'one',
2962 'two',
2963 'three',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002964 ] # comment
Bram Moolenaar4fdae992020-04-12 16:38:57 +02002965 assert_equal(['one', 'two', 'three'], mylist)
2966
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002967 var mydict = {
Bram Moolenaare0de1712020-12-02 17:36:54 +01002968 ['one']: 1,
2969 ['two']: 2,
2970 ['three']:
Bram Moolenaar4fdae992020-04-12 16:38:57 +02002971 3,
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002972 } # comment
Bram Moolenaare0de1712020-12-02 17:36:54 +01002973 assert_equal({one: 1, two: 2, three: 3}, mydict)
2974 mydict = {
Bram Moolenaar2c330432020-04-13 14:41:35 +02002975 one: 1, # comment
2976 two: # comment
2977 2, # comment
2978 three: 3 # comment
2979 }
Bram Moolenaare0de1712020-12-02 17:36:54 +01002980 assert_equal({one: 1, two: 2, three: 3}, mydict)
2981 mydict = {
Bram Moolenaar2c330432020-04-13 14:41:35 +02002982 one: 1,
2983 two:
2984 2,
2985 three: 3
Bram Moolenaar4fdae992020-04-12 16:38:57 +02002986 }
Bram Moolenaare0de1712020-12-02 17:36:54 +01002987 assert_equal({one: 1, two: 2, three: 3}, mydict)
Bram Moolenaare6085c52020-04-12 20:19:16 +02002988
2989 assert_equal(
2990 ['one', 'two', 'three'],
2991 split('one two three')
2992 )
Bram Moolenaar4fdae992020-04-12 16:38:57 +02002993enddef
2994
Bram Moolenaar7a092242020-04-16 22:10:49 +02002995def Test_vim9_comment()
Bram Moolenaar62aec932022-01-29 21:45:34 +00002996 v9.CheckScriptSuccess([
Bram Moolenaar7a092242020-04-16 22:10:49 +02002997 'vim9script',
2998 '# something',
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01002999 '#something',
Bram Moolenaar3f74c0a2022-08-06 18:12:06 +01003000 '#{{something',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003001 ])
Bram Moolenaar3f74c0a2022-08-06 18:12:06 +01003002 v9.CheckScriptFailure([
3003 'vim9script',
3004 '#{something',
3005 ], 'E1170:')
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003006
Bram Moolenaarb18b4962022-09-02 21:55:50 +01003007 split Xv9cfile
Bram Moolenaar62aec932022-01-29 21:45:34 +00003008 v9.CheckScriptSuccess([
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003009 'vim9script',
3010 'edit #something',
3011 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003012 v9.CheckScriptSuccess([
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003013 'vim9script',
3014 'edit #{something',
3015 ])
3016 close
3017
Bram Moolenaar62aec932022-01-29 21:45:34 +00003018 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003019 'vim9script',
3020 ':# something',
3021 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003022 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003023 '# something',
3024 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003025 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003026 ':# something',
3027 ], 'E488:')
3028
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003029 { # block start
3030 } # block end
Bram Moolenaar62aec932022-01-29 21:45:34 +00003031 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003032 '{# comment',
3033 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003034 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003035 '{',
3036 '}# comment',
3037 ], 'E488:')
3038
3039 echo "yes" # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00003040 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003041 'echo "yes"# comment',
3042 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003043 v9.CheckScriptSuccess([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003044 'vim9script',
3045 'echo "yes" # something',
3046 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003047 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003048 'vim9script',
3049 'echo "yes"# something',
3050 ], 'E121:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003051 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003052 'vim9script',
3053 'echo# something',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003054 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003055 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003056 'echo "yes" # something',
3057 ], 'E121:')
3058
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003059 exe "echo" # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00003060 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003061 'exe "echo"# comment',
3062 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003063 v9.CheckScriptSuccess([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003064 'vim9script',
3065 'exe "echo" # something',
3066 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003067 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003068 'vim9script',
3069 'exe "echo"# something',
3070 ], 'E121:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003071 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003072 'vim9script',
3073 'exe# something',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003074 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003075 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003076 'exe "echo" # something',
3077 ], 'E121:')
3078
Bram Moolenaar62aec932022-01-29 21:45:34 +00003079 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003080 'try# comment',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003081 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003082 'catch',
3083 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003084 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003085 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003086 'vim9script',
3087 'try# comment',
3088 'echo "yes"',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003089 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003090 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003091 'try',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003092 ' throw#comment',
3093 'catch',
3094 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003095 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003096 v9.CheckDefFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003097 'try',
3098 ' throw "yes"#comment',
3099 'catch',
3100 'endtry',
3101 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003102 v9.CheckDefFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003103 'try',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003104 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003105 'catch# comment',
3106 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003107 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003108 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003109 'vim9script',
3110 'try',
3111 ' echo "yes"',
3112 'catch# comment',
3113 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003114 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003115 v9.CheckDefFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003116 'try',
3117 ' echo "yes"',
3118 'catch /pat/# comment',
3119 'endtry',
3120 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003121 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003122 'try',
3123 'echo "yes"',
3124 'catch',
3125 'endtry# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003126 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003127 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003128 'vim9script',
3129 'try',
3130 ' echo "yes"',
3131 'catch',
3132 'endtry# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003133 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003134
Bram Moolenaar62aec932022-01-29 21:45:34 +00003135 v9.CheckScriptSuccess([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003136 'vim9script',
3137 'hi # comment',
3138 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003139 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003140 'vim9script',
3141 'hi# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003142 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003143 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003144 'vim9script',
3145 'hi Search # comment',
3146 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003147 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003148 'vim9script',
3149 'hi Search# comment',
3150 ], 'E416:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003151 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003152 'vim9script',
3153 'hi link This Search # comment',
3154 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003155 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003156 'vim9script',
3157 'hi link This That# comment',
3158 ], 'E413:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003159 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003160 'vim9script',
3161 'hi clear This # comment',
3162 'hi clear # comment',
3163 ])
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003164 # not tested, because it doesn't give an error but a warning:
3165 # hi clear This# comment',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003166 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003167 'vim9script',
3168 'hi clear# comment',
3169 ], 'E416:')
3170
Bram Moolenaar62aec932022-01-29 21:45:34 +00003171 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003172 'vim9script',
3173 'hi Group term=bold',
3174 'match Group /todo/ # comment',
3175 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003176 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003177 'vim9script',
3178 'hi Group term=bold',
3179 'match Group /todo/# comment',
3180 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003181 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003182 'vim9script',
3183 'match # comment',
3184 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003185 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003186 'vim9script',
3187 'match# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003188 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003189 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003190 'vim9script',
3191 'match none # comment',
3192 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003193 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003194 'vim9script',
3195 'match none# comment',
3196 ], 'E475:')
3197
Bram Moolenaar62aec932022-01-29 21:45:34 +00003198 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003199 'vim9script',
3200 'menutrans clear # comment',
3201 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003202 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003203 'vim9script',
3204 'menutrans clear# comment text',
3205 ], 'E474:')
3206
Bram Moolenaar62aec932022-01-29 21:45:34 +00003207 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003208 'vim9script',
3209 'syntax clear # comment',
3210 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003211 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003212 'vim9script',
3213 'syntax clear# comment text',
3214 ], 'E28:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003215 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003216 'vim9script',
3217 'syntax keyword Word some',
3218 'syntax clear Word # comment',
3219 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003220 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003221 'vim9script',
3222 'syntax keyword Word some',
3223 'syntax clear Word# comment text',
3224 ], 'E28:')
3225
Bram Moolenaar62aec932022-01-29 21:45:34 +00003226 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003227 'vim9script',
3228 'syntax list # comment',
3229 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003230 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003231 'vim9script',
3232 'syntax list# comment text',
3233 ], 'E28:')
3234
Bram Moolenaar62aec932022-01-29 21:45:34 +00003235 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003236 'vim9script',
3237 'syntax match Word /pat/ oneline # comment',
3238 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003239 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003240 'vim9script',
3241 'syntax match Word /pat/ oneline# comment',
3242 ], 'E475:')
3243
Bram Moolenaar62aec932022-01-29 21:45:34 +00003244 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003245 'vim9script',
3246 'syntax keyword Word word # comm[ent',
3247 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003248 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003249 'vim9script',
3250 'syntax keyword Word word# comm[ent',
3251 ], 'E789:')
3252
Bram Moolenaar62aec932022-01-29 21:45:34 +00003253 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003254 'vim9script',
3255 'syntax match Word /pat/ # comment',
3256 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003257 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003258 'vim9script',
3259 'syntax match Word /pat/# comment',
3260 ], 'E402:')
3261
Bram Moolenaar62aec932022-01-29 21:45:34 +00003262 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003263 'vim9script',
3264 'syntax match Word /pat/ contains=Something # comment',
3265 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003266 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003267 'vim9script',
3268 'syntax match Word /pat/ contains=Something# comment',
3269 ], 'E475:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003270 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003271 'vim9script',
3272 'syntax match Word /pat/ contains= # comment',
3273 ], 'E406:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003274 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003275 'vim9script',
3276 'syntax match Word /pat/ contains=# comment',
3277 ], 'E475:')
3278
Bram Moolenaar62aec932022-01-29 21:45:34 +00003279 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003280 'vim9script',
3281 'syntax region Word start=/pat/ end=/pat/ # comment',
3282 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003283 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003284 'vim9script',
3285 'syntax region Word start=/pat/ end=/pat/# comment',
Bram Moolenaard032f342020-07-18 18:13:02 +02003286 ], 'E402:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02003287
Bram Moolenaar62aec932022-01-29 21:45:34 +00003288 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003289 'vim9script',
3290 'syntax sync # comment',
3291 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003292 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003293 'vim9script',
3294 'syntax sync# comment',
3295 ], 'E404:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003296 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003297 'vim9script',
3298 'syntax sync ccomment # comment',
3299 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003300 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003301 'vim9script',
3302 'syntax sync ccomment# comment',
3303 ], 'E404:')
3304
Bram Moolenaar62aec932022-01-29 21:45:34 +00003305 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003306 'vim9script',
3307 'syntax cluster Some contains=Word # comment',
3308 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003309 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003310 'vim9script',
3311 'syntax cluster Some contains=Word# comment',
3312 ], 'E475:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003313
Bram Moolenaar62aec932022-01-29 21:45:34 +00003314 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003315 'vim9script',
3316 'command Echo echo # comment',
3317 'command Echo # comment',
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003318 'delcommand Echo',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003319 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003320 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003321 'vim9script',
3322 'command Echo echo# comment',
3323 'Echo',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003324 ], 'E1144:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003325 delcommand Echo
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003326
3327 var curdir = getcwd()
Bram Moolenaar62aec932022-01-29 21:45:34 +00003328 v9.CheckScriptSuccess([
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003329 'command Echo cd " comment',
3330 'Echo',
3331 'delcommand Echo',
3332 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003333 v9.CheckScriptSuccess([
Bram Moolenaar090728a2020-12-20 15:43:31 +01003334 'vim9script',
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003335 'command Echo cd # comment',
3336 'Echo',
3337 'delcommand Echo',
3338 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003339 v9.CheckScriptFailure([
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003340 'vim9script',
3341 'command Echo cd " comment',
3342 'Echo',
3343 ], 'E344:')
3344 delcommand Echo
3345 chdir(curdir)
3346
Bram Moolenaar62aec932022-01-29 21:45:34 +00003347 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003348 'vim9script',
3349 'command Echo# comment',
3350 ], 'E182:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003351 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003352 'vim9script',
3353 'command Echo echo',
3354 'command Echo# comment',
3355 ], 'E182:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003356 delcommand Echo
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003357
Bram Moolenaar62aec932022-01-29 21:45:34 +00003358 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003359 'vim9script',
3360 'function # comment',
3361 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003362 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003363 'vim9script',
Bram Moolenaar98981072020-07-29 14:40:25 +02003364 'function " comment',
3365 ], 'E129:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003366 v9.CheckScriptFailure([
Bram Moolenaar98981072020-07-29 14:40:25 +02003367 'vim9script',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003368 'function# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003369 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003370 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003371 'vim9script',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003372 'import "./vim9.vim" as v9',
3373 'function v9.CheckScriptSuccess # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003374 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003375 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003376 'vim9script',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003377 'import "./vim9.vim" as v9',
3378 'function v9.CheckScriptSuccess# comment',
3379 ], 'E1048: Item not found in script: CheckScriptSuccess#')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003380
Bram Moolenaar62aec932022-01-29 21:45:34 +00003381 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003382 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003383 'func g:DeleteMeA()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003384 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003385 'delfunction g:DeleteMeA # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003386 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003387 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003388 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003389 'func g:DeleteMeB()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003390 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003391 'delfunction g:DeleteMeB# comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003392 ], 'E488:')
3393
Bram Moolenaar62aec932022-01-29 21:45:34 +00003394 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003395 'vim9script',
3396 'call execute("ls") # comment',
3397 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003398 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003399 'vim9script',
3400 'call execute("ls")# comment',
3401 ], 'E488:')
Bram Moolenaare7e48382020-07-22 18:17:08 +02003402
Bram Moolenaar62aec932022-01-29 21:45:34 +00003403 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003404 'def Test() " comment',
3405 'enddef',
3406 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003407 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003408 'vim9script',
3409 'def Test() " comment',
3410 'enddef',
3411 ], 'E488:')
3412
Bram Moolenaar62aec932022-01-29 21:45:34 +00003413 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003414 'func Test() " comment',
3415 'endfunc',
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003416 'delfunc Test',
Bram Moolenaare7e48382020-07-22 18:17:08 +02003417 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003418 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003419 'vim9script',
3420 'func Test() " comment',
3421 'endfunc',
Bram Moolenaar98981072020-07-29 14:40:25 +02003422 ])
Bram Moolenaare7e48382020-07-22 18:17:08 +02003423
Bram Moolenaar62aec932022-01-29 21:45:34 +00003424 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003425 'def Test() # comment',
3426 'enddef',
3427 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003428 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003429 'func Test() # comment',
3430 'endfunc',
3431 ], 'E488:')
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003432
3433 var lines =<< trim END
3434 vim9script
3435 syn region Text
3436 \ start='foo'
3437 #\ comment
3438 \ end='bar'
Bram Moolenaar5072b472021-06-03 21:56:10 +02003439 syn region Text start='foo'
3440 #\ comment
3441 \ end='bar'
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003442 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003443 v9.CheckScriptSuccess(lines)
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003444
3445 lines =<< trim END
3446 vim9script
3447 syn region Text
3448 \ start='foo'
3449 "\ comment
3450 \ end='bar'
3451 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003452 v9.CheckScriptFailure(lines, 'E399:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003453enddef
3454
3455def Test_vim9_comment_gui()
3456 CheckCanRunGui
3457
Bram Moolenaar62aec932022-01-29 21:45:34 +00003458 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003459 'vim9script',
3460 'gui#comment'
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003461 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003462 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003463 'vim9script',
3464 'gui -f#comment'
Bram Moolenaarb8bd2e62021-08-21 17:13:14 +02003465 ], 'E194:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02003466enddef
3467
Bram Moolenaara26b9702020-04-18 19:53:28 +02003468def Test_vim9_comment_not_compiled()
Bram Moolenaar67979662020-06-20 22:50:47 +02003469 au TabEnter *.vim g:entered = 1
3470 au TabEnter *.x g:entered = 2
Bram Moolenaara26b9702020-04-18 19:53:28 +02003471
3472 edit test.vim
3473 doautocmd TabEnter #comment
3474 assert_equal(1, g:entered)
3475
3476 doautocmd TabEnter f.x
3477 assert_equal(2, g:entered)
3478
3479 g:entered = 0
3480 doautocmd TabEnter f.x #comment
3481 assert_equal(2, g:entered)
3482
3483 assert_fails('doautocmd Syntax#comment', 'E216:')
3484
3485 au! TabEnter
3486 unlet g:entered
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003487
Bram Moolenaar62aec932022-01-29 21:45:34 +00003488 v9.CheckScriptSuccess([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003489 'vim9script',
Bram Moolenaar67979662020-06-20 22:50:47 +02003490 'g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003491 'b:var = 456',
3492 'w:var = 777',
3493 't:var = 888',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003494 'unlet g:var w:var # something',
3495 ])
3496
Bram Moolenaar62aec932022-01-29 21:45:34 +00003497 v9.CheckScriptFailure([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003498 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003499 'let var = 123',
3500 ], 'E1126: Cannot use :let in Vim9 script')
3501
Bram Moolenaar62aec932022-01-29 21:45:34 +00003502 v9.CheckScriptFailure([
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003503 'vim9script',
3504 'var g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003505 ], 'E1016: Cannot declare a global variable:')
3506
Bram Moolenaar62aec932022-01-29 21:45:34 +00003507 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003508 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003509 'var b:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003510 ], 'E1016: Cannot declare a buffer variable:')
3511
Bram Moolenaar62aec932022-01-29 21:45:34 +00003512 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003513 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003514 'var w:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003515 ], 'E1016: Cannot declare a window variable:')
3516
Bram Moolenaar62aec932022-01-29 21:45:34 +00003517 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003518 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003519 'var t:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003520 ], 'E1016: Cannot declare a tab variable:')
3521
Bram Moolenaar62aec932022-01-29 21:45:34 +00003522 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003523 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003524 'var v:version = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003525 ], 'E1016: Cannot declare a v: variable:')
3526
Bram Moolenaar62aec932022-01-29 21:45:34 +00003527 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003528 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003529 'var $VARIABLE = "text"',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003530 ], 'E1016: Cannot declare an environment variable:')
Bram Moolenaar67979662020-06-20 22:50:47 +02003531
Bram Moolenaar62aec932022-01-29 21:45:34 +00003532 v9.CheckScriptFailure([
Bram Moolenaar67979662020-06-20 22:50:47 +02003533 'vim9script',
3534 'g:var = 123',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003535 'unlet g:var# comment1',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003536 ], 'E108:')
3537
Bram Moolenaar62aec932022-01-29 21:45:34 +00003538 v9.CheckScriptFailure([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003539 'let g:var = 123',
3540 'unlet g:var # something',
3541 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003542
Bram Moolenaar62aec932022-01-29 21:45:34 +00003543 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003544 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003545 'if 1 # comment2',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003546 ' echo "yes"',
3547 'elseif 2 #comment',
3548 ' echo "no"',
3549 'endif',
3550 ])
3551
Bram Moolenaar62aec932022-01-29 21:45:34 +00003552 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003553 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003554 'if 1# comment3',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003555 ' echo "yes"',
3556 'endif',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003557 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003558
Bram Moolenaar62aec932022-01-29 21:45:34 +00003559 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003560 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003561 'if 0 # comment4',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003562 ' echo "yes"',
3563 'elseif 2#comment',
3564 ' echo "no"',
3565 'endif',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003566 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003567
Bram Moolenaar62aec932022-01-29 21:45:34 +00003568 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003569 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003570 'var v = 1 # comment5',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003571 ])
3572
Bram Moolenaar62aec932022-01-29 21:45:34 +00003573 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003574 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003575 'var v = 1# comment6',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003576 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003577
Bram Moolenaar62aec932022-01-29 21:45:34 +00003578 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003579 'vim9script',
Bram Moolenaar2984ed32022-08-20 14:51:17 +01003580 'new',
Bram Moolenaard2c61702020-09-06 15:58:36 +02003581 'setline(1, ["# define pat", "last"])',
Bram Moolenaardf069ee2020-06-22 23:02:51 +02003582 ':$',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003583 'dsearch /pat/ #comment',
3584 'bwipe!',
3585 ])
3586
Bram Moolenaar62aec932022-01-29 21:45:34 +00003587 v9.CheckScriptFailure([
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003588 'vim9script',
Bram Moolenaar2984ed32022-08-20 14:51:17 +01003589 'new',
Bram Moolenaard2c61702020-09-06 15:58:36 +02003590 'setline(1, ["# define pat", "last"])',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003591 ':$',
3592 'dsearch /pat/#comment',
3593 'bwipe!',
3594 ], 'E488:')
3595
Bram Moolenaar62aec932022-01-29 21:45:34 +00003596 v9.CheckScriptFailure([
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003597 'vim9script',
3598 'func! SomeFunc()',
3599 ], 'E477:')
Bram Moolenaara26b9702020-04-18 19:53:28 +02003600enddef
3601
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003602def Test_finish()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003603 var lines =<< trim END
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003604 vim9script
Bram Moolenaar67979662020-06-20 22:50:47 +02003605 g:res = 'one'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003606 if v:false | finish | endif
Bram Moolenaar67979662020-06-20 22:50:47 +02003607 g:res = 'two'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003608 finish
Bram Moolenaar67979662020-06-20 22:50:47 +02003609 g:res = 'three'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003610 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003611 writefile(lines, 'Xfinished', 'D')
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003612 source Xfinished
3613 assert_equal('two', g:res)
3614
3615 unlet g:res
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003616enddef
3617
Bram Moolenaara5d00772020-05-14 23:20:55 +02003618def Test_forward_declaration()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003619 var lines =<< trim END
Bram Moolenaara5d00772020-05-14 23:20:55 +02003620 vim9script
Bram Moolenaara5d00772020-05-14 23:20:55 +02003621 def GetValue(): string
3622 return theVal
3623 enddef
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003624 var theVal = 'something'
Bram Moolenaar822ba242020-05-24 23:00:18 +02003625 g:initVal = GetValue()
Bram Moolenaara5d00772020-05-14 23:20:55 +02003626 theVal = 'else'
3627 g:laterVal = GetValue()
3628 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003629 writefile(lines, 'Xforward', 'D')
Bram Moolenaara5d00772020-05-14 23:20:55 +02003630 source Xforward
3631 assert_equal('something', g:initVal)
3632 assert_equal('else', g:laterVal)
3633
3634 unlet g:initVal
3635 unlet g:laterVal
Bram Moolenaara5d00772020-05-14 23:20:55 +02003636enddef
3637
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003638def Test_declare_script_var_in_func()
Bram Moolenaare535db82021-03-31 21:07:24 +02003639 var lines =<< trim END
3640 vim9script
3641 func Declare()
3642 let s:local = 123
3643 endfunc
3644 Declare()
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003645 END
3646 v9.CheckScriptFailure(lines, 'E1269:')
3647enddef
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00003648
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003649def Test_lock_script_var()
3650 var lines =<< trim END
3651 vim9script
3652 var local = 123
Bram Moolenaare535db82021-03-31 21:07:24 +02003653 assert_equal(123, local)
3654
3655 var error: string
3656 try
3657 local = 'asdf'
3658 catch
3659 error = v:exception
3660 endtry
3661 assert_match('E1012: Type mismatch; expected number but got string', error)
3662
3663 lockvar local
3664 try
3665 local = 999
3666 catch
3667 error = v:exception
3668 endtry
3669 assert_match('E741: Value is locked: local', error)
3670 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003671 v9.CheckScriptSuccess(lines)
Bram Moolenaare535db82021-03-31 21:07:24 +02003672enddef
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00003673
Bram Moolenaare535db82021-03-31 21:07:24 +02003674
Bram Moolenaar7d699702020-08-14 20:52:28 +02003675func Test_vim9script_not_global()
3676 " check that items defined in Vim9 script are script-local, not global
3677 let vim9lines =<< trim END
3678 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003679 var name = 'local'
Bram Moolenaar7d699702020-08-14 20:52:28 +02003680 func TheFunc()
3681 echo 'local'
3682 endfunc
3683 def DefFunc()
3684 echo 'local'
3685 enddef
3686 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003687 call writefile(vim9lines, 'Xvim9script.vim', 'D')
Bram Moolenaar7d699702020-08-14 20:52:28 +02003688 source Xvim9script.vim
3689 try
3690 echo g:var
3691 assert_report('did not fail')
3692 catch /E121:/
3693 " caught
3694 endtry
3695 try
3696 call TheFunc()
3697 assert_report('did not fail')
3698 catch /E117:/
3699 " caught
3700 endtry
3701 try
3702 call DefFunc()
3703 assert_report('did not fail')
3704 catch /E117:/
3705 " caught
3706 endtry
Bram Moolenaar7d699702020-08-14 20:52:28 +02003707endfunc
3708
Bram Moolenaareeb27bf2020-07-04 17:39:10 +02003709def Test_vim9_copen()
3710 # this was giving an error for setting w:quickfix_title
3711 copen
3712 quit
3713enddef
3714
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02003715def Test_script_var_in_autocmd()
3716 # using a script variable from an autocommand, defined in a :def function in a
3717 # legacy Vim script, cannot check the variable type.
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003718 var lines =<< trim END
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02003719 let s:counter = 1
3720 def s:Func()
3721 au! CursorHold
3722 au CursorHold * s:counter += 1
3723 enddef
3724 call s:Func()
3725 doau CursorHold
3726 call assert_equal(2, s:counter)
3727 au! CursorHold
3728 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003729 v9.CheckScriptSuccess(lines)
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02003730enddef
3731
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003732def Test_error_in_autoload_script()
3733 var save_rtp = &rtp
3734 var dir = getcwd() .. '/Xruntime'
3735 &rtp = dir
Bram Moolenaardd674772022-09-15 22:26:18 +01003736 mkdir(dir .. '/autoload', 'pR')
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003737
3738 var lines =<< trim END
3739 vim9script noclear
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003740 export def Autoloaded()
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003741 enddef
3742 def Broken()
3743 var x: any = ''
3744 eval x != 0
3745 enddef
3746 Broken()
3747 END
3748 writefile(lines, dir .. '/autoload/script.vim')
3749
3750 lines =<< trim END
3751 vim9script
3752 def CallAutoloaded()
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003753 script#Autoloaded()
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003754 enddef
3755
3756 function Legacy()
3757 try
3758 call s:CallAutoloaded()
3759 catch
3760 call assert_match('E1030: Using a String as a Number', v:exception)
3761 endtry
3762 endfunction
3763
3764 Legacy()
3765 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003766 v9.CheckScriptSuccess(lines)
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003767
3768 &rtp = save_rtp
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003769enddef
3770
Bram Moolenaar6809ff92022-07-26 15:10:56 +01003771def Test_error_in_autoload_script_foldexpr()
3772 var save_rtp = &rtp
Bram Moolenaardd674772022-09-15 22:26:18 +01003773 mkdir('Xvim/autoload', 'pR')
Bram Moolenaar6809ff92022-07-26 15:10:56 +01003774 &runtimepath = 'Xvim'
3775
3776 var lines =<< trim END
3777 vim9script
3778 eval [][0]
3779 echomsg 'no error'
3780 END
3781 lines->writefile('Xvim/autoload/script.vim')
3782
3783 lines =<< trim END
3784 vim9script
3785 import autoload 'script.vim'
3786 &foldmethod = 'expr'
3787 &foldexpr = 'script.Func()'
3788 redraw
3789 END
3790 v9.CheckScriptFailure(lines, 'E684: List index out of range: 0')
Bram Moolenaar6809ff92022-07-26 15:10:56 +01003791enddef
3792
Bram Moolenaare3d46852020-08-29 13:39:17 +02003793def Test_invalid_sid()
3794 assert_fails('func <SNR>1234_func', 'E123:')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02003795
Bram Moolenaar62aec932022-01-29 21:45:34 +00003796 if g:RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
Bram Moolenaard2c61702020-09-06 15:58:36 +02003797 assert_equal([], readfile('Xdidit'))
Bram Moolenaare3d46852020-08-29 13:39:17 +02003798 endif
3799 delete('Xdidit')
3800enddef
3801
Bram Moolenaar9ec70262020-12-09 17:16:59 +01003802def Test_restoring_cpo()
Bram Moolenaardd674772022-09-15 22:26:18 +01003803 writefile(['vim9script', 'set nocp'], 'Xsourced', 'D')
3804 writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003805 if g:RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
Bram Moolenaar9ec70262020-12-09 17:16:59 +01003806 assert_equal(['done'], readfile('Xdone'))
3807 endif
Bram Moolenaar090728a2020-12-20 15:43:31 +01003808 delete('Xdone')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003809
Bram Moolenaardd674772022-09-15 22:26:18 +01003810 writefile(['vim9script', 'g:cpoval = &cpo'], 'XanotherScript', 'D')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003811 set cpo=aABceFsMny>
3812 edit XanotherScript
3813 so %
3814 assert_equal('aABceFsMny>', &cpo)
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003815 assert_equal('aABceFs', g:cpoval)
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003816 :1del
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003817 setline(1, 'let g:cpoval = &cpo')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003818 w
3819 so %
3820 assert_equal('aABceFsMny>', &cpo)
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003821 assert_equal('aABceFsMny>', g:cpoval)
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003822
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003823 set cpo&vim
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003824 unlet g:cpoval
3825
3826 if has('unix')
3827 # 'cpo' is not restored in main vimrc
3828 var save_HOME = $HOME
3829 $HOME = getcwd() .. '/Xhome'
Bram Moolenaardd674772022-09-15 22:26:18 +01003830 mkdir('Xhome', 'R')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003831 var lines =<< trim END
3832 vim9script
Bram Moolenaarb18b4962022-09-02 21:55:50 +01003833 writefile(['before: ' .. &cpo], 'Xrporesult')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003834 set cpo+=M
Bram Moolenaarb18b4962022-09-02 21:55:50 +01003835 writefile(['after: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003836 END
3837 writefile(lines, 'Xhome/.vimrc')
3838
3839 lines =<< trim END
Bram Moolenaarb18b4962022-09-02 21:55:50 +01003840 call writefile(['later: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003841 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003842 writefile(lines, 'Xlegacy', 'D')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003843
3844 lines =<< trim END
3845 vim9script
Bram Moolenaarb18b4962022-09-02 21:55:50 +01003846 call writefile(['vim9: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003847 qa
3848 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003849 writefile(lines, 'Xvim9', 'D')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003850
Bram Moolenaar62aec932022-01-29 21:45:34 +00003851 var cmd = g:GetVimCommand() .. " -S Xlegacy -S Xvim9"
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003852 cmd = substitute(cmd, '-u NONE', '', '')
3853 exe "silent !" .. cmd
3854
3855 assert_equal([
3856 'before: aABceFs',
3857 'after: aABceFsM',
3858 'later: aABceFsM',
Bram Moolenaarb18b4962022-09-02 21:55:50 +01003859 'vim9: aABceFs'], readfile('Xrporesult'))
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003860
3861 $HOME = save_HOME
Bram Moolenaarb18b4962022-09-02 21:55:50 +01003862 delete('Xrporesult')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003863 endif
Bram Moolenaar9ec70262020-12-09 17:16:59 +01003864enddef
3865
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01003866" Use :function so we can use Check commands
3867func Test_no_redraw_when_restoring_cpo()
Bram Moolenaar37294bd2021-03-10 13:40:08 +01003868 CheckScreendump
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01003869 CheckFeature timers
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00003870 call Run_test_no_redraw_when_restoring_cpo()
3871endfunc
Bram Moolenaar37294bd2021-03-10 13:40:08 +01003872
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00003873def Run_test_no_redraw_when_restoring_cpo()
3874 var lines =<< trim END
Bram Moolenaar37294bd2021-03-10 13:40:08 +01003875 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003876 export def Func()
Bram Moolenaar37294bd2021-03-10 13:40:08 +01003877 enddef
3878 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003879 mkdir('Xnordir/autoload', 'pR')
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01003880 writefile(lines, 'Xnordir/autoload/script.vim')
Bram Moolenaar37294bd2021-03-10 13:40:08 +01003881
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00003882 lines =<< trim END
Bram Moolenaar37294bd2021-03-10 13:40:08 +01003883 vim9script
3884 set cpo+=M
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01003885 exe 'set rtp^=' .. getcwd() .. '/Xnordir'
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003886 au CmdlineEnter : ++once timer_start(0, (_) => script#Func())
Bram Moolenaar37294bd2021-03-10 13:40:08 +01003887 setline(1, 'some text')
3888 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003889 writefile(lines, 'XTest_redraw_cpo', 'D')
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00003890 var buf = g:RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
3891 term_sendkeys(buf, "V:")
3892 g:VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
Bram Moolenaar37294bd2021-03-10 13:40:08 +01003893
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00003894 # clean up
3895 term_sendkeys(buf, "\<Esc>u")
3896 g:StopVimInTerminal(buf)
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00003897enddef
3898
3899func Test_reject_declaration()
3900 CheckScreendump
3901 call Run_test_reject_declaration()
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01003902endfunc
Bram Moolenaar37294bd2021-03-10 13:40:08 +01003903
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00003904def Run_test_reject_declaration()
3905 var buf = g:RunVimInTerminal('', {'rows': 6})
3906 term_sendkeys(buf, ":vim9cmd var x: number\<CR>")
Bram Moolenaar330a3882022-03-05 11:05:57 +00003907 g:VerifyScreenDump(buf, 'Test_vim9_reject_declaration_1', {})
3908 term_sendkeys(buf, ":\<CR>")
3909 term_sendkeys(buf, ":vim9cmd g:foo = 123 | echo g:foo\<CR>")
3910 g:VerifyScreenDump(buf, 'Test_vim9_reject_declaration_2', {})
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00003911
3912 # clean up
3913 g:StopVimInTerminal(buf)
3914enddef
Bram Moolenaar9ec70262020-12-09 17:16:59 +01003915
Bram Moolenaar204852a2022-03-05 12:56:44 +00003916def Test_minimal_command_name_length()
3917 var names = [
3918 'cons',
3919 'brea',
3920 'cat',
3921 'catc',
3922 'con',
Bram Moolenaarb2175222022-03-05 20:24:41 +00003923 'cont',
3924 'conti',
3925 'contin',
3926 'continu',
Bram Moolenaar204852a2022-03-05 12:56:44 +00003927 'el',
3928 'els',
3929 'elsei',
3930 'endfo',
3931 'en',
3932 'end',
3933 'endi',
3934 'endw',
3935 'endt',
3936 'endtr',
Bram Moolenaarb2175222022-03-05 20:24:41 +00003937 'exp',
3938 'expo',
3939 'expor',
Bram Moolenaar204852a2022-03-05 12:56:44 +00003940 'fina',
3941 'finall',
Bram Moolenaard523c7b2022-03-06 14:51:22 +00003942 'fini',
3943 'finis',
Bram Moolenaarb2175222022-03-05 20:24:41 +00003944 'imp',
3945 'impo',
3946 'impor',
3947 'retu',
3948 'retur',
Bram Moolenaar204852a2022-03-05 12:56:44 +00003949 'th',
3950 'thr',
3951 'thro',
3952 'wh',
3953 'whi',
3954 'whil',
3955 ]
3956 for name in names
3957 v9.CheckDefAndScriptFailure([name .. ' '], 'E1065:')
3958 endfor
Bram Moolenaarb2175222022-03-05 20:24:41 +00003959
3960 var lines =<< trim END
3961 vim9script
3962 def SomeFunc()
3963 endd
3964 END
3965 v9.CheckScriptFailure(lines, 'E1065:')
3966 lines =<< trim END
3967 vim9script
3968 def SomeFunc()
3969 endde
3970 END
3971 v9.CheckScriptFailure(lines, 'E1065:')
Bram Moolenaar204852a2022-03-05 12:56:44 +00003972enddef
3973
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02003974def Test_unset_any_variable()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003975 var lines =<< trim END
3976 var name: any
3977 assert_equal(0, name)
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02003978 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003979 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02003980enddef
3981
Bram Moolenaar7e9210e2020-09-25 23:12:51 +02003982func Test_define_func_at_command_line()
Bram Moolenaar58dbef32020-09-25 22:13:05 +02003983 CheckRunVimInTerminal
3984
Bram Moolenaar7e9210e2020-09-25 23:12:51 +02003985 " call indirectly to avoid compilation error for missing functions
3986 call Run_Test_define_func_at_command_line()
3987endfunc
3988
3989def Run_Test_define_func_at_command_line()
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02003990 # run in a separate Vim instance to avoid the script context
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003991 var lines =<< trim END
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02003992 func CheckAndQuit()
3993 call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
3994 call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
3995 endfunc
3996 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003997 writefile([''], 'Xdidcmd', 'D')
3998 writefile(lines, 'XcallFunc', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003999 var buf = g:RunVimInTerminal('-S XcallFunc', {rows: 6})
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004000 # define Afunc() on the command line
4001 term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
4002 term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004003 g:WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004004
Bram Moolenaar62aec932022-01-29 21:45:34 +00004005 call g:StopVimInTerminal(buf)
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004006enddef
4007
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004008def Test_script_var_scope()
4009 var lines =<< trim END
4010 vim9script
4011 if true
4012 if true
4013 var one = 'one'
4014 echo one
4015 endif
4016 echo one
4017 endif
4018 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004019 v9.CheckScriptFailure(lines, 'E121:', 7)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004020
4021 lines =<< trim END
4022 vim9script
4023 if true
4024 if false
4025 var one = 'one'
4026 echo one
4027 else
4028 var one = 'one'
4029 echo one
4030 endif
4031 echo one
4032 endif
4033 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004034 v9.CheckScriptFailure(lines, 'E121:', 10)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004035
4036 lines =<< trim END
4037 vim9script
4038 while true
4039 var one = 'one'
4040 echo one
4041 break
4042 endwhile
4043 echo one
4044 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004045 v9.CheckScriptFailure(lines, 'E121:', 7)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004046
4047 lines =<< trim END
4048 vim9script
4049 for i in range(1)
4050 var one = 'one'
4051 echo one
4052 endfor
4053 echo one
4054 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004055 v9.CheckScriptFailure(lines, 'E121:', 6)
Bram Moolenaar9becdf22020-10-10 21:33:48 +02004056
4057 lines =<< trim END
4058 vim9script
4059 {
4060 var one = 'one'
4061 assert_equal('one', one)
4062 }
4063 assert_false(exists('one'))
4064 assert_false(exists('s:one'))
4065 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004066 v9.CheckScriptSuccess(lines)
Bram Moolenaar9becdf22020-10-10 21:33:48 +02004067
4068 lines =<< trim END
4069 vim9script
4070 {
4071 var one = 'one'
4072 echo one
4073 }
4074 echo one
4075 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004076 v9.CheckScriptFailure(lines, 'E121:', 6)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004077enddef
4078
Bram Moolenaar352134b2020-10-17 22:04:08 +02004079def Test_catch_exception_in_callback()
4080 var lines =<< trim END
4081 vim9script
Bram Moolenaar2a389082021-04-09 20:24:31 +02004082 def Callback(...l: list<any>)
Bram Moolenaar352134b2020-10-17 22:04:08 +02004083 try
4084 var x: string
4085 var y: string
4086 # this error should be caught with CHECKLEN
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +00004087 var sl = ['']
4088 [x, y] = sl
Bram Moolenaar352134b2020-10-17 22:04:08 +02004089 catch
4090 g:caught = 'yes'
4091 endtry
4092 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01004093 popup_menu('popup', {callback: Callback})
Bram Moolenaar352134b2020-10-17 22:04:08 +02004094 feedkeys("\r", 'xt')
4095 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004096 v9.CheckScriptSuccess(lines)
Bram Moolenaar352134b2020-10-17 22:04:08 +02004097
4098 unlet g:caught
4099enddef
4100
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004101def Test_no_unknown_error_after_error()
4102 if !has('unix') || !has('job')
4103 throw 'Skipped: not unix of missing +job feature'
4104 endif
Bram Moolenaarb16ff292021-09-26 20:14:39 +01004105 # FIXME: this check should not be needed
4106 if has('win32')
4107 throw 'Skipped: does not work on MS-Windows'
4108 endif
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004109 var lines =<< trim END
4110 vim9script
4111 var source: list<number>
Bram Moolenaar2a389082021-04-09 20:24:31 +02004112 def Out_cb(...l: list<any>)
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004113 eval [][0]
4114 enddef
Bram Moolenaar2a389082021-04-09 20:24:31 +02004115 def Exit_cb(...l: list<any>)
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004116 sleep 1m
Bram Moolenaar23d44492022-05-04 16:24:57 +01004117 g:did_call_exit_cb = true
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004118 source += l
4119 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01004120 var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
Bram Moolenaar6f17a3f2020-12-21 18:11:24 +01004121 while job_status(myjob) == 'run'
4122 sleep 10m
4123 endwhile
Bram Moolenaar206c2a62021-01-31 14:04:44 +01004124 # wait for Exit_cb() to be called
Bram Moolenaar23d44492022-05-04 16:24:57 +01004125 for x in range(100)
4126 if exists('g:did_call_exit_cb')
4127 unlet g:did_call_exit_cb
4128 break
4129 endif
4130 sleep 10m
4131 endfor
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004132 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004133 writefile(lines, 'Xdef', 'D')
Yee Cheng Chin69a8bb82022-11-06 12:25:47 +00004134 # Either the exit or out callback is called first, accept them in any order
4135 assert_fails('so Xdef', ['E684:\|E1012:', 'E1012:\|E684:'])
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004136enddef
4137
Bram Moolenaar4324d872020-12-01 20:12:24 +01004138def InvokeNormal()
4139 exe "norm! :m+1\r"
4140enddef
4141
4142def Test_invoke_normal_in_visual_mode()
4143 xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
4144 new
4145 setline(1, ['aaa', 'bbb'])
4146 feedkeys("V\<F3>", 'xt')
4147 assert_equal(['bbb', 'aaa'], getline(1, 2))
4148 xunmap <F3>
4149enddef
4150
Bram Moolenaarb5b94802020-12-13 17:50:20 +01004151def Test_white_space_after_command()
4152 var lines =<< trim END
4153 exit_cb: Func})
4154 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004155 v9.CheckDefAndScriptFailure(lines, 'E1144:', 1)
Bram Moolenaarf8103f22020-12-25 17:36:27 +01004156
4157 lines =<< trim END
4158 e#
4159 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004160 v9.CheckDefAndScriptFailure(lines, 'E1144:', 1)
Bram Moolenaarb5b94802020-12-13 17:50:20 +01004161enddef
4162
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004163def Test_script_var_gone_when_sourced_twice()
4164 var lines =<< trim END
4165 vim9script
4166 if exists('g:guard')
4167 finish
4168 endif
4169 g:guard = 1
4170 var name = 'thename'
4171 def g:GetName(): string
4172 return name
4173 enddef
4174 def g:SetName(arg: string)
4175 name = arg
4176 enddef
4177 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004178 writefile(lines, 'XscriptTwice.vim', 'D')
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004179 so XscriptTwice.vim
4180 assert_equal('thename', g:GetName())
4181 g:SetName('newname')
4182 assert_equal('newname', g:GetName())
4183 so XscriptTwice.vim
4184 assert_fails('call g:GetName()', 'E1149:')
4185 assert_fails('call g:SetName("x")', 'E1149:')
4186
4187 delfunc g:GetName
4188 delfunc g:SetName
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004189 unlet g:guard
4190enddef
4191
Bram Moolenaar10b94212021-02-19 21:42:57 +01004192def Test_unsupported_commands()
4193 var lines =<< trim END
4194 ka
4195 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004196 v9.CheckDefAndScriptFailure(lines, ['E476:', 'E492:'])
Bram Moolenaar10b94212021-02-19 21:42:57 +01004197
4198 lines =<< trim END
Bram Moolenaarada1d872021-02-20 08:16:51 +01004199 :1ka
4200 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004201 v9.CheckDefAndScriptFailure(lines, ['E476:', 'E492:'])
Bram Moolenaarada1d872021-02-20 08:16:51 +01004202
4203 lines =<< trim END
Yegappan Lakshmanan885de442022-04-23 10:51:14 +01004204 :k a
4205 END
4206 v9.CheckDefAndScriptFailure(lines, 'E1100:')
4207
4208 lines =<< trim END
4209 :1k a
4210 END
4211 v9.CheckDefAndScriptFailure(lines, 'E481:')
4212
4213 lines =<< trim END
Bram Moolenaar10b94212021-02-19 21:42:57 +01004214 t
4215 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004216 v9.CheckDefAndScriptFailure(lines, 'E1100:')
Bram Moolenaar10b94212021-02-19 21:42:57 +01004217
4218 lines =<< trim END
4219 x
4220 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004221 v9.CheckDefAndScriptFailure(lines, 'E1100:')
Bram Moolenaar10b94212021-02-19 21:42:57 +01004222
4223 lines =<< trim END
4224 xit
4225 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004226 v9.CheckDefAndScriptFailure(lines, 'E1100:')
4227
4228 lines =<< trim END
4229 Print
4230 END
4231 v9.CheckDefAndScriptFailure(lines, ['E476: Invalid command: Print', 'E492: Not an editor command: Print'])
4232
4233 lines =<< trim END
4234 mode 4
4235 END
4236 v9.CheckDefAndScriptFailure(lines, ['E476: Invalid command: mode 4', 'E492: Not an editor command: mode 4'])
Bram Moolenaar10b94212021-02-19 21:42:57 +01004237enddef
4238
Bram Moolenaarc70fe462021-04-17 17:59:19 +02004239def Test_mapping_line_number()
4240 var lines =<< trim END
4241 vim9script
4242 def g:FuncA()
4243 # Some comment
4244 FuncB(0)
4245 enddef
4246 # Some comment
4247 def FuncB(
4248 # Some comment
4249 n: number
4250 )
4251 exe 'nno '
4252 # Some comment
4253 .. '<F3> a'
4254 .. 'b'
4255 .. 'c'
4256 enddef
4257 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004258 v9.CheckScriptSuccess(lines)
Bram Moolenaarc70fe462021-04-17 17:59:19 +02004259 var res = execute('verbose nmap <F3>')
4260 assert_match('No mapping found', res)
4261
4262 g:FuncA()
4263 res = execute('verbose nmap <F3>')
4264 assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
4265
4266 nunmap <F3>
4267 delfunc g:FuncA
4268enddef
4269
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004270def Test_option_set()
4271 # legacy script allows for white space
4272 var lines =<< trim END
4273 set foldlevel =11
4274 call assert_equal(11, &foldlevel)
4275 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004276 v9.CheckScriptSuccess(lines)
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004277
4278 set foldlevel
4279 set foldlevel=12
4280 assert_equal(12, &foldlevel)
4281 set foldlevel+=2
4282 assert_equal(14, &foldlevel)
4283 set foldlevel-=3
4284 assert_equal(11, &foldlevel)
4285
4286 lines =<< trim END
4287 set foldlevel =1
4288 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004289 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004290
4291 lines =<< trim END
4292 set foldlevel +=1
4293 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004294 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004295
4296 lines =<< trim END
4297 set foldlevel ^=1
4298 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004299 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004300
4301 lines =<< trim END
4302 set foldlevel -=1
4303 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004304 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004305
4306 set foldlevel&
4307enddef
4308
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004309def Test_option_modifier()
Bram Moolenaar1594f312021-07-08 16:40:13 +02004310 # legacy script allows for white space
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004311 var lines =<< trim END
4312 set hlsearch & hlsearch !
4313 call assert_equal(1, &hlsearch)
4314 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004315 v9.CheckScriptSuccess(lines)
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004316
Bram Moolenaar1594f312021-07-08 16:40:13 +02004317 set hlsearch
4318 set hlsearch!
4319 assert_equal(false, &hlsearch)
4320
4321 set hlsearch
4322 set hlsearch&
4323 assert_equal(false, &hlsearch)
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004324
4325 lines =<< trim END
Bram Moolenaar1594f312021-07-08 16:40:13 +02004326 set hlsearch &
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004327 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004328 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &')
Bram Moolenaar1594f312021-07-08 16:40:13 +02004329
4330 lines =<< trim END
4331 set hlsearch !
4332 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004333 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !')
Bram Moolenaar1594f312021-07-08 16:40:13 +02004334
4335 set hlsearch&
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004336enddef
4337
Bram Moolenaarc03fe662021-07-11 16:52:45 +02004338" This must be called last, it may cause following :def functions to fail
4339def Test_xxx_echoerr_line_number()
4340 var lines =<< trim END
4341 echoerr 'some'
4342 .. ' error'
4343 .. ' continued'
4344 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004345 v9.CheckDefExecAndScriptFailure(lines, 'some error continued', 1)
Bram Moolenaarc03fe662021-07-11 16:52:45 +02004346enddef
4347
Bram Moolenaar9537e372021-12-10 21:05:53 +00004348func Test_debug_with_lambda()
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004349 CheckRunVimInTerminal
4350
Bram Moolenaar9537e372021-12-10 21:05:53 +00004351 " call indirectly to avoid compilation error for missing functions
4352 call Run_Test_debug_with_lambda()
4353endfunc
4354
4355def Run_Test_debug_with_lambda()
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004356 var lines =<< trim END
4357 vim9script
4358 def Func()
4359 var n = 0
4360 echo [0]->filter((_, v) => v == n)
4361 enddef
4362 breakadd func Func
4363 Func()
4364 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004365 writefile(lines, 'XdebugFunc', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00004366 var buf = g:RunVimInTerminal('-S XdebugFunc', {rows: 6, wait_for_ruler: 0})
4367 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 6)))
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004368
4369 term_sendkeys(buf, "cont\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004370 g:WaitForAssert(() => assert_match('\[0\]', term_getline(buf, 5)))
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004371
Bram Moolenaar62aec932022-01-29 21:45:34 +00004372 g:StopVimInTerminal(buf)
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004373enddef
4374
Bram Moolenaar310091d2021-12-23 21:14:37 +00004375func Test_debug_running_out_of_lines()
4376 CheckRunVimInTerminal
4377
4378 " call indirectly to avoid compilation error for missing functions
4379 call Run_Test_debug_running_out_of_lines()
4380endfunc
4381
4382def Run_Test_debug_running_out_of_lines()
4383 var lines =<< trim END
4384 vim9script
4385 def Crash()
4386 #
4387 #
4388 #
4389 #
4390 #
4391 #
4392 #
4393 if true
4394 #
4395 endif
4396 enddef
4397 breakadd func Crash
4398 Crash()
4399 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004400 writefile(lines, 'XdebugFunc', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00004401 var buf = g:RunVimInTerminal('-S XdebugFunc', {rows: 6, wait_for_ruler: 0})
4402 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 6)))
Bram Moolenaar310091d2021-12-23 21:14:37 +00004403
4404 term_sendkeys(buf, "next\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004405 g:TermWait(buf)
4406 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 6)))
Bram Moolenaar310091d2021-12-23 21:14:37 +00004407
4408 term_sendkeys(buf, "cont\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004409 g:TermWait(buf)
Bram Moolenaar310091d2021-12-23 21:14:37 +00004410
Bram Moolenaar62aec932022-01-29 21:45:34 +00004411 g:StopVimInTerminal(buf)
Bram Moolenaar310091d2021-12-23 21:14:37 +00004412enddef
4413
dundargocc57b5bc2022-11-02 13:30:51 +00004414def Test_ambiguous_command_error()
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004415 var lines =<< trim END
4416 vim9script
4417 command CmdA echomsg 'CmdA'
4418 command CmdB echomsg 'CmdB'
4419 Cmd
4420 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004421 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 4)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004422
4423 lines =<< trim END
4424 vim9script
4425 def Func()
4426 Cmd
4427 enddef
4428 Func()
4429 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004430 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 1)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004431
4432 lines =<< trim END
4433 vim9script
4434 nnoremap <F3> <ScriptCmd>Cmd<CR>
4435 feedkeys("\<F3>", 'xt')
4436 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004437 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 3)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004438
4439 delcommand CmdA
4440 delcommand CmdB
4441 nunmap <F3>
4442enddef
4443
Dominique Pelle923dce22021-11-21 11:36:04 +00004444" Execute this near the end, profiling doesn't stop until Vim exits.
Bram Moolenaard9162552021-07-11 15:26:13 +02004445" This only tests that it works, not the profiling output.
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004446def Test_profile_with_lambda()
Bram Moolenaar4ece1522021-07-11 16:31:51 +02004447 CheckFeature profile
4448
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004449 var lines =<< trim END
4450 vim9script
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004451
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004452 def ProfiledWithLambda()
4453 var n = 3
4454 echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n)
4455 enddef
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004456
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004457 def ProfiledNested()
4458 var x = 0
4459 def Nested(): any
4460 return x
4461 enddef
4462 Nested()
4463 enddef
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004464
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004465 def g:ProfiledNestedProfiled()
4466 var x = 0
4467 def Nested(): any
4468 return x
4469 enddef
4470 Nested()
4471 enddef
4472
4473 def Profile()
Bram Moolenaar48f69cd2022-03-15 16:16:47 +00004474 ProfiledWithLambda()
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004475 ProfiledNested()
4476
Bram Moolenaar48f69cd2022-03-15 16:16:47 +00004477 # Also profile the nested function. Use a different function, although
4478 # the contents is the same, to make sure it was not already compiled.
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004479 profile func *
4480 g:ProfiledNestedProfiled()
4481
4482 profdel func *
4483 profile pause
4484 enddef
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004485
4486 var result = 'done'
4487 try
4488 # mark functions for profiling now to avoid E1271
4489 profile start Xprofile.log
4490 profile func ProfiledWithLambda
4491 profile func ProfiledNested
4492
4493 Profile()
4494 catch
4495 result = 'failed: ' .. v:exception
4496 finally
4497 writefile([result], 'Xdidprofile')
4498 endtry
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004499 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004500 writefile(lines, 'Xprofile.vim', 'D')
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004501 call system(g:GetVimCommand()
4502 .. ' --clean'
4503 .. ' -c "so Xprofile.vim"'
4504 .. ' -c "qall!"')
4505 call assert_equal(0, v:shell_error)
4506
4507 assert_equal(['done'], readfile('Xdidprofile'))
4508 assert_true(filereadable('Xprofile.log'))
4509 delete('Xdidprofile')
4510 delete('Xprofile.log')
Bram Moolenaard9162552021-07-11 15:26:13 +02004511enddef
4512
Bram Moolenaar4f6e7722022-03-16 20:26:02 +00004513func Test_misplaced_type()
4514 CheckRunVimInTerminal
4515 call Run_Test_misplaced_type()
4516endfunc
4517
4518def Run_Test_misplaced_type()
Bram Moolenaar9510d222022-09-11 15:14:05 +01004519 writefile(['let g:somevar = "asdf"'], 'XTest_misplaced_type', 'D')
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004520 var buf = g:RunVimInTerminal('-S XTest_misplaced_type', {'rows': 6})
Bram Moolenaar9510d222022-09-11 15:14:05 +01004521 term_sendkeys(buf, ":vim9cmd echo islocked('somevar: string')\<CR>")
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004522 g:VerifyScreenDump(buf, 'Test_misplaced_type', {})
4523
4524 g:StopVimInTerminal(buf)
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004525enddef
4526
LemonBoya5d35902022-04-29 21:15:02 +01004527" Ensure echo doesn't crash when stringifying empty variables.
4528def Test_echo_uninit_variables()
4529 var res: string
4530
4531 var var_bool: bool
4532 var var_num: number
4533 var var_float: float
4534 var Var_func: func
4535 var var_string: string
4536 var var_blob: blob
LemonBoya5d35902022-04-29 21:15:02 +01004537 var var_list: list<any>
4538 var var_dict: dict<any>
4539
4540 redir => res
4541 echo var_bool
4542 echo var_num
4543 echo var_float
4544 echo Var_func
4545 echo var_string
4546 echo var_blob
LemonBoya5d35902022-04-29 21:15:02 +01004547 echo var_list
4548 echo var_dict
4549 redir END
4550
Bram Moolenaarf1d63b92022-05-06 13:37:42 +01004551 assert_equal(['false', '0', '0.0', 'function()', '', '0z', '[]', '{}'], res->split('\n'))
4552
4553 if has('job')
4554 var var_job: job
4555 var var_channel: channel
4556
4557 redir => res
4558 echo var_job
4559 echo var_channel
4560 redir END
4561
4562 assert_equal(['no process', 'channel fail'], res->split('\n'))
4563 endif
LemonBoya5d35902022-04-29 21:15:02 +01004564enddef
4565
Bram Moolenaar6342e2c2022-12-12 18:56:32 +00004566def Test_free_type_before_use()
4567 # this rather complicated script was freeing a type before using it
4568 var lines =<< trim END
4569 vim9script
4570
4571 def Scan(rel: list<dict<any>>): func(func(dict<any>))
4572 return (Emit: func(dict<any>)) => {
4573 for t in rel
4574 Emit(t)
4575 endfor
4576 }
4577 enddef
4578
4579 def Build(Cont: func(func(dict<any>))): list<dict<any>>
4580 var rel: list<dict<any>> = []
4581 Cont((t) => {
4582 add(rel, t)
4583 })
4584 return rel
4585 enddef
4586
4587 var R = [{A: 0}]
4588 var result = Scan(R)->Build()
4589 result = Scan(R)->Build()
4590
4591 assert_equal(R, result)
4592 END
4593 v9.CheckScriptSuccess(lines)
4594enddef
4595
Bram Moolenaar585fea72020-04-02 22:33:21 +02004596" Keep this last, it messes up highlighting.
4597def Test_substitute_cmd()
4598 new
4599 setline(1, 'something')
4600 :substitute(some(other(
4601 assert_equal('otherthing', getline(1))
4602 bwipe!
4603
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02004604 # also when the context is Vim9 script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004605 var lines =<< trim END
Bram Moolenaar585fea72020-04-02 22:33:21 +02004606 vim9script
4607 new
4608 setline(1, 'something')
4609 :substitute(some(other(
4610 assert_equal('otherthing', getline(1))
4611 bwipe!
4612 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004613 writefile(lines, 'Xvim9lines', 'D')
Bram Moolenaar585fea72020-04-02 22:33:21 +02004614 source Xvim9lines
Bram Moolenaar585fea72020-04-02 22:33:21 +02004615enddef
4616
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01004617" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker