blob: a640fce9bd4de53ed2a88eb6319f51b0dca6e17f [file] [log] [blame]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001" Test various aspects of the Vim9 script language.
2
Bram Moolenaar673660a2020-01-26 16:50:05 +01003source check.vim
Bram Moolenaar101f4812020-06-16 23:18:51 +02004source term_util.vim
Bram Moolenaar62aec932022-01-29 21:45:34 +00005import './vim9.vim' as v9
Bram Moolenaar37294bd2021-03-10 13:40:08 +01006source screendump.vim
Bram Moolenaard8448622022-01-07 21:39:52 +00007source shared.vim
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01008
Bram Moolenaarb79ee0c2022-01-01 12:17:00 +00009def Test_vim9script_feature()
10 # example from the help, here the feature is always present
11 var lines =<< trim END
12 " old style comment
13 if !has('vim9script')
14 " legacy commands would go here
15 finish
16 endif
17 vim9script
18 # Vim9 script commands go here
19 g:didit = true
20 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000021 v9.CheckScriptSuccess(lines)
Bram Moolenaarb79ee0c2022-01-01 12:17:00 +000022 assert_equal(true, g:didit)
23 unlet g:didit
24enddef
25
Bram Moolenaar5d72ce62020-08-20 23:04:06 +020026def Test_range_only()
27 new
28 setline(1, ['blah', 'Blah'])
29 :/Blah/
30 assert_equal(2, getcurpos()[1])
Bram Moolenaarc2af0af2020-08-23 21:06:02 +020031 bwipe!
32
33 # without range commands use current line
34 new
35 setline(1, ['one', 'two', 'three'])
36 :2
37 print
Bram Moolenaar62aec932022-01-29 21:45:34 +000038 assert_equal('two', g:Screenline(&lines))
Bram Moolenaarc2af0af2020-08-23 21:06:02 +020039 :3
40 list
Bram Moolenaar62aec932022-01-29 21:45:34 +000041 assert_equal('three$', g:Screenline(&lines))
Bram Moolenaarb8554302021-02-15 21:30:30 +010042
43 # missing command does not print the line
44 var lines =<< trim END
45 vim9script
46 :1|
Bram Moolenaar62aec932022-01-29 21:45:34 +000047 assert_equal('three$', g:Screenline(&lines))
Bram Moolenaarb8554302021-02-15 21:30:30 +010048 :|
Bram Moolenaar62aec932022-01-29 21:45:34 +000049 assert_equal('three$', g:Screenline(&lines))
Bram Moolenaarb8554302021-02-15 21:30:30 +010050 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000051 v9.CheckScriptSuccess(lines)
Bram Moolenaarb8554302021-02-15 21:30:30 +010052
Bram Moolenaarc2af0af2020-08-23 21:06:02 +020053 bwipe!
Bram Moolenaar025cb1c2020-12-14 18:31:27 +010054
Bram Moolenaar0c7f2612022-02-17 19:44:07 +000055 lines =<< trim END
56 set cpo+=-
57 :1,999
58 END
59 v9.CheckDefExecAndScriptFailure(lines, 'E16:', 2)
60 set cpo&vim
61
62 v9.CheckDefExecAndScriptFailure([":'x"], 'E20:', 1)
63
Bram Moolenaar025cb1c2020-12-14 18:31:27 +010064 # won't generate anything
65 if false
66 :123
67 endif
Bram Moolenaar5d72ce62020-08-20 23:04:06 +020068enddef
69
Bram Moolenaar09d94212022-05-05 15:20:03 +010070def Test_invalid_range()
71 var lines =<< trim END
72 :123 eval 1 + 2
73 END
74 v9.CheckDefAndScriptFailure(lines, 'E481:', 1)
75
76 lines =<< trim END
77 :123 if true
78 endif
79 END
80 v9.CheckDefAndScriptFailure(lines, 'E481:', 1)
81
82 lines =<< trim END
83 :123 echo 'yes'
84 END
85 v9.CheckDefAndScriptFailure(lines, 'E481:', 1)
86
87 lines =<< trim END
88 :123 cd there
89 END
90 v9.CheckDefAndScriptFailure(lines, 'E481:', 1)
91enddef
92
Bram Moolenaara6e67e42020-05-15 23:36:40 +020093let g:alist = [7]
94let g:astring = 'text'
Bram Moolenaarf0b9f432020-07-17 23:03:17 +020095let g:anumber = 123
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010096
Bram Moolenaar4c17ad92020-04-27 22:47:51 +020097def Test_delfunction()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +020098 # Check function is defined in script namespace
Bram Moolenaar62aec932022-01-29 21:45:34 +000099 v9.CheckScriptSuccess([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200100 'vim9script',
101 'func CheckMe()',
102 ' return 123',
103 'endfunc',
Bram Moolenaara749a422022-02-12 19:52:25 +0000104 'func DoTest()',
105 ' call assert_equal(123, s:CheckMe())',
106 'endfunc',
107 'DoTest()',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200108 ])
109
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200110 # Check function in script namespace cannot be deleted
Bram Moolenaar62aec932022-01-29 21:45:34 +0000111 v9.CheckScriptFailure([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200112 'vim9script',
113 'func DeleteMe1()',
114 'endfunc',
115 'delfunction DeleteMe1',
116 ], 'E1084:')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000117 v9.CheckScriptFailure([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200118 'vim9script',
119 'func DeleteMe2()',
120 'endfunc',
121 'def DoThat()',
122 ' delfunction DeleteMe2',
123 'enddef',
124 'DoThat()',
125 ], 'E1084:')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000126 v9.CheckScriptFailure([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200127 'vim9script',
128 'def DeleteMe3()',
129 'enddef',
130 'delfunction DeleteMe3',
131 ], 'E1084:')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000132 v9.CheckScriptFailure([
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200133 'vim9script',
134 'def DeleteMe4()',
135 'enddef',
136 'def DoThat()',
137 ' delfunction DeleteMe4',
138 'enddef',
139 'DoThat()',
140 ], 'E1084:')
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200141
142 # Check that global :def function can be replaced and deleted
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200143 var lines =<< trim END
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200144 vim9script
145 def g:Global(): string
146 return "yes"
147 enddef
148 assert_equal("yes", g:Global())
149 def! g:Global(): string
150 return "no"
151 enddef
152 assert_equal("no", g:Global())
153 delfunc g:Global
154 assert_false(exists('*g:Global'))
155 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000156 v9.CheckScriptSuccess(lines)
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200157
158 # Check that global function can be replaced by a :def function and deleted
159 lines =<< trim END
160 vim9script
161 func g:Global()
162 return "yes"
163 endfunc
164 assert_equal("yes", g:Global())
165 def! g:Global(): string
166 return "no"
167 enddef
168 assert_equal("no", g:Global())
169 delfunc g:Global
170 assert_false(exists('*g:Global'))
171 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000172 v9.CheckScriptSuccess(lines)
Bram Moolenaar925e9fd2020-07-25 15:41:11 +0200173
174 # Check that global :def function can be replaced by a function and deleted
175 lines =<< trim END
176 vim9script
177 def g:Global(): string
178 return "yes"
179 enddef
180 assert_equal("yes", g:Global())
181 func! g:Global()
182 return "no"
183 endfunc
184 assert_equal("no", g:Global())
185 delfunc g:Global
186 assert_false(exists('*g:Global'))
187 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000188 v9.CheckScriptSuccess(lines)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200189enddef
190
Bram Moolenaar08052222020-09-14 17:04:31 +0200191def Test_wrong_type()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000192 v9.CheckDefFailure(['var name: list<nothing>'], 'E1010:')
193 v9.CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:')
194 v9.CheckDefFailure(['var name: dict<nothing>'], 'E1010:')
195 v9.CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:')
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100196
Bram Moolenaar62aec932022-01-29 21:45:34 +0000197 v9.CheckDefFailure(['var name: dict<number'], 'E1009:')
198 v9.CheckDefFailure(['var name: dict<list<number>'], 'E1009:')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100199
Bram Moolenaar62aec932022-01-29 21:45:34 +0000200 v9.CheckDefFailure(['var name: ally'], 'E1010:')
201 v9.CheckDefFailure(['var name: bram'], 'E1010:')
202 v9.CheckDefFailure(['var name: cathy'], 'E1010:')
203 v9.CheckDefFailure(['var name: dom'], 'E1010:')
204 v9.CheckDefFailure(['var name: freddy'], 'E1010:')
205 v9.CheckDefFailure(['var name: john'], 'E1010:')
206 v9.CheckDefFailure(['var name: larry'], 'E1010:')
207 v9.CheckDefFailure(['var name: ned'], 'E1010:')
208 v9.CheckDefFailure(['var name: pam'], 'E1010:')
209 v9.CheckDefFailure(['var name: sam'], 'E1010:')
210 v9.CheckDefFailure(['var name: vim'], 'E1010:')
Bram Moolenaara0a9f432020-04-28 21:29:34 +0200211
Bram Moolenaar62aec932022-01-29 21:45:34 +0000212 v9.CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:')
213 v9.CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:')
Bram Moolenaar08052222020-09-14 17:04:31 +0200214enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100215
Bram Moolenaara749a422022-02-12 19:52:25 +0000216def Test_script_namespace()
217 # defining a function or variable with s: is not allowed
218 var lines =<< trim END
219 vim9script
220 def s:Function()
221 enddef
222 END
223 v9.CheckScriptFailure(lines, 'E1268:')
224
225 for decl in ['var', 'const', 'final']
226 lines =<< trim END
227 vim9script
228 var s:var = 'var'
229 END
230 v9.CheckScriptFailure([
231 'vim9script',
232 decl .. ' s:var = "var"',
233 ], 'E1268:')
234 endfor
235
236 # Calling a function or using a variable with s: is not allowed at script
237 # level
238 lines =<< trim END
239 vim9script
240 def Function()
241 enddef
242 s:Function()
243 END
244 v9.CheckScriptFailure(lines, 'E1268:')
245 lines =<< trim END
246 vim9script
247 def Function()
248 enddef
249 call s:Function()
250 END
251 v9.CheckScriptFailure(lines, 'E1268:')
252 lines =<< trim END
253 vim9script
254 var var = 'var'
255 echo s:var
256 END
257 v9.CheckScriptFailure(lines, 'E1268:')
258enddef
259
Bram Moolenaar10c65862020-10-08 21:16:42 +0200260def Test_script_wrong_type()
261 var lines =<< trim END
262 vim9script
Bram Moolenaara749a422022-02-12 19:52:25 +0000263 var dict: dict<string>
264 dict['a'] = ['x']
Bram Moolenaar10c65862020-10-08 21:16:42 +0200265 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000266 v9.CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3)
Bram Moolenaar10c65862020-10-08 21:16:42 +0200267enddef
268
Bram Moolenaar08052222020-09-14 17:04:31 +0200269def Test_const()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000270 v9.CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:')
271 v9.CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:')
272 v9.CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:')
273 v9.CheckDefFailure(['final two'], 'E1125:')
274 v9.CheckDefFailure(['final &option'], 'E996:')
Bram Moolenaardbeecb22020-09-14 18:15:09 +0200275
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200276 var lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200277 final list = [1, 2, 3]
Bram Moolenaardbeecb22020-09-14 18:15:09 +0200278 list[0] = 4
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200279 list->assert_equal([4, 2, 3])
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200280 const other = [5, 6, 7]
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200281 other->assert_equal([5, 6, 7])
Bram Moolenaar71abe482020-09-14 22:28:30 +0200282
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200283 var varlist = [7, 8]
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200284 const constlist = [1, varlist, 3]
Bram Moolenaar71abe482020-09-14 22:28:30 +0200285 varlist[0] = 77
Bram Moolenaar23e2e112021-08-03 21:16:18 +0200286 constlist[1][1] = 88
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200287 var cl = constlist[1]
Bram Moolenaar71abe482020-09-14 22:28:30 +0200288 cl[1] = 88
289 constlist->assert_equal([1, [77, 88], 3])
290
Bram Moolenaare0de1712020-12-02 17:36:54 +0100291 var vardict = {five: 5, six: 6}
292 const constdict = {one: 1, two: vardict, three: 3}
Bram Moolenaar71abe482020-09-14 22:28:30 +0200293 vardict['five'] = 55
Bram Moolenaar23e2e112021-08-03 21:16:18 +0200294 constdict['two']['six'] = 66
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200295 var cd = constdict['two']
Bram Moolenaar71abe482020-09-14 22:28:30 +0200296 cd['six'] = 66
Bram Moolenaare0de1712020-12-02 17:36:54 +0100297 constdict->assert_equal({one: 1, two: {five: 55, six: 66}, three: 3})
Bram Moolenaardbeecb22020-09-14 18:15:09 +0200298 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000299 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar0089ce22022-10-08 14:39:36 +0100300
301 # "any" type with const flag is recognized as "any"
302 lines =<< trim END
303 const dict: dict<any> = {foo: {bar: 42}}
304 const foo = dict.foo
305 assert_equal(v:t_number, type(foo.bar))
306 END
307 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar330d64d2022-10-09 12:55:33 +0100308
309 # also when used as a builtin function argument
310 lines =<< trim END
311 vim9script
312
313 def SorterFunc(lhs: dict<string>, rhs: dict<string>): number
314 return lhs.name <# rhs.name ? -1 : 1
315 enddef
316
317 def Run(): void
318 var list = [{name: "3"}, {name: "2"}]
319 const Sorter = get({}, "unknown", SorterFunc)
320 sort(list, Sorter)
321 assert_equal([{name: "2"}, {name: "3"}], list)
322 enddef
323
324 Run()
325 END
326 v9.CheckScriptSuccess(lines)
Bram Moolenaar08052222020-09-14 17:04:31 +0200327enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100328
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200329def Test_const_bang()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200330 var lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200331 const var = 234
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200332 var = 99
333 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000334 v9.CheckDefExecFailure(lines, 'E1018:', 2)
335 v9.CheckScriptFailure(['vim9script'] + lines, 'E46:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200336
337 lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200338 const ll = [2, 3, 4]
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200339 ll[0] = 99
340 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000341 v9.CheckDefExecFailure(lines, 'E1119:', 2)
342 v9.CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200343
344 lines =<< trim END
Bram Moolenaar30fd8202020-09-26 15:09:30 +0200345 const ll = [2, 3, 4]
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200346 ll[3] = 99
347 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000348 v9.CheckDefExecFailure(lines, 'E1118:', 2)
349 v9.CheckScriptFailure(['vim9script'] + lines, 'E684:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200350
351 lines =<< trim END
Bram Moolenaare0de1712020-12-02 17:36:54 +0100352 const dd = {one: 1, two: 2}
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200353 dd["one"] = 99
354 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000355 v9.CheckDefExecFailure(lines, 'E1121:', 2)
356 v9.CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200357
358 lines =<< trim END
Bram Moolenaare0de1712020-12-02 17:36:54 +0100359 const dd = {one: 1, two: 2}
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200360 dd["three"] = 99
361 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000362 v9.CheckDefExecFailure(lines, 'E1120:')
363 v9.CheckScriptFailure(['vim9script'] + lines, 'E741:', 3)
Bram Moolenaar0b4c66c2020-09-14 21:39:44 +0200364enddef
365
Bram Moolenaardf069ee2020-06-22 23:02:51 +0200366def Test_range_no_colon()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000367 v9.CheckDefFailure(['%s/a/b/'], 'E1050:')
368 v9.CheckDefFailure(['+ s/a/b/'], 'E1050:')
369 v9.CheckDefFailure(['- s/a/b/'], 'E1050:')
370 v9.CheckDefFailure(['. s/a/b/'], 'E1050:')
Bram Moolenaardf069ee2020-06-22 23:02:51 +0200371enddef
372
373
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100374def Test_block()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200375 var outer = 1
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100376 {
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200377 var inner = 2
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100378 assert_equal(1, outer)
379 assert_equal(2, inner)
380 }
381 assert_equal(1, outer)
Bram Moolenaar3f1e9f02021-02-27 22:36:43 +0100382
383 {|echo 'yes'|}
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100384enddef
385
Bram Moolenaar08052222020-09-14 17:04:31 +0200386def Test_block_failure()
Bram Moolenaar62aec932022-01-29 21:45:34 +0000387 v9.CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:')
388 v9.CheckDefFailure(['}'], 'E1025:')
389 v9.CheckDefFailure(['{', 'echo 1'], 'E1026:')
Bram Moolenaar08052222020-09-14 17:04:31 +0200390enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100391
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200392def Test_block_local_vars()
393 var lines =<< trim END
394 vim9script
Bram Moolenaared234f22020-10-15 20:42:20 +0200395 v:testing = 1
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200396 if true
Bram Moolenaared234f22020-10-15 20:42:20 +0200397 var text = ['hello']
398 def SayHello(): list<string>
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200399 return text
400 enddef
401 def SetText(v: string)
Bram Moolenaared234f22020-10-15 20:42:20 +0200402 text = [v]
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200403 enddef
404 endif
405
406 if true
Bram Moolenaared234f22020-10-15 20:42:20 +0200407 var text = ['again']
408 def SayAgain(): list<string>
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200409 return text
410 enddef
411 endif
Bram Moolenaared234f22020-10-15 20:42:20 +0200412
413 # test that the "text" variables are not cleaned up
414 test_garbagecollect_now()
415
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200416 defcompile
417
Bram Moolenaared234f22020-10-15 20:42:20 +0200418 assert_equal(['hello'], SayHello())
419 assert_equal(['again'], SayAgain())
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200420
421 SetText('foobar')
Bram Moolenaared234f22020-10-15 20:42:20 +0200422 assert_equal(['foobar'], SayHello())
423
424 call writefile(['ok'], 'Xdidit')
425 qall!
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200426 END
Bram Moolenaared234f22020-10-15 20:42:20 +0200427
428 # need to execute this with a separate Vim instance to avoid the current
429 # context gets garbage collected.
Bram Moolenaardd674772022-09-15 22:26:18 +0100430 writefile(lines, 'Xscript', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000431 g:RunVim([], [], '-S Xscript')
Bram Moolenaared234f22020-10-15 20:42:20 +0200432 assert_equal(['ok'], readfile('Xdidit'))
433
Bram Moolenaared234f22020-10-15 20:42:20 +0200434 delete('Xdidit')
Bram Moolenaarfbbcd002020-10-15 12:46:44 +0200435enddef
436
Bram Moolenaar39ca4122020-10-20 14:25:07 +0200437def Test_block_local_vars_with_func()
438 var lines =<< trim END
439 vim9script
440 if true
441 var foo = 'foo'
442 if true
443 var bar = 'bar'
444 def Func(): list<string>
445 return [foo, bar]
446 enddef
447 endif
448 endif
449 # function is compiled here, after blocks have finished, can still access
450 # "foo" and "bar"
451 assert_equal(['foo', 'bar'], Func())
452 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000453 v9.CheckScriptSuccess(lines)
Bram Moolenaar39ca4122020-10-20 14:25:07 +0200454enddef
455
Bram Moolenaare4db17f2021-08-01 21:19:43 +0200456" legacy func for command that's defined later
Bram Moolenaar62aec932022-01-29 21:45:34 +0000457func s:InvokeSomeCommand()
Bram Moolenaare4db17f2021-08-01 21:19:43 +0200458 SomeCommand
459endfunc
460
Yegappan Lakshmanane74cad32024-04-12 18:48:35 +0200461def Test_command_block()
Bram Moolenaare4db17f2021-08-01 21:19:43 +0200462 com SomeCommand {
463 g:someVar = 'some'
464 }
465 InvokeSomeCommand()
466 assert_equal('some', g:someVar)
467
468 delcommand SomeCommand
469 unlet g:someVar
470enddef
471
Yegappan Lakshmanane74cad32024-04-12 18:48:35 +0200472" Test for using heredoc in a :command command block
473def Test_command_block_heredoc()
474 var lines =<< trim CODE
475 vim9script
476 com SomeCommand {
477 g:someVar =<< trim END
478 aaa
479 bbb
480 END
481 }
482 SomeCommand
483 assert_equal(['aaa', 'bbb'], g:someVar)
484 def Foo()
485 g:someVar = []
486 SomeCommand
487 assert_equal(['aaa', 'bbb'], g:someVar)
488 enddef
489 Foo()
490 delcommand SomeCommand
491 unlet g:someVar
492 CODE
493 v9.CheckSourceSuccess( lines)
494
495 # Execute a command with heredoc in a block
496 lines =<< trim CODE
497 vim9script
498 com SomeCommand {
499 g:someVar =<< trim END
500 aaa
501 bbb
502 END
503 }
504 execute('SomeCommand')
505 assert_equal(['aaa', 'bbb'], g:someVar)
506 delcommand SomeCommand
507 unlet g:someVar
508 CODE
509 v9.CheckSourceSuccess(lines)
510
zeertzjq1f5175d2024-04-13 17:52:26 +0200511 # Heredoc with comment
512 lines =<< trim CODE
513 vim9script
514 com SomeCommand {
515 g:someVar =<< trim END # comment
516 aaa
517 bbb
518 END
519 }
520 execute('SomeCommand')
521 assert_equal(['aaa', 'bbb'], g:someVar)
522 delcommand SomeCommand
523 unlet g:someVar
524 CODE
525 v9.CheckSourceSuccess(lines)
526
Yegappan Lakshmanane74cad32024-04-12 18:48:35 +0200527 # heredoc evaluation
528 lines =<< trim CODE
529 vim9script
530 com SomeCommand {
531 var suffix = '---'
532 g:someVar =<< trim eval END
533 ccc{suffix}
534 ddd
535 END
536 }
537 SomeCommand
538 assert_equal(['ccc---', 'ddd'], g:someVar)
539 def Foo()
540 g:someVar = []
541 SomeCommand
542 assert_equal(['ccc---', 'ddd'], g:someVar)
543 enddef
544 Foo()
545 delcommand SomeCommand
546 unlet g:someVar
547 CODE
548 v9.CheckSourceSuccess(lines)
549
550 # command following heredoc
551 lines =<< trim CODE
552 vim9script
553 com SomeCommand {
554 var l =<< trim END
555 eee
556 fff
557 END
558 g:someVar = l
559 }
560 SomeCommand
561 assert_equal(['eee', 'fff'], g:someVar)
562 delcommand SomeCommand
563 unlet g:someVar
564 CODE
565 v9.CheckSourceSuccess(lines)
566
567 # Error in heredoc
568 lines =<< trim CODE
569 vim9script
570 com SomeCommand {
571 g:someVar =<< trim END
572 eee
573 fff
574 }
575 try
576 SomeCommand
577 catch
578 assert_match("E990: Missing end marker 'END'", v:exception)
579 endtry
580 delcommand SomeCommand
581 unlet g:someVar
582 CODE
583 v9.CheckSourceSuccess(lines)
584enddef
585
586def Test_autocommand_block()
Bram Moolenaare4db17f2021-08-01 21:19:43 +0200587 au BufNew *.xml {
588 g:otherVar = 'other'
589 }
590 split other.xml
591 assert_equal('other', g:otherVar)
592
593 bwipe!
594 au! BufNew *.xml
595 unlet g:otherVar
596enddef
597
Bram Moolenaard032f342020-07-18 18:13:02 +0200598func g:NoSuchFunc()
599 echo 'none'
600endfunc
601
Bram Moolenaar9e1d9e32021-01-11 20:17:34 +0100602def Test_try_catch_throw()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200603 var l = []
Bram Moolenaar7a092242020-04-16 22:10:49 +0200604 try # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100605 add(l, '1')
606 throw 'wrong'
Bram Moolenaar9d383f32023-05-14 21:38:12 +0100607 add(l, '2') # "unreachable code"
Bram Moolenaar7a092242020-04-16 22:10:49 +0200608 catch # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100609 add(l, v:exception)
Bram Moolenaar7a092242020-04-16 22:10:49 +0200610 finally # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100611 add(l, '3')
Bram Moolenaar7a092242020-04-16 22:10:49 +0200612 endtry # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100613 assert_equal(['1', 'wrong', '3'], l)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200614
Bram Moolenaare8593122020-07-18 15:17:02 +0200615 l = []
616 try
617 try
618 add(l, '1')
619 throw 'wrong'
Bram Moolenaar9d383f32023-05-14 21:38:12 +0100620 add(l, '2') # "unreachable code"
Bram Moolenaare8593122020-07-18 15:17:02 +0200621 catch /right/
622 add(l, v:exception)
623 endtry
624 catch /wrong/
625 add(l, 'caught')
Bram Moolenaar204852a2022-03-05 12:56:44 +0000626 finally
Bram Moolenaare8593122020-07-18 15:17:02 +0200627 add(l, 'finally')
628 endtry
629 assert_equal(['1', 'caught', 'finally'], l)
630
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200631 var n: number
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200632 try
633 n = l[3]
634 catch /E684:/
635 n = 99
636 endtry
637 assert_equal(99, n)
638
Bram Moolenaar69f70502021-01-01 16:10:46 +0100639 var done = 'no'
640 if 0
641 try | catch | endtry
642 else
643 done = 'yes'
644 endif
645 assert_equal('yes', done)
646
647 done = 'no'
648 if 1
649 done = 'yes'
650 else
651 try | catch | endtry
652 done = 'never'
653 endif
654 assert_equal('yes', done)
655
656 if 1
657 else
658 try | catch /pat/ | endtry
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000659 try | catch /pat/
Bram Moolenaar69f70502021-01-01 16:10:46 +0100660 endtry
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000661 try
Bram Moolenaar69f70502021-01-01 16:10:46 +0100662 catch /pat/ | endtry
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000663 try
664 catch /pat/
Bram Moolenaar69f70502021-01-01 16:10:46 +0100665 endtry
666 endif
667
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200668 try
Bram Moolenaarcc673e72020-08-16 17:33:35 +0200669 # string slice returns a string, not a number
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200670 n = g:astring[3]
Bram Moolenaar5e654232020-09-16 15:22:00 +0200671 catch /E1012:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200672 n = 77
673 endtry
674 assert_equal(77, n)
675
676 try
677 n = l[g:astring]
Bram Moolenaar5e654232020-09-16 15:22:00 +0200678 catch /E1012:/
Bram Moolenaar56acb092020-08-16 14:48:19 +0200679 n = 88
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200680 endtry
Bram Moolenaar56acb092020-08-16 14:48:19 +0200681 assert_equal(88, n)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200682
683 try
684 n = s:does_not_exist
685 catch /E121:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200686 n = 111
687 endtry
688 assert_equal(111, n)
689
690 try
691 n = g:does_not_exist
692 catch /E121:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200693 n = 121
694 endtry
695 assert_equal(121, n)
696
Bram Moolenaare0de1712020-12-02 17:36:54 +0100697 var d = {one: 1}
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200698 try
699 n = d[g:astring]
700 catch /E716:/
701 n = 222
702 endtry
703 assert_equal(222, n)
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200704
705 try
706 n = -g:astring
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200707 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200708 n = 233
709 endtry
710 assert_equal(233, n)
711
712 try
713 n = +g:astring
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200714 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200715 n = 244
716 endtry
717 assert_equal(244, n)
718
719 try
720 n = +g:alist
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200721 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200722 n = 255
723 endtry
724 assert_equal(255, n)
725
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200726 var nd: dict<any>
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200727 try
Bram Moolenaar2e5910b2021-02-03 17:41:24 +0100728 nd = {[g:alist]: 1}
729 catch /E1105:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200730 n = 266
731 endtry
732 assert_equal(266, n)
733
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000734 l = [1, 2, 3]
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200735 try
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +0000736 [n] = l
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200737 catch /E1093:/
738 n = 277
739 endtry
740 assert_equal(277, n)
741
Bram Moolenaare8593122020-07-18 15:17:02 +0200742 try
743 &ts = g:astring
Bram Moolenaar5e654232020-09-16 15:22:00 +0200744 catch /E1012:/
Bram Moolenaare8593122020-07-18 15:17:02 +0200745 n = 288
746 endtry
747 assert_equal(288, n)
748
749 try
750 &backspace = 'asdf'
751 catch /E474:/
752 n = 299
753 endtry
754 assert_equal(299, n)
755
756 l = [1]
757 try
758 l[3] = 3
759 catch /E684:/
760 n = 300
761 endtry
762 assert_equal(300, n)
763
764 try
Bram Moolenaare8593122020-07-18 15:17:02 +0200765 unlet g:does_not_exist
766 catch /E108:/
767 n = 322
768 endtry
769 assert_equal(322, n)
770
771 try
Bram Moolenaar2bede172020-11-19 18:53:18 +0100772 d = {text: 1, [g:astring]: 2}
Bram Moolenaare8593122020-07-18 15:17:02 +0200773 catch /E721:/
774 n = 333
775 endtry
776 assert_equal(333, n)
777
778 try
Bram Moolenaar62aec932022-01-29 21:45:34 +0000779 l = g:DeletedFunc()
Bram Moolenaare8593122020-07-18 15:17:02 +0200780 catch /E933:/
781 n = 344
782 endtry
783 assert_equal(344, n)
Bram Moolenaard032f342020-07-18 18:13:02 +0200784
785 try
Yegappan Lakshmanana764e732021-07-25 15:57:32 +0200786 echo range(1, 2, 0)
787 catch /E726:/
Bram Moolenaard032f342020-07-18 18:13:02 +0200788 n = 355
789 endtry
790 assert_equal(355, n)
791
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200792 var P = function('g:NoSuchFunc')
Bram Moolenaard032f342020-07-18 18:13:02 +0200793 delfunc g:NoSuchFunc
794 try
795 echo P()
796 catch /E117:/
797 n = 366
798 endtry
799 assert_equal(366, n)
800
801 try
802 echo g:NoSuchFunc()
803 catch /E117:/
804 n = 377
805 endtry
806 assert_equal(377, n)
807
808 try
809 echo g:alist + 4
810 catch /E745:/
811 n = 388
812 endtry
813 assert_equal(388, n)
814
815 try
816 echo 4 + g:alist
817 catch /E745:/
818 n = 399
819 endtry
820 assert_equal(399, n)
821
822 try
823 echo g:alist.member
824 catch /E715:/
825 n = 400
826 endtry
827 assert_equal(400, n)
828
829 try
830 echo d.member
831 catch /E716:/
832 n = 411
833 endtry
834 assert_equal(411, n)
Bram Moolenaard9d77892021-02-12 21:32:47 +0100835
836 var counter = 0
837 for i in range(4)
838 try
839 eval [][0]
840 catch
841 endtry
842 counter += 1
843 endfor
844 assert_equal(4, counter)
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100845
Bram Moolenaar9fa5dab2021-07-20 19:18:44 +0200846 # no requirement for spaces before |
847 try|echo 0|catch|endtry
848
Bram Moolenaar003312b2021-12-20 10:55:35 +0000849 # return in try with finally
850 def ReturnInTry(): number
851 var ret = 4
852 try
853 return ret
854 catch /this/
855 return -1
856 catch /that/
857 return -1
858 finally
859 # changing ret has no effect
860 ret = 7
861 endtry
862 return -2
863 enddef
864 assert_equal(4, ReturnInTry())
865
866 # return in catch with finally
867 def ReturnInCatch(): number
868 var ret = 5
869 try
870 throw 'getout'
Bram Moolenaar9d383f32023-05-14 21:38:12 +0100871 return -1 # "unreachable code"
Bram Moolenaar003312b2021-12-20 10:55:35 +0000872 catch /getout/
873 # ret is evaluated here
874 return ret
875 finally
876 # changing ret later has no effect
877 ret = -3
878 endtry
879 return -2
880 enddef
881 assert_equal(5, ReturnInCatch())
882
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100883 # return in finally after empty catch
884 def ReturnInFinally(): number
885 try
886 finally
Bram Moolenaar003312b2021-12-20 10:55:35 +0000887 return 6
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100888 endtry
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100889 enddef
Bram Moolenaar003312b2021-12-20 10:55:35 +0000890 assert_equal(6, ReturnInFinally())
Bram Moolenaar8ac681a2021-06-15 20:06:34 +0200891
892 var lines =<< trim END
893 vim9script
894 try
895 acos('0.5')
896 ->setline(1)
897 catch
898 g:caught = v:exception
899 endtry
900 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000901 v9.CheckScriptSuccess(lines)
Yegappan Lakshmanan4490ec42021-07-27 22:00:44 +0200902 assert_match('E1219: Float or Number required for argument 1', g:caught)
Bram Moolenaar8ac681a2021-06-15 20:06:34 +0200903 unlet g:caught
Bram Moolenaar41978282021-07-04 14:47:30 +0200904
905 # missing catch and/or finally
906 lines =<< trim END
907 vim9script
908 try
909 echo 'something'
910 endtry
911 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000912 v9.CheckScriptFailure(lines, 'E1032:')
rbtnn84934992021-08-07 13:26:53 +0200913
914 # skipping try-finally-endtry when try-finally-endtry is used in another block
915 lines =<< trim END
916 if v:true
917 try
918 finally
919 endtry
920 else
921 try
922 finally
923 endtry
924 endif
925 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000926 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100927enddef
928
Bram Moolenaara2c00282023-05-14 22:05:15 +0100929def Test_unreachable_after()
930 var lines =<< trim END
931 try
932 throw 'Error'
933 echo 'not reached'
934 catch /Error/
935 endtry
936 END
937 v9.CheckDefFailure(lines, 'E1095: Unreachable code after :throw')
938
939 lines =<< trim END
940 def SomeFunc(): number
941 try
942 return 3
943 echo 'not reached'
944 catch /Error/
945 endtry
946 return 4
947 enddef
948 defcompile
949 END
950 v9.CheckScriptFailure(lines, 'E1095: Unreachable code after :return')
951enddef
952
Bram Moolenaar3ef2e412023-04-30 18:50:48 +0100953def Test_throw_in_nested_try()
954 var lines =<< trim END
955 vim9script
956
957 def Try(F: func(): void)
958 try
959 F()
960 catch
961 endtry
962 enddef
963
964 class X
965 def F()
966 try
967 throw 'Foobar'
968 catch
969 throw v:exception
970 endtry
971 enddef
972 endclass
973
974 def Test_TryMethod()
975 var x = X.new()
976 Try(() => x.F())
977 enddef
978
979
980 try
981 Test_TryMethod()
982 catch
983 endtry
984 END
985 v9.CheckScriptSuccess(lines)
986enddef
987
Bram Moolenaar28bf6492022-03-03 15:11:20 +0000988def Test_try_var_decl()
989 var lines =<< trim END
990 vim9script
991 try
992 var in_try = 1
993 assert_equal(1, get(s:, 'in_try', -1))
994 throw "getout"
995 catch
996 var in_catch = 2
997 assert_equal(-1, get(s:, 'in_try', -1))
998 assert_equal(2, get(s:, 'in_catch', -1))
999 finally
1000 var in_finally = 3
1001 assert_equal(-1, get(s:, 'in_try', -1))
1002 assert_equal(-1, get(s:, 'in_catch', -1))
1003 assert_equal(3, get(s:, 'in_finally', -1))
1004 endtry
1005 assert_equal(-1, get(s:, 'in_try', -1))
1006 assert_equal(-1, get(s:, 'in_catch', -1))
1007 assert_equal(-1, get(s:, 'in_finally', -1))
1008 END
1009 v9.CheckScriptSuccess(lines)
1010enddef
1011
Bram Moolenaar53c29612022-01-12 16:18:18 +00001012def Test_try_ends_in_return()
1013 var lines =<< trim END
1014 vim9script
1015 def Foo(): string
1016 try
1017 return 'foo'
1018 catch
1019 return 'caught'
1020 endtry
1021 enddef
1022 assert_equal('foo', Foo())
1023 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001024 v9.CheckScriptSuccess(lines)
Bram Moolenaar53c29612022-01-12 16:18:18 +00001025
1026 lines =<< trim END
1027 vim9script
1028 def Foo(): string
1029 try
1030 return 'foo'
1031 catch
1032 return 'caught'
1033 endtry
1034 echo 'notreached'
1035 enddef
1036 assert_equal('foo', Foo())
1037 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001038 v9.CheckScriptFailure(lines, 'E1095:')
Bram Moolenaar53c29612022-01-12 16:18:18 +00001039
1040 lines =<< trim END
1041 vim9script
1042 def Foo(): string
1043 try
1044 return 'foo'
1045 catch /x/
1046 return 'caught'
1047 endtry
1048 enddef
1049 assert_equal('foo', Foo())
1050 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001051 v9.CheckScriptFailure(lines, 'E1027:')
Bram Moolenaar53c29612022-01-12 16:18:18 +00001052
1053 lines =<< trim END
1054 vim9script
1055 def Foo(): string
1056 try
1057 echo 'foo'
1058 catch
1059 echo 'caught'
1060 finally
1061 return 'done'
1062 endtry
1063 enddef
1064 assert_equal('done', Foo())
1065 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001066 v9.CheckScriptSuccess(lines)
Bram Moolenaar53c29612022-01-12 16:18:18 +00001067
1068enddef
1069
Bram Moolenaar3f987b52021-06-30 12:02:24 +02001070def Test_try_in_catch()
1071 var lines =<< trim END
1072 vim9script
1073 var seq = []
1074 def DoIt()
1075 try
1076 seq->add('throw 1')
1077 eval [][0]
1078 seq->add('notreached')
1079 catch
1080 seq->add('catch')
1081 try
1082 seq->add('throw 2')
1083 eval [][0]
1084 seq->add('notreached')
1085 catch /nothing/
1086 seq->add('notreached')
1087 endtry
1088 seq->add('done')
1089 endtry
1090 enddef
1091 DoIt()
1092 assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq)
1093 END
1094enddef
1095
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001096def Test_error_in_catch()
1097 var lines =<< trim END
1098 try
1099 eval [][0]
1100 catch /E684:/
1101 eval [][0]
1102 endtry
1103 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001104 v9.CheckDefExecFailure(lines, 'E684:', 4)
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001105enddef
1106
Bram Moolenaar2e34c342021-03-14 12:13:33 +01001107" :while at the very start of a function that :continue jumps to
Bram Moolenaar62aec932022-01-29 21:45:34 +00001108def s:TryContinueFunc()
Bram Moolenaar2e34c342021-03-14 12:13:33 +01001109 while g:Count < 2
1110 g:sequence ..= 't'
1111 try
1112 echoerr 'Test'
1113 catch
1114 g:Count += 1
1115 g:sequence ..= 'c'
1116 continue
1117 endtry
1118 g:sequence ..= 'e'
1119 g:Count += 1
1120 endwhile
1121enddef
1122
1123def Test_continue_in_try_in_while()
1124 g:Count = 0
1125 g:sequence = ''
1126 TryContinueFunc()
1127 assert_equal('tctc', g:sequence)
1128 unlet g:Count
1129 unlet g:sequence
1130enddef
1131
Bram Moolenaar873f8242022-03-10 21:53:44 +00001132def Test_break_in_try_in_for()
1133 var lines =<< trim END
1134 vim9script
1135 def Ls(): list<string>
1136 var ls: list<string>
1137 for s in ['abc', 'def']
1138 for _ in [123, 456]
1139 try
1140 eval [][0]
1141 catch
1142 break
1143 endtry
1144 endfor
1145 ls += [s]
1146 endfor
1147 return ls
1148 enddef
1149 assert_equal(['abc', 'def'], Ls())
1150 END
1151 v9.CheckScriptSuccess(lines)
1152enddef
1153
Bram Moolenaar9cb577a2021-02-22 22:45:10 +01001154def Test_nocatch_return_in_try()
1155 # return in try block returns normally
1156 def ReturnInTry(): string
1157 try
1158 return '"some message"'
1159 catch
1160 endtry
1161 return 'not reached'
1162 enddef
1163 exe 'echoerr ' .. ReturnInTry()
1164enddef
1165
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001166def Test_cnext_works_in_catch()
1167 var lines =<< trim END
1168 vim9script
Bram Moolenaarc3235272021-07-10 19:42:03 +02001169 au BufEnter * eval 1 + 2
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001170 writefile(['text'], 'Xcncfile1')
1171 writefile(['text'], 'Xcncfile2')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001172 var items = [
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001173 {lnum: 1, filename: 'Xcncfile1', valid: true},
1174 {lnum: 1, filename: 'Xcncfile2', valid: true}
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001175 ]
1176 setqflist([], ' ', {items: items})
1177 cwindow
1178
1179 def CnextOrCfirst()
1180 # if cnext fails, cfirst is used
1181 try
1182 cnext
1183 catch
1184 cfirst
1185 endtry
1186 enddef
1187
1188 CnextOrCfirst()
1189 CnextOrCfirst()
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001190 writefile([getqflist({idx: 0}).idx], 'Xcncresult')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001191 qall
1192 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001193 writefile(lines, 'XCatchCnext', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001194 g:RunVim([], [], '--clean -S XCatchCnext')
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001195 assert_equal(['1'], readfile('Xcncresult'))
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001196
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001197 delete('Xcncfile1')
1198 delete('Xcncfile2')
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001199 delete('Xcncresult')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001200enddef
1201
Bram Moolenaar9e1d9e32021-01-11 20:17:34 +01001202def Test_throw_skipped()
1203 if 0
1204 throw dontgethere
1205 endif
1206enddef
1207
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001208def Test_nocatch_throw_silenced()
1209 var lines =<< trim END
1210 vim9script
1211 def Func()
1212 throw 'error'
1213 enddef
1214 silent! Func()
1215 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001216 writefile(lines, 'XthrowSilenced', 'D')
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001217 source XthrowSilenced
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001218enddef
1219
Bram Moolenaara2c00282023-05-14 22:05:15 +01001220" g:DeletedFunc() is found when compiling Test_try_catch_throw() and then
1221" deleted, this should give a runtime error.
Bram Moolenaare8593122020-07-18 15:17:02 +02001222def DeletedFunc(): list<any>
1223 return ['delete me']
1224enddef
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001225defcompile DeletedFunc
1226
1227call test_override('unreachable', 1)
1228defcompile Test_try_catch_throw
1229call test_override('unreachable', 0)
1230
Bram Moolenaare8593122020-07-18 15:17:02 +02001231delfunc DeletedFunc
1232
Bram Moolenaar62aec932022-01-29 21:45:34 +00001233def s:ThrowFromDef()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001234 throw "getout" # comment
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001235enddef
1236
Bram Moolenaar62aec932022-01-29 21:45:34 +00001237func s:CatchInFunc()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001238 try
Bram Moolenaar62aec932022-01-29 21:45:34 +00001239 call s:ThrowFromDef()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001240 catch
1241 let g:thrown_func = v:exception
1242 endtry
1243endfunc
1244
Bram Moolenaar62aec932022-01-29 21:45:34 +00001245def s:CatchInDef()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001246 try
1247 ThrowFromDef()
1248 catch
1249 g:thrown_def = v:exception
1250 endtry
1251enddef
1252
Bram Moolenaar62aec932022-01-29 21:45:34 +00001253def s:ReturnFinally(): string
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001254 try
1255 return 'intry'
Bram Moolenaar204852a2022-03-05 12:56:44 +00001256 finally
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001257 g:in_finally = 'finally'
1258 endtry
1259 return 'end'
1260enddef
1261
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001262def Test_try_catch_nested()
1263 CatchInFunc()
1264 assert_equal('getout', g:thrown_func)
1265
1266 CatchInDef()
1267 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001268
1269 assert_equal('intry', ReturnFinally())
1270 assert_equal('finally', g:in_finally)
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001271
1272 var l = []
1273 try
1274 l->add('1')
1275 throw 'bad'
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001276 l->add('x') # "unreachable code"
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001277 catch /bad/
1278 l->add('2')
1279 try
1280 l->add('3')
1281 throw 'one'
1282 l->add('x')
1283 catch /one/
1284 l->add('4')
1285 try
1286 l->add('5')
1287 throw 'more'
1288 l->add('x')
1289 catch /more/
1290 l->add('6')
1291 endtry
1292 endtry
1293 endtry
1294 assert_equal(['1', '2', '3', '4', '5', '6'], l)
Bram Moolenaar834193a2021-06-30 20:39:15 +02001295
1296 l = []
1297 try
1298 try
1299 l->add('1')
1300 throw 'foo'
1301 l->add('x')
1302 catch
1303 l->add('2')
1304 throw 'bar'
1305 l->add('x')
1306 finally
1307 l->add('3')
1308 endtry
1309 l->add('x')
1310 catch /bar/
1311 l->add('4')
1312 endtry
1313 assert_equal(['1', '2', '3', '4'], l)
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001314enddef
1315
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001316call test_override('unreachable', 1)
1317defcompile Test_try_catch_nested
1318call test_override('unreachable', 0)
1319
Bram Moolenaar62aec932022-01-29 21:45:34 +00001320def s:TryOne(): number
Bram Moolenaar9939f572020-09-16 22:29:52 +02001321 try
1322 return 0
1323 catch
1324 endtry
1325 return 0
1326enddef
1327
Bram Moolenaar62aec932022-01-29 21:45:34 +00001328def s:TryTwo(n: number): string
Bram Moolenaar9939f572020-09-16 22:29:52 +02001329 try
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001330 var x = {}
Bram Moolenaar9939f572020-09-16 22:29:52 +02001331 catch
1332 endtry
1333 return 'text'
1334enddef
1335
1336def Test_try_catch_twice()
1337 assert_equal('text', TryOne()->TryTwo())
1338enddef
1339
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001340def Test_try_catch_match()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001341 var seq = 'a'
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001342 try
1343 throw 'something'
1344 catch /nothing/
1345 seq ..= 'x'
1346 catch /some/
1347 seq ..= 'b'
1348 catch /asdf/
1349 seq ..= 'x'
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001350 catch ?a\?sdf?
1351 seq ..= 'y'
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001352 finally
1353 seq ..= 'c'
1354 endtry
1355 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001356enddef
1357
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001358def Test_try_catch_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001359 v9.CheckDefFailure(['catch'], 'E603:')
1360 v9.CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1361 v9.CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1362 v9.CheckDefFailure(['finally'], 'E606:')
1363 v9.CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1364 v9.CheckDefFailure(['endtry'], 'E602:')
1365 v9.CheckDefFailure(['while 1', 'endtry'], 'E170:')
1366 v9.CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1367 v9.CheckDefFailure(['if 1', 'endtry'], 'E171:')
1368 v9.CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001369
Bram Moolenaar62aec932022-01-29 21:45:34 +00001370 v9.CheckDefFailure(['throw'], 'E1143:')
1371 v9.CheckDefFailure(['throw xxx'], 'E1001:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001372enddef
1373
Bram Moolenaar7c5b3c0362021-02-14 22:40:57 +01001374def Try_catch_skipped()
1375 var l = []
1376 try
1377 finally
1378 endtry
1379
1380 if 1
1381 else
1382 try
1383 endtry
1384 endif
1385enddef
1386
1387" The skipped try/endtry was updating the wrong instruction.
1388def Test_try_catch_skipped()
1389 var instr = execute('disassemble Try_catch_skipped')
1390 assert_match("NEWLIST size 0\n", instr)
1391enddef
1392
Bram Moolenaar90a57162022-02-12 14:23:17 +00001393def Test_throw_line_number()
1394 def Func()
1395 eval 1 + 1
1396 eval 2 + 2
1397 throw 'exception'
1398 enddef
1399 try
1400 Func()
1401 catch /exception/
1402 assert_match('line 3', v:throwpoint)
1403 endtry
1404enddef
Bram Moolenaar7c5b3c0362021-02-14 22:40:57 +01001405
1406
Bram Moolenaar006ad482020-06-30 20:55:15 +02001407def Test_throw_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001408 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001409 var lines =<< trim END
Bram Moolenaar006ad482020-06-30 20:55:15 +02001410 vim9script
1411 try
1412 throw 'one'
1413 .. 'two'
1414 catch
1415 assert_equal('onetwo', v:exception)
1416 endtry
1417 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001418 v9.CheckScriptSuccess(lines)
Bram Moolenaar1e021e62020-10-16 20:25:23 +02001419
1420 lines =<< trim END
1421 vim9script
Bram Moolenaar352134b2020-10-17 22:04:08 +02001422 @r = ''
Bram Moolenaar1e021e62020-10-16 20:25:23 +02001423 def Func()
1424 throw @r
1425 enddef
1426 var result = ''
1427 try
1428 Func()
1429 catch /E1129:/
1430 result = 'caught'
1431 endtry
1432 assert_equal('caught', result)
1433 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001434 v9.CheckScriptSuccess(lines)
Bram Moolenaar006ad482020-06-30 20:55:15 +02001435enddef
1436
Bram Moolenaared677f52020-08-12 16:38:10 +02001437def Test_error_in_nested_function()
Bram Moolenaar03dfde22021-02-14 13:17:22 +01001438 # an error in a nested :function aborts executing in the calling :def function
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001439 var lines =<< trim END
Bram Moolenaared677f52020-08-12 16:38:10 +02001440 vim9script
1441 def Func()
1442 Error()
1443 g:test_var = 1
1444 enddef
1445 func Error() abort
1446 eval [][0]
1447 endfunc
1448 Func()
1449 END
1450 g:test_var = 0
Bram Moolenaar62aec932022-01-29 21:45:34 +00001451 v9.CheckScriptFailure(lines, 'E684:')
Bram Moolenaared677f52020-08-12 16:38:10 +02001452 assert_equal(0, g:test_var)
1453enddef
1454
Bram Moolenaar227c58a2021-04-28 20:40:44 +02001455def Test_abort_after_error()
1456 var lines =<< trim END
1457 vim9script
1458 while true
1459 echo notfound
1460 endwhile
1461 g:gotthere = true
1462 END
1463 g:gotthere = false
Bram Moolenaar62aec932022-01-29 21:45:34 +00001464 v9.CheckScriptFailure(lines, 'E121:')
Bram Moolenaar227c58a2021-04-28 20:40:44 +02001465 assert_false(g:gotthere)
1466 unlet g:gotthere
1467enddef
1468
Bram Moolenaar37c83712020-06-30 21:18:36 +02001469def Test_cexpr_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001470 # only checks line continuation
Bram Moolenaar37c83712020-06-30 21:18:36 +02001471 set errorformat=File\ %f\ line\ %l
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001472 var lines =<< trim END
Bram Moolenaar37c83712020-06-30 21:18:36 +02001473 vim9script
1474 cexpr 'File'
1475 .. ' someFile' ..
1476 ' line 19'
1477 assert_equal(19, getqflist()[0].lnum)
1478 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001479 v9.CheckScriptSuccess(lines)
Bram Moolenaar397a87a2022-03-20 21:14:15 +00001480
1481 lines =<< trim END
1482 vim9script
1483 def CexprFail()
1484 au QuickfixCmdPre * echo g:doesnotexist
1485 cexpr 'File otherFile line 99'
1486 g:didContinue = 'yes'
1487 enddef
1488 CexprFail()
1489 g:didContinue = 'also'
1490 END
1491 g:didContinue = 'no'
1492 v9.CheckScriptFailure(lines, 'E121: Undefined variable: g:doesnotexist')
1493 assert_equal('no', g:didContinue)
1494 au! QuickfixCmdPre
1495
1496 lines =<< trim END
1497 vim9script
1498 def CexprFail()
1499 cexpr g:aNumber
1500 g:didContinue = 'yes'
1501 enddef
1502 CexprFail()
1503 g:didContinue = 'also'
1504 END
1505 g:aNumber = 123
1506 g:didContinue = 'no'
1507 v9.CheckScriptFailure(lines, 'E777: String or List expected')
1508 assert_equal('no', g:didContinue)
1509 unlet g:didContinue
1510
Bram Moolenaar37c83712020-06-30 21:18:36 +02001511 set errorformat&
1512enddef
1513
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001514def Test_statusline_syntax()
1515 # legacy syntax is used for 'statusline'
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001516 var lines =<< trim END
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001517 vim9script
1518 func g:Status()
1519 return '%{"x" is# "x"}'
1520 endfunc
1521 set laststatus=2 statusline=%!Status()
1522 redrawstatus
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00001523 set laststatus statusline=
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001524 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001525 v9.CheckScriptSuccess(lines)
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001526enddef
1527
Bram Moolenaarb2097502020-07-19 17:17:02 +02001528def Test_list_vimscript()
1529 # checks line continuation and comments
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001530 var lines =<< trim END
Bram Moolenaarb2097502020-07-19 17:17:02 +02001531 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001532 var mylist = [
Bram Moolenaarb2097502020-07-19 17:17:02 +02001533 'one',
1534 # comment
1535 'two', # empty line follows
1536
1537 'three',
1538 ]
1539 assert_equal(['one', 'two', 'three'], mylist)
1540 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001541 v9.CheckScriptSuccess(lines)
Bram Moolenaar66250c92020-08-20 15:02:42 +02001542
1543 # check all lines from heredoc are kept
1544 lines =<< trim END
1545 # comment 1
1546 two
1547 # comment 3
1548
1549 five
1550 # comment 6
1551 END
1552 assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
Bram Moolenaar4bce26b2021-01-22 22:06:56 +01001553
1554 lines =<< trim END
1555 [{
1556 a: 0}]->string()->assert_equal("[{'a': 0}]")
1557 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001558 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarb2097502020-07-19 17:17:02 +02001559enddef
1560
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001561if has('channel')
1562 let someJob = test_null_job()
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001563
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001564 def FuncWithError()
1565 echomsg g:someJob
1566 enddef
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001567
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001568 func Test_convert_emsg_to_exception()
1569 try
1570 call FuncWithError()
1571 catch
1572 call assert_match('Vim:E908:', v:exception)
1573 endtry
1574 endfunc
1575endif
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001576
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001577def Test_vim9script_mix()
1578 var lines =<< trim END
1579 if has(g:feature)
1580 " legacy script
1581 let g:legacy = 1
1582 finish
1583 endif
1584 vim9script
1585 g:legacy = 0
1586 END
1587 g:feature = 'eval'
1588 g:legacy = -1
Bram Moolenaar62aec932022-01-29 21:45:34 +00001589 v9.CheckScriptSuccess(lines)
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001590 assert_equal(1, g:legacy)
1591
1592 g:feature = 'noteval'
1593 g:legacy = -1
Bram Moolenaar62aec932022-01-29 21:45:34 +00001594 v9.CheckScriptSuccess(lines)
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001595 assert_equal(0, g:legacy)
1596enddef
1597
Bram Moolenaar750802b2020-02-23 18:08:33 +01001598def Test_vim9script_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001599 v9.CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
1600 v9.CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +01001601
Bram Moolenaar62aec932022-01-29 21:45:34 +00001602 v9.CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1603 v9.CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
Bram Moolenaarc785b9a2020-06-19 18:34:15 +02001604
Bram Moolenaare2e40752020-09-04 21:18:46 +02001605 assert_fails('vim9script', 'E1038:')
Bram Moolenaar107f7322022-02-06 17:30:41 +00001606 v9.CheckDefFailure(['vim9script'], 'E1038:')
Bram Moolenaar8cbf2492022-02-06 20:28:13 +00001607
1608 # no error when skipping
1609 if has('nothing')
1610 vim9script
1611 endif
Bram Moolenaarc970e422021-03-17 15:03:04 +01001612enddef
1613
Bram Moolenaar6c3843c2021-03-04 12:38:21 +01001614def Test_script_var_shadows_function()
1615 var lines =<< trim END
1616 vim9script
1617 def Func(): number
1618 return 123
1619 enddef
1620 var Func = 1
1621 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001622 v9.CheckScriptFailure(lines, 'E1041:', 5)
Bram Moolenaar6c3843c2021-03-04 12:38:21 +01001623enddef
1624
Bram Moolenaar052ff292021-12-11 13:54:46 +00001625def Test_function_shadows_script_var()
1626 var lines =<< trim END
1627 vim9script
1628 var Func = 1
1629 def Func(): number
1630 return 123
1631 enddef
1632 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001633 v9.CheckScriptFailure(lines, 'E1041:', 3)
Bram Moolenaar052ff292021-12-11 13:54:46 +00001634enddef
1635
Bram Moolenaarc3235272021-07-10 19:42:03 +02001636def Test_script_var_shadows_command()
1637 var lines =<< trim END
1638 var undo = 1
1639 undo = 2
1640 assert_equal(2, undo)
1641 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001642 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc3235272021-07-10 19:42:03 +02001643
1644 lines =<< trim END
1645 var undo = 1
1646 undo
1647 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001648 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaarc3235272021-07-10 19:42:03 +02001649enddef
1650
Bram Moolenaar2ef91562021-12-11 16:14:07 +00001651def Test_vim9script_call_wrong_type()
1652 var lines =<< trim END
1653 vim9script
1654 var Time = 'localtime'
1655 Time()
1656 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001657 v9.CheckScriptFailure(lines, 'E1085:')
Bram Moolenaar2ef91562021-12-11 16:14:07 +00001658enddef
1659
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001660def Test_vim9script_reload_delfunc()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001661 var first_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001662 vim9script
1663 def FuncYes(): string
1664 return 'yes'
1665 enddef
1666 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001667 var withno_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001668 def FuncNo(): string
1669 return 'no'
1670 enddef
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001671 def g:DoCheck(no_exists: bool)
1672 assert_equal('yes', FuncYes())
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001673 assert_equal('no', FuncNo())
1674 enddef
1675 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001676 var nono_lines =<< trim END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001677 def g:DoCheck(no_exists: bool)
1678 assert_equal('yes', FuncYes())
Bram Moolenaar44d66522020-09-06 22:26:57 +02001679 assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001680 enddef
1681 END
1682
1683 # FuncNo() is defined
Bram Moolenaardd674772022-09-15 22:26:18 +01001684 writefile(first_lines + withno_lines, 'Xreloaded.vim', 'D')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001685 source Xreloaded.vim
1686 g:DoCheck(true)
1687
1688 # FuncNo() is not redefined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001689 writefile(first_lines + nono_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001690 source Xreloaded.vim
Bram Moolenaar50824712020-12-20 21:10:17 +01001691 g:DoCheck(false)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001692
1693 # FuncNo() is back
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001694 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001695 source Xreloaded.vim
Bram Moolenaar50824712020-12-20 21:10:17 +01001696 g:DoCheck(false)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001697enddef
1698
Bram Moolenaar89483d42020-05-10 15:24:44 +02001699def Test_vim9script_reload_delvar()
1700 # write the script with a script-local variable
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001701 var lines =<< trim END
Bram Moolenaar89483d42020-05-10 15:24:44 +02001702 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001703 var name = 'string'
Bram Moolenaar89483d42020-05-10 15:24:44 +02001704 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001705 writefile(lines, 'XreloadVar.vim', 'D')
Bram Moolenaar89483d42020-05-10 15:24:44 +02001706 source XreloadVar.vim
1707
1708 # now write the script using the same variable locally - works
1709 lines =<< trim END
1710 vim9script
1711 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001712 var name = 'string'
Bram Moolenaar89483d42020-05-10 15:24:44 +02001713 enddef
1714 END
1715 writefile(lines, 'XreloadVar.vim')
1716 source XreloadVar.vim
Bram Moolenaar89483d42020-05-10 15:24:44 +02001717enddef
1718
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001719def Test_func_redefine_error()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001720 var lines = [
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001721 'vim9script',
1722 'def Func()',
1723 ' eval [][0]',
1724 'enddef',
1725 'Func()',
1726 ]
Bram Moolenaardd674772022-09-15 22:26:18 +01001727 writefile(lines, 'Xtestscript.vim', 'D')
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001728
1729 for count in range(3)
1730 try
1731 source Xtestscript.vim
1732 catch /E684/
1733 # function name should contain <SNR> every time
Bram Moolenaarec892232022-05-06 17:53:06 +01001734 assert_match('E684: List index out of range', v:exception)
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001735 assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1736 endtry
1737 endfor
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001738enddef
1739
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001740def Test_func_redefine_fails()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001741 var lines =<< trim END
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001742 vim9script
1743 def Func()
1744 echo 'one'
1745 enddef
1746 def Func()
1747 echo 'two'
1748 enddef
1749 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001750 v9.CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001751
1752 lines =<< trim END
1753 vim9script
1754 def Foo(): string
1755 return 'foo'
Bram Moolenaar052ff292021-12-11 13:54:46 +00001756 enddef
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001757 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001758 var Foo = {-> 'lambda'}
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001759 enddef
1760 defcompile
1761 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001762 v9.CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001763enddef
1764
Bram Moolenaar91c7cbf2022-08-18 13:28:31 +01001765def Test_lambda_split()
1766 # this was using freed memory, because of the split expression
1767 var lines =<< trim END
1768 vim9script
1769 try
1770 0
1771 0->(0
1772 ->a.0(
1773 ->u
1774 END
1775 v9.CheckScriptFailure(lines, 'E1050:')
1776enddef
1777
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001778def Test_fixed_size_list()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001779 # will be allocated as one piece of memory, check that changes work
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001780 var l = [1, 2, 3, 4]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001781 l->remove(0)
1782 l->add(5)
1783 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001784 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001785enddef
1786
Bram Moolenaarae616492020-07-28 20:07:27 +02001787def Test_no_insert_xit()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001788 v9.CheckDefExecFailure(['a = 1'], 'E1100:')
1789 v9.CheckDefExecFailure(['c = 1'], 'E1100:')
1790 v9.CheckDefExecFailure(['i = 1'], 'E1100:')
1791 v9.CheckDefExecFailure(['t = 1'], 'E1100:')
1792 v9.CheckDefExecFailure(['x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02001793
Bram Moolenaar62aec932022-01-29 21:45:34 +00001794 v9.CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1795 v9.CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1796 v9.CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1797 v9.CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1798 v9.CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1799 v9.CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1800 v9.CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
1801 v9.CheckScriptFailure(['vim9script', 'o'], 'E1100:')
1802 v9.CheckScriptFailure(['vim9script', 't'], 'E1100:')
1803 v9.CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1804 v9.CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02001805enddef
1806
Bram Moolenaar62aec932022-01-29 21:45:34 +00001807def s:IfElse(what: number): string
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001808 var res = ''
Bram Moolenaar158906c2020-02-06 20:39:45 +01001809 if what == 1
1810 res = "one"
1811 elseif what == 2
1812 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001813 else
Bram Moolenaar158906c2020-02-06 20:39:45 +01001814 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001815 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +01001816 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001817enddef
1818
Bram Moolenaar158906c2020-02-06 20:39:45 +01001819def Test_if_elseif_else()
1820 assert_equal('one', IfElse(1))
1821 assert_equal('two', IfElse(2))
1822 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001823enddef
1824
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001825def Test_if_elseif_else_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001826 v9.CheckDefFailure(['elseif true'], 'E582:')
1827 v9.CheckDefFailure(['else'], 'E581:')
1828 v9.CheckDefFailure(['endif'], 'E580:')
1829 v9.CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
1830 v9.CheckDefFailure(['if true', 'echo 1'], 'E171:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01001831
1832 var lines =<< trim END
1833 var s = ''
1834 if s = ''
1835 endif
1836 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001837 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01001838
1839 lines =<< trim END
1840 var s = ''
1841 if s == ''
1842 elseif s = ''
1843 endif
1844 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001845 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaarfa010cd2022-04-03 16:13:07 +01001846
1847 lines =<< trim END
1848 var cond = true
1849 if cond
1850 echo 'true'
1851 elseif
1852 echo 'false'
1853 endif
1854 END
1855 v9.CheckDefAndScriptFailure(lines, ['E1143:', 'E15:'], 4)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001856enddef
1857
Bram Moolenaar505ed0c2022-05-05 17:02:46 +01001858def Test_if_else_func_using_var()
1859 var lines =<< trim END
1860 vim9script
1861
1862 const debug = true
1863 if debug
1864 var mode_chars = 'something'
1865 def Bits2Ascii()
1866 var x = mode_chars
1867 g:where = 'in true'
1868 enddef
1869 else
1870 def Bits2Ascii()
1871 g:where = 'in false'
1872 enddef
1873 endif
1874
1875 Bits2Ascii()
1876 END
1877 v9.CheckScriptSuccess(lines)
1878 assert_equal('in true', g:where)
1879 unlet g:where
1880
1881 lines =<< trim END
1882 vim9script
1883
1884 const debug = false
1885 if debug
1886 var mode_chars = 'something'
1887 def Bits2Ascii()
1888 g:where = 'in true'
1889 enddef
1890 else
1891 def Bits2Ascii()
1892 var x = mode_chars
1893 g:where = 'in false'
1894 enddef
1895 endif
1896
1897 Bits2Ascii()
1898 END
1899 v9.CheckScriptFailure(lines, 'E1001: Variable not found: mode_chars')
1900enddef
1901
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001902let g:bool_true = v:true
1903let g:bool_false = v:false
1904
1905def Test_if_const_expr()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001906 var res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001907 if true ? true : false
1908 res = true
1909 endif
1910 assert_equal(true, res)
1911
Bram Moolenaar585fea72020-04-02 22:33:21 +02001912 g:glob = 2
1913 if false
Bram Moolenaar67979662020-06-20 22:50:47 +02001914 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001915 endif
1916 assert_equal(2, g:glob)
1917 if true
Bram Moolenaar67979662020-06-20 22:50:47 +02001918 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001919 endif
1920 assert_equal(3, g:glob)
1921
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001922 res = false
1923 if g:bool_true ? true : false
1924 res = true
1925 endif
1926 assert_equal(true, res)
1927
1928 res = false
1929 if true ? g:bool_true : false
1930 res = true
1931 endif
1932 assert_equal(true, res)
1933
1934 res = false
1935 if true ? true : g:bool_false
1936 res = true
1937 endif
1938 assert_equal(true, res)
1939
1940 res = false
1941 if true ? false : true
1942 res = true
1943 endif
1944 assert_equal(false, res)
1945
1946 res = false
1947 if false ? false : true
1948 res = true
1949 endif
1950 assert_equal(true, res)
1951
1952 res = false
1953 if false ? true : false
1954 res = true
1955 endif
1956 assert_equal(false, res)
1957
1958 res = false
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001959 if has('xyz') ? true : false
1960 res = true
1961 endif
1962 assert_equal(false, res)
1963
1964 res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001965 if true && true
1966 res = true
1967 endif
1968 assert_equal(true, res)
1969
1970 res = false
1971 if true && false
1972 res = true
1973 endif
1974 assert_equal(false, res)
1975
1976 res = false
1977 if g:bool_true && false
1978 res = true
1979 endif
1980 assert_equal(false, res)
1981
1982 res = false
1983 if true && g:bool_false
1984 res = true
1985 endif
1986 assert_equal(false, res)
1987
1988 res = false
1989 if false && false
1990 res = true
1991 endif
1992 assert_equal(false, res)
1993
1994 res = false
1995 if true || false
1996 res = true
1997 endif
1998 assert_equal(true, res)
1999
2000 res = false
2001 if g:bool_true || false
2002 res = true
2003 endif
2004 assert_equal(true, res)
2005
2006 res = false
2007 if true || g:bool_false
2008 res = true
2009 endif
2010 assert_equal(true, res)
2011
2012 res = false
2013 if false || false
2014 res = true
2015 endif
2016 assert_equal(false, res)
Bram Moolenaar3988f642020-08-27 22:43:03 +02002017
2018 # with constant "false" expression may be invalid so long as the syntax is OK
Bram Moolenaarc3235272021-07-10 19:42:03 +02002019 if false | eval 1 + 2 | endif
Bram Moolenaar3988f642020-08-27 22:43:03 +02002020 if false | eval burp + 234 | endif
2021 if false | echo burp 234 'asd' | endif
2022 if false
2023 burp
2024 endif
Bram Moolenaare525bdd2021-08-07 18:12:40 +02002025
Bram Moolenaar21ebb082022-02-04 21:58:58 +00002026 if 0
2027 if 1
2028 echo nothing
2029 elseif 1
2030 echo still nothing
2031 endif
2032 endif
2033
Bram Moolenaare525bdd2021-08-07 18:12:40 +02002034 # expression with line breaks skipped
2035 if false
2036 ('aaa'
2037 .. 'bbb'
2038 .. 'ccc'
2039 )->setline(1)
2040 endif
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02002041enddef
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002042
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02002043def Test_if_const_expr_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00002044 v9.CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2045 v9.CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2046 v9.CheckDefFailure(["if has('aaa'"], 'E110:')
2047 v9.CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002048enddef
2049
Bram Moolenaar62aec932022-01-29 21:45:34 +00002050def s:RunNested(i: number): number
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002051 var x: number = 0
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002052 if i % 2
2053 if 1
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002054 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002055 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002056 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002057 endif
2058 x += 1
2059 else
2060 x += 1000
2061 endif
2062 return x
2063enddef
2064
2065def Test_nested_if()
2066 assert_equal(1, RunNested(1))
2067 assert_equal(1000, RunNested(2))
2068enddef
2069
Bram Moolenaarad39c092020-02-26 18:23:43 +01002070def Test_execute_cmd()
Bram Moolenaare4984292020-12-13 14:19:25 +01002071 # missing argument is ignored
2072 execute
2073 execute # comment
2074
Bram Moolenaarad39c092020-02-26 18:23:43 +01002075 new
2076 setline(1, 'default')
Bram Moolenaard2c61702020-09-06 15:58:36 +02002077 execute 'setline(1, "execute-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002078 assert_equal('execute-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002079
Bram Moolenaard2c61702020-09-06 15:58:36 +02002080 execute "setline(1, 'execute-string')"
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002081 assert_equal('execute-string', getline(1))
2082
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002083 var cmd1 = 'setline(1,'
2084 var cmd2 = '"execute-var")'
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002085 execute cmd1 cmd2 # comment
Bram Moolenaarad39c092020-02-26 18:23:43 +01002086 assert_equal('execute-var', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002087
Bram Moolenaard2c61702020-09-06 15:58:36 +02002088 execute cmd1 cmd2 '|setline(1, "execute-var-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002089 assert_equal('execute-var-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002090
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002091 var cmd_first = 'call '
2092 var cmd_last = 'setline(1, "execute-var-var")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002093 execute cmd_first .. cmd_last
2094 assert_equal('execute-var-var', getline(1))
2095 bwipe!
Bram Moolenaar585fea72020-04-02 22:33:21 +02002096
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002097 var n = true
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02002098 execute 'echomsg' (n ? '"true"' : '"no"')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002099 assert_match('^true$', g:Screenline(&lines))
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02002100
Bram Moolenaare0de1712020-12-02 17:36:54 +01002101 echomsg [1, 2, 3] {a: 1, b: 2}
Bram Moolenaar62aec932022-01-29 21:45:34 +00002102 assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', g:Screenline(&lines))
Bram Moolenaare5abf7a2020-08-16 18:29:35 +02002103
Bram Moolenaar62aec932022-01-29 21:45:34 +00002104 v9.CheckDefFailure(['execute xxx'], 'E1001:', 1)
2105 v9.CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2106 v9.CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
Bram Moolenaar0c7f2612022-02-17 19:44:07 +00002107 if has('channel')
2108 v9.CheckDefExecFailure(['execute test_null_channel()'], 'E908:', 1)
2109 endif
Bram Moolenaarad39c092020-02-26 18:23:43 +01002110enddef
2111
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002112def Test_execute_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002113 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002114 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002115 vim9script
2116 execute 'g:someVar'
2117 .. ' = ' ..
2118 '28'
2119 assert_equal(28, g:someVar)
2120 unlet g:someVar
2121 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002122 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002123enddef
2124
Bram Moolenaar43216612022-03-25 11:16:28 +00002125def Test_execute_finish()
2126 # the empty lines are relevant here
2127 var lines =<< trim END
2128 vim9script
2129
2130 var vname = "g:hello"
2131
2132 if exists(vname) | finish | endif | execute vname '= "world"'
2133
2134 assert_equal('world', g:hello)
2135
2136 if exists(vname) | finish | endif | execute vname '= "world"'
2137
2138 assert_report('should not be reached')
2139 END
2140 v9.CheckScriptSuccess(lines)
2141enddef
2142
Bram Moolenaarad39c092020-02-26 18:23:43 +01002143def Test_echo_cmd()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002144 echo 'some' # comment
Bram Moolenaar585fea72020-04-02 22:33:21 +02002145 echon 'thing'
Bram Moolenaar62aec932022-01-29 21:45:34 +00002146 assert_match('^something$', g:Screenline(&lines))
Bram Moolenaarad39c092020-02-26 18:23:43 +01002147
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002148 echo "some" # comment
2149 echon "thing"
Bram Moolenaar62aec932022-01-29 21:45:34 +00002150 assert_match('^something$', g:Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002151
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002152 var str1 = 'some'
2153 var str2 = 'more'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002154 echo str1 str2
Bram Moolenaar62aec932022-01-29 21:45:34 +00002155 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002156
Bram Moolenaar397a87a2022-03-20 21:14:15 +00002157 echo "one\ntwo"
2158 assert_match('^one$', g:Screenline(&lines - 1))
2159 assert_match('^two$', g:Screenline(&lines))
2160
Bram Moolenaar62aec932022-01-29 21:45:34 +00002161 v9.CheckDefFailure(['echo "xxx"# comment'], 'E488:')
Bram Moolenaarad39c092020-02-26 18:23:43 +01002162enddef
2163
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002164def Test_echomsg_cmd()
2165 echomsg 'some' 'more' # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00002166 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002167 echo 'clear'
Bram Moolenaardf069ee2020-06-22 23:02:51 +02002168 :1messages
Bram Moolenaar62aec932022-01-29 21:45:34 +00002169 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002170
Bram Moolenaar62aec932022-01-29 21:45:34 +00002171 v9.CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002172enddef
2173
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002174def Test_echomsg_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002175 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002176 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002177 vim9script
2178 echomsg 'here'
2179 .. ' is ' ..
2180 'a message'
Bram Moolenaar62aec932022-01-29 21:45:34 +00002181 assert_match('^here is a message$', g:Screenline(&lines))
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002182 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002183 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002184enddef
2185
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002186def Test_echoerr_cmd()
Bram Moolenaar7de62622021-08-07 15:05:47 +02002187 var local = 'local'
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002188 try
Bram Moolenaar7de62622021-08-07 15:05:47 +02002189 echoerr 'something' local 'wrong' # comment
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002190 catch
Bram Moolenaar7de62622021-08-07 15:05:47 +02002191 assert_match('something local wrong', v:exception)
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002192 endtry
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002193enddef
2194
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002195def Test_echoerr_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002196 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002197 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002198 vim9script
2199 try
2200 echoerr 'this'
2201 .. ' is ' ..
2202 'wrong'
2203 catch
2204 assert_match('this is wrong', v:exception)
2205 endtry
2206 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002207 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002208enddef
2209
Bram Moolenaar7de62622021-08-07 15:05:47 +02002210def Test_echoconsole_cmd()
2211 var local = 'local'
2212 echoconsole 'something' local # comment
2213 # output goes anywhere
2214enddef
2215
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002216def Test_echowindow_cmd()
2217 var local = 'local'
2218 echowindow 'something' local # comment
Bram Moolenaar2435adf2022-10-21 12:05:46 +01002219
2220 # with modifier
2221 unsilent echowin 'loud'
2222
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002223 # output goes in message window
2224 popup_clear()
2225enddef
2226
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002227def Test_for_outside_of_function()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002228 var lines =<< trim END
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002229 vim9script
2230 new
2231 for var in range(0, 3)
2232 append(line('$'), var)
2233 endfor
2234 assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
2235 bwipe!
Bram Moolenaar522eefd2021-03-26 18:49:22 +01002236
2237 var result = ''
2238 for i in [1, 2, 3]
2239 var loop = ' loop ' .. i
2240 result ..= loop
2241 endfor
2242 assert_equal(' loop 1 loop 2 loop 3', result)
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002243 END
Bram Moolenaardd674772022-09-15 22:26:18 +01002244 writefile(lines, 'Xvim9for.vim', 'D')
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002245 source Xvim9for.vim
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002246enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002247
rbtnnbebf0692021-08-21 17:26:50 +02002248def Test_for_skipped_block()
2249 # test skipped blocks at outside of function
2250 var lines =<< trim END
2251 var result = []
2252 if true
2253 for n in [1, 2]
2254 result += [n]
2255 endfor
2256 else
2257 for n in [3, 4]
2258 result += [n]
2259 endfor
2260 endif
2261 assert_equal([1, 2], result)
2262
2263 result = []
2264 if false
2265 for n in [1, 2]
2266 result += [n]
2267 endfor
2268 else
2269 for n in [3, 4]
2270 result += [n]
2271 endfor
2272 endif
2273 assert_equal([3, 4], result)
2274 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002275 v9.CheckDefAndScriptSuccess(lines)
rbtnnbebf0692021-08-21 17:26:50 +02002276
2277 # test skipped blocks at inside of function
2278 lines =<< trim END
2279 def DefTrue()
2280 var result = []
2281 if true
2282 for n in [1, 2]
2283 result += [n]
2284 endfor
2285 else
2286 for n in [3, 4]
2287 result += [n]
2288 endfor
2289 endif
2290 assert_equal([1, 2], result)
2291 enddef
2292 DefTrue()
2293
2294 def DefFalse()
2295 var result = []
2296 if false
2297 for n in [1, 2]
2298 result += [n]
2299 endfor
2300 else
2301 for n in [3, 4]
2302 result += [n]
2303 endfor
2304 endif
2305 assert_equal([3, 4], result)
2306 enddef
2307 DefFalse()
Bram Moolenaar97f8c102022-04-02 19:43:57 +01002308
2309 def BuildDiagrams()
2310 var diagrams: list<any>
2311 if false
2312 var max = 0
2313 for v in diagrams
2314 var l = 3
2315 if max < l | max = l | endif
2316 v->add(l)
2317 endfor
2318 endif
2319 enddef
2320 BuildDiagrams()
rbtnnbebf0692021-08-21 17:26:50 +02002321 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002322 v9.CheckDefAndScriptSuccess(lines)
rbtnnbebf0692021-08-21 17:26:50 +02002323enddef
2324
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002325def Test_skipped_redir()
2326 var lines =<< trim END
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002327 def Tredir()
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002328 if 0
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002329 redir => l[0]
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002330 redir END
2331 endif
2332 enddef
2333 defcompile
2334 END
2335 v9.CheckScriptSuccess(lines)
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002336 delfunc g:Tredir
2337
2338 lines =<< trim END
2339 def Tredir()
2340 if 0
2341 redir => l[0]
2342 endif
2343 echo 'executed'
2344 if 0
2345 redir END
2346 endif
2347 enddef
2348 defcompile
2349 END
2350 v9.CheckScriptSuccess(lines)
2351 delfunc g:Tredir
2352
2353 lines =<< trim END
2354 def Tredir()
2355 var l = ['']
2356 if 1
2357 redir => l[0]
2358 endif
2359 echo 'executed'
2360 if 0
2361 redir END
2362 else
2363 redir END
2364 endif
2365 enddef
2366 defcompile
2367 END
2368 v9.CheckScriptSuccess(lines)
2369 delfunc g:Tredir
2370
2371 lines =<< trim END
2372 let doit = 1
2373 def Tredir()
2374 var l = ['']
2375 if g:doit
2376 redir => l[0]
2377 endif
2378 echo 'executed'
2379 if g:doit
2380 redir END
2381 endif
2382 enddef
2383 defcompile
2384 END
2385 v9.CheckScriptSuccess(lines)
2386 delfunc g:Tredir
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002387enddef
2388
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002389def Test_for_loop()
Bram Moolenaarf2253962021-04-13 20:53:13 +02002390 var lines =<< trim END
2391 var result = ''
2392 for cnt in range(7)
2393 if cnt == 4
2394 break
2395 endif
2396 if cnt == 2
2397 continue
2398 endif
2399 result ..= cnt .. '_'
2400 endfor
2401 assert_equal('0_1_3_', result)
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02002402
Bram Moolenaarf2253962021-04-13 20:53:13 +02002403 var concat = ''
2404 for str in eval('["one", "two"]')
2405 concat ..= str
2406 endfor
2407 assert_equal('onetwo', concat)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002408
Bram Moolenaarf2253962021-04-13 20:53:13 +02002409 var total = 0
2410 for nr in
2411 [1, 2, 3]
2412 total += nr
2413 endfor
2414 assert_equal(6, total)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002415
Bram Moolenaarf2253962021-04-13 20:53:13 +02002416 total = 0
2417 for nr
2418 in [1, 2, 3]
2419 total += nr
2420 endfor
2421 assert_equal(6, total)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002422
Bram Moolenaarf2253962021-04-13 20:53:13 +02002423 total = 0
2424 for nr
2425 in
2426 [1, 2, 3]
2427 total += nr
2428 endfor
2429 assert_equal(6, total)
Bram Moolenaar036d0712021-01-17 20:23:38 +01002430
Bram Moolenaara3589a02021-04-14 13:30:46 +02002431 # with type
2432 total = 0
2433 for n: number in [1, 2, 3]
2434 total += n
2435 endfor
2436 assert_equal(6, total)
2437
Bram Moolenaarefd73ae2022-03-20 18:51:00 +00002438 total = 0
2439 for b in 0z010203
2440 total += b
2441 endfor
2442 assert_equal(6, total)
2443
Bram Moolenaarfe090eb2021-04-15 21:48:32 +02002444 var chars = ''
2445 for s: string in 'foobar'
2446 chars ..= s
2447 endfor
2448 assert_equal('foobar', chars)
2449
Bram Moolenaar5ede5b22021-07-07 21:55:25 +02002450 chars = ''
2451 for x: string in {a: 'a', b: 'b'}->values()
2452 chars ..= x
2453 endfor
2454 assert_equal('ab', chars)
2455
Bram Moolenaara3589a02021-04-14 13:30:46 +02002456 # unpack with type
Bram Moolenaarf2253962021-04-13 20:53:13 +02002457 var res = ''
Bram Moolenaara3589a02021-04-14 13:30:46 +02002458 for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2459 res ..= n .. s
2460 endfor
2461 assert_equal('1a2b', res)
2462
Bram Moolenaar444d8782021-06-26 12:40:56 +02002463 # unpack with one var
2464 var reslist = []
2465 for [x] in [['aaa'], ['bbb']]
2466 reslist->add(x)
2467 endfor
2468 assert_equal(['aaa', 'bbb'], reslist)
2469
Bram Moolenaara3589a02021-04-14 13:30:46 +02002470 # loop over string
2471 res = ''
Bram Moolenaarf2253962021-04-13 20:53:13 +02002472 for c in 'aéc̀d'
2473 res ..= c .. '-'
2474 endfor
2475 assert_equal('a-é-c̀-d-', res)
2476
2477 res = ''
2478 for c in ''
2479 res ..= c .. '-'
2480 endfor
2481 assert_equal('', res)
2482
2483 res = ''
2484 for c in test_null_string()
2485 res ..= c .. '-'
2486 endfor
2487 assert_equal('', res)
2488
Bram Moolenaar10611952022-04-03 21:11:34 +01002489 total = 0
2490 for c in null_list
2491 total += 1
2492 endfor
2493 assert_equal(0, total)
2494
2495 for c in null_blob
2496 total += 1
2497 endfor
2498 assert_equal(0, total)
2499
Bram Moolenaarf2253962021-04-13 20:53:13 +02002500 var foo: list<dict<any>> = [
2501 {a: 'Cat'}
2502 ]
2503 for dd in foo
2504 dd.counter = 12
2505 endfor
2506 assert_equal([{a: 'Cat', counter: 12}], foo)
Bram Moolenaarad2d4962021-07-18 17:08:50 +02002507
2508 reslist = []
2509 for _ in range(3)
2510 reslist->add('x')
2511 endfor
2512 assert_equal(['x', 'x', 'x'], reslist)
Yegappan Lakshmanan4776e642024-05-19 09:06:50 +02002513
2514 # Test for trying to use the loop variable "_" inside the loop
2515 for _ in "a"
2516 assert_fails('echo _', 'E1181: Cannot use an underscore here')
2517 endfor
Bram Moolenaarf2253962021-04-13 20:53:13 +02002518 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002519 v9.CheckDefAndScriptSuccess(lines)
Yegappan Lakshmananfe424d12024-05-17 18:20:43 +02002520
2521 lines =<< trim END
2522 for i : number : [1, 2]
2523 echo i
2524 endfor
2525 END
2526 v9.CheckSourceDefAndScriptFailure(lines, 'E1059: No white space allowed before colon: : [1, 2]', 1)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002527enddef
2528
Bram Moolenaar159b2d52022-10-11 21:41:25 +01002529def Test_for_loop_list_of_lists()
2530 # loop variable is final, not const
2531 var lines =<< trim END
2532 # Filter out all odd numbers in each sublist
2533 var list: list<list<number>> = [[1], [1, 2], [1, 2, 3], [1, 2, 3, 4]]
2534 for i in list
2535 filter(i, (_, n: number): bool => n % 2 == 0)
2536 endfor
2537
2538 assert_equal([[], [2], [2], [2, 4]], list)
2539 END
2540 v9.CheckDefAndScriptSuccess(lines)
2541enddef
2542
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002543def Test_for_loop_with_closure()
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002544 # using the loop variable in a closure results in the last used value
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002545 var lines =<< trim END
2546 var flist: list<func>
2547 for i in range(5)
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002548 flist[i] = () => i
2549 endfor
2550 for i in range(5)
2551 assert_equal(4, flist[i]())
2552 endfor
2553 END
2554 v9.CheckDefAndScriptSuccess(lines)
2555
Bram Moolenaardd674772022-09-15 22:26:18 +01002556 # also works when the loop variable is used only once halfway the loops
2557 lines =<< trim END
2558 var Clo: func
2559 for i in range(5)
2560 if i == 3
2561 Clo = () => i
2562 endif
2563 endfor
2564 assert_equal(4, Clo())
2565 END
2566 v9.CheckDefAndScriptSuccess(lines)
2567
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002568 # using a local variable set to the loop variable in a closure results in the
2569 # value at that moment
2570 lines =<< trim END
2571 var flist: list<func>
2572 for i in range(5)
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002573 var inloop = i
2574 flist[i] = () => inloop
2575 endfor
2576 for i in range(5)
Bram Moolenaar353b68a2022-09-13 21:10:45 +01002577 assert_equal(i, flist[i]())
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002578 endfor
2579 END
Bram Moolenaar0cdfb7c2022-09-17 15:44:52 +01002580 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002581
Bram Moolenaara275f2c2022-10-11 20:04:09 +01002582 # also with an extra block level
2583 lines =<< trim END
2584 var flist: list<func>
2585 for i in range(5)
2586 {
2587 var inloop = i
2588 flist[i] = () => inloop
2589 }
2590 endfor
2591 for i in range(5)
2592 assert_equal(i, flist[i]())
2593 endfor
2594 END
2595 v9.CheckDefAndScriptSuccess(lines)
2596
2597 # and declaration in higher block
2598 lines =<< trim END
2599 var flist: list<func>
2600 for i in range(5)
2601 var inloop = i
2602 {
2603 flist[i] = () => inloop
2604 }
2605 endfor
2606 for i in range(5)
2607 assert_equal(i, flist[i]())
2608 endfor
2609 END
2610 v9.CheckDefAndScriptSuccess(lines)
2611
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002612 lines =<< trim END
2613 var flist: list<func>
2614 for i in range(5)
2615 var inloop = i
2616 flist[i] = () => {
2617 return inloop
2618 }
2619 endfor
2620 for i in range(5)
Bram Moolenaar353b68a2022-09-13 21:10:45 +01002621 assert_equal(i, flist[i]())
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002622 endfor
2623 END
Bram Moolenaar0cdfb7c2022-09-17 15:44:52 +01002624 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaardbbb02b2022-09-18 12:00:21 +01002625
2626 # Also works for a nested loop
2627 lines =<< trim END
2628 var flist: list<func>
2629 var n = 0
2630 for i in range(3)
2631 var ii = i
2632 for a in ['a', 'b', 'c']
2633 var aa = a
2634 flist[n] = () => ii .. aa
2635 ++n
2636 endfor
2637 endfor
2638
2639 n = 0
2640 for i in range(3)
2641 for a in ['a', 'b', 'c']
2642 assert_equal(i .. a, flist[n]())
2643 ++n
2644 endfor
2645 endfor
2646 END
Bram Moolenaarcc341812022-09-19 15:54:34 +01002647 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaare8e369a2022-09-21 18:59:14 +01002648
2649 # using two loop variables
2650 lines =<< trim END
2651 var lv_list: list<func>
2652 var copy_list: list<func>
2653 for [idx, c] in items('word')
2654 var lidx = idx
2655 var lc = c
2656 lv_list[idx] = () => {
2657 return idx .. c
2658 }
2659 copy_list[idx] = () => {
2660 return lidx .. lc
2661 }
2662 endfor
2663 for [i, c] in items('word')
2664 assert_equal(3 .. 'd', lv_list[i]())
2665 assert_equal(i .. c, copy_list[i]())
2666 endfor
2667 END
2668 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarcc341812022-09-19 15:54:34 +01002669enddef
2670
2671def Test_define_global_closure_in_loops()
2672 var lines =<< trim END
2673 vim9script
2674
2675 def Func()
2676 for i in range(3)
2677 var ii = i
2678 for a in ['a', 'b', 'c']
2679 var aa = a
2680 if ii == 0 && aa == 'a'
2681 def g:Global_0a(): string
2682 return ii .. aa
2683 enddef
2684 endif
2685 if ii == 1 && aa == 'b'
2686 def g:Global_1b(): string
2687 return ii .. aa
2688 enddef
2689 endif
2690 if ii == 2 && aa == 'c'
2691 def g:Global_2c(): string
2692 return ii .. aa
2693 enddef
2694 endif
2695 endfor
2696 endfor
2697 enddef
2698 Func()
2699 END
2700 v9.CheckScriptSuccess(lines)
2701 assert_equal("0a", g:Global_0a())
2702 assert_equal("1b", g:Global_1b())
2703 assert_equal("2c", g:Global_2c())
2704
2705 delfunc g:Global_0a
2706 delfunc g:Global_1b
2707 delfunc g:Global_2c
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002708enddef
2709
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002710def Test_for_loop_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00002711 v9.CheckDefAndScriptFailure(['for '], ['E1097:', 'E690:'])
2712 v9.CheckDefAndScriptFailure(['for x'], ['E1097:', 'E690:'])
2713 v9.CheckDefAndScriptFailure(['for x in'], ['E1097:', 'E15:'])
2714 v9.CheckDefAndScriptFailure(['for # in range(5)'], 'E690:')
2715 v9.CheckDefAndScriptFailure(['for i In range(5)'], 'E690:')
2716 v9.CheckDefAndScriptFailure(['var x = 5', 'for x in range(5)', 'endfor'], ['E1017:', 'E1041:'])
2717 v9.CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3)
2718 v9.CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01002719 delfunc! g:Func
Bram Moolenaar62aec932022-01-29 21:45:34 +00002720 v9.CheckDefFailure(['for i in xxx'], 'E1001:')
2721 v9.CheckDefFailure(['endfor'], 'E588:')
2722 v9.CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002723
2724 # wrong type detected at compile time
Bram Moolenaar62aec932022-01-29 21:45:34 +00002725 v9.CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002726
2727 # wrong type detected at runtime
2728 g:adict = {a: 1}
Bram Moolenaar62aec932022-01-29 21:45:34 +00002729 v9.CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002730 unlet g:adict
Bram Moolenaarf6a8d422021-04-13 21:48:03 +02002731
2732 var lines =<< trim END
2733 var d: list<dict<any>> = [{a: 0}]
2734 for e in d
2735 e = {a: 0, b: ''}
2736 endfor
2737 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002738 v9.CheckDefAndScriptFailure(lines, ['E1018:', 'E46:'], 3)
Bram Moolenaarfe090eb2021-04-15 21:48:32 +02002739
2740 lines =<< trim END
2741 for nr: number in ['foo']
2742 endfor
2743 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002744 v9.CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
Bram Moolenaar404557e2021-07-05 21:41:48 +02002745
2746 lines =<< trim END
2747 for n : number in [1, 2]
2748 echo n
2749 endfor
2750 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002751 v9.CheckDefAndScriptFailure(lines, 'E1059:', 1)
Bram Moolenaarefc5db52021-07-07 21:21:30 +02002752
2753 lines =<< trim END
2754 var d: dict<number> = {a: 1, b: 2}
2755 for [k: job, v: job] in d->items()
2756 echo k v
2757 endfor
2758 END
Bram Moolenaarbd3a9d22022-05-17 16:12:39 +01002759 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 +00002760
2761 lines =<< trim END
2762 var i = 0
2763 for i in [1, 2, 3]
2764 echo i
2765 endfor
2766 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002767 v9.CheckDefExecAndScriptFailure(lines, ['E1017:', 'E1041:'])
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002768
2769 lines =<< trim END
2770 var l = [0]
2771 for l[0] in [1, 2, 3]
2772 echo l[0]
2773 endfor
2774 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002775 v9.CheckDefExecAndScriptFailure(lines, ['E461:', 'E1017:'])
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002776
2777 lines =<< trim END
2778 var d = {x: 0}
2779 for d.x in [1, 2, 3]
2780 echo d.x
2781 endfor
2782 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002783 v9.CheckDefExecAndScriptFailure(lines, ['E461:', 'E1017:'])
Bram Moolenaara1c51952022-02-02 16:20:26 +00002784
2785 lines =<< trim END
2786 var l: list<dict<any>> = [{a: 1, b: 'x'}]
2787 for item: dict<number> in l
2788 echo item
2789 endfor
2790 END
2791 v9.CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected dict<number> but got dict<any>')
2792
2793 lines =<< trim END
2794 var l: list<dict<any>> = [{n: 1}]
2795 for item: dict<number> in l
Bram Moolenaarfa103972022-09-29 19:14:42 +01002796 var d = {s: ''}
2797 d->extend(item)
Bram Moolenaara1c51952022-02-02 16:20:26 +00002798 endfor
2799 END
Bram Moolenaarfa103972022-09-29 19:14:42 +01002800 v9.CheckDefExecAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected dict<string> but got dict<number>')
Bram Moolenaarcc341812022-09-19 15:54:34 +01002801
2802 lines =<< trim END
2803 for a in range(3)
2804 while a > 3
2805 for b in range(2)
2806 while b < 0
2807 for c in range(5)
2808 while c > 6
2809 while c < 0
2810 for d in range(1)
2811 for e in range(3)
2812 while e > 3
2813 endwhile
2814 endfor
2815 endfor
2816 endwhile
2817 endwhile
2818 endfor
2819 endwhile
2820 endfor
2821 endwhile
2822 endfor
2823 END
2824 v9.CheckDefSuccess(lines)
2825
2826 v9.CheckDefFailure(['for x in range(3)'] + lines + ['endfor'], 'E1306:')
Yegappan Lakshmanan062bb6b2023-12-16 14:46:40 +01002827
2828 # Test for too many for loops
2829 lines =<< trim END
2830 vim9script
2831 def Foo()
2832 for a in range(1)
2833 for b in range(1)
2834 for c in range(1)
2835 for d in range(1)
2836 for e in range(1)
2837 for f in range(1)
2838 for g in range(1)
2839 for h in range(1)
2840 for i in range(1)
2841 for j in range(1)
2842 for k in range(1)
2843 endfor
2844 endfor
2845 endfor
2846 endfor
2847 endfor
2848 endfor
2849 endfor
2850 endfor
2851 endfor
2852 endfor
2853 endfor
2854 enddef
2855 defcompile
2856 END
2857 v9.CheckSourceFailure(lines, 'E1306: Loop nesting too deep', 11)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002858enddef
2859
Bram Moolenaarea870692020-12-02 14:24:30 +01002860def Test_for_loop_script_var()
2861 # cannot use s:var in a :def function
Bram Moolenaar62aec932022-01-29 21:45:34 +00002862 v9.CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1254:')
Bram Moolenaarea870692020-12-02 14:24:30 +01002863
2864 # can use s:var in Vim9 script, with or without s:
2865 var lines =<< trim END
2866 vim9script
2867 var total = 0
2868 for s:var in [1, 2, 3]
2869 total += s:var
2870 endfor
2871 assert_equal(6, total)
2872
2873 total = 0
2874 for var in [1, 2, 3]
2875 total += var
2876 endfor
2877 assert_equal(6, total)
2878 END
2879enddef
2880
Bram Moolenaar792f7862020-11-23 08:31:18 +01002881def Test_for_loop_unpack()
Bram Moolenaar792f7862020-11-23 08:31:18 +01002882 var lines =<< trim END
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002883 var result = []
2884 for [v1, v2] in [[1, 2], [3, 4]]
2885 result->add(v1)
2886 result->add(v2)
2887 endfor
2888 assert_equal([1, 2, 3, 4], result)
2889
2890 result = []
2891 for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2892 result->add(v1)
2893 result->add(v2)
2894 result->add(v3)
2895 endfor
2896 assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2897
2898 result = []
2899 for [&ts, &sw] in [[1, 2], [3, 4]]
2900 result->add(&ts)
2901 result->add(&sw)
2902 endfor
2903 assert_equal([1, 2, 3, 4], result)
2904
2905 var slist: list<string>
2906 for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
2907 slist->add($LOOPVAR)
2908 slist->add(@r)
2909 slist->add(v:errmsg)
2910 endfor
2911 assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
2912
2913 slist = []
2914 for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
2915 slist->add(g:globalvar)
2916 slist->add(b:bufvar)
2917 slist->add(w:winvar)
2918 slist->add(t:tabvar)
2919 endfor
2920 assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
Bram Moolenaarf6c177a2020-12-04 17:38:00 +01002921 unlet! g:globalvar b:bufvar w:winvar t:tabvar
Bram Moolenaarb777da92021-05-22 21:40:39 +02002922
2923 var res = []
2924 for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
2925 res->add(n)
2926 endfor
2927 assert_equal([2, 5], res)
Bram Moolenaar61efa162022-03-18 13:10:48 +00002928
2929 var text: list<string> = ["hello there", "goodbye now"]
2930 var splitted = ''
2931 for [first; next] in mapnew(text, (i, v) => split(v))
2932 splitted ..= string(first) .. string(next) .. '/'
2933 endfor
2934 assert_equal("'hello'['there']/'goodbye'['now']/", splitted)
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002935 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002936 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002937
2938 lines =<< trim END
Bram Moolenaar792f7862020-11-23 08:31:18 +01002939 for [v1, v2] in [[1, 2, 3], [3, 4]]
2940 echo v1 v2
2941 endfor
2942 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002943 v9.CheckDefExecFailure(lines, 'E710:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01002944
2945 lines =<< trim END
2946 for [v1, v2] in [[1], [3, 4]]
2947 echo v1 v2
2948 endfor
2949 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002950 v9.CheckDefExecFailure(lines, 'E711:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01002951
2952 lines =<< trim END
2953 for [v1, v1] in [[1, 2], [3, 4]]
2954 echo v1
2955 endfor
2956 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002957 v9.CheckDefExecFailure(lines, 'E1017:', 1)
Bram Moolenaar95e4dd82022-04-27 22:15:40 +01002958
2959 lines =<< trim END
2960 for [a, b] in g:listlist
2961 echo a
2962 endfor
2963 END
2964 g:listlist = [1, 2, 3]
2965 v9.CheckDefExecFailure(lines, 'E1140:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01002966enddef
2967
Bram Moolenaarc150c092021-02-13 15:02:46 +01002968def Test_for_loop_with_try_continue()
Bram Moolenaarf2253962021-04-13 20:53:13 +02002969 var lines =<< trim END
2970 var looped = 0
2971 var cleanup = 0
2972 for i in range(3)
2973 looped += 1
2974 try
2975 eval [][0]
2976 catch
2977 continue
2978 finally
2979 cleanup += 1
2980 endtry
2981 endfor
2982 assert_equal(3, looped)
2983 assert_equal(3, cleanup)
2984 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002985 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc150c092021-02-13 15:02:46 +01002986enddef
2987
rbtnnd895b1d2021-08-20 20:54:25 +02002988def Test_while_skipped_block()
2989 # test skipped blocks at outside of function
2990 var lines =<< trim END
2991 var result = []
2992 var n = 0
2993 if true
2994 n = 1
2995 while n < 3
2996 result += [n]
2997 n += 1
2998 endwhile
2999 else
3000 n = 3
3001 while n < 5
3002 result += [n]
3003 n += 1
3004 endwhile
3005 endif
3006 assert_equal([1, 2], result)
3007
3008 result = []
3009 if false
3010 n = 1
3011 while n < 3
3012 result += [n]
3013 n += 1
3014 endwhile
3015 else
3016 n = 3
3017 while n < 5
3018 result += [n]
3019 n += 1
3020 endwhile
3021 endif
3022 assert_equal([3, 4], result)
3023 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003024 v9.CheckDefAndScriptSuccess(lines)
rbtnnd895b1d2021-08-20 20:54:25 +02003025
3026 # test skipped blocks at inside of function
3027 lines =<< trim END
3028 def DefTrue()
3029 var result = []
3030 var n = 0
3031 if true
3032 n = 1
3033 while n < 3
3034 result += [n]
3035 n += 1
3036 endwhile
3037 else
3038 n = 3
3039 while n < 5
3040 result += [n]
3041 n += 1
3042 endwhile
3043 endif
3044 assert_equal([1, 2], result)
3045 enddef
3046 DefTrue()
3047
3048 def DefFalse()
3049 var result = []
3050 var n = 0
3051 if false
3052 n = 1
3053 while n < 3
3054 result += [n]
3055 n += 1
3056 endwhile
3057 else
3058 n = 3
3059 while n < 5
3060 result += [n]
3061 n += 1
3062 endwhile
3063 endif
3064 assert_equal([3, 4], result)
3065 enddef
3066 DefFalse()
3067 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003068 v9.CheckDefAndScriptSuccess(lines)
rbtnnd895b1d2021-08-20 20:54:25 +02003069enddef
3070
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003071def Test_while_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003072 var result = ''
3073 var cnt = 0
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003074 while cnt < 555
3075 if cnt == 3
3076 break
3077 endif
3078 cnt += 1
3079 if cnt == 2
3080 continue
3081 endif
3082 result ..= cnt .. '_'
3083 endwhile
3084 assert_equal('1_3_', result)
Bram Moolenaardee37dc2021-02-07 16:40:05 +01003085
3086 var s = ''
Bram Moolenaar4b3e1962021-03-18 21:37:55 +01003087 while s == 'x' # {comment}
Bram Moolenaardee37dc2021-02-07 16:40:05 +01003088 endwhile
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003089enddef
3090
Bram Moolenaar7a53f292021-11-22 18:31:02 +00003091def Test_while_loop_in_script()
3092 var lines =<< trim END
3093 vim9script
3094 var result = ''
3095 var cnt = 0
3096 while cnt < 3
3097 var s = 'v' .. cnt
3098 result ..= s
3099 cnt += 1
3100 endwhile
3101 assert_equal('v0v1v2', result)
3102 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003103 v9.CheckScriptSuccess(lines)
Bram Moolenaar7a53f292021-11-22 18:31:02 +00003104enddef
3105
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02003106def Test_while_loop_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00003107 v9.CheckDefFailure(['while xxx'], 'E1001:')
3108 v9.CheckDefFailure(['endwhile'], 'E588:')
3109 v9.CheckDefFailure(['continue'], 'E586:')
3110 v9.CheckDefFailure(['if true', 'continue'], 'E586:')
3111 v9.CheckDefFailure(['break'], 'E587:')
3112 v9.CheckDefFailure(['if true', 'break'], 'E587:')
3113 v9.CheckDefFailure(['while 1', 'echo 3'], 'E170:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01003114
3115 var lines =<< trim END
3116 var s = ''
3117 while s = ''
3118 endwhile
3119 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003120 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaarbd5da372020-03-31 23:13:10 +02003121enddef
3122
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01003123def Test_interrupt_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003124 var caught = false
3125 var x = 0
Bram Moolenaar97acfc72020-03-22 13:44:28 +01003126 try
3127 while 1
3128 x += 1
3129 if x == 100
3130 feedkeys("\<C-C>", 'Lt')
3131 endif
3132 endwhile
3133 catch
3134 caught = true
3135 assert_equal(100, x)
3136 endtry
3137 assert_true(caught, 'should have caught an exception')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02003138 # consume the CTRL-C
3139 getchar(0)
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01003140enddef
Bram Moolenaar20431c92020-03-20 18:39:46 +01003141
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003142def Test_automatic_line_continuation()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003143 var mylist = [
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003144 'one',
3145 'two',
3146 'three',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003147 ] # comment
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003148 assert_equal(['one', 'two', 'three'], mylist)
3149
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003150 var mydict = {
Bram Moolenaare0de1712020-12-02 17:36:54 +01003151 ['one']: 1,
3152 ['two']: 2,
3153 ['three']:
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003154 3,
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003155 } # comment
Bram Moolenaare0de1712020-12-02 17:36:54 +01003156 assert_equal({one: 1, two: 2, three: 3}, mydict)
3157 mydict = {
Bram Moolenaar2c330432020-04-13 14:41:35 +02003158 one: 1, # comment
3159 two: # comment
3160 2, # comment
3161 three: 3 # comment
3162 }
Bram Moolenaare0de1712020-12-02 17:36:54 +01003163 assert_equal({one: 1, two: 2, three: 3}, mydict)
3164 mydict = {
Bram Moolenaar2c330432020-04-13 14:41:35 +02003165 one: 1,
3166 two:
3167 2,
3168 three: 3
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003169 }
Bram Moolenaare0de1712020-12-02 17:36:54 +01003170 assert_equal({one: 1, two: 2, three: 3}, mydict)
Bram Moolenaare6085c52020-04-12 20:19:16 +02003171
3172 assert_equal(
3173 ['one', 'two', 'three'],
3174 split('one two three')
3175 )
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003176enddef
3177
Bram Moolenaar7a092242020-04-16 22:10:49 +02003178def Test_vim9_comment()
Bram Moolenaar62aec932022-01-29 21:45:34 +00003179 v9.CheckScriptSuccess([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003180 'vim9script',
3181 '# something',
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003182 '#something',
Bram Moolenaar3f74c0a2022-08-06 18:12:06 +01003183 '#{{something',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003184 ])
Bram Moolenaar3f74c0a2022-08-06 18:12:06 +01003185 v9.CheckScriptFailure([
3186 'vim9script',
3187 '#{something',
3188 ], 'E1170:')
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003189
Bram Moolenaarb18b4962022-09-02 21:55:50 +01003190 split Xv9cfile
Bram Moolenaar62aec932022-01-29 21:45:34 +00003191 v9.CheckScriptSuccess([
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003192 'vim9script',
3193 'edit #something',
3194 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003195 v9.CheckScriptSuccess([
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003196 'vim9script',
3197 'edit #{something',
3198 ])
3199 close
3200
Bram Moolenaar62aec932022-01-29 21:45:34 +00003201 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003202 'vim9script',
3203 ':# something',
3204 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003205 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003206 '# something',
3207 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003208 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003209 ':# something',
3210 ], 'E488:')
3211
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003212 { # block start
3213 } # block end
Bram Moolenaar62aec932022-01-29 21:45:34 +00003214 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003215 '{# comment',
3216 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003217 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003218 '{',
3219 '}# comment',
3220 ], 'E488:')
3221
3222 echo "yes" # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00003223 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003224 'echo "yes"# comment',
3225 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003226 v9.CheckScriptSuccess([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003227 'vim9script',
3228 'echo "yes" # something',
3229 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003230 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003231 'vim9script',
3232 'echo "yes"# something',
3233 ], 'E121:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003234 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003235 'vim9script',
3236 'echo# something',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003237 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003238 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003239 'echo "yes" # something',
3240 ], 'E121:')
3241
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003242 exe "echo" # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00003243 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003244 'exe "echo"# comment',
3245 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003246 v9.CheckScriptSuccess([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003247 'vim9script',
3248 'exe "echo" # something',
3249 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003250 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003251 'vim9script',
3252 'exe "echo"# something',
3253 ], 'E121:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003254 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003255 'vim9script',
3256 'exe# something',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003257 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003258 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003259 'exe "echo" # something',
3260 ], 'E121:')
3261
Bram Moolenaar62aec932022-01-29 21:45:34 +00003262 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003263 'try# comment',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003264 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003265 'catch',
3266 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003267 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003268 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003269 'vim9script',
3270 'try# comment',
3271 'echo "yes"',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003272 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003273 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003274 'try',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003275 ' throw#comment',
3276 'catch',
3277 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003278 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003279 v9.CheckDefFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003280 'try',
3281 ' throw "yes"#comment',
3282 'catch',
3283 'endtry',
3284 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003285 v9.CheckDefFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003286 'try',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003287 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003288 'catch# comment',
3289 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003290 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003291 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003292 'vim9script',
3293 'try',
3294 ' echo "yes"',
3295 'catch# comment',
3296 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003297 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003298 v9.CheckDefFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003299 'try',
3300 ' echo "yes"',
3301 'catch /pat/# comment',
3302 'endtry',
3303 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003304 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003305 'try',
3306 'echo "yes"',
3307 'catch',
3308 'endtry# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003309 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003310 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003311 'vim9script',
3312 'try',
3313 ' echo "yes"',
3314 'catch',
3315 'endtry# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003316 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003317
Bram Moolenaar62aec932022-01-29 21:45:34 +00003318 v9.CheckScriptSuccess([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003319 'vim9script',
3320 'hi # comment',
3321 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003322 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003323 'vim9script',
3324 'hi# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003325 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003326 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003327 'vim9script',
3328 'hi Search # comment',
3329 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003330 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003331 'vim9script',
3332 'hi Search# comment',
3333 ], 'E416:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003334 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003335 'vim9script',
3336 'hi link This Search # comment',
3337 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003338 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003339 'vim9script',
3340 'hi link This That# comment',
3341 ], 'E413:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003342 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003343 'vim9script',
3344 'hi clear This # comment',
3345 'hi clear # comment',
3346 ])
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003347 # not tested, because it doesn't give an error but a warning:
3348 # hi clear This# comment',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003349 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003350 'vim9script',
3351 'hi clear# comment',
3352 ], 'E416:')
3353
Bram Moolenaar62aec932022-01-29 21:45:34 +00003354 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003355 'vim9script',
3356 'hi Group term=bold',
3357 'match Group /todo/ # comment',
3358 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003359 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003360 'vim9script',
3361 'hi Group term=bold',
3362 'match Group /todo/# comment',
3363 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003364 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003365 'vim9script',
3366 'match # comment',
3367 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003368 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003369 'vim9script',
3370 'match# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003371 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003372 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003373 'vim9script',
3374 'match none # comment',
3375 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003376 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003377 'vim9script',
3378 'match none# comment',
3379 ], 'E475:')
3380
Bram Moolenaar62aec932022-01-29 21:45:34 +00003381 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003382 'vim9script',
3383 'menutrans clear # comment',
3384 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003385 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003386 'vim9script',
3387 'menutrans clear# comment text',
3388 ], 'E474:')
3389
Bram Moolenaar62aec932022-01-29 21:45:34 +00003390 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003391 'vim9script',
3392 'syntax clear # comment',
3393 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003394 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003395 'vim9script',
3396 'syntax clear# comment text',
3397 ], 'E28:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003398 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003399 'vim9script',
3400 'syntax keyword Word some',
3401 'syntax clear Word # comment',
3402 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003403 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003404 'vim9script',
3405 'syntax keyword Word some',
3406 'syntax clear Word# comment text',
3407 ], 'E28:')
3408
Bram Moolenaar62aec932022-01-29 21:45:34 +00003409 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003410 'vim9script',
3411 'syntax list # comment',
3412 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003413 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003414 'vim9script',
3415 'syntax list# comment text',
3416 ], 'E28:')
3417
Bram Moolenaar62aec932022-01-29 21:45:34 +00003418 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003419 'vim9script',
3420 'syntax match Word /pat/ oneline # comment',
3421 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003422 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003423 'vim9script',
3424 'syntax match Word /pat/ oneline# comment',
3425 ], 'E475:')
3426
Bram Moolenaar62aec932022-01-29 21:45:34 +00003427 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003428 'vim9script',
3429 'syntax keyword Word word # comm[ent',
3430 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003431 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003432 'vim9script',
3433 'syntax keyword Word word# comm[ent',
3434 ], 'E789:')
3435
Bram Moolenaar62aec932022-01-29 21:45:34 +00003436 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003437 'vim9script',
3438 'syntax match Word /pat/ # comment',
3439 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003440 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003441 'vim9script',
3442 'syntax match Word /pat/# comment',
3443 ], 'E402:')
3444
Bram Moolenaar62aec932022-01-29 21:45:34 +00003445 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003446 'vim9script',
3447 'syntax match Word /pat/ contains=Something # comment',
3448 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003449 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003450 'vim9script',
3451 'syntax match Word /pat/ contains=Something# comment',
3452 ], 'E475:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003453 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003454 'vim9script',
3455 'syntax match Word /pat/ contains= # comment',
3456 ], 'E406:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003457 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003458 'vim9script',
3459 'syntax match Word /pat/ contains=# comment',
3460 ], 'E475:')
3461
Bram Moolenaar62aec932022-01-29 21:45:34 +00003462 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003463 'vim9script',
3464 'syntax region Word start=/pat/ end=/pat/ # comment',
3465 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003466 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003467 'vim9script',
3468 'syntax region Word start=/pat/ end=/pat/# comment',
Bram Moolenaard032f342020-07-18 18:13:02 +02003469 ], 'E402:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02003470
Bram Moolenaar62aec932022-01-29 21:45:34 +00003471 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003472 'vim9script',
3473 'syntax sync # comment',
3474 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003475 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003476 'vim9script',
3477 'syntax sync# comment',
3478 ], 'E404:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003479 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003480 'vim9script',
3481 'syntax sync ccomment # comment',
3482 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003483 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003484 'vim9script',
3485 'syntax sync ccomment# comment',
3486 ], 'E404:')
3487
Bram Moolenaar62aec932022-01-29 21:45:34 +00003488 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003489 'vim9script',
3490 'syntax cluster Some contains=Word # comment',
3491 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003492 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003493 'vim9script',
3494 'syntax cluster Some contains=Word# comment',
3495 ], 'E475:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003496
Bram Moolenaar62aec932022-01-29 21:45:34 +00003497 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003498 'vim9script',
3499 'command Echo echo # comment',
3500 'command Echo # comment',
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003501 'delcommand Echo',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003502 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003503 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003504 'vim9script',
3505 'command Echo echo# comment',
3506 'Echo',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003507 ], 'E1144:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003508 delcommand Echo
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003509
3510 var curdir = getcwd()
Bram Moolenaar62aec932022-01-29 21:45:34 +00003511 v9.CheckScriptSuccess([
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003512 'command Echo cd " comment',
3513 'Echo',
3514 'delcommand Echo',
3515 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003516 v9.CheckScriptSuccess([
Bram Moolenaar090728a2020-12-20 15:43:31 +01003517 'vim9script',
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003518 'command Echo cd # comment',
3519 'Echo',
3520 'delcommand Echo',
3521 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003522 v9.CheckScriptFailure([
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003523 'vim9script',
3524 'command Echo cd " comment',
3525 'Echo',
3526 ], 'E344:')
3527 delcommand Echo
3528 chdir(curdir)
3529
Bram Moolenaar62aec932022-01-29 21:45:34 +00003530 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003531 'vim9script',
3532 'command Echo# comment',
3533 ], 'E182:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003534 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003535 'vim9script',
3536 'command Echo echo',
3537 'command Echo# comment',
3538 ], 'E182:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003539 delcommand Echo
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003540
Bram Moolenaar62aec932022-01-29 21:45:34 +00003541 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003542 'vim9script',
3543 'function # comment',
3544 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003545 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003546 'vim9script',
Bram Moolenaar98981072020-07-29 14:40:25 +02003547 'function " comment',
3548 ], 'E129:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003549 v9.CheckScriptFailure([
Bram Moolenaar98981072020-07-29 14:40:25 +02003550 'vim9script',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003551 'function# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003552 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003553 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003554 'vim9script',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003555 'import "./vim9.vim" as v9',
3556 'function v9.CheckScriptSuccess # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003557 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003558 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003559 'vim9script',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003560 'import "./vim9.vim" as v9',
3561 'function v9.CheckScriptSuccess# comment',
3562 ], 'E1048: Item not found in script: CheckScriptSuccess#')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003563
Bram Moolenaar62aec932022-01-29 21:45:34 +00003564 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003565 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003566 'func g:DeleteMeA()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003567 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003568 'delfunction g:DeleteMeA # 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 Moolenaar4c17ad92020-04-27 22:47:51 +02003572 'func g:DeleteMeB()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003573 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003574 'delfunction g:DeleteMeB# comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003575 ], 'E488:')
3576
Bram Moolenaar62aec932022-01-29 21:45:34 +00003577 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003578 'vim9script',
3579 'call execute("ls") # comment',
3580 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003581 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003582 'vim9script',
3583 'call execute("ls")# comment',
3584 ], 'E488:')
Bram Moolenaare7e48382020-07-22 18:17:08 +02003585
Bram Moolenaar62aec932022-01-29 21:45:34 +00003586 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003587 'def Test() " comment',
3588 'enddef',
3589 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003590 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003591 'vim9script',
3592 'def Test() " comment',
3593 'enddef',
3594 ], 'E488:')
3595
Bram Moolenaar62aec932022-01-29 21:45:34 +00003596 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003597 'func Test() " comment',
3598 'endfunc',
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003599 'delfunc Test',
Bram Moolenaare7e48382020-07-22 18:17:08 +02003600 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003601 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003602 'vim9script',
3603 'func Test() " comment',
3604 'endfunc',
Bram Moolenaar98981072020-07-29 14:40:25 +02003605 ])
Bram Moolenaare7e48382020-07-22 18:17:08 +02003606
Bram Moolenaar62aec932022-01-29 21:45:34 +00003607 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003608 'def Test() # comment',
3609 'enddef',
3610 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003611 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003612 'func Test() # comment',
3613 'endfunc',
3614 ], 'E488:')
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003615
3616 var lines =<< trim END
3617 vim9script
3618 syn region Text
3619 \ start='foo'
3620 #\ comment
3621 \ end='bar'
Bram Moolenaar5072b472021-06-03 21:56:10 +02003622 syn region Text start='foo'
3623 #\ comment
3624 \ end='bar'
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003625 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003626 v9.CheckScriptSuccess(lines)
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003627
3628 lines =<< trim END
3629 vim9script
3630 syn region Text
3631 \ start='foo'
3632 "\ comment
3633 \ end='bar'
3634 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003635 v9.CheckScriptFailure(lines, 'E399:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003636enddef
3637
3638def Test_vim9_comment_gui()
3639 CheckCanRunGui
3640
Bram Moolenaar62aec932022-01-29 21:45:34 +00003641 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003642 'vim9script',
3643 'gui#comment'
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003644 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003645 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003646 'vim9script',
3647 'gui -f#comment'
Bram Moolenaarb8bd2e62021-08-21 17:13:14 +02003648 ], 'E194:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02003649enddef
3650
Bram Moolenaara26b9702020-04-18 19:53:28 +02003651def Test_vim9_comment_not_compiled()
Bram Moolenaar67979662020-06-20 22:50:47 +02003652 au TabEnter *.vim g:entered = 1
3653 au TabEnter *.x g:entered = 2
Bram Moolenaara26b9702020-04-18 19:53:28 +02003654
3655 edit test.vim
3656 doautocmd TabEnter #comment
3657 assert_equal(1, g:entered)
3658
3659 doautocmd TabEnter f.x
3660 assert_equal(2, g:entered)
3661
3662 g:entered = 0
3663 doautocmd TabEnter f.x #comment
3664 assert_equal(2, g:entered)
3665
3666 assert_fails('doautocmd Syntax#comment', 'E216:')
3667
3668 au! TabEnter
3669 unlet g:entered
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003670
Bram Moolenaar62aec932022-01-29 21:45:34 +00003671 v9.CheckScriptSuccess([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003672 'vim9script',
Bram Moolenaar67979662020-06-20 22:50:47 +02003673 'g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003674 'b:var = 456',
3675 'w:var = 777',
3676 't:var = 888',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003677 'unlet g:var w:var # something',
3678 ])
3679
Bram Moolenaar62aec932022-01-29 21:45:34 +00003680 v9.CheckScriptFailure([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003681 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003682 'let var = 123',
3683 ], 'E1126: Cannot use :let in Vim9 script')
3684
Bram Moolenaar62aec932022-01-29 21:45:34 +00003685 v9.CheckScriptFailure([
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003686 'vim9script',
3687 'var g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003688 ], 'E1016: Cannot declare a global variable:')
3689
Bram Moolenaar62aec932022-01-29 21:45:34 +00003690 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003691 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003692 'var b:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003693 ], 'E1016: Cannot declare a buffer variable:')
3694
Bram Moolenaar62aec932022-01-29 21:45:34 +00003695 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003696 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003697 'var w:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003698 ], 'E1016: Cannot declare a window variable:')
3699
Bram Moolenaar62aec932022-01-29 21:45:34 +00003700 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003701 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003702 'var t:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003703 ], 'E1016: Cannot declare a tab variable:')
3704
Bram Moolenaar62aec932022-01-29 21:45:34 +00003705 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003706 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003707 'var v:version = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003708 ], 'E1016: Cannot declare a v: variable:')
3709
Bram Moolenaar62aec932022-01-29 21:45:34 +00003710 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003711 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003712 'var $VARIABLE = "text"',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003713 ], 'E1016: Cannot declare an environment variable:')
Bram Moolenaar67979662020-06-20 22:50:47 +02003714
Bram Moolenaar62aec932022-01-29 21:45:34 +00003715 v9.CheckScriptFailure([
Bram Moolenaar67979662020-06-20 22:50:47 +02003716 'vim9script',
3717 'g:var = 123',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003718 'unlet g:var# comment1',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003719 ], 'E108:')
3720
Bram Moolenaar62aec932022-01-29 21:45:34 +00003721 v9.CheckScriptFailure([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003722 'let g:var = 123',
3723 'unlet g:var # something',
3724 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003725
Bram Moolenaar62aec932022-01-29 21:45:34 +00003726 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003727 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003728 'if 1 # comment2',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003729 ' echo "yes"',
3730 'elseif 2 #comment',
3731 ' echo "no"',
3732 'endif',
3733 ])
3734
Bram Moolenaar62aec932022-01-29 21:45:34 +00003735 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003736 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003737 'if 1# comment3',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003738 ' echo "yes"',
3739 'endif',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003740 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003741
Bram Moolenaar62aec932022-01-29 21:45:34 +00003742 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003743 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003744 'if 0 # comment4',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003745 ' echo "yes"',
3746 'elseif 2#comment',
3747 ' echo "no"',
3748 'endif',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003749 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003750
Bram Moolenaar62aec932022-01-29 21:45:34 +00003751 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003752 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003753 'var v = 1 # comment5',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003754 ])
3755
Bram Moolenaar62aec932022-01-29 21:45:34 +00003756 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003757 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003758 'var v = 1# comment6',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003759 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003760
Bram Moolenaar62aec932022-01-29 21:45:34 +00003761 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003762 'vim9script',
Bram Moolenaar2984ed32022-08-20 14:51:17 +01003763 'new',
Bram Moolenaard2c61702020-09-06 15:58:36 +02003764 'setline(1, ["# define pat", "last"])',
Bram Moolenaardf069ee2020-06-22 23:02:51 +02003765 ':$',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003766 'dsearch /pat/ #comment',
3767 'bwipe!',
3768 ])
3769
Bram Moolenaar62aec932022-01-29 21:45:34 +00003770 v9.CheckScriptFailure([
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003771 'vim9script',
Bram Moolenaar2984ed32022-08-20 14:51:17 +01003772 'new',
Bram Moolenaard2c61702020-09-06 15:58:36 +02003773 'setline(1, ["# define pat", "last"])',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003774 ':$',
3775 'dsearch /pat/#comment',
3776 'bwipe!',
3777 ], 'E488:')
3778
Bram Moolenaar62aec932022-01-29 21:45:34 +00003779 v9.CheckScriptFailure([
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003780 'vim9script',
3781 'func! SomeFunc()',
3782 ], 'E477:')
Bram Moolenaara26b9702020-04-18 19:53:28 +02003783enddef
3784
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003785def Test_finish()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003786 var lines =<< trim END
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003787 vim9script
Bram Moolenaar67979662020-06-20 22:50:47 +02003788 g:res = 'one'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003789 if v:false | finish | endif
Bram Moolenaar67979662020-06-20 22:50:47 +02003790 g:res = 'two'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003791 finish
Bram Moolenaar67979662020-06-20 22:50:47 +02003792 g:res = 'three'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003793 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003794 writefile(lines, 'Xfinished', 'D')
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003795 source Xfinished
3796 assert_equal('two', g:res)
3797
3798 unlet g:res
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003799enddef
3800
Bram Moolenaara5d00772020-05-14 23:20:55 +02003801def Test_forward_declaration()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003802 var lines =<< trim END
Bram Moolenaara5d00772020-05-14 23:20:55 +02003803 vim9script
Bram Moolenaara5d00772020-05-14 23:20:55 +02003804 def GetValue(): string
3805 return theVal
3806 enddef
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003807 var theVal = 'something'
Bram Moolenaar822ba242020-05-24 23:00:18 +02003808 g:initVal = GetValue()
Bram Moolenaara5d00772020-05-14 23:20:55 +02003809 theVal = 'else'
3810 g:laterVal = GetValue()
3811 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003812 writefile(lines, 'Xforward', 'D')
Bram Moolenaara5d00772020-05-14 23:20:55 +02003813 source Xforward
3814 assert_equal('something', g:initVal)
3815 assert_equal('else', g:laterVal)
3816
3817 unlet g:initVal
3818 unlet g:laterVal
Bram Moolenaara5d00772020-05-14 23:20:55 +02003819enddef
3820
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003821def Test_declare_script_var_in_func()
Bram Moolenaare535db82021-03-31 21:07:24 +02003822 var lines =<< trim END
3823 vim9script
3824 func Declare()
3825 let s:local = 123
3826 endfunc
3827 Declare()
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003828 END
3829 v9.CheckScriptFailure(lines, 'E1269:')
3830enddef
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00003831
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003832def Test_lock_script_var()
3833 var lines =<< trim END
3834 vim9script
3835 var local = 123
Bram Moolenaare535db82021-03-31 21:07:24 +02003836 assert_equal(123, local)
3837
3838 var error: string
3839 try
3840 local = 'asdf'
3841 catch
3842 error = v:exception
3843 endtry
3844 assert_match('E1012: Type mismatch; expected number but got string', error)
3845
3846 lockvar local
3847 try
3848 local = 999
3849 catch
3850 error = v:exception
3851 endtry
3852 assert_match('E741: Value is locked: local', error)
3853 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003854 v9.CheckScriptSuccess(lines)
Bram Moolenaare535db82021-03-31 21:07:24 +02003855enddef
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00003856
Bram Moolenaare535db82021-03-31 21:07:24 +02003857
Bram Moolenaar7d699702020-08-14 20:52:28 +02003858func Test_vim9script_not_global()
3859 " check that items defined in Vim9 script are script-local, not global
3860 let vim9lines =<< trim END
3861 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003862 var name = 'local'
Bram Moolenaar7d699702020-08-14 20:52:28 +02003863 func TheFunc()
3864 echo 'local'
3865 endfunc
3866 def DefFunc()
3867 echo 'local'
3868 enddef
3869 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003870 call writefile(vim9lines, 'Xvim9script.vim', 'D')
Bram Moolenaar7d699702020-08-14 20:52:28 +02003871 source Xvim9script.vim
3872 try
3873 echo g:var
3874 assert_report('did not fail')
3875 catch /E121:/
3876 " caught
3877 endtry
3878 try
3879 call TheFunc()
3880 assert_report('did not fail')
3881 catch /E117:/
3882 " caught
3883 endtry
3884 try
3885 call DefFunc()
3886 assert_report('did not fail')
3887 catch /E117:/
3888 " caught
3889 endtry
Bram Moolenaar7d699702020-08-14 20:52:28 +02003890endfunc
3891
Bram Moolenaareeb27bf2020-07-04 17:39:10 +02003892def Test_vim9_copen()
3893 # this was giving an error for setting w:quickfix_title
3894 copen
3895 quit
3896enddef
3897
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02003898def Test_script_var_in_autocmd()
3899 # using a script variable from an autocommand, defined in a :def function in a
3900 # legacy Vim script, cannot check the variable type.
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003901 var lines =<< trim END
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02003902 let s:counter = 1
3903 def s:Func()
3904 au! CursorHold
3905 au CursorHold * s:counter += 1
3906 enddef
3907 call s:Func()
3908 doau CursorHold
3909 call assert_equal(2, s:counter)
3910 au! CursorHold
3911 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003912 v9.CheckScriptSuccess(lines)
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02003913enddef
3914
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003915def Test_error_in_autoload_script()
3916 var save_rtp = &rtp
3917 var dir = getcwd() .. '/Xruntime'
3918 &rtp = dir
Bram Moolenaardd674772022-09-15 22:26:18 +01003919 mkdir(dir .. '/autoload', 'pR')
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003920
3921 var lines =<< trim END
3922 vim9script noclear
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003923 export def Autoloaded()
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003924 enddef
3925 def Broken()
3926 var x: any = ''
3927 eval x != 0
3928 enddef
3929 Broken()
3930 END
3931 writefile(lines, dir .. '/autoload/script.vim')
3932
3933 lines =<< trim END
3934 vim9script
3935 def CallAutoloaded()
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003936 script#Autoloaded()
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003937 enddef
3938
3939 function Legacy()
3940 try
3941 call s:CallAutoloaded()
3942 catch
3943 call assert_match('E1030: Using a String as a Number', v:exception)
3944 endtry
3945 endfunction
3946
3947 Legacy()
3948 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003949 v9.CheckScriptSuccess(lines)
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003950
3951 &rtp = save_rtp
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003952enddef
3953
Bram Moolenaar6809ff92022-07-26 15:10:56 +01003954def Test_error_in_autoload_script_foldexpr()
3955 var save_rtp = &rtp
Bram Moolenaardd674772022-09-15 22:26:18 +01003956 mkdir('Xvim/autoload', 'pR')
Bram Moolenaar6809ff92022-07-26 15:10:56 +01003957 &runtimepath = 'Xvim'
3958
3959 var lines =<< trim END
3960 vim9script
3961 eval [][0]
3962 echomsg 'no error'
3963 END
3964 lines->writefile('Xvim/autoload/script.vim')
3965
3966 lines =<< trim END
3967 vim9script
3968 import autoload 'script.vim'
3969 &foldmethod = 'expr'
3970 &foldexpr = 'script.Func()'
3971 redraw
3972 END
3973 v9.CheckScriptFailure(lines, 'E684: List index out of range: 0')
Bram Moolenaar6809ff92022-07-26 15:10:56 +01003974enddef
3975
Bram Moolenaare3d46852020-08-29 13:39:17 +02003976def Test_invalid_sid()
3977 assert_fails('func <SNR>1234_func', 'E123:')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02003978
Bram Moolenaar62aec932022-01-29 21:45:34 +00003979 if g:RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
Bram Moolenaard2c61702020-09-06 15:58:36 +02003980 assert_equal([], readfile('Xdidit'))
Bram Moolenaare3d46852020-08-29 13:39:17 +02003981 endif
3982 delete('Xdidit')
3983enddef
3984
Bram Moolenaar9ec70262020-12-09 17:16:59 +01003985def Test_restoring_cpo()
Bram Moolenaardd674772022-09-15 22:26:18 +01003986 writefile(['vim9script', 'set nocp'], 'Xsourced', 'D')
3987 writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003988 if g:RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
Bram Moolenaar9ec70262020-12-09 17:16:59 +01003989 assert_equal(['done'], readfile('Xdone'))
3990 endif
Bram Moolenaar090728a2020-12-20 15:43:31 +01003991 delete('Xdone')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003992
Bram Moolenaardd674772022-09-15 22:26:18 +01003993 writefile(['vim9script', 'g:cpoval = &cpo'], 'XanotherScript', 'D')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003994 set cpo=aABceFsMny>
3995 edit XanotherScript
3996 so %
3997 assert_equal('aABceFsMny>', &cpo)
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00003998 assert_equal('aABceFs', g:cpoval)
Bram Moolenaar0123cc12021-02-07 17:17:58 +01003999 :1del
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004000 setline(1, 'let g:cpoval = &cpo')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004001 w
4002 so %
4003 assert_equal('aABceFsMny>', &cpo)
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004004 assert_equal('aABceFsMny>', g:cpoval)
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004005
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004006 set cpo&vim
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004007 unlet g:cpoval
4008
4009 if has('unix')
4010 # 'cpo' is not restored in main vimrc
4011 var save_HOME = $HOME
4012 $HOME = getcwd() .. '/Xhome'
Bram Moolenaardd674772022-09-15 22:26:18 +01004013 mkdir('Xhome', 'R')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004014 var lines =<< trim END
4015 vim9script
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004016 writefile(['before: ' .. &cpo], 'Xrporesult')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004017 set cpo+=M
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004018 writefile(['after: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004019 END
4020 writefile(lines, 'Xhome/.vimrc')
4021
4022 lines =<< trim END
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004023 call writefile(['later: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004024 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004025 writefile(lines, 'Xlegacy', 'D')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004026
4027 lines =<< trim END
4028 vim9script
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004029 call writefile(['vim9: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004030 qa
4031 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004032 writefile(lines, 'Xvim9', 'D')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004033
Bram Moolenaar62aec932022-01-29 21:45:34 +00004034 var cmd = g:GetVimCommand() .. " -S Xlegacy -S Xvim9"
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004035 cmd = substitute(cmd, '-u NONE', '', '')
4036 exe "silent !" .. cmd
4037
4038 assert_equal([
4039 'before: aABceFs',
4040 'after: aABceFsM',
4041 'later: aABceFsM',
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004042 'vim9: aABceFs'], readfile('Xrporesult'))
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004043
4044 $HOME = save_HOME
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004045 delete('Xrporesult')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004046 endif
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004047enddef
4048
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004049" Use :function so we can use Check commands
4050func Test_no_redraw_when_restoring_cpo()
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004051 CheckScreendump
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004052 CheckFeature timers
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004053 call Run_test_no_redraw_when_restoring_cpo()
4054endfunc
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004055
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004056def Run_test_no_redraw_when_restoring_cpo()
4057 var lines =<< trim END
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004058 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00004059 export def Func()
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004060 enddef
4061 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004062 mkdir('Xnordir/autoload', 'pR')
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01004063 writefile(lines, 'Xnordir/autoload/script.vim')
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004064
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004065 lines =<< trim END
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004066 vim9script
4067 set cpo+=M
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01004068 exe 'set rtp^=' .. getcwd() .. '/Xnordir'
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00004069 au CmdlineEnter : ++once timer_start(0, (_) => script#Func())
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004070 setline(1, 'some text')
4071 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004072 writefile(lines, 'XTest_redraw_cpo', 'D')
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004073 var buf = g:RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
4074 term_sendkeys(buf, "V:")
4075 g:VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004076
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004077 # clean up
4078 term_sendkeys(buf, "\<Esc>u")
4079 g:StopVimInTerminal(buf)
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004080enddef
4081
4082func Test_reject_declaration()
4083 CheckScreendump
4084 call Run_test_reject_declaration()
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004085endfunc
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004086
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004087def Run_test_reject_declaration()
4088 var buf = g:RunVimInTerminal('', {'rows': 6})
4089 term_sendkeys(buf, ":vim9cmd var x: number\<CR>")
Bram Moolenaar330a3882022-03-05 11:05:57 +00004090 g:VerifyScreenDump(buf, 'Test_vim9_reject_declaration_1', {})
4091 term_sendkeys(buf, ":\<CR>")
4092 term_sendkeys(buf, ":vim9cmd g:foo = 123 | echo g:foo\<CR>")
4093 g:VerifyScreenDump(buf, 'Test_vim9_reject_declaration_2', {})
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004094
4095 # clean up
4096 g:StopVimInTerminal(buf)
4097enddef
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004098
Bram Moolenaar204852a2022-03-05 12:56:44 +00004099def Test_minimal_command_name_length()
4100 var names = [
4101 'cons',
4102 'brea',
4103 'cat',
4104 'catc',
4105 'con',
Bram Moolenaarb2175222022-03-05 20:24:41 +00004106 'cont',
4107 'conti',
4108 'contin',
4109 'continu',
Bram Moolenaar204852a2022-03-05 12:56:44 +00004110 'el',
4111 'els',
4112 'elsei',
4113 'endfo',
4114 'en',
4115 'end',
4116 'endi',
4117 'endw',
4118 'endt',
4119 'endtr',
Bram Moolenaarb2175222022-03-05 20:24:41 +00004120 'exp',
4121 'expo',
4122 'expor',
Bram Moolenaar204852a2022-03-05 12:56:44 +00004123 'fina',
4124 'finall',
Bram Moolenaard523c7b2022-03-06 14:51:22 +00004125 'fini',
4126 'finis',
Bram Moolenaarb2175222022-03-05 20:24:41 +00004127 'imp',
4128 'impo',
4129 'impor',
4130 'retu',
4131 'retur',
Bram Moolenaar204852a2022-03-05 12:56:44 +00004132 'th',
4133 'thr',
4134 'thro',
4135 'wh',
4136 'whi',
4137 'whil',
4138 ]
4139 for name in names
4140 v9.CheckDefAndScriptFailure([name .. ' '], 'E1065:')
4141 endfor
Bram Moolenaarb2175222022-03-05 20:24:41 +00004142
4143 var lines =<< trim END
4144 vim9script
4145 def SomeFunc()
4146 endd
4147 END
4148 v9.CheckScriptFailure(lines, 'E1065:')
4149 lines =<< trim END
4150 vim9script
4151 def SomeFunc()
4152 endde
4153 END
4154 v9.CheckScriptFailure(lines, 'E1065:')
Bram Moolenaar204852a2022-03-05 12:56:44 +00004155enddef
4156
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004157def Test_unset_any_variable()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004158 var lines =<< trim END
4159 var name: any
4160 assert_equal(0, name)
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004161 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004162 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004163enddef
4164
Bram Moolenaar7e9210e2020-09-25 23:12:51 +02004165func Test_define_func_at_command_line()
Bram Moolenaar58dbef32020-09-25 22:13:05 +02004166 CheckRunVimInTerminal
4167
Bram Moolenaar7e9210e2020-09-25 23:12:51 +02004168 " call indirectly to avoid compilation error for missing functions
4169 call Run_Test_define_func_at_command_line()
4170endfunc
4171
4172def Run_Test_define_func_at_command_line()
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004173 # run in a separate Vim instance to avoid the script context
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004174 var lines =<< trim END
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004175 func CheckAndQuit()
4176 call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
4177 call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
4178 endfunc
4179 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004180 writefile([''], 'Xdidcmd', 'D')
4181 writefile(lines, 'XcallFunc', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00004182 var buf = g:RunVimInTerminal('-S XcallFunc', {rows: 6})
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004183 # define Afunc() on the command line
4184 term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
4185 term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004186 g:WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004187
Bram Moolenaar62aec932022-01-29 21:45:34 +00004188 call g:StopVimInTerminal(buf)
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004189enddef
4190
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004191def Test_script_var_scope()
4192 var lines =<< trim END
4193 vim9script
4194 if true
4195 if true
4196 var one = 'one'
4197 echo one
4198 endif
4199 echo one
4200 endif
4201 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004202 v9.CheckScriptFailure(lines, 'E121:', 7)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004203
4204 lines =<< trim END
4205 vim9script
4206 if true
4207 if false
4208 var one = 'one'
4209 echo one
4210 else
4211 var one = 'one'
4212 echo one
4213 endif
4214 echo one
4215 endif
4216 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004217 v9.CheckScriptFailure(lines, 'E121:', 10)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004218
4219 lines =<< trim END
4220 vim9script
4221 while true
4222 var one = 'one'
4223 echo one
4224 break
4225 endwhile
4226 echo one
4227 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004228 v9.CheckScriptFailure(lines, 'E121:', 7)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004229
4230 lines =<< trim END
4231 vim9script
4232 for i in range(1)
4233 var one = 'one'
4234 echo one
4235 endfor
4236 echo one
4237 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004238 v9.CheckScriptFailure(lines, 'E121:', 6)
Bram Moolenaar9becdf22020-10-10 21:33:48 +02004239
4240 lines =<< trim END
4241 vim9script
4242 {
4243 var one = 'one'
4244 assert_equal('one', one)
4245 }
4246 assert_false(exists('one'))
4247 assert_false(exists('s:one'))
4248 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004249 v9.CheckScriptSuccess(lines)
Bram Moolenaar9becdf22020-10-10 21:33:48 +02004250
4251 lines =<< trim END
4252 vim9script
4253 {
4254 var one = 'one'
4255 echo one
4256 }
4257 echo one
4258 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004259 v9.CheckScriptFailure(lines, 'E121:', 6)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004260enddef
4261
Bram Moolenaar352134b2020-10-17 22:04:08 +02004262def Test_catch_exception_in_callback()
4263 var lines =<< trim END
4264 vim9script
Bram Moolenaar2a389082021-04-09 20:24:31 +02004265 def Callback(...l: list<any>)
Bram Moolenaar352134b2020-10-17 22:04:08 +02004266 try
4267 var x: string
4268 var y: string
4269 # this error should be caught with CHECKLEN
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +00004270 var sl = ['']
4271 [x, y] = sl
Bram Moolenaar352134b2020-10-17 22:04:08 +02004272 catch
4273 g:caught = 'yes'
4274 endtry
4275 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01004276 popup_menu('popup', {callback: Callback})
Bram Moolenaar352134b2020-10-17 22:04:08 +02004277 feedkeys("\r", 'xt')
4278 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004279 v9.CheckScriptSuccess(lines)
Bram Moolenaar352134b2020-10-17 22:04:08 +02004280
4281 unlet g:caught
4282enddef
4283
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004284def Test_no_unknown_error_after_error()
4285 if !has('unix') || !has('job')
4286 throw 'Skipped: not unix of missing +job feature'
4287 endif
Bram Moolenaarb16ff292021-09-26 20:14:39 +01004288 # FIXME: this check should not be needed
4289 if has('win32')
4290 throw 'Skipped: does not work on MS-Windows'
4291 endif
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004292 var lines =<< trim END
4293 vim9script
4294 var source: list<number>
Bram Moolenaar2a389082021-04-09 20:24:31 +02004295 def Out_cb(...l: list<any>)
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004296 eval [][0]
4297 enddef
Bram Moolenaar2a389082021-04-09 20:24:31 +02004298 def Exit_cb(...l: list<any>)
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004299 sleep 1m
Bram Moolenaar23d44492022-05-04 16:24:57 +01004300 g:did_call_exit_cb = true
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004301 source += l
4302 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01004303 var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
Bram Moolenaar6f17a3f2020-12-21 18:11:24 +01004304 while job_status(myjob) == 'run'
4305 sleep 10m
4306 endwhile
Bram Moolenaar206c2a62021-01-31 14:04:44 +01004307 # wait for Exit_cb() to be called
Bram Moolenaar23d44492022-05-04 16:24:57 +01004308 for x in range(100)
4309 if exists('g:did_call_exit_cb')
4310 unlet g:did_call_exit_cb
4311 break
4312 endif
4313 sleep 10m
4314 endfor
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004315 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004316 writefile(lines, 'Xdef', 'D')
Yee Cheng Chin69a8bb82022-11-06 12:25:47 +00004317 # Either the exit or out callback is called first, accept them in any order
4318 assert_fails('so Xdef', ['E684:\|E1012:', 'E1012:\|E684:'])
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004319enddef
4320
Bram Moolenaar4324d872020-12-01 20:12:24 +01004321def InvokeNormal()
4322 exe "norm! :m+1\r"
4323enddef
4324
4325def Test_invoke_normal_in_visual_mode()
4326 xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
4327 new
4328 setline(1, ['aaa', 'bbb'])
4329 feedkeys("V\<F3>", 'xt')
4330 assert_equal(['bbb', 'aaa'], getline(1, 2))
4331 xunmap <F3>
4332enddef
4333
Bram Moolenaarb5b94802020-12-13 17:50:20 +01004334def Test_white_space_after_command()
4335 var lines =<< trim END
4336 exit_cb: Func})
4337 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004338 v9.CheckDefAndScriptFailure(lines, 'E1144:', 1)
Bram Moolenaarf8103f22020-12-25 17:36:27 +01004339
4340 lines =<< trim END
4341 e#
4342 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004343 v9.CheckDefAndScriptFailure(lines, 'E1144:', 1)
Bram Moolenaarb5b94802020-12-13 17:50:20 +01004344enddef
4345
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004346def Test_script_var_gone_when_sourced_twice()
4347 var lines =<< trim END
4348 vim9script
4349 if exists('g:guard')
4350 finish
4351 endif
4352 g:guard = 1
4353 var name = 'thename'
4354 def g:GetName(): string
4355 return name
4356 enddef
4357 def g:SetName(arg: string)
4358 name = arg
4359 enddef
4360 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004361 writefile(lines, 'XscriptTwice.vim', 'D')
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004362 so XscriptTwice.vim
4363 assert_equal('thename', g:GetName())
4364 g:SetName('newname')
4365 assert_equal('newname', g:GetName())
4366 so XscriptTwice.vim
4367 assert_fails('call g:GetName()', 'E1149:')
4368 assert_fails('call g:SetName("x")', 'E1149:')
4369
4370 delfunc g:GetName
4371 delfunc g:SetName
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004372 unlet g:guard
4373enddef
4374
Bram Moolenaar10b94212021-02-19 21:42:57 +01004375def Test_unsupported_commands()
4376 var lines =<< trim END
4377 ka
4378 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004379 v9.CheckDefAndScriptFailure(lines, ['E476:', 'E492:'])
Bram Moolenaar10b94212021-02-19 21:42:57 +01004380
4381 lines =<< trim END
Bram Moolenaarada1d872021-02-20 08:16:51 +01004382 :1ka
4383 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004384 v9.CheckDefAndScriptFailure(lines, ['E476:', 'E492:'])
Bram Moolenaarada1d872021-02-20 08:16:51 +01004385
4386 lines =<< trim END
Yegappan Lakshmanan885de442022-04-23 10:51:14 +01004387 :k a
4388 END
4389 v9.CheckDefAndScriptFailure(lines, 'E1100:')
4390
4391 lines =<< trim END
4392 :1k a
4393 END
4394 v9.CheckDefAndScriptFailure(lines, 'E481:')
4395
4396 lines =<< trim END
Bram Moolenaar10b94212021-02-19 21:42:57 +01004397 t
4398 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004399 v9.CheckDefAndScriptFailure(lines, 'E1100:')
Bram Moolenaar10b94212021-02-19 21:42:57 +01004400
4401 lines =<< trim END
4402 x
4403 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004404 v9.CheckDefAndScriptFailure(lines, 'E1100:')
Bram Moolenaar10b94212021-02-19 21:42:57 +01004405
4406 lines =<< trim END
4407 xit
4408 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004409 v9.CheckDefAndScriptFailure(lines, 'E1100:')
4410
4411 lines =<< trim END
4412 Print
4413 END
4414 v9.CheckDefAndScriptFailure(lines, ['E476: Invalid command: Print', 'E492: Not an editor command: Print'])
4415
4416 lines =<< trim END
4417 mode 4
4418 END
4419 v9.CheckDefAndScriptFailure(lines, ['E476: Invalid command: mode 4', 'E492: Not an editor command: mode 4'])
Bram Moolenaar10b94212021-02-19 21:42:57 +01004420enddef
4421
Bram Moolenaarc70fe462021-04-17 17:59:19 +02004422def Test_mapping_line_number()
4423 var lines =<< trim END
4424 vim9script
4425 def g:FuncA()
4426 # Some comment
4427 FuncB(0)
4428 enddef
4429 # Some comment
4430 def FuncB(
4431 # Some comment
4432 n: number
4433 )
4434 exe 'nno '
4435 # Some comment
4436 .. '<F3> a'
4437 .. 'b'
4438 .. 'c'
4439 enddef
4440 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004441 v9.CheckScriptSuccess(lines)
Bram Moolenaarc70fe462021-04-17 17:59:19 +02004442 var res = execute('verbose nmap <F3>')
4443 assert_match('No mapping found', res)
4444
4445 g:FuncA()
4446 res = execute('verbose nmap <F3>')
4447 assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
4448
4449 nunmap <F3>
4450 delfunc g:FuncA
4451enddef
4452
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004453def Test_option_set()
4454 # legacy script allows for white space
4455 var lines =<< trim END
4456 set foldlevel =11
4457 call assert_equal(11, &foldlevel)
4458 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004459 v9.CheckScriptSuccess(lines)
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004460
4461 set foldlevel
4462 set foldlevel=12
4463 assert_equal(12, &foldlevel)
4464 set foldlevel+=2
4465 assert_equal(14, &foldlevel)
4466 set foldlevel-=3
4467 assert_equal(11, &foldlevel)
4468
4469 lines =<< trim END
4470 set foldlevel =1
4471 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004472 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004473
4474 lines =<< trim END
4475 set foldlevel +=1
4476 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004477 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004478
4479 lines =<< trim END
4480 set foldlevel ^=1
4481 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004482 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004483
4484 lines =<< trim END
4485 set foldlevel -=1
4486 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004487 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004488
4489 set foldlevel&
4490enddef
4491
LemonBoy32f34612023-09-02 21:52:05 +02004492def Test_option_set_line_number()
4493 var lines =<< trim END
4494 vim9script
4495 # line2
4496 # line3
4497 def F()
4498 # line5
4499 &foldlevel = -128
4500 enddef
4501 F()
4502 END
4503 v9.CheckScriptSuccess(lines)
4504
4505 var res = execute('verbose set foldlevel')
4506 assert_match(' foldlevel.*Last set from .*XScriptSuccess\d\+ line 6', res)
4507enddef
4508
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004509def Test_option_modifier()
Bram Moolenaar1594f312021-07-08 16:40:13 +02004510 # legacy script allows for white space
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004511 var lines =<< trim END
4512 set hlsearch & hlsearch !
4513 call assert_equal(1, &hlsearch)
4514 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004515 v9.CheckScriptSuccess(lines)
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004516
Bram Moolenaar1594f312021-07-08 16:40:13 +02004517 set hlsearch
4518 set hlsearch!
4519 assert_equal(false, &hlsearch)
4520
4521 set hlsearch
4522 set hlsearch&
4523 assert_equal(false, &hlsearch)
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004524
4525 lines =<< trim END
Bram Moolenaar1594f312021-07-08 16:40:13 +02004526 set hlsearch &
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004527 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004528 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &')
Bram Moolenaar1594f312021-07-08 16:40:13 +02004529
4530 lines =<< trim END
4531 set hlsearch !
4532 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004533 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !')
Bram Moolenaar1594f312021-07-08 16:40:13 +02004534
4535 set hlsearch&
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004536enddef
4537
Bram Moolenaarc03fe662021-07-11 16:52:45 +02004538" This must be called last, it may cause following :def functions to fail
4539def Test_xxx_echoerr_line_number()
4540 var lines =<< trim END
4541 echoerr 'some'
4542 .. ' error'
4543 .. ' continued'
4544 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004545 v9.CheckDefExecAndScriptFailure(lines, 'some error continued', 1)
Bram Moolenaarc03fe662021-07-11 16:52:45 +02004546enddef
4547
Bram Moolenaar9537e372021-12-10 21:05:53 +00004548func Test_debug_with_lambda()
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004549 CheckRunVimInTerminal
4550
Bram Moolenaar9537e372021-12-10 21:05:53 +00004551 " call indirectly to avoid compilation error for missing functions
4552 call Run_Test_debug_with_lambda()
4553endfunc
4554
4555def Run_Test_debug_with_lambda()
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004556 var lines =<< trim END
4557 vim9script
4558 def Func()
4559 var n = 0
4560 echo [0]->filter((_, v) => v == n)
4561 enddef
4562 breakadd func Func
4563 Func()
4564 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004565 writefile(lines, 'XdebugFunc', 'D')
Christian Brabandt7edde3f2024-05-04 09:38:59 +02004566 var buf = g:RunVimInTerminal('-S XdebugFunc', {rows: 10, wait_for_ruler: 0})
4567 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 10)))
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004568
4569 term_sendkeys(buf, "cont\<CR>")
Christian Brabandt7edde3f2024-05-04 09:38:59 +02004570 g:WaitForAssert(() => assert_match('\[0\]', term_getline(buf, 9)))
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004571
Bram Moolenaar62aec932022-01-29 21:45:34 +00004572 g:StopVimInTerminal(buf)
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004573enddef
4574
Bram Moolenaar310091d2021-12-23 21:14:37 +00004575func Test_debug_running_out_of_lines()
4576 CheckRunVimInTerminal
4577
4578 " call indirectly to avoid compilation error for missing functions
4579 call Run_Test_debug_running_out_of_lines()
4580endfunc
4581
4582def Run_Test_debug_running_out_of_lines()
4583 var lines =<< trim END
4584 vim9script
4585 def Crash()
4586 #
4587 #
4588 #
4589 #
4590 #
4591 #
4592 #
4593 if true
4594 #
4595 endif
4596 enddef
4597 breakadd func Crash
4598 Crash()
4599 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004600 writefile(lines, 'XdebugFunc', 'D')
Christian Brabandt7edde3f2024-05-04 09:38:59 +02004601 var buf = g:RunVimInTerminal('-S XdebugFunc', {rows: 10, wait_for_ruler: 0})
4602 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 10)))
Bram Moolenaar310091d2021-12-23 21:14:37 +00004603
4604 term_sendkeys(buf, "next\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004605 g:TermWait(buf)
Christian Brabandt7edde3f2024-05-04 09:38:59 +02004606 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 10)))
Bram Moolenaar310091d2021-12-23 21:14:37 +00004607
4608 term_sendkeys(buf, "cont\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004609 g:TermWait(buf)
Bram Moolenaar310091d2021-12-23 21:14:37 +00004610
Bram Moolenaar62aec932022-01-29 21:45:34 +00004611 g:StopVimInTerminal(buf)
Bram Moolenaar310091d2021-12-23 21:14:37 +00004612enddef
4613
dundargocc57b5bc2022-11-02 13:30:51 +00004614def Test_ambiguous_command_error()
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004615 var lines =<< trim END
4616 vim9script
4617 command CmdA echomsg 'CmdA'
4618 command CmdB echomsg 'CmdB'
4619 Cmd
4620 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004621 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 4)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004622
4623 lines =<< trim END
4624 vim9script
4625 def Func()
4626 Cmd
4627 enddef
4628 Func()
4629 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004630 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 1)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004631
4632 lines =<< trim END
4633 vim9script
4634 nnoremap <F3> <ScriptCmd>Cmd<CR>
4635 feedkeys("\<F3>", 'xt')
4636 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004637 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 3)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004638
4639 delcommand CmdA
4640 delcommand CmdB
4641 nunmap <F3>
4642enddef
4643
Dominique Pelle923dce22021-11-21 11:36:04 +00004644" Execute this near the end, profiling doesn't stop until Vim exits.
Bram Moolenaard9162552021-07-11 15:26:13 +02004645" This only tests that it works, not the profiling output.
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004646def Test_profile_with_lambda()
Bram Moolenaar4ece1522021-07-11 16:31:51 +02004647 CheckFeature profile
4648
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004649 var lines =<< trim END
4650 vim9script
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004651
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004652 def ProfiledWithLambda()
4653 var n = 3
4654 echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n)
4655 enddef
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004656
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004657 def ProfiledNested()
4658 var x = 0
4659 def Nested(): any
4660 return x
4661 enddef
4662 Nested()
4663 enddef
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004664
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004665 def g:ProfiledNestedProfiled()
4666 var x = 0
4667 def Nested(): any
4668 return x
4669 enddef
4670 Nested()
4671 enddef
4672
4673 def Profile()
Bram Moolenaar48f69cd2022-03-15 16:16:47 +00004674 ProfiledWithLambda()
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004675 ProfiledNested()
4676
Bram Moolenaar48f69cd2022-03-15 16:16:47 +00004677 # Also profile the nested function. Use a different function, although
4678 # the contents is the same, to make sure it was not already compiled.
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004679 profile func *
4680 g:ProfiledNestedProfiled()
4681
4682 profdel func *
4683 profile pause
4684 enddef
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004685
4686 var result = 'done'
4687 try
4688 # mark functions for profiling now to avoid E1271
4689 profile start Xprofile.log
4690 profile func ProfiledWithLambda
4691 profile func ProfiledNested
4692
4693 Profile()
4694 catch
4695 result = 'failed: ' .. v:exception
4696 finally
4697 writefile([result], 'Xdidprofile')
4698 endtry
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004699 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004700 writefile(lines, 'Xprofile.vim', 'D')
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004701 call system(g:GetVimCommand()
4702 .. ' --clean'
4703 .. ' -c "so Xprofile.vim"'
4704 .. ' -c "qall!"')
4705 call assert_equal(0, v:shell_error)
4706
4707 assert_equal(['done'], readfile('Xdidprofile'))
4708 assert_true(filereadable('Xprofile.log'))
4709 delete('Xdidprofile')
4710 delete('Xprofile.log')
Bram Moolenaard9162552021-07-11 15:26:13 +02004711enddef
4712
Bram Moolenaar4f6e7722022-03-16 20:26:02 +00004713func Test_misplaced_type()
4714 CheckRunVimInTerminal
4715 call Run_Test_misplaced_type()
4716endfunc
4717
4718def Run_Test_misplaced_type()
Bram Moolenaar9510d222022-09-11 15:14:05 +01004719 writefile(['let g:somevar = "asdf"'], 'XTest_misplaced_type', 'D')
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004720 var buf = g:RunVimInTerminal('-S XTest_misplaced_type', {'rows': 6})
Bram Moolenaar9510d222022-09-11 15:14:05 +01004721 term_sendkeys(buf, ":vim9cmd echo islocked('somevar: string')\<CR>")
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004722 g:VerifyScreenDump(buf, 'Test_misplaced_type', {})
4723
4724 g:StopVimInTerminal(buf)
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004725enddef
4726
LemonBoya5d35902022-04-29 21:15:02 +01004727" Ensure echo doesn't crash when stringifying empty variables.
4728def Test_echo_uninit_variables()
4729 var res: string
4730
4731 var var_bool: bool
4732 var var_num: number
4733 var var_float: float
4734 var Var_func: func
4735 var var_string: string
4736 var var_blob: blob
LemonBoya5d35902022-04-29 21:15:02 +01004737 var var_list: list<any>
4738 var var_dict: dict<any>
4739
4740 redir => res
4741 echo var_bool
4742 echo var_num
4743 echo var_float
4744 echo Var_func
4745 echo var_string
4746 echo var_blob
LemonBoya5d35902022-04-29 21:15:02 +01004747 echo var_list
4748 echo var_dict
4749 redir END
4750
Bram Moolenaarf1d63b92022-05-06 13:37:42 +01004751 assert_equal(['false', '0', '0.0', 'function()', '', '0z', '[]', '{}'], res->split('\n'))
4752
4753 if has('job')
4754 var var_job: job
4755 var var_channel: channel
4756
4757 redir => res
4758 echo var_job
4759 echo var_channel
4760 redir END
4761
4762 assert_equal(['no process', 'channel fail'], res->split('\n'))
4763 endif
LemonBoya5d35902022-04-29 21:15:02 +01004764enddef
4765
Bram Moolenaar6342e2c2022-12-12 18:56:32 +00004766def Test_free_type_before_use()
4767 # this rather complicated script was freeing a type before using it
4768 var lines =<< trim END
4769 vim9script
4770
4771 def Scan(rel: list<dict<any>>): func(func(dict<any>))
4772 return (Emit: func(dict<any>)) => {
4773 for t in rel
4774 Emit(t)
4775 endfor
4776 }
4777 enddef
4778
4779 def Build(Cont: func(func(dict<any>))): list<dict<any>>
4780 var rel: list<dict<any>> = []
4781 Cont((t) => {
4782 add(rel, t)
4783 })
4784 return rel
4785 enddef
4786
4787 var R = [{A: 0}]
4788 var result = Scan(R)->Build()
4789 result = Scan(R)->Build()
4790
4791 assert_equal(R, result)
4792 END
4793 v9.CheckScriptSuccess(lines)
4794enddef
4795
Yegappan Lakshmanana76fbe62023-09-27 18:51:43 +02004796" The following complicated script used to cause an internal error (E340)
4797" because the funcref instruction memory was referenced after the instruction
4798" memory was reallocated (Github issue #13178)
4799def Test_refer_funcref_instr_after_realloc()
4800 var lines =<< trim END
4801 vim9script
4802 def A(d: bool)
4803 var e = abs(0)
4804 var f = &emoji
4805 &emoji = true
4806 if ['', '', '']->index('xxx') == 0
4807 eval 0 + 0
4808 endif
4809 if &filetype == 'xxx'
4810 var g = abs(0)
4811 while g > 0
4812 if getline(g) == ''
4813 break
4814 endif
4815 --g
4816 endwhile
4817 if g == 0
4818 return
4819 endif
4820 if d
4821 feedkeys($'{g}G')
4822 g = abs(0)
4823 endif
4824 var h = abs(0)
4825 var i = abs(0)
4826 var j = abs(0)
4827 while j < 0
4828 if abs(0) < h && getline(j) != ''
4829 break
4830 endif
4831 ++j
4832 endwhile
4833 feedkeys($'{g}G{j}G')
4834 return
4835 endif
4836 def B()
4837 enddef
4838 def C()
4839 enddef
4840 enddef
4841 A(false)
4842 END
4843 v9.CheckScriptSuccess(lines)
4844enddef
4845
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004846" Test for calling a deferred function after an exception
4847def Test_defer_after_exception()
4848 var lines =<< trim END
4849 vim9script
4850
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004851 var callTrace: list<number> = []
4852 def Bar()
4853 callTrace += [1]
4854 throw 'InnerException'
4855 enddef
4856
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004857 def Defer()
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004858 callTrace += [2]
4859 callTrace += [3]
4860 try
4861 Bar()
4862 catch /InnerException/
4863 callTrace += [4]
4864 endtry
4865 callTrace += [5]
4866 callTrace += [6]
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004867 enddef
4868
4869 def Foo()
4870 defer Defer()
4871 throw "TestException"
4872 enddef
4873
4874 try
4875 Foo()
4876 catch /TestException/
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004877 callTrace += [7]
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004878 endtry
4879
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004880 assert_equal([2, 3, 1, 4, 5, 6, 7], callTrace)
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004881 END
Yegappan Lakshmananec3cebb2023-10-27 19:35:26 +02004882 v9.CheckSourceSuccess(lines)
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004883enddef
4884
Yegappan Lakshmanan0ab500d2023-10-21 11:59:42 +02004885" Test for multiple deferred function which throw exceptions.
4886" Exceptions thrown by deferred functions should result in error messages but
4887" not propagated into the calling functions.
4888def Test_multidefer_with_exception()
4889 var lines =<< trim END
4890 vim9script
4891
4892 var callTrace: list<number> = []
4893 def Except()
4894 callTrace += [1]
4895 throw 'InnerException'
4896 callTrace += [2]
4897 enddef
4898
4899 def FirstDefer()
4900 callTrace += [3]
4901 callTrace += [4]
4902 enddef
4903
4904 def SecondDeferWithExcept()
4905 callTrace += [5]
4906 Except()
4907 callTrace += [6]
4908 enddef
4909
4910 def ThirdDefer()
4911 callTrace += [7]
4912 callTrace += [8]
4913 enddef
4914
4915 def Foo()
4916 callTrace += [9]
4917 defer FirstDefer()
4918 defer SecondDeferWithExcept()
4919 defer ThirdDefer()
4920 callTrace += [10]
4921 enddef
4922
4923 v:errmsg = ''
4924 try
4925 callTrace += [11]
4926 Foo()
4927 callTrace += [12]
4928 catch /TestException/
4929 callTrace += [13]
4930 catch
4931 callTrace += [14]
4932 finally
4933 callTrace += [15]
4934 endtry
4935 callTrace += [16]
4936
4937 assert_equal('E605: Exception not caught: InnerException', v:errmsg)
4938 assert_equal([11, 9, 10, 7, 8, 5, 1, 3, 4, 12, 15, 16], callTrace)
4939 END
Yegappan Lakshmananec3cebb2023-10-27 19:35:26 +02004940 v9.CheckSourceSuccess(lines)
4941enddef
4942
Yegappan Lakshmanana185a312023-12-16 14:36:08 +01004943" Test for using ":defer" inside an if statement with a false condition
4944def Test_defer_skipped()
4945 var lines =<< trim END
4946 def Foo()
4947 if false
4948 defer execute('echow "hello"', "")
4949 endif
4950 enddef
4951 defcompile
4952 END
4953 v9.CheckSourceSuccess(lines)
4954enddef
4955
Yegappan Lakshmanan062bb6b2023-12-16 14:46:40 +01004956" Test for using defer without parenthesis for the function name
4957def Test_defer_func_without_paren()
4958 var lines =<< trim END
4959 vim9script
4960 def Foo()
4961 defer Bar
4962 enddef
4963 defcompile
4964 END
4965 v9.CheckScriptFailure(lines, 'E107: Missing parentheses: Bar', 1)
4966enddef
4967
4968" Test for using defer without parenthesis for the function name
4969def Test_defer_non_existing_func()
4970 var lines =<< trim END
4971 vim9script
4972 def Foo()
4973 defer Bar()
4974 enddef
4975 defcompile
4976 END
4977 v9.CheckScriptFailure(lines, 'E1001: Variable not found: Bar', 1)
4978enddef
4979
4980" Test for using defer with an invalid function name
4981def Test_defer_invalid_func()
4982 var lines =<< trim END
4983 vim9script
4984 def Foo()
4985 var Abc = 10
4986 defer Abc()
4987 enddef
4988 defcompile
4989 END
4990 v9.CheckScriptFailure(lines, 'E129: Function name required', 2)
4991enddef
4992
4993" Test for using defer with an invalid argument to a function
4994def Test_defer_invalid_func_arg()
4995 var lines =<< trim END
4996 vim9script
4997 def Bar(x: number)
4998 enddef
4999 def Foo()
5000 defer Bar(a)
5001 enddef
5002 defcompile
5003 END
5004 v9.CheckScriptFailure(lines, 'E1001: Variable not found: a', 1)
5005enddef
5006
5007" Test for using an non-existing type in a "for" statement.
5008def Test_invalid_type_in_for()
5009 var lines =<< trim END
5010 vim9script
5011 def Foo()
5012 for b: x in range(10)
5013 endfor
5014 enddef
5015 defcompile
5016 END
Yegappan Lakshmanan1b531722024-05-09 09:12:31 +02005017 v9.CheckSourceFailure(lines, 'E1010: Type not recognized: x', 1)
Yegappan Lakshmanan062bb6b2023-12-16 14:46:40 +01005018enddef
5019
5020" Test for using a line break between the variable name and the type in a for
5021" statement.
5022def Test_for_stmt_space_before_type()
5023 var lines =<< trim END
5024 vim9script
5025 def Foo()
5026 for a
5027 :number in range(10)
5028 endfor
5029 enddef
5030 defcompile
5031 END
5032 v9.CheckSourceFailure(lines, 'E1059: No white space allowed before colon: :number in range(10)', 2)
5033enddef
5034
zeertzjqc029c132024-03-28 11:37:26 +01005035" This test used to cause a use-after-free memory access
Yegappan Lakshmanan28d71b52024-01-12 17:21:55 +01005036def Test_for_empty_line_after_lambda()
5037 var lines =<< trim END
5038 vim9script
5039 echomsg range(0, 2)->map((_, v) => {
5040 return 1
5041 })
5042
5043 assert_equal('[1, 1, 1]', v:statusmsg)
5044 END
5045 v9.CheckSourceSuccess(lines)
5046
5047 lines =<< trim END
5048 vim9script
5049 echomsg range(0, 1)->map((_, v) => {
5050 return 1
5051 }) range(0, 1)->map((_, v) => {
5052 return 2
5053 }) # comment
5054
5055 assert_equal('[1, 1] [2, 2]', v:statusmsg)
5056 END
5057 v9.CheckSourceSuccess(lines)
5058enddef
5059
Yegappan Lakshmanan3fa8f772024-04-04 21:42:07 +02005060" Test for evaluating a lambda block from a string
5061def Test_eval_lambda_block()
5062 var lines =<< trim END
5063 vim9script
5064 var Fn = eval("(x: number): number => {\nreturn x * 2\n}")
5065 assert_equal(6, Fn(3))
5066 END
5067 v9.CheckSourceSuccess(lines)
5068enddef
5069
Yegappan Lakshmananda9d3452024-05-02 13:02:36 +02005070" Test for using various null values
5071def Test_null_values()
5072 var lines =<< trim END
5073 var nullValues = [
5074 [null, 1, 'null', 7, 'special'],
5075 [null_blob, 1, '0z', 10, 'blob'],
5076 [null_channel, 1, 'channel fail', 9, 'channel'],
5077 [null_dict, 1, '{}', 4, 'dict<any>'],
5078 [null_function, 1, "function('')", 2, 'func(...): unknown'],
5079 [null_job, 1, 'no process', 8, 'job'],
5080 [null_list, 1, '[]', 3, 'list<any>'],
5081 [null_object, 1, 'object of [unknown]', 13, 'object<Unknown>'],
5082 [null_partial, 1, "function('')", 2, 'func(...): unknown'],
5083 [null_string, 1, "''", 1, 'string']
5084 ]
5085
5086 for [Val, emptyExp, stringExp, typeExp, typenameExp] in nullValues
5087 assert_equal(emptyExp, empty(Val))
5088 assert_equal(stringExp, string(Val))
5089 assert_equal(typeExp, type(Val))
5090 assert_equal(typenameExp, typename(Val))
5091 assert_equal(Val, copy(Val))
5092 assert_equal(-1, test_refcount(Val))
5093 endfor
5094 END
5095 v9.CheckSourceDefAndScriptSuccess(lines)
5096enddef
5097
Yegappan Lakshmanan1b531722024-05-09 09:12:31 +02005098" Test for using an unknown type in a typecast
5099def Test_unknown_type_in_typecast()
5100 var lines =<< trim END
5101 vim9script
5102 var a = <MyType>b
5103 END
5104 v9.CheckSourceFailure(lines, 'E1010: Type not recognized: MyType', 2)
5105
5106 lines =<< trim END
5107 vim9script
5108 var Fn = <funcx(number, number): number>b
5109 END
5110 v9.CheckSourceFailure(lines, 'E1010: Type not recognized: funcx(number, number): number', 2)
Yegappan Lakshmananfe424d12024-05-17 18:20:43 +02005111
5112 # Wrong type in a type cast
5113 lines =<< trim END
5114 vim9script
5115 var i: number = <number>true
5116 END
5117 v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected number but got bool', 2)
Yegappan Lakshmanan1b531722024-05-09 09:12:31 +02005118enddef
5119
Bram Moolenaar585fea72020-04-02 22:33:21 +02005120" Keep this last, it messes up highlighting.
5121def Test_substitute_cmd()
5122 new
5123 setline(1, 'something')
5124 :substitute(some(other(
5125 assert_equal('otherthing', getline(1))
5126 bwipe!
5127
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02005128 # also when the context is Vim9 script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02005129 var lines =<< trim END
Bram Moolenaar585fea72020-04-02 22:33:21 +02005130 vim9script
5131 new
5132 setline(1, 'something')
5133 :substitute(some(other(
5134 assert_equal('otherthing', getline(1))
5135 bwipe!
5136 END
Bram Moolenaardd674772022-09-15 22:26:18 +01005137 writefile(lines, 'Xvim9lines', 'D')
Bram Moolenaar585fea72020-04-02 22:33:21 +02005138 source Xvim9lines
Bram Moolenaar585fea72020-04-02 22:33:21 +02005139enddef
5140
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01005141" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker