blob: 136c81db7d21e0e3a39c3a1fcd83d3e7ffd15117 [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
511 # heredoc evaluation
512 lines =<< trim CODE
513 vim9script
514 com SomeCommand {
515 var suffix = '---'
516 g:someVar =<< trim eval END
517 ccc{suffix}
518 ddd
519 END
520 }
521 SomeCommand
522 assert_equal(['ccc---', 'ddd'], g:someVar)
523 def Foo()
524 g:someVar = []
525 SomeCommand
526 assert_equal(['ccc---', 'ddd'], g:someVar)
527 enddef
528 Foo()
529 delcommand SomeCommand
530 unlet g:someVar
531 CODE
532 v9.CheckSourceSuccess(lines)
533
534 # command following heredoc
535 lines =<< trim CODE
536 vim9script
537 com SomeCommand {
538 var l =<< trim END
539 eee
540 fff
541 END
542 g:someVar = l
543 }
544 SomeCommand
545 assert_equal(['eee', 'fff'], g:someVar)
546 delcommand SomeCommand
547 unlet g:someVar
548 CODE
549 v9.CheckSourceSuccess(lines)
550
551 # Error in heredoc
552 lines =<< trim CODE
553 vim9script
554 com SomeCommand {
555 g:someVar =<< trim END
556 eee
557 fff
558 }
559 try
560 SomeCommand
561 catch
562 assert_match("E990: Missing end marker 'END'", v:exception)
563 endtry
564 delcommand SomeCommand
565 unlet g:someVar
566 CODE
567 v9.CheckSourceSuccess(lines)
568enddef
569
570def Test_autocommand_block()
Bram Moolenaare4db17f2021-08-01 21:19:43 +0200571 au BufNew *.xml {
572 g:otherVar = 'other'
573 }
574 split other.xml
575 assert_equal('other', g:otherVar)
576
577 bwipe!
578 au! BufNew *.xml
579 unlet g:otherVar
580enddef
581
Bram Moolenaard032f342020-07-18 18:13:02 +0200582func g:NoSuchFunc()
583 echo 'none'
584endfunc
585
Bram Moolenaar9e1d9e32021-01-11 20:17:34 +0100586def Test_try_catch_throw()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200587 var l = []
Bram Moolenaar7a092242020-04-16 22:10:49 +0200588 try # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100589 add(l, '1')
590 throw 'wrong'
Bram Moolenaar9d383f32023-05-14 21:38:12 +0100591 add(l, '2') # "unreachable code"
Bram Moolenaar7a092242020-04-16 22:10:49 +0200592 catch # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100593 add(l, v:exception)
Bram Moolenaar7a092242020-04-16 22:10:49 +0200594 finally # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100595 add(l, '3')
Bram Moolenaar7a092242020-04-16 22:10:49 +0200596 endtry # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100597 assert_equal(['1', 'wrong', '3'], l)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200598
Bram Moolenaare8593122020-07-18 15:17:02 +0200599 l = []
600 try
601 try
602 add(l, '1')
603 throw 'wrong'
Bram Moolenaar9d383f32023-05-14 21:38:12 +0100604 add(l, '2') # "unreachable code"
Bram Moolenaare8593122020-07-18 15:17:02 +0200605 catch /right/
606 add(l, v:exception)
607 endtry
608 catch /wrong/
609 add(l, 'caught')
Bram Moolenaar204852a2022-03-05 12:56:44 +0000610 finally
Bram Moolenaare8593122020-07-18 15:17:02 +0200611 add(l, 'finally')
612 endtry
613 assert_equal(['1', 'caught', 'finally'], l)
614
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200615 var n: number
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200616 try
617 n = l[3]
618 catch /E684:/
619 n = 99
620 endtry
621 assert_equal(99, n)
622
Bram Moolenaar69f70502021-01-01 16:10:46 +0100623 var done = 'no'
624 if 0
625 try | catch | endtry
626 else
627 done = 'yes'
628 endif
629 assert_equal('yes', done)
630
631 done = 'no'
632 if 1
633 done = 'yes'
634 else
635 try | catch | endtry
636 done = 'never'
637 endif
638 assert_equal('yes', done)
639
640 if 1
641 else
642 try | catch /pat/ | endtry
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000643 try | catch /pat/
Bram Moolenaar69f70502021-01-01 16:10:46 +0100644 endtry
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000645 try
Bram Moolenaar69f70502021-01-01 16:10:46 +0100646 catch /pat/ | endtry
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000647 try
648 catch /pat/
Bram Moolenaar69f70502021-01-01 16:10:46 +0100649 endtry
650 endif
651
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200652 try
Bram Moolenaarcc673e72020-08-16 17:33:35 +0200653 # string slice returns a string, not a number
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200654 n = g:astring[3]
Bram Moolenaar5e654232020-09-16 15:22:00 +0200655 catch /E1012:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200656 n = 77
657 endtry
658 assert_equal(77, n)
659
660 try
661 n = l[g:astring]
Bram Moolenaar5e654232020-09-16 15:22:00 +0200662 catch /E1012:/
Bram Moolenaar56acb092020-08-16 14:48:19 +0200663 n = 88
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200664 endtry
Bram Moolenaar56acb092020-08-16 14:48:19 +0200665 assert_equal(88, n)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200666
667 try
668 n = s:does_not_exist
669 catch /E121:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200670 n = 111
671 endtry
672 assert_equal(111, n)
673
674 try
675 n = g:does_not_exist
676 catch /E121:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200677 n = 121
678 endtry
679 assert_equal(121, n)
680
Bram Moolenaare0de1712020-12-02 17:36:54 +0100681 var d = {one: 1}
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200682 try
683 n = d[g:astring]
684 catch /E716:/
685 n = 222
686 endtry
687 assert_equal(222, n)
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200688
689 try
690 n = -g:astring
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200691 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200692 n = 233
693 endtry
694 assert_equal(233, n)
695
696 try
697 n = +g:astring
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200698 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200699 n = 244
700 endtry
701 assert_equal(244, n)
702
703 try
704 n = +g:alist
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200705 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200706 n = 255
707 endtry
708 assert_equal(255, n)
709
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200710 var nd: dict<any>
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200711 try
Bram Moolenaar2e5910b2021-02-03 17:41:24 +0100712 nd = {[g:alist]: 1}
713 catch /E1105:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200714 n = 266
715 endtry
716 assert_equal(266, n)
717
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000718 l = [1, 2, 3]
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200719 try
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +0000720 [n] = l
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200721 catch /E1093:/
722 n = 277
723 endtry
724 assert_equal(277, n)
725
Bram Moolenaare8593122020-07-18 15:17:02 +0200726 try
727 &ts = g:astring
Bram Moolenaar5e654232020-09-16 15:22:00 +0200728 catch /E1012:/
Bram Moolenaare8593122020-07-18 15:17:02 +0200729 n = 288
730 endtry
731 assert_equal(288, n)
732
733 try
734 &backspace = 'asdf'
735 catch /E474:/
736 n = 299
737 endtry
738 assert_equal(299, n)
739
740 l = [1]
741 try
742 l[3] = 3
743 catch /E684:/
744 n = 300
745 endtry
746 assert_equal(300, n)
747
748 try
Bram Moolenaare8593122020-07-18 15:17:02 +0200749 unlet g:does_not_exist
750 catch /E108:/
751 n = 322
752 endtry
753 assert_equal(322, n)
754
755 try
Bram Moolenaar2bede172020-11-19 18:53:18 +0100756 d = {text: 1, [g:astring]: 2}
Bram Moolenaare8593122020-07-18 15:17:02 +0200757 catch /E721:/
758 n = 333
759 endtry
760 assert_equal(333, n)
761
762 try
Bram Moolenaar62aec932022-01-29 21:45:34 +0000763 l = g:DeletedFunc()
Bram Moolenaare8593122020-07-18 15:17:02 +0200764 catch /E933:/
765 n = 344
766 endtry
767 assert_equal(344, n)
Bram Moolenaard032f342020-07-18 18:13:02 +0200768
769 try
Yegappan Lakshmanana764e732021-07-25 15:57:32 +0200770 echo range(1, 2, 0)
771 catch /E726:/
Bram Moolenaard032f342020-07-18 18:13:02 +0200772 n = 355
773 endtry
774 assert_equal(355, n)
775
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200776 var P = function('g:NoSuchFunc')
Bram Moolenaard032f342020-07-18 18:13:02 +0200777 delfunc g:NoSuchFunc
778 try
779 echo P()
780 catch /E117:/
781 n = 366
782 endtry
783 assert_equal(366, n)
784
785 try
786 echo g:NoSuchFunc()
787 catch /E117:/
788 n = 377
789 endtry
790 assert_equal(377, n)
791
792 try
793 echo g:alist + 4
794 catch /E745:/
795 n = 388
796 endtry
797 assert_equal(388, n)
798
799 try
800 echo 4 + g:alist
801 catch /E745:/
802 n = 399
803 endtry
804 assert_equal(399, n)
805
806 try
807 echo g:alist.member
808 catch /E715:/
809 n = 400
810 endtry
811 assert_equal(400, n)
812
813 try
814 echo d.member
815 catch /E716:/
816 n = 411
817 endtry
818 assert_equal(411, n)
Bram Moolenaard9d77892021-02-12 21:32:47 +0100819
820 var counter = 0
821 for i in range(4)
822 try
823 eval [][0]
824 catch
825 endtry
826 counter += 1
827 endfor
828 assert_equal(4, counter)
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100829
Bram Moolenaar9fa5dab2021-07-20 19:18:44 +0200830 # no requirement for spaces before |
831 try|echo 0|catch|endtry
832
Bram Moolenaar003312b2021-12-20 10:55:35 +0000833 # return in try with finally
834 def ReturnInTry(): number
835 var ret = 4
836 try
837 return ret
838 catch /this/
839 return -1
840 catch /that/
841 return -1
842 finally
843 # changing ret has no effect
844 ret = 7
845 endtry
846 return -2
847 enddef
848 assert_equal(4, ReturnInTry())
849
850 # return in catch with finally
851 def ReturnInCatch(): number
852 var ret = 5
853 try
854 throw 'getout'
Bram Moolenaar9d383f32023-05-14 21:38:12 +0100855 return -1 # "unreachable code"
Bram Moolenaar003312b2021-12-20 10:55:35 +0000856 catch /getout/
857 # ret is evaluated here
858 return ret
859 finally
860 # changing ret later has no effect
861 ret = -3
862 endtry
863 return -2
864 enddef
865 assert_equal(5, ReturnInCatch())
866
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100867 # return in finally after empty catch
868 def ReturnInFinally(): number
869 try
870 finally
Bram Moolenaar003312b2021-12-20 10:55:35 +0000871 return 6
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100872 endtry
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100873 enddef
Bram Moolenaar003312b2021-12-20 10:55:35 +0000874 assert_equal(6, ReturnInFinally())
Bram Moolenaar8ac681a2021-06-15 20:06:34 +0200875
876 var lines =<< trim END
877 vim9script
878 try
879 acos('0.5')
880 ->setline(1)
881 catch
882 g:caught = v:exception
883 endtry
884 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000885 v9.CheckScriptSuccess(lines)
Yegappan Lakshmanan4490ec42021-07-27 22:00:44 +0200886 assert_match('E1219: Float or Number required for argument 1', g:caught)
Bram Moolenaar8ac681a2021-06-15 20:06:34 +0200887 unlet g:caught
Bram Moolenaar41978282021-07-04 14:47:30 +0200888
889 # missing catch and/or finally
890 lines =<< trim END
891 vim9script
892 try
893 echo 'something'
894 endtry
895 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000896 v9.CheckScriptFailure(lines, 'E1032:')
rbtnn84934992021-08-07 13:26:53 +0200897
898 # skipping try-finally-endtry when try-finally-endtry is used in another block
899 lines =<< trim END
900 if v:true
901 try
902 finally
903 endtry
904 else
905 try
906 finally
907 endtry
908 endif
909 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000910 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100911enddef
912
Bram Moolenaara2c00282023-05-14 22:05:15 +0100913def Test_unreachable_after()
914 var lines =<< trim END
915 try
916 throw 'Error'
917 echo 'not reached'
918 catch /Error/
919 endtry
920 END
921 v9.CheckDefFailure(lines, 'E1095: Unreachable code after :throw')
922
923 lines =<< trim END
924 def SomeFunc(): number
925 try
926 return 3
927 echo 'not reached'
928 catch /Error/
929 endtry
930 return 4
931 enddef
932 defcompile
933 END
934 v9.CheckScriptFailure(lines, 'E1095: Unreachable code after :return')
935enddef
936
Bram Moolenaar3ef2e412023-04-30 18:50:48 +0100937def Test_throw_in_nested_try()
938 var lines =<< trim END
939 vim9script
940
941 def Try(F: func(): void)
942 try
943 F()
944 catch
945 endtry
946 enddef
947
948 class X
949 def F()
950 try
951 throw 'Foobar'
952 catch
953 throw v:exception
954 endtry
955 enddef
956 endclass
957
958 def Test_TryMethod()
959 var x = X.new()
960 Try(() => x.F())
961 enddef
962
963
964 try
965 Test_TryMethod()
966 catch
967 endtry
968 END
969 v9.CheckScriptSuccess(lines)
970enddef
971
Bram Moolenaar28bf6492022-03-03 15:11:20 +0000972def Test_try_var_decl()
973 var lines =<< trim END
974 vim9script
975 try
976 var in_try = 1
977 assert_equal(1, get(s:, 'in_try', -1))
978 throw "getout"
979 catch
980 var in_catch = 2
981 assert_equal(-1, get(s:, 'in_try', -1))
982 assert_equal(2, get(s:, 'in_catch', -1))
983 finally
984 var in_finally = 3
985 assert_equal(-1, get(s:, 'in_try', -1))
986 assert_equal(-1, get(s:, 'in_catch', -1))
987 assert_equal(3, get(s:, 'in_finally', -1))
988 endtry
989 assert_equal(-1, get(s:, 'in_try', -1))
990 assert_equal(-1, get(s:, 'in_catch', -1))
991 assert_equal(-1, get(s:, 'in_finally', -1))
992 END
993 v9.CheckScriptSuccess(lines)
994enddef
995
Bram Moolenaar53c29612022-01-12 16:18:18 +0000996def Test_try_ends_in_return()
997 var lines =<< trim END
998 vim9script
999 def Foo(): string
1000 try
1001 return 'foo'
1002 catch
1003 return 'caught'
1004 endtry
1005 enddef
1006 assert_equal('foo', Foo())
1007 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001008 v9.CheckScriptSuccess(lines)
Bram Moolenaar53c29612022-01-12 16:18:18 +00001009
1010 lines =<< trim END
1011 vim9script
1012 def Foo(): string
1013 try
1014 return 'foo'
1015 catch
1016 return 'caught'
1017 endtry
1018 echo 'notreached'
1019 enddef
1020 assert_equal('foo', Foo())
1021 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001022 v9.CheckScriptFailure(lines, 'E1095:')
Bram Moolenaar53c29612022-01-12 16:18:18 +00001023
1024 lines =<< trim END
1025 vim9script
1026 def Foo(): string
1027 try
1028 return 'foo'
1029 catch /x/
1030 return 'caught'
1031 endtry
1032 enddef
1033 assert_equal('foo', Foo())
1034 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001035 v9.CheckScriptFailure(lines, 'E1027:')
Bram Moolenaar53c29612022-01-12 16:18:18 +00001036
1037 lines =<< trim END
1038 vim9script
1039 def Foo(): string
1040 try
1041 echo 'foo'
1042 catch
1043 echo 'caught'
1044 finally
1045 return 'done'
1046 endtry
1047 enddef
1048 assert_equal('done', Foo())
1049 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001050 v9.CheckScriptSuccess(lines)
Bram Moolenaar53c29612022-01-12 16:18:18 +00001051
1052enddef
1053
Bram Moolenaar3f987b52021-06-30 12:02:24 +02001054def Test_try_in_catch()
1055 var lines =<< trim END
1056 vim9script
1057 var seq = []
1058 def DoIt()
1059 try
1060 seq->add('throw 1')
1061 eval [][0]
1062 seq->add('notreached')
1063 catch
1064 seq->add('catch')
1065 try
1066 seq->add('throw 2')
1067 eval [][0]
1068 seq->add('notreached')
1069 catch /nothing/
1070 seq->add('notreached')
1071 endtry
1072 seq->add('done')
1073 endtry
1074 enddef
1075 DoIt()
1076 assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq)
1077 END
1078enddef
1079
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001080def Test_error_in_catch()
1081 var lines =<< trim END
1082 try
1083 eval [][0]
1084 catch /E684:/
1085 eval [][0]
1086 endtry
1087 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001088 v9.CheckDefExecFailure(lines, 'E684:', 4)
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001089enddef
1090
Bram Moolenaar2e34c342021-03-14 12:13:33 +01001091" :while at the very start of a function that :continue jumps to
Bram Moolenaar62aec932022-01-29 21:45:34 +00001092def s:TryContinueFunc()
Bram Moolenaar2e34c342021-03-14 12:13:33 +01001093 while g:Count < 2
1094 g:sequence ..= 't'
1095 try
1096 echoerr 'Test'
1097 catch
1098 g:Count += 1
1099 g:sequence ..= 'c'
1100 continue
1101 endtry
1102 g:sequence ..= 'e'
1103 g:Count += 1
1104 endwhile
1105enddef
1106
1107def Test_continue_in_try_in_while()
1108 g:Count = 0
1109 g:sequence = ''
1110 TryContinueFunc()
1111 assert_equal('tctc', g:sequence)
1112 unlet g:Count
1113 unlet g:sequence
1114enddef
1115
Bram Moolenaar873f8242022-03-10 21:53:44 +00001116def Test_break_in_try_in_for()
1117 var lines =<< trim END
1118 vim9script
1119 def Ls(): list<string>
1120 var ls: list<string>
1121 for s in ['abc', 'def']
1122 for _ in [123, 456]
1123 try
1124 eval [][0]
1125 catch
1126 break
1127 endtry
1128 endfor
1129 ls += [s]
1130 endfor
1131 return ls
1132 enddef
1133 assert_equal(['abc', 'def'], Ls())
1134 END
1135 v9.CheckScriptSuccess(lines)
1136enddef
1137
Bram Moolenaar9cb577a2021-02-22 22:45:10 +01001138def Test_nocatch_return_in_try()
1139 # return in try block returns normally
1140 def ReturnInTry(): string
1141 try
1142 return '"some message"'
1143 catch
1144 endtry
1145 return 'not reached'
1146 enddef
1147 exe 'echoerr ' .. ReturnInTry()
1148enddef
1149
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001150def Test_cnext_works_in_catch()
1151 var lines =<< trim END
1152 vim9script
Bram Moolenaarc3235272021-07-10 19:42:03 +02001153 au BufEnter * eval 1 + 2
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001154 writefile(['text'], 'Xcncfile1')
1155 writefile(['text'], 'Xcncfile2')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001156 var items = [
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001157 {lnum: 1, filename: 'Xcncfile1', valid: true},
1158 {lnum: 1, filename: 'Xcncfile2', valid: true}
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001159 ]
1160 setqflist([], ' ', {items: items})
1161 cwindow
1162
1163 def CnextOrCfirst()
1164 # if cnext fails, cfirst is used
1165 try
1166 cnext
1167 catch
1168 cfirst
1169 endtry
1170 enddef
1171
1172 CnextOrCfirst()
1173 CnextOrCfirst()
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001174 writefile([getqflist({idx: 0}).idx], 'Xcncresult')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001175 qall
1176 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001177 writefile(lines, 'XCatchCnext', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001178 g:RunVim([], [], '--clean -S XCatchCnext')
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001179 assert_equal(['1'], readfile('Xcncresult'))
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001180
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001181 delete('Xcncfile1')
1182 delete('Xcncfile2')
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001183 delete('Xcncresult')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001184enddef
1185
Bram Moolenaar9e1d9e32021-01-11 20:17:34 +01001186def Test_throw_skipped()
1187 if 0
1188 throw dontgethere
1189 endif
1190enddef
1191
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001192def Test_nocatch_throw_silenced()
1193 var lines =<< trim END
1194 vim9script
1195 def Func()
1196 throw 'error'
1197 enddef
1198 silent! Func()
1199 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001200 writefile(lines, 'XthrowSilenced', 'D')
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001201 source XthrowSilenced
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001202enddef
1203
Bram Moolenaara2c00282023-05-14 22:05:15 +01001204" g:DeletedFunc() is found when compiling Test_try_catch_throw() and then
1205" deleted, this should give a runtime error.
Bram Moolenaare8593122020-07-18 15:17:02 +02001206def DeletedFunc(): list<any>
1207 return ['delete me']
1208enddef
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001209defcompile DeletedFunc
1210
1211call test_override('unreachable', 1)
1212defcompile Test_try_catch_throw
1213call test_override('unreachable', 0)
1214
Bram Moolenaare8593122020-07-18 15:17:02 +02001215delfunc DeletedFunc
1216
Bram Moolenaar62aec932022-01-29 21:45:34 +00001217def s:ThrowFromDef()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001218 throw "getout" # comment
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001219enddef
1220
Bram Moolenaar62aec932022-01-29 21:45:34 +00001221func s:CatchInFunc()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001222 try
Bram Moolenaar62aec932022-01-29 21:45:34 +00001223 call s:ThrowFromDef()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001224 catch
1225 let g:thrown_func = v:exception
1226 endtry
1227endfunc
1228
Bram Moolenaar62aec932022-01-29 21:45:34 +00001229def s:CatchInDef()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001230 try
1231 ThrowFromDef()
1232 catch
1233 g:thrown_def = v:exception
1234 endtry
1235enddef
1236
Bram Moolenaar62aec932022-01-29 21:45:34 +00001237def s:ReturnFinally(): string
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001238 try
1239 return 'intry'
Bram Moolenaar204852a2022-03-05 12:56:44 +00001240 finally
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001241 g:in_finally = 'finally'
1242 endtry
1243 return 'end'
1244enddef
1245
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001246def Test_try_catch_nested()
1247 CatchInFunc()
1248 assert_equal('getout', g:thrown_func)
1249
1250 CatchInDef()
1251 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001252
1253 assert_equal('intry', ReturnFinally())
1254 assert_equal('finally', g:in_finally)
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001255
1256 var l = []
1257 try
1258 l->add('1')
1259 throw 'bad'
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001260 l->add('x') # "unreachable code"
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001261 catch /bad/
1262 l->add('2')
1263 try
1264 l->add('3')
1265 throw 'one'
1266 l->add('x')
1267 catch /one/
1268 l->add('4')
1269 try
1270 l->add('5')
1271 throw 'more'
1272 l->add('x')
1273 catch /more/
1274 l->add('6')
1275 endtry
1276 endtry
1277 endtry
1278 assert_equal(['1', '2', '3', '4', '5', '6'], l)
Bram Moolenaar834193a2021-06-30 20:39:15 +02001279
1280 l = []
1281 try
1282 try
1283 l->add('1')
1284 throw 'foo'
1285 l->add('x')
1286 catch
1287 l->add('2')
1288 throw 'bar'
1289 l->add('x')
1290 finally
1291 l->add('3')
1292 endtry
1293 l->add('x')
1294 catch /bar/
1295 l->add('4')
1296 endtry
1297 assert_equal(['1', '2', '3', '4'], l)
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001298enddef
1299
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001300call test_override('unreachable', 1)
1301defcompile Test_try_catch_nested
1302call test_override('unreachable', 0)
1303
Bram Moolenaar62aec932022-01-29 21:45:34 +00001304def s:TryOne(): number
Bram Moolenaar9939f572020-09-16 22:29:52 +02001305 try
1306 return 0
1307 catch
1308 endtry
1309 return 0
1310enddef
1311
Bram Moolenaar62aec932022-01-29 21:45:34 +00001312def s:TryTwo(n: number): string
Bram Moolenaar9939f572020-09-16 22:29:52 +02001313 try
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001314 var x = {}
Bram Moolenaar9939f572020-09-16 22:29:52 +02001315 catch
1316 endtry
1317 return 'text'
1318enddef
1319
1320def Test_try_catch_twice()
1321 assert_equal('text', TryOne()->TryTwo())
1322enddef
1323
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001324def Test_try_catch_match()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001325 var seq = 'a'
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001326 try
1327 throw 'something'
1328 catch /nothing/
1329 seq ..= 'x'
1330 catch /some/
1331 seq ..= 'b'
1332 catch /asdf/
1333 seq ..= 'x'
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001334 catch ?a\?sdf?
1335 seq ..= 'y'
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001336 finally
1337 seq ..= 'c'
1338 endtry
1339 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001340enddef
1341
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001342def Test_try_catch_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001343 v9.CheckDefFailure(['catch'], 'E603:')
1344 v9.CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1345 v9.CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1346 v9.CheckDefFailure(['finally'], 'E606:')
1347 v9.CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1348 v9.CheckDefFailure(['endtry'], 'E602:')
1349 v9.CheckDefFailure(['while 1', 'endtry'], 'E170:')
1350 v9.CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1351 v9.CheckDefFailure(['if 1', 'endtry'], 'E171:')
1352 v9.CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001353
Bram Moolenaar62aec932022-01-29 21:45:34 +00001354 v9.CheckDefFailure(['throw'], 'E1143:')
1355 v9.CheckDefFailure(['throw xxx'], 'E1001:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001356enddef
1357
Bram Moolenaar7c5b3c0362021-02-14 22:40:57 +01001358def Try_catch_skipped()
1359 var l = []
1360 try
1361 finally
1362 endtry
1363
1364 if 1
1365 else
1366 try
1367 endtry
1368 endif
1369enddef
1370
1371" The skipped try/endtry was updating the wrong instruction.
1372def Test_try_catch_skipped()
1373 var instr = execute('disassemble Try_catch_skipped')
1374 assert_match("NEWLIST size 0\n", instr)
1375enddef
1376
Bram Moolenaar90a57162022-02-12 14:23:17 +00001377def Test_throw_line_number()
1378 def Func()
1379 eval 1 + 1
1380 eval 2 + 2
1381 throw 'exception'
1382 enddef
1383 try
1384 Func()
1385 catch /exception/
1386 assert_match('line 3', v:throwpoint)
1387 endtry
1388enddef
Bram Moolenaar7c5b3c0362021-02-14 22:40:57 +01001389
1390
Bram Moolenaar006ad482020-06-30 20:55:15 +02001391def Test_throw_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001392 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001393 var lines =<< trim END
Bram Moolenaar006ad482020-06-30 20:55:15 +02001394 vim9script
1395 try
1396 throw 'one'
1397 .. 'two'
1398 catch
1399 assert_equal('onetwo', v:exception)
1400 endtry
1401 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001402 v9.CheckScriptSuccess(lines)
Bram Moolenaar1e021e62020-10-16 20:25:23 +02001403
1404 lines =<< trim END
1405 vim9script
Bram Moolenaar352134b2020-10-17 22:04:08 +02001406 @r = ''
Bram Moolenaar1e021e62020-10-16 20:25:23 +02001407 def Func()
1408 throw @r
1409 enddef
1410 var result = ''
1411 try
1412 Func()
1413 catch /E1129:/
1414 result = 'caught'
1415 endtry
1416 assert_equal('caught', result)
1417 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001418 v9.CheckScriptSuccess(lines)
Bram Moolenaar006ad482020-06-30 20:55:15 +02001419enddef
1420
Bram Moolenaared677f52020-08-12 16:38:10 +02001421def Test_error_in_nested_function()
Bram Moolenaar03dfde22021-02-14 13:17:22 +01001422 # an error in a nested :function aborts executing in the calling :def function
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001423 var lines =<< trim END
Bram Moolenaared677f52020-08-12 16:38:10 +02001424 vim9script
1425 def Func()
1426 Error()
1427 g:test_var = 1
1428 enddef
1429 func Error() abort
1430 eval [][0]
1431 endfunc
1432 Func()
1433 END
1434 g:test_var = 0
Bram Moolenaar62aec932022-01-29 21:45:34 +00001435 v9.CheckScriptFailure(lines, 'E684:')
Bram Moolenaared677f52020-08-12 16:38:10 +02001436 assert_equal(0, g:test_var)
1437enddef
1438
Bram Moolenaar227c58a2021-04-28 20:40:44 +02001439def Test_abort_after_error()
1440 var lines =<< trim END
1441 vim9script
1442 while true
1443 echo notfound
1444 endwhile
1445 g:gotthere = true
1446 END
1447 g:gotthere = false
Bram Moolenaar62aec932022-01-29 21:45:34 +00001448 v9.CheckScriptFailure(lines, 'E121:')
Bram Moolenaar227c58a2021-04-28 20:40:44 +02001449 assert_false(g:gotthere)
1450 unlet g:gotthere
1451enddef
1452
Bram Moolenaar37c83712020-06-30 21:18:36 +02001453def Test_cexpr_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001454 # only checks line continuation
Bram Moolenaar37c83712020-06-30 21:18:36 +02001455 set errorformat=File\ %f\ line\ %l
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001456 var lines =<< trim END
Bram Moolenaar37c83712020-06-30 21:18:36 +02001457 vim9script
1458 cexpr 'File'
1459 .. ' someFile' ..
1460 ' line 19'
1461 assert_equal(19, getqflist()[0].lnum)
1462 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001463 v9.CheckScriptSuccess(lines)
Bram Moolenaar397a87a2022-03-20 21:14:15 +00001464
1465 lines =<< trim END
1466 vim9script
1467 def CexprFail()
1468 au QuickfixCmdPre * echo g:doesnotexist
1469 cexpr 'File otherFile line 99'
1470 g:didContinue = 'yes'
1471 enddef
1472 CexprFail()
1473 g:didContinue = 'also'
1474 END
1475 g:didContinue = 'no'
1476 v9.CheckScriptFailure(lines, 'E121: Undefined variable: g:doesnotexist')
1477 assert_equal('no', g:didContinue)
1478 au! QuickfixCmdPre
1479
1480 lines =<< trim END
1481 vim9script
1482 def CexprFail()
1483 cexpr g:aNumber
1484 g:didContinue = 'yes'
1485 enddef
1486 CexprFail()
1487 g:didContinue = 'also'
1488 END
1489 g:aNumber = 123
1490 g:didContinue = 'no'
1491 v9.CheckScriptFailure(lines, 'E777: String or List expected')
1492 assert_equal('no', g:didContinue)
1493 unlet g:didContinue
1494
Bram Moolenaar37c83712020-06-30 21:18:36 +02001495 set errorformat&
1496enddef
1497
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001498def Test_statusline_syntax()
1499 # legacy syntax is used for 'statusline'
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001500 var lines =<< trim END
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001501 vim9script
1502 func g:Status()
1503 return '%{"x" is# "x"}'
1504 endfunc
1505 set laststatus=2 statusline=%!Status()
1506 redrawstatus
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00001507 set laststatus statusline=
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001508 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001509 v9.CheckScriptSuccess(lines)
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001510enddef
1511
Bram Moolenaarb2097502020-07-19 17:17:02 +02001512def Test_list_vimscript()
1513 # checks line continuation and comments
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001514 var lines =<< trim END
Bram Moolenaarb2097502020-07-19 17:17:02 +02001515 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001516 var mylist = [
Bram Moolenaarb2097502020-07-19 17:17:02 +02001517 'one',
1518 # comment
1519 'two', # empty line follows
1520
1521 'three',
1522 ]
1523 assert_equal(['one', 'two', 'three'], mylist)
1524 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001525 v9.CheckScriptSuccess(lines)
Bram Moolenaar66250c92020-08-20 15:02:42 +02001526
1527 # check all lines from heredoc are kept
1528 lines =<< trim END
1529 # comment 1
1530 two
1531 # comment 3
1532
1533 five
1534 # comment 6
1535 END
1536 assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
Bram Moolenaar4bce26b2021-01-22 22:06:56 +01001537
1538 lines =<< trim END
1539 [{
1540 a: 0}]->string()->assert_equal("[{'a': 0}]")
1541 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001542 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarb2097502020-07-19 17:17:02 +02001543enddef
1544
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001545if has('channel')
1546 let someJob = test_null_job()
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001547
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001548 def FuncWithError()
1549 echomsg g:someJob
1550 enddef
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001551
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001552 func Test_convert_emsg_to_exception()
1553 try
1554 call FuncWithError()
1555 catch
1556 call assert_match('Vim:E908:', v:exception)
1557 endtry
1558 endfunc
1559endif
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001560
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001561def Test_vim9script_mix()
1562 var lines =<< trim END
1563 if has(g:feature)
1564 " legacy script
1565 let g:legacy = 1
1566 finish
1567 endif
1568 vim9script
1569 g:legacy = 0
1570 END
1571 g:feature = 'eval'
1572 g:legacy = -1
Bram Moolenaar62aec932022-01-29 21:45:34 +00001573 v9.CheckScriptSuccess(lines)
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001574 assert_equal(1, g:legacy)
1575
1576 g:feature = 'noteval'
1577 g:legacy = -1
Bram Moolenaar62aec932022-01-29 21:45:34 +00001578 v9.CheckScriptSuccess(lines)
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001579 assert_equal(0, g:legacy)
1580enddef
1581
Bram Moolenaar750802b2020-02-23 18:08:33 +01001582def Test_vim9script_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001583 v9.CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
1584 v9.CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +01001585
Bram Moolenaar62aec932022-01-29 21:45:34 +00001586 v9.CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1587 v9.CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
Bram Moolenaarc785b9a2020-06-19 18:34:15 +02001588
Bram Moolenaare2e40752020-09-04 21:18:46 +02001589 assert_fails('vim9script', 'E1038:')
Bram Moolenaar107f7322022-02-06 17:30:41 +00001590 v9.CheckDefFailure(['vim9script'], 'E1038:')
Bram Moolenaar8cbf2492022-02-06 20:28:13 +00001591
1592 # no error when skipping
1593 if has('nothing')
1594 vim9script
1595 endif
Bram Moolenaarc970e422021-03-17 15:03:04 +01001596enddef
1597
Bram Moolenaar6c3843c2021-03-04 12:38:21 +01001598def Test_script_var_shadows_function()
1599 var lines =<< trim END
1600 vim9script
1601 def Func(): number
1602 return 123
1603 enddef
1604 var Func = 1
1605 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001606 v9.CheckScriptFailure(lines, 'E1041:', 5)
Bram Moolenaar6c3843c2021-03-04 12:38:21 +01001607enddef
1608
Bram Moolenaar052ff292021-12-11 13:54:46 +00001609def Test_function_shadows_script_var()
1610 var lines =<< trim END
1611 vim9script
1612 var Func = 1
1613 def Func(): number
1614 return 123
1615 enddef
1616 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001617 v9.CheckScriptFailure(lines, 'E1041:', 3)
Bram Moolenaar052ff292021-12-11 13:54:46 +00001618enddef
1619
Bram Moolenaarc3235272021-07-10 19:42:03 +02001620def Test_script_var_shadows_command()
1621 var lines =<< trim END
1622 var undo = 1
1623 undo = 2
1624 assert_equal(2, undo)
1625 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001626 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc3235272021-07-10 19:42:03 +02001627
1628 lines =<< trim END
1629 var undo = 1
1630 undo
1631 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001632 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaarc3235272021-07-10 19:42:03 +02001633enddef
1634
Bram Moolenaar2ef91562021-12-11 16:14:07 +00001635def Test_vim9script_call_wrong_type()
1636 var lines =<< trim END
1637 vim9script
1638 var Time = 'localtime'
1639 Time()
1640 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001641 v9.CheckScriptFailure(lines, 'E1085:')
Bram Moolenaar2ef91562021-12-11 16:14:07 +00001642enddef
1643
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001644def Test_vim9script_reload_delfunc()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001645 var first_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001646 vim9script
1647 def FuncYes(): string
1648 return 'yes'
1649 enddef
1650 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001651 var withno_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001652 def FuncNo(): string
1653 return 'no'
1654 enddef
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001655 def g:DoCheck(no_exists: bool)
1656 assert_equal('yes', FuncYes())
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001657 assert_equal('no', FuncNo())
1658 enddef
1659 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001660 var nono_lines =<< trim END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001661 def g:DoCheck(no_exists: bool)
1662 assert_equal('yes', FuncYes())
Bram Moolenaar44d66522020-09-06 22:26:57 +02001663 assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001664 enddef
1665 END
1666
1667 # FuncNo() is defined
Bram Moolenaardd674772022-09-15 22:26:18 +01001668 writefile(first_lines + withno_lines, 'Xreloaded.vim', 'D')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001669 source Xreloaded.vim
1670 g:DoCheck(true)
1671
1672 # FuncNo() is not redefined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001673 writefile(first_lines + nono_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001674 source Xreloaded.vim
Bram Moolenaar50824712020-12-20 21:10:17 +01001675 g:DoCheck(false)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001676
1677 # FuncNo() is back
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001678 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001679 source Xreloaded.vim
Bram Moolenaar50824712020-12-20 21:10:17 +01001680 g:DoCheck(false)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001681enddef
1682
Bram Moolenaar89483d42020-05-10 15:24:44 +02001683def Test_vim9script_reload_delvar()
1684 # write the script with a script-local variable
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001685 var lines =<< trim END
Bram Moolenaar89483d42020-05-10 15:24:44 +02001686 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001687 var name = 'string'
Bram Moolenaar89483d42020-05-10 15:24:44 +02001688 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001689 writefile(lines, 'XreloadVar.vim', 'D')
Bram Moolenaar89483d42020-05-10 15:24:44 +02001690 source XreloadVar.vim
1691
1692 # now write the script using the same variable locally - works
1693 lines =<< trim END
1694 vim9script
1695 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001696 var name = 'string'
Bram Moolenaar89483d42020-05-10 15:24:44 +02001697 enddef
1698 END
1699 writefile(lines, 'XreloadVar.vim')
1700 source XreloadVar.vim
Bram Moolenaar89483d42020-05-10 15:24:44 +02001701enddef
1702
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001703def Test_func_redefine_error()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001704 var lines = [
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001705 'vim9script',
1706 'def Func()',
1707 ' eval [][0]',
1708 'enddef',
1709 'Func()',
1710 ]
Bram Moolenaardd674772022-09-15 22:26:18 +01001711 writefile(lines, 'Xtestscript.vim', 'D')
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001712
1713 for count in range(3)
1714 try
1715 source Xtestscript.vim
1716 catch /E684/
1717 # function name should contain <SNR> every time
Bram Moolenaarec892232022-05-06 17:53:06 +01001718 assert_match('E684: List index out of range', v:exception)
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001719 assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1720 endtry
1721 endfor
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001722enddef
1723
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001724def Test_func_redefine_fails()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001725 var lines =<< trim END
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001726 vim9script
1727 def Func()
1728 echo 'one'
1729 enddef
1730 def Func()
1731 echo 'two'
1732 enddef
1733 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001734 v9.CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001735
1736 lines =<< trim END
1737 vim9script
1738 def Foo(): string
1739 return 'foo'
Bram Moolenaar052ff292021-12-11 13:54:46 +00001740 enddef
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001741 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001742 var Foo = {-> 'lambda'}
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001743 enddef
1744 defcompile
1745 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001746 v9.CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001747enddef
1748
Bram Moolenaar91c7cbf2022-08-18 13:28:31 +01001749def Test_lambda_split()
1750 # this was using freed memory, because of the split expression
1751 var lines =<< trim END
1752 vim9script
1753 try
1754 0
1755 0->(0
1756 ->a.0(
1757 ->u
1758 END
1759 v9.CheckScriptFailure(lines, 'E1050:')
1760enddef
1761
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001762def Test_fixed_size_list()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001763 # will be allocated as one piece of memory, check that changes work
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001764 var l = [1, 2, 3, 4]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001765 l->remove(0)
1766 l->add(5)
1767 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001768 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001769enddef
1770
Bram Moolenaarae616492020-07-28 20:07:27 +02001771def Test_no_insert_xit()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001772 v9.CheckDefExecFailure(['a = 1'], 'E1100:')
1773 v9.CheckDefExecFailure(['c = 1'], 'E1100:')
1774 v9.CheckDefExecFailure(['i = 1'], 'E1100:')
1775 v9.CheckDefExecFailure(['t = 1'], 'E1100:')
1776 v9.CheckDefExecFailure(['x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02001777
Bram Moolenaar62aec932022-01-29 21:45:34 +00001778 v9.CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1779 v9.CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1780 v9.CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1781 v9.CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1782 v9.CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1783 v9.CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1784 v9.CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
1785 v9.CheckScriptFailure(['vim9script', 'o'], 'E1100:')
1786 v9.CheckScriptFailure(['vim9script', 't'], 'E1100:')
1787 v9.CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1788 v9.CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02001789enddef
1790
Bram Moolenaar62aec932022-01-29 21:45:34 +00001791def s:IfElse(what: number): string
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001792 var res = ''
Bram Moolenaar158906c2020-02-06 20:39:45 +01001793 if what == 1
1794 res = "one"
1795 elseif what == 2
1796 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001797 else
Bram Moolenaar158906c2020-02-06 20:39:45 +01001798 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001799 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +01001800 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001801enddef
1802
Bram Moolenaar158906c2020-02-06 20:39:45 +01001803def Test_if_elseif_else()
1804 assert_equal('one', IfElse(1))
1805 assert_equal('two', IfElse(2))
1806 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001807enddef
1808
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001809def Test_if_elseif_else_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001810 v9.CheckDefFailure(['elseif true'], 'E582:')
1811 v9.CheckDefFailure(['else'], 'E581:')
1812 v9.CheckDefFailure(['endif'], 'E580:')
1813 v9.CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
1814 v9.CheckDefFailure(['if true', 'echo 1'], 'E171:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01001815
1816 var lines =<< trim END
1817 var s = ''
1818 if s = ''
1819 endif
1820 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001821 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01001822
1823 lines =<< trim END
1824 var s = ''
1825 if s == ''
1826 elseif s = ''
1827 endif
1828 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001829 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaarfa010cd2022-04-03 16:13:07 +01001830
1831 lines =<< trim END
1832 var cond = true
1833 if cond
1834 echo 'true'
1835 elseif
1836 echo 'false'
1837 endif
1838 END
1839 v9.CheckDefAndScriptFailure(lines, ['E1143:', 'E15:'], 4)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001840enddef
1841
Bram Moolenaar505ed0c2022-05-05 17:02:46 +01001842def Test_if_else_func_using_var()
1843 var lines =<< trim END
1844 vim9script
1845
1846 const debug = true
1847 if debug
1848 var mode_chars = 'something'
1849 def Bits2Ascii()
1850 var x = mode_chars
1851 g:where = 'in true'
1852 enddef
1853 else
1854 def Bits2Ascii()
1855 g:where = 'in false'
1856 enddef
1857 endif
1858
1859 Bits2Ascii()
1860 END
1861 v9.CheckScriptSuccess(lines)
1862 assert_equal('in true', g:where)
1863 unlet g:where
1864
1865 lines =<< trim END
1866 vim9script
1867
1868 const debug = false
1869 if debug
1870 var mode_chars = 'something'
1871 def Bits2Ascii()
1872 g:where = 'in true'
1873 enddef
1874 else
1875 def Bits2Ascii()
1876 var x = mode_chars
1877 g:where = 'in false'
1878 enddef
1879 endif
1880
1881 Bits2Ascii()
1882 END
1883 v9.CheckScriptFailure(lines, 'E1001: Variable not found: mode_chars')
1884enddef
1885
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001886let g:bool_true = v:true
1887let g:bool_false = v:false
1888
1889def Test_if_const_expr()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001890 var res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001891 if true ? true : false
1892 res = true
1893 endif
1894 assert_equal(true, res)
1895
Bram Moolenaar585fea72020-04-02 22:33:21 +02001896 g:glob = 2
1897 if false
Bram Moolenaar67979662020-06-20 22:50:47 +02001898 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001899 endif
1900 assert_equal(2, g:glob)
1901 if true
Bram Moolenaar67979662020-06-20 22:50:47 +02001902 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001903 endif
1904 assert_equal(3, g:glob)
1905
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001906 res = false
1907 if g:bool_true ? true : false
1908 res = true
1909 endif
1910 assert_equal(true, res)
1911
1912 res = false
1913 if true ? g:bool_true : false
1914 res = true
1915 endif
1916 assert_equal(true, res)
1917
1918 res = false
1919 if true ? true : g:bool_false
1920 res = true
1921 endif
1922 assert_equal(true, res)
1923
1924 res = false
1925 if true ? false : true
1926 res = true
1927 endif
1928 assert_equal(false, res)
1929
1930 res = false
1931 if false ? false : true
1932 res = true
1933 endif
1934 assert_equal(true, res)
1935
1936 res = false
1937 if false ? true : false
1938 res = true
1939 endif
1940 assert_equal(false, res)
1941
1942 res = false
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001943 if has('xyz') ? true : false
1944 res = true
1945 endif
1946 assert_equal(false, res)
1947
1948 res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001949 if true && true
1950 res = true
1951 endif
1952 assert_equal(true, res)
1953
1954 res = false
1955 if true && false
1956 res = true
1957 endif
1958 assert_equal(false, res)
1959
1960 res = false
1961 if g:bool_true && false
1962 res = true
1963 endif
1964 assert_equal(false, res)
1965
1966 res = false
1967 if true && g:bool_false
1968 res = true
1969 endif
1970 assert_equal(false, res)
1971
1972 res = false
1973 if false && false
1974 res = true
1975 endif
1976 assert_equal(false, res)
1977
1978 res = false
1979 if true || false
1980 res = true
1981 endif
1982 assert_equal(true, res)
1983
1984 res = false
1985 if g:bool_true || false
1986 res = true
1987 endif
1988 assert_equal(true, res)
1989
1990 res = false
1991 if true || g:bool_false
1992 res = true
1993 endif
1994 assert_equal(true, res)
1995
1996 res = false
1997 if false || false
1998 res = true
1999 endif
2000 assert_equal(false, res)
Bram Moolenaar3988f642020-08-27 22:43:03 +02002001
2002 # with constant "false" expression may be invalid so long as the syntax is OK
Bram Moolenaarc3235272021-07-10 19:42:03 +02002003 if false | eval 1 + 2 | endif
Bram Moolenaar3988f642020-08-27 22:43:03 +02002004 if false | eval burp + 234 | endif
2005 if false | echo burp 234 'asd' | endif
2006 if false
2007 burp
2008 endif
Bram Moolenaare525bdd2021-08-07 18:12:40 +02002009
Bram Moolenaar21ebb082022-02-04 21:58:58 +00002010 if 0
2011 if 1
2012 echo nothing
2013 elseif 1
2014 echo still nothing
2015 endif
2016 endif
2017
Bram Moolenaare525bdd2021-08-07 18:12:40 +02002018 # expression with line breaks skipped
2019 if false
2020 ('aaa'
2021 .. 'bbb'
2022 .. 'ccc'
2023 )->setline(1)
2024 endif
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02002025enddef
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002026
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02002027def Test_if_const_expr_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00002028 v9.CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2029 v9.CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2030 v9.CheckDefFailure(["if has('aaa'"], 'E110:')
2031 v9.CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002032enddef
2033
Bram Moolenaar62aec932022-01-29 21:45:34 +00002034def s:RunNested(i: number): number
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002035 var x: number = 0
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002036 if i % 2
2037 if 1
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002038 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002039 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002040 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002041 endif
2042 x += 1
2043 else
2044 x += 1000
2045 endif
2046 return x
2047enddef
2048
2049def Test_nested_if()
2050 assert_equal(1, RunNested(1))
2051 assert_equal(1000, RunNested(2))
2052enddef
2053
Bram Moolenaarad39c092020-02-26 18:23:43 +01002054def Test_execute_cmd()
Bram Moolenaare4984292020-12-13 14:19:25 +01002055 # missing argument is ignored
2056 execute
2057 execute # comment
2058
Bram Moolenaarad39c092020-02-26 18:23:43 +01002059 new
2060 setline(1, 'default')
Bram Moolenaard2c61702020-09-06 15:58:36 +02002061 execute 'setline(1, "execute-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002062 assert_equal('execute-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002063
Bram Moolenaard2c61702020-09-06 15:58:36 +02002064 execute "setline(1, 'execute-string')"
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002065 assert_equal('execute-string', getline(1))
2066
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002067 var cmd1 = 'setline(1,'
2068 var cmd2 = '"execute-var")'
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002069 execute cmd1 cmd2 # comment
Bram Moolenaarad39c092020-02-26 18:23:43 +01002070 assert_equal('execute-var', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002071
Bram Moolenaard2c61702020-09-06 15:58:36 +02002072 execute cmd1 cmd2 '|setline(1, "execute-var-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002073 assert_equal('execute-var-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002074
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002075 var cmd_first = 'call '
2076 var cmd_last = 'setline(1, "execute-var-var")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002077 execute cmd_first .. cmd_last
2078 assert_equal('execute-var-var', getline(1))
2079 bwipe!
Bram Moolenaar585fea72020-04-02 22:33:21 +02002080
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002081 var n = true
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02002082 execute 'echomsg' (n ? '"true"' : '"no"')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002083 assert_match('^true$', g:Screenline(&lines))
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02002084
Bram Moolenaare0de1712020-12-02 17:36:54 +01002085 echomsg [1, 2, 3] {a: 1, b: 2}
Bram Moolenaar62aec932022-01-29 21:45:34 +00002086 assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', g:Screenline(&lines))
Bram Moolenaare5abf7a2020-08-16 18:29:35 +02002087
Bram Moolenaar62aec932022-01-29 21:45:34 +00002088 v9.CheckDefFailure(['execute xxx'], 'E1001:', 1)
2089 v9.CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2090 v9.CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
Bram Moolenaar0c7f2612022-02-17 19:44:07 +00002091 if has('channel')
2092 v9.CheckDefExecFailure(['execute test_null_channel()'], 'E908:', 1)
2093 endif
Bram Moolenaarad39c092020-02-26 18:23:43 +01002094enddef
2095
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002096def Test_execute_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002097 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002098 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002099 vim9script
2100 execute 'g:someVar'
2101 .. ' = ' ..
2102 '28'
2103 assert_equal(28, g:someVar)
2104 unlet g:someVar
2105 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002106 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002107enddef
2108
Bram Moolenaar43216612022-03-25 11:16:28 +00002109def Test_execute_finish()
2110 # the empty lines are relevant here
2111 var lines =<< trim END
2112 vim9script
2113
2114 var vname = "g:hello"
2115
2116 if exists(vname) | finish | endif | execute vname '= "world"'
2117
2118 assert_equal('world', g:hello)
2119
2120 if exists(vname) | finish | endif | execute vname '= "world"'
2121
2122 assert_report('should not be reached')
2123 END
2124 v9.CheckScriptSuccess(lines)
2125enddef
2126
Bram Moolenaarad39c092020-02-26 18:23:43 +01002127def Test_echo_cmd()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002128 echo 'some' # comment
Bram Moolenaar585fea72020-04-02 22:33:21 +02002129 echon 'thing'
Bram Moolenaar62aec932022-01-29 21:45:34 +00002130 assert_match('^something$', g:Screenline(&lines))
Bram Moolenaarad39c092020-02-26 18:23:43 +01002131
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002132 echo "some" # comment
2133 echon "thing"
Bram Moolenaar62aec932022-01-29 21:45:34 +00002134 assert_match('^something$', g:Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002135
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002136 var str1 = 'some'
2137 var str2 = 'more'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002138 echo str1 str2
Bram Moolenaar62aec932022-01-29 21:45:34 +00002139 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002140
Bram Moolenaar397a87a2022-03-20 21:14:15 +00002141 echo "one\ntwo"
2142 assert_match('^one$', g:Screenline(&lines - 1))
2143 assert_match('^two$', g:Screenline(&lines))
2144
Bram Moolenaar62aec932022-01-29 21:45:34 +00002145 v9.CheckDefFailure(['echo "xxx"# comment'], 'E488:')
Bram Moolenaarad39c092020-02-26 18:23:43 +01002146enddef
2147
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002148def Test_echomsg_cmd()
2149 echomsg 'some' 'more' # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00002150 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002151 echo 'clear'
Bram Moolenaardf069ee2020-06-22 23:02:51 +02002152 :1messages
Bram Moolenaar62aec932022-01-29 21:45:34 +00002153 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002154
Bram Moolenaar62aec932022-01-29 21:45:34 +00002155 v9.CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002156enddef
2157
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002158def Test_echomsg_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002159 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002160 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002161 vim9script
2162 echomsg 'here'
2163 .. ' is ' ..
2164 'a message'
Bram Moolenaar62aec932022-01-29 21:45:34 +00002165 assert_match('^here is a message$', g:Screenline(&lines))
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002166 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002167 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002168enddef
2169
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002170def Test_echoerr_cmd()
Bram Moolenaar7de62622021-08-07 15:05:47 +02002171 var local = 'local'
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002172 try
Bram Moolenaar7de62622021-08-07 15:05:47 +02002173 echoerr 'something' local 'wrong' # comment
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002174 catch
Bram Moolenaar7de62622021-08-07 15:05:47 +02002175 assert_match('something local wrong', v:exception)
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002176 endtry
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002177enddef
2178
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002179def Test_echoerr_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002180 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002181 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002182 vim9script
2183 try
2184 echoerr 'this'
2185 .. ' is ' ..
2186 'wrong'
2187 catch
2188 assert_match('this is wrong', v:exception)
2189 endtry
2190 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002191 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002192enddef
2193
Bram Moolenaar7de62622021-08-07 15:05:47 +02002194def Test_echoconsole_cmd()
2195 var local = 'local'
2196 echoconsole 'something' local # comment
2197 # output goes anywhere
2198enddef
2199
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002200def Test_echowindow_cmd()
2201 var local = 'local'
2202 echowindow 'something' local # comment
Bram Moolenaar2435adf2022-10-21 12:05:46 +01002203
2204 # with modifier
2205 unsilent echowin 'loud'
2206
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002207 # output goes in message window
2208 popup_clear()
2209enddef
2210
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002211def Test_for_outside_of_function()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002212 var lines =<< trim END
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002213 vim9script
2214 new
2215 for var in range(0, 3)
2216 append(line('$'), var)
2217 endfor
2218 assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
2219 bwipe!
Bram Moolenaar522eefd2021-03-26 18:49:22 +01002220
2221 var result = ''
2222 for i in [1, 2, 3]
2223 var loop = ' loop ' .. i
2224 result ..= loop
2225 endfor
2226 assert_equal(' loop 1 loop 2 loop 3', result)
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002227 END
Bram Moolenaardd674772022-09-15 22:26:18 +01002228 writefile(lines, 'Xvim9for.vim', 'D')
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002229 source Xvim9for.vim
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002230enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002231
rbtnnbebf0692021-08-21 17:26:50 +02002232def Test_for_skipped_block()
2233 # test skipped blocks at outside of function
2234 var lines =<< trim END
2235 var result = []
2236 if true
2237 for n in [1, 2]
2238 result += [n]
2239 endfor
2240 else
2241 for n in [3, 4]
2242 result += [n]
2243 endfor
2244 endif
2245 assert_equal([1, 2], result)
2246
2247 result = []
2248 if false
2249 for n in [1, 2]
2250 result += [n]
2251 endfor
2252 else
2253 for n in [3, 4]
2254 result += [n]
2255 endfor
2256 endif
2257 assert_equal([3, 4], result)
2258 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002259 v9.CheckDefAndScriptSuccess(lines)
rbtnnbebf0692021-08-21 17:26:50 +02002260
2261 # test skipped blocks at inside of function
2262 lines =<< trim END
2263 def DefTrue()
2264 var result = []
2265 if true
2266 for n in [1, 2]
2267 result += [n]
2268 endfor
2269 else
2270 for n in [3, 4]
2271 result += [n]
2272 endfor
2273 endif
2274 assert_equal([1, 2], result)
2275 enddef
2276 DefTrue()
2277
2278 def DefFalse()
2279 var result = []
2280 if false
2281 for n in [1, 2]
2282 result += [n]
2283 endfor
2284 else
2285 for n in [3, 4]
2286 result += [n]
2287 endfor
2288 endif
2289 assert_equal([3, 4], result)
2290 enddef
2291 DefFalse()
Bram Moolenaar97f8c102022-04-02 19:43:57 +01002292
2293 def BuildDiagrams()
2294 var diagrams: list<any>
2295 if false
2296 var max = 0
2297 for v in diagrams
2298 var l = 3
2299 if max < l | max = l | endif
2300 v->add(l)
2301 endfor
2302 endif
2303 enddef
2304 BuildDiagrams()
rbtnnbebf0692021-08-21 17:26:50 +02002305 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002306 v9.CheckDefAndScriptSuccess(lines)
rbtnnbebf0692021-08-21 17:26:50 +02002307enddef
2308
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002309def Test_skipped_redir()
2310 var lines =<< trim END
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002311 def Tredir()
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002312 if 0
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002313 redir => l[0]
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002314 redir END
2315 endif
2316 enddef
2317 defcompile
2318 END
2319 v9.CheckScriptSuccess(lines)
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002320 delfunc g:Tredir
2321
2322 lines =<< trim END
2323 def Tredir()
2324 if 0
2325 redir => l[0]
2326 endif
2327 echo 'executed'
2328 if 0
2329 redir END
2330 endif
2331 enddef
2332 defcompile
2333 END
2334 v9.CheckScriptSuccess(lines)
2335 delfunc g:Tredir
2336
2337 lines =<< trim END
2338 def Tredir()
2339 var l = ['']
2340 if 1
2341 redir => l[0]
2342 endif
2343 echo 'executed'
2344 if 0
2345 redir END
2346 else
2347 redir END
2348 endif
2349 enddef
2350 defcompile
2351 END
2352 v9.CheckScriptSuccess(lines)
2353 delfunc g:Tredir
2354
2355 lines =<< trim END
2356 let doit = 1
2357 def Tredir()
2358 var l = ['']
2359 if g:doit
2360 redir => l[0]
2361 endif
2362 echo 'executed'
2363 if g:doit
2364 redir END
2365 endif
2366 enddef
2367 defcompile
2368 END
2369 v9.CheckScriptSuccess(lines)
2370 delfunc g:Tredir
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002371enddef
2372
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002373def Test_for_loop()
Bram Moolenaarf2253962021-04-13 20:53:13 +02002374 var lines =<< trim END
2375 var result = ''
2376 for cnt in range(7)
2377 if cnt == 4
2378 break
2379 endif
2380 if cnt == 2
2381 continue
2382 endif
2383 result ..= cnt .. '_'
2384 endfor
2385 assert_equal('0_1_3_', result)
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02002386
Bram Moolenaarf2253962021-04-13 20:53:13 +02002387 var concat = ''
2388 for str in eval('["one", "two"]')
2389 concat ..= str
2390 endfor
2391 assert_equal('onetwo', concat)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002392
Bram Moolenaarf2253962021-04-13 20:53:13 +02002393 var total = 0
2394 for nr in
2395 [1, 2, 3]
2396 total += nr
2397 endfor
2398 assert_equal(6, total)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002399
Bram Moolenaarf2253962021-04-13 20:53:13 +02002400 total = 0
2401 for nr
2402 in [1, 2, 3]
2403 total += nr
2404 endfor
2405 assert_equal(6, total)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002406
Bram Moolenaarf2253962021-04-13 20:53:13 +02002407 total = 0
2408 for nr
2409 in
2410 [1, 2, 3]
2411 total += nr
2412 endfor
2413 assert_equal(6, total)
Bram Moolenaar036d0712021-01-17 20:23:38 +01002414
Bram Moolenaara3589a02021-04-14 13:30:46 +02002415 # with type
2416 total = 0
2417 for n: number in [1, 2, 3]
2418 total += n
2419 endfor
2420 assert_equal(6, total)
2421
Bram Moolenaarefd73ae2022-03-20 18:51:00 +00002422 total = 0
2423 for b in 0z010203
2424 total += b
2425 endfor
2426 assert_equal(6, total)
2427
Bram Moolenaarfe090eb2021-04-15 21:48:32 +02002428 var chars = ''
2429 for s: string in 'foobar'
2430 chars ..= s
2431 endfor
2432 assert_equal('foobar', chars)
2433
Bram Moolenaar5ede5b22021-07-07 21:55:25 +02002434 chars = ''
2435 for x: string in {a: 'a', b: 'b'}->values()
2436 chars ..= x
2437 endfor
2438 assert_equal('ab', chars)
2439
Bram Moolenaara3589a02021-04-14 13:30:46 +02002440 # unpack with type
Bram Moolenaarf2253962021-04-13 20:53:13 +02002441 var res = ''
Bram Moolenaara3589a02021-04-14 13:30:46 +02002442 for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2443 res ..= n .. s
2444 endfor
2445 assert_equal('1a2b', res)
2446
Bram Moolenaar444d8782021-06-26 12:40:56 +02002447 # unpack with one var
2448 var reslist = []
2449 for [x] in [['aaa'], ['bbb']]
2450 reslist->add(x)
2451 endfor
2452 assert_equal(['aaa', 'bbb'], reslist)
2453
Bram Moolenaara3589a02021-04-14 13:30:46 +02002454 # loop over string
2455 res = ''
Bram Moolenaarf2253962021-04-13 20:53:13 +02002456 for c in 'aéc̀d'
2457 res ..= c .. '-'
2458 endfor
2459 assert_equal('a-é-c̀-d-', res)
2460
2461 res = ''
2462 for c in ''
2463 res ..= c .. '-'
2464 endfor
2465 assert_equal('', res)
2466
2467 res = ''
2468 for c in test_null_string()
2469 res ..= c .. '-'
2470 endfor
2471 assert_equal('', res)
2472
Bram Moolenaar10611952022-04-03 21:11:34 +01002473 total = 0
2474 for c in null_list
2475 total += 1
2476 endfor
2477 assert_equal(0, total)
2478
2479 for c in null_blob
2480 total += 1
2481 endfor
2482 assert_equal(0, total)
2483
Bram Moolenaarf2253962021-04-13 20:53:13 +02002484 var foo: list<dict<any>> = [
2485 {a: 'Cat'}
2486 ]
2487 for dd in foo
2488 dd.counter = 12
2489 endfor
2490 assert_equal([{a: 'Cat', counter: 12}], foo)
Bram Moolenaarad2d4962021-07-18 17:08:50 +02002491
2492 reslist = []
2493 for _ in range(3)
2494 reslist->add('x')
2495 endfor
2496 assert_equal(['x', 'x', 'x'], reslist)
Bram Moolenaarf2253962021-04-13 20:53:13 +02002497 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002498 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002499enddef
2500
Bram Moolenaar159b2d52022-10-11 21:41:25 +01002501def Test_for_loop_list_of_lists()
2502 # loop variable is final, not const
2503 var lines =<< trim END
2504 # Filter out all odd numbers in each sublist
2505 var list: list<list<number>> = [[1], [1, 2], [1, 2, 3], [1, 2, 3, 4]]
2506 for i in list
2507 filter(i, (_, n: number): bool => n % 2 == 0)
2508 endfor
2509
2510 assert_equal([[], [2], [2], [2, 4]], list)
2511 END
2512 v9.CheckDefAndScriptSuccess(lines)
2513enddef
2514
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002515def Test_for_loop_with_closure()
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002516 # using the loop variable in a closure results in the last used value
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002517 var lines =<< trim END
2518 var flist: list<func>
2519 for i in range(5)
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002520 flist[i] = () => i
2521 endfor
2522 for i in range(5)
2523 assert_equal(4, flist[i]())
2524 endfor
2525 END
2526 v9.CheckDefAndScriptSuccess(lines)
2527
Bram Moolenaardd674772022-09-15 22:26:18 +01002528 # also works when the loop variable is used only once halfway the loops
2529 lines =<< trim END
2530 var Clo: func
2531 for i in range(5)
2532 if i == 3
2533 Clo = () => i
2534 endif
2535 endfor
2536 assert_equal(4, Clo())
2537 END
2538 v9.CheckDefAndScriptSuccess(lines)
2539
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002540 # using a local variable set to the loop variable in a closure results in the
2541 # value at that moment
2542 lines =<< trim END
2543 var flist: list<func>
2544 for i in range(5)
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002545 var inloop = i
2546 flist[i] = () => inloop
2547 endfor
2548 for i in range(5)
Bram Moolenaar353b68a2022-09-13 21:10:45 +01002549 assert_equal(i, flist[i]())
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002550 endfor
2551 END
Bram Moolenaar0cdfb7c2022-09-17 15:44:52 +01002552 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002553
Bram Moolenaara275f2c2022-10-11 20:04:09 +01002554 # also with an extra block level
2555 lines =<< trim END
2556 var flist: list<func>
2557 for i in range(5)
2558 {
2559 var inloop = i
2560 flist[i] = () => inloop
2561 }
2562 endfor
2563 for i in range(5)
2564 assert_equal(i, flist[i]())
2565 endfor
2566 END
2567 v9.CheckDefAndScriptSuccess(lines)
2568
2569 # and declaration in higher block
2570 lines =<< trim END
2571 var flist: list<func>
2572 for i in range(5)
2573 var inloop = i
2574 {
2575 flist[i] = () => inloop
2576 }
2577 endfor
2578 for i in range(5)
2579 assert_equal(i, flist[i]())
2580 endfor
2581 END
2582 v9.CheckDefAndScriptSuccess(lines)
2583
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002584 lines =<< trim END
2585 var flist: list<func>
2586 for i in range(5)
2587 var inloop = i
2588 flist[i] = () => {
2589 return inloop
2590 }
2591 endfor
2592 for i in range(5)
Bram Moolenaar353b68a2022-09-13 21:10:45 +01002593 assert_equal(i, flist[i]())
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002594 endfor
2595 END
Bram Moolenaar0cdfb7c2022-09-17 15:44:52 +01002596 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaardbbb02b2022-09-18 12:00:21 +01002597
2598 # Also works for a nested loop
2599 lines =<< trim END
2600 var flist: list<func>
2601 var n = 0
2602 for i in range(3)
2603 var ii = i
2604 for a in ['a', 'b', 'c']
2605 var aa = a
2606 flist[n] = () => ii .. aa
2607 ++n
2608 endfor
2609 endfor
2610
2611 n = 0
2612 for i in range(3)
2613 for a in ['a', 'b', 'c']
2614 assert_equal(i .. a, flist[n]())
2615 ++n
2616 endfor
2617 endfor
2618 END
Bram Moolenaarcc341812022-09-19 15:54:34 +01002619 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaare8e369a2022-09-21 18:59:14 +01002620
2621 # using two loop variables
2622 lines =<< trim END
2623 var lv_list: list<func>
2624 var copy_list: list<func>
2625 for [idx, c] in items('word')
2626 var lidx = idx
2627 var lc = c
2628 lv_list[idx] = () => {
2629 return idx .. c
2630 }
2631 copy_list[idx] = () => {
2632 return lidx .. lc
2633 }
2634 endfor
2635 for [i, c] in items('word')
2636 assert_equal(3 .. 'd', lv_list[i]())
2637 assert_equal(i .. c, copy_list[i]())
2638 endfor
2639 END
2640 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarcc341812022-09-19 15:54:34 +01002641enddef
2642
2643def Test_define_global_closure_in_loops()
2644 var lines =<< trim END
2645 vim9script
2646
2647 def Func()
2648 for i in range(3)
2649 var ii = i
2650 for a in ['a', 'b', 'c']
2651 var aa = a
2652 if ii == 0 && aa == 'a'
2653 def g:Global_0a(): string
2654 return ii .. aa
2655 enddef
2656 endif
2657 if ii == 1 && aa == 'b'
2658 def g:Global_1b(): string
2659 return ii .. aa
2660 enddef
2661 endif
2662 if ii == 2 && aa == 'c'
2663 def g:Global_2c(): string
2664 return ii .. aa
2665 enddef
2666 endif
2667 endfor
2668 endfor
2669 enddef
2670 Func()
2671 END
2672 v9.CheckScriptSuccess(lines)
2673 assert_equal("0a", g:Global_0a())
2674 assert_equal("1b", g:Global_1b())
2675 assert_equal("2c", g:Global_2c())
2676
2677 delfunc g:Global_0a
2678 delfunc g:Global_1b
2679 delfunc g:Global_2c
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002680enddef
2681
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002682def Test_for_loop_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00002683 v9.CheckDefAndScriptFailure(['for '], ['E1097:', 'E690:'])
2684 v9.CheckDefAndScriptFailure(['for x'], ['E1097:', 'E690:'])
2685 v9.CheckDefAndScriptFailure(['for x in'], ['E1097:', 'E15:'])
2686 v9.CheckDefAndScriptFailure(['for # in range(5)'], 'E690:')
2687 v9.CheckDefAndScriptFailure(['for i In range(5)'], 'E690:')
2688 v9.CheckDefAndScriptFailure(['var x = 5', 'for x in range(5)', 'endfor'], ['E1017:', 'E1041:'])
2689 v9.CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3)
2690 v9.CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01002691 delfunc! g:Func
Bram Moolenaar62aec932022-01-29 21:45:34 +00002692 v9.CheckDefFailure(['for i in xxx'], 'E1001:')
2693 v9.CheckDefFailure(['endfor'], 'E588:')
2694 v9.CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002695
2696 # wrong type detected at compile time
Bram Moolenaar62aec932022-01-29 21:45:34 +00002697 v9.CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002698
2699 # wrong type detected at runtime
2700 g:adict = {a: 1}
Bram Moolenaar62aec932022-01-29 21:45:34 +00002701 v9.CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002702 unlet g:adict
Bram Moolenaarf6a8d422021-04-13 21:48:03 +02002703
2704 var lines =<< trim END
2705 var d: list<dict<any>> = [{a: 0}]
2706 for e in d
2707 e = {a: 0, b: ''}
2708 endfor
2709 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002710 v9.CheckDefAndScriptFailure(lines, ['E1018:', 'E46:'], 3)
Bram Moolenaarfe090eb2021-04-15 21:48:32 +02002711
2712 lines =<< trim END
2713 for nr: number in ['foo']
2714 endfor
2715 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002716 v9.CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
Bram Moolenaar404557e2021-07-05 21:41:48 +02002717
2718 lines =<< trim END
2719 for n : number in [1, 2]
2720 echo n
2721 endfor
2722 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002723 v9.CheckDefAndScriptFailure(lines, 'E1059:', 1)
Bram Moolenaarefc5db52021-07-07 21:21:30 +02002724
2725 lines =<< trim END
2726 var d: dict<number> = {a: 1, b: 2}
2727 for [k: job, v: job] in d->items()
2728 echo k v
2729 endfor
2730 END
Bram Moolenaarbd3a9d22022-05-17 16:12:39 +01002731 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 +00002732
2733 lines =<< trim END
2734 var i = 0
2735 for i in [1, 2, 3]
2736 echo i
2737 endfor
2738 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002739 v9.CheckDefExecAndScriptFailure(lines, ['E1017:', 'E1041:'])
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002740
2741 lines =<< trim END
2742 var l = [0]
2743 for l[0] in [1, 2, 3]
2744 echo l[0]
2745 endfor
2746 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002747 v9.CheckDefExecAndScriptFailure(lines, ['E461:', 'E1017:'])
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002748
2749 lines =<< trim END
2750 var d = {x: 0}
2751 for d.x in [1, 2, 3]
2752 echo d.x
2753 endfor
2754 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002755 v9.CheckDefExecAndScriptFailure(lines, ['E461:', 'E1017:'])
Bram Moolenaara1c51952022-02-02 16:20:26 +00002756
2757 lines =<< trim END
2758 var l: list<dict<any>> = [{a: 1, b: 'x'}]
2759 for item: dict<number> in l
2760 echo item
2761 endfor
2762 END
2763 v9.CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected dict<number> but got dict<any>')
2764
2765 lines =<< trim END
2766 var l: list<dict<any>> = [{n: 1}]
2767 for item: dict<number> in l
Bram Moolenaarfa103972022-09-29 19:14:42 +01002768 var d = {s: ''}
2769 d->extend(item)
Bram Moolenaara1c51952022-02-02 16:20:26 +00002770 endfor
2771 END
Bram Moolenaarfa103972022-09-29 19:14:42 +01002772 v9.CheckDefExecAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected dict<string> but got dict<number>')
Bram Moolenaarcc341812022-09-19 15:54:34 +01002773
2774 lines =<< trim END
2775 for a in range(3)
2776 while a > 3
2777 for b in range(2)
2778 while b < 0
2779 for c in range(5)
2780 while c > 6
2781 while c < 0
2782 for d in range(1)
2783 for e in range(3)
2784 while e > 3
2785 endwhile
2786 endfor
2787 endfor
2788 endwhile
2789 endwhile
2790 endfor
2791 endwhile
2792 endfor
2793 endwhile
2794 endfor
2795 END
2796 v9.CheckDefSuccess(lines)
2797
2798 v9.CheckDefFailure(['for x in range(3)'] + lines + ['endfor'], 'E1306:')
Yegappan Lakshmanan062bb6b2023-12-16 14:46:40 +01002799
2800 # Test for too many for loops
2801 lines =<< trim END
2802 vim9script
2803 def Foo()
2804 for a in range(1)
2805 for b in range(1)
2806 for c in range(1)
2807 for d in range(1)
2808 for e in range(1)
2809 for f in range(1)
2810 for g in range(1)
2811 for h in range(1)
2812 for i in range(1)
2813 for j in range(1)
2814 for k in range(1)
2815 endfor
2816 endfor
2817 endfor
2818 endfor
2819 endfor
2820 endfor
2821 endfor
2822 endfor
2823 endfor
2824 endfor
2825 endfor
2826 enddef
2827 defcompile
2828 END
2829 v9.CheckSourceFailure(lines, 'E1306: Loop nesting too deep', 11)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002830enddef
2831
Bram Moolenaarea870692020-12-02 14:24:30 +01002832def Test_for_loop_script_var()
2833 # cannot use s:var in a :def function
Bram Moolenaar62aec932022-01-29 21:45:34 +00002834 v9.CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1254:')
Bram Moolenaarea870692020-12-02 14:24:30 +01002835
2836 # can use s:var in Vim9 script, with or without s:
2837 var lines =<< trim END
2838 vim9script
2839 var total = 0
2840 for s:var in [1, 2, 3]
2841 total += s:var
2842 endfor
2843 assert_equal(6, total)
2844
2845 total = 0
2846 for var in [1, 2, 3]
2847 total += var
2848 endfor
2849 assert_equal(6, total)
2850 END
2851enddef
2852
Bram Moolenaar792f7862020-11-23 08:31:18 +01002853def Test_for_loop_unpack()
Bram Moolenaar792f7862020-11-23 08:31:18 +01002854 var lines =<< trim END
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002855 var result = []
2856 for [v1, v2] in [[1, 2], [3, 4]]
2857 result->add(v1)
2858 result->add(v2)
2859 endfor
2860 assert_equal([1, 2, 3, 4], result)
2861
2862 result = []
2863 for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2864 result->add(v1)
2865 result->add(v2)
2866 result->add(v3)
2867 endfor
2868 assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2869
2870 result = []
2871 for [&ts, &sw] in [[1, 2], [3, 4]]
2872 result->add(&ts)
2873 result->add(&sw)
2874 endfor
2875 assert_equal([1, 2, 3, 4], result)
2876
2877 var slist: list<string>
2878 for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
2879 slist->add($LOOPVAR)
2880 slist->add(@r)
2881 slist->add(v:errmsg)
2882 endfor
2883 assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
2884
2885 slist = []
2886 for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
2887 slist->add(g:globalvar)
2888 slist->add(b:bufvar)
2889 slist->add(w:winvar)
2890 slist->add(t:tabvar)
2891 endfor
2892 assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
Bram Moolenaarf6c177a2020-12-04 17:38:00 +01002893 unlet! g:globalvar b:bufvar w:winvar t:tabvar
Bram Moolenaarb777da92021-05-22 21:40:39 +02002894
2895 var res = []
2896 for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
2897 res->add(n)
2898 endfor
2899 assert_equal([2, 5], res)
Bram Moolenaar61efa162022-03-18 13:10:48 +00002900
2901 var text: list<string> = ["hello there", "goodbye now"]
2902 var splitted = ''
2903 for [first; next] in mapnew(text, (i, v) => split(v))
2904 splitted ..= string(first) .. string(next) .. '/'
2905 endfor
2906 assert_equal("'hello'['there']/'goodbye'['now']/", splitted)
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002907 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002908 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002909
2910 lines =<< trim END
Bram Moolenaar792f7862020-11-23 08:31:18 +01002911 for [v1, v2] in [[1, 2, 3], [3, 4]]
2912 echo v1 v2
2913 endfor
2914 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002915 v9.CheckDefExecFailure(lines, 'E710:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01002916
2917 lines =<< trim END
2918 for [v1, v2] in [[1], [3, 4]]
2919 echo v1 v2
2920 endfor
2921 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002922 v9.CheckDefExecFailure(lines, 'E711:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01002923
2924 lines =<< trim END
2925 for [v1, v1] in [[1, 2], [3, 4]]
2926 echo v1
2927 endfor
2928 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002929 v9.CheckDefExecFailure(lines, 'E1017:', 1)
Bram Moolenaar95e4dd82022-04-27 22:15:40 +01002930
2931 lines =<< trim END
2932 for [a, b] in g:listlist
2933 echo a
2934 endfor
2935 END
2936 g:listlist = [1, 2, 3]
2937 v9.CheckDefExecFailure(lines, 'E1140:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01002938enddef
2939
Bram Moolenaarc150c092021-02-13 15:02:46 +01002940def Test_for_loop_with_try_continue()
Bram Moolenaarf2253962021-04-13 20:53:13 +02002941 var lines =<< trim END
2942 var looped = 0
2943 var cleanup = 0
2944 for i in range(3)
2945 looped += 1
2946 try
2947 eval [][0]
2948 catch
2949 continue
2950 finally
2951 cleanup += 1
2952 endtry
2953 endfor
2954 assert_equal(3, looped)
2955 assert_equal(3, cleanup)
2956 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002957 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc150c092021-02-13 15:02:46 +01002958enddef
2959
rbtnnd895b1d2021-08-20 20:54:25 +02002960def Test_while_skipped_block()
2961 # test skipped blocks at outside of function
2962 var lines =<< trim END
2963 var result = []
2964 var n = 0
2965 if true
2966 n = 1
2967 while n < 3
2968 result += [n]
2969 n += 1
2970 endwhile
2971 else
2972 n = 3
2973 while n < 5
2974 result += [n]
2975 n += 1
2976 endwhile
2977 endif
2978 assert_equal([1, 2], result)
2979
2980 result = []
2981 if false
2982 n = 1
2983 while n < 3
2984 result += [n]
2985 n += 1
2986 endwhile
2987 else
2988 n = 3
2989 while n < 5
2990 result += [n]
2991 n += 1
2992 endwhile
2993 endif
2994 assert_equal([3, 4], result)
2995 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002996 v9.CheckDefAndScriptSuccess(lines)
rbtnnd895b1d2021-08-20 20:54:25 +02002997
2998 # test skipped blocks at inside of function
2999 lines =<< trim END
3000 def DefTrue()
3001 var result = []
3002 var n = 0
3003 if true
3004 n = 1
3005 while n < 3
3006 result += [n]
3007 n += 1
3008 endwhile
3009 else
3010 n = 3
3011 while n < 5
3012 result += [n]
3013 n += 1
3014 endwhile
3015 endif
3016 assert_equal([1, 2], result)
3017 enddef
3018 DefTrue()
3019
3020 def DefFalse()
3021 var result = []
3022 var n = 0
3023 if false
3024 n = 1
3025 while n < 3
3026 result += [n]
3027 n += 1
3028 endwhile
3029 else
3030 n = 3
3031 while n < 5
3032 result += [n]
3033 n += 1
3034 endwhile
3035 endif
3036 assert_equal([3, 4], result)
3037 enddef
3038 DefFalse()
3039 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003040 v9.CheckDefAndScriptSuccess(lines)
rbtnnd895b1d2021-08-20 20:54:25 +02003041enddef
3042
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003043def Test_while_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003044 var result = ''
3045 var cnt = 0
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003046 while cnt < 555
3047 if cnt == 3
3048 break
3049 endif
3050 cnt += 1
3051 if cnt == 2
3052 continue
3053 endif
3054 result ..= cnt .. '_'
3055 endwhile
3056 assert_equal('1_3_', result)
Bram Moolenaardee37dc2021-02-07 16:40:05 +01003057
3058 var s = ''
Bram Moolenaar4b3e1962021-03-18 21:37:55 +01003059 while s == 'x' # {comment}
Bram Moolenaardee37dc2021-02-07 16:40:05 +01003060 endwhile
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003061enddef
3062
Bram Moolenaar7a53f292021-11-22 18:31:02 +00003063def Test_while_loop_in_script()
3064 var lines =<< trim END
3065 vim9script
3066 var result = ''
3067 var cnt = 0
3068 while cnt < 3
3069 var s = 'v' .. cnt
3070 result ..= s
3071 cnt += 1
3072 endwhile
3073 assert_equal('v0v1v2', result)
3074 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003075 v9.CheckScriptSuccess(lines)
Bram Moolenaar7a53f292021-11-22 18:31:02 +00003076enddef
3077
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02003078def Test_while_loop_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00003079 v9.CheckDefFailure(['while xxx'], 'E1001:')
3080 v9.CheckDefFailure(['endwhile'], 'E588:')
3081 v9.CheckDefFailure(['continue'], 'E586:')
3082 v9.CheckDefFailure(['if true', 'continue'], 'E586:')
3083 v9.CheckDefFailure(['break'], 'E587:')
3084 v9.CheckDefFailure(['if true', 'break'], 'E587:')
3085 v9.CheckDefFailure(['while 1', 'echo 3'], 'E170:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01003086
3087 var lines =<< trim END
3088 var s = ''
3089 while s = ''
3090 endwhile
3091 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003092 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaarbd5da372020-03-31 23:13:10 +02003093enddef
3094
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01003095def Test_interrupt_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003096 var caught = false
3097 var x = 0
Bram Moolenaar97acfc72020-03-22 13:44:28 +01003098 try
3099 while 1
3100 x += 1
3101 if x == 100
3102 feedkeys("\<C-C>", 'Lt')
3103 endif
3104 endwhile
3105 catch
3106 caught = true
3107 assert_equal(100, x)
3108 endtry
3109 assert_true(caught, 'should have caught an exception')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02003110 # consume the CTRL-C
3111 getchar(0)
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01003112enddef
Bram Moolenaar20431c92020-03-20 18:39:46 +01003113
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003114def Test_automatic_line_continuation()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003115 var mylist = [
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003116 'one',
3117 'two',
3118 'three',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003119 ] # comment
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003120 assert_equal(['one', 'two', 'three'], mylist)
3121
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003122 var mydict = {
Bram Moolenaare0de1712020-12-02 17:36:54 +01003123 ['one']: 1,
3124 ['two']: 2,
3125 ['three']:
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003126 3,
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003127 } # comment
Bram Moolenaare0de1712020-12-02 17:36:54 +01003128 assert_equal({one: 1, two: 2, three: 3}, mydict)
3129 mydict = {
Bram Moolenaar2c330432020-04-13 14:41:35 +02003130 one: 1, # comment
3131 two: # comment
3132 2, # comment
3133 three: 3 # comment
3134 }
Bram Moolenaare0de1712020-12-02 17:36:54 +01003135 assert_equal({one: 1, two: 2, three: 3}, mydict)
3136 mydict = {
Bram Moolenaar2c330432020-04-13 14:41:35 +02003137 one: 1,
3138 two:
3139 2,
3140 three: 3
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003141 }
Bram Moolenaare0de1712020-12-02 17:36:54 +01003142 assert_equal({one: 1, two: 2, three: 3}, mydict)
Bram Moolenaare6085c52020-04-12 20:19:16 +02003143
3144 assert_equal(
3145 ['one', 'two', 'three'],
3146 split('one two three')
3147 )
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003148enddef
3149
Bram Moolenaar7a092242020-04-16 22:10:49 +02003150def Test_vim9_comment()
Bram Moolenaar62aec932022-01-29 21:45:34 +00003151 v9.CheckScriptSuccess([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003152 'vim9script',
3153 '# something',
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003154 '#something',
Bram Moolenaar3f74c0a2022-08-06 18:12:06 +01003155 '#{{something',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003156 ])
Bram Moolenaar3f74c0a2022-08-06 18:12:06 +01003157 v9.CheckScriptFailure([
3158 'vim9script',
3159 '#{something',
3160 ], 'E1170:')
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003161
Bram Moolenaarb18b4962022-09-02 21:55:50 +01003162 split Xv9cfile
Bram Moolenaar62aec932022-01-29 21:45:34 +00003163 v9.CheckScriptSuccess([
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003164 'vim9script',
3165 'edit #something',
3166 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003167 v9.CheckScriptSuccess([
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003168 'vim9script',
3169 'edit #{something',
3170 ])
3171 close
3172
Bram Moolenaar62aec932022-01-29 21:45:34 +00003173 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003174 'vim9script',
3175 ':# something',
3176 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003177 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003178 '# something',
3179 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003180 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003181 ':# something',
3182 ], 'E488:')
3183
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003184 { # block start
3185 } # block end
Bram Moolenaar62aec932022-01-29 21:45:34 +00003186 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003187 '{# comment',
3188 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003189 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003190 '{',
3191 '}# comment',
3192 ], 'E488:')
3193
3194 echo "yes" # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00003195 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003196 'echo "yes"# comment',
3197 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003198 v9.CheckScriptSuccess([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003199 'vim9script',
3200 'echo "yes" # something',
3201 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003202 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003203 'vim9script',
3204 'echo "yes"# something',
3205 ], 'E121:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003206 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003207 'vim9script',
3208 'echo# something',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003209 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003210 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003211 'echo "yes" # something',
3212 ], 'E121:')
3213
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003214 exe "echo" # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00003215 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003216 'exe "echo"# comment',
3217 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003218 v9.CheckScriptSuccess([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003219 'vim9script',
3220 'exe "echo" # something',
3221 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003222 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003223 'vim9script',
3224 'exe "echo"# something',
3225 ], 'E121:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003226 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003227 'vim9script',
3228 'exe# something',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003229 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003230 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003231 'exe "echo" # something',
3232 ], 'E121:')
3233
Bram Moolenaar62aec932022-01-29 21:45:34 +00003234 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003235 'try# comment',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003236 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003237 'catch',
3238 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003239 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003240 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003241 'vim9script',
3242 'try# comment',
3243 'echo "yes"',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003244 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003245 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003246 'try',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003247 ' throw#comment',
3248 'catch',
3249 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003250 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003251 v9.CheckDefFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003252 'try',
3253 ' throw "yes"#comment',
3254 'catch',
3255 'endtry',
3256 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003257 v9.CheckDefFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003258 'try',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003259 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003260 'catch# comment',
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',
3266 ' echo "yes"',
3267 'catch# comment',
3268 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003269 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003270 v9.CheckDefFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003271 'try',
3272 ' echo "yes"',
3273 'catch /pat/# comment',
3274 'endtry',
3275 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003276 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003277 'try',
3278 'echo "yes"',
3279 'catch',
3280 'endtry# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003281 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003282 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003283 'vim9script',
3284 'try',
3285 ' echo "yes"',
3286 'catch',
3287 'endtry# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003288 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003289
Bram Moolenaar62aec932022-01-29 21:45:34 +00003290 v9.CheckScriptSuccess([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003291 'vim9script',
3292 'hi # comment',
3293 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003294 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003295 'vim9script',
3296 'hi# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003297 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003298 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003299 'vim9script',
3300 'hi Search # comment',
3301 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003302 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003303 'vim9script',
3304 'hi Search# comment',
3305 ], 'E416:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003306 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003307 'vim9script',
3308 'hi link This Search # comment',
3309 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003310 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003311 'vim9script',
3312 'hi link This That# comment',
3313 ], 'E413:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003314 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003315 'vim9script',
3316 'hi clear This # comment',
3317 'hi clear # comment',
3318 ])
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003319 # not tested, because it doesn't give an error but a warning:
3320 # hi clear This# comment',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003321 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003322 'vim9script',
3323 'hi clear# comment',
3324 ], 'E416:')
3325
Bram Moolenaar62aec932022-01-29 21:45:34 +00003326 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003327 'vim9script',
3328 'hi Group term=bold',
3329 'match Group /todo/ # comment',
3330 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003331 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003332 'vim9script',
3333 'hi Group term=bold',
3334 'match Group /todo/# comment',
3335 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003336 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003337 'vim9script',
3338 'match # comment',
3339 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003340 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003341 'vim9script',
3342 'match# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003343 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003344 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003345 'vim9script',
3346 'match none # comment',
3347 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003348 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003349 'vim9script',
3350 'match none# comment',
3351 ], 'E475:')
3352
Bram Moolenaar62aec932022-01-29 21:45:34 +00003353 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003354 'vim9script',
3355 'menutrans clear # comment',
3356 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003357 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003358 'vim9script',
3359 'menutrans clear# comment text',
3360 ], 'E474:')
3361
Bram Moolenaar62aec932022-01-29 21:45:34 +00003362 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003363 'vim9script',
3364 'syntax clear # comment',
3365 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003366 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003367 'vim9script',
3368 'syntax clear# comment text',
3369 ], 'E28:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003370 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003371 'vim9script',
3372 'syntax keyword Word some',
3373 'syntax clear Word # comment',
3374 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003375 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003376 'vim9script',
3377 'syntax keyword Word some',
3378 'syntax clear Word# comment text',
3379 ], 'E28:')
3380
Bram Moolenaar62aec932022-01-29 21:45:34 +00003381 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003382 'vim9script',
3383 'syntax list # comment',
3384 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003385 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003386 'vim9script',
3387 'syntax list# comment text',
3388 ], 'E28:')
3389
Bram Moolenaar62aec932022-01-29 21:45:34 +00003390 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003391 'vim9script',
3392 'syntax match Word /pat/ oneline # comment',
3393 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003394 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003395 'vim9script',
3396 'syntax match Word /pat/ oneline# comment',
3397 ], 'E475:')
3398
Bram Moolenaar62aec932022-01-29 21:45:34 +00003399 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003400 'vim9script',
3401 'syntax keyword Word word # comm[ent',
3402 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003403 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003404 'vim9script',
3405 'syntax keyword Word word# comm[ent',
3406 ], 'E789:')
3407
Bram Moolenaar62aec932022-01-29 21:45:34 +00003408 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003409 'vim9script',
3410 'syntax match Word /pat/ # comment',
3411 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003412 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003413 'vim9script',
3414 'syntax match Word /pat/# comment',
3415 ], 'E402:')
3416
Bram Moolenaar62aec932022-01-29 21:45:34 +00003417 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003418 'vim9script',
3419 'syntax match Word /pat/ contains=Something # comment',
3420 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003421 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003422 'vim9script',
3423 'syntax match Word /pat/ contains=Something# comment',
3424 ], 'E475:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003425 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003426 'vim9script',
3427 'syntax match Word /pat/ contains= # comment',
3428 ], 'E406:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003429 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003430 'vim9script',
3431 'syntax match Word /pat/ contains=# comment',
3432 ], 'E475:')
3433
Bram Moolenaar62aec932022-01-29 21:45:34 +00003434 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003435 'vim9script',
3436 'syntax region Word start=/pat/ end=/pat/ # comment',
3437 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003438 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003439 'vim9script',
3440 'syntax region Word start=/pat/ end=/pat/# comment',
Bram Moolenaard032f342020-07-18 18:13:02 +02003441 ], 'E402:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02003442
Bram Moolenaar62aec932022-01-29 21:45:34 +00003443 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003444 'vim9script',
3445 'syntax sync # comment',
3446 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003447 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003448 'vim9script',
3449 'syntax sync# comment',
3450 ], 'E404:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003451 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003452 'vim9script',
3453 'syntax sync ccomment # comment',
3454 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003455 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003456 'vim9script',
3457 'syntax sync ccomment# comment',
3458 ], 'E404:')
3459
Bram Moolenaar62aec932022-01-29 21:45:34 +00003460 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003461 'vim9script',
3462 'syntax cluster Some contains=Word # comment',
3463 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003464 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003465 'vim9script',
3466 'syntax cluster Some contains=Word# comment',
3467 ], 'E475:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003468
Bram Moolenaar62aec932022-01-29 21:45:34 +00003469 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003470 'vim9script',
3471 'command Echo echo # comment',
3472 'command Echo # comment',
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003473 'delcommand Echo',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003474 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003475 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003476 'vim9script',
3477 'command Echo echo# comment',
3478 'Echo',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003479 ], 'E1144:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003480 delcommand Echo
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003481
3482 var curdir = getcwd()
Bram Moolenaar62aec932022-01-29 21:45:34 +00003483 v9.CheckScriptSuccess([
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003484 'command Echo cd " comment',
3485 'Echo',
3486 'delcommand Echo',
3487 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003488 v9.CheckScriptSuccess([
Bram Moolenaar090728a2020-12-20 15:43:31 +01003489 'vim9script',
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003490 'command Echo cd # comment',
3491 'Echo',
3492 'delcommand Echo',
3493 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003494 v9.CheckScriptFailure([
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003495 'vim9script',
3496 'command Echo cd " comment',
3497 'Echo',
3498 ], 'E344:')
3499 delcommand Echo
3500 chdir(curdir)
3501
Bram Moolenaar62aec932022-01-29 21:45:34 +00003502 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003503 'vim9script',
3504 'command Echo# comment',
3505 ], 'E182:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003506 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003507 'vim9script',
3508 'command Echo echo',
3509 'command Echo# comment',
3510 ], 'E182:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003511 delcommand Echo
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003512
Bram Moolenaar62aec932022-01-29 21:45:34 +00003513 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003514 'vim9script',
3515 'function # comment',
3516 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003517 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003518 'vim9script',
Bram Moolenaar98981072020-07-29 14:40:25 +02003519 'function " comment',
3520 ], 'E129:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003521 v9.CheckScriptFailure([
Bram Moolenaar98981072020-07-29 14:40:25 +02003522 'vim9script',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003523 'function# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003524 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003525 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003526 'vim9script',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003527 'import "./vim9.vim" as v9',
3528 'function v9.CheckScriptSuccess # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003529 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003530 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003531 'vim9script',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003532 'import "./vim9.vim" as v9',
3533 'function v9.CheckScriptSuccess# comment',
3534 ], 'E1048: Item not found in script: CheckScriptSuccess#')
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',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003538 'func g:DeleteMeA()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003539 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003540 'delfunction g:DeleteMeA # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003541 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003542 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003543 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003544 'func g:DeleteMeB()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003545 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003546 'delfunction g:DeleteMeB# comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003547 ], 'E488:')
3548
Bram Moolenaar62aec932022-01-29 21:45:34 +00003549 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003550 'vim9script',
3551 'call execute("ls") # comment',
3552 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003553 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003554 'vim9script',
3555 'call execute("ls")# comment',
3556 ], 'E488:')
Bram Moolenaare7e48382020-07-22 18:17:08 +02003557
Bram Moolenaar62aec932022-01-29 21:45:34 +00003558 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003559 'def Test() " comment',
3560 'enddef',
3561 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003562 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003563 'vim9script',
3564 'def Test() " comment',
3565 'enddef',
3566 ], 'E488:')
3567
Bram Moolenaar62aec932022-01-29 21:45:34 +00003568 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003569 'func Test() " comment',
3570 'endfunc',
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003571 'delfunc Test',
Bram Moolenaare7e48382020-07-22 18:17:08 +02003572 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003573 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003574 'vim9script',
3575 'func Test() " comment',
3576 'endfunc',
Bram Moolenaar98981072020-07-29 14:40:25 +02003577 ])
Bram Moolenaare7e48382020-07-22 18:17:08 +02003578
Bram Moolenaar62aec932022-01-29 21:45:34 +00003579 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003580 'def Test() # comment',
3581 'enddef',
3582 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003583 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003584 'func Test() # comment',
3585 'endfunc',
3586 ], 'E488:')
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003587
3588 var lines =<< trim END
3589 vim9script
3590 syn region Text
3591 \ start='foo'
3592 #\ comment
3593 \ end='bar'
Bram Moolenaar5072b472021-06-03 21:56:10 +02003594 syn region Text start='foo'
3595 #\ comment
3596 \ end='bar'
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003597 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003598 v9.CheckScriptSuccess(lines)
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003599
3600 lines =<< trim END
3601 vim9script
3602 syn region Text
3603 \ start='foo'
3604 "\ comment
3605 \ end='bar'
3606 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003607 v9.CheckScriptFailure(lines, 'E399:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003608enddef
3609
3610def Test_vim9_comment_gui()
3611 CheckCanRunGui
3612
Bram Moolenaar62aec932022-01-29 21:45:34 +00003613 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003614 'vim9script',
3615 'gui#comment'
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003616 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003617 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003618 'vim9script',
3619 'gui -f#comment'
Bram Moolenaarb8bd2e62021-08-21 17:13:14 +02003620 ], 'E194:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02003621enddef
3622
Bram Moolenaara26b9702020-04-18 19:53:28 +02003623def Test_vim9_comment_not_compiled()
Bram Moolenaar67979662020-06-20 22:50:47 +02003624 au TabEnter *.vim g:entered = 1
3625 au TabEnter *.x g:entered = 2
Bram Moolenaara26b9702020-04-18 19:53:28 +02003626
3627 edit test.vim
3628 doautocmd TabEnter #comment
3629 assert_equal(1, g:entered)
3630
3631 doautocmd TabEnter f.x
3632 assert_equal(2, g:entered)
3633
3634 g:entered = 0
3635 doautocmd TabEnter f.x #comment
3636 assert_equal(2, g:entered)
3637
3638 assert_fails('doautocmd Syntax#comment', 'E216:')
3639
3640 au! TabEnter
3641 unlet g:entered
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003642
Bram Moolenaar62aec932022-01-29 21:45:34 +00003643 v9.CheckScriptSuccess([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003644 'vim9script',
Bram Moolenaar67979662020-06-20 22:50:47 +02003645 'g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003646 'b:var = 456',
3647 'w:var = 777',
3648 't:var = 888',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003649 'unlet g:var w:var # something',
3650 ])
3651
Bram Moolenaar62aec932022-01-29 21:45:34 +00003652 v9.CheckScriptFailure([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003653 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003654 'let var = 123',
3655 ], 'E1126: Cannot use :let in Vim9 script')
3656
Bram Moolenaar62aec932022-01-29 21:45:34 +00003657 v9.CheckScriptFailure([
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003658 'vim9script',
3659 'var g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003660 ], 'E1016: Cannot declare a global variable:')
3661
Bram Moolenaar62aec932022-01-29 21:45:34 +00003662 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003663 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003664 'var b:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003665 ], 'E1016: Cannot declare a buffer variable:')
3666
Bram Moolenaar62aec932022-01-29 21:45:34 +00003667 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003668 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003669 'var w:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003670 ], 'E1016: Cannot declare a window variable:')
3671
Bram Moolenaar62aec932022-01-29 21:45:34 +00003672 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003673 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003674 'var t:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003675 ], 'E1016: Cannot declare a tab variable:')
3676
Bram Moolenaar62aec932022-01-29 21:45:34 +00003677 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003678 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003679 'var v:version = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003680 ], 'E1016: Cannot declare a v: variable:')
3681
Bram Moolenaar62aec932022-01-29 21:45:34 +00003682 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003683 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003684 'var $VARIABLE = "text"',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003685 ], 'E1016: Cannot declare an environment variable:')
Bram Moolenaar67979662020-06-20 22:50:47 +02003686
Bram Moolenaar62aec932022-01-29 21:45:34 +00003687 v9.CheckScriptFailure([
Bram Moolenaar67979662020-06-20 22:50:47 +02003688 'vim9script',
3689 'g:var = 123',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003690 'unlet g:var# comment1',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003691 ], 'E108:')
3692
Bram Moolenaar62aec932022-01-29 21:45:34 +00003693 v9.CheckScriptFailure([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003694 'let g:var = 123',
3695 'unlet g:var # something',
3696 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003697
Bram Moolenaar62aec932022-01-29 21:45:34 +00003698 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003699 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003700 'if 1 # comment2',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003701 ' echo "yes"',
3702 'elseif 2 #comment',
3703 ' echo "no"',
3704 'endif',
3705 ])
3706
Bram Moolenaar62aec932022-01-29 21:45:34 +00003707 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003708 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003709 'if 1# comment3',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003710 ' echo "yes"',
3711 'endif',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003712 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003713
Bram Moolenaar62aec932022-01-29 21:45:34 +00003714 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003715 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003716 'if 0 # comment4',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003717 ' echo "yes"',
3718 'elseif 2#comment',
3719 ' echo "no"',
3720 'endif',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003721 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003722
Bram Moolenaar62aec932022-01-29 21:45:34 +00003723 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003724 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003725 'var v = 1 # comment5',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003726 ])
3727
Bram Moolenaar62aec932022-01-29 21:45:34 +00003728 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003729 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003730 'var v = 1# comment6',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003731 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003732
Bram Moolenaar62aec932022-01-29 21:45:34 +00003733 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003734 'vim9script',
Bram Moolenaar2984ed32022-08-20 14:51:17 +01003735 'new',
Bram Moolenaard2c61702020-09-06 15:58:36 +02003736 'setline(1, ["# define pat", "last"])',
Bram Moolenaardf069ee2020-06-22 23:02:51 +02003737 ':$',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003738 'dsearch /pat/ #comment',
3739 'bwipe!',
3740 ])
3741
Bram Moolenaar62aec932022-01-29 21:45:34 +00003742 v9.CheckScriptFailure([
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003743 'vim9script',
Bram Moolenaar2984ed32022-08-20 14:51:17 +01003744 'new',
Bram Moolenaard2c61702020-09-06 15:58:36 +02003745 'setline(1, ["# define pat", "last"])',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003746 ':$',
3747 'dsearch /pat/#comment',
3748 'bwipe!',
3749 ], 'E488:')
3750
Bram Moolenaar62aec932022-01-29 21:45:34 +00003751 v9.CheckScriptFailure([
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003752 'vim9script',
3753 'func! SomeFunc()',
3754 ], 'E477:')
Bram Moolenaara26b9702020-04-18 19:53:28 +02003755enddef
3756
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003757def Test_finish()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003758 var lines =<< trim END
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003759 vim9script
Bram Moolenaar67979662020-06-20 22:50:47 +02003760 g:res = 'one'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003761 if v:false | finish | endif
Bram Moolenaar67979662020-06-20 22:50:47 +02003762 g:res = 'two'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003763 finish
Bram Moolenaar67979662020-06-20 22:50:47 +02003764 g:res = 'three'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003765 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003766 writefile(lines, 'Xfinished', 'D')
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003767 source Xfinished
3768 assert_equal('two', g:res)
3769
3770 unlet g:res
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003771enddef
3772
Bram Moolenaara5d00772020-05-14 23:20:55 +02003773def Test_forward_declaration()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003774 var lines =<< trim END
Bram Moolenaara5d00772020-05-14 23:20:55 +02003775 vim9script
Bram Moolenaara5d00772020-05-14 23:20:55 +02003776 def GetValue(): string
3777 return theVal
3778 enddef
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003779 var theVal = 'something'
Bram Moolenaar822ba242020-05-24 23:00:18 +02003780 g:initVal = GetValue()
Bram Moolenaara5d00772020-05-14 23:20:55 +02003781 theVal = 'else'
3782 g:laterVal = GetValue()
3783 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003784 writefile(lines, 'Xforward', 'D')
Bram Moolenaara5d00772020-05-14 23:20:55 +02003785 source Xforward
3786 assert_equal('something', g:initVal)
3787 assert_equal('else', g:laterVal)
3788
3789 unlet g:initVal
3790 unlet g:laterVal
Bram Moolenaara5d00772020-05-14 23:20:55 +02003791enddef
3792
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003793def Test_declare_script_var_in_func()
Bram Moolenaare535db82021-03-31 21:07:24 +02003794 var lines =<< trim END
3795 vim9script
3796 func Declare()
3797 let s:local = 123
3798 endfunc
3799 Declare()
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003800 END
3801 v9.CheckScriptFailure(lines, 'E1269:')
3802enddef
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00003803
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003804def Test_lock_script_var()
3805 var lines =<< trim END
3806 vim9script
3807 var local = 123
Bram Moolenaare535db82021-03-31 21:07:24 +02003808 assert_equal(123, local)
3809
3810 var error: string
3811 try
3812 local = 'asdf'
3813 catch
3814 error = v:exception
3815 endtry
3816 assert_match('E1012: Type mismatch; expected number but got string', error)
3817
3818 lockvar local
3819 try
3820 local = 999
3821 catch
3822 error = v:exception
3823 endtry
3824 assert_match('E741: Value is locked: local', error)
3825 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003826 v9.CheckScriptSuccess(lines)
Bram Moolenaare535db82021-03-31 21:07:24 +02003827enddef
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00003828
Bram Moolenaare535db82021-03-31 21:07:24 +02003829
Bram Moolenaar7d699702020-08-14 20:52:28 +02003830func Test_vim9script_not_global()
3831 " check that items defined in Vim9 script are script-local, not global
3832 let vim9lines =<< trim END
3833 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003834 var name = 'local'
Bram Moolenaar7d699702020-08-14 20:52:28 +02003835 func TheFunc()
3836 echo 'local'
3837 endfunc
3838 def DefFunc()
3839 echo 'local'
3840 enddef
3841 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003842 call writefile(vim9lines, 'Xvim9script.vim', 'D')
Bram Moolenaar7d699702020-08-14 20:52:28 +02003843 source Xvim9script.vim
3844 try
3845 echo g:var
3846 assert_report('did not fail')
3847 catch /E121:/
3848 " caught
3849 endtry
3850 try
3851 call TheFunc()
3852 assert_report('did not fail')
3853 catch /E117:/
3854 " caught
3855 endtry
3856 try
3857 call DefFunc()
3858 assert_report('did not fail')
3859 catch /E117:/
3860 " caught
3861 endtry
Bram Moolenaar7d699702020-08-14 20:52:28 +02003862endfunc
3863
Bram Moolenaareeb27bf2020-07-04 17:39:10 +02003864def Test_vim9_copen()
3865 # this was giving an error for setting w:quickfix_title
3866 copen
3867 quit
3868enddef
3869
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02003870def Test_script_var_in_autocmd()
3871 # using a script variable from an autocommand, defined in a :def function in a
3872 # legacy Vim script, cannot check the variable type.
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003873 var lines =<< trim END
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02003874 let s:counter = 1
3875 def s:Func()
3876 au! CursorHold
3877 au CursorHold * s:counter += 1
3878 enddef
3879 call s:Func()
3880 doau CursorHold
3881 call assert_equal(2, s:counter)
3882 au! CursorHold
3883 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003884 v9.CheckScriptSuccess(lines)
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02003885enddef
3886
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003887def Test_error_in_autoload_script()
3888 var save_rtp = &rtp
3889 var dir = getcwd() .. '/Xruntime'
3890 &rtp = dir
Bram Moolenaardd674772022-09-15 22:26:18 +01003891 mkdir(dir .. '/autoload', 'pR')
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003892
3893 var lines =<< trim END
3894 vim9script noclear
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003895 export def Autoloaded()
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003896 enddef
3897 def Broken()
3898 var x: any = ''
3899 eval x != 0
3900 enddef
3901 Broken()
3902 END
3903 writefile(lines, dir .. '/autoload/script.vim')
3904
3905 lines =<< trim END
3906 vim9script
3907 def CallAutoloaded()
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003908 script#Autoloaded()
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003909 enddef
3910
3911 function Legacy()
3912 try
3913 call s:CallAutoloaded()
3914 catch
3915 call assert_match('E1030: Using a String as a Number', v:exception)
3916 endtry
3917 endfunction
3918
3919 Legacy()
3920 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003921 v9.CheckScriptSuccess(lines)
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003922
3923 &rtp = save_rtp
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003924enddef
3925
Bram Moolenaar6809ff92022-07-26 15:10:56 +01003926def Test_error_in_autoload_script_foldexpr()
3927 var save_rtp = &rtp
Bram Moolenaardd674772022-09-15 22:26:18 +01003928 mkdir('Xvim/autoload', 'pR')
Bram Moolenaar6809ff92022-07-26 15:10:56 +01003929 &runtimepath = 'Xvim'
3930
3931 var lines =<< trim END
3932 vim9script
3933 eval [][0]
3934 echomsg 'no error'
3935 END
3936 lines->writefile('Xvim/autoload/script.vim')
3937
3938 lines =<< trim END
3939 vim9script
3940 import autoload 'script.vim'
3941 &foldmethod = 'expr'
3942 &foldexpr = 'script.Func()'
3943 redraw
3944 END
3945 v9.CheckScriptFailure(lines, 'E684: List index out of range: 0')
Bram Moolenaar6809ff92022-07-26 15:10:56 +01003946enddef
3947
Bram Moolenaare3d46852020-08-29 13:39:17 +02003948def Test_invalid_sid()
3949 assert_fails('func <SNR>1234_func', 'E123:')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02003950
Bram Moolenaar62aec932022-01-29 21:45:34 +00003951 if g:RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
Bram Moolenaard2c61702020-09-06 15:58:36 +02003952 assert_equal([], readfile('Xdidit'))
Bram Moolenaare3d46852020-08-29 13:39:17 +02003953 endif
3954 delete('Xdidit')
3955enddef
3956
Bram Moolenaar9ec70262020-12-09 17:16:59 +01003957def Test_restoring_cpo()
Bram Moolenaardd674772022-09-15 22:26:18 +01003958 writefile(['vim9script', 'set nocp'], 'Xsourced', 'D')
3959 writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003960 if g:RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
Bram Moolenaar9ec70262020-12-09 17:16:59 +01003961 assert_equal(['done'], readfile('Xdone'))
3962 endif
Bram Moolenaar090728a2020-12-20 15:43:31 +01003963 delete('Xdone')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003964
Bram Moolenaardd674772022-09-15 22:26:18 +01003965 writefile(['vim9script', 'g:cpoval = &cpo'], 'XanotherScript', 'D')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003966 set cpo=aABceFsMny>
3967 edit XanotherScript
3968 so %
3969 assert_equal('aABceFsMny>', &cpo)
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003970 assert_equal('aABceFs', g:cpoval)
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003971 :1del
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003972 setline(1, 'let g:cpoval = &cpo')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003973 w
3974 so %
3975 assert_equal('aABceFsMny>', &cpo)
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003976 assert_equal('aABceFsMny>', g:cpoval)
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003977
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003978 set cpo&vim
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003979 unlet g:cpoval
3980
3981 if has('unix')
3982 # 'cpo' is not restored in main vimrc
3983 var save_HOME = $HOME
3984 $HOME = getcwd() .. '/Xhome'
Bram Moolenaardd674772022-09-15 22:26:18 +01003985 mkdir('Xhome', 'R')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003986 var lines =<< trim END
3987 vim9script
Bram Moolenaarb18b4962022-09-02 21:55:50 +01003988 writefile(['before: ' .. &cpo], 'Xrporesult')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003989 set cpo+=M
Bram Moolenaarb18b4962022-09-02 21:55:50 +01003990 writefile(['after: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003991 END
3992 writefile(lines, 'Xhome/.vimrc')
3993
3994 lines =<< trim END
Bram Moolenaarb18b4962022-09-02 21:55:50 +01003995 call writefile(['later: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003996 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003997 writefile(lines, 'Xlegacy', 'D')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003998
3999 lines =<< trim END
4000 vim9script
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004001 call writefile(['vim9: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004002 qa
4003 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004004 writefile(lines, 'Xvim9', 'D')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004005
Bram Moolenaar62aec932022-01-29 21:45:34 +00004006 var cmd = g:GetVimCommand() .. " -S Xlegacy -S Xvim9"
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004007 cmd = substitute(cmd, '-u NONE', '', '')
4008 exe "silent !" .. cmd
4009
4010 assert_equal([
4011 'before: aABceFs',
4012 'after: aABceFsM',
4013 'later: aABceFsM',
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004014 'vim9: aABceFs'], readfile('Xrporesult'))
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004015
4016 $HOME = save_HOME
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004017 delete('Xrporesult')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004018 endif
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004019enddef
4020
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004021" Use :function so we can use Check commands
4022func Test_no_redraw_when_restoring_cpo()
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004023 CheckScreendump
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004024 CheckFeature timers
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004025 call Run_test_no_redraw_when_restoring_cpo()
4026endfunc
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004027
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004028def Run_test_no_redraw_when_restoring_cpo()
4029 var lines =<< trim END
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004030 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00004031 export def Func()
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004032 enddef
4033 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004034 mkdir('Xnordir/autoload', 'pR')
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01004035 writefile(lines, 'Xnordir/autoload/script.vim')
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004036
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004037 lines =<< trim END
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004038 vim9script
4039 set cpo+=M
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01004040 exe 'set rtp^=' .. getcwd() .. '/Xnordir'
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00004041 au CmdlineEnter : ++once timer_start(0, (_) => script#Func())
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004042 setline(1, 'some text')
4043 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004044 writefile(lines, 'XTest_redraw_cpo', 'D')
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004045 var buf = g:RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
4046 term_sendkeys(buf, "V:")
4047 g:VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004048
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004049 # clean up
4050 term_sendkeys(buf, "\<Esc>u")
4051 g:StopVimInTerminal(buf)
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004052enddef
4053
4054func Test_reject_declaration()
4055 CheckScreendump
4056 call Run_test_reject_declaration()
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004057endfunc
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004058
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004059def Run_test_reject_declaration()
4060 var buf = g:RunVimInTerminal('', {'rows': 6})
4061 term_sendkeys(buf, ":vim9cmd var x: number\<CR>")
Bram Moolenaar330a3882022-03-05 11:05:57 +00004062 g:VerifyScreenDump(buf, 'Test_vim9_reject_declaration_1', {})
4063 term_sendkeys(buf, ":\<CR>")
4064 term_sendkeys(buf, ":vim9cmd g:foo = 123 | echo g:foo\<CR>")
4065 g:VerifyScreenDump(buf, 'Test_vim9_reject_declaration_2', {})
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004066
4067 # clean up
4068 g:StopVimInTerminal(buf)
4069enddef
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004070
Bram Moolenaar204852a2022-03-05 12:56:44 +00004071def Test_minimal_command_name_length()
4072 var names = [
4073 'cons',
4074 'brea',
4075 'cat',
4076 'catc',
4077 'con',
Bram Moolenaarb2175222022-03-05 20:24:41 +00004078 'cont',
4079 'conti',
4080 'contin',
4081 'continu',
Bram Moolenaar204852a2022-03-05 12:56:44 +00004082 'el',
4083 'els',
4084 'elsei',
4085 'endfo',
4086 'en',
4087 'end',
4088 'endi',
4089 'endw',
4090 'endt',
4091 'endtr',
Bram Moolenaarb2175222022-03-05 20:24:41 +00004092 'exp',
4093 'expo',
4094 'expor',
Bram Moolenaar204852a2022-03-05 12:56:44 +00004095 'fina',
4096 'finall',
Bram Moolenaard523c7b2022-03-06 14:51:22 +00004097 'fini',
4098 'finis',
Bram Moolenaarb2175222022-03-05 20:24:41 +00004099 'imp',
4100 'impo',
4101 'impor',
4102 'retu',
4103 'retur',
Bram Moolenaar204852a2022-03-05 12:56:44 +00004104 'th',
4105 'thr',
4106 'thro',
4107 'wh',
4108 'whi',
4109 'whil',
4110 ]
4111 for name in names
4112 v9.CheckDefAndScriptFailure([name .. ' '], 'E1065:')
4113 endfor
Bram Moolenaarb2175222022-03-05 20:24:41 +00004114
4115 var lines =<< trim END
4116 vim9script
4117 def SomeFunc()
4118 endd
4119 END
4120 v9.CheckScriptFailure(lines, 'E1065:')
4121 lines =<< trim END
4122 vim9script
4123 def SomeFunc()
4124 endde
4125 END
4126 v9.CheckScriptFailure(lines, 'E1065:')
Bram Moolenaar204852a2022-03-05 12:56:44 +00004127enddef
4128
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004129def Test_unset_any_variable()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004130 var lines =<< trim END
4131 var name: any
4132 assert_equal(0, name)
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004133 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004134 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004135enddef
4136
Bram Moolenaar7e9210e2020-09-25 23:12:51 +02004137func Test_define_func_at_command_line()
Bram Moolenaar58dbef32020-09-25 22:13:05 +02004138 CheckRunVimInTerminal
4139
Bram Moolenaar7e9210e2020-09-25 23:12:51 +02004140 " call indirectly to avoid compilation error for missing functions
4141 call Run_Test_define_func_at_command_line()
4142endfunc
4143
4144def Run_Test_define_func_at_command_line()
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004145 # run in a separate Vim instance to avoid the script context
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004146 var lines =<< trim END
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004147 func CheckAndQuit()
4148 call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
4149 call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
4150 endfunc
4151 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004152 writefile([''], 'Xdidcmd', 'D')
4153 writefile(lines, 'XcallFunc', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00004154 var buf = g:RunVimInTerminal('-S XcallFunc', {rows: 6})
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004155 # define Afunc() on the command line
4156 term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
4157 term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004158 g:WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004159
Bram Moolenaar62aec932022-01-29 21:45:34 +00004160 call g:StopVimInTerminal(buf)
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004161enddef
4162
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004163def Test_script_var_scope()
4164 var lines =<< trim END
4165 vim9script
4166 if true
4167 if true
4168 var one = 'one'
4169 echo one
4170 endif
4171 echo one
4172 endif
4173 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004174 v9.CheckScriptFailure(lines, 'E121:', 7)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004175
4176 lines =<< trim END
4177 vim9script
4178 if true
4179 if false
4180 var one = 'one'
4181 echo one
4182 else
4183 var one = 'one'
4184 echo one
4185 endif
4186 echo one
4187 endif
4188 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004189 v9.CheckScriptFailure(lines, 'E121:', 10)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004190
4191 lines =<< trim END
4192 vim9script
4193 while true
4194 var one = 'one'
4195 echo one
4196 break
4197 endwhile
4198 echo one
4199 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004200 v9.CheckScriptFailure(lines, 'E121:', 7)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004201
4202 lines =<< trim END
4203 vim9script
4204 for i in range(1)
4205 var one = 'one'
4206 echo one
4207 endfor
4208 echo one
4209 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004210 v9.CheckScriptFailure(lines, 'E121:', 6)
Bram Moolenaar9becdf22020-10-10 21:33:48 +02004211
4212 lines =<< trim END
4213 vim9script
4214 {
4215 var one = 'one'
4216 assert_equal('one', one)
4217 }
4218 assert_false(exists('one'))
4219 assert_false(exists('s:one'))
4220 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004221 v9.CheckScriptSuccess(lines)
Bram Moolenaar9becdf22020-10-10 21:33:48 +02004222
4223 lines =<< trim END
4224 vim9script
4225 {
4226 var one = 'one'
4227 echo one
4228 }
4229 echo one
4230 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004231 v9.CheckScriptFailure(lines, 'E121:', 6)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004232enddef
4233
Bram Moolenaar352134b2020-10-17 22:04:08 +02004234def Test_catch_exception_in_callback()
4235 var lines =<< trim END
4236 vim9script
Bram Moolenaar2a389082021-04-09 20:24:31 +02004237 def Callback(...l: list<any>)
Bram Moolenaar352134b2020-10-17 22:04:08 +02004238 try
4239 var x: string
4240 var y: string
4241 # this error should be caught with CHECKLEN
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +00004242 var sl = ['']
4243 [x, y] = sl
Bram Moolenaar352134b2020-10-17 22:04:08 +02004244 catch
4245 g:caught = 'yes'
4246 endtry
4247 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01004248 popup_menu('popup', {callback: Callback})
Bram Moolenaar352134b2020-10-17 22:04:08 +02004249 feedkeys("\r", 'xt')
4250 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004251 v9.CheckScriptSuccess(lines)
Bram Moolenaar352134b2020-10-17 22:04:08 +02004252
4253 unlet g:caught
4254enddef
4255
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004256def Test_no_unknown_error_after_error()
4257 if !has('unix') || !has('job')
4258 throw 'Skipped: not unix of missing +job feature'
4259 endif
Bram Moolenaarb16ff292021-09-26 20:14:39 +01004260 # FIXME: this check should not be needed
4261 if has('win32')
4262 throw 'Skipped: does not work on MS-Windows'
4263 endif
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004264 var lines =<< trim END
4265 vim9script
4266 var source: list<number>
Bram Moolenaar2a389082021-04-09 20:24:31 +02004267 def Out_cb(...l: list<any>)
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004268 eval [][0]
4269 enddef
Bram Moolenaar2a389082021-04-09 20:24:31 +02004270 def Exit_cb(...l: list<any>)
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004271 sleep 1m
Bram Moolenaar23d44492022-05-04 16:24:57 +01004272 g:did_call_exit_cb = true
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004273 source += l
4274 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01004275 var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
Bram Moolenaar6f17a3f2020-12-21 18:11:24 +01004276 while job_status(myjob) == 'run'
4277 sleep 10m
4278 endwhile
Bram Moolenaar206c2a62021-01-31 14:04:44 +01004279 # wait for Exit_cb() to be called
Bram Moolenaar23d44492022-05-04 16:24:57 +01004280 for x in range(100)
4281 if exists('g:did_call_exit_cb')
4282 unlet g:did_call_exit_cb
4283 break
4284 endif
4285 sleep 10m
4286 endfor
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004287 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004288 writefile(lines, 'Xdef', 'D')
Yee Cheng Chin69a8bb82022-11-06 12:25:47 +00004289 # Either the exit or out callback is called first, accept them in any order
4290 assert_fails('so Xdef', ['E684:\|E1012:', 'E1012:\|E684:'])
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004291enddef
4292
Bram Moolenaar4324d872020-12-01 20:12:24 +01004293def InvokeNormal()
4294 exe "norm! :m+1\r"
4295enddef
4296
4297def Test_invoke_normal_in_visual_mode()
4298 xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
4299 new
4300 setline(1, ['aaa', 'bbb'])
4301 feedkeys("V\<F3>", 'xt')
4302 assert_equal(['bbb', 'aaa'], getline(1, 2))
4303 xunmap <F3>
4304enddef
4305
Bram Moolenaarb5b94802020-12-13 17:50:20 +01004306def Test_white_space_after_command()
4307 var lines =<< trim END
4308 exit_cb: Func})
4309 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004310 v9.CheckDefAndScriptFailure(lines, 'E1144:', 1)
Bram Moolenaarf8103f22020-12-25 17:36:27 +01004311
4312 lines =<< trim END
4313 e#
4314 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004315 v9.CheckDefAndScriptFailure(lines, 'E1144:', 1)
Bram Moolenaarb5b94802020-12-13 17:50:20 +01004316enddef
4317
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004318def Test_script_var_gone_when_sourced_twice()
4319 var lines =<< trim END
4320 vim9script
4321 if exists('g:guard')
4322 finish
4323 endif
4324 g:guard = 1
4325 var name = 'thename'
4326 def g:GetName(): string
4327 return name
4328 enddef
4329 def g:SetName(arg: string)
4330 name = arg
4331 enddef
4332 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004333 writefile(lines, 'XscriptTwice.vim', 'D')
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004334 so XscriptTwice.vim
4335 assert_equal('thename', g:GetName())
4336 g:SetName('newname')
4337 assert_equal('newname', g:GetName())
4338 so XscriptTwice.vim
4339 assert_fails('call g:GetName()', 'E1149:')
4340 assert_fails('call g:SetName("x")', 'E1149:')
4341
4342 delfunc g:GetName
4343 delfunc g:SetName
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004344 unlet g:guard
4345enddef
4346
Bram Moolenaar10b94212021-02-19 21:42:57 +01004347def Test_unsupported_commands()
4348 var lines =<< trim END
4349 ka
4350 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004351 v9.CheckDefAndScriptFailure(lines, ['E476:', 'E492:'])
Bram Moolenaar10b94212021-02-19 21:42:57 +01004352
4353 lines =<< trim END
Bram Moolenaarada1d872021-02-20 08:16:51 +01004354 :1ka
4355 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004356 v9.CheckDefAndScriptFailure(lines, ['E476:', 'E492:'])
Bram Moolenaarada1d872021-02-20 08:16:51 +01004357
4358 lines =<< trim END
Yegappan Lakshmanan885de442022-04-23 10:51:14 +01004359 :k a
4360 END
4361 v9.CheckDefAndScriptFailure(lines, 'E1100:')
4362
4363 lines =<< trim END
4364 :1k a
4365 END
4366 v9.CheckDefAndScriptFailure(lines, 'E481:')
4367
4368 lines =<< trim END
Bram Moolenaar10b94212021-02-19 21:42:57 +01004369 t
4370 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004371 v9.CheckDefAndScriptFailure(lines, 'E1100:')
Bram Moolenaar10b94212021-02-19 21:42:57 +01004372
4373 lines =<< trim END
4374 x
4375 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004376 v9.CheckDefAndScriptFailure(lines, 'E1100:')
Bram Moolenaar10b94212021-02-19 21:42:57 +01004377
4378 lines =<< trim END
4379 xit
4380 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004381 v9.CheckDefAndScriptFailure(lines, 'E1100:')
4382
4383 lines =<< trim END
4384 Print
4385 END
4386 v9.CheckDefAndScriptFailure(lines, ['E476: Invalid command: Print', 'E492: Not an editor command: Print'])
4387
4388 lines =<< trim END
4389 mode 4
4390 END
4391 v9.CheckDefAndScriptFailure(lines, ['E476: Invalid command: mode 4', 'E492: Not an editor command: mode 4'])
Bram Moolenaar10b94212021-02-19 21:42:57 +01004392enddef
4393
Bram Moolenaarc70fe462021-04-17 17:59:19 +02004394def Test_mapping_line_number()
4395 var lines =<< trim END
4396 vim9script
4397 def g:FuncA()
4398 # Some comment
4399 FuncB(0)
4400 enddef
4401 # Some comment
4402 def FuncB(
4403 # Some comment
4404 n: number
4405 )
4406 exe 'nno '
4407 # Some comment
4408 .. '<F3> a'
4409 .. 'b'
4410 .. 'c'
4411 enddef
4412 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004413 v9.CheckScriptSuccess(lines)
Bram Moolenaarc70fe462021-04-17 17:59:19 +02004414 var res = execute('verbose nmap <F3>')
4415 assert_match('No mapping found', res)
4416
4417 g:FuncA()
4418 res = execute('verbose nmap <F3>')
4419 assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
4420
4421 nunmap <F3>
4422 delfunc g:FuncA
4423enddef
4424
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004425def Test_option_set()
4426 # legacy script allows for white space
4427 var lines =<< trim END
4428 set foldlevel =11
4429 call assert_equal(11, &foldlevel)
4430 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004431 v9.CheckScriptSuccess(lines)
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004432
4433 set foldlevel
4434 set foldlevel=12
4435 assert_equal(12, &foldlevel)
4436 set foldlevel+=2
4437 assert_equal(14, &foldlevel)
4438 set foldlevel-=3
4439 assert_equal(11, &foldlevel)
4440
4441 lines =<< trim END
4442 set foldlevel =1
4443 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004444 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004445
4446 lines =<< trim END
4447 set foldlevel +=1
4448 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004449 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004450
4451 lines =<< trim END
4452 set foldlevel ^=1
4453 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004454 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004455
4456 lines =<< trim END
4457 set foldlevel -=1
4458 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004459 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004460
4461 set foldlevel&
4462enddef
4463
LemonBoy32f34612023-09-02 21:52:05 +02004464def Test_option_set_line_number()
4465 var lines =<< trim END
4466 vim9script
4467 # line2
4468 # line3
4469 def F()
4470 # line5
4471 &foldlevel = -128
4472 enddef
4473 F()
4474 END
4475 v9.CheckScriptSuccess(lines)
4476
4477 var res = execute('verbose set foldlevel')
4478 assert_match(' foldlevel.*Last set from .*XScriptSuccess\d\+ line 6', res)
4479enddef
4480
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004481def Test_option_modifier()
Bram Moolenaar1594f312021-07-08 16:40:13 +02004482 # legacy script allows for white space
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004483 var lines =<< trim END
4484 set hlsearch & hlsearch !
4485 call assert_equal(1, &hlsearch)
4486 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004487 v9.CheckScriptSuccess(lines)
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004488
Bram Moolenaar1594f312021-07-08 16:40:13 +02004489 set hlsearch
4490 set hlsearch!
4491 assert_equal(false, &hlsearch)
4492
4493 set hlsearch
4494 set hlsearch&
4495 assert_equal(false, &hlsearch)
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004496
4497 lines =<< trim END
Bram Moolenaar1594f312021-07-08 16:40:13 +02004498 set hlsearch &
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004499 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004500 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &')
Bram Moolenaar1594f312021-07-08 16:40:13 +02004501
4502 lines =<< trim END
4503 set hlsearch !
4504 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004505 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !')
Bram Moolenaar1594f312021-07-08 16:40:13 +02004506
4507 set hlsearch&
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004508enddef
4509
Bram Moolenaarc03fe662021-07-11 16:52:45 +02004510" This must be called last, it may cause following :def functions to fail
4511def Test_xxx_echoerr_line_number()
4512 var lines =<< trim END
4513 echoerr 'some'
4514 .. ' error'
4515 .. ' continued'
4516 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004517 v9.CheckDefExecAndScriptFailure(lines, 'some error continued', 1)
Bram Moolenaarc03fe662021-07-11 16:52:45 +02004518enddef
4519
Bram Moolenaar9537e372021-12-10 21:05:53 +00004520func Test_debug_with_lambda()
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004521 CheckRunVimInTerminal
4522
Bram Moolenaar9537e372021-12-10 21:05:53 +00004523 " call indirectly to avoid compilation error for missing functions
4524 call Run_Test_debug_with_lambda()
4525endfunc
4526
4527def Run_Test_debug_with_lambda()
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004528 var lines =<< trim END
4529 vim9script
4530 def Func()
4531 var n = 0
4532 echo [0]->filter((_, v) => v == n)
4533 enddef
4534 breakadd func Func
4535 Func()
4536 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004537 writefile(lines, 'XdebugFunc', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00004538 var buf = g:RunVimInTerminal('-S XdebugFunc', {rows: 6, wait_for_ruler: 0})
4539 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 6)))
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004540
4541 term_sendkeys(buf, "cont\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004542 g:WaitForAssert(() => assert_match('\[0\]', term_getline(buf, 5)))
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004543
Bram Moolenaar62aec932022-01-29 21:45:34 +00004544 g:StopVimInTerminal(buf)
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004545enddef
4546
Bram Moolenaar310091d2021-12-23 21:14:37 +00004547func Test_debug_running_out_of_lines()
4548 CheckRunVimInTerminal
4549
4550 " call indirectly to avoid compilation error for missing functions
4551 call Run_Test_debug_running_out_of_lines()
4552endfunc
4553
4554def Run_Test_debug_running_out_of_lines()
4555 var lines =<< trim END
4556 vim9script
4557 def Crash()
4558 #
4559 #
4560 #
4561 #
4562 #
4563 #
4564 #
4565 if true
4566 #
4567 endif
4568 enddef
4569 breakadd func Crash
4570 Crash()
4571 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004572 writefile(lines, 'XdebugFunc', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00004573 var buf = g:RunVimInTerminal('-S XdebugFunc', {rows: 6, wait_for_ruler: 0})
4574 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 6)))
Bram Moolenaar310091d2021-12-23 21:14:37 +00004575
4576 term_sendkeys(buf, "next\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004577 g:TermWait(buf)
4578 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 6)))
Bram Moolenaar310091d2021-12-23 21:14:37 +00004579
4580 term_sendkeys(buf, "cont\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004581 g:TermWait(buf)
Bram Moolenaar310091d2021-12-23 21:14:37 +00004582
Bram Moolenaar62aec932022-01-29 21:45:34 +00004583 g:StopVimInTerminal(buf)
Bram Moolenaar310091d2021-12-23 21:14:37 +00004584enddef
4585
dundargocc57b5bc2022-11-02 13:30:51 +00004586def Test_ambiguous_command_error()
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004587 var lines =<< trim END
4588 vim9script
4589 command CmdA echomsg 'CmdA'
4590 command CmdB echomsg 'CmdB'
4591 Cmd
4592 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004593 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 4)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004594
4595 lines =<< trim END
4596 vim9script
4597 def Func()
4598 Cmd
4599 enddef
4600 Func()
4601 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004602 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 1)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004603
4604 lines =<< trim END
4605 vim9script
4606 nnoremap <F3> <ScriptCmd>Cmd<CR>
4607 feedkeys("\<F3>", 'xt')
4608 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004609 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 3)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004610
4611 delcommand CmdA
4612 delcommand CmdB
4613 nunmap <F3>
4614enddef
4615
Dominique Pelle923dce22021-11-21 11:36:04 +00004616" Execute this near the end, profiling doesn't stop until Vim exits.
Bram Moolenaard9162552021-07-11 15:26:13 +02004617" This only tests that it works, not the profiling output.
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004618def Test_profile_with_lambda()
Bram Moolenaar4ece1522021-07-11 16:31:51 +02004619 CheckFeature profile
4620
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004621 var lines =<< trim END
4622 vim9script
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004623
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004624 def ProfiledWithLambda()
4625 var n = 3
4626 echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n)
4627 enddef
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004628
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004629 def ProfiledNested()
4630 var x = 0
4631 def Nested(): any
4632 return x
4633 enddef
4634 Nested()
4635 enddef
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004636
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004637 def g:ProfiledNestedProfiled()
4638 var x = 0
4639 def Nested(): any
4640 return x
4641 enddef
4642 Nested()
4643 enddef
4644
4645 def Profile()
Bram Moolenaar48f69cd2022-03-15 16:16:47 +00004646 ProfiledWithLambda()
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004647 ProfiledNested()
4648
Bram Moolenaar48f69cd2022-03-15 16:16:47 +00004649 # Also profile the nested function. Use a different function, although
4650 # the contents is the same, to make sure it was not already compiled.
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004651 profile func *
4652 g:ProfiledNestedProfiled()
4653
4654 profdel func *
4655 profile pause
4656 enddef
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004657
4658 var result = 'done'
4659 try
4660 # mark functions for profiling now to avoid E1271
4661 profile start Xprofile.log
4662 profile func ProfiledWithLambda
4663 profile func ProfiledNested
4664
4665 Profile()
4666 catch
4667 result = 'failed: ' .. v:exception
4668 finally
4669 writefile([result], 'Xdidprofile')
4670 endtry
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004671 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004672 writefile(lines, 'Xprofile.vim', 'D')
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004673 call system(g:GetVimCommand()
4674 .. ' --clean'
4675 .. ' -c "so Xprofile.vim"'
4676 .. ' -c "qall!"')
4677 call assert_equal(0, v:shell_error)
4678
4679 assert_equal(['done'], readfile('Xdidprofile'))
4680 assert_true(filereadable('Xprofile.log'))
4681 delete('Xdidprofile')
4682 delete('Xprofile.log')
Bram Moolenaard9162552021-07-11 15:26:13 +02004683enddef
4684
Bram Moolenaar4f6e7722022-03-16 20:26:02 +00004685func Test_misplaced_type()
4686 CheckRunVimInTerminal
4687 call Run_Test_misplaced_type()
4688endfunc
4689
4690def Run_Test_misplaced_type()
Bram Moolenaar9510d222022-09-11 15:14:05 +01004691 writefile(['let g:somevar = "asdf"'], 'XTest_misplaced_type', 'D')
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004692 var buf = g:RunVimInTerminal('-S XTest_misplaced_type', {'rows': 6})
Bram Moolenaar9510d222022-09-11 15:14:05 +01004693 term_sendkeys(buf, ":vim9cmd echo islocked('somevar: string')\<CR>")
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004694 g:VerifyScreenDump(buf, 'Test_misplaced_type', {})
4695
4696 g:StopVimInTerminal(buf)
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004697enddef
4698
LemonBoya5d35902022-04-29 21:15:02 +01004699" Ensure echo doesn't crash when stringifying empty variables.
4700def Test_echo_uninit_variables()
4701 var res: string
4702
4703 var var_bool: bool
4704 var var_num: number
4705 var var_float: float
4706 var Var_func: func
4707 var var_string: string
4708 var var_blob: blob
LemonBoya5d35902022-04-29 21:15:02 +01004709 var var_list: list<any>
4710 var var_dict: dict<any>
4711
4712 redir => res
4713 echo var_bool
4714 echo var_num
4715 echo var_float
4716 echo Var_func
4717 echo var_string
4718 echo var_blob
LemonBoya5d35902022-04-29 21:15:02 +01004719 echo var_list
4720 echo var_dict
4721 redir END
4722
Bram Moolenaarf1d63b92022-05-06 13:37:42 +01004723 assert_equal(['false', '0', '0.0', 'function()', '', '0z', '[]', '{}'], res->split('\n'))
4724
4725 if has('job')
4726 var var_job: job
4727 var var_channel: channel
4728
4729 redir => res
4730 echo var_job
4731 echo var_channel
4732 redir END
4733
4734 assert_equal(['no process', 'channel fail'], res->split('\n'))
4735 endif
LemonBoya5d35902022-04-29 21:15:02 +01004736enddef
4737
Bram Moolenaar6342e2c2022-12-12 18:56:32 +00004738def Test_free_type_before_use()
4739 # this rather complicated script was freeing a type before using it
4740 var lines =<< trim END
4741 vim9script
4742
4743 def Scan(rel: list<dict<any>>): func(func(dict<any>))
4744 return (Emit: func(dict<any>)) => {
4745 for t in rel
4746 Emit(t)
4747 endfor
4748 }
4749 enddef
4750
4751 def Build(Cont: func(func(dict<any>))): list<dict<any>>
4752 var rel: list<dict<any>> = []
4753 Cont((t) => {
4754 add(rel, t)
4755 })
4756 return rel
4757 enddef
4758
4759 var R = [{A: 0}]
4760 var result = Scan(R)->Build()
4761 result = Scan(R)->Build()
4762
4763 assert_equal(R, result)
4764 END
4765 v9.CheckScriptSuccess(lines)
4766enddef
4767
Yegappan Lakshmanana76fbe62023-09-27 18:51:43 +02004768" The following complicated script used to cause an internal error (E340)
4769" because the funcref instruction memory was referenced after the instruction
4770" memory was reallocated (Github issue #13178)
4771def Test_refer_funcref_instr_after_realloc()
4772 var lines =<< trim END
4773 vim9script
4774 def A(d: bool)
4775 var e = abs(0)
4776 var f = &emoji
4777 &emoji = true
4778 if ['', '', '']->index('xxx') == 0
4779 eval 0 + 0
4780 endif
4781 if &filetype == 'xxx'
4782 var g = abs(0)
4783 while g > 0
4784 if getline(g) == ''
4785 break
4786 endif
4787 --g
4788 endwhile
4789 if g == 0
4790 return
4791 endif
4792 if d
4793 feedkeys($'{g}G')
4794 g = abs(0)
4795 endif
4796 var h = abs(0)
4797 var i = abs(0)
4798 var j = abs(0)
4799 while j < 0
4800 if abs(0) < h && getline(j) != ''
4801 break
4802 endif
4803 ++j
4804 endwhile
4805 feedkeys($'{g}G{j}G')
4806 return
4807 endif
4808 def B()
4809 enddef
4810 def C()
4811 enddef
4812 enddef
4813 A(false)
4814 END
4815 v9.CheckScriptSuccess(lines)
4816enddef
4817
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004818" Test for calling a deferred function after an exception
4819def Test_defer_after_exception()
4820 var lines =<< trim END
4821 vim9script
4822
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004823 var callTrace: list<number> = []
4824 def Bar()
4825 callTrace += [1]
4826 throw 'InnerException'
4827 enddef
4828
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004829 def Defer()
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004830 callTrace += [2]
4831 callTrace += [3]
4832 try
4833 Bar()
4834 catch /InnerException/
4835 callTrace += [4]
4836 endtry
4837 callTrace += [5]
4838 callTrace += [6]
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004839 enddef
4840
4841 def Foo()
4842 defer Defer()
4843 throw "TestException"
4844 enddef
4845
4846 try
4847 Foo()
4848 catch /TestException/
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004849 callTrace += [7]
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004850 endtry
4851
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004852 assert_equal([2, 3, 1, 4, 5, 6, 7], callTrace)
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004853 END
Yegappan Lakshmananec3cebb2023-10-27 19:35:26 +02004854 v9.CheckSourceSuccess(lines)
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004855enddef
4856
Yegappan Lakshmanan0ab500d2023-10-21 11:59:42 +02004857" Test for multiple deferred function which throw exceptions.
4858" Exceptions thrown by deferred functions should result in error messages but
4859" not propagated into the calling functions.
4860def Test_multidefer_with_exception()
4861 var lines =<< trim END
4862 vim9script
4863
4864 var callTrace: list<number> = []
4865 def Except()
4866 callTrace += [1]
4867 throw 'InnerException'
4868 callTrace += [2]
4869 enddef
4870
4871 def FirstDefer()
4872 callTrace += [3]
4873 callTrace += [4]
4874 enddef
4875
4876 def SecondDeferWithExcept()
4877 callTrace += [5]
4878 Except()
4879 callTrace += [6]
4880 enddef
4881
4882 def ThirdDefer()
4883 callTrace += [7]
4884 callTrace += [8]
4885 enddef
4886
4887 def Foo()
4888 callTrace += [9]
4889 defer FirstDefer()
4890 defer SecondDeferWithExcept()
4891 defer ThirdDefer()
4892 callTrace += [10]
4893 enddef
4894
4895 v:errmsg = ''
4896 try
4897 callTrace += [11]
4898 Foo()
4899 callTrace += [12]
4900 catch /TestException/
4901 callTrace += [13]
4902 catch
4903 callTrace += [14]
4904 finally
4905 callTrace += [15]
4906 endtry
4907 callTrace += [16]
4908
4909 assert_equal('E605: Exception not caught: InnerException', v:errmsg)
4910 assert_equal([11, 9, 10, 7, 8, 5, 1, 3, 4, 12, 15, 16], callTrace)
4911 END
Yegappan Lakshmananec3cebb2023-10-27 19:35:26 +02004912 v9.CheckSourceSuccess(lines)
4913enddef
4914
Yegappan Lakshmanana185a312023-12-16 14:36:08 +01004915" Test for using ":defer" inside an if statement with a false condition
4916def Test_defer_skipped()
4917 var lines =<< trim END
4918 def Foo()
4919 if false
4920 defer execute('echow "hello"', "")
4921 endif
4922 enddef
4923 defcompile
4924 END
4925 v9.CheckSourceSuccess(lines)
4926enddef
4927
Yegappan Lakshmanan062bb6b2023-12-16 14:46:40 +01004928" Test for using defer without parenthesis for the function name
4929def Test_defer_func_without_paren()
4930 var lines =<< trim END
4931 vim9script
4932 def Foo()
4933 defer Bar
4934 enddef
4935 defcompile
4936 END
4937 v9.CheckScriptFailure(lines, 'E107: Missing parentheses: Bar', 1)
4938enddef
4939
4940" Test for using defer without parenthesis for the function name
4941def Test_defer_non_existing_func()
4942 var lines =<< trim END
4943 vim9script
4944 def Foo()
4945 defer Bar()
4946 enddef
4947 defcompile
4948 END
4949 v9.CheckScriptFailure(lines, 'E1001: Variable not found: Bar', 1)
4950enddef
4951
4952" Test for using defer with an invalid function name
4953def Test_defer_invalid_func()
4954 var lines =<< trim END
4955 vim9script
4956 def Foo()
4957 var Abc = 10
4958 defer Abc()
4959 enddef
4960 defcompile
4961 END
4962 v9.CheckScriptFailure(lines, 'E129: Function name required', 2)
4963enddef
4964
4965" Test for using defer with an invalid argument to a function
4966def Test_defer_invalid_func_arg()
4967 var lines =<< trim END
4968 vim9script
4969 def Bar(x: number)
4970 enddef
4971 def Foo()
4972 defer Bar(a)
4973 enddef
4974 defcompile
4975 END
4976 v9.CheckScriptFailure(lines, 'E1001: Variable not found: a', 1)
4977enddef
4978
4979" Test for using an non-existing type in a "for" statement.
4980def Test_invalid_type_in_for()
4981 var lines =<< trim END
4982 vim9script
4983 def Foo()
4984 for b: x in range(10)
4985 endfor
4986 enddef
4987 defcompile
4988 END
4989 v9.CheckSourceFailure(lines, 'E1010: Type not recognized: x in range(10)', 1)
4990enddef
4991
4992" Test for using a line break between the variable name and the type in a for
4993" statement.
4994def Test_for_stmt_space_before_type()
4995 var lines =<< trim END
4996 vim9script
4997 def Foo()
4998 for a
4999 :number in range(10)
5000 endfor
5001 enddef
5002 defcompile
5003 END
5004 v9.CheckSourceFailure(lines, 'E1059: No white space allowed before colon: :number in range(10)', 2)
5005enddef
5006
zeertzjqc029c132024-03-28 11:37:26 +01005007" This test used to cause a use-after-free memory access
Yegappan Lakshmanan28d71b52024-01-12 17:21:55 +01005008def Test_for_empty_line_after_lambda()
5009 var lines =<< trim END
5010 vim9script
5011 echomsg range(0, 2)->map((_, v) => {
5012 return 1
5013 })
5014
5015 assert_equal('[1, 1, 1]', v:statusmsg)
5016 END
5017 v9.CheckSourceSuccess(lines)
5018
5019 lines =<< trim END
5020 vim9script
5021 echomsg range(0, 1)->map((_, v) => {
5022 return 1
5023 }) range(0, 1)->map((_, v) => {
5024 return 2
5025 }) # comment
5026
5027 assert_equal('[1, 1] [2, 2]', v:statusmsg)
5028 END
5029 v9.CheckSourceSuccess(lines)
5030enddef
5031
Yegappan Lakshmanan3fa8f772024-04-04 21:42:07 +02005032" Test for evaluating a lambda block from a string
5033def Test_eval_lambda_block()
5034 var lines =<< trim END
5035 vim9script
5036 var Fn = eval("(x: number): number => {\nreturn x * 2\n}")
5037 assert_equal(6, Fn(3))
5038 END
5039 v9.CheckSourceSuccess(lines)
5040enddef
5041
Bram Moolenaar585fea72020-04-02 22:33:21 +02005042" Keep this last, it messes up highlighting.
5043def Test_substitute_cmd()
5044 new
5045 setline(1, 'something')
5046 :substitute(some(other(
5047 assert_equal('otherthing', getline(1))
5048 bwipe!
5049
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02005050 # also when the context is Vim9 script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02005051 var lines =<< trim END
Bram Moolenaar585fea72020-04-02 22:33:21 +02005052 vim9script
5053 new
5054 setline(1, 'something')
5055 :substitute(some(other(
5056 assert_equal('otherthing', getline(1))
5057 bwipe!
5058 END
Bram Moolenaardd674772022-09-15 22:26:18 +01005059 writefile(lines, 'Xvim9lines', 'D')
Bram Moolenaar585fea72020-04-02 22:33:21 +02005060 source Xvim9lines
Bram Moolenaar585fea72020-04-02 22:33:21 +02005061enddef
5062
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01005063" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker