blob: 0e2133492768bfed7ef4f9f8b1cc3ef6d23e4e65 [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 Moolenaara2c00282023-05-14 22:05:15 +0100815def Test_unreachable_after()
816 var lines =<< trim END
817 try
818 throw 'Error'
819 echo 'not reached'
820 catch /Error/
821 endtry
822 END
823 v9.CheckDefFailure(lines, 'E1095: Unreachable code after :throw')
824
825 lines =<< trim END
826 def SomeFunc(): number
827 try
828 return 3
829 echo 'not reached'
830 catch /Error/
831 endtry
832 return 4
833 enddef
834 defcompile
835 END
836 v9.CheckScriptFailure(lines, 'E1095: Unreachable code after :return')
837enddef
838
Bram Moolenaar3ef2e412023-04-30 18:50:48 +0100839def Test_throw_in_nested_try()
840 var lines =<< trim END
841 vim9script
842
843 def Try(F: func(): void)
844 try
845 F()
846 catch
847 endtry
848 enddef
849
850 class X
851 def F()
852 try
853 throw 'Foobar'
854 catch
855 throw v:exception
856 endtry
857 enddef
858 endclass
859
860 def Test_TryMethod()
861 var x = X.new()
862 Try(() => x.F())
863 enddef
864
865
866 try
867 Test_TryMethod()
868 catch
869 endtry
870 END
871 v9.CheckScriptSuccess(lines)
872enddef
873
Bram Moolenaar28bf6492022-03-03 15:11:20 +0000874def Test_try_var_decl()
875 var lines =<< trim END
876 vim9script
877 try
878 var in_try = 1
879 assert_equal(1, get(s:, 'in_try', -1))
880 throw "getout"
881 catch
882 var in_catch = 2
883 assert_equal(-1, get(s:, 'in_try', -1))
884 assert_equal(2, get(s:, 'in_catch', -1))
885 finally
886 var in_finally = 3
887 assert_equal(-1, get(s:, 'in_try', -1))
888 assert_equal(-1, get(s:, 'in_catch', -1))
889 assert_equal(3, get(s:, 'in_finally', -1))
890 endtry
891 assert_equal(-1, get(s:, 'in_try', -1))
892 assert_equal(-1, get(s:, 'in_catch', -1))
893 assert_equal(-1, get(s:, 'in_finally', -1))
894 END
895 v9.CheckScriptSuccess(lines)
896enddef
897
Bram Moolenaar53c29612022-01-12 16:18:18 +0000898def Test_try_ends_in_return()
899 var lines =<< trim END
900 vim9script
901 def Foo(): string
902 try
903 return 'foo'
904 catch
905 return 'caught'
906 endtry
907 enddef
908 assert_equal('foo', Foo())
909 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000910 v9.CheckScriptSuccess(lines)
Bram Moolenaar53c29612022-01-12 16:18:18 +0000911
912 lines =<< trim END
913 vim9script
914 def Foo(): string
915 try
916 return 'foo'
917 catch
918 return 'caught'
919 endtry
920 echo 'notreached'
921 enddef
922 assert_equal('foo', Foo())
923 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000924 v9.CheckScriptFailure(lines, 'E1095:')
Bram Moolenaar53c29612022-01-12 16:18:18 +0000925
926 lines =<< trim END
927 vim9script
928 def Foo(): string
929 try
930 return 'foo'
931 catch /x/
932 return 'caught'
933 endtry
934 enddef
935 assert_equal('foo', Foo())
936 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000937 v9.CheckScriptFailure(lines, 'E1027:')
Bram Moolenaar53c29612022-01-12 16:18:18 +0000938
939 lines =<< trim END
940 vim9script
941 def Foo(): string
942 try
943 echo 'foo'
944 catch
945 echo 'caught'
946 finally
947 return 'done'
948 endtry
949 enddef
950 assert_equal('done', Foo())
951 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000952 v9.CheckScriptSuccess(lines)
Bram Moolenaar53c29612022-01-12 16:18:18 +0000953
954enddef
955
Bram Moolenaar3f987b52021-06-30 12:02:24 +0200956def Test_try_in_catch()
957 var lines =<< trim END
958 vim9script
959 var seq = []
960 def DoIt()
961 try
962 seq->add('throw 1')
963 eval [][0]
964 seq->add('notreached')
965 catch
966 seq->add('catch')
967 try
968 seq->add('throw 2')
969 eval [][0]
970 seq->add('notreached')
971 catch /nothing/
972 seq->add('notreached')
973 endtry
974 seq->add('done')
975 endtry
976 enddef
977 DoIt()
978 assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq)
979 END
980enddef
981
Bram Moolenaard3d8fee2021-06-30 19:54:43 +0200982def Test_error_in_catch()
983 var lines =<< trim END
984 try
985 eval [][0]
986 catch /E684:/
987 eval [][0]
988 endtry
989 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000990 v9.CheckDefExecFailure(lines, 'E684:', 4)
Bram Moolenaard3d8fee2021-06-30 19:54:43 +0200991enddef
992
Bram Moolenaar2e34c342021-03-14 12:13:33 +0100993" :while at the very start of a function that :continue jumps to
Bram Moolenaar62aec932022-01-29 21:45:34 +0000994def s:TryContinueFunc()
Bram Moolenaar2e34c342021-03-14 12:13:33 +0100995 while g:Count < 2
996 g:sequence ..= 't'
997 try
998 echoerr 'Test'
999 catch
1000 g:Count += 1
1001 g:sequence ..= 'c'
1002 continue
1003 endtry
1004 g:sequence ..= 'e'
1005 g:Count += 1
1006 endwhile
1007enddef
1008
1009def Test_continue_in_try_in_while()
1010 g:Count = 0
1011 g:sequence = ''
1012 TryContinueFunc()
1013 assert_equal('tctc', g:sequence)
1014 unlet g:Count
1015 unlet g:sequence
1016enddef
1017
Bram Moolenaar873f8242022-03-10 21:53:44 +00001018def Test_break_in_try_in_for()
1019 var lines =<< trim END
1020 vim9script
1021 def Ls(): list<string>
1022 var ls: list<string>
1023 for s in ['abc', 'def']
1024 for _ in [123, 456]
1025 try
1026 eval [][0]
1027 catch
1028 break
1029 endtry
1030 endfor
1031 ls += [s]
1032 endfor
1033 return ls
1034 enddef
1035 assert_equal(['abc', 'def'], Ls())
1036 END
1037 v9.CheckScriptSuccess(lines)
1038enddef
1039
Bram Moolenaar9cb577a2021-02-22 22:45:10 +01001040def Test_nocatch_return_in_try()
1041 # return in try block returns normally
1042 def ReturnInTry(): string
1043 try
1044 return '"some message"'
1045 catch
1046 endtry
1047 return 'not reached'
1048 enddef
1049 exe 'echoerr ' .. ReturnInTry()
1050enddef
1051
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001052def Test_cnext_works_in_catch()
1053 var lines =<< trim END
1054 vim9script
Bram Moolenaarc3235272021-07-10 19:42:03 +02001055 au BufEnter * eval 1 + 2
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001056 writefile(['text'], 'Xcncfile1')
1057 writefile(['text'], 'Xcncfile2')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001058 var items = [
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001059 {lnum: 1, filename: 'Xcncfile1', valid: true},
1060 {lnum: 1, filename: 'Xcncfile2', valid: true}
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001061 ]
1062 setqflist([], ' ', {items: items})
1063 cwindow
1064
1065 def CnextOrCfirst()
1066 # if cnext fails, cfirst is used
1067 try
1068 cnext
1069 catch
1070 cfirst
1071 endtry
1072 enddef
1073
1074 CnextOrCfirst()
1075 CnextOrCfirst()
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001076 writefile([getqflist({idx: 0}).idx], 'Xcncresult')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001077 qall
1078 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001079 writefile(lines, 'XCatchCnext', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001080 g:RunVim([], [], '--clean -S XCatchCnext')
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001081 assert_equal(['1'], readfile('Xcncresult'))
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001082
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001083 delete('Xcncfile1')
1084 delete('Xcncfile2')
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001085 delete('Xcncresult')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001086enddef
1087
Bram Moolenaar9e1d9e32021-01-11 20:17:34 +01001088def Test_throw_skipped()
1089 if 0
1090 throw dontgethere
1091 endif
1092enddef
1093
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001094def Test_nocatch_throw_silenced()
1095 var lines =<< trim END
1096 vim9script
1097 def Func()
1098 throw 'error'
1099 enddef
1100 silent! Func()
1101 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001102 writefile(lines, 'XthrowSilenced', 'D')
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001103 source XthrowSilenced
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001104enddef
1105
Bram Moolenaara2c00282023-05-14 22:05:15 +01001106" g:DeletedFunc() is found when compiling Test_try_catch_throw() and then
1107" deleted, this should give a runtime error.
Bram Moolenaare8593122020-07-18 15:17:02 +02001108def DeletedFunc(): list<any>
1109 return ['delete me']
1110enddef
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001111defcompile DeletedFunc
1112
1113call test_override('unreachable', 1)
1114defcompile Test_try_catch_throw
1115call test_override('unreachable', 0)
1116
Bram Moolenaare8593122020-07-18 15:17:02 +02001117delfunc DeletedFunc
1118
Bram Moolenaar62aec932022-01-29 21:45:34 +00001119def s:ThrowFromDef()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001120 throw "getout" # comment
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001121enddef
1122
Bram Moolenaar62aec932022-01-29 21:45:34 +00001123func s:CatchInFunc()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001124 try
Bram Moolenaar62aec932022-01-29 21:45:34 +00001125 call s:ThrowFromDef()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001126 catch
1127 let g:thrown_func = v:exception
1128 endtry
1129endfunc
1130
Bram Moolenaar62aec932022-01-29 21:45:34 +00001131def s:CatchInDef()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001132 try
1133 ThrowFromDef()
1134 catch
1135 g:thrown_def = v:exception
1136 endtry
1137enddef
1138
Bram Moolenaar62aec932022-01-29 21:45:34 +00001139def s:ReturnFinally(): string
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001140 try
1141 return 'intry'
Bram Moolenaar204852a2022-03-05 12:56:44 +00001142 finally
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001143 g:in_finally = 'finally'
1144 endtry
1145 return 'end'
1146enddef
1147
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001148def Test_try_catch_nested()
1149 CatchInFunc()
1150 assert_equal('getout', g:thrown_func)
1151
1152 CatchInDef()
1153 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001154
1155 assert_equal('intry', ReturnFinally())
1156 assert_equal('finally', g:in_finally)
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001157
1158 var l = []
1159 try
1160 l->add('1')
1161 throw 'bad'
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001162 l->add('x') # "unreachable code"
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001163 catch /bad/
1164 l->add('2')
1165 try
1166 l->add('3')
1167 throw 'one'
1168 l->add('x')
1169 catch /one/
1170 l->add('4')
1171 try
1172 l->add('5')
1173 throw 'more'
1174 l->add('x')
1175 catch /more/
1176 l->add('6')
1177 endtry
1178 endtry
1179 endtry
1180 assert_equal(['1', '2', '3', '4', '5', '6'], l)
Bram Moolenaar834193a2021-06-30 20:39:15 +02001181
1182 l = []
1183 try
1184 try
1185 l->add('1')
1186 throw 'foo'
1187 l->add('x')
1188 catch
1189 l->add('2')
1190 throw 'bar'
1191 l->add('x')
1192 finally
1193 l->add('3')
1194 endtry
1195 l->add('x')
1196 catch /bar/
1197 l->add('4')
1198 endtry
1199 assert_equal(['1', '2', '3', '4'], l)
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001200enddef
1201
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001202call test_override('unreachable', 1)
1203defcompile Test_try_catch_nested
1204call test_override('unreachable', 0)
1205
Bram Moolenaar62aec932022-01-29 21:45:34 +00001206def s:TryOne(): number
Bram Moolenaar9939f572020-09-16 22:29:52 +02001207 try
1208 return 0
1209 catch
1210 endtry
1211 return 0
1212enddef
1213
Bram Moolenaar62aec932022-01-29 21:45:34 +00001214def s:TryTwo(n: number): string
Bram Moolenaar9939f572020-09-16 22:29:52 +02001215 try
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001216 var x = {}
Bram Moolenaar9939f572020-09-16 22:29:52 +02001217 catch
1218 endtry
1219 return 'text'
1220enddef
1221
1222def Test_try_catch_twice()
1223 assert_equal('text', TryOne()->TryTwo())
1224enddef
1225
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001226def Test_try_catch_match()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001227 var seq = 'a'
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001228 try
1229 throw 'something'
1230 catch /nothing/
1231 seq ..= 'x'
1232 catch /some/
1233 seq ..= 'b'
1234 catch /asdf/
1235 seq ..= 'x'
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001236 catch ?a\?sdf?
1237 seq ..= 'y'
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001238 finally
1239 seq ..= 'c'
1240 endtry
1241 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001242enddef
1243
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001244def Test_try_catch_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001245 v9.CheckDefFailure(['catch'], 'E603:')
1246 v9.CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1247 v9.CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1248 v9.CheckDefFailure(['finally'], 'E606:')
1249 v9.CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1250 v9.CheckDefFailure(['endtry'], 'E602:')
1251 v9.CheckDefFailure(['while 1', 'endtry'], 'E170:')
1252 v9.CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1253 v9.CheckDefFailure(['if 1', 'endtry'], 'E171:')
1254 v9.CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001255
Bram Moolenaar62aec932022-01-29 21:45:34 +00001256 v9.CheckDefFailure(['throw'], 'E1143:')
1257 v9.CheckDefFailure(['throw xxx'], 'E1001:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001258enddef
1259
Bram Moolenaar7c5b3c0362021-02-14 22:40:57 +01001260def Try_catch_skipped()
1261 var l = []
1262 try
1263 finally
1264 endtry
1265
1266 if 1
1267 else
1268 try
1269 endtry
1270 endif
1271enddef
1272
1273" The skipped try/endtry was updating the wrong instruction.
1274def Test_try_catch_skipped()
1275 var instr = execute('disassemble Try_catch_skipped')
1276 assert_match("NEWLIST size 0\n", instr)
1277enddef
1278
Bram Moolenaar90a57162022-02-12 14:23:17 +00001279def Test_throw_line_number()
1280 def Func()
1281 eval 1 + 1
1282 eval 2 + 2
1283 throw 'exception'
1284 enddef
1285 try
1286 Func()
1287 catch /exception/
1288 assert_match('line 3', v:throwpoint)
1289 endtry
1290enddef
Bram Moolenaar7c5b3c0362021-02-14 22:40:57 +01001291
1292
Bram Moolenaar006ad482020-06-30 20:55:15 +02001293def Test_throw_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001294 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001295 var lines =<< trim END
Bram Moolenaar006ad482020-06-30 20:55:15 +02001296 vim9script
1297 try
1298 throw 'one'
1299 .. 'two'
1300 catch
1301 assert_equal('onetwo', v:exception)
1302 endtry
1303 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001304 v9.CheckScriptSuccess(lines)
Bram Moolenaar1e021e62020-10-16 20:25:23 +02001305
1306 lines =<< trim END
1307 vim9script
Bram Moolenaar352134b2020-10-17 22:04:08 +02001308 @r = ''
Bram Moolenaar1e021e62020-10-16 20:25:23 +02001309 def Func()
1310 throw @r
1311 enddef
1312 var result = ''
1313 try
1314 Func()
1315 catch /E1129:/
1316 result = 'caught'
1317 endtry
1318 assert_equal('caught', result)
1319 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001320 v9.CheckScriptSuccess(lines)
Bram Moolenaar006ad482020-06-30 20:55:15 +02001321enddef
1322
Bram Moolenaared677f52020-08-12 16:38:10 +02001323def Test_error_in_nested_function()
Bram Moolenaar03dfde22021-02-14 13:17:22 +01001324 # an error in a nested :function aborts executing in the calling :def function
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001325 var lines =<< trim END
Bram Moolenaared677f52020-08-12 16:38:10 +02001326 vim9script
1327 def Func()
1328 Error()
1329 g:test_var = 1
1330 enddef
1331 func Error() abort
1332 eval [][0]
1333 endfunc
1334 Func()
1335 END
1336 g:test_var = 0
Bram Moolenaar62aec932022-01-29 21:45:34 +00001337 v9.CheckScriptFailure(lines, 'E684:')
Bram Moolenaared677f52020-08-12 16:38:10 +02001338 assert_equal(0, g:test_var)
1339enddef
1340
Bram Moolenaar227c58a2021-04-28 20:40:44 +02001341def Test_abort_after_error()
1342 var lines =<< trim END
1343 vim9script
1344 while true
1345 echo notfound
1346 endwhile
1347 g:gotthere = true
1348 END
1349 g:gotthere = false
Bram Moolenaar62aec932022-01-29 21:45:34 +00001350 v9.CheckScriptFailure(lines, 'E121:')
Bram Moolenaar227c58a2021-04-28 20:40:44 +02001351 assert_false(g:gotthere)
1352 unlet g:gotthere
1353enddef
1354
Bram Moolenaar37c83712020-06-30 21:18:36 +02001355def Test_cexpr_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001356 # only checks line continuation
Bram Moolenaar37c83712020-06-30 21:18:36 +02001357 set errorformat=File\ %f\ line\ %l
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001358 var lines =<< trim END
Bram Moolenaar37c83712020-06-30 21:18:36 +02001359 vim9script
1360 cexpr 'File'
1361 .. ' someFile' ..
1362 ' line 19'
1363 assert_equal(19, getqflist()[0].lnum)
1364 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001365 v9.CheckScriptSuccess(lines)
Bram Moolenaar397a87a2022-03-20 21:14:15 +00001366
1367 lines =<< trim END
1368 vim9script
1369 def CexprFail()
1370 au QuickfixCmdPre * echo g:doesnotexist
1371 cexpr 'File otherFile line 99'
1372 g:didContinue = 'yes'
1373 enddef
1374 CexprFail()
1375 g:didContinue = 'also'
1376 END
1377 g:didContinue = 'no'
1378 v9.CheckScriptFailure(lines, 'E121: Undefined variable: g:doesnotexist')
1379 assert_equal('no', g:didContinue)
1380 au! QuickfixCmdPre
1381
1382 lines =<< trim END
1383 vim9script
1384 def CexprFail()
1385 cexpr g:aNumber
1386 g:didContinue = 'yes'
1387 enddef
1388 CexprFail()
1389 g:didContinue = 'also'
1390 END
1391 g:aNumber = 123
1392 g:didContinue = 'no'
1393 v9.CheckScriptFailure(lines, 'E777: String or List expected')
1394 assert_equal('no', g:didContinue)
1395 unlet g:didContinue
1396
Bram Moolenaar37c83712020-06-30 21:18:36 +02001397 set errorformat&
1398enddef
1399
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001400def Test_statusline_syntax()
1401 # legacy syntax is used for 'statusline'
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001402 var lines =<< trim END
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001403 vim9script
1404 func g:Status()
1405 return '%{"x" is# "x"}'
1406 endfunc
1407 set laststatus=2 statusline=%!Status()
1408 redrawstatus
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00001409 set laststatus statusline=
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001410 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001411 v9.CheckScriptSuccess(lines)
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001412enddef
1413
Bram Moolenaarb2097502020-07-19 17:17:02 +02001414def Test_list_vimscript()
1415 # checks line continuation and comments
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001416 var lines =<< trim END
Bram Moolenaarb2097502020-07-19 17:17:02 +02001417 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001418 var mylist = [
Bram Moolenaarb2097502020-07-19 17:17:02 +02001419 'one',
1420 # comment
1421 'two', # empty line follows
1422
1423 'three',
1424 ]
1425 assert_equal(['one', 'two', 'three'], mylist)
1426 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001427 v9.CheckScriptSuccess(lines)
Bram Moolenaar66250c92020-08-20 15:02:42 +02001428
1429 # check all lines from heredoc are kept
1430 lines =<< trim END
1431 # comment 1
1432 two
1433 # comment 3
1434
1435 five
1436 # comment 6
1437 END
1438 assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
Bram Moolenaar4bce26b2021-01-22 22:06:56 +01001439
1440 lines =<< trim END
1441 [{
1442 a: 0}]->string()->assert_equal("[{'a': 0}]")
1443 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001444 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarb2097502020-07-19 17:17:02 +02001445enddef
1446
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001447if has('channel')
1448 let someJob = test_null_job()
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001449
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001450 def FuncWithError()
1451 echomsg g:someJob
1452 enddef
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001453
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001454 func Test_convert_emsg_to_exception()
1455 try
1456 call FuncWithError()
1457 catch
1458 call assert_match('Vim:E908:', v:exception)
1459 endtry
1460 endfunc
1461endif
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001462
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001463def Test_vim9script_mix()
1464 var lines =<< trim END
1465 if has(g:feature)
1466 " legacy script
1467 let g:legacy = 1
1468 finish
1469 endif
1470 vim9script
1471 g:legacy = 0
1472 END
1473 g:feature = 'eval'
1474 g:legacy = -1
Bram Moolenaar62aec932022-01-29 21:45:34 +00001475 v9.CheckScriptSuccess(lines)
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001476 assert_equal(1, g:legacy)
1477
1478 g:feature = 'noteval'
1479 g:legacy = -1
Bram Moolenaar62aec932022-01-29 21:45:34 +00001480 v9.CheckScriptSuccess(lines)
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001481 assert_equal(0, g:legacy)
1482enddef
1483
Bram Moolenaar750802b2020-02-23 18:08:33 +01001484def Test_vim9script_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001485 v9.CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
1486 v9.CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +01001487
Bram Moolenaar62aec932022-01-29 21:45:34 +00001488 v9.CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1489 v9.CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
Bram Moolenaarc785b9a2020-06-19 18:34:15 +02001490
Bram Moolenaare2e40752020-09-04 21:18:46 +02001491 assert_fails('vim9script', 'E1038:')
Bram Moolenaar107f7322022-02-06 17:30:41 +00001492 v9.CheckDefFailure(['vim9script'], 'E1038:')
Bram Moolenaar8cbf2492022-02-06 20:28:13 +00001493
1494 # no error when skipping
1495 if has('nothing')
1496 vim9script
1497 endif
Bram Moolenaarc970e422021-03-17 15:03:04 +01001498enddef
1499
Bram Moolenaar6c3843c2021-03-04 12:38:21 +01001500def Test_script_var_shadows_function()
1501 var lines =<< trim END
1502 vim9script
1503 def Func(): number
1504 return 123
1505 enddef
1506 var Func = 1
1507 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001508 v9.CheckScriptFailure(lines, 'E1041:', 5)
Bram Moolenaar6c3843c2021-03-04 12:38:21 +01001509enddef
1510
Bram Moolenaar052ff292021-12-11 13:54:46 +00001511def Test_function_shadows_script_var()
1512 var lines =<< trim END
1513 vim9script
1514 var Func = 1
1515 def Func(): number
1516 return 123
1517 enddef
1518 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001519 v9.CheckScriptFailure(lines, 'E1041:', 3)
Bram Moolenaar052ff292021-12-11 13:54:46 +00001520enddef
1521
Bram Moolenaarc3235272021-07-10 19:42:03 +02001522def Test_script_var_shadows_command()
1523 var lines =<< trim END
1524 var undo = 1
1525 undo = 2
1526 assert_equal(2, undo)
1527 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001528 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc3235272021-07-10 19:42:03 +02001529
1530 lines =<< trim END
1531 var undo = 1
1532 undo
1533 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001534 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaarc3235272021-07-10 19:42:03 +02001535enddef
1536
Bram Moolenaar2ef91562021-12-11 16:14:07 +00001537def Test_vim9script_call_wrong_type()
1538 var lines =<< trim END
1539 vim9script
1540 var Time = 'localtime'
1541 Time()
1542 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001543 v9.CheckScriptFailure(lines, 'E1085:')
Bram Moolenaar2ef91562021-12-11 16:14:07 +00001544enddef
1545
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001546def Test_vim9script_reload_delfunc()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001547 var first_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001548 vim9script
1549 def FuncYes(): string
1550 return 'yes'
1551 enddef
1552 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001553 var withno_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001554 def FuncNo(): string
1555 return 'no'
1556 enddef
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001557 def g:DoCheck(no_exists: bool)
1558 assert_equal('yes', FuncYes())
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001559 assert_equal('no', FuncNo())
1560 enddef
1561 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001562 var nono_lines =<< trim END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001563 def g:DoCheck(no_exists: bool)
1564 assert_equal('yes', FuncYes())
Bram Moolenaar44d66522020-09-06 22:26:57 +02001565 assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001566 enddef
1567 END
1568
1569 # FuncNo() is defined
Bram Moolenaardd674772022-09-15 22:26:18 +01001570 writefile(first_lines + withno_lines, 'Xreloaded.vim', 'D')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001571 source Xreloaded.vim
1572 g:DoCheck(true)
1573
1574 # FuncNo() is not redefined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001575 writefile(first_lines + nono_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001576 source Xreloaded.vim
Bram Moolenaar50824712020-12-20 21:10:17 +01001577 g:DoCheck(false)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001578
1579 # FuncNo() is back
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001580 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001581 source Xreloaded.vim
Bram Moolenaar50824712020-12-20 21:10:17 +01001582 g:DoCheck(false)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001583enddef
1584
Bram Moolenaar89483d42020-05-10 15:24:44 +02001585def Test_vim9script_reload_delvar()
1586 # write the script with a script-local variable
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001587 var lines =<< trim END
Bram Moolenaar89483d42020-05-10 15:24:44 +02001588 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001589 var name = 'string'
Bram Moolenaar89483d42020-05-10 15:24:44 +02001590 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001591 writefile(lines, 'XreloadVar.vim', 'D')
Bram Moolenaar89483d42020-05-10 15:24:44 +02001592 source XreloadVar.vim
1593
1594 # now write the script using the same variable locally - works
1595 lines =<< trim END
1596 vim9script
1597 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001598 var name = 'string'
Bram Moolenaar89483d42020-05-10 15:24:44 +02001599 enddef
1600 END
1601 writefile(lines, 'XreloadVar.vim')
1602 source XreloadVar.vim
Bram Moolenaar89483d42020-05-10 15:24:44 +02001603enddef
1604
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001605def Test_func_redefine_error()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001606 var lines = [
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001607 'vim9script',
1608 'def Func()',
1609 ' eval [][0]',
1610 'enddef',
1611 'Func()',
1612 ]
Bram Moolenaardd674772022-09-15 22:26:18 +01001613 writefile(lines, 'Xtestscript.vim', 'D')
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001614
1615 for count in range(3)
1616 try
1617 source Xtestscript.vim
1618 catch /E684/
1619 # function name should contain <SNR> every time
Bram Moolenaarec892232022-05-06 17:53:06 +01001620 assert_match('E684: List index out of range', v:exception)
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001621 assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1622 endtry
1623 endfor
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001624enddef
1625
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001626def Test_func_redefine_fails()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001627 var lines =<< trim END
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001628 vim9script
1629 def Func()
1630 echo 'one'
1631 enddef
1632 def Func()
1633 echo 'two'
1634 enddef
1635 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001636 v9.CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001637
1638 lines =<< trim END
1639 vim9script
1640 def Foo(): string
1641 return 'foo'
Bram Moolenaar052ff292021-12-11 13:54:46 +00001642 enddef
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001643 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001644 var Foo = {-> 'lambda'}
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001645 enddef
1646 defcompile
1647 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001648 v9.CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001649enddef
1650
Bram Moolenaar91c7cbf2022-08-18 13:28:31 +01001651def Test_lambda_split()
1652 # this was using freed memory, because of the split expression
1653 var lines =<< trim END
1654 vim9script
1655 try
1656 0
1657 0->(0
1658 ->a.0(
1659 ->u
1660 END
1661 v9.CheckScriptFailure(lines, 'E1050:')
1662enddef
1663
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001664def Test_fixed_size_list()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001665 # will be allocated as one piece of memory, check that changes work
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001666 var l = [1, 2, 3, 4]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001667 l->remove(0)
1668 l->add(5)
1669 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001670 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001671enddef
1672
Bram Moolenaarae616492020-07-28 20:07:27 +02001673def Test_no_insert_xit()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001674 v9.CheckDefExecFailure(['a = 1'], 'E1100:')
1675 v9.CheckDefExecFailure(['c = 1'], 'E1100:')
1676 v9.CheckDefExecFailure(['i = 1'], 'E1100:')
1677 v9.CheckDefExecFailure(['t = 1'], 'E1100:')
1678 v9.CheckDefExecFailure(['x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02001679
Bram Moolenaar62aec932022-01-29 21:45:34 +00001680 v9.CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1681 v9.CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1682 v9.CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1683 v9.CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1684 v9.CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1685 v9.CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1686 v9.CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
1687 v9.CheckScriptFailure(['vim9script', 'o'], 'E1100:')
1688 v9.CheckScriptFailure(['vim9script', 't'], 'E1100:')
1689 v9.CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1690 v9.CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02001691enddef
1692
Bram Moolenaar62aec932022-01-29 21:45:34 +00001693def s:IfElse(what: number): string
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001694 var res = ''
Bram Moolenaar158906c2020-02-06 20:39:45 +01001695 if what == 1
1696 res = "one"
1697 elseif what == 2
1698 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001699 else
Bram Moolenaar158906c2020-02-06 20:39:45 +01001700 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001701 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +01001702 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001703enddef
1704
Bram Moolenaar158906c2020-02-06 20:39:45 +01001705def Test_if_elseif_else()
1706 assert_equal('one', IfElse(1))
1707 assert_equal('two', IfElse(2))
1708 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001709enddef
1710
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001711def Test_if_elseif_else_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001712 v9.CheckDefFailure(['elseif true'], 'E582:')
1713 v9.CheckDefFailure(['else'], 'E581:')
1714 v9.CheckDefFailure(['endif'], 'E580:')
1715 v9.CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
1716 v9.CheckDefFailure(['if true', 'echo 1'], 'E171:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01001717
1718 var lines =<< trim END
1719 var s = ''
1720 if s = ''
1721 endif
1722 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001723 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01001724
1725 lines =<< trim END
1726 var s = ''
1727 if s == ''
1728 elseif s = ''
1729 endif
1730 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001731 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaarfa010cd2022-04-03 16:13:07 +01001732
1733 lines =<< trim END
1734 var cond = true
1735 if cond
1736 echo 'true'
1737 elseif
1738 echo 'false'
1739 endif
1740 END
1741 v9.CheckDefAndScriptFailure(lines, ['E1143:', 'E15:'], 4)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001742enddef
1743
Bram Moolenaar505ed0c2022-05-05 17:02:46 +01001744def Test_if_else_func_using_var()
1745 var lines =<< trim END
1746 vim9script
1747
1748 const debug = true
1749 if debug
1750 var mode_chars = 'something'
1751 def Bits2Ascii()
1752 var x = mode_chars
1753 g:where = 'in true'
1754 enddef
1755 else
1756 def Bits2Ascii()
1757 g:where = 'in false'
1758 enddef
1759 endif
1760
1761 Bits2Ascii()
1762 END
1763 v9.CheckScriptSuccess(lines)
1764 assert_equal('in true', g:where)
1765 unlet g:where
1766
1767 lines =<< trim END
1768 vim9script
1769
1770 const debug = false
1771 if debug
1772 var mode_chars = 'something'
1773 def Bits2Ascii()
1774 g:where = 'in true'
1775 enddef
1776 else
1777 def Bits2Ascii()
1778 var x = mode_chars
1779 g:where = 'in false'
1780 enddef
1781 endif
1782
1783 Bits2Ascii()
1784 END
1785 v9.CheckScriptFailure(lines, 'E1001: Variable not found: mode_chars')
1786enddef
1787
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001788let g:bool_true = v:true
1789let g:bool_false = v:false
1790
1791def Test_if_const_expr()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001792 var res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001793 if true ? true : false
1794 res = true
1795 endif
1796 assert_equal(true, res)
1797
Bram Moolenaar585fea72020-04-02 22:33:21 +02001798 g:glob = 2
1799 if false
Bram Moolenaar67979662020-06-20 22:50:47 +02001800 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001801 endif
1802 assert_equal(2, g:glob)
1803 if true
Bram Moolenaar67979662020-06-20 22:50:47 +02001804 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001805 endif
1806 assert_equal(3, g:glob)
1807
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001808 res = false
1809 if g:bool_true ? true : false
1810 res = true
1811 endif
1812 assert_equal(true, res)
1813
1814 res = false
1815 if true ? g:bool_true : false
1816 res = true
1817 endif
1818 assert_equal(true, res)
1819
1820 res = false
1821 if true ? true : g:bool_false
1822 res = true
1823 endif
1824 assert_equal(true, res)
1825
1826 res = false
1827 if true ? false : true
1828 res = true
1829 endif
1830 assert_equal(false, res)
1831
1832 res = false
1833 if false ? false : true
1834 res = true
1835 endif
1836 assert_equal(true, res)
1837
1838 res = false
1839 if false ? true : false
1840 res = true
1841 endif
1842 assert_equal(false, res)
1843
1844 res = false
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001845 if has('xyz') ? true : false
1846 res = true
1847 endif
1848 assert_equal(false, res)
1849
1850 res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001851 if true && true
1852 res = true
1853 endif
1854 assert_equal(true, res)
1855
1856 res = false
1857 if true && false
1858 res = true
1859 endif
1860 assert_equal(false, res)
1861
1862 res = false
1863 if g:bool_true && false
1864 res = true
1865 endif
1866 assert_equal(false, res)
1867
1868 res = false
1869 if true && g:bool_false
1870 res = true
1871 endif
1872 assert_equal(false, res)
1873
1874 res = false
1875 if false && false
1876 res = true
1877 endif
1878 assert_equal(false, res)
1879
1880 res = false
1881 if true || false
1882 res = true
1883 endif
1884 assert_equal(true, res)
1885
1886 res = false
1887 if g:bool_true || false
1888 res = true
1889 endif
1890 assert_equal(true, res)
1891
1892 res = false
1893 if true || g:bool_false
1894 res = true
1895 endif
1896 assert_equal(true, res)
1897
1898 res = false
1899 if false || false
1900 res = true
1901 endif
1902 assert_equal(false, res)
Bram Moolenaar3988f642020-08-27 22:43:03 +02001903
1904 # with constant "false" expression may be invalid so long as the syntax is OK
Bram Moolenaarc3235272021-07-10 19:42:03 +02001905 if false | eval 1 + 2 | endif
Bram Moolenaar3988f642020-08-27 22:43:03 +02001906 if false | eval burp + 234 | endif
1907 if false | echo burp 234 'asd' | endif
1908 if false
1909 burp
1910 endif
Bram Moolenaare525bdd2021-08-07 18:12:40 +02001911
Bram Moolenaar21ebb082022-02-04 21:58:58 +00001912 if 0
1913 if 1
1914 echo nothing
1915 elseif 1
1916 echo still nothing
1917 endif
1918 endif
1919
Bram Moolenaare525bdd2021-08-07 18:12:40 +02001920 # expression with line breaks skipped
1921 if false
1922 ('aaa'
1923 .. 'bbb'
1924 .. 'ccc'
1925 )->setline(1)
1926 endif
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02001927enddef
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001928
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02001929def Test_if_const_expr_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001930 v9.CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1931 v9.CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1932 v9.CheckDefFailure(["if has('aaa'"], 'E110:')
1933 v9.CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001934enddef
1935
Bram Moolenaar62aec932022-01-29 21:45:34 +00001936def s:RunNested(i: number): number
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001937 var x: number = 0
Bram Moolenaar72abcf42020-06-18 18:26:24 +02001938 if i % 2
1939 if 1
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001940 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02001941 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001942 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02001943 endif
1944 x += 1
1945 else
1946 x += 1000
1947 endif
1948 return x
1949enddef
1950
1951def Test_nested_if()
1952 assert_equal(1, RunNested(1))
1953 assert_equal(1000, RunNested(2))
1954enddef
1955
Bram Moolenaarad39c092020-02-26 18:23:43 +01001956def Test_execute_cmd()
Bram Moolenaare4984292020-12-13 14:19:25 +01001957 # missing argument is ignored
1958 execute
1959 execute # comment
1960
Bram Moolenaarad39c092020-02-26 18:23:43 +01001961 new
1962 setline(1, 'default')
Bram Moolenaard2c61702020-09-06 15:58:36 +02001963 execute 'setline(1, "execute-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001964 assert_equal('execute-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001965
Bram Moolenaard2c61702020-09-06 15:58:36 +02001966 execute "setline(1, 'execute-string')"
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001967 assert_equal('execute-string', getline(1))
1968
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001969 var cmd1 = 'setline(1,'
1970 var cmd2 = '"execute-var")'
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001971 execute cmd1 cmd2 # comment
Bram Moolenaarad39c092020-02-26 18:23:43 +01001972 assert_equal('execute-var', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001973
Bram Moolenaard2c61702020-09-06 15:58:36 +02001974 execute cmd1 cmd2 '|setline(1, "execute-var-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001975 assert_equal('execute-var-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001976
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001977 var cmd_first = 'call '
1978 var cmd_last = 'setline(1, "execute-var-var")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001979 execute cmd_first .. cmd_last
1980 assert_equal('execute-var-var', getline(1))
1981 bwipe!
Bram Moolenaar585fea72020-04-02 22:33:21 +02001982
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001983 var n = true
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02001984 execute 'echomsg' (n ? '"true"' : '"no"')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001985 assert_match('^true$', g:Screenline(&lines))
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02001986
Bram Moolenaare0de1712020-12-02 17:36:54 +01001987 echomsg [1, 2, 3] {a: 1, b: 2}
Bram Moolenaar62aec932022-01-29 21:45:34 +00001988 assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', g:Screenline(&lines))
Bram Moolenaare5abf7a2020-08-16 18:29:35 +02001989
Bram Moolenaar62aec932022-01-29 21:45:34 +00001990 v9.CheckDefFailure(['execute xxx'], 'E1001:', 1)
1991 v9.CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
1992 v9.CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
Bram Moolenaar0c7f2612022-02-17 19:44:07 +00001993 if has('channel')
1994 v9.CheckDefExecFailure(['execute test_null_channel()'], 'E908:', 1)
1995 endif
Bram Moolenaarad39c092020-02-26 18:23:43 +01001996enddef
1997
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001998def Test_execute_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001999 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002000 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002001 vim9script
2002 execute 'g:someVar'
2003 .. ' = ' ..
2004 '28'
2005 assert_equal(28, g:someVar)
2006 unlet g:someVar
2007 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002008 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002009enddef
2010
Bram Moolenaar43216612022-03-25 11:16:28 +00002011def Test_execute_finish()
2012 # the empty lines are relevant here
2013 var lines =<< trim END
2014 vim9script
2015
2016 var vname = "g:hello"
2017
2018 if exists(vname) | finish | endif | execute vname '= "world"'
2019
2020 assert_equal('world', g:hello)
2021
2022 if exists(vname) | finish | endif | execute vname '= "world"'
2023
2024 assert_report('should not be reached')
2025 END
2026 v9.CheckScriptSuccess(lines)
2027enddef
2028
Bram Moolenaarad39c092020-02-26 18:23:43 +01002029def Test_echo_cmd()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002030 echo 'some' # comment
Bram Moolenaar585fea72020-04-02 22:33:21 +02002031 echon 'thing'
Bram Moolenaar62aec932022-01-29 21:45:34 +00002032 assert_match('^something$', g:Screenline(&lines))
Bram Moolenaarad39c092020-02-26 18:23:43 +01002033
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002034 echo "some" # comment
2035 echon "thing"
Bram Moolenaar62aec932022-01-29 21:45:34 +00002036 assert_match('^something$', g:Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002037
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002038 var str1 = 'some'
2039 var str2 = 'more'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002040 echo str1 str2
Bram Moolenaar62aec932022-01-29 21:45:34 +00002041 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002042
Bram Moolenaar397a87a2022-03-20 21:14:15 +00002043 echo "one\ntwo"
2044 assert_match('^one$', g:Screenline(&lines - 1))
2045 assert_match('^two$', g:Screenline(&lines))
2046
Bram Moolenaar62aec932022-01-29 21:45:34 +00002047 v9.CheckDefFailure(['echo "xxx"# comment'], 'E488:')
Bram Moolenaarad39c092020-02-26 18:23:43 +01002048enddef
2049
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002050def Test_echomsg_cmd()
2051 echomsg 'some' 'more' # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00002052 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002053 echo 'clear'
Bram Moolenaardf069ee2020-06-22 23:02:51 +02002054 :1messages
Bram Moolenaar62aec932022-01-29 21:45:34 +00002055 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002056
Bram Moolenaar62aec932022-01-29 21:45:34 +00002057 v9.CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002058enddef
2059
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002060def Test_echomsg_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002061 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002062 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002063 vim9script
2064 echomsg 'here'
2065 .. ' is ' ..
2066 'a message'
Bram Moolenaar62aec932022-01-29 21:45:34 +00002067 assert_match('^here is a message$', g:Screenline(&lines))
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002068 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002069 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002070enddef
2071
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002072def Test_echoerr_cmd()
Bram Moolenaar7de62622021-08-07 15:05:47 +02002073 var local = 'local'
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002074 try
Bram Moolenaar7de62622021-08-07 15:05:47 +02002075 echoerr 'something' local 'wrong' # comment
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002076 catch
Bram Moolenaar7de62622021-08-07 15:05:47 +02002077 assert_match('something local wrong', v:exception)
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002078 endtry
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002079enddef
2080
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002081def Test_echoerr_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002082 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002083 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002084 vim9script
2085 try
2086 echoerr 'this'
2087 .. ' is ' ..
2088 'wrong'
2089 catch
2090 assert_match('this is wrong', v:exception)
2091 endtry
2092 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002093 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002094enddef
2095
Bram Moolenaar7de62622021-08-07 15:05:47 +02002096def Test_echoconsole_cmd()
2097 var local = 'local'
2098 echoconsole 'something' local # comment
2099 # output goes anywhere
2100enddef
2101
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002102def Test_echowindow_cmd()
2103 var local = 'local'
2104 echowindow 'something' local # comment
Bram Moolenaar2435adf2022-10-21 12:05:46 +01002105
2106 # with modifier
2107 unsilent echowin 'loud'
2108
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002109 # output goes in message window
2110 popup_clear()
2111enddef
2112
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002113def Test_for_outside_of_function()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002114 var lines =<< trim END
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002115 vim9script
2116 new
2117 for var in range(0, 3)
2118 append(line('$'), var)
2119 endfor
2120 assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
2121 bwipe!
Bram Moolenaar522eefd2021-03-26 18:49:22 +01002122
2123 var result = ''
2124 for i in [1, 2, 3]
2125 var loop = ' loop ' .. i
2126 result ..= loop
2127 endfor
2128 assert_equal(' loop 1 loop 2 loop 3', result)
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002129 END
Bram Moolenaardd674772022-09-15 22:26:18 +01002130 writefile(lines, 'Xvim9for.vim', 'D')
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002131 source Xvim9for.vim
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002132enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002133
rbtnnbebf0692021-08-21 17:26:50 +02002134def Test_for_skipped_block()
2135 # test skipped blocks at outside of function
2136 var lines =<< trim END
2137 var result = []
2138 if true
2139 for n in [1, 2]
2140 result += [n]
2141 endfor
2142 else
2143 for n in [3, 4]
2144 result += [n]
2145 endfor
2146 endif
2147 assert_equal([1, 2], result)
2148
2149 result = []
2150 if false
2151 for n in [1, 2]
2152 result += [n]
2153 endfor
2154 else
2155 for n in [3, 4]
2156 result += [n]
2157 endfor
2158 endif
2159 assert_equal([3, 4], result)
2160 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002161 v9.CheckDefAndScriptSuccess(lines)
rbtnnbebf0692021-08-21 17:26:50 +02002162
2163 # test skipped blocks at inside of function
2164 lines =<< trim END
2165 def DefTrue()
2166 var result = []
2167 if true
2168 for n in [1, 2]
2169 result += [n]
2170 endfor
2171 else
2172 for n in [3, 4]
2173 result += [n]
2174 endfor
2175 endif
2176 assert_equal([1, 2], result)
2177 enddef
2178 DefTrue()
2179
2180 def DefFalse()
2181 var result = []
2182 if false
2183 for n in [1, 2]
2184 result += [n]
2185 endfor
2186 else
2187 for n in [3, 4]
2188 result += [n]
2189 endfor
2190 endif
2191 assert_equal([3, 4], result)
2192 enddef
2193 DefFalse()
Bram Moolenaar97f8c102022-04-02 19:43:57 +01002194
2195 def BuildDiagrams()
2196 var diagrams: list<any>
2197 if false
2198 var max = 0
2199 for v in diagrams
2200 var l = 3
2201 if max < l | max = l | endif
2202 v->add(l)
2203 endfor
2204 endif
2205 enddef
2206 BuildDiagrams()
rbtnnbebf0692021-08-21 17:26:50 +02002207 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002208 v9.CheckDefAndScriptSuccess(lines)
rbtnnbebf0692021-08-21 17:26:50 +02002209enddef
2210
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002211def Test_skipped_redir()
2212 var lines =<< trim END
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002213 def Tredir()
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002214 if 0
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002215 redir => l[0]
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002216 redir END
2217 endif
2218 enddef
2219 defcompile
2220 END
2221 v9.CheckScriptSuccess(lines)
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002222 delfunc g:Tredir
2223
2224 lines =<< trim END
2225 def Tredir()
2226 if 0
2227 redir => l[0]
2228 endif
2229 echo 'executed'
2230 if 0
2231 redir END
2232 endif
2233 enddef
2234 defcompile
2235 END
2236 v9.CheckScriptSuccess(lines)
2237 delfunc g:Tredir
2238
2239 lines =<< trim END
2240 def Tredir()
2241 var l = ['']
2242 if 1
2243 redir => l[0]
2244 endif
2245 echo 'executed'
2246 if 0
2247 redir END
2248 else
2249 redir END
2250 endif
2251 enddef
2252 defcompile
2253 END
2254 v9.CheckScriptSuccess(lines)
2255 delfunc g:Tredir
2256
2257 lines =<< trim END
2258 let doit = 1
2259 def Tredir()
2260 var l = ['']
2261 if g:doit
2262 redir => l[0]
2263 endif
2264 echo 'executed'
2265 if g:doit
2266 redir END
2267 endif
2268 enddef
2269 defcompile
2270 END
2271 v9.CheckScriptSuccess(lines)
2272 delfunc g:Tredir
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002273enddef
2274
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002275def Test_for_loop()
Bram Moolenaarf2253962021-04-13 20:53:13 +02002276 var lines =<< trim END
2277 var result = ''
2278 for cnt in range(7)
2279 if cnt == 4
2280 break
2281 endif
2282 if cnt == 2
2283 continue
2284 endif
2285 result ..= cnt .. '_'
2286 endfor
2287 assert_equal('0_1_3_', result)
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02002288
Bram Moolenaarf2253962021-04-13 20:53:13 +02002289 var concat = ''
2290 for str in eval('["one", "two"]')
2291 concat ..= str
2292 endfor
2293 assert_equal('onetwo', concat)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002294
Bram Moolenaarf2253962021-04-13 20:53:13 +02002295 var total = 0
2296 for nr in
2297 [1, 2, 3]
2298 total += nr
2299 endfor
2300 assert_equal(6, total)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002301
Bram Moolenaarf2253962021-04-13 20:53:13 +02002302 total = 0
2303 for nr
2304 in [1, 2, 3]
2305 total += nr
2306 endfor
2307 assert_equal(6, total)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002308
Bram Moolenaarf2253962021-04-13 20:53:13 +02002309 total = 0
2310 for nr
2311 in
2312 [1, 2, 3]
2313 total += nr
2314 endfor
2315 assert_equal(6, total)
Bram Moolenaar036d0712021-01-17 20:23:38 +01002316
Bram Moolenaara3589a02021-04-14 13:30:46 +02002317 # with type
2318 total = 0
2319 for n: number in [1, 2, 3]
2320 total += n
2321 endfor
2322 assert_equal(6, total)
2323
Bram Moolenaarefd73ae2022-03-20 18:51:00 +00002324 total = 0
2325 for b in 0z010203
2326 total += b
2327 endfor
2328 assert_equal(6, total)
2329
Bram Moolenaarfe090eb2021-04-15 21:48:32 +02002330 var chars = ''
2331 for s: string in 'foobar'
2332 chars ..= s
2333 endfor
2334 assert_equal('foobar', chars)
2335
Bram Moolenaar5ede5b22021-07-07 21:55:25 +02002336 chars = ''
2337 for x: string in {a: 'a', b: 'b'}->values()
2338 chars ..= x
2339 endfor
2340 assert_equal('ab', chars)
2341
Bram Moolenaara3589a02021-04-14 13:30:46 +02002342 # unpack with type
Bram Moolenaarf2253962021-04-13 20:53:13 +02002343 var res = ''
Bram Moolenaara3589a02021-04-14 13:30:46 +02002344 for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2345 res ..= n .. s
2346 endfor
2347 assert_equal('1a2b', res)
2348
Bram Moolenaar444d8782021-06-26 12:40:56 +02002349 # unpack with one var
2350 var reslist = []
2351 for [x] in [['aaa'], ['bbb']]
2352 reslist->add(x)
2353 endfor
2354 assert_equal(['aaa', 'bbb'], reslist)
2355
Bram Moolenaara3589a02021-04-14 13:30:46 +02002356 # loop over string
2357 res = ''
Bram Moolenaarf2253962021-04-13 20:53:13 +02002358 for c in 'aéc̀d'
2359 res ..= c .. '-'
2360 endfor
2361 assert_equal('a-é-c̀-d-', res)
2362
2363 res = ''
2364 for c in ''
2365 res ..= c .. '-'
2366 endfor
2367 assert_equal('', res)
2368
2369 res = ''
2370 for c in test_null_string()
2371 res ..= c .. '-'
2372 endfor
2373 assert_equal('', res)
2374
Bram Moolenaar10611952022-04-03 21:11:34 +01002375 total = 0
2376 for c in null_list
2377 total += 1
2378 endfor
2379 assert_equal(0, total)
2380
2381 for c in null_blob
2382 total += 1
2383 endfor
2384 assert_equal(0, total)
2385
Bram Moolenaarf2253962021-04-13 20:53:13 +02002386 var foo: list<dict<any>> = [
2387 {a: 'Cat'}
2388 ]
2389 for dd in foo
2390 dd.counter = 12
2391 endfor
2392 assert_equal([{a: 'Cat', counter: 12}], foo)
Bram Moolenaarad2d4962021-07-18 17:08:50 +02002393
2394 reslist = []
2395 for _ in range(3)
2396 reslist->add('x')
2397 endfor
2398 assert_equal(['x', 'x', 'x'], reslist)
Bram Moolenaarf2253962021-04-13 20:53:13 +02002399 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002400 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002401enddef
2402
Bram Moolenaar159b2d52022-10-11 21:41:25 +01002403def Test_for_loop_list_of_lists()
2404 # loop variable is final, not const
2405 var lines =<< trim END
2406 # Filter out all odd numbers in each sublist
2407 var list: list<list<number>> = [[1], [1, 2], [1, 2, 3], [1, 2, 3, 4]]
2408 for i in list
2409 filter(i, (_, n: number): bool => n % 2 == 0)
2410 endfor
2411
2412 assert_equal([[], [2], [2], [2, 4]], list)
2413 END
2414 v9.CheckDefAndScriptSuccess(lines)
2415enddef
2416
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002417def Test_for_loop_with_closure()
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002418 # using the loop variable in a closure results in the last used value
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002419 var lines =<< trim END
2420 var flist: list<func>
2421 for i in range(5)
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002422 flist[i] = () => i
2423 endfor
2424 for i in range(5)
2425 assert_equal(4, flist[i]())
2426 endfor
2427 END
2428 v9.CheckDefAndScriptSuccess(lines)
2429
Bram Moolenaardd674772022-09-15 22:26:18 +01002430 # also works when the loop variable is used only once halfway the loops
2431 lines =<< trim END
2432 var Clo: func
2433 for i in range(5)
2434 if i == 3
2435 Clo = () => i
2436 endif
2437 endfor
2438 assert_equal(4, Clo())
2439 END
2440 v9.CheckDefAndScriptSuccess(lines)
2441
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002442 # using a local variable set to the loop variable in a closure results in the
2443 # value at that moment
2444 lines =<< trim END
2445 var flist: list<func>
2446 for i in range(5)
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002447 var inloop = i
2448 flist[i] = () => inloop
2449 endfor
2450 for i in range(5)
Bram Moolenaar353b68a2022-09-13 21:10:45 +01002451 assert_equal(i, flist[i]())
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002452 endfor
2453 END
Bram Moolenaar0cdfb7c2022-09-17 15:44:52 +01002454 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002455
Bram Moolenaara275f2c2022-10-11 20:04:09 +01002456 # also with an extra block level
2457 lines =<< trim END
2458 var flist: list<func>
2459 for i in range(5)
2460 {
2461 var inloop = i
2462 flist[i] = () => inloop
2463 }
2464 endfor
2465 for i in range(5)
2466 assert_equal(i, flist[i]())
2467 endfor
2468 END
2469 v9.CheckDefAndScriptSuccess(lines)
2470
2471 # and declaration in higher block
2472 lines =<< trim END
2473 var flist: list<func>
2474 for i in range(5)
2475 var inloop = i
2476 {
2477 flist[i] = () => inloop
2478 }
2479 endfor
2480 for i in range(5)
2481 assert_equal(i, flist[i]())
2482 endfor
2483 END
2484 v9.CheckDefAndScriptSuccess(lines)
2485
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002486 lines =<< trim END
2487 var flist: list<func>
2488 for i in range(5)
2489 var inloop = i
2490 flist[i] = () => {
2491 return inloop
2492 }
2493 endfor
2494 for i in range(5)
Bram Moolenaar353b68a2022-09-13 21:10:45 +01002495 assert_equal(i, flist[i]())
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002496 endfor
2497 END
Bram Moolenaar0cdfb7c2022-09-17 15:44:52 +01002498 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaardbbb02b2022-09-18 12:00:21 +01002499
2500 # Also works for a nested loop
2501 lines =<< trim END
2502 var flist: list<func>
2503 var n = 0
2504 for i in range(3)
2505 var ii = i
2506 for a in ['a', 'b', 'c']
2507 var aa = a
2508 flist[n] = () => ii .. aa
2509 ++n
2510 endfor
2511 endfor
2512
2513 n = 0
2514 for i in range(3)
2515 for a in ['a', 'b', 'c']
2516 assert_equal(i .. a, flist[n]())
2517 ++n
2518 endfor
2519 endfor
2520 END
Bram Moolenaarcc341812022-09-19 15:54:34 +01002521 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaare8e369a2022-09-21 18:59:14 +01002522
2523 # using two loop variables
2524 lines =<< trim END
2525 var lv_list: list<func>
2526 var copy_list: list<func>
2527 for [idx, c] in items('word')
2528 var lidx = idx
2529 var lc = c
2530 lv_list[idx] = () => {
2531 return idx .. c
2532 }
2533 copy_list[idx] = () => {
2534 return lidx .. lc
2535 }
2536 endfor
2537 for [i, c] in items('word')
2538 assert_equal(3 .. 'd', lv_list[i]())
2539 assert_equal(i .. c, copy_list[i]())
2540 endfor
2541 END
2542 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarcc341812022-09-19 15:54:34 +01002543enddef
2544
2545def Test_define_global_closure_in_loops()
2546 var lines =<< trim END
2547 vim9script
2548
2549 def Func()
2550 for i in range(3)
2551 var ii = i
2552 for a in ['a', 'b', 'c']
2553 var aa = a
2554 if ii == 0 && aa == 'a'
2555 def g:Global_0a(): string
2556 return ii .. aa
2557 enddef
2558 endif
2559 if ii == 1 && aa == 'b'
2560 def g:Global_1b(): string
2561 return ii .. aa
2562 enddef
2563 endif
2564 if ii == 2 && aa == 'c'
2565 def g:Global_2c(): string
2566 return ii .. aa
2567 enddef
2568 endif
2569 endfor
2570 endfor
2571 enddef
2572 Func()
2573 END
2574 v9.CheckScriptSuccess(lines)
2575 assert_equal("0a", g:Global_0a())
2576 assert_equal("1b", g:Global_1b())
2577 assert_equal("2c", g:Global_2c())
2578
2579 delfunc g:Global_0a
2580 delfunc g:Global_1b
2581 delfunc g:Global_2c
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002582enddef
2583
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002584def Test_for_loop_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00002585 v9.CheckDefAndScriptFailure(['for '], ['E1097:', 'E690:'])
2586 v9.CheckDefAndScriptFailure(['for x'], ['E1097:', 'E690:'])
2587 v9.CheckDefAndScriptFailure(['for x in'], ['E1097:', 'E15:'])
2588 v9.CheckDefAndScriptFailure(['for # in range(5)'], 'E690:')
2589 v9.CheckDefAndScriptFailure(['for i In range(5)'], 'E690:')
2590 v9.CheckDefAndScriptFailure(['var x = 5', 'for x in range(5)', 'endfor'], ['E1017:', 'E1041:'])
2591 v9.CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3)
2592 v9.CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01002593 delfunc! g:Func
Bram Moolenaar62aec932022-01-29 21:45:34 +00002594 v9.CheckDefFailure(['for i in xxx'], 'E1001:')
2595 v9.CheckDefFailure(['endfor'], 'E588:')
2596 v9.CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002597
2598 # wrong type detected at compile time
Bram Moolenaar62aec932022-01-29 21:45:34 +00002599 v9.CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002600
2601 # wrong type detected at runtime
2602 g:adict = {a: 1}
Bram Moolenaar62aec932022-01-29 21:45:34 +00002603 v9.CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002604 unlet g:adict
Bram Moolenaarf6a8d422021-04-13 21:48:03 +02002605
2606 var lines =<< trim END
2607 var d: list<dict<any>> = [{a: 0}]
2608 for e in d
2609 e = {a: 0, b: ''}
2610 endfor
2611 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002612 v9.CheckDefAndScriptFailure(lines, ['E1018:', 'E46:'], 3)
Bram Moolenaarfe090eb2021-04-15 21:48:32 +02002613
2614 lines =<< trim END
2615 for nr: number in ['foo']
2616 endfor
2617 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002618 v9.CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
Bram Moolenaar404557e2021-07-05 21:41:48 +02002619
2620 lines =<< trim END
2621 for n : number in [1, 2]
2622 echo n
2623 endfor
2624 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002625 v9.CheckDefAndScriptFailure(lines, 'E1059:', 1)
Bram Moolenaarefc5db52021-07-07 21:21:30 +02002626
2627 lines =<< trim END
2628 var d: dict<number> = {a: 1, b: 2}
2629 for [k: job, v: job] in d->items()
2630 echo k v
2631 endfor
2632 END
Bram Moolenaarbd3a9d22022-05-17 16:12:39 +01002633 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 +00002634
2635 lines =<< trim END
2636 var i = 0
2637 for i in [1, 2, 3]
2638 echo i
2639 endfor
2640 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002641 v9.CheckDefExecAndScriptFailure(lines, ['E1017:', 'E1041:'])
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002642
2643 lines =<< trim END
2644 var l = [0]
2645 for l[0] in [1, 2, 3]
2646 echo l[0]
2647 endfor
2648 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002649 v9.CheckDefExecAndScriptFailure(lines, ['E461:', 'E1017:'])
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002650
2651 lines =<< trim END
2652 var d = {x: 0}
2653 for d.x in [1, 2, 3]
2654 echo d.x
2655 endfor
2656 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002657 v9.CheckDefExecAndScriptFailure(lines, ['E461:', 'E1017:'])
Bram Moolenaara1c51952022-02-02 16:20:26 +00002658
2659 lines =<< trim END
2660 var l: list<dict<any>> = [{a: 1, b: 'x'}]
2661 for item: dict<number> in l
2662 echo item
2663 endfor
2664 END
2665 v9.CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected dict<number> but got dict<any>')
2666
2667 lines =<< trim END
2668 var l: list<dict<any>> = [{n: 1}]
2669 for item: dict<number> in l
Bram Moolenaarfa103972022-09-29 19:14:42 +01002670 var d = {s: ''}
2671 d->extend(item)
Bram Moolenaara1c51952022-02-02 16:20:26 +00002672 endfor
2673 END
Bram Moolenaarfa103972022-09-29 19:14:42 +01002674 v9.CheckDefExecAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected dict<string> but got dict<number>')
Bram Moolenaarcc341812022-09-19 15:54:34 +01002675
2676 lines =<< trim END
2677 for a in range(3)
2678 while a > 3
2679 for b in range(2)
2680 while b < 0
2681 for c in range(5)
2682 while c > 6
2683 while c < 0
2684 for d in range(1)
2685 for e in range(3)
2686 while e > 3
2687 endwhile
2688 endfor
2689 endfor
2690 endwhile
2691 endwhile
2692 endfor
2693 endwhile
2694 endfor
2695 endwhile
2696 endfor
2697 END
2698 v9.CheckDefSuccess(lines)
2699
2700 v9.CheckDefFailure(['for x in range(3)'] + lines + ['endfor'], 'E1306:')
Yegappan Lakshmanan062bb6b2023-12-16 14:46:40 +01002701
2702 # Test for too many for loops
2703 lines =<< trim END
2704 vim9script
2705 def Foo()
2706 for a in range(1)
2707 for b in range(1)
2708 for c in range(1)
2709 for d in range(1)
2710 for e in range(1)
2711 for f in range(1)
2712 for g in range(1)
2713 for h in range(1)
2714 for i in range(1)
2715 for j in range(1)
2716 for k in range(1)
2717 endfor
2718 endfor
2719 endfor
2720 endfor
2721 endfor
2722 endfor
2723 endfor
2724 endfor
2725 endfor
2726 endfor
2727 endfor
2728 enddef
2729 defcompile
2730 END
2731 v9.CheckSourceFailure(lines, 'E1306: Loop nesting too deep', 11)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002732enddef
2733
Bram Moolenaarea870692020-12-02 14:24:30 +01002734def Test_for_loop_script_var()
2735 # cannot use s:var in a :def function
Bram Moolenaar62aec932022-01-29 21:45:34 +00002736 v9.CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1254:')
Bram Moolenaarea870692020-12-02 14:24:30 +01002737
2738 # can use s:var in Vim9 script, with or without s:
2739 var lines =<< trim END
2740 vim9script
2741 var total = 0
2742 for s:var in [1, 2, 3]
2743 total += s:var
2744 endfor
2745 assert_equal(6, total)
2746
2747 total = 0
2748 for var in [1, 2, 3]
2749 total += var
2750 endfor
2751 assert_equal(6, total)
2752 END
2753enddef
2754
Bram Moolenaar792f7862020-11-23 08:31:18 +01002755def Test_for_loop_unpack()
Bram Moolenaar792f7862020-11-23 08:31:18 +01002756 var lines =<< trim END
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002757 var result = []
2758 for [v1, v2] in [[1, 2], [3, 4]]
2759 result->add(v1)
2760 result->add(v2)
2761 endfor
2762 assert_equal([1, 2, 3, 4], result)
2763
2764 result = []
2765 for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2766 result->add(v1)
2767 result->add(v2)
2768 result->add(v3)
2769 endfor
2770 assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2771
2772 result = []
2773 for [&ts, &sw] in [[1, 2], [3, 4]]
2774 result->add(&ts)
2775 result->add(&sw)
2776 endfor
2777 assert_equal([1, 2, 3, 4], result)
2778
2779 var slist: list<string>
2780 for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
2781 slist->add($LOOPVAR)
2782 slist->add(@r)
2783 slist->add(v:errmsg)
2784 endfor
2785 assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
2786
2787 slist = []
2788 for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
2789 slist->add(g:globalvar)
2790 slist->add(b:bufvar)
2791 slist->add(w:winvar)
2792 slist->add(t:tabvar)
2793 endfor
2794 assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
Bram Moolenaarf6c177a2020-12-04 17:38:00 +01002795 unlet! g:globalvar b:bufvar w:winvar t:tabvar
Bram Moolenaarb777da92021-05-22 21:40:39 +02002796
2797 var res = []
2798 for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
2799 res->add(n)
2800 endfor
2801 assert_equal([2, 5], res)
Bram Moolenaar61efa162022-03-18 13:10:48 +00002802
2803 var text: list<string> = ["hello there", "goodbye now"]
2804 var splitted = ''
2805 for [first; next] in mapnew(text, (i, v) => split(v))
2806 splitted ..= string(first) .. string(next) .. '/'
2807 endfor
2808 assert_equal("'hello'['there']/'goodbye'['now']/", splitted)
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002809 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002810 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002811
2812 lines =<< trim END
Bram Moolenaar792f7862020-11-23 08:31:18 +01002813 for [v1, v2] in [[1, 2, 3], [3, 4]]
2814 echo v1 v2
2815 endfor
2816 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002817 v9.CheckDefExecFailure(lines, 'E710:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01002818
2819 lines =<< trim END
2820 for [v1, v2] in [[1], [3, 4]]
2821 echo v1 v2
2822 endfor
2823 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002824 v9.CheckDefExecFailure(lines, 'E711:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01002825
2826 lines =<< trim END
2827 for [v1, v1] in [[1, 2], [3, 4]]
2828 echo v1
2829 endfor
2830 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002831 v9.CheckDefExecFailure(lines, 'E1017:', 1)
Bram Moolenaar95e4dd82022-04-27 22:15:40 +01002832
2833 lines =<< trim END
2834 for [a, b] in g:listlist
2835 echo a
2836 endfor
2837 END
2838 g:listlist = [1, 2, 3]
2839 v9.CheckDefExecFailure(lines, 'E1140:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01002840enddef
2841
Bram Moolenaarc150c092021-02-13 15:02:46 +01002842def Test_for_loop_with_try_continue()
Bram Moolenaarf2253962021-04-13 20:53:13 +02002843 var lines =<< trim END
2844 var looped = 0
2845 var cleanup = 0
2846 for i in range(3)
2847 looped += 1
2848 try
2849 eval [][0]
2850 catch
2851 continue
2852 finally
2853 cleanup += 1
2854 endtry
2855 endfor
2856 assert_equal(3, looped)
2857 assert_equal(3, cleanup)
2858 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002859 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc150c092021-02-13 15:02:46 +01002860enddef
2861
rbtnnd895b1d2021-08-20 20:54:25 +02002862def Test_while_skipped_block()
2863 # test skipped blocks at outside of function
2864 var lines =<< trim END
2865 var result = []
2866 var n = 0
2867 if true
2868 n = 1
2869 while n < 3
2870 result += [n]
2871 n += 1
2872 endwhile
2873 else
2874 n = 3
2875 while n < 5
2876 result += [n]
2877 n += 1
2878 endwhile
2879 endif
2880 assert_equal([1, 2], result)
2881
2882 result = []
2883 if false
2884 n = 1
2885 while n < 3
2886 result += [n]
2887 n += 1
2888 endwhile
2889 else
2890 n = 3
2891 while n < 5
2892 result += [n]
2893 n += 1
2894 endwhile
2895 endif
2896 assert_equal([3, 4], result)
2897 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002898 v9.CheckDefAndScriptSuccess(lines)
rbtnnd895b1d2021-08-20 20:54:25 +02002899
2900 # test skipped blocks at inside of function
2901 lines =<< trim END
2902 def DefTrue()
2903 var result = []
2904 var n = 0
2905 if true
2906 n = 1
2907 while n < 3
2908 result += [n]
2909 n += 1
2910 endwhile
2911 else
2912 n = 3
2913 while n < 5
2914 result += [n]
2915 n += 1
2916 endwhile
2917 endif
2918 assert_equal([1, 2], result)
2919 enddef
2920 DefTrue()
2921
2922 def DefFalse()
2923 var result = []
2924 var n = 0
2925 if false
2926 n = 1
2927 while n < 3
2928 result += [n]
2929 n += 1
2930 endwhile
2931 else
2932 n = 3
2933 while n < 5
2934 result += [n]
2935 n += 1
2936 endwhile
2937 endif
2938 assert_equal([3, 4], result)
2939 enddef
2940 DefFalse()
2941 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002942 v9.CheckDefAndScriptSuccess(lines)
rbtnnd895b1d2021-08-20 20:54:25 +02002943enddef
2944
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01002945def Test_while_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002946 var result = ''
2947 var cnt = 0
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01002948 while cnt < 555
2949 if cnt == 3
2950 break
2951 endif
2952 cnt += 1
2953 if cnt == 2
2954 continue
2955 endif
2956 result ..= cnt .. '_'
2957 endwhile
2958 assert_equal('1_3_', result)
Bram Moolenaardee37dc2021-02-07 16:40:05 +01002959
2960 var s = ''
Bram Moolenaar4b3e1962021-03-18 21:37:55 +01002961 while s == 'x' # {comment}
Bram Moolenaardee37dc2021-02-07 16:40:05 +01002962 endwhile
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01002963enddef
2964
Bram Moolenaar7a53f292021-11-22 18:31:02 +00002965def Test_while_loop_in_script()
2966 var lines =<< trim END
2967 vim9script
2968 var result = ''
2969 var cnt = 0
2970 while cnt < 3
2971 var s = 'v' .. cnt
2972 result ..= s
2973 cnt += 1
2974 endwhile
2975 assert_equal('v0v1v2', result)
2976 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002977 v9.CheckScriptSuccess(lines)
Bram Moolenaar7a53f292021-11-22 18:31:02 +00002978enddef
2979
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002980def Test_while_loop_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00002981 v9.CheckDefFailure(['while xxx'], 'E1001:')
2982 v9.CheckDefFailure(['endwhile'], 'E588:')
2983 v9.CheckDefFailure(['continue'], 'E586:')
2984 v9.CheckDefFailure(['if true', 'continue'], 'E586:')
2985 v9.CheckDefFailure(['break'], 'E587:')
2986 v9.CheckDefFailure(['if true', 'break'], 'E587:')
2987 v9.CheckDefFailure(['while 1', 'echo 3'], 'E170:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01002988
2989 var lines =<< trim END
2990 var s = ''
2991 while s = ''
2992 endwhile
2993 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002994 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaarbd5da372020-03-31 23:13:10 +02002995enddef
2996
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01002997def Test_interrupt_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002998 var caught = false
2999 var x = 0
Bram Moolenaar97acfc72020-03-22 13:44:28 +01003000 try
3001 while 1
3002 x += 1
3003 if x == 100
3004 feedkeys("\<C-C>", 'Lt')
3005 endif
3006 endwhile
3007 catch
3008 caught = true
3009 assert_equal(100, x)
3010 endtry
3011 assert_true(caught, 'should have caught an exception')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02003012 # consume the CTRL-C
3013 getchar(0)
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01003014enddef
Bram Moolenaar20431c92020-03-20 18:39:46 +01003015
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003016def Test_automatic_line_continuation()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003017 var mylist = [
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003018 'one',
3019 'two',
3020 'three',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003021 ] # comment
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003022 assert_equal(['one', 'two', 'three'], mylist)
3023
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003024 var mydict = {
Bram Moolenaare0de1712020-12-02 17:36:54 +01003025 ['one']: 1,
3026 ['two']: 2,
3027 ['three']:
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003028 3,
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003029 } # comment
Bram Moolenaare0de1712020-12-02 17:36:54 +01003030 assert_equal({one: 1, two: 2, three: 3}, mydict)
3031 mydict = {
Bram Moolenaar2c330432020-04-13 14:41:35 +02003032 one: 1, # comment
3033 two: # comment
3034 2, # comment
3035 three: 3 # comment
3036 }
Bram Moolenaare0de1712020-12-02 17:36:54 +01003037 assert_equal({one: 1, two: 2, three: 3}, mydict)
3038 mydict = {
Bram Moolenaar2c330432020-04-13 14:41:35 +02003039 one: 1,
3040 two:
3041 2,
3042 three: 3
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003043 }
Bram Moolenaare0de1712020-12-02 17:36:54 +01003044 assert_equal({one: 1, two: 2, three: 3}, mydict)
Bram Moolenaare6085c52020-04-12 20:19:16 +02003045
3046 assert_equal(
3047 ['one', 'two', 'three'],
3048 split('one two three')
3049 )
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003050enddef
3051
Bram Moolenaar7a092242020-04-16 22:10:49 +02003052def Test_vim9_comment()
Bram Moolenaar62aec932022-01-29 21:45:34 +00003053 v9.CheckScriptSuccess([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003054 'vim9script',
3055 '# something',
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003056 '#something',
Bram Moolenaar3f74c0a2022-08-06 18:12:06 +01003057 '#{{something',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003058 ])
Bram Moolenaar3f74c0a2022-08-06 18:12:06 +01003059 v9.CheckScriptFailure([
3060 'vim9script',
3061 '#{something',
3062 ], 'E1170:')
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003063
Bram Moolenaarb18b4962022-09-02 21:55:50 +01003064 split Xv9cfile
Bram Moolenaar62aec932022-01-29 21:45:34 +00003065 v9.CheckScriptSuccess([
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003066 'vim9script',
3067 'edit #something',
3068 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003069 v9.CheckScriptSuccess([
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003070 'vim9script',
3071 'edit #{something',
3072 ])
3073 close
3074
Bram Moolenaar62aec932022-01-29 21:45:34 +00003075 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003076 'vim9script',
3077 ':# something',
3078 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003079 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003080 '# something',
3081 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003082 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003083 ':# something',
3084 ], 'E488:')
3085
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003086 { # block start
3087 } # block end
Bram Moolenaar62aec932022-01-29 21:45:34 +00003088 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003089 '{# comment',
3090 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003091 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003092 '{',
3093 '}# comment',
3094 ], 'E488:')
3095
3096 echo "yes" # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00003097 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003098 'echo "yes"# comment',
3099 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003100 v9.CheckScriptSuccess([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003101 'vim9script',
3102 'echo "yes" # something',
3103 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003104 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003105 'vim9script',
3106 'echo "yes"# something',
3107 ], 'E121:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003108 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003109 'vim9script',
3110 'echo# something',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003111 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003112 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003113 'echo "yes" # something',
3114 ], 'E121:')
3115
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003116 exe "echo" # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00003117 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003118 'exe "echo"# comment',
3119 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003120 v9.CheckScriptSuccess([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003121 'vim9script',
3122 'exe "echo" # something',
3123 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003124 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003125 'vim9script',
3126 'exe "echo"# something',
3127 ], 'E121:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003128 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003129 'vim9script',
3130 'exe# something',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003131 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003132 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003133 'exe "echo" # something',
3134 ], 'E121:')
3135
Bram Moolenaar62aec932022-01-29 21:45:34 +00003136 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003137 'try# comment',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003138 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003139 'catch',
3140 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003141 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003142 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003143 'vim9script',
3144 'try# comment',
3145 'echo "yes"',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003146 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003147 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003148 'try',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003149 ' throw#comment',
3150 'catch',
3151 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003152 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003153 v9.CheckDefFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003154 'try',
3155 ' throw "yes"#comment',
3156 'catch',
3157 'endtry',
3158 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003159 v9.CheckDefFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003160 'try',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003161 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003162 'catch# comment',
3163 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003164 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003165 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003166 'vim9script',
3167 'try',
3168 ' echo "yes"',
3169 'catch# comment',
3170 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003171 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003172 v9.CheckDefFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003173 'try',
3174 ' echo "yes"',
3175 'catch /pat/# comment',
3176 'endtry',
3177 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003178 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003179 'try',
3180 'echo "yes"',
3181 'catch',
3182 'endtry# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003183 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003184 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003185 'vim9script',
3186 'try',
3187 ' echo "yes"',
3188 'catch',
3189 'endtry# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003190 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003191
Bram Moolenaar62aec932022-01-29 21:45:34 +00003192 v9.CheckScriptSuccess([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003193 'vim9script',
3194 'hi # comment',
3195 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003196 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003197 'vim9script',
3198 'hi# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003199 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003200 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003201 'vim9script',
3202 'hi Search # comment',
3203 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003204 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003205 'vim9script',
3206 'hi Search# comment',
3207 ], 'E416:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003208 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003209 'vim9script',
3210 'hi link This Search # comment',
3211 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003212 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003213 'vim9script',
3214 'hi link This That# comment',
3215 ], 'E413:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003216 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003217 'vim9script',
3218 'hi clear This # comment',
3219 'hi clear # comment',
3220 ])
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003221 # not tested, because it doesn't give an error but a warning:
3222 # hi clear This# comment',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003223 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003224 'vim9script',
3225 'hi clear# comment',
3226 ], 'E416:')
3227
Bram Moolenaar62aec932022-01-29 21:45:34 +00003228 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003229 'vim9script',
3230 'hi Group term=bold',
3231 'match Group /todo/ # comment',
3232 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003233 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003234 'vim9script',
3235 'hi Group term=bold',
3236 'match Group /todo/# comment',
3237 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003238 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003239 'vim9script',
3240 'match # comment',
3241 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003242 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003243 'vim9script',
3244 'match# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003245 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003246 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003247 'vim9script',
3248 'match none # comment',
3249 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003250 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003251 'vim9script',
3252 'match none# comment',
3253 ], 'E475:')
3254
Bram Moolenaar62aec932022-01-29 21:45:34 +00003255 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003256 'vim9script',
3257 'menutrans clear # comment',
3258 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003259 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003260 'vim9script',
3261 'menutrans clear# comment text',
3262 ], 'E474:')
3263
Bram Moolenaar62aec932022-01-29 21:45:34 +00003264 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003265 'vim9script',
3266 'syntax clear # comment',
3267 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003268 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003269 'vim9script',
3270 'syntax clear# comment text',
3271 ], 'E28:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003272 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003273 'vim9script',
3274 'syntax keyword Word some',
3275 'syntax clear Word # comment',
3276 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003277 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003278 'vim9script',
3279 'syntax keyword Word some',
3280 'syntax clear Word# comment text',
3281 ], 'E28:')
3282
Bram Moolenaar62aec932022-01-29 21:45:34 +00003283 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003284 'vim9script',
3285 'syntax list # comment',
3286 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003287 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003288 'vim9script',
3289 'syntax list# comment text',
3290 ], 'E28:')
3291
Bram Moolenaar62aec932022-01-29 21:45:34 +00003292 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003293 'vim9script',
3294 'syntax match Word /pat/ oneline # comment',
3295 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003296 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003297 'vim9script',
3298 'syntax match Word /pat/ oneline# comment',
3299 ], 'E475:')
3300
Bram Moolenaar62aec932022-01-29 21:45:34 +00003301 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003302 'vim9script',
3303 'syntax keyword Word word # comm[ent',
3304 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003305 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003306 'vim9script',
3307 'syntax keyword Word word# comm[ent',
3308 ], 'E789:')
3309
Bram Moolenaar62aec932022-01-29 21:45:34 +00003310 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003311 'vim9script',
3312 'syntax match Word /pat/ # comment',
3313 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003314 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003315 'vim9script',
3316 'syntax match Word /pat/# comment',
3317 ], 'E402:')
3318
Bram Moolenaar62aec932022-01-29 21:45:34 +00003319 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003320 'vim9script',
3321 'syntax match Word /pat/ contains=Something # comment',
3322 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003323 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003324 'vim9script',
3325 'syntax match Word /pat/ contains=Something# comment',
3326 ], 'E475:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003327 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003328 'vim9script',
3329 'syntax match Word /pat/ contains= # comment',
3330 ], 'E406:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003331 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003332 'vim9script',
3333 'syntax match Word /pat/ contains=# comment',
3334 ], 'E475:')
3335
Bram Moolenaar62aec932022-01-29 21:45:34 +00003336 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003337 'vim9script',
3338 'syntax region Word start=/pat/ end=/pat/ # comment',
3339 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003340 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003341 'vim9script',
3342 'syntax region Word start=/pat/ end=/pat/# comment',
Bram Moolenaard032f342020-07-18 18:13:02 +02003343 ], 'E402:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02003344
Bram Moolenaar62aec932022-01-29 21:45:34 +00003345 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003346 'vim9script',
3347 'syntax sync # comment',
3348 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003349 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003350 'vim9script',
3351 'syntax sync# comment',
3352 ], 'E404:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003353 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003354 'vim9script',
3355 'syntax sync ccomment # comment',
3356 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003357 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003358 'vim9script',
3359 'syntax sync ccomment# comment',
3360 ], 'E404:')
3361
Bram Moolenaar62aec932022-01-29 21:45:34 +00003362 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003363 'vim9script',
3364 'syntax cluster Some contains=Word # comment',
3365 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003366 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003367 'vim9script',
3368 'syntax cluster Some contains=Word# comment',
3369 ], 'E475:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003370
Bram Moolenaar62aec932022-01-29 21:45:34 +00003371 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003372 'vim9script',
3373 'command Echo echo # comment',
3374 'command Echo # comment',
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003375 'delcommand Echo',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003376 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003377 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003378 'vim9script',
3379 'command Echo echo# comment',
3380 'Echo',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003381 ], 'E1144:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003382 delcommand Echo
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003383
3384 var curdir = getcwd()
Bram Moolenaar62aec932022-01-29 21:45:34 +00003385 v9.CheckScriptSuccess([
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003386 'command Echo cd " comment',
3387 'Echo',
3388 'delcommand Echo',
3389 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003390 v9.CheckScriptSuccess([
Bram Moolenaar090728a2020-12-20 15:43:31 +01003391 'vim9script',
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003392 'command Echo cd # comment',
3393 'Echo',
3394 'delcommand Echo',
3395 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003396 v9.CheckScriptFailure([
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003397 'vim9script',
3398 'command Echo cd " comment',
3399 'Echo',
3400 ], 'E344:')
3401 delcommand Echo
3402 chdir(curdir)
3403
Bram Moolenaar62aec932022-01-29 21:45:34 +00003404 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003405 'vim9script',
3406 'command Echo# comment',
3407 ], 'E182:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003408 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003409 'vim9script',
3410 'command Echo echo',
3411 'command Echo# comment',
3412 ], 'E182:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003413 delcommand Echo
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003414
Bram Moolenaar62aec932022-01-29 21:45:34 +00003415 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003416 'vim9script',
3417 'function # comment',
3418 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003419 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003420 'vim9script',
Bram Moolenaar98981072020-07-29 14:40:25 +02003421 'function " comment',
3422 ], 'E129:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003423 v9.CheckScriptFailure([
Bram Moolenaar98981072020-07-29 14:40:25 +02003424 'vim9script',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003425 'function# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003426 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003427 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003428 'vim9script',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003429 'import "./vim9.vim" as v9',
3430 'function v9.CheckScriptSuccess # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003431 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003432 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003433 'vim9script',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003434 'import "./vim9.vim" as v9',
3435 'function v9.CheckScriptSuccess# comment',
3436 ], 'E1048: Item not found in script: CheckScriptSuccess#')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003437
Bram Moolenaar62aec932022-01-29 21:45:34 +00003438 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003439 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003440 'func g:DeleteMeA()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003441 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003442 'delfunction g:DeleteMeA # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003443 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003444 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003445 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003446 'func g:DeleteMeB()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003447 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003448 'delfunction g:DeleteMeB# comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003449 ], 'E488:')
3450
Bram Moolenaar62aec932022-01-29 21:45:34 +00003451 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003452 'vim9script',
3453 'call execute("ls") # comment',
3454 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003455 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003456 'vim9script',
3457 'call execute("ls")# comment',
3458 ], 'E488:')
Bram Moolenaare7e48382020-07-22 18:17:08 +02003459
Bram Moolenaar62aec932022-01-29 21:45:34 +00003460 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003461 'def Test() " comment',
3462 'enddef',
3463 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003464 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003465 'vim9script',
3466 'def Test() " comment',
3467 'enddef',
3468 ], 'E488:')
3469
Bram Moolenaar62aec932022-01-29 21:45:34 +00003470 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003471 'func Test() " comment',
3472 'endfunc',
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003473 'delfunc Test',
Bram Moolenaare7e48382020-07-22 18:17:08 +02003474 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003475 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003476 'vim9script',
3477 'func Test() " comment',
3478 'endfunc',
Bram Moolenaar98981072020-07-29 14:40:25 +02003479 ])
Bram Moolenaare7e48382020-07-22 18:17:08 +02003480
Bram Moolenaar62aec932022-01-29 21:45:34 +00003481 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003482 'def Test() # comment',
3483 'enddef',
3484 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003485 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003486 'func Test() # comment',
3487 'endfunc',
3488 ], 'E488:')
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003489
3490 var lines =<< trim END
3491 vim9script
3492 syn region Text
3493 \ start='foo'
3494 #\ comment
3495 \ end='bar'
Bram Moolenaar5072b472021-06-03 21:56:10 +02003496 syn region Text start='foo'
3497 #\ comment
3498 \ end='bar'
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003499 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003500 v9.CheckScriptSuccess(lines)
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003501
3502 lines =<< trim END
3503 vim9script
3504 syn region Text
3505 \ start='foo'
3506 "\ comment
3507 \ end='bar'
3508 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003509 v9.CheckScriptFailure(lines, 'E399:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003510enddef
3511
3512def Test_vim9_comment_gui()
3513 CheckCanRunGui
3514
Bram Moolenaar62aec932022-01-29 21:45:34 +00003515 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003516 'vim9script',
3517 'gui#comment'
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003518 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003519 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003520 'vim9script',
3521 'gui -f#comment'
Bram Moolenaarb8bd2e62021-08-21 17:13:14 +02003522 ], 'E194:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02003523enddef
3524
Bram Moolenaara26b9702020-04-18 19:53:28 +02003525def Test_vim9_comment_not_compiled()
Bram Moolenaar67979662020-06-20 22:50:47 +02003526 au TabEnter *.vim g:entered = 1
3527 au TabEnter *.x g:entered = 2
Bram Moolenaara26b9702020-04-18 19:53:28 +02003528
3529 edit test.vim
3530 doautocmd TabEnter #comment
3531 assert_equal(1, g:entered)
3532
3533 doautocmd TabEnter f.x
3534 assert_equal(2, g:entered)
3535
3536 g:entered = 0
3537 doautocmd TabEnter f.x #comment
3538 assert_equal(2, g:entered)
3539
3540 assert_fails('doautocmd Syntax#comment', 'E216:')
3541
3542 au! TabEnter
3543 unlet g:entered
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003544
Bram Moolenaar62aec932022-01-29 21:45:34 +00003545 v9.CheckScriptSuccess([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003546 'vim9script',
Bram Moolenaar67979662020-06-20 22:50:47 +02003547 'g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003548 'b:var = 456',
3549 'w:var = 777',
3550 't:var = 888',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003551 'unlet g:var w:var # something',
3552 ])
3553
Bram Moolenaar62aec932022-01-29 21:45:34 +00003554 v9.CheckScriptFailure([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003555 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003556 'let var = 123',
3557 ], 'E1126: Cannot use :let in Vim9 script')
3558
Bram Moolenaar62aec932022-01-29 21:45:34 +00003559 v9.CheckScriptFailure([
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003560 'vim9script',
3561 'var g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003562 ], 'E1016: Cannot declare a global variable:')
3563
Bram Moolenaar62aec932022-01-29 21:45:34 +00003564 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003565 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003566 'var b:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003567 ], 'E1016: Cannot declare a buffer variable:')
3568
Bram Moolenaar62aec932022-01-29 21:45:34 +00003569 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003570 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003571 'var w:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003572 ], 'E1016: Cannot declare a window variable:')
3573
Bram Moolenaar62aec932022-01-29 21:45:34 +00003574 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003575 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003576 'var t:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003577 ], 'E1016: Cannot declare a tab variable:')
3578
Bram Moolenaar62aec932022-01-29 21:45:34 +00003579 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003580 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003581 'var v:version = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003582 ], 'E1016: Cannot declare a v: variable:')
3583
Bram Moolenaar62aec932022-01-29 21:45:34 +00003584 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003585 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003586 'var $VARIABLE = "text"',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003587 ], 'E1016: Cannot declare an environment variable:')
Bram Moolenaar67979662020-06-20 22:50:47 +02003588
Bram Moolenaar62aec932022-01-29 21:45:34 +00003589 v9.CheckScriptFailure([
Bram Moolenaar67979662020-06-20 22:50:47 +02003590 'vim9script',
3591 'g:var = 123',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003592 'unlet g:var# comment1',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003593 ], 'E108:')
3594
Bram Moolenaar62aec932022-01-29 21:45:34 +00003595 v9.CheckScriptFailure([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003596 'let g:var = 123',
3597 'unlet g:var # something',
3598 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003599
Bram Moolenaar62aec932022-01-29 21:45:34 +00003600 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003601 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003602 'if 1 # comment2',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003603 ' echo "yes"',
3604 'elseif 2 #comment',
3605 ' echo "no"',
3606 'endif',
3607 ])
3608
Bram Moolenaar62aec932022-01-29 21:45:34 +00003609 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003610 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003611 'if 1# comment3',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003612 ' echo "yes"',
3613 'endif',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003614 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003615
Bram Moolenaar62aec932022-01-29 21:45:34 +00003616 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003617 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003618 'if 0 # comment4',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003619 ' echo "yes"',
3620 'elseif 2#comment',
3621 ' echo "no"',
3622 'endif',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003623 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003624
Bram Moolenaar62aec932022-01-29 21:45:34 +00003625 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003626 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003627 'var v = 1 # comment5',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003628 ])
3629
Bram Moolenaar62aec932022-01-29 21:45:34 +00003630 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003631 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003632 'var v = 1# comment6',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003633 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003634
Bram Moolenaar62aec932022-01-29 21:45:34 +00003635 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003636 'vim9script',
Bram Moolenaar2984ed32022-08-20 14:51:17 +01003637 'new',
Bram Moolenaard2c61702020-09-06 15:58:36 +02003638 'setline(1, ["# define pat", "last"])',
Bram Moolenaardf069ee2020-06-22 23:02:51 +02003639 ':$',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003640 'dsearch /pat/ #comment',
3641 'bwipe!',
3642 ])
3643
Bram Moolenaar62aec932022-01-29 21:45:34 +00003644 v9.CheckScriptFailure([
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003645 'vim9script',
Bram Moolenaar2984ed32022-08-20 14:51:17 +01003646 'new',
Bram Moolenaard2c61702020-09-06 15:58:36 +02003647 'setline(1, ["# define pat", "last"])',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003648 ':$',
3649 'dsearch /pat/#comment',
3650 'bwipe!',
3651 ], 'E488:')
3652
Bram Moolenaar62aec932022-01-29 21:45:34 +00003653 v9.CheckScriptFailure([
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003654 'vim9script',
3655 'func! SomeFunc()',
3656 ], 'E477:')
Bram Moolenaara26b9702020-04-18 19:53:28 +02003657enddef
3658
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003659def Test_finish()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003660 var lines =<< trim END
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003661 vim9script
Bram Moolenaar67979662020-06-20 22:50:47 +02003662 g:res = 'one'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003663 if v:false | finish | endif
Bram Moolenaar67979662020-06-20 22:50:47 +02003664 g:res = 'two'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003665 finish
Bram Moolenaar67979662020-06-20 22:50:47 +02003666 g:res = 'three'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003667 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003668 writefile(lines, 'Xfinished', 'D')
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003669 source Xfinished
3670 assert_equal('two', g:res)
3671
3672 unlet g:res
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003673enddef
3674
Bram Moolenaara5d00772020-05-14 23:20:55 +02003675def Test_forward_declaration()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003676 var lines =<< trim END
Bram Moolenaara5d00772020-05-14 23:20:55 +02003677 vim9script
Bram Moolenaara5d00772020-05-14 23:20:55 +02003678 def GetValue(): string
3679 return theVal
3680 enddef
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003681 var theVal = 'something'
Bram Moolenaar822ba242020-05-24 23:00:18 +02003682 g:initVal = GetValue()
Bram Moolenaara5d00772020-05-14 23:20:55 +02003683 theVal = 'else'
3684 g:laterVal = GetValue()
3685 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003686 writefile(lines, 'Xforward', 'D')
Bram Moolenaara5d00772020-05-14 23:20:55 +02003687 source Xforward
3688 assert_equal('something', g:initVal)
3689 assert_equal('else', g:laterVal)
3690
3691 unlet g:initVal
3692 unlet g:laterVal
Bram Moolenaara5d00772020-05-14 23:20:55 +02003693enddef
3694
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003695def Test_declare_script_var_in_func()
Bram Moolenaare535db82021-03-31 21:07:24 +02003696 var lines =<< trim END
3697 vim9script
3698 func Declare()
3699 let s:local = 123
3700 endfunc
3701 Declare()
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003702 END
3703 v9.CheckScriptFailure(lines, 'E1269:')
3704enddef
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00003705
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003706def Test_lock_script_var()
3707 var lines =<< trim END
3708 vim9script
3709 var local = 123
Bram Moolenaare535db82021-03-31 21:07:24 +02003710 assert_equal(123, local)
3711
3712 var error: string
3713 try
3714 local = 'asdf'
3715 catch
3716 error = v:exception
3717 endtry
3718 assert_match('E1012: Type mismatch; expected number but got string', error)
3719
3720 lockvar local
3721 try
3722 local = 999
3723 catch
3724 error = v:exception
3725 endtry
3726 assert_match('E741: Value is locked: local', error)
3727 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003728 v9.CheckScriptSuccess(lines)
Bram Moolenaare535db82021-03-31 21:07:24 +02003729enddef
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00003730
Bram Moolenaare535db82021-03-31 21:07:24 +02003731
Bram Moolenaar7d699702020-08-14 20:52:28 +02003732func Test_vim9script_not_global()
3733 " check that items defined in Vim9 script are script-local, not global
3734 let vim9lines =<< trim END
3735 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003736 var name = 'local'
Bram Moolenaar7d699702020-08-14 20:52:28 +02003737 func TheFunc()
3738 echo 'local'
3739 endfunc
3740 def DefFunc()
3741 echo 'local'
3742 enddef
3743 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003744 call writefile(vim9lines, 'Xvim9script.vim', 'D')
Bram Moolenaar7d699702020-08-14 20:52:28 +02003745 source Xvim9script.vim
3746 try
3747 echo g:var
3748 assert_report('did not fail')
3749 catch /E121:/
3750 " caught
3751 endtry
3752 try
3753 call TheFunc()
3754 assert_report('did not fail')
3755 catch /E117:/
3756 " caught
3757 endtry
3758 try
3759 call DefFunc()
3760 assert_report('did not fail')
3761 catch /E117:/
3762 " caught
3763 endtry
Bram Moolenaar7d699702020-08-14 20:52:28 +02003764endfunc
3765
Bram Moolenaareeb27bf2020-07-04 17:39:10 +02003766def Test_vim9_copen()
3767 # this was giving an error for setting w:quickfix_title
3768 copen
3769 quit
3770enddef
3771
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02003772def Test_script_var_in_autocmd()
3773 # using a script variable from an autocommand, defined in a :def function in a
3774 # legacy Vim script, cannot check the variable type.
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003775 var lines =<< trim END
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02003776 let s:counter = 1
3777 def s:Func()
3778 au! CursorHold
3779 au CursorHold * s:counter += 1
3780 enddef
3781 call s:Func()
3782 doau CursorHold
3783 call assert_equal(2, s:counter)
3784 au! CursorHold
3785 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003786 v9.CheckScriptSuccess(lines)
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02003787enddef
3788
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003789def Test_error_in_autoload_script()
3790 var save_rtp = &rtp
3791 var dir = getcwd() .. '/Xruntime'
3792 &rtp = dir
Bram Moolenaardd674772022-09-15 22:26:18 +01003793 mkdir(dir .. '/autoload', 'pR')
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003794
3795 var lines =<< trim END
3796 vim9script noclear
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003797 export def Autoloaded()
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003798 enddef
3799 def Broken()
3800 var x: any = ''
3801 eval x != 0
3802 enddef
3803 Broken()
3804 END
3805 writefile(lines, dir .. '/autoload/script.vim')
3806
3807 lines =<< trim END
3808 vim9script
3809 def CallAutoloaded()
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003810 script#Autoloaded()
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003811 enddef
3812
3813 function Legacy()
3814 try
3815 call s:CallAutoloaded()
3816 catch
3817 call assert_match('E1030: Using a String as a Number', v:exception)
3818 endtry
3819 endfunction
3820
3821 Legacy()
3822 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003823 v9.CheckScriptSuccess(lines)
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003824
3825 &rtp = save_rtp
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003826enddef
3827
Bram Moolenaar6809ff92022-07-26 15:10:56 +01003828def Test_error_in_autoload_script_foldexpr()
3829 var save_rtp = &rtp
Bram Moolenaardd674772022-09-15 22:26:18 +01003830 mkdir('Xvim/autoload', 'pR')
Bram Moolenaar6809ff92022-07-26 15:10:56 +01003831 &runtimepath = 'Xvim'
3832
3833 var lines =<< trim END
3834 vim9script
3835 eval [][0]
3836 echomsg 'no error'
3837 END
3838 lines->writefile('Xvim/autoload/script.vim')
3839
3840 lines =<< trim END
3841 vim9script
3842 import autoload 'script.vim'
3843 &foldmethod = 'expr'
3844 &foldexpr = 'script.Func()'
3845 redraw
3846 END
3847 v9.CheckScriptFailure(lines, 'E684: List index out of range: 0')
Bram Moolenaar6809ff92022-07-26 15:10:56 +01003848enddef
3849
Bram Moolenaare3d46852020-08-29 13:39:17 +02003850def Test_invalid_sid()
3851 assert_fails('func <SNR>1234_func', 'E123:')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02003852
Bram Moolenaar62aec932022-01-29 21:45:34 +00003853 if g:RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
Bram Moolenaard2c61702020-09-06 15:58:36 +02003854 assert_equal([], readfile('Xdidit'))
Bram Moolenaare3d46852020-08-29 13:39:17 +02003855 endif
3856 delete('Xdidit')
3857enddef
3858
Bram Moolenaar9ec70262020-12-09 17:16:59 +01003859def Test_restoring_cpo()
Bram Moolenaardd674772022-09-15 22:26:18 +01003860 writefile(['vim9script', 'set nocp'], 'Xsourced', 'D')
3861 writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003862 if g:RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
Bram Moolenaar9ec70262020-12-09 17:16:59 +01003863 assert_equal(['done'], readfile('Xdone'))
3864 endif
Bram Moolenaar090728a2020-12-20 15:43:31 +01003865 delete('Xdone')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003866
Bram Moolenaardd674772022-09-15 22:26:18 +01003867 writefile(['vim9script', 'g:cpoval = &cpo'], 'XanotherScript', 'D')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003868 set cpo=aABceFsMny>
3869 edit XanotherScript
3870 so %
3871 assert_equal('aABceFsMny>', &cpo)
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003872 assert_equal('aABceFs', g:cpoval)
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003873 :1del
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003874 setline(1, 'let g:cpoval = &cpo')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003875 w
3876 so %
3877 assert_equal('aABceFsMny>', &cpo)
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003878 assert_equal('aABceFsMny>', g:cpoval)
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003879
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003880 set cpo&vim
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003881 unlet g:cpoval
3882
3883 if has('unix')
3884 # 'cpo' is not restored in main vimrc
3885 var save_HOME = $HOME
3886 $HOME = getcwd() .. '/Xhome'
Bram Moolenaardd674772022-09-15 22:26:18 +01003887 mkdir('Xhome', 'R')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003888 var lines =<< trim END
3889 vim9script
Bram Moolenaarb18b4962022-09-02 21:55:50 +01003890 writefile(['before: ' .. &cpo], 'Xrporesult')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003891 set cpo+=M
Bram Moolenaarb18b4962022-09-02 21:55:50 +01003892 writefile(['after: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003893 END
3894 writefile(lines, 'Xhome/.vimrc')
3895
3896 lines =<< trim END
Bram Moolenaarb18b4962022-09-02 21:55:50 +01003897 call writefile(['later: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003898 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003899 writefile(lines, 'Xlegacy', 'D')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003900
3901 lines =<< trim END
3902 vim9script
Bram Moolenaarb18b4962022-09-02 21:55:50 +01003903 call writefile(['vim9: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003904 qa
3905 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003906 writefile(lines, 'Xvim9', 'D')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003907
Bram Moolenaar62aec932022-01-29 21:45:34 +00003908 var cmd = g:GetVimCommand() .. " -S Xlegacy -S Xvim9"
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003909 cmd = substitute(cmd, '-u NONE', '', '')
3910 exe "silent !" .. cmd
3911
3912 assert_equal([
3913 'before: aABceFs',
3914 'after: aABceFsM',
3915 'later: aABceFsM',
Bram Moolenaarb18b4962022-09-02 21:55:50 +01003916 'vim9: aABceFs'], readfile('Xrporesult'))
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003917
3918 $HOME = save_HOME
Bram Moolenaarb18b4962022-09-02 21:55:50 +01003919 delete('Xrporesult')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003920 endif
Bram Moolenaar9ec70262020-12-09 17:16:59 +01003921enddef
3922
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01003923" Use :function so we can use Check commands
3924func Test_no_redraw_when_restoring_cpo()
Bram Moolenaar37294bd2021-03-10 13:40:08 +01003925 CheckScreendump
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01003926 CheckFeature timers
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00003927 call Run_test_no_redraw_when_restoring_cpo()
3928endfunc
Bram Moolenaar37294bd2021-03-10 13:40:08 +01003929
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00003930def Run_test_no_redraw_when_restoring_cpo()
3931 var lines =<< trim END
Bram Moolenaar37294bd2021-03-10 13:40:08 +01003932 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003933 export def Func()
Bram Moolenaar37294bd2021-03-10 13:40:08 +01003934 enddef
3935 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003936 mkdir('Xnordir/autoload', 'pR')
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01003937 writefile(lines, 'Xnordir/autoload/script.vim')
Bram Moolenaar37294bd2021-03-10 13:40:08 +01003938
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00003939 lines =<< trim END
Bram Moolenaar37294bd2021-03-10 13:40:08 +01003940 vim9script
3941 set cpo+=M
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01003942 exe 'set rtp^=' .. getcwd() .. '/Xnordir'
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003943 au CmdlineEnter : ++once timer_start(0, (_) => script#Func())
Bram Moolenaar37294bd2021-03-10 13:40:08 +01003944 setline(1, 'some text')
3945 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003946 writefile(lines, 'XTest_redraw_cpo', 'D')
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00003947 var buf = g:RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
3948 term_sendkeys(buf, "V:")
3949 g:VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
Bram Moolenaar37294bd2021-03-10 13:40:08 +01003950
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00003951 # clean up
3952 term_sendkeys(buf, "\<Esc>u")
3953 g:StopVimInTerminal(buf)
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00003954enddef
3955
3956func Test_reject_declaration()
3957 CheckScreendump
3958 call Run_test_reject_declaration()
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01003959endfunc
Bram Moolenaar37294bd2021-03-10 13:40:08 +01003960
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00003961def Run_test_reject_declaration()
3962 var buf = g:RunVimInTerminal('', {'rows': 6})
3963 term_sendkeys(buf, ":vim9cmd var x: number\<CR>")
Bram Moolenaar330a3882022-03-05 11:05:57 +00003964 g:VerifyScreenDump(buf, 'Test_vim9_reject_declaration_1', {})
3965 term_sendkeys(buf, ":\<CR>")
3966 term_sendkeys(buf, ":vim9cmd g:foo = 123 | echo g:foo\<CR>")
3967 g:VerifyScreenDump(buf, 'Test_vim9_reject_declaration_2', {})
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00003968
3969 # clean up
3970 g:StopVimInTerminal(buf)
3971enddef
Bram Moolenaar9ec70262020-12-09 17:16:59 +01003972
Bram Moolenaar204852a2022-03-05 12:56:44 +00003973def Test_minimal_command_name_length()
3974 var names = [
3975 'cons',
3976 'brea',
3977 'cat',
3978 'catc',
3979 'con',
Bram Moolenaarb2175222022-03-05 20:24:41 +00003980 'cont',
3981 'conti',
3982 'contin',
3983 'continu',
Bram Moolenaar204852a2022-03-05 12:56:44 +00003984 'el',
3985 'els',
3986 'elsei',
3987 'endfo',
3988 'en',
3989 'end',
3990 'endi',
3991 'endw',
3992 'endt',
3993 'endtr',
Bram Moolenaarb2175222022-03-05 20:24:41 +00003994 'exp',
3995 'expo',
3996 'expor',
Bram Moolenaar204852a2022-03-05 12:56:44 +00003997 'fina',
3998 'finall',
Bram Moolenaard523c7b2022-03-06 14:51:22 +00003999 'fini',
4000 'finis',
Bram Moolenaarb2175222022-03-05 20:24:41 +00004001 'imp',
4002 'impo',
4003 'impor',
4004 'retu',
4005 'retur',
Bram Moolenaar204852a2022-03-05 12:56:44 +00004006 'th',
4007 'thr',
4008 'thro',
4009 'wh',
4010 'whi',
4011 'whil',
4012 ]
4013 for name in names
4014 v9.CheckDefAndScriptFailure([name .. ' '], 'E1065:')
4015 endfor
Bram Moolenaarb2175222022-03-05 20:24:41 +00004016
4017 var lines =<< trim END
4018 vim9script
4019 def SomeFunc()
4020 endd
4021 END
4022 v9.CheckScriptFailure(lines, 'E1065:')
4023 lines =<< trim END
4024 vim9script
4025 def SomeFunc()
4026 endde
4027 END
4028 v9.CheckScriptFailure(lines, 'E1065:')
Bram Moolenaar204852a2022-03-05 12:56:44 +00004029enddef
4030
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004031def Test_unset_any_variable()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004032 var lines =<< trim END
4033 var name: any
4034 assert_equal(0, name)
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004035 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004036 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004037enddef
4038
Bram Moolenaar7e9210e2020-09-25 23:12:51 +02004039func Test_define_func_at_command_line()
Bram Moolenaar58dbef32020-09-25 22:13:05 +02004040 CheckRunVimInTerminal
4041
Bram Moolenaar7e9210e2020-09-25 23:12:51 +02004042 " call indirectly to avoid compilation error for missing functions
4043 call Run_Test_define_func_at_command_line()
4044endfunc
4045
4046def Run_Test_define_func_at_command_line()
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004047 # run in a separate Vim instance to avoid the script context
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004048 var lines =<< trim END
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004049 func CheckAndQuit()
4050 call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
4051 call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
4052 endfunc
4053 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004054 writefile([''], 'Xdidcmd', 'D')
4055 writefile(lines, 'XcallFunc', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00004056 var buf = g:RunVimInTerminal('-S XcallFunc', {rows: 6})
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004057 # define Afunc() on the command line
4058 term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
4059 term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004060 g:WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004061
Bram Moolenaar62aec932022-01-29 21:45:34 +00004062 call g:StopVimInTerminal(buf)
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004063enddef
4064
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004065def Test_script_var_scope()
4066 var lines =<< trim END
4067 vim9script
4068 if true
4069 if true
4070 var one = 'one'
4071 echo one
4072 endif
4073 echo one
4074 endif
4075 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004076 v9.CheckScriptFailure(lines, 'E121:', 7)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004077
4078 lines =<< trim END
4079 vim9script
4080 if true
4081 if false
4082 var one = 'one'
4083 echo one
4084 else
4085 var one = 'one'
4086 echo one
4087 endif
4088 echo one
4089 endif
4090 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004091 v9.CheckScriptFailure(lines, 'E121:', 10)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004092
4093 lines =<< trim END
4094 vim9script
4095 while true
4096 var one = 'one'
4097 echo one
4098 break
4099 endwhile
4100 echo one
4101 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004102 v9.CheckScriptFailure(lines, 'E121:', 7)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004103
4104 lines =<< trim END
4105 vim9script
4106 for i in range(1)
4107 var one = 'one'
4108 echo one
4109 endfor
4110 echo one
4111 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004112 v9.CheckScriptFailure(lines, 'E121:', 6)
Bram Moolenaar9becdf22020-10-10 21:33:48 +02004113
4114 lines =<< trim END
4115 vim9script
4116 {
4117 var one = 'one'
4118 assert_equal('one', one)
4119 }
4120 assert_false(exists('one'))
4121 assert_false(exists('s:one'))
4122 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004123 v9.CheckScriptSuccess(lines)
Bram Moolenaar9becdf22020-10-10 21:33:48 +02004124
4125 lines =<< trim END
4126 vim9script
4127 {
4128 var one = 'one'
4129 echo one
4130 }
4131 echo one
4132 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004133 v9.CheckScriptFailure(lines, 'E121:', 6)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004134enddef
4135
Bram Moolenaar352134b2020-10-17 22:04:08 +02004136def Test_catch_exception_in_callback()
4137 var lines =<< trim END
4138 vim9script
Bram Moolenaar2a389082021-04-09 20:24:31 +02004139 def Callback(...l: list<any>)
Bram Moolenaar352134b2020-10-17 22:04:08 +02004140 try
4141 var x: string
4142 var y: string
4143 # this error should be caught with CHECKLEN
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +00004144 var sl = ['']
4145 [x, y] = sl
Bram Moolenaar352134b2020-10-17 22:04:08 +02004146 catch
4147 g:caught = 'yes'
4148 endtry
4149 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01004150 popup_menu('popup', {callback: Callback})
Bram Moolenaar352134b2020-10-17 22:04:08 +02004151 feedkeys("\r", 'xt')
4152 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004153 v9.CheckScriptSuccess(lines)
Bram Moolenaar352134b2020-10-17 22:04:08 +02004154
4155 unlet g:caught
4156enddef
4157
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004158def Test_no_unknown_error_after_error()
4159 if !has('unix') || !has('job')
4160 throw 'Skipped: not unix of missing +job feature'
4161 endif
Bram Moolenaarb16ff292021-09-26 20:14:39 +01004162 # FIXME: this check should not be needed
4163 if has('win32')
4164 throw 'Skipped: does not work on MS-Windows'
4165 endif
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004166 var lines =<< trim END
4167 vim9script
4168 var source: list<number>
Bram Moolenaar2a389082021-04-09 20:24:31 +02004169 def Out_cb(...l: list<any>)
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004170 eval [][0]
4171 enddef
Bram Moolenaar2a389082021-04-09 20:24:31 +02004172 def Exit_cb(...l: list<any>)
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004173 sleep 1m
Bram Moolenaar23d44492022-05-04 16:24:57 +01004174 g:did_call_exit_cb = true
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004175 source += l
4176 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01004177 var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
Bram Moolenaar6f17a3f2020-12-21 18:11:24 +01004178 while job_status(myjob) == 'run'
4179 sleep 10m
4180 endwhile
Bram Moolenaar206c2a62021-01-31 14:04:44 +01004181 # wait for Exit_cb() to be called
Bram Moolenaar23d44492022-05-04 16:24:57 +01004182 for x in range(100)
4183 if exists('g:did_call_exit_cb')
4184 unlet g:did_call_exit_cb
4185 break
4186 endif
4187 sleep 10m
4188 endfor
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004189 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004190 writefile(lines, 'Xdef', 'D')
Yee Cheng Chin69a8bb82022-11-06 12:25:47 +00004191 # Either the exit or out callback is called first, accept them in any order
4192 assert_fails('so Xdef', ['E684:\|E1012:', 'E1012:\|E684:'])
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004193enddef
4194
Bram Moolenaar4324d872020-12-01 20:12:24 +01004195def InvokeNormal()
4196 exe "norm! :m+1\r"
4197enddef
4198
4199def Test_invoke_normal_in_visual_mode()
4200 xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
4201 new
4202 setline(1, ['aaa', 'bbb'])
4203 feedkeys("V\<F3>", 'xt')
4204 assert_equal(['bbb', 'aaa'], getline(1, 2))
4205 xunmap <F3>
4206enddef
4207
Bram Moolenaarb5b94802020-12-13 17:50:20 +01004208def Test_white_space_after_command()
4209 var lines =<< trim END
4210 exit_cb: Func})
4211 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004212 v9.CheckDefAndScriptFailure(lines, 'E1144:', 1)
Bram Moolenaarf8103f22020-12-25 17:36:27 +01004213
4214 lines =<< trim END
4215 e#
4216 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004217 v9.CheckDefAndScriptFailure(lines, 'E1144:', 1)
Bram Moolenaarb5b94802020-12-13 17:50:20 +01004218enddef
4219
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004220def Test_script_var_gone_when_sourced_twice()
4221 var lines =<< trim END
4222 vim9script
4223 if exists('g:guard')
4224 finish
4225 endif
4226 g:guard = 1
4227 var name = 'thename'
4228 def g:GetName(): string
4229 return name
4230 enddef
4231 def g:SetName(arg: string)
4232 name = arg
4233 enddef
4234 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004235 writefile(lines, 'XscriptTwice.vim', 'D')
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004236 so XscriptTwice.vim
4237 assert_equal('thename', g:GetName())
4238 g:SetName('newname')
4239 assert_equal('newname', g:GetName())
4240 so XscriptTwice.vim
4241 assert_fails('call g:GetName()', 'E1149:')
4242 assert_fails('call g:SetName("x")', 'E1149:')
4243
4244 delfunc g:GetName
4245 delfunc g:SetName
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004246 unlet g:guard
4247enddef
4248
Bram Moolenaar10b94212021-02-19 21:42:57 +01004249def Test_unsupported_commands()
4250 var lines =<< trim END
4251 ka
4252 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004253 v9.CheckDefAndScriptFailure(lines, ['E476:', 'E492:'])
Bram Moolenaar10b94212021-02-19 21:42:57 +01004254
4255 lines =<< trim END
Bram Moolenaarada1d872021-02-20 08:16:51 +01004256 :1ka
4257 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004258 v9.CheckDefAndScriptFailure(lines, ['E476:', 'E492:'])
Bram Moolenaarada1d872021-02-20 08:16:51 +01004259
4260 lines =<< trim END
Yegappan Lakshmanan885de442022-04-23 10:51:14 +01004261 :k a
4262 END
4263 v9.CheckDefAndScriptFailure(lines, 'E1100:')
4264
4265 lines =<< trim END
4266 :1k a
4267 END
4268 v9.CheckDefAndScriptFailure(lines, 'E481:')
4269
4270 lines =<< trim END
Bram Moolenaar10b94212021-02-19 21:42:57 +01004271 t
4272 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004273 v9.CheckDefAndScriptFailure(lines, 'E1100:')
Bram Moolenaar10b94212021-02-19 21:42:57 +01004274
4275 lines =<< trim END
4276 x
4277 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004278 v9.CheckDefAndScriptFailure(lines, 'E1100:')
Bram Moolenaar10b94212021-02-19 21:42:57 +01004279
4280 lines =<< trim END
4281 xit
4282 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004283 v9.CheckDefAndScriptFailure(lines, 'E1100:')
4284
4285 lines =<< trim END
4286 Print
4287 END
4288 v9.CheckDefAndScriptFailure(lines, ['E476: Invalid command: Print', 'E492: Not an editor command: Print'])
4289
4290 lines =<< trim END
4291 mode 4
4292 END
4293 v9.CheckDefAndScriptFailure(lines, ['E476: Invalid command: mode 4', 'E492: Not an editor command: mode 4'])
Bram Moolenaar10b94212021-02-19 21:42:57 +01004294enddef
4295
Bram Moolenaarc70fe462021-04-17 17:59:19 +02004296def Test_mapping_line_number()
4297 var lines =<< trim END
4298 vim9script
4299 def g:FuncA()
4300 # Some comment
4301 FuncB(0)
4302 enddef
4303 # Some comment
4304 def FuncB(
4305 # Some comment
4306 n: number
4307 )
4308 exe 'nno '
4309 # Some comment
4310 .. '<F3> a'
4311 .. 'b'
4312 .. 'c'
4313 enddef
4314 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004315 v9.CheckScriptSuccess(lines)
Bram Moolenaarc70fe462021-04-17 17:59:19 +02004316 var res = execute('verbose nmap <F3>')
4317 assert_match('No mapping found', res)
4318
4319 g:FuncA()
4320 res = execute('verbose nmap <F3>')
4321 assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
4322
4323 nunmap <F3>
4324 delfunc g:FuncA
4325enddef
4326
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004327def Test_option_set()
4328 # legacy script allows for white space
4329 var lines =<< trim END
4330 set foldlevel =11
4331 call assert_equal(11, &foldlevel)
4332 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004333 v9.CheckScriptSuccess(lines)
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004334
4335 set foldlevel
4336 set foldlevel=12
4337 assert_equal(12, &foldlevel)
4338 set foldlevel+=2
4339 assert_equal(14, &foldlevel)
4340 set foldlevel-=3
4341 assert_equal(11, &foldlevel)
4342
4343 lines =<< trim END
4344 set foldlevel =1
4345 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004346 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004347
4348 lines =<< trim END
4349 set foldlevel +=1
4350 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004351 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004352
4353 lines =<< trim END
4354 set foldlevel ^=1
4355 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004356 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004357
4358 lines =<< trim END
4359 set foldlevel -=1
4360 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004361 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004362
4363 set foldlevel&
4364enddef
4365
LemonBoy32f34612023-09-02 21:52:05 +02004366def Test_option_set_line_number()
4367 var lines =<< trim END
4368 vim9script
4369 # line2
4370 # line3
4371 def F()
4372 # line5
4373 &foldlevel = -128
4374 enddef
4375 F()
4376 END
4377 v9.CheckScriptSuccess(lines)
4378
4379 var res = execute('verbose set foldlevel')
4380 assert_match(' foldlevel.*Last set from .*XScriptSuccess\d\+ line 6', res)
4381enddef
4382
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004383def Test_option_modifier()
Bram Moolenaar1594f312021-07-08 16:40:13 +02004384 # legacy script allows for white space
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004385 var lines =<< trim END
4386 set hlsearch & hlsearch !
4387 call assert_equal(1, &hlsearch)
4388 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004389 v9.CheckScriptSuccess(lines)
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004390
Bram Moolenaar1594f312021-07-08 16:40:13 +02004391 set hlsearch
4392 set hlsearch!
4393 assert_equal(false, &hlsearch)
4394
4395 set hlsearch
4396 set hlsearch&
4397 assert_equal(false, &hlsearch)
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004398
4399 lines =<< trim END
Bram Moolenaar1594f312021-07-08 16:40:13 +02004400 set hlsearch &
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004401 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004402 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &')
Bram Moolenaar1594f312021-07-08 16:40:13 +02004403
4404 lines =<< trim END
4405 set hlsearch !
4406 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004407 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !')
Bram Moolenaar1594f312021-07-08 16:40:13 +02004408
4409 set hlsearch&
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004410enddef
4411
Bram Moolenaarc03fe662021-07-11 16:52:45 +02004412" This must be called last, it may cause following :def functions to fail
4413def Test_xxx_echoerr_line_number()
4414 var lines =<< trim END
4415 echoerr 'some'
4416 .. ' error'
4417 .. ' continued'
4418 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004419 v9.CheckDefExecAndScriptFailure(lines, 'some error continued', 1)
Bram Moolenaarc03fe662021-07-11 16:52:45 +02004420enddef
4421
Bram Moolenaar9537e372021-12-10 21:05:53 +00004422func Test_debug_with_lambda()
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004423 CheckRunVimInTerminal
4424
Bram Moolenaar9537e372021-12-10 21:05:53 +00004425 " call indirectly to avoid compilation error for missing functions
4426 call Run_Test_debug_with_lambda()
4427endfunc
4428
4429def Run_Test_debug_with_lambda()
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004430 var lines =<< trim END
4431 vim9script
4432 def Func()
4433 var n = 0
4434 echo [0]->filter((_, v) => v == n)
4435 enddef
4436 breakadd func Func
4437 Func()
4438 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004439 writefile(lines, 'XdebugFunc', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00004440 var buf = g:RunVimInTerminal('-S XdebugFunc', {rows: 6, wait_for_ruler: 0})
4441 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 6)))
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004442
4443 term_sendkeys(buf, "cont\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004444 g:WaitForAssert(() => assert_match('\[0\]', term_getline(buf, 5)))
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004445
Bram Moolenaar62aec932022-01-29 21:45:34 +00004446 g:StopVimInTerminal(buf)
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004447enddef
4448
Bram Moolenaar310091d2021-12-23 21:14:37 +00004449func Test_debug_running_out_of_lines()
4450 CheckRunVimInTerminal
4451
4452 " call indirectly to avoid compilation error for missing functions
4453 call Run_Test_debug_running_out_of_lines()
4454endfunc
4455
4456def Run_Test_debug_running_out_of_lines()
4457 var lines =<< trim END
4458 vim9script
4459 def Crash()
4460 #
4461 #
4462 #
4463 #
4464 #
4465 #
4466 #
4467 if true
4468 #
4469 endif
4470 enddef
4471 breakadd func Crash
4472 Crash()
4473 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004474 writefile(lines, 'XdebugFunc', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00004475 var buf = g:RunVimInTerminal('-S XdebugFunc', {rows: 6, wait_for_ruler: 0})
4476 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 6)))
Bram Moolenaar310091d2021-12-23 21:14:37 +00004477
4478 term_sendkeys(buf, "next\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004479 g:TermWait(buf)
4480 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 6)))
Bram Moolenaar310091d2021-12-23 21:14:37 +00004481
4482 term_sendkeys(buf, "cont\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004483 g:TermWait(buf)
Bram Moolenaar310091d2021-12-23 21:14:37 +00004484
Bram Moolenaar62aec932022-01-29 21:45:34 +00004485 g:StopVimInTerminal(buf)
Bram Moolenaar310091d2021-12-23 21:14:37 +00004486enddef
4487
dundargocc57b5bc2022-11-02 13:30:51 +00004488def Test_ambiguous_command_error()
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004489 var lines =<< trim END
4490 vim9script
4491 command CmdA echomsg 'CmdA'
4492 command CmdB echomsg 'CmdB'
4493 Cmd
4494 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004495 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 4)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004496
4497 lines =<< trim END
4498 vim9script
4499 def Func()
4500 Cmd
4501 enddef
4502 Func()
4503 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004504 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 1)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004505
4506 lines =<< trim END
4507 vim9script
4508 nnoremap <F3> <ScriptCmd>Cmd<CR>
4509 feedkeys("\<F3>", 'xt')
4510 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004511 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 3)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004512
4513 delcommand CmdA
4514 delcommand CmdB
4515 nunmap <F3>
4516enddef
4517
Dominique Pelle923dce22021-11-21 11:36:04 +00004518" Execute this near the end, profiling doesn't stop until Vim exits.
Bram Moolenaard9162552021-07-11 15:26:13 +02004519" This only tests that it works, not the profiling output.
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004520def Test_profile_with_lambda()
Bram Moolenaar4ece1522021-07-11 16:31:51 +02004521 CheckFeature profile
4522
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004523 var lines =<< trim END
4524 vim9script
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004525
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004526 def ProfiledWithLambda()
4527 var n = 3
4528 echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n)
4529 enddef
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004530
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004531 def ProfiledNested()
4532 var x = 0
4533 def Nested(): any
4534 return x
4535 enddef
4536 Nested()
4537 enddef
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004538
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004539 def g:ProfiledNestedProfiled()
4540 var x = 0
4541 def Nested(): any
4542 return x
4543 enddef
4544 Nested()
4545 enddef
4546
4547 def Profile()
Bram Moolenaar48f69cd2022-03-15 16:16:47 +00004548 ProfiledWithLambda()
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004549 ProfiledNested()
4550
Bram Moolenaar48f69cd2022-03-15 16:16:47 +00004551 # Also profile the nested function. Use a different function, although
4552 # the contents is the same, to make sure it was not already compiled.
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004553 profile func *
4554 g:ProfiledNestedProfiled()
4555
4556 profdel func *
4557 profile pause
4558 enddef
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004559
4560 var result = 'done'
4561 try
4562 # mark functions for profiling now to avoid E1271
4563 profile start Xprofile.log
4564 profile func ProfiledWithLambda
4565 profile func ProfiledNested
4566
4567 Profile()
4568 catch
4569 result = 'failed: ' .. v:exception
4570 finally
4571 writefile([result], 'Xdidprofile')
4572 endtry
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004573 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004574 writefile(lines, 'Xprofile.vim', 'D')
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004575 call system(g:GetVimCommand()
4576 .. ' --clean'
4577 .. ' -c "so Xprofile.vim"'
4578 .. ' -c "qall!"')
4579 call assert_equal(0, v:shell_error)
4580
4581 assert_equal(['done'], readfile('Xdidprofile'))
4582 assert_true(filereadable('Xprofile.log'))
4583 delete('Xdidprofile')
4584 delete('Xprofile.log')
Bram Moolenaard9162552021-07-11 15:26:13 +02004585enddef
4586
Bram Moolenaar4f6e7722022-03-16 20:26:02 +00004587func Test_misplaced_type()
4588 CheckRunVimInTerminal
4589 call Run_Test_misplaced_type()
4590endfunc
4591
4592def Run_Test_misplaced_type()
Bram Moolenaar9510d222022-09-11 15:14:05 +01004593 writefile(['let g:somevar = "asdf"'], 'XTest_misplaced_type', 'D')
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004594 var buf = g:RunVimInTerminal('-S XTest_misplaced_type', {'rows': 6})
Bram Moolenaar9510d222022-09-11 15:14:05 +01004595 term_sendkeys(buf, ":vim9cmd echo islocked('somevar: string')\<CR>")
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004596 g:VerifyScreenDump(buf, 'Test_misplaced_type', {})
4597
4598 g:StopVimInTerminal(buf)
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004599enddef
4600
LemonBoya5d35902022-04-29 21:15:02 +01004601" Ensure echo doesn't crash when stringifying empty variables.
4602def Test_echo_uninit_variables()
4603 var res: string
4604
4605 var var_bool: bool
4606 var var_num: number
4607 var var_float: float
4608 var Var_func: func
4609 var var_string: string
4610 var var_blob: blob
LemonBoya5d35902022-04-29 21:15:02 +01004611 var var_list: list<any>
4612 var var_dict: dict<any>
4613
4614 redir => res
4615 echo var_bool
4616 echo var_num
4617 echo var_float
4618 echo Var_func
4619 echo var_string
4620 echo var_blob
LemonBoya5d35902022-04-29 21:15:02 +01004621 echo var_list
4622 echo var_dict
4623 redir END
4624
Bram Moolenaarf1d63b92022-05-06 13:37:42 +01004625 assert_equal(['false', '0', '0.0', 'function()', '', '0z', '[]', '{}'], res->split('\n'))
4626
4627 if has('job')
4628 var var_job: job
4629 var var_channel: channel
4630
4631 redir => res
4632 echo var_job
4633 echo var_channel
4634 redir END
4635
4636 assert_equal(['no process', 'channel fail'], res->split('\n'))
4637 endif
LemonBoya5d35902022-04-29 21:15:02 +01004638enddef
4639
Bram Moolenaar6342e2c2022-12-12 18:56:32 +00004640def Test_free_type_before_use()
4641 # this rather complicated script was freeing a type before using it
4642 var lines =<< trim END
4643 vim9script
4644
4645 def Scan(rel: list<dict<any>>): func(func(dict<any>))
4646 return (Emit: func(dict<any>)) => {
4647 for t in rel
4648 Emit(t)
4649 endfor
4650 }
4651 enddef
4652
4653 def Build(Cont: func(func(dict<any>))): list<dict<any>>
4654 var rel: list<dict<any>> = []
4655 Cont((t) => {
4656 add(rel, t)
4657 })
4658 return rel
4659 enddef
4660
4661 var R = [{A: 0}]
4662 var result = Scan(R)->Build()
4663 result = Scan(R)->Build()
4664
4665 assert_equal(R, result)
4666 END
4667 v9.CheckScriptSuccess(lines)
4668enddef
4669
Yegappan Lakshmanana76fbe62023-09-27 18:51:43 +02004670" The following complicated script used to cause an internal error (E340)
4671" because the funcref instruction memory was referenced after the instruction
4672" memory was reallocated (Github issue #13178)
4673def Test_refer_funcref_instr_after_realloc()
4674 var lines =<< trim END
4675 vim9script
4676 def A(d: bool)
4677 var e = abs(0)
4678 var f = &emoji
4679 &emoji = true
4680 if ['', '', '']->index('xxx') == 0
4681 eval 0 + 0
4682 endif
4683 if &filetype == 'xxx'
4684 var g = abs(0)
4685 while g > 0
4686 if getline(g) == ''
4687 break
4688 endif
4689 --g
4690 endwhile
4691 if g == 0
4692 return
4693 endif
4694 if d
4695 feedkeys($'{g}G')
4696 g = abs(0)
4697 endif
4698 var h = abs(0)
4699 var i = abs(0)
4700 var j = abs(0)
4701 while j < 0
4702 if abs(0) < h && getline(j) != ''
4703 break
4704 endif
4705 ++j
4706 endwhile
4707 feedkeys($'{g}G{j}G')
4708 return
4709 endif
4710 def B()
4711 enddef
4712 def C()
4713 enddef
4714 enddef
4715 A(false)
4716 END
4717 v9.CheckScriptSuccess(lines)
4718enddef
4719
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004720" Test for calling a deferred function after an exception
4721def Test_defer_after_exception()
4722 var lines =<< trim END
4723 vim9script
4724
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004725 var callTrace: list<number> = []
4726 def Bar()
4727 callTrace += [1]
4728 throw 'InnerException'
4729 enddef
4730
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004731 def Defer()
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004732 callTrace += [2]
4733 callTrace += [3]
4734 try
4735 Bar()
4736 catch /InnerException/
4737 callTrace += [4]
4738 endtry
4739 callTrace += [5]
4740 callTrace += [6]
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004741 enddef
4742
4743 def Foo()
4744 defer Defer()
4745 throw "TestException"
4746 enddef
4747
4748 try
4749 Foo()
4750 catch /TestException/
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004751 callTrace += [7]
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004752 endtry
4753
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004754 assert_equal([2, 3, 1, 4, 5, 6, 7], callTrace)
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004755 END
Yegappan Lakshmananec3cebb2023-10-27 19:35:26 +02004756 v9.CheckSourceSuccess(lines)
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004757enddef
4758
Yegappan Lakshmanan0ab500d2023-10-21 11:59:42 +02004759" Test for multiple deferred function which throw exceptions.
4760" Exceptions thrown by deferred functions should result in error messages but
4761" not propagated into the calling functions.
4762def Test_multidefer_with_exception()
4763 var lines =<< trim END
4764 vim9script
4765
4766 var callTrace: list<number> = []
4767 def Except()
4768 callTrace += [1]
4769 throw 'InnerException'
4770 callTrace += [2]
4771 enddef
4772
4773 def FirstDefer()
4774 callTrace += [3]
4775 callTrace += [4]
4776 enddef
4777
4778 def SecondDeferWithExcept()
4779 callTrace += [5]
4780 Except()
4781 callTrace += [6]
4782 enddef
4783
4784 def ThirdDefer()
4785 callTrace += [7]
4786 callTrace += [8]
4787 enddef
4788
4789 def Foo()
4790 callTrace += [9]
4791 defer FirstDefer()
4792 defer SecondDeferWithExcept()
4793 defer ThirdDefer()
4794 callTrace += [10]
4795 enddef
4796
4797 v:errmsg = ''
4798 try
4799 callTrace += [11]
4800 Foo()
4801 callTrace += [12]
4802 catch /TestException/
4803 callTrace += [13]
4804 catch
4805 callTrace += [14]
4806 finally
4807 callTrace += [15]
4808 endtry
4809 callTrace += [16]
4810
4811 assert_equal('E605: Exception not caught: InnerException', v:errmsg)
4812 assert_equal([11, 9, 10, 7, 8, 5, 1, 3, 4, 12, 15, 16], callTrace)
4813 END
Yegappan Lakshmananec3cebb2023-10-27 19:35:26 +02004814 v9.CheckSourceSuccess(lines)
4815enddef
4816
Yegappan Lakshmanana185a312023-12-16 14:36:08 +01004817" Test for using ":defer" inside an if statement with a false condition
4818def Test_defer_skipped()
4819 var lines =<< trim END
4820 def Foo()
4821 if false
4822 defer execute('echow "hello"', "")
4823 endif
4824 enddef
4825 defcompile
4826 END
4827 v9.CheckSourceSuccess(lines)
4828enddef
4829
Yegappan Lakshmanan062bb6b2023-12-16 14:46:40 +01004830" Test for using defer without parenthesis for the function name
4831def Test_defer_func_without_paren()
4832 var lines =<< trim END
4833 vim9script
4834 def Foo()
4835 defer Bar
4836 enddef
4837 defcompile
4838 END
4839 v9.CheckScriptFailure(lines, 'E107: Missing parentheses: Bar', 1)
4840enddef
4841
4842" Test for using defer without parenthesis for the function name
4843def Test_defer_non_existing_func()
4844 var lines =<< trim END
4845 vim9script
4846 def Foo()
4847 defer Bar()
4848 enddef
4849 defcompile
4850 END
4851 v9.CheckScriptFailure(lines, 'E1001: Variable not found: Bar', 1)
4852enddef
4853
4854" Test for using defer with an invalid function name
4855def Test_defer_invalid_func()
4856 var lines =<< trim END
4857 vim9script
4858 def Foo()
4859 var Abc = 10
4860 defer Abc()
4861 enddef
4862 defcompile
4863 END
4864 v9.CheckScriptFailure(lines, 'E129: Function name required', 2)
4865enddef
4866
4867" Test for using defer with an invalid argument to a function
4868def Test_defer_invalid_func_arg()
4869 var lines =<< trim END
4870 vim9script
4871 def Bar(x: number)
4872 enddef
4873 def Foo()
4874 defer Bar(a)
4875 enddef
4876 defcompile
4877 END
4878 v9.CheckScriptFailure(lines, 'E1001: Variable not found: a', 1)
4879enddef
4880
4881" Test for using an non-existing type in a "for" statement.
4882def Test_invalid_type_in_for()
4883 var lines =<< trim END
4884 vim9script
4885 def Foo()
4886 for b: x in range(10)
4887 endfor
4888 enddef
4889 defcompile
4890 END
4891 v9.CheckSourceFailure(lines, 'E1010: Type not recognized: x in range(10)', 1)
4892enddef
4893
4894" Test for using a line break between the variable name and the type in a for
4895" statement.
4896def Test_for_stmt_space_before_type()
4897 var lines =<< trim END
4898 vim9script
4899 def Foo()
4900 for a
4901 :number in range(10)
4902 endfor
4903 enddef
4904 defcompile
4905 END
4906 v9.CheckSourceFailure(lines, 'E1059: No white space allowed before colon: :number in range(10)', 2)
4907enddef
4908
zeertzjqc029c132024-03-28 11:37:26 +01004909" This test used to cause a use-after-free memory access
Yegappan Lakshmanan28d71b52024-01-12 17:21:55 +01004910def Test_for_empty_line_after_lambda()
4911 var lines =<< trim END
4912 vim9script
4913 echomsg range(0, 2)->map((_, v) => {
4914 return 1
4915 })
4916
4917 assert_equal('[1, 1, 1]', v:statusmsg)
4918 END
4919 v9.CheckSourceSuccess(lines)
4920
4921 lines =<< trim END
4922 vim9script
4923 echomsg range(0, 1)->map((_, v) => {
4924 return 1
4925 }) range(0, 1)->map((_, v) => {
4926 return 2
4927 }) # comment
4928
4929 assert_equal('[1, 1] [2, 2]', v:statusmsg)
4930 END
4931 v9.CheckSourceSuccess(lines)
4932enddef
4933
Bram Moolenaar585fea72020-04-02 22:33:21 +02004934" Keep this last, it messes up highlighting.
4935def Test_substitute_cmd()
4936 new
4937 setline(1, 'something')
4938 :substitute(some(other(
4939 assert_equal('otherthing', getline(1))
4940 bwipe!
4941
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02004942 # also when the context is Vim9 script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004943 var lines =<< trim END
Bram Moolenaar585fea72020-04-02 22:33:21 +02004944 vim9script
4945 new
4946 setline(1, 'something')
4947 :substitute(some(other(
4948 assert_equal('otherthing', getline(1))
4949 bwipe!
4950 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004951 writefile(lines, 'Xvim9lines', 'D')
Bram Moolenaar585fea72020-04-02 22:33:21 +02004952 source Xvim9lines
Bram Moolenaar585fea72020-04-02 22:33:21 +02004953enddef
4954
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01004955" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker