blob: 0b171500943834bdbe1a732919d71c2bf467c184 [file] [log] [blame]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001" Test various aspects of the Vim9 script language.
2
Bram Moolenaar673660a2020-01-26 16:50:05 +01003source check.vim
Bram Moolenaar101f4812020-06-16 23:18:51 +02004source term_util.vim
Bram Moolenaar62aec932022-01-29 21:45:34 +00005import './vim9.vim' as v9
Bram Moolenaar37294bd2021-03-10 13:40:08 +01006source screendump.vim
Bram Moolenaard8448622022-01-07 21:39:52 +00007source shared.vim
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01008
Bram Moolenaarb79ee0c2022-01-01 12:17:00 +00009def Test_vim9script_feature()
10 # example from the help, here the feature is always present
11 var lines =<< trim END
12 " old style comment
13 if !has('vim9script')
14 " legacy commands would go here
15 finish
16 endif
17 vim9script
18 # Vim9 script commands go here
19 g:didit = true
20 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000021 v9.CheckScriptSuccess(lines)
Bram Moolenaarb79ee0c2022-01-01 12:17:00 +000022 assert_equal(true, g:didit)
23 unlet g:didit
24enddef
25
Bram Moolenaar5d72ce62020-08-20 23:04:06 +020026def Test_range_only()
27 new
28 setline(1, ['blah', 'Blah'])
29 :/Blah/
30 assert_equal(2, getcurpos()[1])
Bram Moolenaarc2af0af2020-08-23 21:06:02 +020031 bwipe!
32
33 # without range commands use current line
34 new
35 setline(1, ['one', 'two', 'three'])
36 :2
37 print
Bram Moolenaar62aec932022-01-29 21:45:34 +000038 assert_equal('two', g:Screenline(&lines))
Bram Moolenaarc2af0af2020-08-23 21:06:02 +020039 :3
40 list
Bram Moolenaar62aec932022-01-29 21:45:34 +000041 assert_equal('three$', g:Screenline(&lines))
Bram Moolenaarb8554302021-02-15 21:30:30 +010042
43 # missing command does not print the line
44 var lines =<< trim END
45 vim9script
46 :1|
Bram Moolenaar62aec932022-01-29 21:45:34 +000047 assert_equal('three$', g:Screenline(&lines))
Bram Moolenaarb8554302021-02-15 21:30:30 +010048 :|
Bram Moolenaar62aec932022-01-29 21:45:34 +000049 assert_equal('three$', g:Screenline(&lines))
Bram Moolenaarb8554302021-02-15 21:30:30 +010050 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000051 v9.CheckScriptSuccess(lines)
Bram Moolenaarb8554302021-02-15 21:30:30 +010052
Bram Moolenaarc2af0af2020-08-23 21:06:02 +020053 bwipe!
Bram Moolenaar025cb1c2020-12-14 18:31:27 +010054
Bram Moolenaar0c7f2612022-02-17 19:44:07 +000055 lines =<< trim END
56 set cpo+=-
57 :1,999
58 END
59 v9.CheckDefExecAndScriptFailure(lines, 'E16:', 2)
60 set cpo&vim
61
62 v9.CheckDefExecAndScriptFailure([":'x"], 'E20:', 1)
63
Bram Moolenaar025cb1c2020-12-14 18:31:27 +010064 # won't generate anything
65 if false
66 :123
67 endif
Bram Moolenaar5d72ce62020-08-20 23:04:06 +020068enddef
69
Bram Moolenaar09d94212022-05-05 15:20:03 +010070def Test_invalid_range()
71 var lines =<< trim END
72 :123 eval 1 + 2
73 END
74 v9.CheckDefAndScriptFailure(lines, 'E481:', 1)
75
76 lines =<< trim END
77 :123 if true
78 endif
79 END
80 v9.CheckDefAndScriptFailure(lines, 'E481:', 1)
81
82 lines =<< trim END
83 :123 echo 'yes'
84 END
85 v9.CheckDefAndScriptFailure(lines, 'E481:', 1)
86
87 lines =<< trim END
88 :123 cd there
89 END
90 v9.CheckDefAndScriptFailure(lines, 'E481:', 1)
91enddef
92
Bram Moolenaara6e67e42020-05-15 23:36:40 +020093let g:alist = [7]
94let g:astring = 'text'
Bram Moolenaarf0b9f432020-07-17 23:03:17 +020095let g:anumber = 123
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010096
Bram Moolenaar4c17ad92020-04-27 22:47:51 +020097def Test_delfunction()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +020098 # Check function is defined in script namespace
Bram Moolenaar62aec932022-01-29 21:45:34 +000099 v9.CheckScriptSuccess([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200100 'vim9script',
101 'func CheckMe()',
102 ' return 123',
103 'endfunc',
Bram Moolenaara749a422022-02-12 19:52:25 +0000104 'func DoTest()',
105 ' call assert_equal(123, s:CheckMe())',
106 'endfunc',
107 'DoTest()',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200108 ])
109
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200110 # Check function in script namespace cannot be deleted
Bram Moolenaar62aec932022-01-29 21:45:34 +0000111 v9.CheckScriptFailure([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200112 'vim9script',
113 'func DeleteMe1()',
114 'endfunc',
115 'delfunction DeleteMe1',
116 ], 'E1084:')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000117 v9.CheckScriptFailure([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200118 'vim9script',
119 'func DeleteMe2()',
120 'endfunc',
121 'def DoThat()',
122 ' delfunction DeleteMe2',
123 'enddef',
124 'DoThat()',
125 ], 'E1084:')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000126 v9.CheckScriptFailure([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200127 'vim9script',
128 'def DeleteMe3()',
129 'enddef',
130 'delfunction DeleteMe3',
131 ], 'E1084:')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000132 v9.CheckScriptFailure([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200133 'vim9script',
134 'def DeleteMe4()',
135 'enddef',
136 'def DoThat()',
137 ' delfunction DeleteMe4',
138 'enddef',
139 'DoThat()',
140 ], 'E1084:')
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200141
142 # Check that global :def function can be replaced and deleted
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200143 var lines =<< trim END
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200144 vim9script
145 def g:Global(): string
146 return "yes"
147 enddef
148 assert_equal("yes", g:Global())
149 def! g:Global(): string
150 return "no"
151 enddef
152 assert_equal("no", g:Global())
153 delfunc g:Global
154 assert_false(exists('*g:Global'))
155 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000156 v9.CheckScriptSuccess(lines)
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200157
158 # Check that global function can be replaced by a :def function and deleted
159 lines =<< trim END
160 vim9script
161 func g:Global()
162 return "yes"
163 endfunc
164 assert_equal("yes", g:Global())
165 def! g:Global(): string
166 return "no"
167 enddef
168 assert_equal("no", g:Global())
169 delfunc g:Global
170 assert_false(exists('*g:Global'))
171 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000172 v9.CheckScriptSuccess(lines)
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200173
174 # Check that global :def function can be replaced by a function and deleted
175 lines =<< trim END
176 vim9script
177 def g:Global(): string
178 return "yes"
179 enddef
180 assert_equal("yes", g:Global())
181 func! g:Global()
182 return "no"
183 endfunc
184 assert_equal("no", g:Global())
185 delfunc g:Global
186 assert_false(exists('*g:Global'))
187 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000188 v9.CheckScriptSuccess(lines)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200189enddef
190
Bram Moolenaar08052222020-09-14 17:04:31 +0200191def Test_wrong_type()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000192 v9.CheckDefFailure(['var name: list<nothing>'], 'E1010:')
193 v9.CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
194 v9.CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
195 v9.CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100196
Bram Moolenaar62aec932022-01-29 21:45:34 +0000197 v9.CheckDefFailure(['var name: dict<number'], 'E1009:')
198 v9.CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100199
Bram Moolenaar62aec932022-01-29 21:45:34 +0000200 v9.CheckDefFailure(['var name: ally'], 'E1010:')
201 v9.CheckDefFailure(['var name: bram'], 'E1010:')
202 v9.CheckDefFailure(['var name: cathy'], 'E1010:')
203 v9.CheckDefFailure(['var name: dom'], 'E1010:')
204 v9.CheckDefFailure(['var name: freddy'], 'E1010:')
205 v9.CheckDefFailure(['var name: john'], 'E1010:')
206 v9.CheckDefFailure(['var name: larry'], 'E1010:')
207 v9.CheckDefFailure(['var name: ned'], 'E1010:')
208 v9.CheckDefFailure(['var name: pam'], 'E1010:')
209 v9.CheckDefFailure(['var name: sam'], 'E1010:')
210 v9.CheckDefFailure(['var name: vim'], 'E1010:')
Bram Moolenaara0a9f432020-04-28 21:29:34 +0200211
Bram Moolenaar62aec932022-01-29 21:45:34 +0000212 v9.CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
213 v9.CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
Bram Moolenaar08052222020-09-14 17:04:31 +0200214enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100215
Bram Moolenaara749a422022-02-12 19:52:25 +0000216def Test_script_namespace()
217 # defining a function or variable with s: is not allowed
218 var lines =<< trim END
219 vim9script
220 def s:Function()
221 enddef
222 END
223 v9.CheckScriptFailure(lines, 'E1268:')
224
225 for decl in ['var', 'const', 'final']
226 lines =<< trim END
227 vim9script
228 var s:var = 'var'
229 END
230 v9.CheckScriptFailure([
231 'vim9script',
232 decl .. ' s:var = "var"',
233 ], 'E1268:')
234 endfor
235
236 # Calling a function or using a variable with s: is not allowed at script
237 # level
238 lines =<< trim END
239 vim9script
240 def Function()
241 enddef
242 s:Function()
243 END
244 v9.CheckScriptFailure(lines, 'E1268:')
245 lines =<< trim END
246 vim9script
247 def Function()
248 enddef
249 call s:Function()
250 END
251 v9.CheckScriptFailure(lines, 'E1268:')
252 lines =<< trim END
253 vim9script
254 var var = 'var'
255 echo s:var
256 END
257 v9.CheckScriptFailure(lines, 'E1268:')
258enddef
259
Bram Moolenaar10c65862020-10-08 21:16:42 +0200260def Test_script_wrong_type()
261 var lines =<< trim END
262 vim9script
Bram Moolenaara749a422022-02-12 19:52:25 +0000263 var dict: dict<string>
264 dict['a'] = ['x']
Bram Moolenaar10c65862020-10-08 21:16:42 +0200265 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000266 v9.CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3)
Bram Moolenaar10c65862020-10-08 21:16:42 +0200267enddef
268
Bram Moolenaar08052222020-09-14 17:04:31 +0200269def Test_const()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000270 v9.CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
271 v9.CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
272 v9.CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
273 v9.CheckDefFailure(['final two'], 'E1125:')
274 v9.CheckDefFailure(['final &option'], 'E996:')
Bram Moolenaardbeecb22020-09-14 18:15:09 +0200275
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200276 var lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200277 final list = [1, 2, 3]
Bram Moolenaardbeecb22020-09-14 18:15:09 +0200278 list[0] = 4
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200279 list->assert_equal([4, 2, 3])
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200280 const other = [5, 6, 7]
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200281 other->assert_equal([5, 6, 7])
Bram Moolenaar71abe482020-09-14 22:28:30 +0200282
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200283 var varlist = [7, 8]
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200284 const constlist = [1, varlist, 3]
Bram Moolenaar71abe482020-09-14 22:28:30 +0200285 varlist[0] = 77
Bram Moolenaar23e2e112021-08-03 21:16:18 +0200286 constlist[1][1] = 88
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200287 var cl = constlist[1]
Bram Moolenaar71abe482020-09-14 22:28:30 +0200288 cl[1] = 88
289 constlist->assert_equal([1, [77, 88], 3])
290
Bram Moolenaare0de1712020-12-02 17:36:54 +0100291 var vardict = {five: 5, six: 6}
292 const constdict = {one: 1, two: vardict, three: 3}
Bram Moolenaar71abe482020-09-14 22:28:30 +0200293 vardict['five'] = 55
Bram Moolenaar23e2e112021-08-03 21:16:18 +0200294 constdict['two']['six'] = 66
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200295 var cd = constdict['two']
Bram Moolenaar71abe482020-09-14 22:28:30 +0200296 cd['six'] = 66
Bram Moolenaare0de1712020-12-02 17:36:54 +0100297 constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3})
Bram Moolenaardbeecb22020-09-14 18:15:09 +0200298 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000299 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar0089ce22022-10-08 14:39:36 +0100300
301 # "any" type with const flag is recognized as "any"
302 lines =<< trim END
303 const dict: dict<any> = {foo: {bar: 42}}
304 const foo = dict.foo
305 assert_equal(v:t_number, type(foo.bar))
306 END
307 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar330d64d2022-10-09 12:55:33 +0100308
309 # also when used as a builtin function argument
310 lines =<< trim END
311 vim9script
312
313 def SorterFunc(lhs: dict<string>, rhs: dict<string>): number
314 return lhs.name <# rhs.name ? -1 : 1
315 enddef
316
317 def Run(): void
318 var list = [{name: "3"}, {name: "2"}]
319 const Sorter = get({}, "unknown", SorterFunc)
320 sort(list, Sorter)
321 assert_equal([{name: "2"}, {name: "3"}], list)
322 enddef
323
324 Run()
325 END
326 v9.CheckScriptSuccess(lines)
Bram Moolenaar08052222020-09-14 17:04:31 +0200327enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100328
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200329def Test_const_bang()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200330 var lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200331 const var = 234
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200332 var = 99
333 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000334 v9.CheckDefExecFailure(lines, 'E1018:', 2)
335 v9.CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200336
337 lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200338 const ll = [2, 3, 4]
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200339 ll[0] = 99
340 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000341 v9.CheckDefExecFailure(lines, 'E1119:', 2)
342 v9.CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200343
344 lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200345 const ll = [2, 3, 4]
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200346 ll[3] = 99
347 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000348 v9.CheckDefExecFailure(lines, 'E1118:', 2)
349 v9.CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200350
351 lines =<< trim END
Bram Moolenaare0de1712020-12-02 17:36:54 +0100352 const dd = {one: 1, two: 2}
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200353 dd["one"] = 99
354 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000355 v9.CheckDefExecFailure(lines, 'E1121:', 2)
356 v9.CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200357
358 lines =<< trim END
Bram Moolenaare0de1712020-12-02 17:36:54 +0100359 const dd = {one: 1, two: 2}
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200360 dd["three"] = 99
361 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000362 v9.CheckDefExecFailure(lines, 'E1120:')
363 v9.CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200364enddef
365
Bram Moolenaardf069ee2020-06-22 23:02:51 +0200366def Test_range_no_colon()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000367 v9.CheckDefFailure(['%s/a/b/'], 'E1050:')
368 v9.CheckDefFailure(['+ s/a/b/'], 'E1050:')
369 v9.CheckDefFailure(['- s/a/b/'], 'E1050:')
370 v9.CheckDefFailure(['. s/a/b/'], 'E1050:')
Bram Moolenaardf069ee2020-06-22 23:02:51 +0200371enddef
372
373
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100374def Test_block()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200375 var outer = 1
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100376 {
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200377 var inner = 2
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100378 assert_equal(1, outer)
379 assert_equal(2, inner)
380 }
381 assert_equal(1, outer)
Bram Moolenaar3f1e9f02021-02-27 22:36:43 +0100382
383 {|echo 'yes'|}
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100384enddef
385
Bram Moolenaar08052222020-09-14 17:04:31 +0200386def Test_block_failure()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000387 v9.CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
388 v9.CheckDefFailure(['}'], 'E1025:')
389 v9.CheckDefFailure(['{', 'echo 1'], 'E1026:')
Bram Moolenaar08052222020-09-14 17:04:31 +0200390enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100391
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200392def Test_block_local_vars()
393 var lines =<< trim END
394 vim9script
Bram Moolenaared234f22020-10-15 20:42:20 +0200395 v:testing = 1
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200396 if true
Bram Moolenaared234f22020-10-15 20:42:20 +0200397 var text = ['hello']
398 def SayHello(): list<string>
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200399 return text
400 enddef
401 def SetText(v: string)
Bram Moolenaared234f22020-10-15 20:42:20 +0200402 text = [v]
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200403 enddef
404 endif
405
406 if true
Bram Moolenaared234f22020-10-15 20:42:20 +0200407 var text = ['again']
408 def SayAgain(): list<string>
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200409 return text
410 enddef
411 endif
Bram Moolenaared234f22020-10-15 20:42:20 +0200412
413 # test that the "text" variables are not cleaned up
414 test_garbagecollect_now()
415
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200416 defcompile
417
Bram Moolenaared234f22020-10-15 20:42:20 +0200418 assert_equal(['hello'], SayHello())
419 assert_equal(['again'], SayAgain())
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200420
421 SetText('foobar')
Bram Moolenaared234f22020-10-15 20:42:20 +0200422 assert_equal(['foobar'], SayHello())
423
424 call writefile(['ok'], 'Xdidit')
425 qall!
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200426 END
Bram Moolenaared234f22020-10-15 20:42:20 +0200427
428 # need to execute this with a separate Vim instance to avoid the current
429 # context gets garbage collected.
Bram Moolenaardd674772022-09-15 22:26:18 +0100430 writefile(lines, 'Xscript', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000431 g:RunVim([], [], '-S Xscript')
Bram Moolenaared234f22020-10-15 20:42:20 +0200432 assert_equal(['ok'], readfile('Xdidit'))
433
Bram Moolenaared234f22020-10-15 20:42:20 +0200434 delete('Xdidit')
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200435enddef
436
Bram Moolenaar39ca4122020-10-20 14:25:07 +0200437def Test_block_local_vars_with_func()
438 var lines =<< trim END
439 vim9script
440 if true
441 var foo = 'foo'
442 if true
443 var bar = 'bar'
444 def Func(): list<string>
445 return [foo, bar]
446 enddef
447 endif
448 endif
449 # function is compiled here, after blocks have finished, can still access
450 # "foo" and "bar"
451 assert_equal(['foo', 'bar'], Func())
452 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000453 v9.CheckScriptSuccess(lines)
Bram Moolenaar39ca4122020-10-20 14:25:07 +0200454enddef
455
Bram Moolenaare4db17f2021-08-01 21:19:43 +0200456" legacy func for command that's defined later
Bram Moolenaar62aec932022-01-29 21:45:34 +0000457func s:InvokeSomeCommand()
Bram Moolenaare4db17f2021-08-01 21:19:43 +0200458 SomeCommand
459endfunc
460
Yegappan Lakshmanane74cad32024-04-12 18:48:35 +0200461def Test_command_block()
Bram Moolenaare4db17f2021-08-01 21:19:43 +0200462 com SomeCommand {
463 g:someVar = 'some'
464 }
465 InvokeSomeCommand()
466 assert_equal('some', g:someVar)
467
468 delcommand SomeCommand
469 unlet g:someVar
470enddef
471
Yegappan Lakshmanane74cad32024-04-12 18:48:35 +0200472" Test for using heredoc in a :command command block
473def Test_command_block_heredoc()
474 var lines =<< trim CODE
475 vim9script
476 com SomeCommand {
477 g:someVar =<< trim END
478 aaa
479 bbb
480 END
481 }
482 SomeCommand
483 assert_equal(['aaa', 'bbb'], g:someVar)
484 def Foo()
485 g:someVar = []
486 SomeCommand
487 assert_equal(['aaa', 'bbb'], g:someVar)
488 enddef
489 Foo()
490 delcommand SomeCommand
491 unlet g:someVar
492 CODE
493 v9.CheckSourceSuccess( lines)
494
495 # Execute a command with heredoc in a block
496 lines =<< trim CODE
497 vim9script
498 com SomeCommand {
499 g:someVar =<< trim END
500 aaa
501 bbb
502 END
503 }
504 execute('SomeCommand')
505 assert_equal(['aaa', 'bbb'], g:someVar)
506 delcommand SomeCommand
507 unlet g:someVar
508 CODE
509 v9.CheckSourceSuccess(lines)
510
zeertzjq1f5175d2024-04-13 17:52:26 +0200511 # Heredoc with comment
512 lines =<< trim CODE
513 vim9script
514 com SomeCommand {
515 g:someVar =<< trim END # comment
516 aaa
517 bbb
518 END
519 }
520 execute('SomeCommand')
521 assert_equal(['aaa', 'bbb'], g:someVar)
522 delcommand SomeCommand
523 unlet g:someVar
524 CODE
525 v9.CheckSourceSuccess(lines)
526
Yegappan Lakshmanane74cad32024-04-12 18:48:35 +0200527 # heredoc evaluation
528 lines =<< trim CODE
529 vim9script
530 com SomeCommand {
531 var suffix = '---'
532 g:someVar =<< trim eval END
533 ccc{suffix}
534 ddd
535 END
536 }
537 SomeCommand
538 assert_equal(['ccc---', 'ddd'], g:someVar)
539 def Foo()
540 g:someVar = []
541 SomeCommand
542 assert_equal(['ccc---', 'ddd'], g:someVar)
543 enddef
544 Foo()
545 delcommand SomeCommand
546 unlet g:someVar
547 CODE
548 v9.CheckSourceSuccess(lines)
549
550 # command following heredoc
551 lines =<< trim CODE
552 vim9script
553 com SomeCommand {
554 var l =<< trim END
555 eee
556 fff
557 END
558 g:someVar = l
559 }
560 SomeCommand
561 assert_equal(['eee', 'fff'], g:someVar)
562 delcommand SomeCommand
563 unlet g:someVar
564 CODE
565 v9.CheckSourceSuccess(lines)
566
567 # Error in heredoc
568 lines =<< trim CODE
569 vim9script
570 com SomeCommand {
571 g:someVar =<< trim END
572 eee
573 fff
574 }
575 try
576 SomeCommand
577 catch
578 assert_match("E990: Missing end marker 'END'", v:exception)
579 endtry
580 delcommand SomeCommand
581 unlet g:someVar
582 CODE
583 v9.CheckSourceSuccess(lines)
584enddef
585
586def Test_autocommand_block()
Bram Moolenaare4db17f2021-08-01 21:19:43 +0200587 au BufNew *.xml {
588 g:otherVar = 'other'
589 }
590 split other.xml
591 assert_equal('other', g:otherVar)
592
593 bwipe!
594 au! BufNew *.xml
595 unlet g:otherVar
596enddef
597
Bram Moolenaard032f342020-07-18 18:13:02 +0200598func g:NoSuchFunc()
599 echo 'none'
600endfunc
601
Bram Moolenaar9e1d9e32021-01-11 20:17:34 +0100602def Test_try_catch_throw()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200603 var l = []
Bram Moolenaar7a092242020-04-16 22:10:49 +0200604 try # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100605 add(l, '1')
606 throw 'wrong'
Bram Moolenaar9d383f32023-05-14 21:38:12 +0100607 add(l, '2') # "unreachable code"
Bram Moolenaar7a092242020-04-16 22:10:49 +0200608 catch # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100609 add(l, v:exception)
Bram Moolenaar7a092242020-04-16 22:10:49 +0200610 finally # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100611 add(l, '3')
Bram Moolenaar7a092242020-04-16 22:10:49 +0200612 endtry # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100613 assert_equal(['1', 'wrong', '3'], l)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200614
Bram Moolenaare8593122020-07-18 15:17:02 +0200615 l = []
616 try
617 try
618 add(l, '1')
619 throw 'wrong'
Bram Moolenaar9d383f32023-05-14 21:38:12 +0100620 add(l, '2') # "unreachable code"
Bram Moolenaare8593122020-07-18 15:17:02 +0200621 catch /right/
622 add(l, v:exception)
623 endtry
624 catch /wrong/
625 add(l, 'caught')
Bram Moolenaar204852a2022-03-05 12:56:44 +0000626 finally
Bram Moolenaare8593122020-07-18 15:17:02 +0200627 add(l, 'finally')
628 endtry
629 assert_equal(['1', 'caught', 'finally'], l)
630
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200631 var n: number
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200632 try
633 n = l[3]
634 catch /E684:/
635 n = 99
636 endtry
637 assert_equal(99, n)
638
Bram Moolenaar69f70502021-01-01 16:10:46 +0100639 var done = 'no'
640 if 0
641 try | catch | endtry
642 else
643 done = 'yes'
644 endif
645 assert_equal('yes', done)
646
647 done = 'no'
648 if 1
649 done = 'yes'
650 else
651 try | catch | endtry
652 done = 'never'
653 endif
654 assert_equal('yes', done)
655
656 if 1
657 else
658 try | catch /pat/ | endtry
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000659 try | catch /pat/
Bram Moolenaar69f70502021-01-01 16:10:46 +0100660 endtry
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000661 try
Bram Moolenaar69f70502021-01-01 16:10:46 +0100662 catch /pat/ | endtry
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000663 try
664 catch /pat/
Bram Moolenaar69f70502021-01-01 16:10:46 +0100665 endtry
666 endif
667
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200668 try
Bram Moolenaarcc673e72020-08-16 17:33:35 +0200669 # string slice returns a string, not a number
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200670 n = g:astring[3]
Bram Moolenaar5e654232020-09-16 15:22:00 +0200671 catch /E1012:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200672 n = 77
673 endtry
674 assert_equal(77, n)
675
676 try
677 n = l[g:astring]
Bram Moolenaar5e654232020-09-16 15:22:00 +0200678 catch /E1012:/
Bram Moolenaar56acb092020-08-16 14:48:19 +0200679 n = 88
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200680 endtry
Bram Moolenaar56acb092020-08-16 14:48:19 +0200681 assert_equal(88, n)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200682
683 try
684 n = s:does_not_exist
685 catch /E121:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200686 n = 111
687 endtry
688 assert_equal(111, n)
689
690 try
691 n = g:does_not_exist
692 catch /E121:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200693 n = 121
694 endtry
695 assert_equal(121, n)
696
Bram Moolenaare0de1712020-12-02 17:36:54 +0100697 var d = {one: 1}
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200698 try
699 n = d[g:astring]
700 catch /E716:/
701 n = 222
702 endtry
703 assert_equal(222, n)
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200704
705 try
706 n = -g:astring
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200707 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200708 n = 233
709 endtry
710 assert_equal(233, n)
711
712 try
713 n = +g:astring
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200714 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200715 n = 244
716 endtry
717 assert_equal(244, n)
718
719 try
720 n = +g:alist
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200721 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200722 n = 255
723 endtry
724 assert_equal(255, n)
725
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200726 var nd: dict<any>
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200727 try
Bram Moolenaar2e5910b2021-02-03 17:41:24 +0100728 nd = {[g:alist]: 1}
729 catch /E1105:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200730 n = 266
731 endtry
732 assert_equal(266, n)
733
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000734 l = [1, 2, 3]
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200735 try
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +0000736 [n] = l
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200737 catch /E1093:/
738 n = 277
739 endtry
740 assert_equal(277, n)
741
Bram Moolenaare8593122020-07-18 15:17:02 +0200742 try
743 &ts = g:astring
Bram Moolenaar5e654232020-09-16 15:22:00 +0200744 catch /E1012:/
Bram Moolenaare8593122020-07-18 15:17:02 +0200745 n = 288
746 endtry
747 assert_equal(288, n)
748
749 try
750 &backspace = 'asdf'
751 catch /E474:/
752 n = 299
753 endtry
754 assert_equal(299, n)
755
756 l = [1]
757 try
758 l[3] = 3
759 catch /E684:/
760 n = 300
761 endtry
762 assert_equal(300, n)
763
764 try
Bram Moolenaare8593122020-07-18 15:17:02 +0200765 unlet g:does_not_exist
766 catch /E108:/
767 n = 322
768 endtry
769 assert_equal(322, n)
770
771 try
Bram Moolenaar2bede172020-11-19 18:53:18 +0100772 d = {text: 1, [g:astring]: 2}
Bram Moolenaare8593122020-07-18 15:17:02 +0200773 catch /E721:/
774 n = 333
775 endtry
776 assert_equal(333, n)
777
778 try
Bram Moolenaar62aec932022-01-29 21:45:34 +0000779 l = g:DeletedFunc()
Bram Moolenaare8593122020-07-18 15:17:02 +0200780 catch /E933:/
781 n = 344
782 endtry
783 assert_equal(344, n)
Bram Moolenaard032f342020-07-18 18:13:02 +0200784
785 try
Yegappan Lakshmanana764e732021-07-25 15:57:32 +0200786 echo range(1, 2, 0)
787 catch /E726:/
Bram Moolenaard032f342020-07-18 18:13:02 +0200788 n = 355
789 endtry
790 assert_equal(355, n)
791
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200792 var P = function('g:NoSuchFunc')
Bram Moolenaard032f342020-07-18 18:13:02 +0200793 delfunc g:NoSuchFunc
794 try
795 echo P()
796 catch /E117:/
797 n = 366
798 endtry
799 assert_equal(366, n)
800
801 try
802 echo g:NoSuchFunc()
803 catch /E117:/
804 n = 377
805 endtry
806 assert_equal(377, n)
807
808 try
809 echo g:alist + 4
810 catch /E745:/
811 n = 388
812 endtry
813 assert_equal(388, n)
814
815 try
816 echo 4 + g:alist
817 catch /E745:/
818 n = 399
819 endtry
820 assert_equal(399, n)
821
822 try
823 echo g:alist.member
824 catch /E715:/
825 n = 400
826 endtry
827 assert_equal(400, n)
828
829 try
830 echo d.member
831 catch /E716:/
832 n = 411
833 endtry
834 assert_equal(411, n)
Bram Moolenaard9d77892021-02-12 21:32:47 +0100835
836 var counter = 0
837 for i in range(4)
838 try
839 eval [][0]
840 catch
841 endtry
842 counter += 1
843 endfor
844 assert_equal(4, counter)
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100845
Bram Moolenaar9fa5dab2021-07-20 19:18:44 +0200846 # no requirement for spaces before |
847 try|echo 0|catch|endtry
848
Bram Moolenaar003312b2021-12-20 10:55:35 +0000849 # return in try with finally
850 def ReturnInTry(): number
851 var ret = 4
852 try
853 return ret
854 catch /this/
855 return -1
856 catch /that/
857 return -1
858 finally
859 # changing ret has no effect
860 ret = 7
861 endtry
862 return -2
863 enddef
864 assert_equal(4, ReturnInTry())
865
866 # return in catch with finally
867 def ReturnInCatch(): number
868 var ret = 5
869 try
870 throw 'getout'
Bram Moolenaar9d383f32023-05-14 21:38:12 +0100871 return -1 # "unreachable code"
Bram Moolenaar003312b2021-12-20 10:55:35 +0000872 catch /getout/
873 # ret is evaluated here
874 return ret
875 finally
876 # changing ret later has no effect
877 ret = -3
878 endtry
879 return -2
880 enddef
881 assert_equal(5, ReturnInCatch())
882
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100883 # return in finally after empty catch
884 def ReturnInFinally(): number
885 try
886 finally
Bram Moolenaar003312b2021-12-20 10:55:35 +0000887 return 6
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100888 endtry
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100889 enddef
Bram Moolenaar003312b2021-12-20 10:55:35 +0000890 assert_equal(6, ReturnInFinally())
Bram Moolenaar8ac681a2021-06-15 20:06:34 +0200891
892 var lines =<< trim END
893 vim9script
894 try
895 acos('0.5')
896 ->setline(1)
897 catch
898 g:caught = v:exception
899 endtry
900 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000901 v9.CheckScriptSuccess(lines)
Yegappan Lakshmanan4490ec42021-07-27 22:00:44 +0200902 assert_match('E1219: Float or Number required for argument 1', g:caught)
Bram Moolenaar8ac681a2021-06-15 20:06:34 +0200903 unlet g:caught
Bram Moolenaar41978282021-07-04 14:47:30 +0200904
905 # missing catch and/or finally
906 lines =<< trim END
907 vim9script
908 try
909 echo 'something'
910 endtry
911 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000912 v9.CheckScriptFailure(lines, 'E1032:')
rbtnn84934992021-08-07 13:26:53 +0200913
914 # skipping try-finally-endtry when try-finally-endtry is used in another block
915 lines =<< trim END
916 if v:true
917 try
918 finally
919 endtry
920 else
921 try
922 finally
923 endtry
924 endif
925 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000926 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100927enddef
928
Bram Moolenaara2c00282023-05-14 22:05:15 +0100929def Test_unreachable_after()
930 var lines =<< trim END
931 try
932 throw 'Error'
933 echo 'not reached'
934 catch /Error/
935 endtry
936 END
937 v9.CheckDefFailure(lines, 'E1095: Unreachable code after :throw')
938
939 lines =<< trim END
940 def SomeFunc(): number
941 try
942 return 3
943 echo 'not reached'
944 catch /Error/
945 endtry
946 return 4
947 enddef
948 defcompile
949 END
950 v9.CheckScriptFailure(lines, 'E1095: Unreachable code after :return')
951enddef
952
Bram Moolenaar3ef2e412023-04-30 18:50:48 +0100953def Test_throw_in_nested_try()
954 var lines =<< trim END
955 vim9script
956
957 def Try(F: func(): void)
958 try
959 F()
960 catch
961 endtry
962 enddef
963
964 class X
965 def F()
966 try
967 throw 'Foobar'
968 catch
969 throw v:exception
970 endtry
971 enddef
972 endclass
973
974 def Test_TryMethod()
975 var x = X.new()
976 Try(() => x.F())
977 enddef
978
979
980 try
981 Test_TryMethod()
982 catch
983 endtry
984 END
985 v9.CheckScriptSuccess(lines)
986enddef
987
Bram Moolenaar28bf6492022-03-03 15:11:20 +0000988def Test_try_var_decl()
989 var lines =<< trim END
990 vim9script
991 try
992 var in_try = 1
993 assert_equal(1, get(s:, 'in_try', -1))
994 throw "getout"
995 catch
996 var in_catch = 2
997 assert_equal(-1, get(s:, 'in_try', -1))
998 assert_equal(2, get(s:, 'in_catch', -1))
999 finally
1000 var in_finally = 3
1001 assert_equal(-1, get(s:, 'in_try', -1))
1002 assert_equal(-1, get(s:, 'in_catch', -1))
1003 assert_equal(3, get(s:, 'in_finally', -1))
1004 endtry
1005 assert_equal(-1, get(s:, 'in_try', -1))
1006 assert_equal(-1, get(s:, 'in_catch', -1))
1007 assert_equal(-1, get(s:, 'in_finally', -1))
1008 END
1009 v9.CheckScriptSuccess(lines)
1010enddef
1011
Bram Moolenaar53c29612022-01-12 16:18:18 +00001012def Test_try_ends_in_return()
1013 var lines =<< trim END
1014 vim9script
1015 def Foo(): string
1016 try
1017 return 'foo'
1018 catch
1019 return 'caught'
1020 endtry
1021 enddef
1022 assert_equal('foo', Foo())
1023 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001024 v9.CheckScriptSuccess(lines)
Bram Moolenaar53c29612022-01-12 16:18:18 +00001025
1026 lines =<< trim END
1027 vim9script
1028 def Foo(): string
1029 try
1030 return 'foo'
1031 catch
1032 return 'caught'
1033 endtry
1034 echo 'notreached'
1035 enddef
1036 assert_equal('foo', Foo())
1037 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001038 v9.CheckScriptFailure(lines, 'E1095:')
Bram Moolenaar53c29612022-01-12 16:18:18 +00001039
1040 lines =<< trim END
1041 vim9script
1042 def Foo(): string
1043 try
1044 return 'foo'
1045 catch /x/
1046 return 'caught'
1047 endtry
1048 enddef
1049 assert_equal('foo', Foo())
1050 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001051 v9.CheckScriptFailure(lines, 'E1027:')
Bram Moolenaar53c29612022-01-12 16:18:18 +00001052
1053 lines =<< trim END
1054 vim9script
1055 def Foo(): string
1056 try
1057 echo 'foo'
1058 catch
1059 echo 'caught'
1060 finally
1061 return 'done'
1062 endtry
1063 enddef
1064 assert_equal('done', Foo())
1065 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001066 v9.CheckScriptSuccess(lines)
Bram Moolenaar53c29612022-01-12 16:18:18 +00001067
1068enddef
1069
Bram Moolenaar3f987b52021-06-30 12:02:24 +02001070def Test_try_in_catch()
1071 var lines =<< trim END
1072 vim9script
1073 var seq = []
1074 def DoIt()
1075 try
1076 seq->add('throw 1')
1077 eval [][0]
1078 seq->add('notreached')
1079 catch
1080 seq->add('catch')
1081 try
1082 seq->add('throw 2')
1083 eval [][0]
1084 seq->add('notreached')
1085 catch /nothing/
1086 seq->add('notreached')
1087 endtry
1088 seq->add('done')
1089 endtry
1090 enddef
1091 DoIt()
1092 assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq)
1093 END
1094enddef
1095
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001096def Test_error_in_catch()
1097 var lines =<< trim END
1098 try
1099 eval [][0]
1100 catch /E684:/
1101 eval [][0]
1102 endtry
1103 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001104 v9.CheckDefExecFailure(lines, 'E684:', 4)
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001105enddef
1106
Bram Moolenaar2e34c342021-03-14 12:13:33 +01001107" :while at the very start of a function that :continue jumps to
Bram Moolenaar62aec932022-01-29 21:45:34 +00001108def s:TryContinueFunc()
Bram Moolenaar2e34c342021-03-14 12:13:33 +01001109 while g:Count < 2
1110 g:sequence ..= 't'
1111 try
1112 echoerr 'Test'
1113 catch
1114 g:Count += 1
1115 g:sequence ..= 'c'
1116 continue
1117 endtry
1118 g:sequence ..= 'e'
1119 g:Count += 1
1120 endwhile
1121enddef
1122
1123def Test_continue_in_try_in_while()
1124 g:Count = 0
1125 g:sequence = ''
1126 TryContinueFunc()
1127 assert_equal('tctc', g:sequence)
1128 unlet g:Count
1129 unlet g:sequence
1130enddef
1131
Bram Moolenaar873f8242022-03-10 21:53:44 +00001132def Test_break_in_try_in_for()
1133 var lines =<< trim END
1134 vim9script
1135 def Ls(): list<string>
1136 var ls: list<string>
1137 for s in ['abc', 'def']
1138 for _ in [123, 456]
1139 try
1140 eval [][0]
1141 catch
1142 break
1143 endtry
1144 endfor
1145 ls += [s]
1146 endfor
1147 return ls
1148 enddef
1149 assert_equal(['abc', 'def'], Ls())
1150 END
1151 v9.CheckScriptSuccess(lines)
1152enddef
1153
Bram Moolenaar9cb577a2021-02-22 22:45:10 +01001154def Test_nocatch_return_in_try()
1155 # return in try block returns normally
1156 def ReturnInTry(): string
1157 try
1158 return '"some message"'
1159 catch
1160 endtry
1161 return 'not reached'
1162 enddef
1163 exe 'echoerr ' .. ReturnInTry()
1164enddef
1165
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001166def Test_cnext_works_in_catch()
1167 var lines =<< trim END
1168 vim9script
Bram Moolenaarc3235272021-07-10 19:42:03 +02001169 au BufEnter * eval 1 + 2
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001170 writefile(['text'], 'Xcncfile1')
1171 writefile(['text'], 'Xcncfile2')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001172 var items = [
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001173 {lnum: 1, filename: 'Xcncfile1', valid: true},
1174 {lnum: 1, filename: 'Xcncfile2', valid: true}
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001175 ]
1176 setqflist([], ' ', {items: items})
1177 cwindow
1178
1179 def CnextOrCfirst()
1180 # if cnext fails, cfirst is used
1181 try
1182 cnext
1183 catch
1184 cfirst
1185 endtry
1186 enddef
1187
1188 CnextOrCfirst()
1189 CnextOrCfirst()
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001190 writefile([getqflist({idx: 0}).idx], 'Xcncresult')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001191 qall
1192 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001193 writefile(lines, 'XCatchCnext', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001194 g:RunVim([], [], '--clean -S XCatchCnext')
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001195 assert_equal(['1'], readfile('Xcncresult'))
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001196
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001197 delete('Xcncfile1')
1198 delete('Xcncfile2')
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001199 delete('Xcncresult')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001200enddef
1201
Bram Moolenaar9e1d9e32021-01-11 20:17:34 +01001202def Test_throw_skipped()
1203 if 0
1204 throw dontgethere
1205 endif
1206enddef
1207
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001208def Test_nocatch_throw_silenced()
1209 var lines =<< trim END
1210 vim9script
1211 def Func()
1212 throw 'error'
1213 enddef
1214 silent! Func()
1215 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001216 writefile(lines, 'XthrowSilenced', 'D')
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001217 source XthrowSilenced
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001218enddef
1219
Bram Moolenaara2c00282023-05-14 22:05:15 +01001220" g:DeletedFunc() is found when compiling Test_try_catch_throw() and then
1221" deleted, this should give a runtime error.
Bram Moolenaare8593122020-07-18 15:17:02 +02001222def DeletedFunc(): list<any>
1223 return ['delete me']
1224enddef
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001225defcompile DeletedFunc
1226
1227call test_override('unreachable', 1)
1228defcompile Test_try_catch_throw
1229call test_override('unreachable', 0)
1230
Bram Moolenaare8593122020-07-18 15:17:02 +02001231delfunc DeletedFunc
1232
Bram Moolenaar62aec932022-01-29 21:45:34 +00001233def s:ThrowFromDef()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001234 throw "getout" # comment
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001235enddef
1236
Bram Moolenaar62aec932022-01-29 21:45:34 +00001237func s:CatchInFunc()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001238 try
Bram Moolenaar62aec932022-01-29 21:45:34 +00001239 call s:ThrowFromDef()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001240 catch
1241 let g:thrown_func = v:exception
1242 endtry
1243endfunc
1244
Bram Moolenaar62aec932022-01-29 21:45:34 +00001245def s:CatchInDef()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001246 try
1247 ThrowFromDef()
1248 catch
1249 g:thrown_def = v:exception
1250 endtry
1251enddef
1252
Bram Moolenaar62aec932022-01-29 21:45:34 +00001253def s:ReturnFinally(): string
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001254 try
1255 return 'intry'
Bram Moolenaar204852a2022-03-05 12:56:44 +00001256 finally
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001257 g:in_finally = 'finally'
1258 endtry
1259 return 'end'
1260enddef
1261
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001262def Test_try_catch_nested()
1263 CatchInFunc()
1264 assert_equal('getout', g:thrown_func)
1265
1266 CatchInDef()
1267 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001268
1269 assert_equal('intry', ReturnFinally())
1270 assert_equal('finally', g:in_finally)
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001271
1272 var l = []
1273 try
1274 l->add('1')
1275 throw 'bad'
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001276 l->add('x') # "unreachable code"
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001277 catch /bad/
1278 l->add('2')
1279 try
1280 l->add('3')
1281 throw 'one'
1282 l->add('x')
1283 catch /one/
1284 l->add('4')
1285 try
1286 l->add('5')
1287 throw 'more'
1288 l->add('x')
1289 catch /more/
1290 l->add('6')
1291 endtry
1292 endtry
1293 endtry
1294 assert_equal(['1', '2', '3', '4', '5', '6'], l)
Bram Moolenaar834193a2021-06-30 20:39:15 +02001295
1296 l = []
1297 try
1298 try
1299 l->add('1')
1300 throw 'foo'
1301 l->add('x')
1302 catch
1303 l->add('2')
1304 throw 'bar'
1305 l->add('x')
1306 finally
1307 l->add('3')
1308 endtry
1309 l->add('x')
1310 catch /bar/
1311 l->add('4')
1312 endtry
1313 assert_equal(['1', '2', '3', '4'], l)
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001314enddef
1315
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001316call test_override('unreachable', 1)
1317defcompile Test_try_catch_nested
1318call test_override('unreachable', 0)
1319
Bram Moolenaar62aec932022-01-29 21:45:34 +00001320def s:TryOne(): number
Bram Moolenaar9939f572020-09-16 22:29:52 +02001321 try
1322 return 0
1323 catch
1324 endtry
1325 return 0
1326enddef
1327
Bram Moolenaar62aec932022-01-29 21:45:34 +00001328def s:TryTwo(n: number): string
Bram Moolenaar9939f572020-09-16 22:29:52 +02001329 try
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001330 var x = {}
Bram Moolenaar9939f572020-09-16 22:29:52 +02001331 catch
1332 endtry
1333 return 'text'
1334enddef
1335
1336def Test_try_catch_twice()
1337 assert_equal('text', TryOne()->TryTwo())
1338enddef
1339
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001340def Test_try_catch_match()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001341 var seq = 'a'
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001342 try
1343 throw 'something'
1344 catch /nothing/
1345 seq ..= 'x'
1346 catch /some/
1347 seq ..= 'b'
1348 catch /asdf/
1349 seq ..= 'x'
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001350 catch ?a\?sdf?
1351 seq ..= 'y'
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001352 finally
1353 seq ..= 'c'
1354 endtry
1355 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001356enddef
1357
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001358def Test_try_catch_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001359 v9.CheckDefFailure(['catch'], 'E603:')
1360 v9.CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1361 v9.CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1362 v9.CheckDefFailure(['finally'], 'E606:')
1363 v9.CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1364 v9.CheckDefFailure(['endtry'], 'E602:')
1365 v9.CheckDefFailure(['while 1', 'endtry'], 'E170:')
1366 v9.CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1367 v9.CheckDefFailure(['if 1', 'endtry'], 'E171:')
1368 v9.CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001369
Bram Moolenaar62aec932022-01-29 21:45:34 +00001370 v9.CheckDefFailure(['throw'], 'E1143:')
1371 v9.CheckDefFailure(['throw xxx'], 'E1001:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001372enddef
1373
Bram Moolenaar7c5b3c0362021-02-14 22:40:57 +01001374def Try_catch_skipped()
1375 var l = []
1376 try
1377 finally
1378 endtry
1379
1380 if 1
1381 else
1382 try
1383 endtry
1384 endif
1385enddef
1386
1387" The skipped try/endtry was updating the wrong instruction.
1388def Test_try_catch_skipped()
1389 var instr = execute('disassemble Try_catch_skipped')
1390 assert_match("NEWLIST size 0\n", instr)
1391enddef
1392
Bram Moolenaar90a57162022-02-12 14:23:17 +00001393def Test_throw_line_number()
1394 def Func()
1395 eval 1 + 1
1396 eval 2 + 2
1397 throw 'exception'
1398 enddef
1399 try
1400 Func()
1401 catch /exception/
1402 assert_match('line 3', v:throwpoint)
1403 endtry
1404enddef
Bram Moolenaar7c5b3c0362021-02-14 22:40:57 +01001405
1406
Bram Moolenaar006ad482020-06-30 20:55:15 +02001407def Test_throw_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001408 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001409 var lines =<< trim END
Bram Moolenaar006ad482020-06-30 20:55:15 +02001410 vim9script
1411 try
1412 throw 'one'
1413 .. 'two'
1414 catch
1415 assert_equal('onetwo', v:exception)
1416 endtry
1417 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001418 v9.CheckScriptSuccess(lines)
Bram Moolenaar1e021e62020-10-16 20:25:23 +02001419
1420 lines =<< trim END
1421 vim9script
Bram Moolenaar352134b2020-10-17 22:04:08 +02001422 @r = ''
Bram Moolenaar1e021e62020-10-16 20:25:23 +02001423 def Func()
1424 throw @r
1425 enddef
1426 var result = ''
1427 try
1428 Func()
1429 catch /E1129:/
1430 result = 'caught'
1431 endtry
1432 assert_equal('caught', result)
1433 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001434 v9.CheckScriptSuccess(lines)
Bram Moolenaar006ad482020-06-30 20:55:15 +02001435enddef
1436
Bram Moolenaared677f52020-08-12 16:38:10 +02001437def Test_error_in_nested_function()
Bram Moolenaar03dfde22021-02-14 13:17:22 +01001438 # an error in a nested :function aborts executing in the calling :def function
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001439 var lines =<< trim END
Bram Moolenaared677f52020-08-12 16:38:10 +02001440 vim9script
1441 def Func()
1442 Error()
1443 g:test_var = 1
1444 enddef
1445 func Error() abort
1446 eval [][0]
1447 endfunc
1448 Func()
1449 END
1450 g:test_var = 0
Bram Moolenaar62aec932022-01-29 21:45:34 +00001451 v9.CheckScriptFailure(lines, 'E684:')
Bram Moolenaared677f52020-08-12 16:38:10 +02001452 assert_equal(0, g:test_var)
1453enddef
1454
Bram Moolenaar227c58a2021-04-28 20:40:44 +02001455def Test_abort_after_error()
1456 var lines =<< trim END
1457 vim9script
1458 while true
1459 echo notfound
1460 endwhile
1461 g:gotthere = true
1462 END
1463 g:gotthere = false
Bram Moolenaar62aec932022-01-29 21:45:34 +00001464 v9.CheckScriptFailure(lines, 'E121:')
Bram Moolenaar227c58a2021-04-28 20:40:44 +02001465 assert_false(g:gotthere)
1466 unlet g:gotthere
1467enddef
1468
Bram Moolenaar37c83712020-06-30 21:18:36 +02001469def Test_cexpr_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001470 # only checks line continuation
Bram Moolenaar37c83712020-06-30 21:18:36 +02001471 set errorformat=File\ %f\ line\ %l
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001472 var lines =<< trim END
Bram Moolenaar37c83712020-06-30 21:18:36 +02001473 vim9script
1474 cexpr 'File'
1475 .. ' someFile' ..
1476 ' line 19'
1477 assert_equal(19, getqflist()[0].lnum)
1478 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001479 v9.CheckScriptSuccess(lines)
Bram Moolenaar397a87a2022-03-20 21:14:15 +00001480
1481 lines =<< trim END
1482 vim9script
1483 def CexprFail()
1484 au QuickfixCmdPre * echo g:doesnotexist
1485 cexpr 'File otherFile line 99'
1486 g:didContinue = 'yes'
1487 enddef
1488 CexprFail()
1489 g:didContinue = 'also'
1490 END
1491 g:didContinue = 'no'
1492 v9.CheckScriptFailure(lines, 'E121: Undefined variable: g:doesnotexist')
1493 assert_equal('no', g:didContinue)
1494 au! QuickfixCmdPre
1495
1496 lines =<< trim END
1497 vim9script
1498 def CexprFail()
1499 cexpr g:aNumber
1500 g:didContinue = 'yes'
1501 enddef
1502 CexprFail()
1503 g:didContinue = 'also'
1504 END
1505 g:aNumber = 123
1506 g:didContinue = 'no'
1507 v9.CheckScriptFailure(lines, 'E777: String or List expected')
1508 assert_equal('no', g:didContinue)
1509 unlet g:didContinue
1510
Bram Moolenaar37c83712020-06-30 21:18:36 +02001511 set errorformat&
1512enddef
1513
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001514def Test_statusline_syntax()
1515 # legacy syntax is used for 'statusline'
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001516 var lines =<< trim END
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001517 vim9script
1518 func g:Status()
1519 return '%{"x" is# "x"}'
1520 endfunc
1521 set laststatus=2 statusline=%!Status()
1522 redrawstatus
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00001523 set laststatus statusline=
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001524 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001525 v9.CheckScriptSuccess(lines)
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001526enddef
1527
Bram Moolenaarb2097502020-07-19 17:17:02 +02001528def Test_list_vimscript()
1529 # checks line continuation and comments
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001530 var lines =<< trim END
Bram Moolenaarb2097502020-07-19 17:17:02 +02001531 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001532 var mylist = [
Bram Moolenaarb2097502020-07-19 17:17:02 +02001533 'one',
1534 # comment
1535 'two', # empty line follows
1536
1537 'three',
1538 ]
1539 assert_equal(['one', 'two', 'three'], mylist)
1540 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001541 v9.CheckScriptSuccess(lines)
Bram Moolenaar66250c92020-08-20 15:02:42 +02001542
1543 # check all lines from heredoc are kept
1544 lines =<< trim END
1545 # comment 1
1546 two
1547 # comment 3
1548
1549 five
1550 # comment 6
1551 END
1552 assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
Bram Moolenaar4bce26b2021-01-22 22:06:56 +01001553
1554 lines =<< trim END
1555 [{
1556 a: 0}]->string()->assert_equal("[{'a': 0}]")
1557 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001558 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarb2097502020-07-19 17:17:02 +02001559enddef
1560
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001561if has('channel')
1562 let someJob = test_null_job()
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001563
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001564 def FuncWithError()
1565 echomsg g:someJob
1566 enddef
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001567
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001568 func Test_convert_emsg_to_exception()
1569 try
1570 call FuncWithError()
1571 catch
1572 call assert_match('Vim:E908:', v:exception)
1573 endtry
1574 endfunc
1575endif
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001576
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001577def Test_vim9script_mix()
1578 var lines =<< trim END
1579 if has(g:feature)
1580 " legacy script
1581 let g:legacy = 1
1582 finish
1583 endif
1584 vim9script
1585 g:legacy = 0
1586 END
1587 g:feature = 'eval'
1588 g:legacy = -1
Bram Moolenaar62aec932022-01-29 21:45:34 +00001589 v9.CheckScriptSuccess(lines)
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001590 assert_equal(1, g:legacy)
1591
1592 g:feature = 'noteval'
1593 g:legacy = -1
Bram Moolenaar62aec932022-01-29 21:45:34 +00001594 v9.CheckScriptSuccess(lines)
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001595 assert_equal(0, g:legacy)
1596enddef
1597
Bram Moolenaar750802b2020-02-23 18:08:33 +01001598def Test_vim9script_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001599 v9.CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
1600 v9.CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +01001601
Bram Moolenaar62aec932022-01-29 21:45:34 +00001602 v9.CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1603 v9.CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
Bram Moolenaarc785b9a2020-06-19 18:34:15 +02001604
Bram Moolenaare2e40752020-09-04 21:18:46 +02001605 assert_fails('vim9script', 'E1038:')
Bram Moolenaar107f7322022-02-06 17:30:41 +00001606 v9.CheckDefFailure(['vim9script'], 'E1038:')
Bram Moolenaar8cbf2492022-02-06 20:28:13 +00001607
1608 # no error when skipping
1609 if has('nothing')
1610 vim9script
1611 endif
Bram Moolenaarc970e422021-03-17 15:03:04 +01001612enddef
1613
Bram Moolenaar6c3843c2021-03-04 12:38:21 +01001614def Test_script_var_shadows_function()
1615 var lines =<< trim END
1616 vim9script
1617 def Func(): number
1618 return 123
1619 enddef
1620 var Func = 1
1621 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001622 v9.CheckScriptFailure(lines, 'E1041:', 5)
Bram Moolenaar6c3843c2021-03-04 12:38:21 +01001623enddef
1624
Bram Moolenaar052ff292021-12-11 13:54:46 +00001625def Test_function_shadows_script_var()
1626 var lines =<< trim END
1627 vim9script
1628 var Func = 1
1629 def Func(): number
1630 return 123
1631 enddef
1632 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001633 v9.CheckScriptFailure(lines, 'E1041:', 3)
Bram Moolenaar052ff292021-12-11 13:54:46 +00001634enddef
1635
Bram Moolenaarc3235272021-07-10 19:42:03 +02001636def Test_script_var_shadows_command()
1637 var lines =<< trim END
1638 var undo = 1
1639 undo = 2
1640 assert_equal(2, undo)
1641 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001642 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc3235272021-07-10 19:42:03 +02001643
1644 lines =<< trim END
1645 var undo = 1
1646 undo
1647 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001648 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaarc3235272021-07-10 19:42:03 +02001649enddef
1650
Bram Moolenaar2ef91562021-12-11 16:14:07 +00001651def Test_vim9script_call_wrong_type()
1652 var lines =<< trim END
1653 vim9script
1654 var Time = 'localtime'
1655 Time()
1656 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001657 v9.CheckScriptFailure(lines, 'E1085:')
Bram Moolenaar2ef91562021-12-11 16:14:07 +00001658enddef
1659
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001660def Test_vim9script_reload_delfunc()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001661 var first_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001662 vim9script
1663 def FuncYes(): string
1664 return 'yes'
1665 enddef
1666 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001667 var withno_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001668 def FuncNo(): string
1669 return 'no'
1670 enddef
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001671 def g:DoCheck(no_exists: bool)
1672 assert_equal('yes', FuncYes())
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001673 assert_equal('no', FuncNo())
1674 enddef
1675 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001676 var nono_lines =<< trim END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001677 def g:DoCheck(no_exists: bool)
1678 assert_equal('yes', FuncYes())
Bram Moolenaar44d66522020-09-06 22:26:57 +02001679 assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001680 enddef
1681 END
1682
1683 # FuncNo() is defined
Bram Moolenaardd674772022-09-15 22:26:18 +01001684 writefile(first_lines + withno_lines, 'Xreloaded.vim', 'D')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001685 source Xreloaded.vim
1686 g:DoCheck(true)
1687
1688 # FuncNo() is not redefined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001689 writefile(first_lines + nono_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001690 source Xreloaded.vim
Bram Moolenaar50824712020-12-20 21:10:17 +01001691 g:DoCheck(false)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001692
1693 # FuncNo() is back
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001694 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001695 source Xreloaded.vim
Bram Moolenaar50824712020-12-20 21:10:17 +01001696 g:DoCheck(false)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001697enddef
1698
Bram Moolenaar89483d42020-05-10 15:24:44 +02001699def Test_vim9script_reload_delvar()
1700 # write the script with a script-local variable
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001701 var lines =<< trim END
Bram Moolenaar89483d42020-05-10 15:24:44 +02001702 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001703 var name = 'string'
Bram Moolenaar89483d42020-05-10 15:24:44 +02001704 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001705 writefile(lines, 'XreloadVar.vim', 'D')
Bram Moolenaar89483d42020-05-10 15:24:44 +02001706 source XreloadVar.vim
1707
1708 # now write the script using the same variable locally - works
1709 lines =<< trim END
1710 vim9script
1711 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001712 var name = 'string'
Bram Moolenaar89483d42020-05-10 15:24:44 +02001713 enddef
1714 END
1715 writefile(lines, 'XreloadVar.vim')
1716 source XreloadVar.vim
Bram Moolenaar89483d42020-05-10 15:24:44 +02001717enddef
1718
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001719def Test_func_redefine_error()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001720 var lines = [
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001721 'vim9script',
1722 'def Func()',
1723 ' eval [][0]',
1724 'enddef',
1725 'Func()',
1726 ]
Bram Moolenaardd674772022-09-15 22:26:18 +01001727 writefile(lines, 'Xtestscript.vim', 'D')
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001728
1729 for count in range(3)
1730 try
1731 source Xtestscript.vim
1732 catch /E684/
1733 # function name should contain <SNR> every time
Bram Moolenaarec892232022-05-06 17:53:06 +01001734 assert_match('E684: List index out of range', v:exception)
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001735 assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1736 endtry
1737 endfor
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001738enddef
1739
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001740def Test_func_redefine_fails()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001741 var lines =<< trim END
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001742 vim9script
1743 def Func()
1744 echo 'one'
1745 enddef
1746 def Func()
1747 echo 'two'
1748 enddef
1749 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001750 v9.CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001751
1752 lines =<< trim END
1753 vim9script
1754 def Foo(): string
1755 return 'foo'
Bram Moolenaar052ff292021-12-11 13:54:46 +00001756 enddef
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001757 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001758 var Foo = {-> 'lambda'}
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001759 enddef
1760 defcompile
1761 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001762 v9.CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001763enddef
1764
Bram Moolenaar91c7cbf2022-08-18 13:28:31 +01001765def Test_lambda_split()
1766 # this was using freed memory, because of the split expression
1767 var lines =<< trim END
1768 vim9script
1769 try
1770 0
1771 0->(0
1772 ->a.0(
1773 ->u
1774 END
1775 v9.CheckScriptFailure(lines, 'E1050:')
1776enddef
1777
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001778def Test_fixed_size_list()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001779 # will be allocated as one piece of memory, check that changes work
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001780 var l = [1, 2, 3, 4]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001781 l->remove(0)
1782 l->add(5)
1783 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001784 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001785enddef
1786
Bram Moolenaarae616492020-07-28 20:07:27 +02001787def Test_no_insert_xit()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001788 v9.CheckDefExecFailure(['a = 1'], 'E1100:')
1789 v9.CheckDefExecFailure(['c = 1'], 'E1100:')
1790 v9.CheckDefExecFailure(['i = 1'], 'E1100:')
1791 v9.CheckDefExecFailure(['t = 1'], 'E1100:')
1792 v9.CheckDefExecFailure(['x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02001793
Bram Moolenaar62aec932022-01-29 21:45:34 +00001794 v9.CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1795 v9.CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1796 v9.CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1797 v9.CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1798 v9.CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1799 v9.CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1800 v9.CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
1801 v9.CheckScriptFailure(['vim9script', 'o'], 'E1100:')
1802 v9.CheckScriptFailure(['vim9script', 't'], 'E1100:')
1803 v9.CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1804 v9.CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02001805enddef
1806
Bram Moolenaar62aec932022-01-29 21:45:34 +00001807def s:IfElse(what: number): string
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001808 var res = ''
Bram Moolenaar158906c2020-02-06 20:39:45 +01001809 if what == 1
1810 res = "one"
1811 elseif what == 2
1812 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001813 else
Bram Moolenaar158906c2020-02-06 20:39:45 +01001814 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001815 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +01001816 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001817enddef
1818
Bram Moolenaar158906c2020-02-06 20:39:45 +01001819def Test_if_elseif_else()
1820 assert_equal('one', IfElse(1))
1821 assert_equal('two', IfElse(2))
1822 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001823enddef
1824
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001825def Test_if_elseif_else_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001826 v9.CheckDefFailure(['elseif true'], 'E582:')
1827 v9.CheckDefFailure(['else'], 'E581:')
1828 v9.CheckDefFailure(['endif'], 'E580:')
1829 v9.CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
1830 v9.CheckDefFailure(['if true', 'echo 1'], 'E171:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01001831
1832 var lines =<< trim END
1833 var s = ''
1834 if s = ''
1835 endif
1836 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001837 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01001838
1839 lines =<< trim END
1840 var s = ''
1841 if s == ''
1842 elseif s = ''
1843 endif
1844 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001845 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaarfa010cd2022-04-03 16:13:07 +01001846
1847 lines =<< trim END
1848 var cond = true
1849 if cond
1850 echo 'true'
1851 elseif
1852 echo 'false'
1853 endif
1854 END
1855 v9.CheckDefAndScriptFailure(lines, ['E1143:', 'E15:'], 4)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001856enddef
1857
Bram Moolenaar505ed0c2022-05-05 17:02:46 +01001858def Test_if_else_func_using_var()
1859 var lines =<< trim END
1860 vim9script
1861
1862 const debug = true
1863 if debug
1864 var mode_chars = 'something'
1865 def Bits2Ascii()
1866 var x = mode_chars
1867 g:where = 'in true'
1868 enddef
1869 else
1870 def Bits2Ascii()
1871 g:where = 'in false'
1872 enddef
1873 endif
1874
1875 Bits2Ascii()
1876 END
1877 v9.CheckScriptSuccess(lines)
1878 assert_equal('in true', g:where)
1879 unlet g:where
1880
1881 lines =<< trim END
1882 vim9script
1883
1884 const debug = false
1885 if debug
1886 var mode_chars = 'something'
1887 def Bits2Ascii()
1888 g:where = 'in true'
1889 enddef
1890 else
1891 def Bits2Ascii()
1892 var x = mode_chars
1893 g:where = 'in false'
1894 enddef
1895 endif
1896
1897 Bits2Ascii()
1898 END
1899 v9.CheckScriptFailure(lines, 'E1001: Variable not found: mode_chars')
1900enddef
1901
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001902let g:bool_true = v:true
1903let g:bool_false = v:false
1904
1905def Test_if_const_expr()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001906 var res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001907 if true ? true : false
1908 res = true
1909 endif
1910 assert_equal(true, res)
1911
Bram Moolenaar585fea72020-04-02 22:33:21 +02001912 g:glob = 2
1913 if false
Bram Moolenaar67979662020-06-20 22:50:47 +02001914 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001915 endif
1916 assert_equal(2, g:glob)
1917 if true
Bram Moolenaar67979662020-06-20 22:50:47 +02001918 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001919 endif
1920 assert_equal(3, g:glob)
1921
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001922 res = false
1923 if g:bool_true ? true : false
1924 res = true
1925 endif
1926 assert_equal(true, res)
1927
1928 res = false
1929 if true ? g:bool_true : false
1930 res = true
1931 endif
1932 assert_equal(true, res)
1933
1934 res = false
1935 if true ? true : g:bool_false
1936 res = true
1937 endif
1938 assert_equal(true, res)
1939
1940 res = false
1941 if true ? false : true
1942 res = true
1943 endif
1944 assert_equal(false, res)
1945
1946 res = false
1947 if false ? false : true
1948 res = true
1949 endif
1950 assert_equal(true, res)
1951
1952 res = false
1953 if false ? true : false
1954 res = true
1955 endif
1956 assert_equal(false, res)
1957
1958 res = false
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001959 if has('xyz') ? true : false
1960 res = true
1961 endif
1962 assert_equal(false, res)
1963
1964 res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001965 if true && true
1966 res = true
1967 endif
1968 assert_equal(true, res)
1969
1970 res = false
1971 if true && false
1972 res = true
1973 endif
1974 assert_equal(false, res)
1975
1976 res = false
1977 if g:bool_true && false
1978 res = true
1979 endif
1980 assert_equal(false, res)
1981
1982 res = false
1983 if true && g:bool_false
1984 res = true
1985 endif
1986 assert_equal(false, res)
1987
1988 res = false
1989 if false && false
1990 res = true
1991 endif
1992 assert_equal(false, res)
1993
1994 res = false
1995 if true || false
1996 res = true
1997 endif
1998 assert_equal(true, res)
1999
2000 res = false
2001 if g:bool_true || false
2002 res = true
2003 endif
2004 assert_equal(true, res)
2005
2006 res = false
2007 if true || g:bool_false
2008 res = true
2009 endif
2010 assert_equal(true, res)
2011
2012 res = false
2013 if false || false
2014 res = true
2015 endif
2016 assert_equal(false, res)
Bram Moolenaar3988f642020-08-27 22:43:03 +02002017
2018 # with constant "false" expression may be invalid so long as the syntax is OK
Bram Moolenaarc3235272021-07-10 19:42:03 +02002019 if false | eval 1 + 2 | endif
Bram Moolenaar3988f642020-08-27 22:43:03 +02002020 if false | eval burp + 234 | endif
2021 if false | echo burp 234 'asd' | endif
2022 if false
2023 burp
2024 endif
Bram Moolenaare525bdd2021-08-07 18:12:40 +02002025
Bram Moolenaar21ebb082022-02-04 21:58:58 +00002026 if 0
2027 if 1
2028 echo nothing
2029 elseif 1
2030 echo still nothing
2031 endif
2032 endif
2033
Bram Moolenaare525bdd2021-08-07 18:12:40 +02002034 # expression with line breaks skipped
2035 if false
2036 ('aaa'
2037 .. 'bbb'
2038 .. 'ccc'
2039 )->setline(1)
2040 endif
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02002041enddef
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002042
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02002043def Test_if_const_expr_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00002044 v9.CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2045 v9.CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2046 v9.CheckDefFailure(["if has('aaa'"], 'E110:')
2047 v9.CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002048enddef
2049
Bram Moolenaar62aec932022-01-29 21:45:34 +00002050def s:RunNested(i: number): number
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002051 var x: number = 0
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002052 if i % 2
2053 if 1
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002054 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002055 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002056 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002057 endif
2058 x += 1
2059 else
2060 x += 1000
2061 endif
2062 return x
2063enddef
2064
2065def Test_nested_if()
2066 assert_equal(1, RunNested(1))
2067 assert_equal(1000, RunNested(2))
2068enddef
2069
Bram Moolenaarad39c092020-02-26 18:23:43 +01002070def Test_execute_cmd()
Bram Moolenaare4984292020-12-13 14:19:25 +01002071 # missing argument is ignored
2072 execute
2073 execute # comment
2074
Bram Moolenaarad39c092020-02-26 18:23:43 +01002075 new
2076 setline(1, 'default')
Bram Moolenaard2c61702020-09-06 15:58:36 +02002077 execute 'setline(1, "execute-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002078 assert_equal('execute-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002079
Bram Moolenaard2c61702020-09-06 15:58:36 +02002080 execute "setline(1, 'execute-string')"
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002081 assert_equal('execute-string', getline(1))
2082
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002083 var cmd1 = 'setline(1,'
2084 var cmd2 = '"execute-var")'
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002085 execute cmd1 cmd2 # comment
Bram Moolenaarad39c092020-02-26 18:23:43 +01002086 assert_equal('execute-var', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002087
Bram Moolenaard2c61702020-09-06 15:58:36 +02002088 execute cmd1 cmd2 '|setline(1, "execute-var-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002089 assert_equal('execute-var-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002090
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002091 var cmd_first = 'call '
2092 var cmd_last = 'setline(1, "execute-var-var")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002093 execute cmd_first .. cmd_last
2094 assert_equal('execute-var-var', getline(1))
2095 bwipe!
Bram Moolenaar585fea72020-04-02 22:33:21 +02002096
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002097 var n = true
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02002098 execute 'echomsg' (n ? '"true"' : '"no"')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002099 assert_match('^true$', g:Screenline(&lines))
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02002100
Bram Moolenaare0de1712020-12-02 17:36:54 +01002101 echomsg [1, 2, 3] {a: 1, b: 2}
Bram Moolenaar62aec932022-01-29 21:45:34 +00002102 assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', g:Screenline(&lines))
Bram Moolenaare5abf7a2020-08-16 18:29:35 +02002103
Bram Moolenaar62aec932022-01-29 21:45:34 +00002104 v9.CheckDefFailure(['execute xxx'], 'E1001:', 1)
2105 v9.CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2106 v9.CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
Bram Moolenaar0c7f2612022-02-17 19:44:07 +00002107 if has('channel')
2108 v9.CheckDefExecFailure(['execute test_null_channel()'], 'E908:', 1)
2109 endif
Bram Moolenaarad39c092020-02-26 18:23:43 +01002110enddef
2111
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002112def Test_execute_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002113 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002114 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002115 vim9script
2116 execute 'g:someVar'
2117 .. ' = ' ..
2118 '28'
2119 assert_equal(28, g:someVar)
2120 unlet g:someVar
2121 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002122 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002123enddef
2124
Bram Moolenaar43216612022-03-25 11:16:28 +00002125def Test_execute_finish()
2126 # the empty lines are relevant here
2127 var lines =<< trim END
2128 vim9script
2129
2130 var vname = "g:hello"
2131
2132 if exists(vname) | finish | endif | execute vname '= "world"'
2133
2134 assert_equal('world', g:hello)
2135
2136 if exists(vname) | finish | endif | execute vname '= "world"'
2137
2138 assert_report('should not be reached')
2139 END
2140 v9.CheckScriptSuccess(lines)
2141enddef
2142
Bram Moolenaarad39c092020-02-26 18:23:43 +01002143def Test_echo_cmd()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002144 echo 'some' # comment
Bram Moolenaar585fea72020-04-02 22:33:21 +02002145 echon 'thing'
Bram Moolenaar62aec932022-01-29 21:45:34 +00002146 assert_match('^something$', g:Screenline(&lines))
Bram Moolenaarad39c092020-02-26 18:23:43 +01002147
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002148 echo "some" # comment
2149 echon "thing"
Bram Moolenaar62aec932022-01-29 21:45:34 +00002150 assert_match('^something$', g:Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002151
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002152 var str1 = 'some'
2153 var str2 = 'more'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002154 echo str1 str2
Bram Moolenaar62aec932022-01-29 21:45:34 +00002155 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002156
Bram Moolenaar397a87a2022-03-20 21:14:15 +00002157 echo "one\ntwo"
2158 assert_match('^one$', g:Screenline(&lines - 1))
2159 assert_match('^two$', g:Screenline(&lines))
2160
Bram Moolenaar62aec932022-01-29 21:45:34 +00002161 v9.CheckDefFailure(['echo "xxx"# comment'], 'E488:')
Yegappan Lakshmanan22029ed2024-05-20 13:57:11 +02002162
2163 # Test for echoing a script local function name
2164 var lines =<< trim END
2165 vim9script
2166 def ScriptLocalEcho()
2167 enddef
2168 echo ScriptLocalEcho
2169 END
2170 new
2171 setline(1, lines)
2172 assert_match('<SNR>\d\+_ScriptLocalEcho', execute('source')->split("\n")[0])
2173 bw!
Bram Moolenaarad39c092020-02-26 18:23:43 +01002174enddef
2175
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002176def Test_echomsg_cmd()
2177 echomsg 'some' 'more' # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00002178 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002179 echo 'clear'
Bram Moolenaardf069ee2020-06-22 23:02:51 +02002180 :1messages
Bram Moolenaar62aec932022-01-29 21:45:34 +00002181 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002182
Bram Moolenaar62aec932022-01-29 21:45:34 +00002183 v9.CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002184enddef
2185
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002186def Test_echomsg_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002187 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002188 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002189 vim9script
2190 echomsg 'here'
2191 .. ' is ' ..
2192 'a message'
Bram Moolenaar62aec932022-01-29 21:45:34 +00002193 assert_match('^here is a message$', g:Screenline(&lines))
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002194 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002195 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002196enddef
2197
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002198def Test_echoerr_cmd()
Bram Moolenaar7de62622021-08-07 15:05:47 +02002199 var local = 'local'
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002200 try
Bram Moolenaar7de62622021-08-07 15:05:47 +02002201 echoerr 'something' local 'wrong' # comment
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002202 catch
Bram Moolenaar7de62622021-08-07 15:05:47 +02002203 assert_match('something local wrong', v:exception)
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002204 endtry
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002205enddef
2206
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002207def Test_echoerr_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002208 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002209 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002210 vim9script
2211 try
2212 echoerr 'this'
2213 .. ' is ' ..
2214 'wrong'
2215 catch
2216 assert_match('this is wrong', v:exception)
2217 endtry
2218 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002219 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002220enddef
2221
Bram Moolenaar7de62622021-08-07 15:05:47 +02002222def Test_echoconsole_cmd()
2223 var local = 'local'
2224 echoconsole 'something' local # comment
2225 # output goes anywhere
2226enddef
2227
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002228def Test_echowindow_cmd()
2229 var local = 'local'
2230 echowindow 'something' local # comment
Bram Moolenaar2435adf2022-10-21 12:05:46 +01002231
2232 # with modifier
2233 unsilent echowin 'loud'
2234
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002235 # output goes in message window
2236 popup_clear()
2237enddef
2238
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002239def Test_for_outside_of_function()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002240 var lines =<< trim END
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002241 vim9script
2242 new
2243 for var in range(0, 3)
2244 append(line('$'), var)
2245 endfor
2246 assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
2247 bwipe!
Bram Moolenaar522eefd2021-03-26 18:49:22 +01002248
2249 var result = ''
2250 for i in [1, 2, 3]
2251 var loop = ' loop ' .. i
2252 result ..= loop
2253 endfor
2254 assert_equal(' loop 1 loop 2 loop 3', result)
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002255 END
Bram Moolenaardd674772022-09-15 22:26:18 +01002256 writefile(lines, 'Xvim9for.vim', 'D')
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002257 source Xvim9for.vim
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002258enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002259
rbtnnbebf0692021-08-21 17:26:50 +02002260def Test_for_skipped_block()
2261 # test skipped blocks at outside of function
2262 var lines =<< trim END
2263 var result = []
2264 if true
2265 for n in [1, 2]
2266 result += [n]
2267 endfor
2268 else
2269 for n in [3, 4]
2270 result += [n]
2271 endfor
2272 endif
2273 assert_equal([1, 2], result)
2274
2275 result = []
2276 if false
2277 for n in [1, 2]
2278 result += [n]
2279 endfor
2280 else
2281 for n in [3, 4]
2282 result += [n]
2283 endfor
2284 endif
2285 assert_equal([3, 4], result)
2286 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002287 v9.CheckDefAndScriptSuccess(lines)
rbtnnbebf0692021-08-21 17:26:50 +02002288
2289 # test skipped blocks at inside of function
2290 lines =<< trim END
2291 def DefTrue()
2292 var result = []
2293 if true
2294 for n in [1, 2]
2295 result += [n]
2296 endfor
2297 else
2298 for n in [3, 4]
2299 result += [n]
2300 endfor
2301 endif
2302 assert_equal([1, 2], result)
2303 enddef
2304 DefTrue()
2305
2306 def DefFalse()
2307 var result = []
2308 if false
2309 for n in [1, 2]
2310 result += [n]
2311 endfor
2312 else
2313 for n in [3, 4]
2314 result += [n]
2315 endfor
2316 endif
2317 assert_equal([3, 4], result)
2318 enddef
2319 DefFalse()
Bram Moolenaar97f8c102022-04-02 19:43:57 +01002320
2321 def BuildDiagrams()
2322 var diagrams: list<any>
2323 if false
2324 var max = 0
2325 for v in diagrams
2326 var l = 3
2327 if max < l | max = l | endif
2328 v->add(l)
2329 endfor
2330 endif
2331 enddef
2332 BuildDiagrams()
rbtnnbebf0692021-08-21 17:26:50 +02002333 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002334 v9.CheckDefAndScriptSuccess(lines)
rbtnnbebf0692021-08-21 17:26:50 +02002335enddef
2336
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002337def Test_skipped_redir()
2338 var lines =<< trim END
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002339 def Tredir()
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002340 if 0
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002341 redir => l[0]
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002342 redir END
2343 endif
2344 enddef
2345 defcompile
2346 END
2347 v9.CheckScriptSuccess(lines)
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002348 delfunc g:Tredir
2349
2350 lines =<< trim END
2351 def Tredir()
2352 if 0
2353 redir => l[0]
2354 endif
2355 echo 'executed'
2356 if 0
2357 redir END
2358 endif
2359 enddef
2360 defcompile
2361 END
2362 v9.CheckScriptSuccess(lines)
2363 delfunc g:Tredir
2364
2365 lines =<< trim END
2366 def Tredir()
2367 var l = ['']
2368 if 1
2369 redir => l[0]
2370 endif
2371 echo 'executed'
2372 if 0
2373 redir END
2374 else
2375 redir END
2376 endif
2377 enddef
2378 defcompile
2379 END
2380 v9.CheckScriptSuccess(lines)
2381 delfunc g:Tredir
2382
2383 lines =<< trim END
2384 let doit = 1
2385 def Tredir()
2386 var l = ['']
2387 if g:doit
2388 redir => l[0]
2389 endif
2390 echo 'executed'
2391 if g:doit
2392 redir END
2393 endif
2394 enddef
2395 defcompile
2396 END
2397 v9.CheckScriptSuccess(lines)
2398 delfunc g:Tredir
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002399enddef
2400
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002401def Test_for_loop()
Bram Moolenaarf2253962021-04-13 20:53:13 +02002402 var lines =<< trim END
2403 var result = ''
2404 for cnt in range(7)
2405 if cnt == 4
2406 break
2407 endif
2408 if cnt == 2
2409 continue
2410 endif
2411 result ..= cnt .. '_'
2412 endfor
2413 assert_equal('0_1_3_', result)
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02002414
Bram Moolenaarf2253962021-04-13 20:53:13 +02002415 var concat = ''
2416 for str in eval('["one", "two"]')
2417 concat ..= str
2418 endfor
2419 assert_equal('onetwo', concat)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002420
Bram Moolenaarf2253962021-04-13 20:53:13 +02002421 var total = 0
2422 for nr in
2423 [1, 2, 3]
2424 total += nr
2425 endfor
2426 assert_equal(6, total)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002427
Bram Moolenaarf2253962021-04-13 20:53:13 +02002428 total = 0
2429 for nr
2430 in [1, 2, 3]
2431 total += nr
2432 endfor
2433 assert_equal(6, total)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002434
Bram Moolenaarf2253962021-04-13 20:53:13 +02002435 total = 0
2436 for nr
2437 in
2438 [1, 2, 3]
2439 total += nr
2440 endfor
2441 assert_equal(6, total)
Bram Moolenaar036d0712021-01-17 20:23:38 +01002442
Bram Moolenaara3589a02021-04-14 13:30:46 +02002443 # with type
2444 total = 0
2445 for n: number in [1, 2, 3]
2446 total += n
2447 endfor
2448 assert_equal(6, total)
2449
Bram Moolenaarefd73ae2022-03-20 18:51:00 +00002450 total = 0
2451 for b in 0z010203
2452 total += b
2453 endfor
2454 assert_equal(6, total)
2455
Bram Moolenaarfe090eb2021-04-15 21:48:32 +02002456 var chars = ''
2457 for s: string in 'foobar'
2458 chars ..= s
2459 endfor
2460 assert_equal('foobar', chars)
2461
Bram Moolenaar5ede5b22021-07-07 21:55:25 +02002462 chars = ''
2463 for x: string in {a: 'a', b: 'b'}->values()
2464 chars ..= x
2465 endfor
2466 assert_equal('ab', chars)
2467
Bram Moolenaara3589a02021-04-14 13:30:46 +02002468 # unpack with type
Bram Moolenaarf2253962021-04-13 20:53:13 +02002469 var res = ''
Bram Moolenaara3589a02021-04-14 13:30:46 +02002470 for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2471 res ..= n .. s
2472 endfor
2473 assert_equal('1a2b', res)
2474
Bram Moolenaar444d8782021-06-26 12:40:56 +02002475 # unpack with one var
2476 var reslist = []
2477 for [x] in [['aaa'], ['bbb']]
2478 reslist->add(x)
2479 endfor
2480 assert_equal(['aaa', 'bbb'], reslist)
2481
Bram Moolenaara3589a02021-04-14 13:30:46 +02002482 # loop over string
2483 res = ''
Bram Moolenaarf2253962021-04-13 20:53:13 +02002484 for c in 'aéc̀d'
2485 res ..= c .. '-'
2486 endfor
2487 assert_equal('a-é-c̀-d-', res)
2488
2489 res = ''
2490 for c in ''
2491 res ..= c .. '-'
2492 endfor
2493 assert_equal('', res)
2494
2495 res = ''
2496 for c in test_null_string()
2497 res ..= c .. '-'
2498 endfor
2499 assert_equal('', res)
2500
Bram Moolenaar10611952022-04-03 21:11:34 +01002501 total = 0
2502 for c in null_list
2503 total += 1
2504 endfor
2505 assert_equal(0, total)
2506
2507 for c in null_blob
2508 total += 1
2509 endfor
2510 assert_equal(0, total)
2511
Bram Moolenaarf2253962021-04-13 20:53:13 +02002512 var foo: list<dict<any>> = [
2513 {a: 'Cat'}
2514 ]
2515 for dd in foo
2516 dd.counter = 12
2517 endfor
2518 assert_equal([{a: 'Cat', counter: 12}], foo)
Bram Moolenaarad2d4962021-07-18 17:08:50 +02002519
2520 reslist = []
2521 for _ in range(3)
2522 reslist->add('x')
2523 endfor
2524 assert_equal(['x', 'x', 'x'], reslist)
Yegappan Lakshmanan4776e642024-05-19 09:06:50 +02002525
2526 # Test for trying to use the loop variable "_" inside the loop
2527 for _ in "a"
2528 assert_fails('echo _', 'E1181: Cannot use an underscore here')
2529 endfor
Bram Moolenaarf2253962021-04-13 20:53:13 +02002530 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002531 v9.CheckDefAndScriptSuccess(lines)
Yegappan Lakshmananfe424d12024-05-17 18:20:43 +02002532
2533 lines =<< trim END
2534 for i : number : [1, 2]
2535 echo i
2536 endfor
2537 END
2538 v9.CheckSourceDefAndScriptFailure(lines, 'E1059: No white space allowed before colon: : [1, 2]', 1)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002539enddef
2540
Bram Moolenaar159b2d52022-10-11 21:41:25 +01002541def Test_for_loop_list_of_lists()
2542 # loop variable is final, not const
2543 var lines =<< trim END
2544 # Filter out all odd numbers in each sublist
2545 var list: list<list<number>> = [[1], [1, 2], [1, 2, 3], [1, 2, 3, 4]]
2546 for i in list
2547 filter(i, (_, n: number): bool => n % 2 == 0)
2548 endfor
2549
2550 assert_equal([[], [2], [2], [2, 4]], list)
2551 END
2552 v9.CheckDefAndScriptSuccess(lines)
2553enddef
2554
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002555def Test_for_loop_with_closure()
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002556 # using the loop variable in a closure results in the last used value
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002557 var lines =<< trim END
2558 var flist: list<func>
2559 for i in range(5)
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002560 flist[i] = () => i
2561 endfor
2562 for i in range(5)
2563 assert_equal(4, flist[i]())
2564 endfor
2565 END
2566 v9.CheckDefAndScriptSuccess(lines)
2567
Bram Moolenaardd674772022-09-15 22:26:18 +01002568 # also works when the loop variable is used only once halfway the loops
2569 lines =<< trim END
2570 var Clo: func
2571 for i in range(5)
2572 if i == 3
2573 Clo = () => i
2574 endif
2575 endfor
2576 assert_equal(4, Clo())
2577 END
2578 v9.CheckDefAndScriptSuccess(lines)
2579
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002580 # using a local variable set to the loop variable in a closure results in the
2581 # value at that moment
2582 lines =<< trim END
2583 var flist: list<func>
2584 for i in range(5)
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002585 var inloop = i
2586 flist[i] = () => inloop
2587 endfor
2588 for i in range(5)
Bram Moolenaar353b68a2022-09-13 21:10:45 +01002589 assert_equal(i, flist[i]())
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002590 endfor
2591 END
Bram Moolenaar0cdfb7c2022-09-17 15:44:52 +01002592 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002593
Bram Moolenaara275f2c2022-10-11 20:04:09 +01002594 # also with an extra block level
2595 lines =<< trim END
2596 var flist: list<func>
2597 for i in range(5)
2598 {
2599 var inloop = i
2600 flist[i] = () => inloop
2601 }
2602 endfor
2603 for i in range(5)
2604 assert_equal(i, flist[i]())
2605 endfor
2606 END
2607 v9.CheckDefAndScriptSuccess(lines)
2608
2609 # and declaration in higher block
2610 lines =<< trim END
2611 var flist: list<func>
2612 for i in range(5)
2613 var inloop = i
2614 {
2615 flist[i] = () => inloop
2616 }
2617 endfor
2618 for i in range(5)
2619 assert_equal(i, flist[i]())
2620 endfor
2621 END
2622 v9.CheckDefAndScriptSuccess(lines)
2623
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002624 lines =<< trim END
2625 var flist: list<func>
2626 for i in range(5)
2627 var inloop = i
2628 flist[i] = () => {
2629 return inloop
2630 }
2631 endfor
2632 for i in range(5)
Bram Moolenaar353b68a2022-09-13 21:10:45 +01002633 assert_equal(i, flist[i]())
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002634 endfor
2635 END
Bram Moolenaar0cdfb7c2022-09-17 15:44:52 +01002636 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaardbbb02b2022-09-18 12:00:21 +01002637
2638 # Also works for a nested loop
2639 lines =<< trim END
2640 var flist: list<func>
2641 var n = 0
2642 for i in range(3)
2643 var ii = i
2644 for a in ['a', 'b', 'c']
2645 var aa = a
2646 flist[n] = () => ii .. aa
2647 ++n
2648 endfor
2649 endfor
2650
2651 n = 0
2652 for i in range(3)
2653 for a in ['a', 'b', 'c']
2654 assert_equal(i .. a, flist[n]())
2655 ++n
2656 endfor
2657 endfor
2658 END
Bram Moolenaarcc341812022-09-19 15:54:34 +01002659 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaare8e369a2022-09-21 18:59:14 +01002660
2661 # using two loop variables
2662 lines =<< trim END
2663 var lv_list: list<func>
2664 var copy_list: list<func>
2665 for [idx, c] in items('word')
2666 var lidx = idx
2667 var lc = c
2668 lv_list[idx] = () => {
2669 return idx .. c
2670 }
2671 copy_list[idx] = () => {
2672 return lidx .. lc
2673 }
2674 endfor
2675 for [i, c] in items('word')
2676 assert_equal(3 .. 'd', lv_list[i]())
2677 assert_equal(i .. c, copy_list[i]())
2678 endfor
2679 END
2680 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarcc341812022-09-19 15:54:34 +01002681enddef
2682
2683def Test_define_global_closure_in_loops()
2684 var lines =<< trim END
2685 vim9script
2686
2687 def Func()
2688 for i in range(3)
2689 var ii = i
2690 for a in ['a', 'b', 'c']
2691 var aa = a
2692 if ii == 0 && aa == 'a'
2693 def g:Global_0a(): string
2694 return ii .. aa
2695 enddef
2696 endif
2697 if ii == 1 && aa == 'b'
2698 def g:Global_1b(): string
2699 return ii .. aa
2700 enddef
2701 endif
2702 if ii == 2 && aa == 'c'
2703 def g:Global_2c(): string
2704 return ii .. aa
2705 enddef
2706 endif
2707 endfor
2708 endfor
2709 enddef
2710 Func()
2711 END
2712 v9.CheckScriptSuccess(lines)
2713 assert_equal("0a", g:Global_0a())
2714 assert_equal("1b", g:Global_1b())
2715 assert_equal("2c", g:Global_2c())
2716
2717 delfunc g:Global_0a
2718 delfunc g:Global_1b
2719 delfunc g:Global_2c
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002720enddef
2721
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002722def Test_for_loop_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00002723 v9.CheckDefAndScriptFailure(['for '], ['E1097:', 'E690:'])
2724 v9.CheckDefAndScriptFailure(['for x'], ['E1097:', 'E690:'])
2725 v9.CheckDefAndScriptFailure(['for x in'], ['E1097:', 'E15:'])
2726 v9.CheckDefAndScriptFailure(['for # in range(5)'], 'E690:')
2727 v9.CheckDefAndScriptFailure(['for i In range(5)'], 'E690:')
2728 v9.CheckDefAndScriptFailure(['var x = 5', 'for x in range(5)', 'endfor'], ['E1017:', 'E1041:'])
2729 v9.CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3)
2730 v9.CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01002731 delfunc! g:Func
Bram Moolenaar62aec932022-01-29 21:45:34 +00002732 v9.CheckDefFailure(['for i in xxx'], 'E1001:')
2733 v9.CheckDefFailure(['endfor'], 'E588:')
2734 v9.CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002735
2736 # wrong type detected at compile time
Bram Moolenaar62aec932022-01-29 21:45:34 +00002737 v9.CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002738
2739 # wrong type detected at runtime
2740 g:adict = {a: 1}
Bram Moolenaar62aec932022-01-29 21:45:34 +00002741 v9.CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002742 unlet g:adict
Bram Moolenaarf6a8d422021-04-13 21:48:03 +02002743
2744 var lines =<< trim END
2745 var d: list<dict<any>> = [{a: 0}]
2746 for e in d
2747 e = {a: 0, b: ''}
2748 endfor
2749 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002750 v9.CheckDefAndScriptFailure(lines, ['E1018:', 'E46:'], 3)
Bram Moolenaarfe090eb2021-04-15 21:48:32 +02002751
2752 lines =<< trim END
2753 for nr: number in ['foo']
2754 endfor
2755 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002756 v9.CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
Bram Moolenaar404557e2021-07-05 21:41:48 +02002757
2758 lines =<< trim END
2759 for n : number in [1, 2]
2760 echo n
2761 endfor
2762 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002763 v9.CheckDefAndScriptFailure(lines, 'E1059:', 1)
Bram Moolenaarefc5db52021-07-07 21:21:30 +02002764
2765 lines =<< trim END
2766 var d: dict<number> = {a: 1, b: 2}
2767 for [k: job, v: job] in d->items()
2768 echo k v
2769 endfor
2770 END
Bram Moolenaarbd3a9d22022-05-17 16:12:39 +01002771 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 +00002772
2773 lines =<< trim END
2774 var i = 0
2775 for i in [1, 2, 3]
2776 echo i
2777 endfor
2778 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002779 v9.CheckDefExecAndScriptFailure(lines, ['E1017:', 'E1041:'])
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002780
2781 lines =<< trim END
2782 var l = [0]
2783 for l[0] in [1, 2, 3]
2784 echo l[0]
2785 endfor
2786 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002787 v9.CheckDefExecAndScriptFailure(lines, ['E461:', 'E1017:'])
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002788
2789 lines =<< trim END
2790 var d = {x: 0}
2791 for d.x in [1, 2, 3]
2792 echo d.x
2793 endfor
2794 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002795 v9.CheckDefExecAndScriptFailure(lines, ['E461:', 'E1017:'])
Bram Moolenaara1c51952022-02-02 16:20:26 +00002796
2797 lines =<< trim END
2798 var l: list<dict<any>> = [{a: 1, b: 'x'}]
2799 for item: dict<number> in l
2800 echo item
2801 endfor
2802 END
2803 v9.CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected dict<number> but got dict<any>')
2804
2805 lines =<< trim END
2806 var l: list<dict<any>> = [{n: 1}]
2807 for item: dict<number> in l
Bram Moolenaarfa103972022-09-29 19:14:42 +01002808 var d = {s: ''}
2809 d->extend(item)
Bram Moolenaara1c51952022-02-02 16:20:26 +00002810 endfor
2811 END
Bram Moolenaarfa103972022-09-29 19:14:42 +01002812 v9.CheckDefExecAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected dict<string> but got dict<number>')
Bram Moolenaarcc341812022-09-19 15:54:34 +01002813
2814 lines =<< trim END
2815 for a in range(3)
2816 while a > 3
2817 for b in range(2)
2818 while b < 0
2819 for c in range(5)
2820 while c > 6
2821 while c < 0
2822 for d in range(1)
2823 for e in range(3)
2824 while e > 3
2825 endwhile
2826 endfor
2827 endfor
2828 endwhile
2829 endwhile
2830 endfor
2831 endwhile
2832 endfor
2833 endwhile
2834 endfor
2835 END
2836 v9.CheckDefSuccess(lines)
2837
2838 v9.CheckDefFailure(['for x in range(3)'] + lines + ['endfor'], 'E1306:')
Yegappan Lakshmanan062bb6b2023-12-16 14:46:40 +01002839
2840 # Test for too many for loops
2841 lines =<< trim END
2842 vim9script
2843 def Foo()
2844 for a in range(1)
2845 for b in range(1)
2846 for c in range(1)
2847 for d in range(1)
2848 for e in range(1)
2849 for f in range(1)
2850 for g in range(1)
2851 for h in range(1)
2852 for i in range(1)
2853 for j in range(1)
2854 for k in range(1)
2855 endfor
2856 endfor
2857 endfor
2858 endfor
2859 endfor
2860 endfor
2861 endfor
2862 endfor
2863 endfor
2864 endfor
2865 endfor
2866 enddef
2867 defcompile
2868 END
2869 v9.CheckSourceFailure(lines, 'E1306: Loop nesting too deep', 11)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002870enddef
2871
Bram Moolenaarea870692020-12-02 14:24:30 +01002872def Test_for_loop_script_var()
2873 # cannot use s:var in a :def function
Bram Moolenaar62aec932022-01-29 21:45:34 +00002874 v9.CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1254:')
Bram Moolenaarea870692020-12-02 14:24:30 +01002875
2876 # can use s:var in Vim9 script, with or without s:
2877 var lines =<< trim END
2878 vim9script
2879 var total = 0
2880 for s:var in [1, 2, 3]
2881 total += s:var
2882 endfor
2883 assert_equal(6, total)
2884
2885 total = 0
2886 for var in [1, 2, 3]
2887 total += var
2888 endfor
2889 assert_equal(6, total)
2890 END
2891enddef
2892
Bram Moolenaar792f7862020-11-23 08:31:18 +01002893def Test_for_loop_unpack()
Bram Moolenaar792f7862020-11-23 08:31:18 +01002894 var lines =<< trim END
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002895 var result = []
2896 for [v1, v2] in [[1, 2], [3, 4]]
2897 result->add(v1)
2898 result->add(v2)
2899 endfor
2900 assert_equal([1, 2, 3, 4], result)
2901
2902 result = []
2903 for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2904 result->add(v1)
2905 result->add(v2)
2906 result->add(v3)
2907 endfor
2908 assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2909
2910 result = []
2911 for [&ts, &sw] in [[1, 2], [3, 4]]
2912 result->add(&ts)
2913 result->add(&sw)
2914 endfor
2915 assert_equal([1, 2, 3, 4], result)
2916
2917 var slist: list<string>
2918 for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
2919 slist->add($LOOPVAR)
2920 slist->add(@r)
2921 slist->add(v:errmsg)
2922 endfor
2923 assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
2924
2925 slist = []
2926 for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
2927 slist->add(g:globalvar)
2928 slist->add(b:bufvar)
2929 slist->add(w:winvar)
2930 slist->add(t:tabvar)
2931 endfor
2932 assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
Bram Moolenaarf6c177a2020-12-04 17:38:00 +01002933 unlet! g:globalvar b:bufvar w:winvar t:tabvar
Bram Moolenaarb777da92021-05-22 21:40:39 +02002934
2935 var res = []
2936 for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
2937 res->add(n)
2938 endfor
2939 assert_equal([2, 5], res)
Bram Moolenaar61efa162022-03-18 13:10:48 +00002940
2941 var text: list<string> = ["hello there", "goodbye now"]
2942 var splitted = ''
2943 for [first; next] in mapnew(text, (i, v) => split(v))
2944 splitted ..= string(first) .. string(next) .. '/'
2945 endfor
2946 assert_equal("'hello'['there']/'goodbye'['now']/", splitted)
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002947 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002948 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002949
2950 lines =<< trim END
Bram Moolenaar792f7862020-11-23 08:31:18 +01002951 for [v1, v2] in [[1, 2, 3], [3, 4]]
2952 echo v1 v2
2953 endfor
2954 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002955 v9.CheckDefExecFailure(lines, 'E710:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01002956
2957 lines =<< trim END
2958 for [v1, v2] in [[1], [3, 4]]
2959 echo v1 v2
2960 endfor
2961 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002962 v9.CheckDefExecFailure(lines, 'E711:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01002963
2964 lines =<< trim END
2965 for [v1, v1] in [[1, 2], [3, 4]]
2966 echo v1
2967 endfor
2968 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002969 v9.CheckDefExecFailure(lines, 'E1017:', 1)
Bram Moolenaar95e4dd82022-04-27 22:15:40 +01002970
2971 lines =<< trim END
2972 for [a, b] in g:listlist
2973 echo a
2974 endfor
2975 END
2976 g:listlist = [1, 2, 3]
2977 v9.CheckDefExecFailure(lines, 'E1140:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01002978enddef
2979
Bram Moolenaarc150c092021-02-13 15:02:46 +01002980def Test_for_loop_with_try_continue()
Bram Moolenaarf2253962021-04-13 20:53:13 +02002981 var lines =<< trim END
2982 var looped = 0
2983 var cleanup = 0
2984 for i in range(3)
2985 looped += 1
2986 try
2987 eval [][0]
2988 catch
2989 continue
2990 finally
2991 cleanup += 1
2992 endtry
2993 endfor
2994 assert_equal(3, looped)
2995 assert_equal(3, cleanup)
2996 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002997 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc150c092021-02-13 15:02:46 +01002998enddef
2999
rbtnnd895b1d2021-08-20 20:54:25 +02003000def Test_while_skipped_block()
3001 # test skipped blocks at outside of function
3002 var lines =<< trim END
3003 var result = []
3004 var n = 0
3005 if true
3006 n = 1
3007 while n < 3
3008 result += [n]
3009 n += 1
3010 endwhile
3011 else
3012 n = 3
3013 while n < 5
3014 result += [n]
3015 n += 1
3016 endwhile
3017 endif
3018 assert_equal([1, 2], result)
3019
3020 result = []
3021 if false
3022 n = 1
3023 while n < 3
3024 result += [n]
3025 n += 1
3026 endwhile
3027 else
3028 n = 3
3029 while n < 5
3030 result += [n]
3031 n += 1
3032 endwhile
3033 endif
3034 assert_equal([3, 4], result)
3035 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003036 v9.CheckDefAndScriptSuccess(lines)
rbtnnd895b1d2021-08-20 20:54:25 +02003037
3038 # test skipped blocks at inside of function
3039 lines =<< trim END
3040 def DefTrue()
3041 var result = []
3042 var n = 0
3043 if true
3044 n = 1
3045 while n < 3
3046 result += [n]
3047 n += 1
3048 endwhile
3049 else
3050 n = 3
3051 while n < 5
3052 result += [n]
3053 n += 1
3054 endwhile
3055 endif
3056 assert_equal([1, 2], result)
3057 enddef
3058 DefTrue()
3059
3060 def DefFalse()
3061 var result = []
3062 var n = 0
3063 if false
3064 n = 1
3065 while n < 3
3066 result += [n]
3067 n += 1
3068 endwhile
3069 else
3070 n = 3
3071 while n < 5
3072 result += [n]
3073 n += 1
3074 endwhile
3075 endif
3076 assert_equal([3, 4], result)
3077 enddef
3078 DefFalse()
3079 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003080 v9.CheckDefAndScriptSuccess(lines)
rbtnnd895b1d2021-08-20 20:54:25 +02003081enddef
3082
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003083def Test_while_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003084 var result = ''
3085 var cnt = 0
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003086 while cnt < 555
3087 if cnt == 3
3088 break
3089 endif
3090 cnt += 1
3091 if cnt == 2
3092 continue
3093 endif
3094 result ..= cnt .. '_'
3095 endwhile
3096 assert_equal('1_3_', result)
Bram Moolenaardee37dc2021-02-07 16:40:05 +01003097
3098 var s = ''
Bram Moolenaar4b3e1962021-03-18 21:37:55 +01003099 while s == 'x' # {comment}
Bram Moolenaardee37dc2021-02-07 16:40:05 +01003100 endwhile
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003101enddef
3102
Bram Moolenaar7a53f292021-11-22 18:31:02 +00003103def Test_while_loop_in_script()
3104 var lines =<< trim END
3105 vim9script
3106 var result = ''
3107 var cnt = 0
3108 while cnt < 3
3109 var s = 'v' .. cnt
3110 result ..= s
3111 cnt += 1
3112 endwhile
3113 assert_equal('v0v1v2', result)
3114 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003115 v9.CheckScriptSuccess(lines)
Bram Moolenaar7a53f292021-11-22 18:31:02 +00003116enddef
3117
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02003118def Test_while_loop_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00003119 v9.CheckDefFailure(['while xxx'], 'E1001:')
3120 v9.CheckDefFailure(['endwhile'], 'E588:')
3121 v9.CheckDefFailure(['continue'], 'E586:')
3122 v9.CheckDefFailure(['if true', 'continue'], 'E586:')
3123 v9.CheckDefFailure(['break'], 'E587:')
3124 v9.CheckDefFailure(['if true', 'break'], 'E587:')
3125 v9.CheckDefFailure(['while 1', 'echo 3'], 'E170:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01003126
3127 var lines =<< trim END
3128 var s = ''
3129 while s = ''
3130 endwhile
3131 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003132 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaarbd5da372020-03-31 23:13:10 +02003133enddef
3134
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01003135def Test_interrupt_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003136 var caught = false
3137 var x = 0
Bram Moolenaar97acfc72020-03-22 13:44:28 +01003138 try
3139 while 1
3140 x += 1
3141 if x == 100
3142 feedkeys("\<C-C>", 'Lt')
3143 endif
3144 endwhile
3145 catch
3146 caught = true
3147 assert_equal(100, x)
3148 endtry
3149 assert_true(caught, 'should have caught an exception')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02003150 # consume the CTRL-C
3151 getchar(0)
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01003152enddef
Bram Moolenaar20431c92020-03-20 18:39:46 +01003153
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003154def Test_automatic_line_continuation()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003155 var mylist = [
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003156 'one',
3157 'two',
3158 'three',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003159 ] # comment
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003160 assert_equal(['one', 'two', 'three'], mylist)
3161
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003162 var mydict = {
Bram Moolenaare0de1712020-12-02 17:36:54 +01003163 ['one']: 1,
3164 ['two']: 2,
3165 ['three']:
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003166 3,
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003167 } # comment
Bram Moolenaare0de1712020-12-02 17:36:54 +01003168 assert_equal({one: 1, two: 2, three: 3}, mydict)
3169 mydict = {
Bram Moolenaar2c330432020-04-13 14:41:35 +02003170 one: 1, # comment
3171 two: # comment
3172 2, # comment
3173 three: 3 # comment
3174 }
Bram Moolenaare0de1712020-12-02 17:36:54 +01003175 assert_equal({one: 1, two: 2, three: 3}, mydict)
3176 mydict = {
Bram Moolenaar2c330432020-04-13 14:41:35 +02003177 one: 1,
3178 two:
3179 2,
3180 three: 3
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003181 }
Bram Moolenaare0de1712020-12-02 17:36:54 +01003182 assert_equal({one: 1, two: 2, three: 3}, mydict)
Bram Moolenaare6085c52020-04-12 20:19:16 +02003183
3184 assert_equal(
3185 ['one', 'two', 'three'],
3186 split('one two three')
3187 )
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003188enddef
3189
Bram Moolenaar7a092242020-04-16 22:10:49 +02003190def Test_vim9_comment()
Bram Moolenaar62aec932022-01-29 21:45:34 +00003191 v9.CheckScriptSuccess([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003192 'vim9script',
3193 '# something',
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003194 '#something',
Bram Moolenaar3f74c0a2022-08-06 18:12:06 +01003195 '#{{something',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003196 ])
Bram Moolenaar3f74c0a2022-08-06 18:12:06 +01003197 v9.CheckScriptFailure([
3198 'vim9script',
3199 '#{something',
3200 ], 'E1170:')
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003201
Bram Moolenaarb18b4962022-09-02 21:55:50 +01003202 split Xv9cfile
Bram Moolenaar62aec932022-01-29 21:45:34 +00003203 v9.CheckScriptSuccess([
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003204 'vim9script',
3205 'edit #something',
3206 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003207 v9.CheckScriptSuccess([
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003208 'vim9script',
3209 'edit #{something',
3210 ])
3211 close
3212
Bram Moolenaar62aec932022-01-29 21:45:34 +00003213 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003214 'vim9script',
3215 ':# something',
3216 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003217 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003218 '# something',
3219 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003220 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003221 ':# something',
3222 ], 'E488:')
3223
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003224 { # block start
3225 } # block end
Bram Moolenaar62aec932022-01-29 21:45:34 +00003226 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003227 '{# comment',
3228 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003229 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003230 '{',
3231 '}# comment',
3232 ], 'E488:')
3233
3234 echo "yes" # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00003235 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003236 'echo "yes"# comment',
3237 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003238 v9.CheckScriptSuccess([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003239 'vim9script',
3240 'echo "yes" # something',
3241 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003242 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003243 'vim9script',
3244 'echo "yes"# something',
3245 ], 'E121:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003246 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003247 'vim9script',
3248 'echo# something',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003249 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003250 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003251 'echo "yes" # something',
3252 ], 'E121:')
3253
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003254 exe "echo" # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00003255 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003256 'exe "echo"# comment',
3257 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003258 v9.CheckScriptSuccess([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003259 'vim9script',
3260 'exe "echo" # something',
3261 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003262 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003263 'vim9script',
3264 'exe "echo"# something',
3265 ], 'E121:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003266 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003267 'vim9script',
3268 'exe# something',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003269 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003270 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003271 'exe "echo" # something',
3272 ], 'E121:')
3273
Bram Moolenaar62aec932022-01-29 21:45:34 +00003274 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003275 'try# comment',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003276 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003277 'catch',
3278 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003279 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003280 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003281 'vim9script',
3282 'try# comment',
3283 'echo "yes"',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003284 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003285 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003286 'try',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003287 ' throw#comment',
3288 'catch',
3289 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003290 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003291 v9.CheckDefFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003292 'try',
3293 ' throw "yes"#comment',
3294 'catch',
3295 'endtry',
3296 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003297 v9.CheckDefFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003298 'try',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003299 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003300 'catch# comment',
3301 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003302 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003303 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003304 'vim9script',
3305 'try',
3306 ' echo "yes"',
3307 'catch# comment',
3308 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003309 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003310 v9.CheckDefFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003311 'try',
3312 ' echo "yes"',
3313 'catch /pat/# comment',
3314 'endtry',
3315 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003316 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003317 'try',
3318 'echo "yes"',
3319 'catch',
3320 'endtry# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003321 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003322 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003323 'vim9script',
3324 'try',
3325 ' echo "yes"',
3326 'catch',
3327 'endtry# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003328 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003329
Bram Moolenaar62aec932022-01-29 21:45:34 +00003330 v9.CheckScriptSuccess([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003331 'vim9script',
3332 'hi # comment',
3333 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003334 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003335 'vim9script',
3336 'hi# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003337 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003338 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003339 'vim9script',
3340 'hi Search # comment',
3341 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003342 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003343 'vim9script',
3344 'hi Search# comment',
3345 ], 'E416:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003346 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003347 'vim9script',
3348 'hi link This Search # comment',
3349 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003350 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003351 'vim9script',
3352 'hi link This That# comment',
3353 ], 'E413:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003354 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003355 'vim9script',
3356 'hi clear This # comment',
3357 'hi clear # comment',
3358 ])
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003359 # not tested, because it doesn't give an error but a warning:
3360 # hi clear This# comment',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003361 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003362 'vim9script',
3363 'hi clear# comment',
3364 ], 'E416:')
3365
Bram Moolenaar62aec932022-01-29 21:45:34 +00003366 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003367 'vim9script',
3368 'hi Group term=bold',
3369 'match Group /todo/ # comment',
3370 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003371 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003372 'vim9script',
3373 'hi Group term=bold',
3374 'match Group /todo/# comment',
3375 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003376 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003377 'vim9script',
3378 'match # comment',
3379 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003380 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003381 'vim9script',
3382 'match# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003383 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003384 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003385 'vim9script',
3386 'match none # comment',
3387 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003388 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003389 'vim9script',
3390 'match none# comment',
3391 ], 'E475:')
3392
Bram Moolenaar62aec932022-01-29 21:45:34 +00003393 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003394 'vim9script',
3395 'menutrans clear # comment',
3396 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003397 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003398 'vim9script',
3399 'menutrans clear# comment text',
3400 ], 'E474:')
3401
Bram Moolenaar62aec932022-01-29 21:45:34 +00003402 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003403 'vim9script',
3404 'syntax clear # comment',
3405 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003406 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003407 'vim9script',
3408 'syntax clear# comment text',
3409 ], 'E28:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003410 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003411 'vim9script',
3412 'syntax keyword Word some',
3413 'syntax clear Word # comment',
3414 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003415 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003416 'vim9script',
3417 'syntax keyword Word some',
3418 'syntax clear Word# comment text',
3419 ], 'E28:')
3420
Bram Moolenaar62aec932022-01-29 21:45:34 +00003421 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003422 'vim9script',
3423 'syntax list # comment',
3424 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003425 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003426 'vim9script',
3427 'syntax list# comment text',
3428 ], 'E28:')
3429
Bram Moolenaar62aec932022-01-29 21:45:34 +00003430 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003431 'vim9script',
3432 'syntax match Word /pat/ oneline # comment',
3433 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003434 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003435 'vim9script',
3436 'syntax match Word /pat/ oneline# comment',
3437 ], 'E475:')
3438
Bram Moolenaar62aec932022-01-29 21:45:34 +00003439 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003440 'vim9script',
3441 'syntax keyword Word word # comm[ent',
3442 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003443 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003444 'vim9script',
3445 'syntax keyword Word word# comm[ent',
3446 ], 'E789:')
3447
Bram Moolenaar62aec932022-01-29 21:45:34 +00003448 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003449 'vim9script',
3450 'syntax match Word /pat/ # comment',
3451 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003452 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003453 'vim9script',
3454 'syntax match Word /pat/# comment',
3455 ], 'E402:')
3456
Bram Moolenaar62aec932022-01-29 21:45:34 +00003457 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003458 'vim9script',
3459 'syntax match Word /pat/ contains=Something # comment',
3460 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003461 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003462 'vim9script',
3463 'syntax match Word /pat/ contains=Something# comment',
3464 ], 'E475:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003465 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003466 'vim9script',
3467 'syntax match Word /pat/ contains= # comment',
3468 ], 'E406:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003469 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003470 'vim9script',
3471 'syntax match Word /pat/ contains=# comment',
3472 ], 'E475:')
3473
Bram Moolenaar62aec932022-01-29 21:45:34 +00003474 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003475 'vim9script',
3476 'syntax region Word start=/pat/ end=/pat/ # comment',
3477 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003478 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003479 'vim9script',
3480 'syntax region Word start=/pat/ end=/pat/# comment',
Bram Moolenaard032f342020-07-18 18:13:02 +02003481 ], 'E402:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02003482
Bram Moolenaar62aec932022-01-29 21:45:34 +00003483 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003484 'vim9script',
3485 'syntax sync # comment',
3486 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003487 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003488 'vim9script',
3489 'syntax sync# comment',
3490 ], 'E404:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003491 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003492 'vim9script',
3493 'syntax sync ccomment # comment',
3494 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003495 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003496 'vim9script',
3497 'syntax sync ccomment# comment',
3498 ], 'E404:')
3499
Bram Moolenaar62aec932022-01-29 21:45:34 +00003500 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003501 'vim9script',
3502 'syntax cluster Some contains=Word # comment',
3503 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003504 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003505 'vim9script',
3506 'syntax cluster Some contains=Word# comment',
3507 ], 'E475:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003508
Bram Moolenaar62aec932022-01-29 21:45:34 +00003509 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003510 'vim9script',
3511 'command Echo echo # comment',
3512 'command Echo # comment',
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003513 'delcommand Echo',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003514 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003515 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003516 'vim9script',
3517 'command Echo echo# comment',
3518 'Echo',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003519 ], 'E1144:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003520 delcommand Echo
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003521
3522 var curdir = getcwd()
Bram Moolenaar62aec932022-01-29 21:45:34 +00003523 v9.CheckScriptSuccess([
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003524 'command Echo cd " comment',
3525 'Echo',
3526 'delcommand Echo',
3527 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003528 v9.CheckScriptSuccess([
Bram Moolenaar090728a2020-12-20 15:43:31 +01003529 'vim9script',
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003530 'command Echo cd # comment',
3531 'Echo',
3532 'delcommand Echo',
3533 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003534 v9.CheckScriptFailure([
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003535 'vim9script',
3536 'command Echo cd " comment',
3537 'Echo',
3538 ], 'E344:')
3539 delcommand Echo
3540 chdir(curdir)
3541
Bram Moolenaar62aec932022-01-29 21:45:34 +00003542 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003543 'vim9script',
3544 'command Echo# comment',
3545 ], 'E182:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003546 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003547 'vim9script',
3548 'command Echo echo',
3549 'command Echo# comment',
3550 ], 'E182:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003551 delcommand Echo
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003552
Bram Moolenaar62aec932022-01-29 21:45:34 +00003553 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003554 'vim9script',
3555 'function # comment',
3556 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003557 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003558 'vim9script',
Bram Moolenaar98981072020-07-29 14:40:25 +02003559 'function " comment',
3560 ], 'E129:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003561 v9.CheckScriptFailure([
Bram Moolenaar98981072020-07-29 14:40:25 +02003562 'vim9script',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003563 'function# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003564 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003565 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003566 'vim9script',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003567 'import "./vim9.vim" as v9',
3568 'function v9.CheckScriptSuccess # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003569 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003570 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003571 'vim9script',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003572 'import "./vim9.vim" as v9',
3573 'function v9.CheckScriptSuccess# comment',
3574 ], 'E1048: Item not found in script: CheckScriptSuccess#')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003575
Bram Moolenaar62aec932022-01-29 21:45:34 +00003576 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003577 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003578 'func g:DeleteMeA()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003579 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003580 'delfunction g:DeleteMeA # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003581 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003582 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003583 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003584 'func g:DeleteMeB()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003585 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003586 'delfunction g:DeleteMeB# comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003587 ], 'E488:')
3588
Bram Moolenaar62aec932022-01-29 21:45:34 +00003589 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003590 'vim9script',
3591 'call execute("ls") # comment',
3592 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003593 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003594 'vim9script',
3595 'call execute("ls")# comment',
3596 ], 'E488:')
Bram Moolenaare7e48382020-07-22 18:17:08 +02003597
Bram Moolenaar62aec932022-01-29 21:45:34 +00003598 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003599 'def Test() " comment',
3600 'enddef',
3601 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003602 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003603 'vim9script',
3604 'def Test() " comment',
3605 'enddef',
3606 ], 'E488:')
3607
Bram Moolenaar62aec932022-01-29 21:45:34 +00003608 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003609 'func Test() " comment',
3610 'endfunc',
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003611 'delfunc Test',
Bram Moolenaare7e48382020-07-22 18:17:08 +02003612 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003613 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003614 'vim9script',
3615 'func Test() " comment',
3616 'endfunc',
Bram Moolenaar98981072020-07-29 14:40:25 +02003617 ])
Bram Moolenaare7e48382020-07-22 18:17:08 +02003618
Bram Moolenaar62aec932022-01-29 21:45:34 +00003619 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003620 'def Test() # comment',
3621 'enddef',
3622 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003623 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003624 'func Test() # comment',
3625 'endfunc',
3626 ], 'E488:')
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003627
3628 var lines =<< trim END
3629 vim9script
3630 syn region Text
3631 \ start='foo'
3632 #\ comment
3633 \ end='bar'
Bram Moolenaar5072b472021-06-03 21:56:10 +02003634 syn region Text start='foo'
3635 #\ comment
3636 \ end='bar'
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003637 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003638 v9.CheckScriptSuccess(lines)
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003639
3640 lines =<< trim END
3641 vim9script
3642 syn region Text
3643 \ start='foo'
3644 "\ comment
3645 \ end='bar'
3646 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003647 v9.CheckScriptFailure(lines, 'E399:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003648enddef
3649
3650def Test_vim9_comment_gui()
3651 CheckCanRunGui
3652
Bram Moolenaar62aec932022-01-29 21:45:34 +00003653 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003654 'vim9script',
3655 'gui#comment'
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003656 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003657 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003658 'vim9script',
3659 'gui -f#comment'
Bram Moolenaarb8bd2e62021-08-21 17:13:14 +02003660 ], 'E194:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02003661enddef
3662
Bram Moolenaara26b9702020-04-18 19:53:28 +02003663def Test_vim9_comment_not_compiled()
Bram Moolenaar67979662020-06-20 22:50:47 +02003664 au TabEnter *.vim g:entered = 1
3665 au TabEnter *.x g:entered = 2
Bram Moolenaara26b9702020-04-18 19:53:28 +02003666
3667 edit test.vim
3668 doautocmd TabEnter #comment
3669 assert_equal(1, g:entered)
3670
3671 doautocmd TabEnter f.x
3672 assert_equal(2, g:entered)
3673
3674 g:entered = 0
3675 doautocmd TabEnter f.x #comment
3676 assert_equal(2, g:entered)
3677
3678 assert_fails('doautocmd Syntax#comment', 'E216:')
3679
3680 au! TabEnter
3681 unlet g:entered
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003682
Bram Moolenaar62aec932022-01-29 21:45:34 +00003683 v9.CheckScriptSuccess([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003684 'vim9script',
Bram Moolenaar67979662020-06-20 22:50:47 +02003685 'g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003686 'b:var = 456',
3687 'w:var = 777',
3688 't:var = 888',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003689 'unlet g:var w:var # something',
3690 ])
3691
Bram Moolenaar62aec932022-01-29 21:45:34 +00003692 v9.CheckScriptFailure([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003693 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003694 'let var = 123',
3695 ], 'E1126: Cannot use :let in Vim9 script')
3696
Bram Moolenaar62aec932022-01-29 21:45:34 +00003697 v9.CheckScriptFailure([
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003698 'vim9script',
3699 'var g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003700 ], 'E1016: Cannot declare a global variable:')
3701
Bram Moolenaar62aec932022-01-29 21:45:34 +00003702 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003703 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003704 'var b:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003705 ], 'E1016: Cannot declare a buffer variable:')
3706
Bram Moolenaar62aec932022-01-29 21:45:34 +00003707 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003708 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003709 'var w:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003710 ], 'E1016: Cannot declare a window variable:')
3711
Bram Moolenaar62aec932022-01-29 21:45:34 +00003712 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003713 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003714 'var t:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003715 ], 'E1016: Cannot declare a tab variable:')
3716
Bram Moolenaar62aec932022-01-29 21:45:34 +00003717 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003718 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003719 'var v:version = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003720 ], 'E1016: Cannot declare a v: variable:')
3721
Bram Moolenaar62aec932022-01-29 21:45:34 +00003722 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003723 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003724 'var $VARIABLE = "text"',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003725 ], 'E1016: Cannot declare an environment variable:')
Bram Moolenaar67979662020-06-20 22:50:47 +02003726
Bram Moolenaar62aec932022-01-29 21:45:34 +00003727 v9.CheckScriptFailure([
Bram Moolenaar67979662020-06-20 22:50:47 +02003728 'vim9script',
3729 'g:var = 123',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003730 'unlet g:var# comment1',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003731 ], 'E108:')
3732
Bram Moolenaar62aec932022-01-29 21:45:34 +00003733 v9.CheckScriptFailure([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003734 'let g:var = 123',
3735 'unlet g:var # something',
3736 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003737
Bram Moolenaar62aec932022-01-29 21:45:34 +00003738 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003739 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003740 'if 1 # comment2',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003741 ' echo "yes"',
3742 'elseif 2 #comment',
3743 ' echo "no"',
3744 'endif',
3745 ])
3746
Bram Moolenaar62aec932022-01-29 21:45:34 +00003747 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003748 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003749 'if 1# comment3',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003750 ' echo "yes"',
3751 'endif',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003752 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003753
Bram Moolenaar62aec932022-01-29 21:45:34 +00003754 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003755 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003756 'if 0 # comment4',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003757 ' echo "yes"',
3758 'elseif 2#comment',
3759 ' echo "no"',
3760 'endif',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003761 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003762
Bram Moolenaar62aec932022-01-29 21:45:34 +00003763 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003764 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003765 'var v = 1 # comment5',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003766 ])
3767
Bram Moolenaar62aec932022-01-29 21:45:34 +00003768 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003769 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003770 'var v = 1# comment6',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003771 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003772
Bram Moolenaar62aec932022-01-29 21:45:34 +00003773 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003774 'vim9script',
Bram Moolenaar2984ed32022-08-20 14:51:17 +01003775 'new',
Bram Moolenaard2c61702020-09-06 15:58:36 +02003776 'setline(1, ["# define pat", "last"])',
Bram Moolenaardf069ee2020-06-22 23:02:51 +02003777 ':$',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003778 'dsearch /pat/ #comment',
3779 'bwipe!',
3780 ])
3781
Bram Moolenaar62aec932022-01-29 21:45:34 +00003782 v9.CheckScriptFailure([
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003783 'vim9script',
Bram Moolenaar2984ed32022-08-20 14:51:17 +01003784 'new',
Bram Moolenaard2c61702020-09-06 15:58:36 +02003785 'setline(1, ["# define pat", "last"])',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003786 ':$',
3787 'dsearch /pat/#comment',
3788 'bwipe!',
3789 ], 'E488:')
3790
Bram Moolenaar62aec932022-01-29 21:45:34 +00003791 v9.CheckScriptFailure([
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003792 'vim9script',
3793 'func! SomeFunc()',
3794 ], 'E477:')
Bram Moolenaara26b9702020-04-18 19:53:28 +02003795enddef
3796
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003797def Test_finish()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003798 var lines =<< trim END
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003799 vim9script
Bram Moolenaar67979662020-06-20 22:50:47 +02003800 g:res = 'one'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003801 if v:false | finish | endif
Bram Moolenaar67979662020-06-20 22:50:47 +02003802 g:res = 'two'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003803 finish
Bram Moolenaar67979662020-06-20 22:50:47 +02003804 g:res = 'three'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003805 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003806 writefile(lines, 'Xfinished', 'D')
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003807 source Xfinished
3808 assert_equal('two', g:res)
3809
3810 unlet g:res
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003811enddef
3812
Bram Moolenaara5d00772020-05-14 23:20:55 +02003813def Test_forward_declaration()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003814 var lines =<< trim END
Bram Moolenaara5d00772020-05-14 23:20:55 +02003815 vim9script
Bram Moolenaara5d00772020-05-14 23:20:55 +02003816 def GetValue(): string
3817 return theVal
3818 enddef
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003819 var theVal = 'something'
Bram Moolenaar822ba242020-05-24 23:00:18 +02003820 g:initVal = GetValue()
Bram Moolenaara5d00772020-05-14 23:20:55 +02003821 theVal = 'else'
3822 g:laterVal = GetValue()
3823 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003824 writefile(lines, 'Xforward', 'D')
Bram Moolenaara5d00772020-05-14 23:20:55 +02003825 source Xforward
3826 assert_equal('something', g:initVal)
3827 assert_equal('else', g:laterVal)
3828
3829 unlet g:initVal
3830 unlet g:laterVal
Bram Moolenaara5d00772020-05-14 23:20:55 +02003831enddef
3832
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003833def Test_declare_script_var_in_func()
Bram Moolenaare535db82021-03-31 21:07:24 +02003834 var lines =<< trim END
3835 vim9script
3836 func Declare()
3837 let s:local = 123
3838 endfunc
3839 Declare()
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003840 END
3841 v9.CheckScriptFailure(lines, 'E1269:')
3842enddef
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00003843
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003844def Test_lock_script_var()
3845 var lines =<< trim END
3846 vim9script
3847 var local = 123
Bram Moolenaare535db82021-03-31 21:07:24 +02003848 assert_equal(123, local)
3849
3850 var error: string
3851 try
3852 local = 'asdf'
3853 catch
3854 error = v:exception
3855 endtry
3856 assert_match('E1012: Type mismatch; expected number but got string', error)
3857
3858 lockvar local
3859 try
3860 local = 999
3861 catch
3862 error = v:exception
3863 endtry
3864 assert_match('E741: Value is locked: local', error)
3865 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003866 v9.CheckScriptSuccess(lines)
Bram Moolenaare535db82021-03-31 21:07:24 +02003867enddef
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00003868
Bram Moolenaare535db82021-03-31 21:07:24 +02003869
Bram Moolenaar7d699702020-08-14 20:52:28 +02003870func Test_vim9script_not_global()
3871 " check that items defined in Vim9 script are script-local, not global
3872 let vim9lines =<< trim END
3873 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003874 var name = 'local'
Bram Moolenaar7d699702020-08-14 20:52:28 +02003875 func TheFunc()
3876 echo 'local'
3877 endfunc
3878 def DefFunc()
3879 echo 'local'
3880 enddef
3881 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003882 call writefile(vim9lines, 'Xvim9script.vim', 'D')
Bram Moolenaar7d699702020-08-14 20:52:28 +02003883 source Xvim9script.vim
3884 try
3885 echo g:var
3886 assert_report('did not fail')
3887 catch /E121:/
3888 " caught
3889 endtry
3890 try
3891 call TheFunc()
3892 assert_report('did not fail')
3893 catch /E117:/
3894 " caught
3895 endtry
3896 try
3897 call DefFunc()
3898 assert_report('did not fail')
3899 catch /E117:/
3900 " caught
3901 endtry
Bram Moolenaar7d699702020-08-14 20:52:28 +02003902endfunc
3903
Bram Moolenaareeb27bf2020-07-04 17:39:10 +02003904def Test_vim9_copen()
3905 # this was giving an error for setting w:quickfix_title
3906 copen
3907 quit
3908enddef
3909
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02003910def Test_script_var_in_autocmd()
3911 # using a script variable from an autocommand, defined in a :def function in a
3912 # legacy Vim script, cannot check the variable type.
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003913 var lines =<< trim END
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02003914 let s:counter = 1
3915 def s:Func()
3916 au! CursorHold
3917 au CursorHold * s:counter += 1
3918 enddef
3919 call s:Func()
3920 doau CursorHold
3921 call assert_equal(2, s:counter)
3922 au! CursorHold
3923 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003924 v9.CheckScriptSuccess(lines)
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02003925enddef
3926
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003927def Test_error_in_autoload_script()
3928 var save_rtp = &rtp
3929 var dir = getcwd() .. '/Xruntime'
3930 &rtp = dir
Bram Moolenaardd674772022-09-15 22:26:18 +01003931 mkdir(dir .. '/autoload', 'pR')
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003932
3933 var lines =<< trim END
3934 vim9script noclear
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003935 export def Autoloaded()
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003936 enddef
3937 def Broken()
3938 var x: any = ''
3939 eval x != 0
3940 enddef
3941 Broken()
3942 END
3943 writefile(lines, dir .. '/autoload/script.vim')
3944
3945 lines =<< trim END
3946 vim9script
3947 def CallAutoloaded()
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003948 script#Autoloaded()
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003949 enddef
3950
3951 function Legacy()
3952 try
3953 call s:CallAutoloaded()
3954 catch
3955 call assert_match('E1030: Using a String as a Number', v:exception)
3956 endtry
3957 endfunction
3958
3959 Legacy()
3960 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003961 v9.CheckScriptSuccess(lines)
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003962
3963 &rtp = save_rtp
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003964enddef
3965
Bram Moolenaar6809ff92022-07-26 15:10:56 +01003966def Test_error_in_autoload_script_foldexpr()
3967 var save_rtp = &rtp
Bram Moolenaardd674772022-09-15 22:26:18 +01003968 mkdir('Xvim/autoload', 'pR')
Bram Moolenaar6809ff92022-07-26 15:10:56 +01003969 &runtimepath = 'Xvim'
3970
3971 var lines =<< trim END
3972 vim9script
3973 eval [][0]
3974 echomsg 'no error'
3975 END
3976 lines->writefile('Xvim/autoload/script.vim')
3977
3978 lines =<< trim END
3979 vim9script
3980 import autoload 'script.vim'
3981 &foldmethod = 'expr'
3982 &foldexpr = 'script.Func()'
3983 redraw
3984 END
3985 v9.CheckScriptFailure(lines, 'E684: List index out of range: 0')
Bram Moolenaar6809ff92022-07-26 15:10:56 +01003986enddef
3987
Bram Moolenaare3d46852020-08-29 13:39:17 +02003988def Test_invalid_sid()
3989 assert_fails('func <SNR>1234_func', 'E123:')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02003990
Bram Moolenaar62aec932022-01-29 21:45:34 +00003991 if g:RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
Bram Moolenaard2c61702020-09-06 15:58:36 +02003992 assert_equal([], readfile('Xdidit'))
Bram Moolenaare3d46852020-08-29 13:39:17 +02003993 endif
3994 delete('Xdidit')
3995enddef
3996
Bram Moolenaar9ec70262020-12-09 17:16:59 +01003997def Test_restoring_cpo()
Bram Moolenaardd674772022-09-15 22:26:18 +01003998 writefile(['vim9script', 'set nocp'], 'Xsourced', 'D')
3999 writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00004000 if g:RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004001 assert_equal(['done'], readfile('Xdone'))
4002 endif
Bram Moolenaar090728a2020-12-20 15:43:31 +01004003 delete('Xdone')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004004
Bram Moolenaardd674772022-09-15 22:26:18 +01004005 writefile(['vim9script', 'g:cpoval = &cpo'], 'XanotherScript', 'D')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004006 set cpo=aABceFsMny>
4007 edit XanotherScript
4008 so %
4009 assert_equal('aABceFsMny>', &cpo)
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004010 assert_equal('aABceFs', g:cpoval)
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004011 :1del
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004012 setline(1, 'let g:cpoval = &cpo')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004013 w
4014 so %
4015 assert_equal('aABceFsMny>', &cpo)
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004016 assert_equal('aABceFsMny>', g:cpoval)
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004017
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004018 set cpo&vim
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004019 unlet g:cpoval
4020
4021 if has('unix')
4022 # 'cpo' is not restored in main vimrc
4023 var save_HOME = $HOME
4024 $HOME = getcwd() .. '/Xhome'
Bram Moolenaardd674772022-09-15 22:26:18 +01004025 mkdir('Xhome', 'R')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004026 var lines =<< trim END
4027 vim9script
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004028 writefile(['before: ' .. &cpo], 'Xrporesult')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004029 set cpo+=M
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004030 writefile(['after: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004031 END
4032 writefile(lines, 'Xhome/.vimrc')
4033
4034 lines =<< trim END
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004035 call writefile(['later: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004036 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004037 writefile(lines, 'Xlegacy', 'D')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004038
4039 lines =<< trim END
4040 vim9script
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004041 call writefile(['vim9: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004042 qa
4043 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004044 writefile(lines, 'Xvim9', 'D')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004045
Bram Moolenaar62aec932022-01-29 21:45:34 +00004046 var cmd = g:GetVimCommand() .. " -S Xlegacy -S Xvim9"
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004047 cmd = substitute(cmd, '-u NONE', '', '')
4048 exe "silent !" .. cmd
4049
4050 assert_equal([
4051 'before: aABceFs',
4052 'after: aABceFsM',
4053 'later: aABceFsM',
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004054 'vim9: aABceFs'], readfile('Xrporesult'))
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004055
4056 $HOME = save_HOME
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004057 delete('Xrporesult')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004058 endif
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004059enddef
4060
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004061" Use :function so we can use Check commands
4062func Test_no_redraw_when_restoring_cpo()
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004063 CheckScreendump
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004064 CheckFeature timers
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004065 call Run_test_no_redraw_when_restoring_cpo()
4066endfunc
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004067
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004068def Run_test_no_redraw_when_restoring_cpo()
4069 var lines =<< trim END
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004070 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00004071 export def Func()
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004072 enddef
4073 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004074 mkdir('Xnordir/autoload', 'pR')
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01004075 writefile(lines, 'Xnordir/autoload/script.vim')
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004076
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004077 lines =<< trim END
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004078 vim9script
4079 set cpo+=M
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01004080 exe 'set rtp^=' .. getcwd() .. '/Xnordir'
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00004081 au CmdlineEnter : ++once timer_start(0, (_) => script#Func())
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004082 setline(1, 'some text')
4083 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004084 writefile(lines, 'XTest_redraw_cpo', 'D')
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004085 var buf = g:RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
4086 term_sendkeys(buf, "V:")
4087 g:VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004088
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004089 # clean up
4090 term_sendkeys(buf, "\<Esc>u")
4091 g:StopVimInTerminal(buf)
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004092enddef
4093
4094func Test_reject_declaration()
4095 CheckScreendump
4096 call Run_test_reject_declaration()
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004097endfunc
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004098
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004099def Run_test_reject_declaration()
4100 var buf = g:RunVimInTerminal('', {'rows': 6})
4101 term_sendkeys(buf, ":vim9cmd var x: number\<CR>")
Bram Moolenaar330a3882022-03-05 11:05:57 +00004102 g:VerifyScreenDump(buf, 'Test_vim9_reject_declaration_1', {})
4103 term_sendkeys(buf, ":\<CR>")
4104 term_sendkeys(buf, ":vim9cmd g:foo = 123 | echo g:foo\<CR>")
4105 g:VerifyScreenDump(buf, 'Test_vim9_reject_declaration_2', {})
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004106
4107 # clean up
4108 g:StopVimInTerminal(buf)
4109enddef
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004110
Bram Moolenaar204852a2022-03-05 12:56:44 +00004111def Test_minimal_command_name_length()
4112 var names = [
4113 'cons',
4114 'brea',
4115 'cat',
4116 'catc',
4117 'con',
Bram Moolenaarb2175222022-03-05 20:24:41 +00004118 'cont',
4119 'conti',
4120 'contin',
4121 'continu',
Bram Moolenaar204852a2022-03-05 12:56:44 +00004122 'el',
4123 'els',
4124 'elsei',
4125 'endfo',
4126 'en',
4127 'end',
4128 'endi',
4129 'endw',
4130 'endt',
4131 'endtr',
Bram Moolenaarb2175222022-03-05 20:24:41 +00004132 'exp',
4133 'expo',
4134 'expor',
Bram Moolenaar204852a2022-03-05 12:56:44 +00004135 'fina',
4136 'finall',
Bram Moolenaard523c7b2022-03-06 14:51:22 +00004137 'fini',
4138 'finis',
Bram Moolenaarb2175222022-03-05 20:24:41 +00004139 'imp',
4140 'impo',
4141 'impor',
4142 'retu',
4143 'retur',
Bram Moolenaar204852a2022-03-05 12:56:44 +00004144 'th',
4145 'thr',
4146 'thro',
4147 'wh',
4148 'whi',
4149 'whil',
4150 ]
4151 for name in names
4152 v9.CheckDefAndScriptFailure([name .. ' '], 'E1065:')
4153 endfor
Bram Moolenaarb2175222022-03-05 20:24:41 +00004154
4155 var lines =<< trim END
4156 vim9script
4157 def SomeFunc()
4158 endd
4159 END
4160 v9.CheckScriptFailure(lines, 'E1065:')
4161 lines =<< trim END
4162 vim9script
4163 def SomeFunc()
4164 endde
4165 END
4166 v9.CheckScriptFailure(lines, 'E1065:')
Bram Moolenaar204852a2022-03-05 12:56:44 +00004167enddef
4168
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004169def Test_unset_any_variable()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004170 var lines =<< trim END
4171 var name: any
4172 assert_equal(0, name)
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004173 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004174 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004175enddef
4176
Bram Moolenaar7e9210e2020-09-25 23:12:51 +02004177func Test_define_func_at_command_line()
Bram Moolenaar58dbef32020-09-25 22:13:05 +02004178 CheckRunVimInTerminal
4179
Bram Moolenaar7e9210e2020-09-25 23:12:51 +02004180 " call indirectly to avoid compilation error for missing functions
4181 call Run_Test_define_func_at_command_line()
4182endfunc
4183
4184def Run_Test_define_func_at_command_line()
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004185 # run in a separate Vim instance to avoid the script context
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004186 var lines =<< trim END
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004187 func CheckAndQuit()
4188 call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
4189 call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
4190 endfunc
4191 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004192 writefile([''], 'Xdidcmd', 'D')
4193 writefile(lines, 'XcallFunc', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00004194 var buf = g:RunVimInTerminal('-S XcallFunc', {rows: 6})
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004195 # define Afunc() on the command line
4196 term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
4197 term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004198 g:WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004199
Bram Moolenaar62aec932022-01-29 21:45:34 +00004200 call g:StopVimInTerminal(buf)
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004201enddef
4202
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004203def Test_script_var_scope()
4204 var lines =<< trim END
4205 vim9script
4206 if true
4207 if true
4208 var one = 'one'
4209 echo one
4210 endif
4211 echo one
4212 endif
4213 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004214 v9.CheckScriptFailure(lines, 'E121:', 7)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004215
4216 lines =<< trim END
4217 vim9script
4218 if true
4219 if false
4220 var one = 'one'
4221 echo one
4222 else
4223 var one = 'one'
4224 echo one
4225 endif
4226 echo one
4227 endif
4228 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004229 v9.CheckScriptFailure(lines, 'E121:', 10)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004230
4231 lines =<< trim END
4232 vim9script
4233 while true
4234 var one = 'one'
4235 echo one
4236 break
4237 endwhile
4238 echo one
4239 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004240 v9.CheckScriptFailure(lines, 'E121:', 7)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004241
4242 lines =<< trim END
4243 vim9script
4244 for i in range(1)
4245 var one = 'one'
4246 echo one
4247 endfor
4248 echo one
4249 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004250 v9.CheckScriptFailure(lines, 'E121:', 6)
Bram Moolenaar9becdf22020-10-10 21:33:48 +02004251
4252 lines =<< trim END
4253 vim9script
4254 {
4255 var one = 'one'
4256 assert_equal('one', one)
4257 }
4258 assert_false(exists('one'))
4259 assert_false(exists('s:one'))
4260 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004261 v9.CheckScriptSuccess(lines)
Bram Moolenaar9becdf22020-10-10 21:33:48 +02004262
4263 lines =<< trim END
4264 vim9script
4265 {
4266 var one = 'one'
4267 echo one
4268 }
4269 echo one
4270 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004271 v9.CheckScriptFailure(lines, 'E121:', 6)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004272enddef
4273
Bram Moolenaar352134b2020-10-17 22:04:08 +02004274def Test_catch_exception_in_callback()
4275 var lines =<< trim END
4276 vim9script
Bram Moolenaar2a389082021-04-09 20:24:31 +02004277 def Callback(...l: list<any>)
Bram Moolenaar352134b2020-10-17 22:04:08 +02004278 try
4279 var x: string
4280 var y: string
4281 # this error should be caught with CHECKLEN
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +00004282 var sl = ['']
4283 [x, y] = sl
Bram Moolenaar352134b2020-10-17 22:04:08 +02004284 catch
4285 g:caught = 'yes'
4286 endtry
4287 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01004288 popup_menu('popup', {callback: Callback})
Bram Moolenaar352134b2020-10-17 22:04:08 +02004289 feedkeys("\r", 'xt')
4290 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004291 v9.CheckScriptSuccess(lines)
Bram Moolenaar352134b2020-10-17 22:04:08 +02004292
4293 unlet g:caught
4294enddef
4295
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004296def Test_no_unknown_error_after_error()
4297 if !has('unix') || !has('job')
4298 throw 'Skipped: not unix of missing +job feature'
4299 endif
Bram Moolenaarb16ff292021-09-26 20:14:39 +01004300 # FIXME: this check should not be needed
4301 if has('win32')
4302 throw 'Skipped: does not work on MS-Windows'
4303 endif
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004304 var lines =<< trim END
4305 vim9script
4306 var source: list<number>
Bram Moolenaar2a389082021-04-09 20:24:31 +02004307 def Out_cb(...l: list<any>)
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004308 eval [][0]
4309 enddef
Bram Moolenaar2a389082021-04-09 20:24:31 +02004310 def Exit_cb(...l: list<any>)
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004311 sleep 1m
Bram Moolenaar23d44492022-05-04 16:24:57 +01004312 g:did_call_exit_cb = true
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004313 source += l
4314 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01004315 var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
Bram Moolenaar6f17a3f2020-12-21 18:11:24 +01004316 while job_status(myjob) == 'run'
4317 sleep 10m
4318 endwhile
Bram Moolenaar206c2a62021-01-31 14:04:44 +01004319 # wait for Exit_cb() to be called
Bram Moolenaar23d44492022-05-04 16:24:57 +01004320 for x in range(100)
4321 if exists('g:did_call_exit_cb')
4322 unlet g:did_call_exit_cb
4323 break
4324 endif
4325 sleep 10m
4326 endfor
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004327 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004328 writefile(lines, 'Xdef', 'D')
Yee Cheng Chin69a8bb82022-11-06 12:25:47 +00004329 # Either the exit or out callback is called first, accept them in any order
4330 assert_fails('so Xdef', ['E684:\|E1012:', 'E1012:\|E684:'])
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004331enddef
4332
Bram Moolenaar4324d872020-12-01 20:12:24 +01004333def InvokeNormal()
4334 exe "norm! :m+1\r"
4335enddef
4336
4337def Test_invoke_normal_in_visual_mode()
4338 xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
4339 new
4340 setline(1, ['aaa', 'bbb'])
4341 feedkeys("V\<F3>", 'xt')
4342 assert_equal(['bbb', 'aaa'], getline(1, 2))
4343 xunmap <F3>
4344enddef
4345
Bram Moolenaarb5b94802020-12-13 17:50:20 +01004346def Test_white_space_after_command()
4347 var lines =<< trim END
4348 exit_cb: Func})
4349 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004350 v9.CheckDefAndScriptFailure(lines, 'E1144:', 1)
Bram Moolenaarf8103f22020-12-25 17:36:27 +01004351
4352 lines =<< trim END
4353 e#
4354 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004355 v9.CheckDefAndScriptFailure(lines, 'E1144:', 1)
Bram Moolenaarb5b94802020-12-13 17:50:20 +01004356enddef
4357
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004358def Test_script_var_gone_when_sourced_twice()
4359 var lines =<< trim END
4360 vim9script
4361 if exists('g:guard')
4362 finish
4363 endif
4364 g:guard = 1
4365 var name = 'thename'
4366 def g:GetName(): string
4367 return name
4368 enddef
4369 def g:SetName(arg: string)
4370 name = arg
4371 enddef
4372 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004373 writefile(lines, 'XscriptTwice.vim', 'D')
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004374 so XscriptTwice.vim
4375 assert_equal('thename', g:GetName())
4376 g:SetName('newname')
4377 assert_equal('newname', g:GetName())
4378 so XscriptTwice.vim
4379 assert_fails('call g:GetName()', 'E1149:')
4380 assert_fails('call g:SetName("x")', 'E1149:')
4381
4382 delfunc g:GetName
4383 delfunc g:SetName
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004384 unlet g:guard
4385enddef
4386
Bram Moolenaar10b94212021-02-19 21:42:57 +01004387def Test_unsupported_commands()
4388 var lines =<< trim END
4389 ka
4390 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004391 v9.CheckDefAndScriptFailure(lines, ['E476:', 'E492:'])
Bram Moolenaar10b94212021-02-19 21:42:57 +01004392
4393 lines =<< trim END
Bram Moolenaarada1d872021-02-20 08:16:51 +01004394 :1ka
4395 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004396 v9.CheckDefAndScriptFailure(lines, ['E476:', 'E492:'])
Bram Moolenaarada1d872021-02-20 08:16:51 +01004397
4398 lines =<< trim END
Yegappan Lakshmanan885de442022-04-23 10:51:14 +01004399 :k a
4400 END
4401 v9.CheckDefAndScriptFailure(lines, 'E1100:')
4402
4403 lines =<< trim END
4404 :1k a
4405 END
4406 v9.CheckDefAndScriptFailure(lines, 'E481:')
4407
4408 lines =<< trim END
Bram Moolenaar10b94212021-02-19 21:42:57 +01004409 t
4410 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004411 v9.CheckDefAndScriptFailure(lines, 'E1100:')
Bram Moolenaar10b94212021-02-19 21:42:57 +01004412
4413 lines =<< trim END
4414 x
4415 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004416 v9.CheckDefAndScriptFailure(lines, 'E1100:')
Bram Moolenaar10b94212021-02-19 21:42:57 +01004417
4418 lines =<< trim END
4419 xit
4420 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004421 v9.CheckDefAndScriptFailure(lines, 'E1100:')
4422
4423 lines =<< trim END
4424 Print
4425 END
4426 v9.CheckDefAndScriptFailure(lines, ['E476: Invalid command: Print', 'E492: Not an editor command: Print'])
4427
4428 lines =<< trim END
4429 mode 4
4430 END
4431 v9.CheckDefAndScriptFailure(lines, ['E476: Invalid command: mode 4', 'E492: Not an editor command: mode 4'])
Bram Moolenaar10b94212021-02-19 21:42:57 +01004432enddef
4433
Bram Moolenaarc70fe462021-04-17 17:59:19 +02004434def Test_mapping_line_number()
4435 var lines =<< trim END
4436 vim9script
4437 def g:FuncA()
4438 # Some comment
4439 FuncB(0)
4440 enddef
4441 # Some comment
4442 def FuncB(
4443 # Some comment
4444 n: number
4445 )
4446 exe 'nno '
4447 # Some comment
4448 .. '<F3> a'
4449 .. 'b'
4450 .. 'c'
4451 enddef
4452 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004453 v9.CheckScriptSuccess(lines)
Bram Moolenaarc70fe462021-04-17 17:59:19 +02004454 var res = execute('verbose nmap <F3>')
4455 assert_match('No mapping found', res)
4456
4457 g:FuncA()
4458 res = execute('verbose nmap <F3>')
4459 assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
4460
4461 nunmap <F3>
4462 delfunc g:FuncA
4463enddef
4464
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004465def Test_option_set()
4466 # legacy script allows for white space
4467 var lines =<< trim END
4468 set foldlevel =11
4469 call assert_equal(11, &foldlevel)
4470 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004471 v9.CheckScriptSuccess(lines)
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004472
4473 set foldlevel
4474 set foldlevel=12
4475 assert_equal(12, &foldlevel)
4476 set foldlevel+=2
4477 assert_equal(14, &foldlevel)
4478 set foldlevel-=3
4479 assert_equal(11, &foldlevel)
4480
4481 lines =<< trim END
4482 set foldlevel =1
4483 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004484 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004485
4486 lines =<< trim END
4487 set foldlevel +=1
4488 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004489 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004490
4491 lines =<< trim END
4492 set foldlevel ^=1
4493 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004494 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004495
4496 lines =<< trim END
4497 set foldlevel -=1
4498 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004499 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004500
4501 set foldlevel&
4502enddef
4503
LemonBoy32f34612023-09-02 21:52:05 +02004504def Test_option_set_line_number()
4505 var lines =<< trim END
4506 vim9script
4507 # line2
4508 # line3
4509 def F()
4510 # line5
4511 &foldlevel = -128
4512 enddef
4513 F()
4514 END
4515 v9.CheckScriptSuccess(lines)
4516
4517 var res = execute('verbose set foldlevel')
4518 assert_match(' foldlevel.*Last set from .*XScriptSuccess\d\+ line 6', res)
4519enddef
4520
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004521def Test_option_modifier()
Bram Moolenaar1594f312021-07-08 16:40:13 +02004522 # legacy script allows for white space
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004523 var lines =<< trim END
4524 set hlsearch & hlsearch !
4525 call assert_equal(1, &hlsearch)
4526 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004527 v9.CheckScriptSuccess(lines)
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004528
Bram Moolenaar1594f312021-07-08 16:40:13 +02004529 set hlsearch
4530 set hlsearch!
4531 assert_equal(false, &hlsearch)
4532
4533 set hlsearch
4534 set hlsearch&
4535 assert_equal(false, &hlsearch)
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004536
4537 lines =<< trim END
Bram Moolenaar1594f312021-07-08 16:40:13 +02004538 set hlsearch &
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004539 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004540 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &')
Bram Moolenaar1594f312021-07-08 16:40:13 +02004541
4542 lines =<< trim END
4543 set hlsearch !
4544 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004545 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !')
Bram Moolenaar1594f312021-07-08 16:40:13 +02004546
4547 set hlsearch&
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004548enddef
4549
Bram Moolenaarc03fe662021-07-11 16:52:45 +02004550" This must be called last, it may cause following :def functions to fail
4551def Test_xxx_echoerr_line_number()
4552 var lines =<< trim END
4553 echoerr 'some'
4554 .. ' error'
4555 .. ' continued'
4556 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004557 v9.CheckDefExecAndScriptFailure(lines, 'some error continued', 1)
Bram Moolenaarc03fe662021-07-11 16:52:45 +02004558enddef
4559
Bram Moolenaar9537e372021-12-10 21:05:53 +00004560func Test_debug_with_lambda()
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004561 CheckRunVimInTerminal
4562
Bram Moolenaar9537e372021-12-10 21:05:53 +00004563 " call indirectly to avoid compilation error for missing functions
4564 call Run_Test_debug_with_lambda()
4565endfunc
4566
4567def Run_Test_debug_with_lambda()
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004568 var lines =<< trim END
4569 vim9script
4570 def Func()
4571 var n = 0
4572 echo [0]->filter((_, v) => v == n)
4573 enddef
4574 breakadd func Func
4575 Func()
4576 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004577 writefile(lines, 'XdebugFunc', 'D')
Christian Brabandt7edde3f2024-05-04 09:38:59 +02004578 var buf = g:RunVimInTerminal('-S XdebugFunc', {rows: 10, wait_for_ruler: 0})
4579 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 10)))
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004580
4581 term_sendkeys(buf, "cont\<CR>")
Christian Brabandt7edde3f2024-05-04 09:38:59 +02004582 g:WaitForAssert(() => assert_match('\[0\]', term_getline(buf, 9)))
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004583
Bram Moolenaar62aec932022-01-29 21:45:34 +00004584 g:StopVimInTerminal(buf)
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004585enddef
4586
Bram Moolenaar310091d2021-12-23 21:14:37 +00004587func Test_debug_running_out_of_lines()
4588 CheckRunVimInTerminal
4589
4590 " call indirectly to avoid compilation error for missing functions
4591 call Run_Test_debug_running_out_of_lines()
4592endfunc
4593
4594def Run_Test_debug_running_out_of_lines()
4595 var lines =<< trim END
4596 vim9script
4597 def Crash()
4598 #
4599 #
4600 #
4601 #
4602 #
4603 #
4604 #
4605 if true
4606 #
4607 endif
4608 enddef
4609 breakadd func Crash
4610 Crash()
4611 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004612 writefile(lines, 'XdebugFunc', 'D')
Christian Brabandt7edde3f2024-05-04 09:38:59 +02004613 var buf = g:RunVimInTerminal('-S XdebugFunc', {rows: 10, wait_for_ruler: 0})
4614 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 10)))
Bram Moolenaar310091d2021-12-23 21:14:37 +00004615
4616 term_sendkeys(buf, "next\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004617 g:TermWait(buf)
Christian Brabandt7edde3f2024-05-04 09:38:59 +02004618 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 10)))
Bram Moolenaar310091d2021-12-23 21:14:37 +00004619
4620 term_sendkeys(buf, "cont\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004621 g:TermWait(buf)
Bram Moolenaar310091d2021-12-23 21:14:37 +00004622
Bram Moolenaar62aec932022-01-29 21:45:34 +00004623 g:StopVimInTerminal(buf)
Bram Moolenaar310091d2021-12-23 21:14:37 +00004624enddef
4625
dundargocc57b5bc2022-11-02 13:30:51 +00004626def Test_ambiguous_command_error()
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004627 var lines =<< trim END
4628 vim9script
4629 command CmdA echomsg 'CmdA'
4630 command CmdB echomsg 'CmdB'
4631 Cmd
4632 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004633 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 4)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004634
4635 lines =<< trim END
4636 vim9script
4637 def Func()
4638 Cmd
4639 enddef
4640 Func()
4641 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004642 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 1)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004643
4644 lines =<< trim END
4645 vim9script
4646 nnoremap <F3> <ScriptCmd>Cmd<CR>
4647 feedkeys("\<F3>", 'xt')
4648 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004649 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 3)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004650
4651 delcommand CmdA
4652 delcommand CmdB
4653 nunmap <F3>
4654enddef
4655
Dominique Pelle923dce22021-11-21 11:36:04 +00004656" Execute this near the end, profiling doesn't stop until Vim exits.
Bram Moolenaard9162552021-07-11 15:26:13 +02004657" This only tests that it works, not the profiling output.
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004658def Test_profile_with_lambda()
Bram Moolenaar4ece1522021-07-11 16:31:51 +02004659 CheckFeature profile
4660
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004661 var lines =<< trim END
4662 vim9script
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004663
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004664 def ProfiledWithLambda()
4665 var n = 3
4666 echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n)
4667 enddef
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004668
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004669 def ProfiledNested()
4670 var x = 0
4671 def Nested(): any
4672 return x
4673 enddef
4674 Nested()
4675 enddef
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004676
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004677 def g:ProfiledNestedProfiled()
4678 var x = 0
4679 def Nested(): any
4680 return x
4681 enddef
4682 Nested()
4683 enddef
4684
4685 def Profile()
Bram Moolenaar48f69cd2022-03-15 16:16:47 +00004686 ProfiledWithLambda()
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004687 ProfiledNested()
4688
Bram Moolenaar48f69cd2022-03-15 16:16:47 +00004689 # Also profile the nested function. Use a different function, although
4690 # the contents is the same, to make sure it was not already compiled.
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004691 profile func *
4692 g:ProfiledNestedProfiled()
4693
4694 profdel func *
4695 profile pause
4696 enddef
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004697
4698 var result = 'done'
4699 try
4700 # mark functions for profiling now to avoid E1271
4701 profile start Xprofile.log
4702 profile func ProfiledWithLambda
4703 profile func ProfiledNested
4704
4705 Profile()
4706 catch
4707 result = 'failed: ' .. v:exception
4708 finally
4709 writefile([result], 'Xdidprofile')
4710 endtry
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004711 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004712 writefile(lines, 'Xprofile.vim', 'D')
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004713 call system(g:GetVimCommand()
4714 .. ' --clean'
4715 .. ' -c "so Xprofile.vim"'
4716 .. ' -c "qall!"')
4717 call assert_equal(0, v:shell_error)
4718
4719 assert_equal(['done'], readfile('Xdidprofile'))
4720 assert_true(filereadable('Xprofile.log'))
4721 delete('Xdidprofile')
4722 delete('Xprofile.log')
Bram Moolenaard9162552021-07-11 15:26:13 +02004723enddef
4724
Bram Moolenaar4f6e7722022-03-16 20:26:02 +00004725func Test_misplaced_type()
4726 CheckRunVimInTerminal
4727 call Run_Test_misplaced_type()
4728endfunc
4729
4730def Run_Test_misplaced_type()
Bram Moolenaar9510d222022-09-11 15:14:05 +01004731 writefile(['let g:somevar = "asdf"'], 'XTest_misplaced_type', 'D')
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004732 var buf = g:RunVimInTerminal('-S XTest_misplaced_type', {'rows': 6})
Bram Moolenaar9510d222022-09-11 15:14:05 +01004733 term_sendkeys(buf, ":vim9cmd echo islocked('somevar: string')\<CR>")
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004734 g:VerifyScreenDump(buf, 'Test_misplaced_type', {})
4735
4736 g:StopVimInTerminal(buf)
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004737enddef
4738
LemonBoya5d35902022-04-29 21:15:02 +01004739" Ensure echo doesn't crash when stringifying empty variables.
4740def Test_echo_uninit_variables()
4741 var res: string
4742
4743 var var_bool: bool
4744 var var_num: number
4745 var var_float: float
4746 var Var_func: func
4747 var var_string: string
4748 var var_blob: blob
LemonBoya5d35902022-04-29 21:15:02 +01004749 var var_list: list<any>
4750 var var_dict: dict<any>
4751
4752 redir => res
4753 echo var_bool
4754 echo var_num
4755 echo var_float
4756 echo Var_func
4757 echo var_string
4758 echo var_blob
LemonBoya5d35902022-04-29 21:15:02 +01004759 echo var_list
4760 echo var_dict
4761 redir END
4762
Bram Moolenaarf1d63b92022-05-06 13:37:42 +01004763 assert_equal(['false', '0', '0.0', 'function()', '', '0z', '[]', '{}'], res->split('\n'))
4764
4765 if has('job')
4766 var var_job: job
4767 var var_channel: channel
4768
4769 redir => res
4770 echo var_job
4771 echo var_channel
4772 redir END
4773
4774 assert_equal(['no process', 'channel fail'], res->split('\n'))
4775 endif
LemonBoya5d35902022-04-29 21:15:02 +01004776enddef
4777
Bram Moolenaar6342e2c2022-12-12 18:56:32 +00004778def Test_free_type_before_use()
4779 # this rather complicated script was freeing a type before using it
4780 var lines =<< trim END
4781 vim9script
4782
4783 def Scan(rel: list<dict<any>>): func(func(dict<any>))
4784 return (Emit: func(dict<any>)) => {
4785 for t in rel
4786 Emit(t)
4787 endfor
4788 }
4789 enddef
4790
4791 def Build(Cont: func(func(dict<any>))): list<dict<any>>
4792 var rel: list<dict<any>> = []
4793 Cont((t) => {
4794 add(rel, t)
4795 })
4796 return rel
4797 enddef
4798
4799 var R = [{A: 0}]
4800 var result = Scan(R)->Build()
4801 result = Scan(R)->Build()
4802
4803 assert_equal(R, result)
4804 END
4805 v9.CheckScriptSuccess(lines)
4806enddef
4807
Yegappan Lakshmanana76fbe62023-09-27 18:51:43 +02004808" The following complicated script used to cause an internal error (E340)
4809" because the funcref instruction memory was referenced after the instruction
4810" memory was reallocated (Github issue #13178)
4811def Test_refer_funcref_instr_after_realloc()
4812 var lines =<< trim END
4813 vim9script
4814 def A(d: bool)
4815 var e = abs(0)
4816 var f = &emoji
4817 &emoji = true
4818 if ['', '', '']->index('xxx') == 0
4819 eval 0 + 0
4820 endif
4821 if &filetype == 'xxx'
4822 var g = abs(0)
4823 while g > 0
4824 if getline(g) == ''
4825 break
4826 endif
4827 --g
4828 endwhile
4829 if g == 0
4830 return
4831 endif
4832 if d
4833 feedkeys($'{g}G')
4834 g = abs(0)
4835 endif
4836 var h = abs(0)
4837 var i = abs(0)
4838 var j = abs(0)
4839 while j < 0
4840 if abs(0) < h && getline(j) != ''
4841 break
4842 endif
4843 ++j
4844 endwhile
4845 feedkeys($'{g}G{j}G')
4846 return
4847 endif
4848 def B()
4849 enddef
4850 def C()
4851 enddef
4852 enddef
4853 A(false)
4854 END
4855 v9.CheckScriptSuccess(lines)
4856enddef
4857
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004858" Test for calling a deferred function after an exception
4859def Test_defer_after_exception()
4860 var lines =<< trim END
4861 vim9script
4862
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004863 var callTrace: list<number> = []
4864 def Bar()
4865 callTrace += [1]
4866 throw 'InnerException'
4867 enddef
4868
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004869 def Defer()
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004870 callTrace += [2]
4871 callTrace += [3]
4872 try
4873 Bar()
4874 catch /InnerException/
4875 callTrace += [4]
4876 endtry
4877 callTrace += [5]
4878 callTrace += [6]
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004879 enddef
4880
4881 def Foo()
4882 defer Defer()
4883 throw "TestException"
4884 enddef
4885
4886 try
4887 Foo()
4888 catch /TestException/
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004889 callTrace += [7]
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004890 endtry
4891
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004892 assert_equal([2, 3, 1, 4, 5, 6, 7], callTrace)
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004893 END
Yegappan Lakshmananec3cebb2023-10-27 19:35:26 +02004894 v9.CheckSourceSuccess(lines)
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004895enddef
4896
Yegappan Lakshmanan0ab500d2023-10-21 11:59:42 +02004897" Test for multiple deferred function which throw exceptions.
4898" Exceptions thrown by deferred functions should result in error messages but
4899" not propagated into the calling functions.
4900def Test_multidefer_with_exception()
4901 var lines =<< trim END
4902 vim9script
4903
4904 var callTrace: list<number> = []
4905 def Except()
4906 callTrace += [1]
4907 throw 'InnerException'
4908 callTrace += [2]
4909 enddef
4910
4911 def FirstDefer()
4912 callTrace += [3]
4913 callTrace += [4]
4914 enddef
4915
4916 def SecondDeferWithExcept()
4917 callTrace += [5]
4918 Except()
4919 callTrace += [6]
4920 enddef
4921
4922 def ThirdDefer()
4923 callTrace += [7]
4924 callTrace += [8]
4925 enddef
4926
4927 def Foo()
4928 callTrace += [9]
4929 defer FirstDefer()
4930 defer SecondDeferWithExcept()
4931 defer ThirdDefer()
4932 callTrace += [10]
4933 enddef
4934
4935 v:errmsg = ''
4936 try
4937 callTrace += [11]
4938 Foo()
4939 callTrace += [12]
4940 catch /TestException/
4941 callTrace += [13]
4942 catch
4943 callTrace += [14]
4944 finally
4945 callTrace += [15]
4946 endtry
4947 callTrace += [16]
4948
4949 assert_equal('E605: Exception not caught: InnerException', v:errmsg)
4950 assert_equal([11, 9, 10, 7, 8, 5, 1, 3, 4, 12, 15, 16], callTrace)
4951 END
Yegappan Lakshmananec3cebb2023-10-27 19:35:26 +02004952 v9.CheckSourceSuccess(lines)
4953enddef
4954
Yegappan Lakshmanana185a312023-12-16 14:36:08 +01004955" Test for using ":defer" inside an if statement with a false condition
4956def Test_defer_skipped()
4957 var lines =<< trim END
4958 def Foo()
4959 if false
4960 defer execute('echow "hello"', "")
4961 endif
4962 enddef
4963 defcompile
4964 END
4965 v9.CheckSourceSuccess(lines)
4966enddef
4967
Yegappan Lakshmanan062bb6b2023-12-16 14:46:40 +01004968" Test for using defer without parenthesis for the function name
4969def Test_defer_func_without_paren()
4970 var lines =<< trim END
4971 vim9script
4972 def Foo()
4973 defer Bar
4974 enddef
4975 defcompile
4976 END
4977 v9.CheckScriptFailure(lines, 'E107: Missing parentheses: Bar', 1)
4978enddef
4979
4980" Test for using defer without parenthesis for the function name
4981def Test_defer_non_existing_func()
4982 var lines =<< trim END
4983 vim9script
4984 def Foo()
4985 defer Bar()
4986 enddef
4987 defcompile
4988 END
4989 v9.CheckScriptFailure(lines, 'E1001: Variable not found: Bar', 1)
4990enddef
4991
4992" Test for using defer with an invalid function name
4993def Test_defer_invalid_func()
4994 var lines =<< trim END
4995 vim9script
4996 def Foo()
4997 var Abc = 10
4998 defer Abc()
4999 enddef
5000 defcompile
5001 END
5002 v9.CheckScriptFailure(lines, 'E129: Function name required', 2)
5003enddef
5004
5005" Test for using defer with an invalid argument to a function
5006def Test_defer_invalid_func_arg()
5007 var lines =<< trim END
5008 vim9script
5009 def Bar(x: number)
5010 enddef
5011 def Foo()
5012 defer Bar(a)
5013 enddef
5014 defcompile
5015 END
5016 v9.CheckScriptFailure(lines, 'E1001: Variable not found: a', 1)
5017enddef
5018
5019" Test for using an non-existing type in a "for" statement.
5020def Test_invalid_type_in_for()
5021 var lines =<< trim END
5022 vim9script
5023 def Foo()
5024 for b: x in range(10)
5025 endfor
5026 enddef
5027 defcompile
5028 END
Yegappan Lakshmanan1b531722024-05-09 09:12:31 +02005029 v9.CheckSourceFailure(lines, 'E1010: Type not recognized: x', 1)
Yegappan Lakshmanan062bb6b2023-12-16 14:46:40 +01005030enddef
5031
5032" Test for using a line break between the variable name and the type in a for
5033" statement.
5034def Test_for_stmt_space_before_type()
5035 var lines =<< trim END
5036 vim9script
5037 def Foo()
5038 for a
5039 :number in range(10)
5040 endfor
5041 enddef
5042 defcompile
5043 END
5044 v9.CheckSourceFailure(lines, 'E1059: No white space allowed before colon: :number in range(10)', 2)
5045enddef
5046
zeertzjqc029c132024-03-28 11:37:26 +01005047" This test used to cause a use-after-free memory access
Yegappan Lakshmanan28d71b52024-01-12 17:21:55 +01005048def Test_for_empty_line_after_lambda()
5049 var lines =<< trim END
5050 vim9script
5051 echomsg range(0, 2)->map((_, v) => {
5052 return 1
5053 })
5054
5055 assert_equal('[1, 1, 1]', v:statusmsg)
5056 END
5057 v9.CheckSourceSuccess(lines)
5058
5059 lines =<< trim END
5060 vim9script
5061 echomsg range(0, 1)->map((_, v) => {
5062 return 1
5063 }) range(0, 1)->map((_, v) => {
5064 return 2
5065 }) # comment
5066
5067 assert_equal('[1, 1] [2, 2]', v:statusmsg)
5068 END
5069 v9.CheckSourceSuccess(lines)
5070enddef
5071
Yegappan Lakshmanan3fa8f772024-04-04 21:42:07 +02005072" Test for evaluating a lambda block from a string
5073def Test_eval_lambda_block()
5074 var lines =<< trim END
5075 vim9script
5076 var Fn = eval("(x: number): number => {\nreturn x * 2\n}")
5077 assert_equal(6, Fn(3))
5078 END
5079 v9.CheckSourceSuccess(lines)
5080enddef
5081
Yegappan Lakshmananda9d3452024-05-02 13:02:36 +02005082" Test for using various null values
5083def Test_null_values()
5084 var lines =<< trim END
5085 var nullValues = [
5086 [null, 1, 'null', 7, 'special'],
5087 [null_blob, 1, '0z', 10, 'blob'],
5088 [null_channel, 1, 'channel fail', 9, 'channel'],
5089 [null_dict, 1, '{}', 4, 'dict<any>'],
5090 [null_function, 1, "function('')", 2, 'func(...): unknown'],
5091 [null_job, 1, 'no process', 8, 'job'],
5092 [null_list, 1, '[]', 3, 'list<any>'],
5093 [null_object, 1, 'object of [unknown]', 13, 'object<Unknown>'],
5094 [null_partial, 1, "function('')", 2, 'func(...): unknown'],
5095 [null_string, 1, "''", 1, 'string']
5096 ]
5097
5098 for [Val, emptyExp, stringExp, typeExp, typenameExp] in nullValues
5099 assert_equal(emptyExp, empty(Val))
5100 assert_equal(stringExp, string(Val))
5101 assert_equal(typeExp, type(Val))
5102 assert_equal(typenameExp, typename(Val))
5103 assert_equal(Val, copy(Val))
5104 assert_equal(-1, test_refcount(Val))
5105 endfor
5106 END
5107 v9.CheckSourceDefAndScriptSuccess(lines)
5108enddef
5109
Yegappan Lakshmanan1b531722024-05-09 09:12:31 +02005110" Test for using an unknown type in a typecast
5111def Test_unknown_type_in_typecast()
5112 var lines =<< trim END
5113 vim9script
5114 var a = <MyType>b
5115 END
5116 v9.CheckSourceFailure(lines, 'E1010: Type not recognized: MyType', 2)
5117
5118 lines =<< trim END
5119 vim9script
5120 var Fn = <funcx(number, number): number>b
5121 END
5122 v9.CheckSourceFailure(lines, 'E1010: Type not recognized: funcx(number, number): number', 2)
Yegappan Lakshmananfe424d12024-05-17 18:20:43 +02005123
5124 # Wrong type in a type cast
5125 lines =<< trim END
5126 vim9script
5127 var i: number = <number>true
5128 END
5129 v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected number but got bool', 2)
Yegappan Lakshmanan1b531722024-05-09 09:12:31 +02005130enddef
5131
Bram Moolenaar585fea72020-04-02 22:33:21 +02005132" Keep this last, it messes up highlighting.
5133def Test_substitute_cmd()
5134 new
5135 setline(1, 'something')
5136 :substitute(some(other(
5137 assert_equal('otherthing', getline(1))
5138 bwipe!
5139
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02005140 # also when the context is Vim9 script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02005141 var lines =<< trim END
Bram Moolenaar585fea72020-04-02 22:33:21 +02005142 vim9script
5143 new
5144 setline(1, 'something')
5145 :substitute(some(other(
5146 assert_equal('otherthing', getline(1))
5147 bwipe!
5148 END
Bram Moolenaardd674772022-09-15 22:26:18 +01005149 writefile(lines, 'Xvim9lines', 'D')
Bram Moolenaar585fea72020-04-02 22:33:21 +02005150 source Xvim9lines
Bram Moolenaar585fea72020-04-02 22:33:21 +02005151enddef
5152
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01005153" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker