blob: f07c4c99a482459e452dda59d210aa6de9caf0f8 [file] [log] [blame]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001" Test various aspects of the Vim9 script language.
2
Bram Moolenaar673660a2020-01-26 16:50:05 +01003source check.vim
Bram Moolenaar101f4812020-06-16 23:18:51 +02004source term_util.vim
Bram Moolenaar62aec932022-01-29 21:45:34 +00005import './vim9.vim' as v9
Bram Moolenaar37294bd2021-03-10 13:40:08 +01006source screendump.vim
Bram Moolenaard8448622022-01-07 21:39:52 +00007source shared.vim
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01008
Bram Moolenaarb79ee0c2022-01-01 12:17:00 +00009def Test_vim9script_feature()
10 # example from the help, here the feature is always present
11 var lines =<< trim END
12 " old style comment
13 if !has('vim9script')
14 " legacy commands would go here
15 finish
16 endif
17 vim9script
18 # Vim9 script commands go here
19 g:didit = true
20 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000021 v9.CheckScriptSuccess(lines)
Bram Moolenaarb79ee0c2022-01-01 12:17:00 +000022 assert_equal(true, g:didit)
23 unlet g:didit
24enddef
25
Bram Moolenaar5d72ce62020-08-20 23:04:06 +020026def Test_range_only()
27 new
28 setline(1, ['blah', 'Blah'])
29 :/Blah/
30 assert_equal(2, getcurpos()[1])
Bram Moolenaarc2af0af2020-08-23 21:06:02 +020031 bwipe!
32
33 # without range commands use current line
34 new
35 setline(1, ['one', 'two', 'three'])
36 :2
37 print
Bram Moolenaar62aec932022-01-29 21:45:34 +000038 assert_equal('two', g:Screenline(&lines))
Bram Moolenaarc2af0af2020-08-23 21:06:02 +020039 :3
40 list
Bram Moolenaar62aec932022-01-29 21:45:34 +000041 assert_equal('three$', g:Screenline(&lines))
Bram Moolenaarb8554302021-02-15 21:30:30 +010042
43 # missing command does not print the line
44 var lines =<< trim END
45 vim9script
46 :1|
Bram Moolenaar62aec932022-01-29 21:45:34 +000047 assert_equal('three$', g:Screenline(&lines))
Bram Moolenaarb8554302021-02-15 21:30:30 +010048 :|
Bram Moolenaar62aec932022-01-29 21:45:34 +000049 assert_equal('three$', g:Screenline(&lines))
Bram Moolenaarb8554302021-02-15 21:30:30 +010050 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000051 v9.CheckScriptSuccess(lines)
Bram Moolenaarb8554302021-02-15 21:30:30 +010052
Bram Moolenaarc2af0af2020-08-23 21:06:02 +020053 bwipe!
Bram Moolenaar025cb1c2020-12-14 18:31:27 +010054
Bram Moolenaar0c7f2612022-02-17 19:44:07 +000055 lines =<< trim END
56 set cpo+=-
57 :1,999
58 END
59 v9.CheckDefExecAndScriptFailure(lines, 'E16:', 2)
60 set cpo&vim
61
62 v9.CheckDefExecAndScriptFailure([":'x"], 'E20:', 1)
63
Bram Moolenaar025cb1c2020-12-14 18:31:27 +010064 # won't generate anything
65 if false
66 :123
67 endif
Bram Moolenaar5d72ce62020-08-20 23:04:06 +020068enddef
69
Bram Moolenaar09d94212022-05-05 15:20:03 +010070def Test_invalid_range()
71 var lines =<< trim END
72 :123 eval 1 + 2
73 END
74 v9.CheckDefAndScriptFailure(lines, 'E481:', 1)
75
76 lines =<< trim END
77 :123 if true
78 endif
79 END
80 v9.CheckDefAndScriptFailure(lines, 'E481:', 1)
81
82 lines =<< trim END
83 :123 echo 'yes'
84 END
85 v9.CheckDefAndScriptFailure(lines, 'E481:', 1)
86
87 lines =<< trim END
88 :123 cd there
89 END
90 v9.CheckDefAndScriptFailure(lines, 'E481:', 1)
91enddef
92
Bram Moolenaara6e67e42020-05-15 23:36:40 +020093let g:alist = [7]
94let g:astring = 'text'
Bram Moolenaarf0b9f432020-07-17 23:03:17 +020095let g:anumber = 123
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010096
Bram Moolenaar4c17ad92020-04-27 22:47:51 +020097def Test_delfunction()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +020098 # Check function is defined in script namespace
Bram Moolenaar62aec932022-01-29 21:45:34 +000099 v9.CheckScriptSuccess([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200100 'vim9script',
101 'func CheckMe()',
102 ' return 123',
103 'endfunc',
Bram Moolenaara749a422022-02-12 19:52:25 +0000104 'func DoTest()',
105 ' call assert_equal(123, s:CheckMe())',
106 'endfunc',
107 'DoTest()',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200108 ])
109
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200110 # Check function in script namespace cannot be deleted
Bram Moolenaar62aec932022-01-29 21:45:34 +0000111 v9.CheckScriptFailure([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200112 'vim9script',
113 'func DeleteMe1()',
114 'endfunc',
115 'delfunction DeleteMe1',
116 ], 'E1084:')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000117 v9.CheckScriptFailure([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200118 'vim9script',
119 'func DeleteMe2()',
120 'endfunc',
121 'def DoThat()',
122 ' delfunction DeleteMe2',
123 'enddef',
124 'DoThat()',
125 ], 'E1084:')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000126 v9.CheckScriptFailure([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200127 'vim9script',
128 'def DeleteMe3()',
129 'enddef',
130 'delfunction DeleteMe3',
131 ], 'E1084:')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000132 v9.CheckScriptFailure([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200133 'vim9script',
134 'def DeleteMe4()',
135 'enddef',
136 'def DoThat()',
137 ' delfunction DeleteMe4',
138 'enddef',
139 'DoThat()',
140 ], 'E1084:')
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200141
142 # Check that global :def function can be replaced and deleted
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200143 var lines =<< trim END
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200144 vim9script
145 def g:Global(): string
146 return "yes"
147 enddef
148 assert_equal("yes", g:Global())
149 def! g:Global(): string
150 return "no"
151 enddef
152 assert_equal("no", g:Global())
153 delfunc g:Global
154 assert_false(exists('*g:Global'))
155 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000156 v9.CheckScriptSuccess(lines)
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200157
158 # Check that global function can be replaced by a :def function and deleted
159 lines =<< trim END
160 vim9script
161 func g:Global()
162 return "yes"
163 endfunc
164 assert_equal("yes", g:Global())
165 def! g:Global(): string
166 return "no"
167 enddef
168 assert_equal("no", g:Global())
169 delfunc g:Global
170 assert_false(exists('*g:Global'))
171 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000172 v9.CheckScriptSuccess(lines)
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200173
174 # Check that global :def function can be replaced by a function and deleted
175 lines =<< trim END
176 vim9script
177 def g:Global(): string
178 return "yes"
179 enddef
180 assert_equal("yes", g:Global())
181 func! g:Global()
182 return "no"
183 endfunc
184 assert_equal("no", g:Global())
185 delfunc g:Global
186 assert_false(exists('*g:Global'))
187 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000188 v9.CheckScriptSuccess(lines)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200189enddef
190
Bram Moolenaar08052222020-09-14 17:04:31 +0200191def Test_wrong_type()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000192 v9.CheckDefFailure(['var name: list<nothing>'], 'E1010:')
193 v9.CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
194 v9.CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
195 v9.CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100196
Bram Moolenaar62aec932022-01-29 21:45:34 +0000197 v9.CheckDefFailure(['var name: dict<number'], 'E1009:')
198 v9.CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100199
Bram Moolenaar62aec932022-01-29 21:45:34 +0000200 v9.CheckDefFailure(['var name: ally'], 'E1010:')
201 v9.CheckDefFailure(['var name: bram'], 'E1010:')
202 v9.CheckDefFailure(['var name: cathy'], 'E1010:')
203 v9.CheckDefFailure(['var name: dom'], 'E1010:')
204 v9.CheckDefFailure(['var name: freddy'], 'E1010:')
205 v9.CheckDefFailure(['var name: john'], 'E1010:')
206 v9.CheckDefFailure(['var name: larry'], 'E1010:')
207 v9.CheckDefFailure(['var name: ned'], 'E1010:')
208 v9.CheckDefFailure(['var name: pam'], 'E1010:')
209 v9.CheckDefFailure(['var name: sam'], 'E1010:')
210 v9.CheckDefFailure(['var name: vim'], 'E1010:')
Bram Moolenaara0a9f432020-04-28 21:29:34 +0200211
Bram Moolenaar62aec932022-01-29 21:45:34 +0000212 v9.CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
213 v9.CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
Bram Moolenaar08052222020-09-14 17:04:31 +0200214enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100215
Bram Moolenaara749a422022-02-12 19:52:25 +0000216def Test_script_namespace()
217 # defining a function or variable with s: is not allowed
218 var lines =<< trim END
219 vim9script
220 def s:Function()
221 enddef
222 END
223 v9.CheckScriptFailure(lines, 'E1268:')
224
225 for decl in ['var', 'const', 'final']
226 lines =<< trim END
227 vim9script
228 var s:var = 'var'
229 END
230 v9.CheckScriptFailure([
231 'vim9script',
232 decl .. ' s:var = "var"',
233 ], 'E1268:')
234 endfor
235
236 # Calling a function or using a variable with s: is not allowed at script
237 # level
238 lines =<< trim END
239 vim9script
240 def Function()
241 enddef
242 s:Function()
243 END
244 v9.CheckScriptFailure(lines, 'E1268:')
245 lines =<< trim END
246 vim9script
247 def Function()
248 enddef
249 call s:Function()
250 END
251 v9.CheckScriptFailure(lines, 'E1268:')
252 lines =<< trim END
253 vim9script
254 var var = 'var'
255 echo s:var
256 END
257 v9.CheckScriptFailure(lines, 'E1268:')
258enddef
259
Bram Moolenaar10c65862020-10-08 21:16:42 +0200260def Test_script_wrong_type()
261 var lines =<< trim END
262 vim9script
Bram Moolenaara749a422022-02-12 19:52:25 +0000263 var dict: dict<string>
264 dict['a'] = ['x']
Bram Moolenaar10c65862020-10-08 21:16:42 +0200265 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000266 v9.CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3)
Bram Moolenaar10c65862020-10-08 21:16:42 +0200267enddef
268
Bram Moolenaar08052222020-09-14 17:04:31 +0200269def Test_const()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000270 v9.CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
271 v9.CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
272 v9.CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
273 v9.CheckDefFailure(['final two'], 'E1125:')
274 v9.CheckDefFailure(['final &option'], 'E996:')
Bram Moolenaardbeecb22020-09-14 18:15:09 +0200275
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200276 var lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200277 final list = [1, 2, 3]
Bram Moolenaardbeecb22020-09-14 18:15:09 +0200278 list[0] = 4
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200279 list->assert_equal([4, 2, 3])
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200280 const other = [5, 6, 7]
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200281 other->assert_equal([5, 6, 7])
Bram Moolenaar71abe482020-09-14 22:28:30 +0200282
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200283 var varlist = [7, 8]
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200284 const constlist = [1, varlist, 3]
Bram Moolenaar71abe482020-09-14 22:28:30 +0200285 varlist[0] = 77
Bram Moolenaar23e2e112021-08-03 21:16:18 +0200286 constlist[1][1] = 88
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200287 var cl = constlist[1]
Bram Moolenaar71abe482020-09-14 22:28:30 +0200288 cl[1] = 88
289 constlist->assert_equal([1, [77, 88], 3])
290
Bram Moolenaare0de1712020-12-02 17:36:54 +0100291 var vardict = {five: 5, six: 6}
292 const constdict = {one: 1, two: vardict, three: 3}
Bram Moolenaar71abe482020-09-14 22:28:30 +0200293 vardict['five'] = 55
Bram Moolenaar23e2e112021-08-03 21:16:18 +0200294 constdict['two']['six'] = 66
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200295 var cd = constdict['two']
Bram Moolenaar71abe482020-09-14 22:28:30 +0200296 cd['six'] = 66
Bram Moolenaare0de1712020-12-02 17:36:54 +0100297 constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3})
Bram Moolenaardbeecb22020-09-14 18:15:09 +0200298 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000299 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar0089ce22022-10-08 14:39:36 +0100300
301 # "any" type with const flag is recognized as "any"
302 lines =<< trim END
303 const dict: dict<any> = {foo: {bar: 42}}
304 const foo = dict.foo
305 assert_equal(v:t_number, type(foo.bar))
306 END
307 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar330d64d2022-10-09 12:55:33 +0100308
309 # also when used as a builtin function argument
310 lines =<< trim END
311 vim9script
312
313 def SorterFunc(lhs: dict<string>, rhs: dict<string>): number
314 return lhs.name <# rhs.name ? -1 : 1
315 enddef
316
317 def Run(): void
318 var list = [{name: "3"}, {name: "2"}]
319 const Sorter = get({}, "unknown", SorterFunc)
320 sort(list, Sorter)
321 assert_equal([{name: "2"}, {name: "3"}], list)
322 enddef
323
324 Run()
325 END
326 v9.CheckScriptSuccess(lines)
Bram Moolenaar08052222020-09-14 17:04:31 +0200327enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100328
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200329def Test_const_bang()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200330 var lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200331 const var = 234
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200332 var = 99
333 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000334 v9.CheckDefExecFailure(lines, 'E1018:', 2)
335 v9.CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200336
337 lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200338 const ll = [2, 3, 4]
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200339 ll[0] = 99
340 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000341 v9.CheckDefExecFailure(lines, 'E1119:', 2)
342 v9.CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200343
344 lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200345 const ll = [2, 3, 4]
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200346 ll[3] = 99
347 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000348 v9.CheckDefExecFailure(lines, 'E1118:', 2)
349 v9.CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200350
351 lines =<< trim END
Bram Moolenaare0de1712020-12-02 17:36:54 +0100352 const dd = {one: 1, two: 2}
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200353 dd["one"] = 99
354 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000355 v9.CheckDefExecFailure(lines, 'E1121:', 2)
356 v9.CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200357
358 lines =<< trim END
Bram Moolenaare0de1712020-12-02 17:36:54 +0100359 const dd = {one: 1, two: 2}
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200360 dd["three"] = 99
361 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000362 v9.CheckDefExecFailure(lines, 'E1120:')
363 v9.CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200364enddef
365
Bram Moolenaardf069ee2020-06-22 23:02:51 +0200366def Test_range_no_colon()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000367 v9.CheckDefFailure(['%s/a/b/'], 'E1050:')
368 v9.CheckDefFailure(['+ s/a/b/'], 'E1050:')
369 v9.CheckDefFailure(['- s/a/b/'], 'E1050:')
370 v9.CheckDefFailure(['. s/a/b/'], 'E1050:')
Bram Moolenaardf069ee2020-06-22 23:02:51 +0200371enddef
372
373
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100374def Test_block()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200375 var outer = 1
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100376 {
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200377 var inner = 2
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100378 assert_equal(1, outer)
379 assert_equal(2, inner)
380 }
381 assert_equal(1, outer)
Bram Moolenaar3f1e9f02021-02-27 22:36:43 +0100382
383 {|echo 'yes'|}
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100384enddef
385
Bram Moolenaar08052222020-09-14 17:04:31 +0200386def Test_block_failure()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000387 v9.CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
388 v9.CheckDefFailure(['}'], 'E1025:')
389 v9.CheckDefFailure(['{', 'echo 1'], 'E1026:')
Bram Moolenaar08052222020-09-14 17:04:31 +0200390enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100391
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200392def Test_block_local_vars()
393 var lines =<< trim END
394 vim9script
Bram Moolenaared234f22020-10-15 20:42:20 +0200395 v:testing = 1
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200396 if true
Bram Moolenaared234f22020-10-15 20:42:20 +0200397 var text = ['hello']
398 def SayHello(): list<string>
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200399 return text
400 enddef
401 def SetText(v: string)
Bram Moolenaared234f22020-10-15 20:42:20 +0200402 text = [v]
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200403 enddef
404 endif
405
406 if true
Bram Moolenaared234f22020-10-15 20:42:20 +0200407 var text = ['again']
408 def SayAgain(): list<string>
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200409 return text
410 enddef
411 endif
Bram Moolenaared234f22020-10-15 20:42:20 +0200412
413 # test that the "text" variables are not cleaned up
414 test_garbagecollect_now()
415
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200416 defcompile
417
Bram Moolenaared234f22020-10-15 20:42:20 +0200418 assert_equal(['hello'], SayHello())
419 assert_equal(['again'], SayAgain())
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200420
421 SetText('foobar')
Bram Moolenaared234f22020-10-15 20:42:20 +0200422 assert_equal(['foobar'], SayHello())
423
424 call writefile(['ok'], 'Xdidit')
425 qall!
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200426 END
Bram Moolenaared234f22020-10-15 20:42:20 +0200427
428 # need to execute this with a separate Vim instance to avoid the current
429 # context gets garbage collected.
Bram Moolenaardd674772022-09-15 22:26:18 +0100430 writefile(lines, 'Xscript', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000431 g:RunVim([], [], '-S Xscript')
Bram Moolenaared234f22020-10-15 20:42:20 +0200432 assert_equal(['ok'], readfile('Xdidit'))
433
Bram Moolenaared234f22020-10-15 20:42:20 +0200434 delete('Xdidit')
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200435enddef
436
Bram Moolenaar39ca4122020-10-20 14:25:07 +0200437def Test_block_local_vars_with_func()
438 var lines =<< trim END
439 vim9script
440 if true
441 var foo = 'foo'
442 if true
443 var bar = 'bar'
444 def Func(): list<string>
445 return [foo, bar]
446 enddef
447 endif
448 endif
449 # function is compiled here, after blocks have finished, can still access
450 # "foo" and "bar"
451 assert_equal(['foo', 'bar'], Func())
452 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000453 v9.CheckScriptSuccess(lines)
Bram Moolenaar39ca4122020-10-20 14:25:07 +0200454enddef
455
Bram Moolenaare4db17f2021-08-01 21:19:43 +0200456" legacy func for command that's defined later
Bram Moolenaar62aec932022-01-29 21:45:34 +0000457func s:InvokeSomeCommand()
Bram Moolenaare4db17f2021-08-01 21:19:43 +0200458 SomeCommand
459endfunc
460
Yegappan Lakshmanane74cad32024-04-12 18:48:35 +0200461def Test_command_block()
Bram Moolenaare4db17f2021-08-01 21:19:43 +0200462 com SomeCommand {
463 g:someVar = 'some'
464 }
465 InvokeSomeCommand()
466 assert_equal('some', g:someVar)
467
468 delcommand SomeCommand
469 unlet g:someVar
470enddef
471
Yegappan Lakshmanane74cad32024-04-12 18:48:35 +0200472" Test for using heredoc in a :command command block
473def Test_command_block_heredoc()
474 var lines =<< trim CODE
475 vim9script
476 com SomeCommand {
477 g:someVar =<< trim END
478 aaa
479 bbb
480 END
481 }
482 SomeCommand
483 assert_equal(['aaa', 'bbb'], g:someVar)
484 def Foo()
485 g:someVar = []
486 SomeCommand
487 assert_equal(['aaa', 'bbb'], g:someVar)
488 enddef
489 Foo()
490 delcommand SomeCommand
491 unlet g:someVar
492 CODE
493 v9.CheckSourceSuccess( lines)
494
495 # Execute a command with heredoc in a block
496 lines =<< trim CODE
497 vim9script
498 com SomeCommand {
499 g:someVar =<< trim END
500 aaa
501 bbb
502 END
503 }
504 execute('SomeCommand')
505 assert_equal(['aaa', 'bbb'], g:someVar)
506 delcommand SomeCommand
507 unlet g:someVar
508 CODE
509 v9.CheckSourceSuccess(lines)
510
zeertzjq1f5175d2024-04-13 17:52:26 +0200511 # Heredoc with comment
512 lines =<< trim CODE
513 vim9script
514 com SomeCommand {
515 g:someVar =<< trim END # comment
516 aaa
517 bbb
518 END
519 }
520 execute('SomeCommand')
521 assert_equal(['aaa', 'bbb'], g:someVar)
522 delcommand SomeCommand
523 unlet g:someVar
524 CODE
525 v9.CheckSourceSuccess(lines)
526
Yegappan Lakshmanane74cad32024-04-12 18:48:35 +0200527 # heredoc evaluation
528 lines =<< trim CODE
529 vim9script
530 com SomeCommand {
531 var suffix = '---'
532 g:someVar =<< trim eval END
533 ccc{suffix}
534 ddd
535 END
536 }
537 SomeCommand
538 assert_equal(['ccc---', 'ddd'], g:someVar)
539 def Foo()
540 g:someVar = []
541 SomeCommand
542 assert_equal(['ccc---', 'ddd'], g:someVar)
543 enddef
544 Foo()
545 delcommand SomeCommand
546 unlet g:someVar
547 CODE
548 v9.CheckSourceSuccess(lines)
549
550 # command following heredoc
551 lines =<< trim CODE
552 vim9script
553 com SomeCommand {
554 var l =<< trim END
555 eee
556 fff
557 END
558 g:someVar = l
559 }
560 SomeCommand
561 assert_equal(['eee', 'fff'], g:someVar)
562 delcommand SomeCommand
563 unlet g:someVar
564 CODE
565 v9.CheckSourceSuccess(lines)
566
567 # Error in heredoc
568 lines =<< trim CODE
569 vim9script
570 com SomeCommand {
571 g:someVar =<< trim END
572 eee
573 fff
574 }
575 try
576 SomeCommand
577 catch
578 assert_match("E990: Missing end marker 'END'", v:exception)
579 endtry
580 delcommand SomeCommand
581 unlet g:someVar
582 CODE
583 v9.CheckSourceSuccess(lines)
584enddef
585
586def Test_autocommand_block()
Bram Moolenaare4db17f2021-08-01 21:19:43 +0200587 au BufNew *.xml {
588 g:otherVar = 'other'
589 }
590 split other.xml
591 assert_equal('other', g:otherVar)
592
593 bwipe!
594 au! BufNew *.xml
595 unlet g:otherVar
596enddef
597
Bram Moolenaard032f342020-07-18 18:13:02 +0200598func g:NoSuchFunc()
599 echo 'none'
600endfunc
601
Bram Moolenaar9e1d9e32021-01-11 20:17:34 +0100602def Test_try_catch_throw()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200603 var l = []
Bram Moolenaar7a092242020-04-16 22:10:49 +0200604 try # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100605 add(l, '1')
606 throw 'wrong'
Bram Moolenaar9d383f32023-05-14 21:38:12 +0100607 add(l, '2') # "unreachable code"
Bram Moolenaar7a092242020-04-16 22:10:49 +0200608 catch # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100609 add(l, v:exception)
Bram Moolenaar7a092242020-04-16 22:10:49 +0200610 finally # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100611 add(l, '3')
Bram Moolenaar7a092242020-04-16 22:10:49 +0200612 endtry # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100613 assert_equal(['1', 'wrong', '3'], l)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200614
Bram Moolenaare8593122020-07-18 15:17:02 +0200615 l = []
616 try
617 try
618 add(l, '1')
619 throw 'wrong'
Bram Moolenaar9d383f32023-05-14 21:38:12 +0100620 add(l, '2') # "unreachable code"
Bram Moolenaare8593122020-07-18 15:17:02 +0200621 catch /right/
622 add(l, v:exception)
623 endtry
624 catch /wrong/
625 add(l, 'caught')
Bram Moolenaar204852a2022-03-05 12:56:44 +0000626 finally
Bram Moolenaare8593122020-07-18 15:17:02 +0200627 add(l, 'finally')
628 endtry
629 assert_equal(['1', 'caught', 'finally'], l)
630
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200631 var n: number
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200632 try
633 n = l[3]
634 catch /E684:/
635 n = 99
636 endtry
637 assert_equal(99, n)
638
Bram Moolenaar69f70502021-01-01 16:10:46 +0100639 var done = 'no'
640 if 0
641 try | catch | endtry
642 else
643 done = 'yes'
644 endif
645 assert_equal('yes', done)
646
647 done = 'no'
648 if 1
649 done = 'yes'
650 else
651 try | catch | endtry
652 done = 'never'
653 endif
654 assert_equal('yes', done)
655
656 if 1
657 else
658 try | catch /pat/ | endtry
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000659 try | catch /pat/
Bram Moolenaar69f70502021-01-01 16:10:46 +0100660 endtry
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000661 try
Bram Moolenaar69f70502021-01-01 16:10:46 +0100662 catch /pat/ | endtry
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000663 try
664 catch /pat/
Bram Moolenaar69f70502021-01-01 16:10:46 +0100665 endtry
666 endif
667
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200668 try
Bram Moolenaarcc673e72020-08-16 17:33:35 +0200669 # string slice returns a string, not a number
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200670 n = g:astring[3]
Bram Moolenaar5e654232020-09-16 15:22:00 +0200671 catch /E1012:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200672 n = 77
673 endtry
674 assert_equal(77, n)
675
676 try
677 n = l[g:astring]
Bram Moolenaar5e654232020-09-16 15:22:00 +0200678 catch /E1012:/
Bram Moolenaar56acb092020-08-16 14:48:19 +0200679 n = 88
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200680 endtry
Bram Moolenaar56acb092020-08-16 14:48:19 +0200681 assert_equal(88, n)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200682
683 try
684 n = s:does_not_exist
685 catch /E121:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200686 n = 111
687 endtry
688 assert_equal(111, n)
689
690 try
691 n = g:does_not_exist
692 catch /E121:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200693 n = 121
694 endtry
695 assert_equal(121, n)
696
Bram Moolenaare0de1712020-12-02 17:36:54 +0100697 var d = {one: 1}
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200698 try
699 n = d[g:astring]
700 catch /E716:/
701 n = 222
702 endtry
703 assert_equal(222, n)
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200704
705 try
706 n = -g:astring
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200707 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200708 n = 233
709 endtry
710 assert_equal(233, n)
711
712 try
713 n = +g:astring
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200714 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200715 n = 244
716 endtry
717 assert_equal(244, n)
718
719 try
720 n = +g:alist
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200721 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200722 n = 255
723 endtry
724 assert_equal(255, n)
725
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200726 var nd: dict<any>
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200727 try
Bram Moolenaar2e5910b2021-02-03 17:41:24 +0100728 nd = {[g:alist]: 1}
729 catch /E1105:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200730 n = 266
731 endtry
732 assert_equal(266, n)
733
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000734 l = [1, 2, 3]
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200735 try
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +0000736 [n] = l
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200737 catch /E1093:/
738 n = 277
739 endtry
740 assert_equal(277, n)
741
Bram Moolenaare8593122020-07-18 15:17:02 +0200742 try
743 &ts = g:astring
Bram Moolenaar5e654232020-09-16 15:22:00 +0200744 catch /E1012:/
Bram Moolenaare8593122020-07-18 15:17:02 +0200745 n = 288
746 endtry
747 assert_equal(288, n)
748
749 try
750 &backspace = 'asdf'
751 catch /E474:/
752 n = 299
753 endtry
754 assert_equal(299, n)
755
756 l = [1]
757 try
758 l[3] = 3
759 catch /E684:/
760 n = 300
761 endtry
762 assert_equal(300, n)
763
764 try
Bram Moolenaare8593122020-07-18 15:17:02 +0200765 unlet g:does_not_exist
766 catch /E108:/
767 n = 322
768 endtry
769 assert_equal(322, n)
770
771 try
Bram Moolenaar2bede172020-11-19 18:53:18 +0100772 d = {text: 1, [g:astring]: 2}
Bram Moolenaare8593122020-07-18 15:17:02 +0200773 catch /E721:/
774 n = 333
775 endtry
776 assert_equal(333, n)
777
778 try
Bram Moolenaar62aec932022-01-29 21:45:34 +0000779 l = g:DeletedFunc()
Bram Moolenaare8593122020-07-18 15:17:02 +0200780 catch /E933:/
781 n = 344
782 endtry
783 assert_equal(344, n)
Bram Moolenaard032f342020-07-18 18:13:02 +0200784
785 try
Yegappan Lakshmanana764e732021-07-25 15:57:32 +0200786 echo range(1, 2, 0)
787 catch /E726:/
Bram Moolenaard032f342020-07-18 18:13:02 +0200788 n = 355
789 endtry
790 assert_equal(355, n)
791
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200792 var P = function('g:NoSuchFunc')
Bram Moolenaard032f342020-07-18 18:13:02 +0200793 delfunc g:NoSuchFunc
794 try
795 echo P()
796 catch /E117:/
797 n = 366
798 endtry
799 assert_equal(366, n)
800
801 try
802 echo g:NoSuchFunc()
803 catch /E117:/
804 n = 377
805 endtry
806 assert_equal(377, n)
807
808 try
809 echo g:alist + 4
810 catch /E745:/
811 n = 388
812 endtry
813 assert_equal(388, n)
814
815 try
816 echo 4 + g:alist
817 catch /E745:/
818 n = 399
819 endtry
820 assert_equal(399, n)
821
822 try
823 echo g:alist.member
824 catch /E715:/
825 n = 400
826 endtry
827 assert_equal(400, n)
828
829 try
830 echo d.member
831 catch /E716:/
832 n = 411
833 endtry
834 assert_equal(411, n)
Bram Moolenaard9d77892021-02-12 21:32:47 +0100835
836 var counter = 0
837 for i in range(4)
838 try
839 eval [][0]
840 catch
841 endtry
842 counter += 1
843 endfor
844 assert_equal(4, counter)
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100845
Bram Moolenaar9fa5dab2021-07-20 19:18:44 +0200846 # no requirement for spaces before |
847 try|echo 0|catch|endtry
848
Bram Moolenaar003312b2021-12-20 10:55:35 +0000849 # return in try with finally
850 def ReturnInTry(): number
851 var ret = 4
852 try
853 return ret
854 catch /this/
855 return -1
856 catch /that/
857 return -1
858 finally
859 # changing ret has no effect
860 ret = 7
861 endtry
862 return -2
863 enddef
864 assert_equal(4, ReturnInTry())
865
866 # return in catch with finally
867 def ReturnInCatch(): number
868 var ret = 5
869 try
870 throw 'getout'
Bram Moolenaar9d383f32023-05-14 21:38:12 +0100871 return -1 # "unreachable code"
Bram Moolenaar003312b2021-12-20 10:55:35 +0000872 catch /getout/
873 # ret is evaluated here
874 return ret
875 finally
876 # changing ret later has no effect
877 ret = -3
878 endtry
879 return -2
880 enddef
881 assert_equal(5, ReturnInCatch())
882
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100883 # return in finally after empty catch
884 def ReturnInFinally(): number
885 try
886 finally
Bram Moolenaar003312b2021-12-20 10:55:35 +0000887 return 6
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100888 endtry
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100889 enddef
Bram Moolenaar003312b2021-12-20 10:55:35 +0000890 assert_equal(6, ReturnInFinally())
Bram Moolenaar8ac681a2021-06-15 20:06:34 +0200891
892 var lines =<< trim END
893 vim9script
894 try
895 acos('0.5')
896 ->setline(1)
897 catch
898 g:caught = v:exception
899 endtry
900 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000901 v9.CheckScriptSuccess(lines)
Yegappan Lakshmanan4490ec42021-07-27 22:00:44 +0200902 assert_match('E1219: Float or Number required for argument 1', g:caught)
Bram Moolenaar8ac681a2021-06-15 20:06:34 +0200903 unlet g:caught
Bram Moolenaar41978282021-07-04 14:47:30 +0200904
905 # missing catch and/or finally
906 lines =<< trim END
907 vim9script
908 try
909 echo 'something'
910 endtry
911 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000912 v9.CheckScriptFailure(lines, 'E1032:')
rbtnn84934992021-08-07 13:26:53 +0200913
914 # skipping try-finally-endtry when try-finally-endtry is used in another block
915 lines =<< trim END
916 if v:true
917 try
918 finally
919 endtry
920 else
921 try
922 finally
923 endtry
924 endif
925 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000926 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100927enddef
928
Bram Moolenaara2c00282023-05-14 22:05:15 +0100929def Test_unreachable_after()
930 var lines =<< trim END
931 try
932 throw 'Error'
933 echo 'not reached'
934 catch /Error/
935 endtry
936 END
937 v9.CheckDefFailure(lines, 'E1095: Unreachable code after :throw')
938
939 lines =<< trim END
940 def SomeFunc(): number
941 try
942 return 3
943 echo 'not reached'
944 catch /Error/
945 endtry
946 return 4
947 enddef
948 defcompile
949 END
950 v9.CheckScriptFailure(lines, 'E1095: Unreachable code after :return')
951enddef
952
Bram Moolenaar3ef2e412023-04-30 18:50:48 +0100953def Test_throw_in_nested_try()
954 var lines =<< trim END
955 vim9script
956
957 def Try(F: func(): void)
958 try
959 F()
960 catch
961 endtry
962 enddef
963
964 class X
965 def F()
966 try
967 throw 'Foobar'
968 catch
969 throw v:exception
970 endtry
971 enddef
972 endclass
973
974 def Test_TryMethod()
975 var x = X.new()
976 Try(() => x.F())
977 enddef
978
979
980 try
981 Test_TryMethod()
982 catch
983 endtry
984 END
985 v9.CheckScriptSuccess(lines)
986enddef
987
Bram Moolenaar28bf6492022-03-03 15:11:20 +0000988def Test_try_var_decl()
989 var lines =<< trim END
990 vim9script
991 try
992 var in_try = 1
993 assert_equal(1, get(s:, 'in_try', -1))
994 throw "getout"
995 catch
996 var in_catch = 2
997 assert_equal(-1, get(s:, 'in_try', -1))
998 assert_equal(2, get(s:, 'in_catch', -1))
999 finally
1000 var in_finally = 3
1001 assert_equal(-1, get(s:, 'in_try', -1))
1002 assert_equal(-1, get(s:, 'in_catch', -1))
1003 assert_equal(3, get(s:, 'in_finally', -1))
1004 endtry
1005 assert_equal(-1, get(s:, 'in_try', -1))
1006 assert_equal(-1, get(s:, 'in_catch', -1))
1007 assert_equal(-1, get(s:, 'in_finally', -1))
1008 END
1009 v9.CheckScriptSuccess(lines)
1010enddef
1011
Bram Moolenaar53c29612022-01-12 16:18:18 +00001012def Test_try_ends_in_return()
1013 var lines =<< trim END
1014 vim9script
1015 def Foo(): string
1016 try
1017 return 'foo'
1018 catch
1019 return 'caught'
1020 endtry
1021 enddef
1022 assert_equal('foo', Foo())
1023 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001024 v9.CheckScriptSuccess(lines)
Bram Moolenaar53c29612022-01-12 16:18:18 +00001025
1026 lines =<< trim END
1027 vim9script
1028 def Foo(): string
1029 try
1030 return 'foo'
1031 catch
1032 return 'caught'
1033 endtry
1034 echo 'notreached'
1035 enddef
1036 assert_equal('foo', Foo())
1037 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001038 v9.CheckScriptFailure(lines, 'E1095:')
Bram Moolenaar53c29612022-01-12 16:18:18 +00001039
1040 lines =<< trim END
1041 vim9script
1042 def Foo(): string
1043 try
1044 return 'foo'
1045 catch /x/
1046 return 'caught'
1047 endtry
1048 enddef
1049 assert_equal('foo', Foo())
1050 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001051 v9.CheckScriptFailure(lines, 'E1027:')
Bram Moolenaar53c29612022-01-12 16:18:18 +00001052
1053 lines =<< trim END
1054 vim9script
1055 def Foo(): string
1056 try
1057 echo 'foo'
1058 catch
1059 echo 'caught'
1060 finally
1061 return 'done'
1062 endtry
1063 enddef
1064 assert_equal('done', Foo())
1065 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001066 v9.CheckScriptSuccess(lines)
Bram Moolenaar53c29612022-01-12 16:18:18 +00001067
1068enddef
1069
Bram Moolenaar3f987b52021-06-30 12:02:24 +02001070def Test_try_in_catch()
1071 var lines =<< trim END
1072 vim9script
1073 var seq = []
1074 def DoIt()
1075 try
1076 seq->add('throw 1')
1077 eval [][0]
1078 seq->add('notreached')
1079 catch
1080 seq->add('catch')
1081 try
1082 seq->add('throw 2')
1083 eval [][0]
1084 seq->add('notreached')
1085 catch /nothing/
1086 seq->add('notreached')
1087 endtry
1088 seq->add('done')
1089 endtry
1090 enddef
1091 DoIt()
1092 assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq)
1093 END
1094enddef
1095
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001096def Test_error_in_catch()
1097 var lines =<< trim END
1098 try
1099 eval [][0]
1100 catch /E684:/
1101 eval [][0]
1102 endtry
1103 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001104 v9.CheckDefExecFailure(lines, 'E684:', 4)
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001105enddef
1106
Bram Moolenaar2e34c342021-03-14 12:13:33 +01001107" :while at the very start of a function that :continue jumps to
Bram Moolenaar62aec932022-01-29 21:45:34 +00001108def s:TryContinueFunc()
Bram Moolenaar2e34c342021-03-14 12:13:33 +01001109 while g:Count < 2
1110 g:sequence ..= 't'
1111 try
1112 echoerr 'Test'
1113 catch
1114 g:Count += 1
1115 g:sequence ..= 'c'
1116 continue
1117 endtry
1118 g:sequence ..= 'e'
1119 g:Count += 1
1120 endwhile
1121enddef
1122
1123def Test_continue_in_try_in_while()
1124 g:Count = 0
1125 g:sequence = ''
1126 TryContinueFunc()
1127 assert_equal('tctc', g:sequence)
1128 unlet g:Count
1129 unlet g:sequence
1130enddef
1131
Bram Moolenaar873f8242022-03-10 21:53:44 +00001132def Test_break_in_try_in_for()
1133 var lines =<< trim END
1134 vim9script
1135 def Ls(): list<string>
1136 var ls: list<string>
1137 for s in ['abc', 'def']
1138 for _ in [123, 456]
1139 try
1140 eval [][0]
1141 catch
1142 break
1143 endtry
1144 endfor
1145 ls += [s]
1146 endfor
1147 return ls
1148 enddef
1149 assert_equal(['abc', 'def'], Ls())
1150 END
1151 v9.CheckScriptSuccess(lines)
1152enddef
1153
Bram Moolenaar9cb577a2021-02-22 22:45:10 +01001154def Test_nocatch_return_in_try()
1155 # return in try block returns normally
1156 def ReturnInTry(): string
1157 try
1158 return '"some message"'
1159 catch
1160 endtry
1161 return 'not reached'
1162 enddef
1163 exe 'echoerr ' .. ReturnInTry()
1164enddef
1165
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001166def Test_cnext_works_in_catch()
1167 var lines =<< trim END
1168 vim9script
Bram Moolenaarc3235272021-07-10 19:42:03 +02001169 au BufEnter * eval 1 + 2
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001170 writefile(['text'], 'Xcncfile1')
1171 writefile(['text'], 'Xcncfile2')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001172 var items = [
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001173 {lnum: 1, filename: 'Xcncfile1', valid: true},
1174 {lnum: 1, filename: 'Xcncfile2', valid: true}
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001175 ]
1176 setqflist([], ' ', {items: items})
1177 cwindow
1178
1179 def CnextOrCfirst()
1180 # if cnext fails, cfirst is used
1181 try
1182 cnext
1183 catch
1184 cfirst
1185 endtry
1186 enddef
1187
1188 CnextOrCfirst()
1189 CnextOrCfirst()
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001190 writefile([getqflist({idx: 0}).idx], 'Xcncresult')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001191 qall
1192 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001193 writefile(lines, 'XCatchCnext', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001194 g:RunVim([], [], '--clean -S XCatchCnext')
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001195 assert_equal(['1'], readfile('Xcncresult'))
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001196
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001197 delete('Xcncfile1')
1198 delete('Xcncfile2')
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001199 delete('Xcncresult')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001200enddef
1201
Bram Moolenaar9e1d9e32021-01-11 20:17:34 +01001202def Test_throw_skipped()
1203 if 0
1204 throw dontgethere
1205 endif
1206enddef
1207
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001208def Test_nocatch_throw_silenced()
1209 var lines =<< trim END
1210 vim9script
1211 def Func()
1212 throw 'error'
1213 enddef
1214 silent! Func()
1215 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001216 writefile(lines, 'XthrowSilenced', 'D')
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001217 source XthrowSilenced
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001218enddef
1219
Bram Moolenaara2c00282023-05-14 22:05:15 +01001220" g:DeletedFunc() is found when compiling Test_try_catch_throw() and then
1221" deleted, this should give a runtime error.
Bram Moolenaare8593122020-07-18 15:17:02 +02001222def DeletedFunc(): list<any>
1223 return ['delete me']
1224enddef
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001225defcompile DeletedFunc
1226
1227call test_override('unreachable', 1)
1228defcompile Test_try_catch_throw
1229call test_override('unreachable', 0)
1230
Bram Moolenaare8593122020-07-18 15:17:02 +02001231delfunc DeletedFunc
1232
Bram Moolenaar62aec932022-01-29 21:45:34 +00001233def s:ThrowFromDef()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001234 throw "getout" # comment
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001235enddef
1236
Bram Moolenaar62aec932022-01-29 21:45:34 +00001237func s:CatchInFunc()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001238 try
Bram Moolenaar62aec932022-01-29 21:45:34 +00001239 call s:ThrowFromDef()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001240 catch
1241 let g:thrown_func = v:exception
1242 endtry
1243endfunc
1244
Bram Moolenaar62aec932022-01-29 21:45:34 +00001245def s:CatchInDef()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001246 try
1247 ThrowFromDef()
1248 catch
1249 g:thrown_def = v:exception
1250 endtry
1251enddef
1252
Bram Moolenaar62aec932022-01-29 21:45:34 +00001253def s:ReturnFinally(): string
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001254 try
1255 return 'intry'
Bram Moolenaar204852a2022-03-05 12:56:44 +00001256 finally
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001257 g:in_finally = 'finally'
1258 endtry
1259 return 'end'
1260enddef
1261
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001262def Test_try_catch_nested()
1263 CatchInFunc()
1264 assert_equal('getout', g:thrown_func)
1265
1266 CatchInDef()
1267 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001268
1269 assert_equal('intry', ReturnFinally())
1270 assert_equal('finally', g:in_finally)
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001271
1272 var l = []
1273 try
1274 l->add('1')
1275 throw 'bad'
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001276 l->add('x') # "unreachable code"
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001277 catch /bad/
1278 l->add('2')
1279 try
1280 l->add('3')
1281 throw 'one'
1282 l->add('x')
1283 catch /one/
1284 l->add('4')
1285 try
1286 l->add('5')
1287 throw 'more'
1288 l->add('x')
1289 catch /more/
1290 l->add('6')
1291 endtry
1292 endtry
1293 endtry
1294 assert_equal(['1', '2', '3', '4', '5', '6'], l)
Bram Moolenaar834193a2021-06-30 20:39:15 +02001295
1296 l = []
1297 try
1298 try
1299 l->add('1')
1300 throw 'foo'
1301 l->add('x')
1302 catch
1303 l->add('2')
1304 throw 'bar'
1305 l->add('x')
1306 finally
1307 l->add('3')
1308 endtry
1309 l->add('x')
1310 catch /bar/
1311 l->add('4')
1312 endtry
1313 assert_equal(['1', '2', '3', '4'], l)
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001314enddef
1315
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001316call test_override('unreachable', 1)
1317defcompile Test_try_catch_nested
1318call test_override('unreachable', 0)
1319
Bram Moolenaar62aec932022-01-29 21:45:34 +00001320def s:TryOne(): number
Bram Moolenaar9939f572020-09-16 22:29:52 +02001321 try
1322 return 0
1323 catch
1324 endtry
1325 return 0
1326enddef
1327
Bram Moolenaar62aec932022-01-29 21:45:34 +00001328def s:TryTwo(n: number): string
Bram Moolenaar9939f572020-09-16 22:29:52 +02001329 try
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001330 var x = {}
Bram Moolenaar9939f572020-09-16 22:29:52 +02001331 catch
1332 endtry
1333 return 'text'
1334enddef
1335
1336def Test_try_catch_twice()
1337 assert_equal('text', TryOne()->TryTwo())
1338enddef
1339
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001340def Test_try_catch_match()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001341 var seq = 'a'
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001342 try
1343 throw 'something'
1344 catch /nothing/
1345 seq ..= 'x'
1346 catch /some/
1347 seq ..= 'b'
1348 catch /asdf/
1349 seq ..= 'x'
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001350 catch ?a\?sdf?
1351 seq ..= 'y'
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001352 finally
1353 seq ..= 'c'
1354 endtry
1355 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001356enddef
1357
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001358def Test_try_catch_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001359 v9.CheckDefFailure(['catch'], 'E603:')
1360 v9.CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1361 v9.CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1362 v9.CheckDefFailure(['finally'], 'E606:')
1363 v9.CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1364 v9.CheckDefFailure(['endtry'], 'E602:')
1365 v9.CheckDefFailure(['while 1', 'endtry'], 'E170:')
1366 v9.CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1367 v9.CheckDefFailure(['if 1', 'endtry'], 'E171:')
1368 v9.CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001369
Bram Moolenaar62aec932022-01-29 21:45:34 +00001370 v9.CheckDefFailure(['throw'], 'E1143:')
1371 v9.CheckDefFailure(['throw xxx'], 'E1001:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001372enddef
1373
Bram Moolenaar7c5b3c0362021-02-14 22:40:57 +01001374def Try_catch_skipped()
1375 var l = []
1376 try
1377 finally
1378 endtry
1379
1380 if 1
1381 else
1382 try
1383 endtry
1384 endif
1385enddef
1386
1387" The skipped try/endtry was updating the wrong instruction.
1388def Test_try_catch_skipped()
1389 var instr = execute('disassemble Try_catch_skipped')
1390 assert_match("NEWLIST size 0\n", instr)
1391enddef
1392
Bram Moolenaar90a57162022-02-12 14:23:17 +00001393def Test_throw_line_number()
1394 def Func()
1395 eval 1 + 1
1396 eval 2 + 2
1397 throw 'exception'
1398 enddef
1399 try
1400 Func()
1401 catch /exception/
1402 assert_match('line 3', v:throwpoint)
1403 endtry
1404enddef
Bram Moolenaar7c5b3c0362021-02-14 22:40:57 +01001405
1406
Bram Moolenaar006ad482020-06-30 20:55:15 +02001407def Test_throw_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001408 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001409 var lines =<< trim END
Bram Moolenaar006ad482020-06-30 20:55:15 +02001410 vim9script
1411 try
1412 throw 'one'
1413 .. 'two'
1414 catch
1415 assert_equal('onetwo', v:exception)
1416 endtry
1417 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001418 v9.CheckScriptSuccess(lines)
Bram Moolenaar1e021e62020-10-16 20:25:23 +02001419
1420 lines =<< trim END
1421 vim9script
Bram Moolenaar352134b2020-10-17 22:04:08 +02001422 @r = ''
Bram Moolenaar1e021e62020-10-16 20:25:23 +02001423 def Func()
1424 throw @r
1425 enddef
1426 var result = ''
1427 try
1428 Func()
1429 catch /E1129:/
1430 result = 'caught'
1431 endtry
1432 assert_equal('caught', result)
1433 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001434 v9.CheckScriptSuccess(lines)
Bram Moolenaar006ad482020-06-30 20:55:15 +02001435enddef
1436
Bram Moolenaared677f52020-08-12 16:38:10 +02001437def Test_error_in_nested_function()
Bram Moolenaar03dfde22021-02-14 13:17:22 +01001438 # an error in a nested :function aborts executing in the calling :def function
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001439 var lines =<< trim END
Bram Moolenaared677f52020-08-12 16:38:10 +02001440 vim9script
1441 def Func()
1442 Error()
1443 g:test_var = 1
1444 enddef
1445 func Error() abort
1446 eval [][0]
1447 endfunc
1448 Func()
1449 END
1450 g:test_var = 0
Bram Moolenaar62aec932022-01-29 21:45:34 +00001451 v9.CheckScriptFailure(lines, 'E684:')
Bram Moolenaared677f52020-08-12 16:38:10 +02001452 assert_equal(0, g:test_var)
1453enddef
1454
Bram Moolenaar227c58a2021-04-28 20:40:44 +02001455def Test_abort_after_error()
1456 var lines =<< trim END
1457 vim9script
1458 while true
1459 echo notfound
1460 endwhile
1461 g:gotthere = true
1462 END
1463 g:gotthere = false
Bram Moolenaar62aec932022-01-29 21:45:34 +00001464 v9.CheckScriptFailure(lines, 'E121:')
Bram Moolenaar227c58a2021-04-28 20:40:44 +02001465 assert_false(g:gotthere)
1466 unlet g:gotthere
1467enddef
1468
Bram Moolenaar37c83712020-06-30 21:18:36 +02001469def Test_cexpr_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001470 # only checks line continuation
Bram Moolenaar37c83712020-06-30 21:18:36 +02001471 set errorformat=File\ %f\ line\ %l
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001472 var lines =<< trim END
Bram Moolenaar37c83712020-06-30 21:18:36 +02001473 vim9script
1474 cexpr 'File'
1475 .. ' someFile' ..
1476 ' line 19'
1477 assert_equal(19, getqflist()[0].lnum)
1478 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001479 v9.CheckScriptSuccess(lines)
Bram Moolenaar397a87a2022-03-20 21:14:15 +00001480
1481 lines =<< trim END
1482 vim9script
1483 def CexprFail()
1484 au QuickfixCmdPre * echo g:doesnotexist
1485 cexpr 'File otherFile line 99'
1486 g:didContinue = 'yes'
1487 enddef
1488 CexprFail()
1489 g:didContinue = 'also'
1490 END
1491 g:didContinue = 'no'
1492 v9.CheckScriptFailure(lines, 'E121: Undefined variable: g:doesnotexist')
1493 assert_equal('no', g:didContinue)
1494 au! QuickfixCmdPre
1495
1496 lines =<< trim END
1497 vim9script
1498 def CexprFail()
1499 cexpr g:aNumber
1500 g:didContinue = 'yes'
1501 enddef
1502 CexprFail()
1503 g:didContinue = 'also'
1504 END
1505 g:aNumber = 123
1506 g:didContinue = 'no'
1507 v9.CheckScriptFailure(lines, 'E777: String or List expected')
1508 assert_equal('no', g:didContinue)
1509 unlet g:didContinue
1510
Bram Moolenaar37c83712020-06-30 21:18:36 +02001511 set errorformat&
1512enddef
1513
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001514def Test_statusline_syntax()
1515 # legacy syntax is used for 'statusline'
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001516 var lines =<< trim END
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001517 vim9script
1518 func g:Status()
1519 return '%{"x" is# "x"}'
1520 endfunc
1521 set laststatus=2 statusline=%!Status()
1522 redrawstatus
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00001523 set laststatus statusline=
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001524 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001525 v9.CheckScriptSuccess(lines)
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001526enddef
1527
Bram Moolenaarb2097502020-07-19 17:17:02 +02001528def Test_list_vimscript()
1529 # checks line continuation and comments
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001530 var lines =<< trim END
Bram Moolenaarb2097502020-07-19 17:17:02 +02001531 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001532 var mylist = [
Bram Moolenaarb2097502020-07-19 17:17:02 +02001533 'one',
1534 # comment
1535 'two', # empty line follows
1536
1537 'three',
1538 ]
1539 assert_equal(['one', 'two', 'three'], mylist)
1540 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001541 v9.CheckScriptSuccess(lines)
Bram Moolenaar66250c92020-08-20 15:02:42 +02001542
1543 # check all lines from heredoc are kept
1544 lines =<< trim END
1545 # comment 1
1546 two
1547 # comment 3
1548
1549 five
1550 # comment 6
1551 END
1552 assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
Bram Moolenaar4bce26b2021-01-22 22:06:56 +01001553
1554 lines =<< trim END
1555 [{
1556 a: 0}]->string()->assert_equal("[{'a': 0}]")
1557 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001558 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarb2097502020-07-19 17:17:02 +02001559enddef
1560
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001561if has('channel')
1562 let someJob = test_null_job()
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001563
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001564 def FuncWithError()
1565 echomsg g:someJob
1566 enddef
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001567
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001568 func Test_convert_emsg_to_exception()
1569 try
1570 call FuncWithError()
1571 catch
1572 call assert_match('Vim:E908:', v:exception)
1573 endtry
1574 endfunc
1575endif
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001576
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001577def Test_vim9script_mix()
1578 var lines =<< trim END
1579 if has(g:feature)
1580 " legacy script
1581 let g:legacy = 1
1582 finish
1583 endif
1584 vim9script
1585 g:legacy = 0
1586 END
1587 g:feature = 'eval'
1588 g:legacy = -1
Bram Moolenaar62aec932022-01-29 21:45:34 +00001589 v9.CheckScriptSuccess(lines)
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001590 assert_equal(1, g:legacy)
1591
1592 g:feature = 'noteval'
1593 g:legacy = -1
Bram Moolenaar62aec932022-01-29 21:45:34 +00001594 v9.CheckScriptSuccess(lines)
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001595 assert_equal(0, g:legacy)
1596enddef
1597
Bram Moolenaar750802b2020-02-23 18:08:33 +01001598def Test_vim9script_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001599 v9.CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
1600 v9.CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +01001601
Bram Moolenaar62aec932022-01-29 21:45:34 +00001602 v9.CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1603 v9.CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
Bram Moolenaarc785b9a2020-06-19 18:34:15 +02001604
Bram Moolenaare2e40752020-09-04 21:18:46 +02001605 assert_fails('vim9script', 'E1038:')
Bram Moolenaar107f7322022-02-06 17:30:41 +00001606 v9.CheckDefFailure(['vim9script'], 'E1038:')
Bram Moolenaar8cbf2492022-02-06 20:28:13 +00001607
1608 # no error when skipping
1609 if has('nothing')
1610 vim9script
1611 endif
Bram Moolenaarc970e422021-03-17 15:03:04 +01001612enddef
1613
Bram Moolenaar6c3843c2021-03-04 12:38:21 +01001614def Test_script_var_shadows_function()
1615 var lines =<< trim END
1616 vim9script
1617 def Func(): number
1618 return 123
1619 enddef
1620 var Func = 1
1621 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001622 v9.CheckScriptFailure(lines, 'E1041:', 5)
Bram Moolenaar6c3843c2021-03-04 12:38:21 +01001623enddef
1624
Bram Moolenaar052ff292021-12-11 13:54:46 +00001625def Test_function_shadows_script_var()
1626 var lines =<< trim END
1627 vim9script
1628 var Func = 1
1629 def Func(): number
1630 return 123
1631 enddef
1632 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001633 v9.CheckScriptFailure(lines, 'E1041:', 3)
Bram Moolenaar052ff292021-12-11 13:54:46 +00001634enddef
1635
Bram Moolenaarc3235272021-07-10 19:42:03 +02001636def Test_script_var_shadows_command()
1637 var lines =<< trim END
1638 var undo = 1
1639 undo = 2
1640 assert_equal(2, undo)
1641 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001642 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc3235272021-07-10 19:42:03 +02001643
1644 lines =<< trim END
1645 var undo = 1
1646 undo
1647 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001648 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaarc3235272021-07-10 19:42:03 +02001649enddef
1650
Bram Moolenaar2ef91562021-12-11 16:14:07 +00001651def Test_vim9script_call_wrong_type()
1652 var lines =<< trim END
1653 vim9script
1654 var Time = 'localtime'
1655 Time()
1656 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001657 v9.CheckScriptFailure(lines, 'E1085:')
Bram Moolenaar2ef91562021-12-11 16:14:07 +00001658enddef
1659
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001660def Test_vim9script_reload_delfunc()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001661 var first_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001662 vim9script
1663 def FuncYes(): string
1664 return 'yes'
1665 enddef
1666 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001667 var withno_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001668 def FuncNo(): string
1669 return 'no'
1670 enddef
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001671 def g:DoCheck(no_exists: bool)
1672 assert_equal('yes', FuncYes())
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001673 assert_equal('no', FuncNo())
1674 enddef
1675 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001676 var nono_lines =<< trim END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001677 def g:DoCheck(no_exists: bool)
1678 assert_equal('yes', FuncYes())
Bram Moolenaar44d66522020-09-06 22:26:57 +02001679 assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001680 enddef
1681 END
1682
1683 # FuncNo() is defined
Bram Moolenaardd674772022-09-15 22:26:18 +01001684 writefile(first_lines + withno_lines, 'Xreloaded.vim', 'D')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001685 source Xreloaded.vim
1686 g:DoCheck(true)
1687
1688 # FuncNo() is not redefined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001689 writefile(first_lines + nono_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001690 source Xreloaded.vim
Bram Moolenaar50824712020-12-20 21:10:17 +01001691 g:DoCheck(false)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001692
1693 # FuncNo() is back
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001694 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001695 source Xreloaded.vim
Bram Moolenaar50824712020-12-20 21:10:17 +01001696 g:DoCheck(false)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001697enddef
1698
Bram Moolenaar89483d42020-05-10 15:24:44 +02001699def Test_vim9script_reload_delvar()
1700 # write the script with a script-local variable
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001701 var lines =<< trim END
Bram Moolenaar89483d42020-05-10 15:24:44 +02001702 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001703 var name = 'string'
Bram Moolenaar89483d42020-05-10 15:24:44 +02001704 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001705 writefile(lines, 'XreloadVar.vim', 'D')
Bram Moolenaar89483d42020-05-10 15:24:44 +02001706 source XreloadVar.vim
1707
1708 # now write the script using the same variable locally - works
1709 lines =<< trim END
1710 vim9script
1711 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001712 var name = 'string'
Bram Moolenaar89483d42020-05-10 15:24:44 +02001713 enddef
1714 END
1715 writefile(lines, 'XreloadVar.vim')
1716 source XreloadVar.vim
Bram Moolenaar89483d42020-05-10 15:24:44 +02001717enddef
1718
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001719def Test_func_redefine_error()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001720 var lines = [
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001721 'vim9script',
1722 'def Func()',
1723 ' eval [][0]',
1724 'enddef',
1725 'Func()',
1726 ]
Bram Moolenaardd674772022-09-15 22:26:18 +01001727 writefile(lines, 'Xtestscript.vim', 'D')
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001728
1729 for count in range(3)
1730 try
1731 source Xtestscript.vim
1732 catch /E684/
1733 # function name should contain <SNR> every time
Bram Moolenaarec892232022-05-06 17:53:06 +01001734 assert_match('E684: List index out of range', v:exception)
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001735 assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1736 endtry
1737 endfor
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001738enddef
1739
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001740def Test_func_redefine_fails()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001741 var lines =<< trim END
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001742 vim9script
1743 def Func()
1744 echo 'one'
1745 enddef
1746 def Func()
1747 echo 'two'
1748 enddef
1749 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001750 v9.CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001751
1752 lines =<< trim END
1753 vim9script
1754 def Foo(): string
1755 return 'foo'
Bram Moolenaar052ff292021-12-11 13:54:46 +00001756 enddef
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001757 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001758 var Foo = {-> 'lambda'}
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001759 enddef
1760 defcompile
1761 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001762 v9.CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001763enddef
1764
Bram Moolenaar91c7cbf2022-08-18 13:28:31 +01001765def Test_lambda_split()
1766 # this was using freed memory, because of the split expression
1767 var lines =<< trim END
1768 vim9script
1769 try
1770 0
1771 0->(0
1772 ->a.0(
1773 ->u
1774 END
1775 v9.CheckScriptFailure(lines, 'E1050:')
1776enddef
1777
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001778def Test_fixed_size_list()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001779 # will be allocated as one piece of memory, check that changes work
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001780 var l = [1, 2, 3, 4]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001781 l->remove(0)
1782 l->add(5)
1783 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001784 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001785enddef
1786
Bram Moolenaarae616492020-07-28 20:07:27 +02001787def Test_no_insert_xit()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001788 v9.CheckDefExecFailure(['a = 1'], 'E1100:')
1789 v9.CheckDefExecFailure(['c = 1'], 'E1100:')
1790 v9.CheckDefExecFailure(['i = 1'], 'E1100:')
1791 v9.CheckDefExecFailure(['t = 1'], 'E1100:')
1792 v9.CheckDefExecFailure(['x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02001793
Bram Moolenaar62aec932022-01-29 21:45:34 +00001794 v9.CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1795 v9.CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1796 v9.CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1797 v9.CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1798 v9.CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1799 v9.CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1800 v9.CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
1801 v9.CheckScriptFailure(['vim9script', 'o'], 'E1100:')
1802 v9.CheckScriptFailure(['vim9script', 't'], 'E1100:')
1803 v9.CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1804 v9.CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02001805enddef
1806
Bram Moolenaar62aec932022-01-29 21:45:34 +00001807def s:IfElse(what: number): string
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001808 var res = ''
Bram Moolenaar158906c2020-02-06 20:39:45 +01001809 if what == 1
1810 res = "one"
1811 elseif what == 2
1812 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001813 else
Bram Moolenaar158906c2020-02-06 20:39:45 +01001814 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001815 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +01001816 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001817enddef
1818
Bram Moolenaar158906c2020-02-06 20:39:45 +01001819def Test_if_elseif_else()
1820 assert_equal('one', IfElse(1))
1821 assert_equal('two', IfElse(2))
1822 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001823enddef
1824
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001825def Test_if_elseif_else_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001826 v9.CheckDefFailure(['elseif true'], 'E582:')
1827 v9.CheckDefFailure(['else'], 'E581:')
1828 v9.CheckDefFailure(['endif'], 'E580:')
1829 v9.CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
1830 v9.CheckDefFailure(['if true', 'echo 1'], 'E171:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01001831
1832 var lines =<< trim END
1833 var s = ''
1834 if s = ''
1835 endif
1836 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001837 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01001838
1839 lines =<< trim END
1840 var s = ''
1841 if s == ''
1842 elseif s = ''
1843 endif
1844 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001845 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaarfa010cd2022-04-03 16:13:07 +01001846
1847 lines =<< trim END
1848 var cond = true
1849 if cond
1850 echo 'true'
1851 elseif
1852 echo 'false'
1853 endif
1854 END
1855 v9.CheckDefAndScriptFailure(lines, ['E1143:', 'E15:'], 4)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001856enddef
1857
Bram Moolenaar505ed0c2022-05-05 17:02:46 +01001858def Test_if_else_func_using_var()
1859 var lines =<< trim END
1860 vim9script
1861
1862 const debug = true
1863 if debug
1864 var mode_chars = 'something'
1865 def Bits2Ascii()
1866 var x = mode_chars
1867 g:where = 'in true'
1868 enddef
1869 else
1870 def Bits2Ascii()
1871 g:where = 'in false'
1872 enddef
1873 endif
1874
1875 Bits2Ascii()
1876 END
1877 v9.CheckScriptSuccess(lines)
1878 assert_equal('in true', g:where)
1879 unlet g:where
1880
1881 lines =<< trim END
1882 vim9script
1883
1884 const debug = false
1885 if debug
1886 var mode_chars = 'something'
1887 def Bits2Ascii()
1888 g:where = 'in true'
1889 enddef
1890 else
1891 def Bits2Ascii()
1892 var x = mode_chars
1893 g:where = 'in false'
1894 enddef
1895 endif
1896
1897 Bits2Ascii()
1898 END
1899 v9.CheckScriptFailure(lines, 'E1001: Variable not found: mode_chars')
1900enddef
1901
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001902let g:bool_true = v:true
1903let g:bool_false = v:false
1904
1905def Test_if_const_expr()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001906 var res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001907 if true ? true : false
1908 res = true
1909 endif
1910 assert_equal(true, res)
1911
Bram Moolenaar585fea72020-04-02 22:33:21 +02001912 g:glob = 2
1913 if false
Bram Moolenaar67979662020-06-20 22:50:47 +02001914 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001915 endif
1916 assert_equal(2, g:glob)
1917 if true
Bram Moolenaar67979662020-06-20 22:50:47 +02001918 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001919 endif
1920 assert_equal(3, g:glob)
1921
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001922 res = false
1923 if g:bool_true ? true : false
1924 res = true
1925 endif
1926 assert_equal(true, res)
1927
1928 res = false
1929 if true ? g:bool_true : false
1930 res = true
1931 endif
1932 assert_equal(true, res)
1933
1934 res = false
1935 if true ? true : g:bool_false
1936 res = true
1937 endif
1938 assert_equal(true, res)
1939
1940 res = false
1941 if true ? false : true
1942 res = true
1943 endif
1944 assert_equal(false, res)
1945
1946 res = false
1947 if false ? false : true
1948 res = true
1949 endif
1950 assert_equal(true, res)
1951
1952 res = false
1953 if false ? true : false
1954 res = true
1955 endif
1956 assert_equal(false, res)
1957
1958 res = false
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001959 if has('xyz') ? true : false
1960 res = true
1961 endif
1962 assert_equal(false, res)
1963
1964 res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001965 if true && true
1966 res = true
1967 endif
1968 assert_equal(true, res)
1969
1970 res = false
1971 if true && false
1972 res = true
1973 endif
1974 assert_equal(false, res)
1975
1976 res = false
1977 if g:bool_true && false
1978 res = true
1979 endif
1980 assert_equal(false, res)
1981
1982 res = false
1983 if true && g:bool_false
1984 res = true
1985 endif
1986 assert_equal(false, res)
1987
1988 res = false
1989 if false && false
1990 res = true
1991 endif
1992 assert_equal(false, res)
1993
1994 res = false
1995 if true || false
1996 res = true
1997 endif
1998 assert_equal(true, res)
1999
2000 res = false
2001 if g:bool_true || false
2002 res = true
2003 endif
2004 assert_equal(true, res)
2005
2006 res = false
2007 if true || g:bool_false
2008 res = true
2009 endif
2010 assert_equal(true, res)
2011
2012 res = false
2013 if false || false
2014 res = true
2015 endif
2016 assert_equal(false, res)
Bram Moolenaar3988f642020-08-27 22:43:03 +02002017
2018 # with constant "false" expression may be invalid so long as the syntax is OK
Bram Moolenaarc3235272021-07-10 19:42:03 +02002019 if false | eval 1 + 2 | endif
Bram Moolenaar3988f642020-08-27 22:43:03 +02002020 if false | eval burp + 234 | endif
2021 if false | echo burp 234 'asd' | endif
2022 if false
2023 burp
2024 endif
Bram Moolenaare525bdd2021-08-07 18:12:40 +02002025
Bram Moolenaar21ebb082022-02-04 21:58:58 +00002026 if 0
2027 if 1
2028 echo nothing
2029 elseif 1
2030 echo still nothing
2031 endif
2032 endif
2033
Bram Moolenaare525bdd2021-08-07 18:12:40 +02002034 # expression with line breaks skipped
2035 if false
2036 ('aaa'
2037 .. 'bbb'
2038 .. 'ccc'
2039 )->setline(1)
2040 endif
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02002041enddef
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002042
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02002043def Test_if_const_expr_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00002044 v9.CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2045 v9.CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2046 v9.CheckDefFailure(["if has('aaa'"], 'E110:')
2047 v9.CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002048enddef
2049
Bram Moolenaar62aec932022-01-29 21:45:34 +00002050def s:RunNested(i: number): number
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002051 var x: number = 0
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002052 if i % 2
2053 if 1
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002054 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002055 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002056 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002057 endif
2058 x += 1
2059 else
2060 x += 1000
2061 endif
2062 return x
2063enddef
2064
2065def Test_nested_if()
2066 assert_equal(1, RunNested(1))
2067 assert_equal(1000, RunNested(2))
2068enddef
2069
Bram Moolenaarad39c092020-02-26 18:23:43 +01002070def Test_execute_cmd()
Bram Moolenaare4984292020-12-13 14:19:25 +01002071 # missing argument is ignored
2072 execute
2073 execute # comment
2074
Bram Moolenaarad39c092020-02-26 18:23:43 +01002075 new
2076 setline(1, 'default')
Bram Moolenaard2c61702020-09-06 15:58:36 +02002077 execute 'setline(1, "execute-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002078 assert_equal('execute-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002079
Bram Moolenaard2c61702020-09-06 15:58:36 +02002080 execute "setline(1, 'execute-string')"
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002081 assert_equal('execute-string', getline(1))
2082
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002083 var cmd1 = 'setline(1,'
2084 var cmd2 = '"execute-var")'
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002085 execute cmd1 cmd2 # comment
Bram Moolenaarad39c092020-02-26 18:23:43 +01002086 assert_equal('execute-var', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002087
Bram Moolenaard2c61702020-09-06 15:58:36 +02002088 execute cmd1 cmd2 '|setline(1, "execute-var-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002089 assert_equal('execute-var-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002090
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002091 var cmd_first = 'call '
2092 var cmd_last = 'setline(1, "execute-var-var")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002093 execute cmd_first .. cmd_last
2094 assert_equal('execute-var-var', getline(1))
2095 bwipe!
Bram Moolenaar585fea72020-04-02 22:33:21 +02002096
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002097 var n = true
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02002098 execute 'echomsg' (n ? '"true"' : '"no"')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002099 assert_match('^true$', g:Screenline(&lines))
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02002100
Bram Moolenaare0de1712020-12-02 17:36:54 +01002101 echomsg [1, 2, 3] {a: 1, b: 2}
Bram Moolenaar62aec932022-01-29 21:45:34 +00002102 assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', g:Screenline(&lines))
Bram Moolenaare5abf7a2020-08-16 18:29:35 +02002103
Bram Moolenaar62aec932022-01-29 21:45:34 +00002104 v9.CheckDefFailure(['execute xxx'], 'E1001:', 1)
2105 v9.CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2106 v9.CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
Bram Moolenaar0c7f2612022-02-17 19:44:07 +00002107 if has('channel')
2108 v9.CheckDefExecFailure(['execute test_null_channel()'], 'E908:', 1)
2109 endif
Bram Moolenaarad39c092020-02-26 18:23:43 +01002110enddef
2111
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002112def Test_execute_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002113 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002114 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002115 vim9script
2116 execute 'g:someVar'
2117 .. ' = ' ..
2118 '28'
2119 assert_equal(28, g:someVar)
2120 unlet g:someVar
2121 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002122 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002123enddef
2124
Bram Moolenaar43216612022-03-25 11:16:28 +00002125def Test_execute_finish()
2126 # the empty lines are relevant here
2127 var lines =<< trim END
2128 vim9script
2129
2130 var vname = "g:hello"
2131
2132 if exists(vname) | finish | endif | execute vname '= "world"'
2133
2134 assert_equal('world', g:hello)
2135
2136 if exists(vname) | finish | endif | execute vname '= "world"'
2137
2138 assert_report('should not be reached')
2139 END
2140 v9.CheckScriptSuccess(lines)
2141enddef
2142
Bram Moolenaarad39c092020-02-26 18:23:43 +01002143def Test_echo_cmd()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002144 echo 'some' # comment
Bram Moolenaar585fea72020-04-02 22:33:21 +02002145 echon 'thing'
Bram Moolenaar62aec932022-01-29 21:45:34 +00002146 assert_match('^something$', g:Screenline(&lines))
Bram Moolenaarad39c092020-02-26 18:23:43 +01002147
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002148 echo "some" # comment
2149 echon "thing"
Bram Moolenaar62aec932022-01-29 21:45:34 +00002150 assert_match('^something$', g:Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002151
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002152 var str1 = 'some'
2153 var str2 = 'more'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002154 echo str1 str2
Bram Moolenaar62aec932022-01-29 21:45:34 +00002155 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002156
Bram Moolenaar397a87a2022-03-20 21:14:15 +00002157 echo "one\ntwo"
2158 assert_match('^one$', g:Screenline(&lines - 1))
2159 assert_match('^two$', g:Screenline(&lines))
2160
Bram Moolenaar62aec932022-01-29 21:45:34 +00002161 v9.CheckDefFailure(['echo "xxx"# comment'], 'E488:')
Bram Moolenaarad39c092020-02-26 18:23:43 +01002162enddef
2163
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002164def Test_echomsg_cmd()
2165 echomsg 'some' 'more' # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00002166 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002167 echo 'clear'
Bram Moolenaardf069ee2020-06-22 23:02:51 +02002168 :1messages
Bram Moolenaar62aec932022-01-29 21:45:34 +00002169 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002170
Bram Moolenaar62aec932022-01-29 21:45:34 +00002171 v9.CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002172enddef
2173
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002174def Test_echomsg_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002175 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002176 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002177 vim9script
2178 echomsg 'here'
2179 .. ' is ' ..
2180 'a message'
Bram Moolenaar62aec932022-01-29 21:45:34 +00002181 assert_match('^here is a message$', g:Screenline(&lines))
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002182 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002183 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002184enddef
2185
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002186def Test_echoerr_cmd()
Bram Moolenaar7de62622021-08-07 15:05:47 +02002187 var local = 'local'
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002188 try
Bram Moolenaar7de62622021-08-07 15:05:47 +02002189 echoerr 'something' local 'wrong' # comment
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002190 catch
Bram Moolenaar7de62622021-08-07 15:05:47 +02002191 assert_match('something local wrong', v:exception)
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002192 endtry
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002193enddef
2194
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002195def Test_echoerr_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002196 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002197 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002198 vim9script
2199 try
2200 echoerr 'this'
2201 .. ' is ' ..
2202 'wrong'
2203 catch
2204 assert_match('this is wrong', v:exception)
2205 endtry
2206 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002207 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002208enddef
2209
Bram Moolenaar7de62622021-08-07 15:05:47 +02002210def Test_echoconsole_cmd()
2211 var local = 'local'
2212 echoconsole 'something' local # comment
2213 # output goes anywhere
2214enddef
2215
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002216def Test_echowindow_cmd()
2217 var local = 'local'
2218 echowindow 'something' local # comment
Bram Moolenaar2435adf2022-10-21 12:05:46 +01002219
2220 # with modifier
2221 unsilent echowin 'loud'
2222
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002223 # output goes in message window
2224 popup_clear()
2225enddef
2226
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002227def Test_for_outside_of_function()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002228 var lines =<< trim END
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002229 vim9script
2230 new
2231 for var in range(0, 3)
2232 append(line('$'), var)
2233 endfor
2234 assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
2235 bwipe!
Bram Moolenaar522eefd2021-03-26 18:49:22 +01002236
2237 var result = ''
2238 for i in [1, 2, 3]
2239 var loop = ' loop ' .. i
2240 result ..= loop
2241 endfor
2242 assert_equal(' loop 1 loop 2 loop 3', result)
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002243 END
Bram Moolenaardd674772022-09-15 22:26:18 +01002244 writefile(lines, 'Xvim9for.vim', 'D')
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002245 source Xvim9for.vim
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002246enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002247
rbtnnbebf0692021-08-21 17:26:50 +02002248def Test_for_skipped_block()
2249 # test skipped blocks at outside of function
2250 var lines =<< trim END
2251 var result = []
2252 if true
2253 for n in [1, 2]
2254 result += [n]
2255 endfor
2256 else
2257 for n in [3, 4]
2258 result += [n]
2259 endfor
2260 endif
2261 assert_equal([1, 2], result)
2262
2263 result = []
2264 if false
2265 for n in [1, 2]
2266 result += [n]
2267 endfor
2268 else
2269 for n in [3, 4]
2270 result += [n]
2271 endfor
2272 endif
2273 assert_equal([3, 4], result)
2274 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002275 v9.CheckDefAndScriptSuccess(lines)
rbtnnbebf0692021-08-21 17:26:50 +02002276
2277 # test skipped blocks at inside of function
2278 lines =<< trim END
2279 def DefTrue()
2280 var result = []
2281 if true
2282 for n in [1, 2]
2283 result += [n]
2284 endfor
2285 else
2286 for n in [3, 4]
2287 result += [n]
2288 endfor
2289 endif
2290 assert_equal([1, 2], result)
2291 enddef
2292 DefTrue()
2293
2294 def DefFalse()
2295 var result = []
2296 if false
2297 for n in [1, 2]
2298 result += [n]
2299 endfor
2300 else
2301 for n in [3, 4]
2302 result += [n]
2303 endfor
2304 endif
2305 assert_equal([3, 4], result)
2306 enddef
2307 DefFalse()
Bram Moolenaar97f8c102022-04-02 19:43:57 +01002308
2309 def BuildDiagrams()
2310 var diagrams: list<any>
2311 if false
2312 var max = 0
2313 for v in diagrams
2314 var l = 3
2315 if max < l | max = l | endif
2316 v->add(l)
2317 endfor
2318 endif
2319 enddef
2320 BuildDiagrams()
rbtnnbebf0692021-08-21 17:26:50 +02002321 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002322 v9.CheckDefAndScriptSuccess(lines)
rbtnnbebf0692021-08-21 17:26:50 +02002323enddef
2324
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002325def Test_skipped_redir()
2326 var lines =<< trim END
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002327 def Tredir()
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002328 if 0
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002329 redir => l[0]
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002330 redir END
2331 endif
2332 enddef
2333 defcompile
2334 END
2335 v9.CheckScriptSuccess(lines)
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002336 delfunc g:Tredir
2337
2338 lines =<< trim END
2339 def Tredir()
2340 if 0
2341 redir => l[0]
2342 endif
2343 echo 'executed'
2344 if 0
2345 redir END
2346 endif
2347 enddef
2348 defcompile
2349 END
2350 v9.CheckScriptSuccess(lines)
2351 delfunc g:Tredir
2352
2353 lines =<< trim END
2354 def Tredir()
2355 var l = ['']
2356 if 1
2357 redir => l[0]
2358 endif
2359 echo 'executed'
2360 if 0
2361 redir END
2362 else
2363 redir END
2364 endif
2365 enddef
2366 defcompile
2367 END
2368 v9.CheckScriptSuccess(lines)
2369 delfunc g:Tredir
2370
2371 lines =<< trim END
2372 let doit = 1
2373 def Tredir()
2374 var l = ['']
2375 if g:doit
2376 redir => l[0]
2377 endif
2378 echo 'executed'
2379 if g:doit
2380 redir END
2381 endif
2382 enddef
2383 defcompile
2384 END
2385 v9.CheckScriptSuccess(lines)
2386 delfunc g:Tredir
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002387enddef
2388
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002389def Test_for_loop()
Bram Moolenaarf2253962021-04-13 20:53:13 +02002390 var lines =<< trim END
2391 var result = ''
2392 for cnt in range(7)
2393 if cnt == 4
2394 break
2395 endif
2396 if cnt == 2
2397 continue
2398 endif
2399 result ..= cnt .. '_'
2400 endfor
2401 assert_equal('0_1_3_', result)
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02002402
Bram Moolenaarf2253962021-04-13 20:53:13 +02002403 var concat = ''
2404 for str in eval('["one", "two"]')
2405 concat ..= str
2406 endfor
2407 assert_equal('onetwo', concat)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002408
Bram Moolenaarf2253962021-04-13 20:53:13 +02002409 var total = 0
2410 for nr in
2411 [1, 2, 3]
2412 total += nr
2413 endfor
2414 assert_equal(6, total)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002415
Bram Moolenaarf2253962021-04-13 20:53:13 +02002416 total = 0
2417 for nr
2418 in [1, 2, 3]
2419 total += nr
2420 endfor
2421 assert_equal(6, total)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002422
Bram Moolenaarf2253962021-04-13 20:53:13 +02002423 total = 0
2424 for nr
2425 in
2426 [1, 2, 3]
2427 total += nr
2428 endfor
2429 assert_equal(6, total)
Bram Moolenaar036d0712021-01-17 20:23:38 +01002430
Bram Moolenaara3589a02021-04-14 13:30:46 +02002431 # with type
2432 total = 0
2433 for n: number in [1, 2, 3]
2434 total += n
2435 endfor
2436 assert_equal(6, total)
2437
Bram Moolenaarefd73ae2022-03-20 18:51:00 +00002438 total = 0
2439 for b in 0z010203
2440 total += b
2441 endfor
2442 assert_equal(6, total)
2443
Bram Moolenaarfe090eb2021-04-15 21:48:32 +02002444 var chars = ''
2445 for s: string in 'foobar'
2446 chars ..= s
2447 endfor
2448 assert_equal('foobar', chars)
2449
Bram Moolenaar5ede5b22021-07-07 21:55:25 +02002450 chars = ''
2451 for x: string in {a: 'a', b: 'b'}->values()
2452 chars ..= x
2453 endfor
2454 assert_equal('ab', chars)
2455
Bram Moolenaara3589a02021-04-14 13:30:46 +02002456 # unpack with type
Bram Moolenaarf2253962021-04-13 20:53:13 +02002457 var res = ''
Bram Moolenaara3589a02021-04-14 13:30:46 +02002458 for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2459 res ..= n .. s
2460 endfor
2461 assert_equal('1a2b', res)
2462
Bram Moolenaar444d8782021-06-26 12:40:56 +02002463 # unpack with one var
2464 var reslist = []
2465 for [x] in [['aaa'], ['bbb']]
2466 reslist->add(x)
2467 endfor
2468 assert_equal(['aaa', 'bbb'], reslist)
2469
Bram Moolenaara3589a02021-04-14 13:30:46 +02002470 # loop over string
2471 res = ''
Bram Moolenaarf2253962021-04-13 20:53:13 +02002472 for c in 'aéc̀d'
2473 res ..= c .. '-'
2474 endfor
2475 assert_equal('a-é-c̀-d-', res)
2476
2477 res = ''
2478 for c in ''
2479 res ..= c .. '-'
2480 endfor
2481 assert_equal('', res)
2482
2483 res = ''
2484 for c in test_null_string()
2485 res ..= c .. '-'
2486 endfor
2487 assert_equal('', res)
2488
Bram Moolenaar10611952022-04-03 21:11:34 +01002489 total = 0
2490 for c in null_list
2491 total += 1
2492 endfor
2493 assert_equal(0, total)
2494
2495 for c in null_blob
2496 total += 1
2497 endfor
2498 assert_equal(0, total)
2499
Bram Moolenaarf2253962021-04-13 20:53:13 +02002500 var foo: list<dict<any>> = [
2501 {a: 'Cat'}
2502 ]
2503 for dd in foo
2504 dd.counter = 12
2505 endfor
2506 assert_equal([{a: 'Cat', counter: 12}], foo)
Bram Moolenaarad2d4962021-07-18 17:08:50 +02002507
2508 reslist = []
2509 for _ in range(3)
2510 reslist->add('x')
2511 endfor
2512 assert_equal(['x', 'x', 'x'], reslist)
Bram Moolenaarf2253962021-04-13 20:53:13 +02002513 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002514 v9.CheckDefAndScriptSuccess(lines)
Yegappan Lakshmananfe424d12024-05-17 18:20:43 +02002515
2516 lines =<< trim END
2517 for i : number : [1, 2]
2518 echo i
2519 endfor
2520 END
2521 v9.CheckSourceDefAndScriptFailure(lines, 'E1059: No white space allowed before colon: : [1, 2]', 1)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002522enddef
2523
Bram Moolenaar159b2d52022-10-11 21:41:25 +01002524def Test_for_loop_list_of_lists()
2525 # loop variable is final, not const
2526 var lines =<< trim END
2527 # Filter out all odd numbers in each sublist
2528 var list: list<list<number>> = [[1], [1, 2], [1, 2, 3], [1, 2, 3, 4]]
2529 for i in list
2530 filter(i, (_, n: number): bool => n % 2 == 0)
2531 endfor
2532
2533 assert_equal([[], [2], [2], [2, 4]], list)
2534 END
2535 v9.CheckDefAndScriptSuccess(lines)
2536enddef
2537
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002538def Test_for_loop_with_closure()
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002539 # using the loop variable in a closure results in the last used value
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002540 var lines =<< trim END
2541 var flist: list<func>
2542 for i in range(5)
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002543 flist[i] = () => i
2544 endfor
2545 for i in range(5)
2546 assert_equal(4, flist[i]())
2547 endfor
2548 END
2549 v9.CheckDefAndScriptSuccess(lines)
2550
Bram Moolenaardd674772022-09-15 22:26:18 +01002551 # also works when the loop variable is used only once halfway the loops
2552 lines =<< trim END
2553 var Clo: func
2554 for i in range(5)
2555 if i == 3
2556 Clo = () => i
2557 endif
2558 endfor
2559 assert_equal(4, Clo())
2560 END
2561 v9.CheckDefAndScriptSuccess(lines)
2562
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002563 # using a local variable set to the loop variable in a closure results in the
2564 # value at that moment
2565 lines =<< trim END
2566 var flist: list<func>
2567 for i in range(5)
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002568 var inloop = i
2569 flist[i] = () => inloop
2570 endfor
2571 for i in range(5)
Bram Moolenaar353b68a2022-09-13 21:10:45 +01002572 assert_equal(i, flist[i]())
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002573 endfor
2574 END
Bram Moolenaar0cdfb7c2022-09-17 15:44:52 +01002575 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002576
Bram Moolenaara275f2c2022-10-11 20:04:09 +01002577 # also with an extra block level
2578 lines =<< trim END
2579 var flist: list<func>
2580 for i in range(5)
2581 {
2582 var inloop = i
2583 flist[i] = () => inloop
2584 }
2585 endfor
2586 for i in range(5)
2587 assert_equal(i, flist[i]())
2588 endfor
2589 END
2590 v9.CheckDefAndScriptSuccess(lines)
2591
2592 # and declaration in higher block
2593 lines =<< trim END
2594 var flist: list<func>
2595 for i in range(5)
2596 var inloop = i
2597 {
2598 flist[i] = () => inloop
2599 }
2600 endfor
2601 for i in range(5)
2602 assert_equal(i, flist[i]())
2603 endfor
2604 END
2605 v9.CheckDefAndScriptSuccess(lines)
2606
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002607 lines =<< trim END
2608 var flist: list<func>
2609 for i in range(5)
2610 var inloop = i
2611 flist[i] = () => {
2612 return inloop
2613 }
2614 endfor
2615 for i in range(5)
Bram Moolenaar353b68a2022-09-13 21:10:45 +01002616 assert_equal(i, flist[i]())
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002617 endfor
2618 END
Bram Moolenaar0cdfb7c2022-09-17 15:44:52 +01002619 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaardbbb02b2022-09-18 12:00:21 +01002620
2621 # Also works for a nested loop
2622 lines =<< trim END
2623 var flist: list<func>
2624 var n = 0
2625 for i in range(3)
2626 var ii = i
2627 for a in ['a', 'b', 'c']
2628 var aa = a
2629 flist[n] = () => ii .. aa
2630 ++n
2631 endfor
2632 endfor
2633
2634 n = 0
2635 for i in range(3)
2636 for a in ['a', 'b', 'c']
2637 assert_equal(i .. a, flist[n]())
2638 ++n
2639 endfor
2640 endfor
2641 END
Bram Moolenaarcc341812022-09-19 15:54:34 +01002642 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaare8e369a2022-09-21 18:59:14 +01002643
2644 # using two loop variables
2645 lines =<< trim END
2646 var lv_list: list<func>
2647 var copy_list: list<func>
2648 for [idx, c] in items('word')
2649 var lidx = idx
2650 var lc = c
2651 lv_list[idx] = () => {
2652 return idx .. c
2653 }
2654 copy_list[idx] = () => {
2655 return lidx .. lc
2656 }
2657 endfor
2658 for [i, c] in items('word')
2659 assert_equal(3 .. 'd', lv_list[i]())
2660 assert_equal(i .. c, copy_list[i]())
2661 endfor
2662 END
2663 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarcc341812022-09-19 15:54:34 +01002664enddef
2665
2666def Test_define_global_closure_in_loops()
2667 var lines =<< trim END
2668 vim9script
2669
2670 def Func()
2671 for i in range(3)
2672 var ii = i
2673 for a in ['a', 'b', 'c']
2674 var aa = a
2675 if ii == 0 && aa == 'a'
2676 def g:Global_0a(): string
2677 return ii .. aa
2678 enddef
2679 endif
2680 if ii == 1 && aa == 'b'
2681 def g:Global_1b(): string
2682 return ii .. aa
2683 enddef
2684 endif
2685 if ii == 2 && aa == 'c'
2686 def g:Global_2c(): string
2687 return ii .. aa
2688 enddef
2689 endif
2690 endfor
2691 endfor
2692 enddef
2693 Func()
2694 END
2695 v9.CheckScriptSuccess(lines)
2696 assert_equal("0a", g:Global_0a())
2697 assert_equal("1b", g:Global_1b())
2698 assert_equal("2c", g:Global_2c())
2699
2700 delfunc g:Global_0a
2701 delfunc g:Global_1b
2702 delfunc g:Global_2c
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002703enddef
2704
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002705def Test_for_loop_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00002706 v9.CheckDefAndScriptFailure(['for '], ['E1097:', 'E690:'])
2707 v9.CheckDefAndScriptFailure(['for x'], ['E1097:', 'E690:'])
2708 v9.CheckDefAndScriptFailure(['for x in'], ['E1097:', 'E15:'])
2709 v9.CheckDefAndScriptFailure(['for # in range(5)'], 'E690:')
2710 v9.CheckDefAndScriptFailure(['for i In range(5)'], 'E690:')
2711 v9.CheckDefAndScriptFailure(['var x = 5', 'for x in range(5)', 'endfor'], ['E1017:', 'E1041:'])
2712 v9.CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3)
2713 v9.CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01002714 delfunc! g:Func
Bram Moolenaar62aec932022-01-29 21:45:34 +00002715 v9.CheckDefFailure(['for i in xxx'], 'E1001:')
2716 v9.CheckDefFailure(['endfor'], 'E588:')
2717 v9.CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002718
2719 # wrong type detected at compile time
Bram Moolenaar62aec932022-01-29 21:45:34 +00002720 v9.CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002721
2722 # wrong type detected at runtime
2723 g:adict = {a: 1}
Bram Moolenaar62aec932022-01-29 21:45:34 +00002724 v9.CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002725 unlet g:adict
Bram Moolenaarf6a8d422021-04-13 21:48:03 +02002726
2727 var lines =<< trim END
2728 var d: list<dict<any>> = [{a: 0}]
2729 for e in d
2730 e = {a: 0, b: ''}
2731 endfor
2732 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002733 v9.CheckDefAndScriptFailure(lines, ['E1018:', 'E46:'], 3)
Bram Moolenaarfe090eb2021-04-15 21:48:32 +02002734
2735 lines =<< trim END
2736 for nr: number in ['foo']
2737 endfor
2738 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002739 v9.CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
Bram Moolenaar404557e2021-07-05 21:41:48 +02002740
2741 lines =<< trim END
2742 for n : number in [1, 2]
2743 echo n
2744 endfor
2745 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002746 v9.CheckDefAndScriptFailure(lines, 'E1059:', 1)
Bram Moolenaarefc5db52021-07-07 21:21:30 +02002747
2748 lines =<< trim END
2749 var d: dict<number> = {a: 1, b: 2}
2750 for [k: job, v: job] in d->items()
2751 echo k v
2752 endfor
2753 END
Bram Moolenaarbd3a9d22022-05-17 16:12:39 +01002754 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 +00002755
2756 lines =<< trim END
2757 var i = 0
2758 for i in [1, 2, 3]
2759 echo i
2760 endfor
2761 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002762 v9.CheckDefExecAndScriptFailure(lines, ['E1017:', 'E1041:'])
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002763
2764 lines =<< trim END
2765 var l = [0]
2766 for l[0] in [1, 2, 3]
2767 echo l[0]
2768 endfor
2769 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002770 v9.CheckDefExecAndScriptFailure(lines, ['E461:', 'E1017:'])
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002771
2772 lines =<< trim END
2773 var d = {x: 0}
2774 for d.x in [1, 2, 3]
2775 echo d.x
2776 endfor
2777 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002778 v9.CheckDefExecAndScriptFailure(lines, ['E461:', 'E1017:'])
Bram Moolenaara1c51952022-02-02 16:20:26 +00002779
2780 lines =<< trim END
2781 var l: list<dict<any>> = [{a: 1, b: 'x'}]
2782 for item: dict<number> in l
2783 echo item
2784 endfor
2785 END
2786 v9.CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected dict<number> but got dict<any>')
2787
2788 lines =<< trim END
2789 var l: list<dict<any>> = [{n: 1}]
2790 for item: dict<number> in l
Bram Moolenaarfa103972022-09-29 19:14:42 +01002791 var d = {s: ''}
2792 d->extend(item)
Bram Moolenaara1c51952022-02-02 16:20:26 +00002793 endfor
2794 END
Bram Moolenaarfa103972022-09-29 19:14:42 +01002795 v9.CheckDefExecAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected dict<string> but got dict<number>')
Bram Moolenaarcc341812022-09-19 15:54:34 +01002796
2797 lines =<< trim END
2798 for a in range(3)
2799 while a > 3
2800 for b in range(2)
2801 while b < 0
2802 for c in range(5)
2803 while c > 6
2804 while c < 0
2805 for d in range(1)
2806 for e in range(3)
2807 while e > 3
2808 endwhile
2809 endfor
2810 endfor
2811 endwhile
2812 endwhile
2813 endfor
2814 endwhile
2815 endfor
2816 endwhile
2817 endfor
2818 END
2819 v9.CheckDefSuccess(lines)
2820
2821 v9.CheckDefFailure(['for x in range(3)'] + lines + ['endfor'], 'E1306:')
Yegappan Lakshmanan062bb6b2023-12-16 14:46:40 +01002822
2823 # Test for too many for loops
2824 lines =<< trim END
2825 vim9script
2826 def Foo()
2827 for a in range(1)
2828 for b in range(1)
2829 for c in range(1)
2830 for d in range(1)
2831 for e in range(1)
2832 for f in range(1)
2833 for g in range(1)
2834 for h in range(1)
2835 for i in range(1)
2836 for j in range(1)
2837 for k in range(1)
2838 endfor
2839 endfor
2840 endfor
2841 endfor
2842 endfor
2843 endfor
2844 endfor
2845 endfor
2846 endfor
2847 endfor
2848 endfor
2849 enddef
2850 defcompile
2851 END
2852 v9.CheckSourceFailure(lines, 'E1306: Loop nesting too deep', 11)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002853enddef
2854
Bram Moolenaarea870692020-12-02 14:24:30 +01002855def Test_for_loop_script_var()
2856 # cannot use s:var in a :def function
Bram Moolenaar62aec932022-01-29 21:45:34 +00002857 v9.CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1254:')
Bram Moolenaarea870692020-12-02 14:24:30 +01002858
2859 # can use s:var in Vim9 script, with or without s:
2860 var lines =<< trim END
2861 vim9script
2862 var total = 0
2863 for s:var in [1, 2, 3]
2864 total += s:var
2865 endfor
2866 assert_equal(6, total)
2867
2868 total = 0
2869 for var in [1, 2, 3]
2870 total += var
2871 endfor
2872 assert_equal(6, total)
2873 END
2874enddef
2875
Bram Moolenaar792f7862020-11-23 08:31:18 +01002876def Test_for_loop_unpack()
Bram Moolenaar792f7862020-11-23 08:31:18 +01002877 var lines =<< trim END
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002878 var result = []
2879 for [v1, v2] in [[1, 2], [3, 4]]
2880 result->add(v1)
2881 result->add(v2)
2882 endfor
2883 assert_equal([1, 2, 3, 4], result)
2884
2885 result = []
2886 for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2887 result->add(v1)
2888 result->add(v2)
2889 result->add(v3)
2890 endfor
2891 assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2892
2893 result = []
2894 for [&ts, &sw] in [[1, 2], [3, 4]]
2895 result->add(&ts)
2896 result->add(&sw)
2897 endfor
2898 assert_equal([1, 2, 3, 4], result)
2899
2900 var slist: list<string>
2901 for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
2902 slist->add($LOOPVAR)
2903 slist->add(@r)
2904 slist->add(v:errmsg)
2905 endfor
2906 assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
2907
2908 slist = []
2909 for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
2910 slist->add(g:globalvar)
2911 slist->add(b:bufvar)
2912 slist->add(w:winvar)
2913 slist->add(t:tabvar)
2914 endfor
2915 assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
Bram Moolenaarf6c177a2020-12-04 17:38:00 +01002916 unlet! g:globalvar b:bufvar w:winvar t:tabvar
Bram Moolenaarb777da92021-05-22 21:40:39 +02002917
2918 var res = []
2919 for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
2920 res->add(n)
2921 endfor
2922 assert_equal([2, 5], res)
Bram Moolenaar61efa162022-03-18 13:10:48 +00002923
2924 var text: list<string> = ["hello there", "goodbye now"]
2925 var splitted = ''
2926 for [first; next] in mapnew(text, (i, v) => split(v))
2927 splitted ..= string(first) .. string(next) .. '/'
2928 endfor
2929 assert_equal("'hello'['there']/'goodbye'['now']/", splitted)
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002930 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002931 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002932
2933 lines =<< trim END
Bram Moolenaar792f7862020-11-23 08:31:18 +01002934 for [v1, v2] in [[1, 2, 3], [3, 4]]
2935 echo v1 v2
2936 endfor
2937 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002938 v9.CheckDefExecFailure(lines, 'E710:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01002939
2940 lines =<< trim END
2941 for [v1, v2] in [[1], [3, 4]]
2942 echo v1 v2
2943 endfor
2944 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002945 v9.CheckDefExecFailure(lines, 'E711:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01002946
2947 lines =<< trim END
2948 for [v1, v1] in [[1, 2], [3, 4]]
2949 echo v1
2950 endfor
2951 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002952 v9.CheckDefExecFailure(lines, 'E1017:', 1)
Bram Moolenaar95e4dd82022-04-27 22:15:40 +01002953
2954 lines =<< trim END
2955 for [a, b] in g:listlist
2956 echo a
2957 endfor
2958 END
2959 g:listlist = [1, 2, 3]
2960 v9.CheckDefExecFailure(lines, 'E1140:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01002961enddef
2962
Bram Moolenaarc150c092021-02-13 15:02:46 +01002963def Test_for_loop_with_try_continue()
Bram Moolenaarf2253962021-04-13 20:53:13 +02002964 var lines =<< trim END
2965 var looped = 0
2966 var cleanup = 0
2967 for i in range(3)
2968 looped += 1
2969 try
2970 eval [][0]
2971 catch
2972 continue
2973 finally
2974 cleanup += 1
2975 endtry
2976 endfor
2977 assert_equal(3, looped)
2978 assert_equal(3, cleanup)
2979 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002980 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc150c092021-02-13 15:02:46 +01002981enddef
2982
rbtnnd895b1d2021-08-20 20:54:25 +02002983def Test_while_skipped_block()
2984 # test skipped blocks at outside of function
2985 var lines =<< trim END
2986 var result = []
2987 var n = 0
2988 if true
2989 n = 1
2990 while n < 3
2991 result += [n]
2992 n += 1
2993 endwhile
2994 else
2995 n = 3
2996 while n < 5
2997 result += [n]
2998 n += 1
2999 endwhile
3000 endif
3001 assert_equal([1, 2], result)
3002
3003 result = []
3004 if false
3005 n = 1
3006 while n < 3
3007 result += [n]
3008 n += 1
3009 endwhile
3010 else
3011 n = 3
3012 while n < 5
3013 result += [n]
3014 n += 1
3015 endwhile
3016 endif
3017 assert_equal([3, 4], result)
3018 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003019 v9.CheckDefAndScriptSuccess(lines)
rbtnnd895b1d2021-08-20 20:54:25 +02003020
3021 # test skipped blocks at inside of function
3022 lines =<< trim END
3023 def DefTrue()
3024 var result = []
3025 var n = 0
3026 if true
3027 n = 1
3028 while n < 3
3029 result += [n]
3030 n += 1
3031 endwhile
3032 else
3033 n = 3
3034 while n < 5
3035 result += [n]
3036 n += 1
3037 endwhile
3038 endif
3039 assert_equal([1, 2], result)
3040 enddef
3041 DefTrue()
3042
3043 def DefFalse()
3044 var result = []
3045 var n = 0
3046 if false
3047 n = 1
3048 while n < 3
3049 result += [n]
3050 n += 1
3051 endwhile
3052 else
3053 n = 3
3054 while n < 5
3055 result += [n]
3056 n += 1
3057 endwhile
3058 endif
3059 assert_equal([3, 4], result)
3060 enddef
3061 DefFalse()
3062 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003063 v9.CheckDefAndScriptSuccess(lines)
rbtnnd895b1d2021-08-20 20:54:25 +02003064enddef
3065
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003066def Test_while_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003067 var result = ''
3068 var cnt = 0
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003069 while cnt < 555
3070 if cnt == 3
3071 break
3072 endif
3073 cnt += 1
3074 if cnt == 2
3075 continue
3076 endif
3077 result ..= cnt .. '_'
3078 endwhile
3079 assert_equal('1_3_', result)
Bram Moolenaardee37dc2021-02-07 16:40:05 +01003080
3081 var s = ''
Bram Moolenaar4b3e1962021-03-18 21:37:55 +01003082 while s == 'x' # {comment}
Bram Moolenaardee37dc2021-02-07 16:40:05 +01003083 endwhile
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003084enddef
3085
Bram Moolenaar7a53f292021-11-22 18:31:02 +00003086def Test_while_loop_in_script()
3087 var lines =<< trim END
3088 vim9script
3089 var result = ''
3090 var cnt = 0
3091 while cnt < 3
3092 var s = 'v' .. cnt
3093 result ..= s
3094 cnt += 1
3095 endwhile
3096 assert_equal('v0v1v2', result)
3097 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003098 v9.CheckScriptSuccess(lines)
Bram Moolenaar7a53f292021-11-22 18:31:02 +00003099enddef
3100
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02003101def Test_while_loop_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00003102 v9.CheckDefFailure(['while xxx'], 'E1001:')
3103 v9.CheckDefFailure(['endwhile'], 'E588:')
3104 v9.CheckDefFailure(['continue'], 'E586:')
3105 v9.CheckDefFailure(['if true', 'continue'], 'E586:')
3106 v9.CheckDefFailure(['break'], 'E587:')
3107 v9.CheckDefFailure(['if true', 'break'], 'E587:')
3108 v9.CheckDefFailure(['while 1', 'echo 3'], 'E170:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01003109
3110 var lines =<< trim END
3111 var s = ''
3112 while s = ''
3113 endwhile
3114 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003115 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaarbd5da372020-03-31 23:13:10 +02003116enddef
3117
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01003118def Test_interrupt_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003119 var caught = false
3120 var x = 0
Bram Moolenaar97acfc72020-03-22 13:44:28 +01003121 try
3122 while 1
3123 x += 1
3124 if x == 100
3125 feedkeys("\<C-C>", 'Lt')
3126 endif
3127 endwhile
3128 catch
3129 caught = true
3130 assert_equal(100, x)
3131 endtry
3132 assert_true(caught, 'should have caught an exception')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02003133 # consume the CTRL-C
3134 getchar(0)
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01003135enddef
Bram Moolenaar20431c92020-03-20 18:39:46 +01003136
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003137def Test_automatic_line_continuation()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003138 var mylist = [
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003139 'one',
3140 'two',
3141 'three',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003142 ] # comment
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003143 assert_equal(['one', 'two', 'three'], mylist)
3144
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003145 var mydict = {
Bram Moolenaare0de1712020-12-02 17:36:54 +01003146 ['one']: 1,
3147 ['two']: 2,
3148 ['three']:
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003149 3,
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003150 } # comment
Bram Moolenaare0de1712020-12-02 17:36:54 +01003151 assert_equal({one: 1, two: 2, three: 3}, mydict)
3152 mydict = {
Bram Moolenaar2c330432020-04-13 14:41:35 +02003153 one: 1, # comment
3154 two: # comment
3155 2, # comment
3156 three: 3 # comment
3157 }
Bram Moolenaare0de1712020-12-02 17:36:54 +01003158 assert_equal({one: 1, two: 2, three: 3}, mydict)
3159 mydict = {
Bram Moolenaar2c330432020-04-13 14:41:35 +02003160 one: 1,
3161 two:
3162 2,
3163 three: 3
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003164 }
Bram Moolenaare0de1712020-12-02 17:36:54 +01003165 assert_equal({one: 1, two: 2, three: 3}, mydict)
Bram Moolenaare6085c52020-04-12 20:19:16 +02003166
3167 assert_equal(
3168 ['one', 'two', 'three'],
3169 split('one two three')
3170 )
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003171enddef
3172
Bram Moolenaar7a092242020-04-16 22:10:49 +02003173def Test_vim9_comment()
Bram Moolenaar62aec932022-01-29 21:45:34 +00003174 v9.CheckScriptSuccess([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003175 'vim9script',
3176 '# something',
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003177 '#something',
Bram Moolenaar3f74c0a2022-08-06 18:12:06 +01003178 '#{{something',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003179 ])
Bram Moolenaar3f74c0a2022-08-06 18:12:06 +01003180 v9.CheckScriptFailure([
3181 'vim9script',
3182 '#{something',
3183 ], 'E1170:')
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003184
Bram Moolenaarb18b4962022-09-02 21:55:50 +01003185 split Xv9cfile
Bram Moolenaar62aec932022-01-29 21:45:34 +00003186 v9.CheckScriptSuccess([
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003187 'vim9script',
3188 'edit #something',
3189 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003190 v9.CheckScriptSuccess([
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003191 'vim9script',
3192 'edit #{something',
3193 ])
3194 close
3195
Bram Moolenaar62aec932022-01-29 21:45:34 +00003196 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003197 'vim9script',
3198 ':# something',
3199 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003200 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003201 '# something',
3202 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003203 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003204 ':# something',
3205 ], 'E488:')
3206
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003207 { # block start
3208 } # block end
Bram Moolenaar62aec932022-01-29 21:45:34 +00003209 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003210 '{# comment',
3211 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003212 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003213 '{',
3214 '}# comment',
3215 ], 'E488:')
3216
3217 echo "yes" # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00003218 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003219 'echo "yes"# comment',
3220 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003221 v9.CheckScriptSuccess([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003222 'vim9script',
3223 'echo "yes" # something',
3224 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003225 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003226 'vim9script',
3227 'echo "yes"# something',
3228 ], 'E121:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003229 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003230 'vim9script',
3231 'echo# something',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003232 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003233 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003234 'echo "yes" # something',
3235 ], 'E121:')
3236
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003237 exe "echo" # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00003238 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003239 'exe "echo"# comment',
3240 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003241 v9.CheckScriptSuccess([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003242 'vim9script',
3243 'exe "echo" # something',
3244 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003245 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003246 'vim9script',
3247 'exe "echo"# something',
3248 ], 'E121:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003249 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003250 'vim9script',
3251 'exe# something',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003252 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003253 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003254 'exe "echo" # something',
3255 ], 'E121:')
3256
Bram Moolenaar62aec932022-01-29 21:45:34 +00003257 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003258 'try# comment',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003259 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003260 'catch',
3261 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003262 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003263 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003264 'vim9script',
3265 'try# comment',
3266 'echo "yes"',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003267 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003268 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003269 'try',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003270 ' throw#comment',
3271 'catch',
3272 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003273 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003274 v9.CheckDefFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003275 'try',
3276 ' throw "yes"#comment',
3277 'catch',
3278 'endtry',
3279 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003280 v9.CheckDefFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003281 'try',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003282 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003283 'catch# comment',
3284 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003285 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003286 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003287 'vim9script',
3288 'try',
3289 ' echo "yes"',
3290 'catch# comment',
3291 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003292 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003293 v9.CheckDefFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003294 'try',
3295 ' echo "yes"',
3296 'catch /pat/# comment',
3297 'endtry',
3298 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003299 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003300 'try',
3301 'echo "yes"',
3302 'catch',
3303 'endtry# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003304 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003305 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003306 'vim9script',
3307 'try',
3308 ' echo "yes"',
3309 'catch',
3310 'endtry# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003311 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003312
Bram Moolenaar62aec932022-01-29 21:45:34 +00003313 v9.CheckScriptSuccess([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003314 'vim9script',
3315 'hi # comment',
3316 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003317 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003318 'vim9script',
3319 'hi# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003320 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003321 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003322 'vim9script',
3323 'hi Search # comment',
3324 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003325 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003326 'vim9script',
3327 'hi Search# comment',
3328 ], 'E416:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003329 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003330 'vim9script',
3331 'hi link This Search # comment',
3332 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003333 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003334 'vim9script',
3335 'hi link This That# comment',
3336 ], 'E413:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003337 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003338 'vim9script',
3339 'hi clear This # comment',
3340 'hi clear # comment',
3341 ])
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003342 # not tested, because it doesn't give an error but a warning:
3343 # hi clear This# comment',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003344 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003345 'vim9script',
3346 'hi clear# comment',
3347 ], 'E416:')
3348
Bram Moolenaar62aec932022-01-29 21:45:34 +00003349 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003350 'vim9script',
3351 'hi Group term=bold',
3352 'match Group /todo/ # comment',
3353 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003354 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003355 'vim9script',
3356 'hi Group term=bold',
3357 'match Group /todo/# comment',
3358 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003359 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003360 'vim9script',
3361 'match # comment',
3362 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003363 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003364 'vim9script',
3365 'match# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003366 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003367 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003368 'vim9script',
3369 'match none # comment',
3370 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003371 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003372 'vim9script',
3373 'match none# comment',
3374 ], 'E475:')
3375
Bram Moolenaar62aec932022-01-29 21:45:34 +00003376 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003377 'vim9script',
3378 'menutrans clear # comment',
3379 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003380 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003381 'vim9script',
3382 'menutrans clear# comment text',
3383 ], 'E474:')
3384
Bram Moolenaar62aec932022-01-29 21:45:34 +00003385 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003386 'vim9script',
3387 'syntax clear # comment',
3388 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003389 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003390 'vim9script',
3391 'syntax clear# comment text',
3392 ], 'E28:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003393 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003394 'vim9script',
3395 'syntax keyword Word some',
3396 'syntax clear Word # comment',
3397 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003398 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003399 'vim9script',
3400 'syntax keyword Word some',
3401 'syntax clear Word# comment text',
3402 ], 'E28:')
3403
Bram Moolenaar62aec932022-01-29 21:45:34 +00003404 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003405 'vim9script',
3406 'syntax list # comment',
3407 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003408 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003409 'vim9script',
3410 'syntax list# comment text',
3411 ], 'E28:')
3412
Bram Moolenaar62aec932022-01-29 21:45:34 +00003413 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003414 'vim9script',
3415 'syntax match Word /pat/ oneline # comment',
3416 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003417 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003418 'vim9script',
3419 'syntax match Word /pat/ oneline# comment',
3420 ], 'E475:')
3421
Bram Moolenaar62aec932022-01-29 21:45:34 +00003422 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003423 'vim9script',
3424 'syntax keyword Word word # comm[ent',
3425 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003426 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003427 'vim9script',
3428 'syntax keyword Word word# comm[ent',
3429 ], 'E789:')
3430
Bram Moolenaar62aec932022-01-29 21:45:34 +00003431 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003432 'vim9script',
3433 'syntax match Word /pat/ # comment',
3434 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003435 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003436 'vim9script',
3437 'syntax match Word /pat/# comment',
3438 ], 'E402:')
3439
Bram Moolenaar62aec932022-01-29 21:45:34 +00003440 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003441 'vim9script',
3442 'syntax match Word /pat/ contains=Something # comment',
3443 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003444 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003445 'vim9script',
3446 'syntax match Word /pat/ contains=Something# comment',
3447 ], 'E475:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003448 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003449 'vim9script',
3450 'syntax match Word /pat/ contains= # comment',
3451 ], 'E406:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003452 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003453 'vim9script',
3454 'syntax match Word /pat/ contains=# comment',
3455 ], 'E475:')
3456
Bram Moolenaar62aec932022-01-29 21:45:34 +00003457 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003458 'vim9script',
3459 'syntax region Word start=/pat/ end=/pat/ # comment',
3460 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003461 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003462 'vim9script',
3463 'syntax region Word start=/pat/ end=/pat/# comment',
Bram Moolenaard032f342020-07-18 18:13:02 +02003464 ], 'E402:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02003465
Bram Moolenaar62aec932022-01-29 21:45:34 +00003466 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003467 'vim9script',
3468 'syntax sync # comment',
3469 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003470 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003471 'vim9script',
3472 'syntax sync# comment',
3473 ], 'E404:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003474 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003475 'vim9script',
3476 'syntax sync ccomment # comment',
3477 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003478 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003479 'vim9script',
3480 'syntax sync ccomment# comment',
3481 ], 'E404:')
3482
Bram Moolenaar62aec932022-01-29 21:45:34 +00003483 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003484 'vim9script',
3485 'syntax cluster Some contains=Word # comment',
3486 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003487 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003488 'vim9script',
3489 'syntax cluster Some contains=Word# comment',
3490 ], 'E475:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003491
Bram Moolenaar62aec932022-01-29 21:45:34 +00003492 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003493 'vim9script',
3494 'command Echo echo # comment',
3495 'command Echo # comment',
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003496 'delcommand Echo',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003497 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003498 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003499 'vim9script',
3500 'command Echo echo# comment',
3501 'Echo',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003502 ], 'E1144:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003503 delcommand Echo
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003504
3505 var curdir = getcwd()
Bram Moolenaar62aec932022-01-29 21:45:34 +00003506 v9.CheckScriptSuccess([
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003507 'command Echo cd " comment',
3508 'Echo',
3509 'delcommand Echo',
3510 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003511 v9.CheckScriptSuccess([
Bram Moolenaar090728a2020-12-20 15:43:31 +01003512 'vim9script',
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003513 'command Echo cd # comment',
3514 'Echo',
3515 'delcommand Echo',
3516 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003517 v9.CheckScriptFailure([
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003518 'vim9script',
3519 'command Echo cd " comment',
3520 'Echo',
3521 ], 'E344:')
3522 delcommand Echo
3523 chdir(curdir)
3524
Bram Moolenaar62aec932022-01-29 21:45:34 +00003525 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003526 'vim9script',
3527 'command Echo# comment',
3528 ], 'E182:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003529 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003530 'vim9script',
3531 'command Echo echo',
3532 'command Echo# comment',
3533 ], 'E182:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003534 delcommand Echo
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003535
Bram Moolenaar62aec932022-01-29 21:45:34 +00003536 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003537 'vim9script',
3538 'function # comment',
3539 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003540 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003541 'vim9script',
Bram Moolenaar98981072020-07-29 14:40:25 +02003542 'function " comment',
3543 ], 'E129:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003544 v9.CheckScriptFailure([
Bram Moolenaar98981072020-07-29 14:40:25 +02003545 'vim9script',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003546 'function# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003547 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003548 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003549 'vim9script',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003550 'import "./vim9.vim" as v9',
3551 'function v9.CheckScriptSuccess # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003552 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003553 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003554 'vim9script',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003555 'import "./vim9.vim" as v9',
3556 'function v9.CheckScriptSuccess# comment',
3557 ], 'E1048: Item not found in script: CheckScriptSuccess#')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003558
Bram Moolenaar62aec932022-01-29 21:45:34 +00003559 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003560 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003561 'func g:DeleteMeA()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003562 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003563 'delfunction g:DeleteMeA # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003564 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003565 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003566 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003567 'func g:DeleteMeB()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003568 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003569 'delfunction g:DeleteMeB# comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003570 ], 'E488:')
3571
Bram Moolenaar62aec932022-01-29 21:45:34 +00003572 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003573 'vim9script',
3574 'call execute("ls") # comment',
3575 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003576 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003577 'vim9script',
3578 'call execute("ls")# comment',
3579 ], 'E488:')
Bram Moolenaare7e48382020-07-22 18:17:08 +02003580
Bram Moolenaar62aec932022-01-29 21:45:34 +00003581 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003582 'def Test() " comment',
3583 'enddef',
3584 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003585 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003586 'vim9script',
3587 'def Test() " comment',
3588 'enddef',
3589 ], 'E488:')
3590
Bram Moolenaar62aec932022-01-29 21:45:34 +00003591 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003592 'func Test() " comment',
3593 'endfunc',
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003594 'delfunc Test',
Bram Moolenaare7e48382020-07-22 18:17:08 +02003595 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003596 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003597 'vim9script',
3598 'func Test() " comment',
3599 'endfunc',
Bram Moolenaar98981072020-07-29 14:40:25 +02003600 ])
Bram Moolenaare7e48382020-07-22 18:17:08 +02003601
Bram Moolenaar62aec932022-01-29 21:45:34 +00003602 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003603 'def Test() # comment',
3604 'enddef',
3605 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003606 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003607 'func Test() # comment',
3608 'endfunc',
3609 ], 'E488:')
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003610
3611 var lines =<< trim END
3612 vim9script
3613 syn region Text
3614 \ start='foo'
3615 #\ comment
3616 \ end='bar'
Bram Moolenaar5072b472021-06-03 21:56:10 +02003617 syn region Text start='foo'
3618 #\ comment
3619 \ end='bar'
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003620 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003621 v9.CheckScriptSuccess(lines)
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003622
3623 lines =<< trim END
3624 vim9script
3625 syn region Text
3626 \ start='foo'
3627 "\ comment
3628 \ end='bar'
3629 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003630 v9.CheckScriptFailure(lines, 'E399:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003631enddef
3632
3633def Test_vim9_comment_gui()
3634 CheckCanRunGui
3635
Bram Moolenaar62aec932022-01-29 21:45:34 +00003636 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003637 'vim9script',
3638 'gui#comment'
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003639 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003640 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003641 'vim9script',
3642 'gui -f#comment'
Bram Moolenaarb8bd2e62021-08-21 17:13:14 +02003643 ], 'E194:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02003644enddef
3645
Bram Moolenaara26b9702020-04-18 19:53:28 +02003646def Test_vim9_comment_not_compiled()
Bram Moolenaar67979662020-06-20 22:50:47 +02003647 au TabEnter *.vim g:entered = 1
3648 au TabEnter *.x g:entered = 2
Bram Moolenaara26b9702020-04-18 19:53:28 +02003649
3650 edit test.vim
3651 doautocmd TabEnter #comment
3652 assert_equal(1, g:entered)
3653
3654 doautocmd TabEnter f.x
3655 assert_equal(2, g:entered)
3656
3657 g:entered = 0
3658 doautocmd TabEnter f.x #comment
3659 assert_equal(2, g:entered)
3660
3661 assert_fails('doautocmd Syntax#comment', 'E216:')
3662
3663 au! TabEnter
3664 unlet g:entered
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003665
Bram Moolenaar62aec932022-01-29 21:45:34 +00003666 v9.CheckScriptSuccess([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003667 'vim9script',
Bram Moolenaar67979662020-06-20 22:50:47 +02003668 'g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003669 'b:var = 456',
3670 'w:var = 777',
3671 't:var = 888',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003672 'unlet g:var w:var # something',
3673 ])
3674
Bram Moolenaar62aec932022-01-29 21:45:34 +00003675 v9.CheckScriptFailure([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003676 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003677 'let var = 123',
3678 ], 'E1126: Cannot use :let in Vim9 script')
3679
Bram Moolenaar62aec932022-01-29 21:45:34 +00003680 v9.CheckScriptFailure([
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003681 'vim9script',
3682 'var g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003683 ], 'E1016: Cannot declare a global variable:')
3684
Bram Moolenaar62aec932022-01-29 21:45:34 +00003685 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003686 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003687 'var b:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003688 ], 'E1016: Cannot declare a buffer variable:')
3689
Bram Moolenaar62aec932022-01-29 21:45:34 +00003690 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003691 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003692 'var w:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003693 ], 'E1016: Cannot declare a window variable:')
3694
Bram Moolenaar62aec932022-01-29 21:45:34 +00003695 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003696 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003697 'var t:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003698 ], 'E1016: Cannot declare a tab variable:')
3699
Bram Moolenaar62aec932022-01-29 21:45:34 +00003700 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003701 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003702 'var v:version = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003703 ], 'E1016: Cannot declare a v: variable:')
3704
Bram Moolenaar62aec932022-01-29 21:45:34 +00003705 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003706 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003707 'var $VARIABLE = "text"',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003708 ], 'E1016: Cannot declare an environment variable:')
Bram Moolenaar67979662020-06-20 22:50:47 +02003709
Bram Moolenaar62aec932022-01-29 21:45:34 +00003710 v9.CheckScriptFailure([
Bram Moolenaar67979662020-06-20 22:50:47 +02003711 'vim9script',
3712 'g:var = 123',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003713 'unlet g:var# comment1',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003714 ], 'E108:')
3715
Bram Moolenaar62aec932022-01-29 21:45:34 +00003716 v9.CheckScriptFailure([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003717 'let g:var = 123',
3718 'unlet g:var # something',
3719 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003720
Bram Moolenaar62aec932022-01-29 21:45:34 +00003721 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003722 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003723 'if 1 # comment2',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003724 ' echo "yes"',
3725 'elseif 2 #comment',
3726 ' echo "no"',
3727 'endif',
3728 ])
3729
Bram Moolenaar62aec932022-01-29 21:45:34 +00003730 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003731 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003732 'if 1# comment3',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003733 ' echo "yes"',
3734 'endif',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003735 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003736
Bram Moolenaar62aec932022-01-29 21:45:34 +00003737 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003738 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003739 'if 0 # comment4',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003740 ' echo "yes"',
3741 'elseif 2#comment',
3742 ' echo "no"',
3743 'endif',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003744 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003745
Bram Moolenaar62aec932022-01-29 21:45:34 +00003746 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003747 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003748 'var v = 1 # comment5',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003749 ])
3750
Bram Moolenaar62aec932022-01-29 21:45:34 +00003751 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003752 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003753 'var v = 1# comment6',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003754 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003755
Bram Moolenaar62aec932022-01-29 21:45:34 +00003756 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003757 'vim9script',
Bram Moolenaar2984ed32022-08-20 14:51:17 +01003758 'new',
Bram Moolenaard2c61702020-09-06 15:58:36 +02003759 'setline(1, ["# define pat", "last"])',
Bram Moolenaardf069ee2020-06-22 23:02:51 +02003760 ':$',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003761 'dsearch /pat/ #comment',
3762 'bwipe!',
3763 ])
3764
Bram Moolenaar62aec932022-01-29 21:45:34 +00003765 v9.CheckScriptFailure([
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003766 'vim9script',
Bram Moolenaar2984ed32022-08-20 14:51:17 +01003767 'new',
Bram Moolenaard2c61702020-09-06 15:58:36 +02003768 'setline(1, ["# define pat", "last"])',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003769 ':$',
3770 'dsearch /pat/#comment',
3771 'bwipe!',
3772 ], 'E488:')
3773
Bram Moolenaar62aec932022-01-29 21:45:34 +00003774 v9.CheckScriptFailure([
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003775 'vim9script',
3776 'func! SomeFunc()',
3777 ], 'E477:')
Bram Moolenaara26b9702020-04-18 19:53:28 +02003778enddef
3779
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003780def Test_finish()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003781 var lines =<< trim END
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003782 vim9script
Bram Moolenaar67979662020-06-20 22:50:47 +02003783 g:res = 'one'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003784 if v:false | finish | endif
Bram Moolenaar67979662020-06-20 22:50:47 +02003785 g:res = 'two'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003786 finish
Bram Moolenaar67979662020-06-20 22:50:47 +02003787 g:res = 'three'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003788 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003789 writefile(lines, 'Xfinished', 'D')
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003790 source Xfinished
3791 assert_equal('two', g:res)
3792
3793 unlet g:res
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003794enddef
3795
Bram Moolenaara5d00772020-05-14 23:20:55 +02003796def Test_forward_declaration()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003797 var lines =<< trim END
Bram Moolenaara5d00772020-05-14 23:20:55 +02003798 vim9script
Bram Moolenaara5d00772020-05-14 23:20:55 +02003799 def GetValue(): string
3800 return theVal
3801 enddef
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003802 var theVal = 'something'
Bram Moolenaar822ba242020-05-24 23:00:18 +02003803 g:initVal = GetValue()
Bram Moolenaara5d00772020-05-14 23:20:55 +02003804 theVal = 'else'
3805 g:laterVal = GetValue()
3806 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003807 writefile(lines, 'Xforward', 'D')
Bram Moolenaara5d00772020-05-14 23:20:55 +02003808 source Xforward
3809 assert_equal('something', g:initVal)
3810 assert_equal('else', g:laterVal)
3811
3812 unlet g:initVal
3813 unlet g:laterVal
Bram Moolenaara5d00772020-05-14 23:20:55 +02003814enddef
3815
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003816def Test_declare_script_var_in_func()
Bram Moolenaare535db82021-03-31 21:07:24 +02003817 var lines =<< trim END
3818 vim9script
3819 func Declare()
3820 let s:local = 123
3821 endfunc
3822 Declare()
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003823 END
3824 v9.CheckScriptFailure(lines, 'E1269:')
3825enddef
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00003826
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003827def Test_lock_script_var()
3828 var lines =<< trim END
3829 vim9script
3830 var local = 123
Bram Moolenaare535db82021-03-31 21:07:24 +02003831 assert_equal(123, local)
3832
3833 var error: string
3834 try
3835 local = 'asdf'
3836 catch
3837 error = v:exception
3838 endtry
3839 assert_match('E1012: Type mismatch; expected number but got string', error)
3840
3841 lockvar local
3842 try
3843 local = 999
3844 catch
3845 error = v:exception
3846 endtry
3847 assert_match('E741: Value is locked: local', error)
3848 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003849 v9.CheckScriptSuccess(lines)
Bram Moolenaare535db82021-03-31 21:07:24 +02003850enddef
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00003851
Bram Moolenaare535db82021-03-31 21:07:24 +02003852
Bram Moolenaar7d699702020-08-14 20:52:28 +02003853func Test_vim9script_not_global()
3854 " check that items defined in Vim9 script are script-local, not global
3855 let vim9lines =<< trim END
3856 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003857 var name = 'local'
Bram Moolenaar7d699702020-08-14 20:52:28 +02003858 func TheFunc()
3859 echo 'local'
3860 endfunc
3861 def DefFunc()
3862 echo 'local'
3863 enddef
3864 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003865 call writefile(vim9lines, 'Xvim9script.vim', 'D')
Bram Moolenaar7d699702020-08-14 20:52:28 +02003866 source Xvim9script.vim
3867 try
3868 echo g:var
3869 assert_report('did not fail')
3870 catch /E121:/
3871 " caught
3872 endtry
3873 try
3874 call TheFunc()
3875 assert_report('did not fail')
3876 catch /E117:/
3877 " caught
3878 endtry
3879 try
3880 call DefFunc()
3881 assert_report('did not fail')
3882 catch /E117:/
3883 " caught
3884 endtry
Bram Moolenaar7d699702020-08-14 20:52:28 +02003885endfunc
3886
Bram Moolenaareeb27bf2020-07-04 17:39:10 +02003887def Test_vim9_copen()
3888 # this was giving an error for setting w:quickfix_title
3889 copen
3890 quit
3891enddef
3892
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02003893def Test_script_var_in_autocmd()
3894 # using a script variable from an autocommand, defined in a :def function in a
3895 # legacy Vim script, cannot check the variable type.
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003896 var lines =<< trim END
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02003897 let s:counter = 1
3898 def s:Func()
3899 au! CursorHold
3900 au CursorHold * s:counter += 1
3901 enddef
3902 call s:Func()
3903 doau CursorHold
3904 call assert_equal(2, s:counter)
3905 au! CursorHold
3906 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003907 v9.CheckScriptSuccess(lines)
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02003908enddef
3909
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003910def Test_error_in_autoload_script()
3911 var save_rtp = &rtp
3912 var dir = getcwd() .. '/Xruntime'
3913 &rtp = dir
Bram Moolenaardd674772022-09-15 22:26:18 +01003914 mkdir(dir .. '/autoload', 'pR')
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003915
3916 var lines =<< trim END
3917 vim9script noclear
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003918 export def Autoloaded()
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003919 enddef
3920 def Broken()
3921 var x: any = ''
3922 eval x != 0
3923 enddef
3924 Broken()
3925 END
3926 writefile(lines, dir .. '/autoload/script.vim')
3927
3928 lines =<< trim END
3929 vim9script
3930 def CallAutoloaded()
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003931 script#Autoloaded()
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003932 enddef
3933
3934 function Legacy()
3935 try
3936 call s:CallAutoloaded()
3937 catch
3938 call assert_match('E1030: Using a String as a Number', v:exception)
3939 endtry
3940 endfunction
3941
3942 Legacy()
3943 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003944 v9.CheckScriptSuccess(lines)
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003945
3946 &rtp = save_rtp
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003947enddef
3948
Bram Moolenaar6809ff92022-07-26 15:10:56 +01003949def Test_error_in_autoload_script_foldexpr()
3950 var save_rtp = &rtp
Bram Moolenaardd674772022-09-15 22:26:18 +01003951 mkdir('Xvim/autoload', 'pR')
Bram Moolenaar6809ff92022-07-26 15:10:56 +01003952 &runtimepath = 'Xvim'
3953
3954 var lines =<< trim END
3955 vim9script
3956 eval [][0]
3957 echomsg 'no error'
3958 END
3959 lines->writefile('Xvim/autoload/script.vim')
3960
3961 lines =<< trim END
3962 vim9script
3963 import autoload 'script.vim'
3964 &foldmethod = 'expr'
3965 &foldexpr = 'script.Func()'
3966 redraw
3967 END
3968 v9.CheckScriptFailure(lines, 'E684: List index out of range: 0')
Bram Moolenaar6809ff92022-07-26 15:10:56 +01003969enddef
3970
Bram Moolenaare3d46852020-08-29 13:39:17 +02003971def Test_invalid_sid()
3972 assert_fails('func <SNR>1234_func', 'E123:')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02003973
Bram Moolenaar62aec932022-01-29 21:45:34 +00003974 if g:RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
Bram Moolenaard2c61702020-09-06 15:58:36 +02003975 assert_equal([], readfile('Xdidit'))
Bram Moolenaare3d46852020-08-29 13:39:17 +02003976 endif
3977 delete('Xdidit')
3978enddef
3979
Bram Moolenaar9ec70262020-12-09 17:16:59 +01003980def Test_restoring_cpo()
Bram Moolenaardd674772022-09-15 22:26:18 +01003981 writefile(['vim9script', 'set nocp'], 'Xsourced', 'D')
3982 writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003983 if g:RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
Bram Moolenaar9ec70262020-12-09 17:16:59 +01003984 assert_equal(['done'], readfile('Xdone'))
3985 endif
Bram Moolenaar090728a2020-12-20 15:43:31 +01003986 delete('Xdone')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003987
Bram Moolenaardd674772022-09-15 22:26:18 +01003988 writefile(['vim9script', 'g:cpoval = &cpo'], 'XanotherScript', 'D')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003989 set cpo=aABceFsMny>
3990 edit XanotherScript
3991 so %
3992 assert_equal('aABceFsMny>', &cpo)
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003993 assert_equal('aABceFs', g:cpoval)
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003994 :1del
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003995 setline(1, 'let g:cpoval = &cpo')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003996 w
3997 so %
3998 assert_equal('aABceFsMny>', &cpo)
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003999 assert_equal('aABceFsMny>', g:cpoval)
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004000
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004001 set cpo&vim
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004002 unlet g:cpoval
4003
4004 if has('unix')
4005 # 'cpo' is not restored in main vimrc
4006 var save_HOME = $HOME
4007 $HOME = getcwd() .. '/Xhome'
Bram Moolenaardd674772022-09-15 22:26:18 +01004008 mkdir('Xhome', 'R')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004009 var lines =<< trim END
4010 vim9script
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004011 writefile(['before: ' .. &cpo], 'Xrporesult')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004012 set cpo+=M
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004013 writefile(['after: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004014 END
4015 writefile(lines, 'Xhome/.vimrc')
4016
4017 lines =<< trim END
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004018 call writefile(['later: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004019 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004020 writefile(lines, 'Xlegacy', 'D')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004021
4022 lines =<< trim END
4023 vim9script
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004024 call writefile(['vim9: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004025 qa
4026 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004027 writefile(lines, 'Xvim9', 'D')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004028
Bram Moolenaar62aec932022-01-29 21:45:34 +00004029 var cmd = g:GetVimCommand() .. " -S Xlegacy -S Xvim9"
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004030 cmd = substitute(cmd, '-u NONE', '', '')
4031 exe "silent !" .. cmd
4032
4033 assert_equal([
4034 'before: aABceFs',
4035 'after: aABceFsM',
4036 'later: aABceFsM',
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004037 'vim9: aABceFs'], readfile('Xrporesult'))
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004038
4039 $HOME = save_HOME
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004040 delete('Xrporesult')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004041 endif
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004042enddef
4043
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004044" Use :function so we can use Check commands
4045func Test_no_redraw_when_restoring_cpo()
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004046 CheckScreendump
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004047 CheckFeature timers
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004048 call Run_test_no_redraw_when_restoring_cpo()
4049endfunc
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004050
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004051def Run_test_no_redraw_when_restoring_cpo()
4052 var lines =<< trim END
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004053 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00004054 export def Func()
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004055 enddef
4056 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004057 mkdir('Xnordir/autoload', 'pR')
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01004058 writefile(lines, 'Xnordir/autoload/script.vim')
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004059
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004060 lines =<< trim END
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004061 vim9script
4062 set cpo+=M
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01004063 exe 'set rtp^=' .. getcwd() .. '/Xnordir'
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00004064 au CmdlineEnter : ++once timer_start(0, (_) => script#Func())
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004065 setline(1, 'some text')
4066 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004067 writefile(lines, 'XTest_redraw_cpo', 'D')
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004068 var buf = g:RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
4069 term_sendkeys(buf, "V:")
4070 g:VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004071
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004072 # clean up
4073 term_sendkeys(buf, "\<Esc>u")
4074 g:StopVimInTerminal(buf)
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004075enddef
4076
4077func Test_reject_declaration()
4078 CheckScreendump
4079 call Run_test_reject_declaration()
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004080endfunc
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004081
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004082def Run_test_reject_declaration()
4083 var buf = g:RunVimInTerminal('', {'rows': 6})
4084 term_sendkeys(buf, ":vim9cmd var x: number\<CR>")
Bram Moolenaar330a3882022-03-05 11:05:57 +00004085 g:VerifyScreenDump(buf, 'Test_vim9_reject_declaration_1', {})
4086 term_sendkeys(buf, ":\<CR>")
4087 term_sendkeys(buf, ":vim9cmd g:foo = 123 | echo g:foo\<CR>")
4088 g:VerifyScreenDump(buf, 'Test_vim9_reject_declaration_2', {})
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004089
4090 # clean up
4091 g:StopVimInTerminal(buf)
4092enddef
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004093
Bram Moolenaar204852a2022-03-05 12:56:44 +00004094def Test_minimal_command_name_length()
4095 var names = [
4096 'cons',
4097 'brea',
4098 'cat',
4099 'catc',
4100 'con',
Bram Moolenaarb2175222022-03-05 20:24:41 +00004101 'cont',
4102 'conti',
4103 'contin',
4104 'continu',
Bram Moolenaar204852a2022-03-05 12:56:44 +00004105 'el',
4106 'els',
4107 'elsei',
4108 'endfo',
4109 'en',
4110 'end',
4111 'endi',
4112 'endw',
4113 'endt',
4114 'endtr',
Bram Moolenaarb2175222022-03-05 20:24:41 +00004115 'exp',
4116 'expo',
4117 'expor',
Bram Moolenaar204852a2022-03-05 12:56:44 +00004118 'fina',
4119 'finall',
Bram Moolenaard523c7b2022-03-06 14:51:22 +00004120 'fini',
4121 'finis',
Bram Moolenaarb2175222022-03-05 20:24:41 +00004122 'imp',
4123 'impo',
4124 'impor',
4125 'retu',
4126 'retur',
Bram Moolenaar204852a2022-03-05 12:56:44 +00004127 'th',
4128 'thr',
4129 'thro',
4130 'wh',
4131 'whi',
4132 'whil',
4133 ]
4134 for name in names
4135 v9.CheckDefAndScriptFailure([name .. ' '], 'E1065:')
4136 endfor
Bram Moolenaarb2175222022-03-05 20:24:41 +00004137
4138 var lines =<< trim END
4139 vim9script
4140 def SomeFunc()
4141 endd
4142 END
4143 v9.CheckScriptFailure(lines, 'E1065:')
4144 lines =<< trim END
4145 vim9script
4146 def SomeFunc()
4147 endde
4148 END
4149 v9.CheckScriptFailure(lines, 'E1065:')
Bram Moolenaar204852a2022-03-05 12:56:44 +00004150enddef
4151
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004152def Test_unset_any_variable()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004153 var lines =<< trim END
4154 var name: any
4155 assert_equal(0, name)
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004156 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004157 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004158enddef
4159
Bram Moolenaar7e9210e2020-09-25 23:12:51 +02004160func Test_define_func_at_command_line()
Bram Moolenaar58dbef32020-09-25 22:13:05 +02004161 CheckRunVimInTerminal
4162
Bram Moolenaar7e9210e2020-09-25 23:12:51 +02004163 " call indirectly to avoid compilation error for missing functions
4164 call Run_Test_define_func_at_command_line()
4165endfunc
4166
4167def Run_Test_define_func_at_command_line()
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004168 # run in a separate Vim instance to avoid the script context
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004169 var lines =<< trim END
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004170 func CheckAndQuit()
4171 call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
4172 call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
4173 endfunc
4174 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004175 writefile([''], 'Xdidcmd', 'D')
4176 writefile(lines, 'XcallFunc', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00004177 var buf = g:RunVimInTerminal('-S XcallFunc', {rows: 6})
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004178 # define Afunc() on the command line
4179 term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
4180 term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004181 g:WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004182
Bram Moolenaar62aec932022-01-29 21:45:34 +00004183 call g:StopVimInTerminal(buf)
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004184enddef
4185
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004186def Test_script_var_scope()
4187 var lines =<< trim END
4188 vim9script
4189 if true
4190 if true
4191 var one = 'one'
4192 echo one
4193 endif
4194 echo one
4195 endif
4196 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004197 v9.CheckScriptFailure(lines, 'E121:', 7)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004198
4199 lines =<< trim END
4200 vim9script
4201 if true
4202 if false
4203 var one = 'one'
4204 echo one
4205 else
4206 var one = 'one'
4207 echo one
4208 endif
4209 echo one
4210 endif
4211 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004212 v9.CheckScriptFailure(lines, 'E121:', 10)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004213
4214 lines =<< trim END
4215 vim9script
4216 while true
4217 var one = 'one'
4218 echo one
4219 break
4220 endwhile
4221 echo one
4222 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004223 v9.CheckScriptFailure(lines, 'E121:', 7)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004224
4225 lines =<< trim END
4226 vim9script
4227 for i in range(1)
4228 var one = 'one'
4229 echo one
4230 endfor
4231 echo one
4232 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004233 v9.CheckScriptFailure(lines, 'E121:', 6)
Bram Moolenaar9becdf22020-10-10 21:33:48 +02004234
4235 lines =<< trim END
4236 vim9script
4237 {
4238 var one = 'one'
4239 assert_equal('one', one)
4240 }
4241 assert_false(exists('one'))
4242 assert_false(exists('s:one'))
4243 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004244 v9.CheckScriptSuccess(lines)
Bram Moolenaar9becdf22020-10-10 21:33:48 +02004245
4246 lines =<< trim END
4247 vim9script
4248 {
4249 var one = 'one'
4250 echo one
4251 }
4252 echo one
4253 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004254 v9.CheckScriptFailure(lines, 'E121:', 6)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004255enddef
4256
Bram Moolenaar352134b2020-10-17 22:04:08 +02004257def Test_catch_exception_in_callback()
4258 var lines =<< trim END
4259 vim9script
Bram Moolenaar2a389082021-04-09 20:24:31 +02004260 def Callback(...l: list<any>)
Bram Moolenaar352134b2020-10-17 22:04:08 +02004261 try
4262 var x: string
4263 var y: string
4264 # this error should be caught with CHECKLEN
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +00004265 var sl = ['']
4266 [x, y] = sl
Bram Moolenaar352134b2020-10-17 22:04:08 +02004267 catch
4268 g:caught = 'yes'
4269 endtry
4270 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01004271 popup_menu('popup', {callback: Callback})
Bram Moolenaar352134b2020-10-17 22:04:08 +02004272 feedkeys("\r", 'xt')
4273 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004274 v9.CheckScriptSuccess(lines)
Bram Moolenaar352134b2020-10-17 22:04:08 +02004275
4276 unlet g:caught
4277enddef
4278
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004279def Test_no_unknown_error_after_error()
4280 if !has('unix') || !has('job')
4281 throw 'Skipped: not unix of missing +job feature'
4282 endif
Bram Moolenaarb16ff292021-09-26 20:14:39 +01004283 # FIXME: this check should not be needed
4284 if has('win32')
4285 throw 'Skipped: does not work on MS-Windows'
4286 endif
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004287 var lines =<< trim END
4288 vim9script
4289 var source: list<number>
Bram Moolenaar2a389082021-04-09 20:24:31 +02004290 def Out_cb(...l: list<any>)
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004291 eval [][0]
4292 enddef
Bram Moolenaar2a389082021-04-09 20:24:31 +02004293 def Exit_cb(...l: list<any>)
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004294 sleep 1m
Bram Moolenaar23d44492022-05-04 16:24:57 +01004295 g:did_call_exit_cb = true
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004296 source += l
4297 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01004298 var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
Bram Moolenaar6f17a3f2020-12-21 18:11:24 +01004299 while job_status(myjob) == 'run'
4300 sleep 10m
4301 endwhile
Bram Moolenaar206c2a62021-01-31 14:04:44 +01004302 # wait for Exit_cb() to be called
Bram Moolenaar23d44492022-05-04 16:24:57 +01004303 for x in range(100)
4304 if exists('g:did_call_exit_cb')
4305 unlet g:did_call_exit_cb
4306 break
4307 endif
4308 sleep 10m
4309 endfor
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004310 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004311 writefile(lines, 'Xdef', 'D')
Yee Cheng Chin69a8bb82022-11-06 12:25:47 +00004312 # Either the exit or out callback is called first, accept them in any order
4313 assert_fails('so Xdef', ['E684:\|E1012:', 'E1012:\|E684:'])
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004314enddef
4315
Bram Moolenaar4324d872020-12-01 20:12:24 +01004316def InvokeNormal()
4317 exe "norm! :m+1\r"
4318enddef
4319
4320def Test_invoke_normal_in_visual_mode()
4321 xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
4322 new
4323 setline(1, ['aaa', 'bbb'])
4324 feedkeys("V\<F3>", 'xt')
4325 assert_equal(['bbb', 'aaa'], getline(1, 2))
4326 xunmap <F3>
4327enddef
4328
Bram Moolenaarb5b94802020-12-13 17:50:20 +01004329def Test_white_space_after_command()
4330 var lines =<< trim END
4331 exit_cb: Func})
4332 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004333 v9.CheckDefAndScriptFailure(lines, 'E1144:', 1)
Bram Moolenaarf8103f22020-12-25 17:36:27 +01004334
4335 lines =<< trim END
4336 e#
4337 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004338 v9.CheckDefAndScriptFailure(lines, 'E1144:', 1)
Bram Moolenaarb5b94802020-12-13 17:50:20 +01004339enddef
4340
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004341def Test_script_var_gone_when_sourced_twice()
4342 var lines =<< trim END
4343 vim9script
4344 if exists('g:guard')
4345 finish
4346 endif
4347 g:guard = 1
4348 var name = 'thename'
4349 def g:GetName(): string
4350 return name
4351 enddef
4352 def g:SetName(arg: string)
4353 name = arg
4354 enddef
4355 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004356 writefile(lines, 'XscriptTwice.vim', 'D')
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004357 so XscriptTwice.vim
4358 assert_equal('thename', g:GetName())
4359 g:SetName('newname')
4360 assert_equal('newname', g:GetName())
4361 so XscriptTwice.vim
4362 assert_fails('call g:GetName()', 'E1149:')
4363 assert_fails('call g:SetName("x")', 'E1149:')
4364
4365 delfunc g:GetName
4366 delfunc g:SetName
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004367 unlet g:guard
4368enddef
4369
Bram Moolenaar10b94212021-02-19 21:42:57 +01004370def Test_unsupported_commands()
4371 var lines =<< trim END
4372 ka
4373 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004374 v9.CheckDefAndScriptFailure(lines, ['E476:', 'E492:'])
Bram Moolenaar10b94212021-02-19 21:42:57 +01004375
4376 lines =<< trim END
Bram Moolenaarada1d872021-02-20 08:16:51 +01004377 :1ka
4378 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004379 v9.CheckDefAndScriptFailure(lines, ['E476:', 'E492:'])
Bram Moolenaarada1d872021-02-20 08:16:51 +01004380
4381 lines =<< trim END
Yegappan Lakshmanan885de442022-04-23 10:51:14 +01004382 :k a
4383 END
4384 v9.CheckDefAndScriptFailure(lines, 'E1100:')
4385
4386 lines =<< trim END
4387 :1k a
4388 END
4389 v9.CheckDefAndScriptFailure(lines, 'E481:')
4390
4391 lines =<< trim END
Bram Moolenaar10b94212021-02-19 21:42:57 +01004392 t
4393 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004394 v9.CheckDefAndScriptFailure(lines, 'E1100:')
Bram Moolenaar10b94212021-02-19 21:42:57 +01004395
4396 lines =<< trim END
4397 x
4398 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004399 v9.CheckDefAndScriptFailure(lines, 'E1100:')
Bram Moolenaar10b94212021-02-19 21:42:57 +01004400
4401 lines =<< trim END
4402 xit
4403 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004404 v9.CheckDefAndScriptFailure(lines, 'E1100:')
4405
4406 lines =<< trim END
4407 Print
4408 END
4409 v9.CheckDefAndScriptFailure(lines, ['E476: Invalid command: Print', 'E492: Not an editor command: Print'])
4410
4411 lines =<< trim END
4412 mode 4
4413 END
4414 v9.CheckDefAndScriptFailure(lines, ['E476: Invalid command: mode 4', 'E492: Not an editor command: mode 4'])
Bram Moolenaar10b94212021-02-19 21:42:57 +01004415enddef
4416
Bram Moolenaarc70fe462021-04-17 17:59:19 +02004417def Test_mapping_line_number()
4418 var lines =<< trim END
4419 vim9script
4420 def g:FuncA()
4421 # Some comment
4422 FuncB(0)
4423 enddef
4424 # Some comment
4425 def FuncB(
4426 # Some comment
4427 n: number
4428 )
4429 exe 'nno '
4430 # Some comment
4431 .. '<F3> a'
4432 .. 'b'
4433 .. 'c'
4434 enddef
4435 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004436 v9.CheckScriptSuccess(lines)
Bram Moolenaarc70fe462021-04-17 17:59:19 +02004437 var res = execute('verbose nmap <F3>')
4438 assert_match('No mapping found', res)
4439
4440 g:FuncA()
4441 res = execute('verbose nmap <F3>')
4442 assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
4443
4444 nunmap <F3>
4445 delfunc g:FuncA
4446enddef
4447
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004448def Test_option_set()
4449 # legacy script allows for white space
4450 var lines =<< trim END
4451 set foldlevel =11
4452 call assert_equal(11, &foldlevel)
4453 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004454 v9.CheckScriptSuccess(lines)
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004455
4456 set foldlevel
4457 set foldlevel=12
4458 assert_equal(12, &foldlevel)
4459 set foldlevel+=2
4460 assert_equal(14, &foldlevel)
4461 set foldlevel-=3
4462 assert_equal(11, &foldlevel)
4463
4464 lines =<< trim END
4465 set foldlevel =1
4466 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004467 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004468
4469 lines =<< trim END
4470 set foldlevel +=1
4471 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004472 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004473
4474 lines =<< trim END
4475 set foldlevel ^=1
4476 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004477 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004478
4479 lines =<< trim END
4480 set foldlevel -=1
4481 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004482 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004483
4484 set foldlevel&
4485enddef
4486
LemonBoy32f34612023-09-02 21:52:05 +02004487def Test_option_set_line_number()
4488 var lines =<< trim END
4489 vim9script
4490 # line2
4491 # line3
4492 def F()
4493 # line5
4494 &foldlevel = -128
4495 enddef
4496 F()
4497 END
4498 v9.CheckScriptSuccess(lines)
4499
4500 var res = execute('verbose set foldlevel')
4501 assert_match(' foldlevel.*Last set from .*XScriptSuccess\d\+ line 6', res)
4502enddef
4503
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004504def Test_option_modifier()
Bram Moolenaar1594f312021-07-08 16:40:13 +02004505 # legacy script allows for white space
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004506 var lines =<< trim END
4507 set hlsearch & hlsearch !
4508 call assert_equal(1, &hlsearch)
4509 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004510 v9.CheckScriptSuccess(lines)
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004511
Bram Moolenaar1594f312021-07-08 16:40:13 +02004512 set hlsearch
4513 set hlsearch!
4514 assert_equal(false, &hlsearch)
4515
4516 set hlsearch
4517 set hlsearch&
4518 assert_equal(false, &hlsearch)
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004519
4520 lines =<< trim END
Bram Moolenaar1594f312021-07-08 16:40:13 +02004521 set hlsearch &
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004522 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004523 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &')
Bram Moolenaar1594f312021-07-08 16:40:13 +02004524
4525 lines =<< trim END
4526 set hlsearch !
4527 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004528 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !')
Bram Moolenaar1594f312021-07-08 16:40:13 +02004529
4530 set hlsearch&
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004531enddef
4532
Bram Moolenaarc03fe662021-07-11 16:52:45 +02004533" This must be called last, it may cause following :def functions to fail
4534def Test_xxx_echoerr_line_number()
4535 var lines =<< trim END
4536 echoerr 'some'
4537 .. ' error'
4538 .. ' continued'
4539 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004540 v9.CheckDefExecAndScriptFailure(lines, 'some error continued', 1)
Bram Moolenaarc03fe662021-07-11 16:52:45 +02004541enddef
4542
Bram Moolenaar9537e372021-12-10 21:05:53 +00004543func Test_debug_with_lambda()
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004544 CheckRunVimInTerminal
4545
Bram Moolenaar9537e372021-12-10 21:05:53 +00004546 " call indirectly to avoid compilation error for missing functions
4547 call Run_Test_debug_with_lambda()
4548endfunc
4549
4550def Run_Test_debug_with_lambda()
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004551 var lines =<< trim END
4552 vim9script
4553 def Func()
4554 var n = 0
4555 echo [0]->filter((_, v) => v == n)
4556 enddef
4557 breakadd func Func
4558 Func()
4559 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004560 writefile(lines, 'XdebugFunc', 'D')
Christian Brabandt7edde3f2024-05-04 09:38:59 +02004561 var buf = g:RunVimInTerminal('-S XdebugFunc', {rows: 10, wait_for_ruler: 0})
4562 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 10)))
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004563
4564 term_sendkeys(buf, "cont\<CR>")
Christian Brabandt7edde3f2024-05-04 09:38:59 +02004565 g:WaitForAssert(() => assert_match('\[0\]', term_getline(buf, 9)))
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004566
Bram Moolenaar62aec932022-01-29 21:45:34 +00004567 g:StopVimInTerminal(buf)
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004568enddef
4569
Bram Moolenaar310091d2021-12-23 21:14:37 +00004570func Test_debug_running_out_of_lines()
4571 CheckRunVimInTerminal
4572
4573 " call indirectly to avoid compilation error for missing functions
4574 call Run_Test_debug_running_out_of_lines()
4575endfunc
4576
4577def Run_Test_debug_running_out_of_lines()
4578 var lines =<< trim END
4579 vim9script
4580 def Crash()
4581 #
4582 #
4583 #
4584 #
4585 #
4586 #
4587 #
4588 if true
4589 #
4590 endif
4591 enddef
4592 breakadd func Crash
4593 Crash()
4594 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004595 writefile(lines, 'XdebugFunc', 'D')
Christian Brabandt7edde3f2024-05-04 09:38:59 +02004596 var buf = g:RunVimInTerminal('-S XdebugFunc', {rows: 10, wait_for_ruler: 0})
4597 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 10)))
Bram Moolenaar310091d2021-12-23 21:14:37 +00004598
4599 term_sendkeys(buf, "next\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004600 g:TermWait(buf)
Christian Brabandt7edde3f2024-05-04 09:38:59 +02004601 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 10)))
Bram Moolenaar310091d2021-12-23 21:14:37 +00004602
4603 term_sendkeys(buf, "cont\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004604 g:TermWait(buf)
Bram Moolenaar310091d2021-12-23 21:14:37 +00004605
Bram Moolenaar62aec932022-01-29 21:45:34 +00004606 g:StopVimInTerminal(buf)
Bram Moolenaar310091d2021-12-23 21:14:37 +00004607enddef
4608
dundargocc57b5bc2022-11-02 13:30:51 +00004609def Test_ambiguous_command_error()
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004610 var lines =<< trim END
4611 vim9script
4612 command CmdA echomsg 'CmdA'
4613 command CmdB echomsg 'CmdB'
4614 Cmd
4615 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004616 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 4)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004617
4618 lines =<< trim END
4619 vim9script
4620 def Func()
4621 Cmd
4622 enddef
4623 Func()
4624 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004625 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 1)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004626
4627 lines =<< trim END
4628 vim9script
4629 nnoremap <F3> <ScriptCmd>Cmd<CR>
4630 feedkeys("\<F3>", 'xt')
4631 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004632 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 3)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004633
4634 delcommand CmdA
4635 delcommand CmdB
4636 nunmap <F3>
4637enddef
4638
Dominique Pelle923dce22021-11-21 11:36:04 +00004639" Execute this near the end, profiling doesn't stop until Vim exits.
Bram Moolenaard9162552021-07-11 15:26:13 +02004640" This only tests that it works, not the profiling output.
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004641def Test_profile_with_lambda()
Bram Moolenaar4ece1522021-07-11 16:31:51 +02004642 CheckFeature profile
4643
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004644 var lines =<< trim END
4645 vim9script
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004646
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004647 def ProfiledWithLambda()
4648 var n = 3
4649 echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n)
4650 enddef
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004651
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004652 def ProfiledNested()
4653 var x = 0
4654 def Nested(): any
4655 return x
4656 enddef
4657 Nested()
4658 enddef
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004659
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004660 def g:ProfiledNestedProfiled()
4661 var x = 0
4662 def Nested(): any
4663 return x
4664 enddef
4665 Nested()
4666 enddef
4667
4668 def Profile()
Bram Moolenaar48f69cd2022-03-15 16:16:47 +00004669 ProfiledWithLambda()
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004670 ProfiledNested()
4671
Bram Moolenaar48f69cd2022-03-15 16:16:47 +00004672 # Also profile the nested function. Use a different function, although
4673 # the contents is the same, to make sure it was not already compiled.
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004674 profile func *
4675 g:ProfiledNestedProfiled()
4676
4677 profdel func *
4678 profile pause
4679 enddef
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004680
4681 var result = 'done'
4682 try
4683 # mark functions for profiling now to avoid E1271
4684 profile start Xprofile.log
4685 profile func ProfiledWithLambda
4686 profile func ProfiledNested
4687
4688 Profile()
4689 catch
4690 result = 'failed: ' .. v:exception
4691 finally
4692 writefile([result], 'Xdidprofile')
4693 endtry
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004694 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004695 writefile(lines, 'Xprofile.vim', 'D')
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004696 call system(g:GetVimCommand()
4697 .. ' --clean'
4698 .. ' -c "so Xprofile.vim"'
4699 .. ' -c "qall!"')
4700 call assert_equal(0, v:shell_error)
4701
4702 assert_equal(['done'], readfile('Xdidprofile'))
4703 assert_true(filereadable('Xprofile.log'))
4704 delete('Xdidprofile')
4705 delete('Xprofile.log')
Bram Moolenaard9162552021-07-11 15:26:13 +02004706enddef
4707
Bram Moolenaar4f6e7722022-03-16 20:26:02 +00004708func Test_misplaced_type()
4709 CheckRunVimInTerminal
4710 call Run_Test_misplaced_type()
4711endfunc
4712
4713def Run_Test_misplaced_type()
Bram Moolenaar9510d222022-09-11 15:14:05 +01004714 writefile(['let g:somevar = "asdf"'], 'XTest_misplaced_type', 'D')
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004715 var buf = g:RunVimInTerminal('-S XTest_misplaced_type', {'rows': 6})
Bram Moolenaar9510d222022-09-11 15:14:05 +01004716 term_sendkeys(buf, ":vim9cmd echo islocked('somevar: string')\<CR>")
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004717 g:VerifyScreenDump(buf, 'Test_misplaced_type', {})
4718
4719 g:StopVimInTerminal(buf)
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004720enddef
4721
LemonBoya5d35902022-04-29 21:15:02 +01004722" Ensure echo doesn't crash when stringifying empty variables.
4723def Test_echo_uninit_variables()
4724 var res: string
4725
4726 var var_bool: bool
4727 var var_num: number
4728 var var_float: float
4729 var Var_func: func
4730 var var_string: string
4731 var var_blob: blob
LemonBoya5d35902022-04-29 21:15:02 +01004732 var var_list: list<any>
4733 var var_dict: dict<any>
4734
4735 redir => res
4736 echo var_bool
4737 echo var_num
4738 echo var_float
4739 echo Var_func
4740 echo var_string
4741 echo var_blob
LemonBoya5d35902022-04-29 21:15:02 +01004742 echo var_list
4743 echo var_dict
4744 redir END
4745
Bram Moolenaarf1d63b92022-05-06 13:37:42 +01004746 assert_equal(['false', '0', '0.0', 'function()', '', '0z', '[]', '{}'], res->split('\n'))
4747
4748 if has('job')
4749 var var_job: job
4750 var var_channel: channel
4751
4752 redir => res
4753 echo var_job
4754 echo var_channel
4755 redir END
4756
4757 assert_equal(['no process', 'channel fail'], res->split('\n'))
4758 endif
LemonBoya5d35902022-04-29 21:15:02 +01004759enddef
4760
Bram Moolenaar6342e2c2022-12-12 18:56:32 +00004761def Test_free_type_before_use()
4762 # this rather complicated script was freeing a type before using it
4763 var lines =<< trim END
4764 vim9script
4765
4766 def Scan(rel: list<dict<any>>): func(func(dict<any>))
4767 return (Emit: func(dict<any>)) => {
4768 for t in rel
4769 Emit(t)
4770 endfor
4771 }
4772 enddef
4773
4774 def Build(Cont: func(func(dict<any>))): list<dict<any>>
4775 var rel: list<dict<any>> = []
4776 Cont((t) => {
4777 add(rel, t)
4778 })
4779 return rel
4780 enddef
4781
4782 var R = [{A: 0}]
4783 var result = Scan(R)->Build()
4784 result = Scan(R)->Build()
4785
4786 assert_equal(R, result)
4787 END
4788 v9.CheckScriptSuccess(lines)
4789enddef
4790
Yegappan Lakshmanana76fbe62023-09-27 18:51:43 +02004791" The following complicated script used to cause an internal error (E340)
4792" because the funcref instruction memory was referenced after the instruction
4793" memory was reallocated (Github issue #13178)
4794def Test_refer_funcref_instr_after_realloc()
4795 var lines =<< trim END
4796 vim9script
4797 def A(d: bool)
4798 var e = abs(0)
4799 var f = &emoji
4800 &emoji = true
4801 if ['', '', '']->index('xxx') == 0
4802 eval 0 + 0
4803 endif
4804 if &filetype == 'xxx'
4805 var g = abs(0)
4806 while g > 0
4807 if getline(g) == ''
4808 break
4809 endif
4810 --g
4811 endwhile
4812 if g == 0
4813 return
4814 endif
4815 if d
4816 feedkeys($'{g}G')
4817 g = abs(0)
4818 endif
4819 var h = abs(0)
4820 var i = abs(0)
4821 var j = abs(0)
4822 while j < 0
4823 if abs(0) < h && getline(j) != ''
4824 break
4825 endif
4826 ++j
4827 endwhile
4828 feedkeys($'{g}G{j}G')
4829 return
4830 endif
4831 def B()
4832 enddef
4833 def C()
4834 enddef
4835 enddef
4836 A(false)
4837 END
4838 v9.CheckScriptSuccess(lines)
4839enddef
4840
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004841" Test for calling a deferred function after an exception
4842def Test_defer_after_exception()
4843 var lines =<< trim END
4844 vim9script
4845
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004846 var callTrace: list<number> = []
4847 def Bar()
4848 callTrace += [1]
4849 throw 'InnerException'
4850 enddef
4851
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004852 def Defer()
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004853 callTrace += [2]
4854 callTrace += [3]
4855 try
4856 Bar()
4857 catch /InnerException/
4858 callTrace += [4]
4859 endtry
4860 callTrace += [5]
4861 callTrace += [6]
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004862 enddef
4863
4864 def Foo()
4865 defer Defer()
4866 throw "TestException"
4867 enddef
4868
4869 try
4870 Foo()
4871 catch /TestException/
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004872 callTrace += [7]
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004873 endtry
4874
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004875 assert_equal([2, 3, 1, 4, 5, 6, 7], callTrace)
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004876 END
Yegappan Lakshmananec3cebb2023-10-27 19:35:26 +02004877 v9.CheckSourceSuccess(lines)
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004878enddef
4879
Yegappan Lakshmanan0ab500d2023-10-21 11:59:42 +02004880" Test for multiple deferred function which throw exceptions.
4881" Exceptions thrown by deferred functions should result in error messages but
4882" not propagated into the calling functions.
4883def Test_multidefer_with_exception()
4884 var lines =<< trim END
4885 vim9script
4886
4887 var callTrace: list<number> = []
4888 def Except()
4889 callTrace += [1]
4890 throw 'InnerException'
4891 callTrace += [2]
4892 enddef
4893
4894 def FirstDefer()
4895 callTrace += [3]
4896 callTrace += [4]
4897 enddef
4898
4899 def SecondDeferWithExcept()
4900 callTrace += [5]
4901 Except()
4902 callTrace += [6]
4903 enddef
4904
4905 def ThirdDefer()
4906 callTrace += [7]
4907 callTrace += [8]
4908 enddef
4909
4910 def Foo()
4911 callTrace += [9]
4912 defer FirstDefer()
4913 defer SecondDeferWithExcept()
4914 defer ThirdDefer()
4915 callTrace += [10]
4916 enddef
4917
4918 v:errmsg = ''
4919 try
4920 callTrace += [11]
4921 Foo()
4922 callTrace += [12]
4923 catch /TestException/
4924 callTrace += [13]
4925 catch
4926 callTrace += [14]
4927 finally
4928 callTrace += [15]
4929 endtry
4930 callTrace += [16]
4931
4932 assert_equal('E605: Exception not caught: InnerException', v:errmsg)
4933 assert_equal([11, 9, 10, 7, 8, 5, 1, 3, 4, 12, 15, 16], callTrace)
4934 END
Yegappan Lakshmananec3cebb2023-10-27 19:35:26 +02004935 v9.CheckSourceSuccess(lines)
4936enddef
4937
Yegappan Lakshmanana185a312023-12-16 14:36:08 +01004938" Test for using ":defer" inside an if statement with a false condition
4939def Test_defer_skipped()
4940 var lines =<< trim END
4941 def Foo()
4942 if false
4943 defer execute('echow "hello"', "")
4944 endif
4945 enddef
4946 defcompile
4947 END
4948 v9.CheckSourceSuccess(lines)
4949enddef
4950
Yegappan Lakshmanan062bb6b2023-12-16 14:46:40 +01004951" Test for using defer without parenthesis for the function name
4952def Test_defer_func_without_paren()
4953 var lines =<< trim END
4954 vim9script
4955 def Foo()
4956 defer Bar
4957 enddef
4958 defcompile
4959 END
4960 v9.CheckScriptFailure(lines, 'E107: Missing parentheses: Bar', 1)
4961enddef
4962
4963" Test for using defer without parenthesis for the function name
4964def Test_defer_non_existing_func()
4965 var lines =<< trim END
4966 vim9script
4967 def Foo()
4968 defer Bar()
4969 enddef
4970 defcompile
4971 END
4972 v9.CheckScriptFailure(lines, 'E1001: Variable not found: Bar', 1)
4973enddef
4974
4975" Test for using defer with an invalid function name
4976def Test_defer_invalid_func()
4977 var lines =<< trim END
4978 vim9script
4979 def Foo()
4980 var Abc = 10
4981 defer Abc()
4982 enddef
4983 defcompile
4984 END
4985 v9.CheckScriptFailure(lines, 'E129: Function name required', 2)
4986enddef
4987
4988" Test for using defer with an invalid argument to a function
4989def Test_defer_invalid_func_arg()
4990 var lines =<< trim END
4991 vim9script
4992 def Bar(x: number)
4993 enddef
4994 def Foo()
4995 defer Bar(a)
4996 enddef
4997 defcompile
4998 END
4999 v9.CheckScriptFailure(lines, 'E1001: Variable not found: a', 1)
5000enddef
5001
5002" Test for using an non-existing type in a "for" statement.
5003def Test_invalid_type_in_for()
5004 var lines =<< trim END
5005 vim9script
5006 def Foo()
5007 for b: x in range(10)
5008 endfor
5009 enddef
5010 defcompile
5011 END
Yegappan Lakshmanan1b531722024-05-09 09:12:31 +02005012 v9.CheckSourceFailure(lines, 'E1010: Type not recognized: x', 1)
Yegappan Lakshmanan062bb6b2023-12-16 14:46:40 +01005013enddef
5014
5015" Test for using a line break between the variable name and the type in a for
5016" statement.
5017def Test_for_stmt_space_before_type()
5018 var lines =<< trim END
5019 vim9script
5020 def Foo()
5021 for a
5022 :number in range(10)
5023 endfor
5024 enddef
5025 defcompile
5026 END
5027 v9.CheckSourceFailure(lines, 'E1059: No white space allowed before colon: :number in range(10)', 2)
5028enddef
5029
zeertzjqc029c132024-03-28 11:37:26 +01005030" This test used to cause a use-after-free memory access
Yegappan Lakshmanan28d71b52024-01-12 17:21:55 +01005031def Test_for_empty_line_after_lambda()
5032 var lines =<< trim END
5033 vim9script
5034 echomsg range(0, 2)->map((_, v) => {
5035 return 1
5036 })
5037
5038 assert_equal('[1, 1, 1]', v:statusmsg)
5039 END
5040 v9.CheckSourceSuccess(lines)
5041
5042 lines =<< trim END
5043 vim9script
5044 echomsg range(0, 1)->map((_, v) => {
5045 return 1
5046 }) range(0, 1)->map((_, v) => {
5047 return 2
5048 }) # comment
5049
5050 assert_equal('[1, 1] [2, 2]', v:statusmsg)
5051 END
5052 v9.CheckSourceSuccess(lines)
5053enddef
5054
Yegappan Lakshmanan3fa8f772024-04-04 21:42:07 +02005055" Test for evaluating a lambda block from a string
5056def Test_eval_lambda_block()
5057 var lines =<< trim END
5058 vim9script
5059 var Fn = eval("(x: number): number => {\nreturn x * 2\n}")
5060 assert_equal(6, Fn(3))
5061 END
5062 v9.CheckSourceSuccess(lines)
5063enddef
5064
Yegappan Lakshmananda9d3452024-05-02 13:02:36 +02005065" Test for using various null values
5066def Test_null_values()
5067 var lines =<< trim END
5068 var nullValues = [
5069 [null, 1, 'null', 7, 'special'],
5070 [null_blob, 1, '0z', 10, 'blob'],
5071 [null_channel, 1, 'channel fail', 9, 'channel'],
5072 [null_dict, 1, '{}', 4, 'dict<any>'],
5073 [null_function, 1, "function('')", 2, 'func(...): unknown'],
5074 [null_job, 1, 'no process', 8, 'job'],
5075 [null_list, 1, '[]', 3, 'list<any>'],
5076 [null_object, 1, 'object of [unknown]', 13, 'object<Unknown>'],
5077 [null_partial, 1, "function('')", 2, 'func(...): unknown'],
5078 [null_string, 1, "''", 1, 'string']
5079 ]
5080
5081 for [Val, emptyExp, stringExp, typeExp, typenameExp] in nullValues
5082 assert_equal(emptyExp, empty(Val))
5083 assert_equal(stringExp, string(Val))
5084 assert_equal(typeExp, type(Val))
5085 assert_equal(typenameExp, typename(Val))
5086 assert_equal(Val, copy(Val))
5087 assert_equal(-1, test_refcount(Val))
5088 endfor
5089 END
5090 v9.CheckSourceDefAndScriptSuccess(lines)
5091enddef
5092
Yegappan Lakshmanan1b531722024-05-09 09:12:31 +02005093" Test for using an unknown type in a typecast
5094def Test_unknown_type_in_typecast()
5095 var lines =<< trim END
5096 vim9script
5097 var a = <MyType>b
5098 END
5099 v9.CheckSourceFailure(lines, 'E1010: Type not recognized: MyType', 2)
5100
5101 lines =<< trim END
5102 vim9script
5103 var Fn = <funcx(number, number): number>b
5104 END
5105 v9.CheckSourceFailure(lines, 'E1010: Type not recognized: funcx(number, number): number', 2)
Yegappan Lakshmananfe424d12024-05-17 18:20:43 +02005106
5107 # Wrong type in a type cast
5108 lines =<< trim END
5109 vim9script
5110 var i: number = <number>true
5111 END
5112 v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected number but got bool', 2)
Yegappan Lakshmanan1b531722024-05-09 09:12:31 +02005113enddef
5114
Bram Moolenaar585fea72020-04-02 22:33:21 +02005115" Keep this last, it messes up highlighting.
5116def Test_substitute_cmd()
5117 new
5118 setline(1, 'something')
5119 :substitute(some(other(
5120 assert_equal('otherthing', getline(1))
5121 bwipe!
5122
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02005123 # also when the context is Vim9 script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02005124 var lines =<< trim END
Bram Moolenaar585fea72020-04-02 22:33:21 +02005125 vim9script
5126 new
5127 setline(1, 'something')
5128 :substitute(some(other(
5129 assert_equal('otherthing', getline(1))
5130 bwipe!
5131 END
Bram Moolenaardd674772022-09-15 22:26:18 +01005132 writefile(lines, 'Xvim9lines', 'D')
Bram Moolenaar585fea72020-04-02 22:33:21 +02005133 source Xvim9lines
Bram Moolenaar585fea72020-04-02 22:33:21 +02005134enddef
5135
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01005136" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker