blob: 550c725dd7641520de620bac34409e0d1cc29ed6 [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
Yegappan Lakshmanan0072cee2025-01-07 20:22:32 +0100598def Test_block_in_a_string()
599 var lines =<< trim END
600 vim9script
601
602 def Foo(): string
603 var x = ' => { # abc'
604 return x
605 enddef
606
607 assert_equal(' => { # abc', Foo())
608
609 def Bar(): string
610 var x = " => { # abc"
611 return x
612 enddef
613
614 assert_equal(" => { # abc", Bar())
615 END
616 v9.CheckSourceSuccess(lines)
617enddef
618
Bram Moolenaard032f342020-07-18 18:13:02 +0200619func g:NoSuchFunc()
620 echo 'none'
621endfunc
622
Bram Moolenaar9e1d9e32021-01-11 20:17:34 +0100623def Test_try_catch_throw()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200624 var l = []
Bram Moolenaar7a092242020-04-16 22:10:49 +0200625 try # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100626 add(l, '1')
627 throw 'wrong'
Bram Moolenaar9d383f32023-05-14 21:38:12 +0100628 add(l, '2') # "unreachable code"
Bram Moolenaar7a092242020-04-16 22:10:49 +0200629 catch # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100630 add(l, v:exception)
Bram Moolenaar7a092242020-04-16 22:10:49 +0200631 finally # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100632 add(l, '3')
Bram Moolenaar7a092242020-04-16 22:10:49 +0200633 endtry # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100634 assert_equal(['1', 'wrong', '3'], l)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200635
Bram Moolenaare8593122020-07-18 15:17:02 +0200636 l = []
637 try
638 try
639 add(l, '1')
640 throw 'wrong'
Bram Moolenaar9d383f32023-05-14 21:38:12 +0100641 add(l, '2') # "unreachable code"
Bram Moolenaare8593122020-07-18 15:17:02 +0200642 catch /right/
643 add(l, v:exception)
644 endtry
645 catch /wrong/
646 add(l, 'caught')
Bram Moolenaar204852a2022-03-05 12:56:44 +0000647 finally
Bram Moolenaare8593122020-07-18 15:17:02 +0200648 add(l, 'finally')
649 endtry
650 assert_equal(['1', 'caught', 'finally'], l)
651
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200652 var n: number
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200653 try
654 n = l[3]
655 catch /E684:/
656 n = 99
657 endtry
658 assert_equal(99, n)
659
Bram Moolenaar69f70502021-01-01 16:10:46 +0100660 var done = 'no'
661 if 0
662 try | catch | endtry
663 else
664 done = 'yes'
665 endif
666 assert_equal('yes', done)
667
668 done = 'no'
669 if 1
670 done = 'yes'
671 else
672 try | catch | endtry
673 done = 'never'
674 endif
675 assert_equal('yes', done)
676
677 if 1
678 else
679 try | catch /pat/ | endtry
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000680 try | catch /pat/
Bram Moolenaar69f70502021-01-01 16:10:46 +0100681 endtry
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000682 try
Bram Moolenaar69f70502021-01-01 16:10:46 +0100683 catch /pat/ | endtry
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000684 try
685 catch /pat/
Bram Moolenaar69f70502021-01-01 16:10:46 +0100686 endtry
687 endif
688
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200689 try
Bram Moolenaarcc673e72020-08-16 17:33:35 +0200690 # string slice returns a string, not a number
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200691 n = g:astring[3]
Bram Moolenaar5e654232020-09-16 15:22:00 +0200692 catch /E1012:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200693 n = 77
694 endtry
695 assert_equal(77, n)
696
697 try
698 n = l[g:astring]
Bram Moolenaar5e654232020-09-16 15:22:00 +0200699 catch /E1012:/
Bram Moolenaar56acb092020-08-16 14:48:19 +0200700 n = 88
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200701 endtry
Bram Moolenaar56acb092020-08-16 14:48:19 +0200702 assert_equal(88, n)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200703
704 try
705 n = s:does_not_exist
706 catch /E121:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200707 n = 111
708 endtry
709 assert_equal(111, n)
710
711 try
712 n = g:does_not_exist
713 catch /E121:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200714 n = 121
715 endtry
716 assert_equal(121, n)
717
Bram Moolenaare0de1712020-12-02 17:36:54 +0100718 var d = {one: 1}
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200719 try
720 n = d[g:astring]
721 catch /E716:/
722 n = 222
723 endtry
724 assert_equal(222, n)
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200725
726 try
727 n = -g:astring
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200728 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200729 n = 233
730 endtry
731 assert_equal(233, n)
732
733 try
734 n = +g:astring
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200735 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200736 n = 244
737 endtry
738 assert_equal(244, n)
739
740 try
741 n = +g:alist
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +0200742 catch /E1012:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200743 n = 255
744 endtry
745 assert_equal(255, n)
746
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200747 var nd: dict<any>
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200748 try
Bram Moolenaar2e5910b2021-02-03 17:41:24 +0100749 nd = {[g:alist]: 1}
750 catch /E1105:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200751 n = 266
752 endtry
753 assert_equal(266, n)
754
Bram Moolenaar755bf2b2023-01-28 19:38:49 +0000755 l = [1, 2, 3]
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200756 try
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +0000757 [n] = l
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200758 catch /E1093:/
759 n = 277
760 endtry
761 assert_equal(277, n)
762
Bram Moolenaare8593122020-07-18 15:17:02 +0200763 try
764 &ts = g:astring
Bram Moolenaar5e654232020-09-16 15:22:00 +0200765 catch /E1012:/
Bram Moolenaare8593122020-07-18 15:17:02 +0200766 n = 288
767 endtry
768 assert_equal(288, n)
769
770 try
771 &backspace = 'asdf'
772 catch /E474:/
773 n = 299
774 endtry
775 assert_equal(299, n)
776
777 l = [1]
778 try
779 l[3] = 3
780 catch /E684:/
781 n = 300
782 endtry
783 assert_equal(300, n)
784
785 try
Bram Moolenaare8593122020-07-18 15:17:02 +0200786 unlet g:does_not_exist
787 catch /E108:/
788 n = 322
789 endtry
790 assert_equal(322, n)
791
792 try
Bram Moolenaar2bede172020-11-19 18:53:18 +0100793 d = {text: 1, [g:astring]: 2}
Bram Moolenaare8593122020-07-18 15:17:02 +0200794 catch /E721:/
795 n = 333
796 endtry
797 assert_equal(333, n)
798
799 try
Bram Moolenaar62aec932022-01-29 21:45:34 +0000800 l = g:DeletedFunc()
Bram Moolenaare8593122020-07-18 15:17:02 +0200801 catch /E933:/
802 n = 344
803 endtry
804 assert_equal(344, n)
Bram Moolenaard032f342020-07-18 18:13:02 +0200805
806 try
Yegappan Lakshmanana764e732021-07-25 15:57:32 +0200807 echo range(1, 2, 0)
808 catch /E726:/
Bram Moolenaard032f342020-07-18 18:13:02 +0200809 n = 355
810 endtry
811 assert_equal(355, n)
812
Bram Moolenaarcfcd0112020-09-27 15:19:27 +0200813 var P = function('g:NoSuchFunc')
Bram Moolenaard032f342020-07-18 18:13:02 +0200814 delfunc g:NoSuchFunc
815 try
816 echo P()
817 catch /E117:/
818 n = 366
819 endtry
820 assert_equal(366, n)
821
822 try
823 echo g:NoSuchFunc()
824 catch /E117:/
825 n = 377
826 endtry
827 assert_equal(377, n)
828
829 try
830 echo g:alist + 4
831 catch /E745:/
832 n = 388
833 endtry
834 assert_equal(388, n)
835
836 try
837 echo 4 + g:alist
838 catch /E745:/
839 n = 399
840 endtry
841 assert_equal(399, n)
842
843 try
844 echo g:alist.member
845 catch /E715:/
846 n = 400
847 endtry
848 assert_equal(400, n)
849
850 try
851 echo d.member
852 catch /E716:/
853 n = 411
854 endtry
855 assert_equal(411, n)
Bram Moolenaard9d77892021-02-12 21:32:47 +0100856
857 var counter = 0
858 for i in range(4)
859 try
860 eval [][0]
861 catch
862 endtry
863 counter += 1
864 endfor
865 assert_equal(4, counter)
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100866
Bram Moolenaar9fa5dab2021-07-20 19:18:44 +0200867 # no requirement for spaces before |
868 try|echo 0|catch|endtry
869
Bram Moolenaar003312b2021-12-20 10:55:35 +0000870 # return in try with finally
871 def ReturnInTry(): number
872 var ret = 4
873 try
874 return ret
875 catch /this/
876 return -1
877 catch /that/
878 return -1
879 finally
880 # changing ret has no effect
881 ret = 7
882 endtry
883 return -2
884 enddef
885 assert_equal(4, ReturnInTry())
886
887 # return in catch with finally
888 def ReturnInCatch(): number
889 var ret = 5
890 try
891 throw 'getout'
Bram Moolenaar9d383f32023-05-14 21:38:12 +0100892 return -1 # "unreachable code"
Bram Moolenaar003312b2021-12-20 10:55:35 +0000893 catch /getout/
894 # ret is evaluated here
895 return ret
896 finally
897 # changing ret later has no effect
898 ret = -3
899 endtry
900 return -2
901 enddef
902 assert_equal(5, ReturnInCatch())
903
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100904 # return in finally after empty catch
905 def ReturnInFinally(): number
906 try
907 finally
Bram Moolenaar003312b2021-12-20 10:55:35 +0000908 return 6
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100909 endtry
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100910 enddef
Bram Moolenaar003312b2021-12-20 10:55:35 +0000911 assert_equal(6, ReturnInFinally())
Bram Moolenaar8ac681a2021-06-15 20:06:34 +0200912
913 var lines =<< trim END
914 vim9script
915 try
916 acos('0.5')
917 ->setline(1)
918 catch
919 g:caught = v:exception
920 endtry
921 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000922 v9.CheckScriptSuccess(lines)
Yegappan Lakshmanan4490ec42021-07-27 22:00:44 +0200923 assert_match('E1219: Float or Number required for argument 1', g:caught)
Bram Moolenaar8ac681a2021-06-15 20:06:34 +0200924 unlet g:caught
Bram Moolenaar41978282021-07-04 14:47:30 +0200925
926 # missing catch and/or finally
927 lines =<< trim END
928 vim9script
929 try
930 echo 'something'
931 endtry
932 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000933 v9.CheckScriptFailure(lines, 'E1032:')
rbtnn84934992021-08-07 13:26:53 +0200934
935 # skipping try-finally-endtry when try-finally-endtry is used in another block
936 lines =<< trim END
937 if v:true
938 try
939 finally
940 endtry
941 else
942 try
943 finally
944 endtry
945 endif
946 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000947 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100948enddef
949
Bram Moolenaara2c00282023-05-14 22:05:15 +0100950def Test_unreachable_after()
951 var lines =<< trim END
952 try
953 throw 'Error'
954 echo 'not reached'
955 catch /Error/
956 endtry
957 END
958 v9.CheckDefFailure(lines, 'E1095: Unreachable code after :throw')
959
960 lines =<< trim END
961 def SomeFunc(): number
962 try
963 return 3
964 echo 'not reached'
965 catch /Error/
966 endtry
967 return 4
968 enddef
969 defcompile
970 END
971 v9.CheckScriptFailure(lines, 'E1095: Unreachable code after :return')
972enddef
973
Bram Moolenaar3ef2e412023-04-30 18:50:48 +0100974def Test_throw_in_nested_try()
975 var lines =<< trim END
976 vim9script
977
978 def Try(F: func(): void)
979 try
980 F()
981 catch
982 endtry
983 enddef
984
985 class X
986 def F()
987 try
988 throw 'Foobar'
989 catch
990 throw v:exception
991 endtry
992 enddef
993 endclass
994
995 def Test_TryMethod()
996 var x = X.new()
997 Try(() => x.F())
998 enddef
999
1000
1001 try
1002 Test_TryMethod()
1003 catch
1004 endtry
1005 END
1006 v9.CheckScriptSuccess(lines)
1007enddef
1008
Bram Moolenaar28bf6492022-03-03 15:11:20 +00001009def Test_try_var_decl()
1010 var lines =<< trim END
1011 vim9script
1012 try
1013 var in_try = 1
1014 assert_equal(1, get(s:, 'in_try', -1))
1015 throw "getout"
1016 catch
1017 var in_catch = 2
1018 assert_equal(-1, get(s:, 'in_try', -1))
1019 assert_equal(2, get(s:, 'in_catch', -1))
1020 finally
1021 var in_finally = 3
1022 assert_equal(-1, get(s:, 'in_try', -1))
1023 assert_equal(-1, get(s:, 'in_catch', -1))
1024 assert_equal(3, get(s:, 'in_finally', -1))
1025 endtry
1026 assert_equal(-1, get(s:, 'in_try', -1))
1027 assert_equal(-1, get(s:, 'in_catch', -1))
1028 assert_equal(-1, get(s:, 'in_finally', -1))
1029 END
1030 v9.CheckScriptSuccess(lines)
1031enddef
1032
Bram Moolenaar53c29612022-01-12 16:18:18 +00001033def Test_try_ends_in_return()
1034 var lines =<< trim END
1035 vim9script
1036 def Foo(): string
1037 try
1038 return 'foo'
1039 catch
1040 return 'caught'
1041 endtry
1042 enddef
1043 assert_equal('foo', Foo())
1044 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001045 v9.CheckScriptSuccess(lines)
Bram Moolenaar53c29612022-01-12 16:18:18 +00001046
1047 lines =<< trim END
1048 vim9script
1049 def Foo(): string
1050 try
1051 return 'foo'
1052 catch
1053 return 'caught'
1054 endtry
1055 echo 'notreached'
1056 enddef
1057 assert_equal('foo', Foo())
1058 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001059 v9.CheckScriptFailure(lines, 'E1095:')
Bram Moolenaar53c29612022-01-12 16:18:18 +00001060
1061 lines =<< trim END
1062 vim9script
1063 def Foo(): string
1064 try
1065 return 'foo'
1066 catch /x/
1067 return 'caught'
1068 endtry
1069 enddef
1070 assert_equal('foo', Foo())
1071 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001072 v9.CheckScriptFailure(lines, 'E1027:')
Bram Moolenaar53c29612022-01-12 16:18:18 +00001073
1074 lines =<< trim END
1075 vim9script
1076 def Foo(): string
1077 try
1078 echo 'foo'
1079 catch
1080 echo 'caught'
1081 finally
1082 return 'done'
1083 endtry
1084 enddef
1085 assert_equal('done', Foo())
1086 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001087 v9.CheckScriptSuccess(lines)
Bram Moolenaar53c29612022-01-12 16:18:18 +00001088
1089enddef
1090
Bram Moolenaar3f987b52021-06-30 12:02:24 +02001091def Test_try_in_catch()
1092 var lines =<< trim END
1093 vim9script
1094 var seq = []
1095 def DoIt()
1096 try
1097 seq->add('throw 1')
1098 eval [][0]
1099 seq->add('notreached')
1100 catch
1101 seq->add('catch')
1102 try
1103 seq->add('throw 2')
1104 eval [][0]
1105 seq->add('notreached')
1106 catch /nothing/
1107 seq->add('notreached')
1108 endtry
1109 seq->add('done')
1110 endtry
1111 enddef
1112 DoIt()
1113 assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq)
1114 END
1115enddef
1116
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001117def Test_error_in_catch()
1118 var lines =<< trim END
1119 try
1120 eval [][0]
1121 catch /E684:/
1122 eval [][0]
1123 endtry
1124 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001125 v9.CheckDefExecFailure(lines, 'E684:', 4)
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001126enddef
1127
Bram Moolenaar2e34c342021-03-14 12:13:33 +01001128" :while at the very start of a function that :continue jumps to
Bram Moolenaar62aec932022-01-29 21:45:34 +00001129def s:TryContinueFunc()
Bram Moolenaar2e34c342021-03-14 12:13:33 +01001130 while g:Count < 2
1131 g:sequence ..= 't'
1132 try
1133 echoerr 'Test'
1134 catch
1135 g:Count += 1
1136 g:sequence ..= 'c'
1137 continue
1138 endtry
1139 g:sequence ..= 'e'
1140 g:Count += 1
1141 endwhile
1142enddef
1143
1144def Test_continue_in_try_in_while()
1145 g:Count = 0
1146 g:sequence = ''
1147 TryContinueFunc()
1148 assert_equal('tctc', g:sequence)
1149 unlet g:Count
1150 unlet g:sequence
1151enddef
1152
Bram Moolenaar873f8242022-03-10 21:53:44 +00001153def Test_break_in_try_in_for()
1154 var lines =<< trim END
1155 vim9script
1156 def Ls(): list<string>
1157 var ls: list<string>
1158 for s in ['abc', 'def']
1159 for _ in [123, 456]
1160 try
1161 eval [][0]
1162 catch
1163 break
1164 endtry
1165 endfor
1166 ls += [s]
1167 endfor
1168 return ls
1169 enddef
1170 assert_equal(['abc', 'def'], Ls())
1171 END
1172 v9.CheckScriptSuccess(lines)
1173enddef
1174
Bram Moolenaar9cb577a2021-02-22 22:45:10 +01001175def Test_nocatch_return_in_try()
1176 # return in try block returns normally
1177 def ReturnInTry(): string
1178 try
1179 return '"some message"'
1180 catch
1181 endtry
1182 return 'not reached'
1183 enddef
1184 exe 'echoerr ' .. ReturnInTry()
1185enddef
1186
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001187def Test_cnext_works_in_catch()
1188 var lines =<< trim END
1189 vim9script
Bram Moolenaarc3235272021-07-10 19:42:03 +02001190 au BufEnter * eval 1 + 2
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001191 writefile(['text'], 'Xcncfile1')
1192 writefile(['text'], 'Xcncfile2')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001193 var items = [
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001194 {lnum: 1, filename: 'Xcncfile1', valid: true},
1195 {lnum: 1, filename: 'Xcncfile2', valid: true}
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001196 ]
1197 setqflist([], ' ', {items: items})
1198 cwindow
1199
1200 def CnextOrCfirst()
1201 # if cnext fails, cfirst is used
1202 try
1203 cnext
1204 catch
1205 cfirst
1206 endtry
1207 enddef
1208
1209 CnextOrCfirst()
1210 CnextOrCfirst()
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001211 writefile([getqflist({idx: 0}).idx], 'Xcncresult')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001212 qall
1213 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001214 writefile(lines, 'XCatchCnext', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001215 g:RunVim([], [], '--clean -S XCatchCnext')
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001216 assert_equal(['1'], readfile('Xcncresult'))
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001217
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001218 delete('Xcncfile1')
1219 delete('Xcncfile2')
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001220 delete('Xcncresult')
Bram Moolenaar1430cee2021-01-17 19:20:32 +01001221enddef
1222
Bram Moolenaar9e1d9e32021-01-11 20:17:34 +01001223def Test_throw_skipped()
1224 if 0
1225 throw dontgethere
1226 endif
1227enddef
1228
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001229def Test_nocatch_throw_silenced()
1230 var lines =<< trim END
1231 vim9script
1232 def Func()
1233 throw 'error'
1234 enddef
1235 silent! Func()
1236 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001237 writefile(lines, 'XthrowSilenced', 'D')
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001238 source XthrowSilenced
Bram Moolenaar8f81b222021-01-14 21:47:06 +01001239enddef
1240
Bram Moolenaara2c00282023-05-14 22:05:15 +01001241" g:DeletedFunc() is found when compiling Test_try_catch_throw() and then
1242" deleted, this should give a runtime error.
Bram Moolenaare8593122020-07-18 15:17:02 +02001243def DeletedFunc(): list<any>
1244 return ['delete me']
1245enddef
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001246defcompile DeletedFunc
1247
1248call test_override('unreachable', 1)
1249defcompile Test_try_catch_throw
1250call test_override('unreachable', 0)
1251
Bram Moolenaare8593122020-07-18 15:17:02 +02001252delfunc DeletedFunc
1253
Bram Moolenaar62aec932022-01-29 21:45:34 +00001254def s:ThrowFromDef()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001255 throw "getout" # comment
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001256enddef
1257
Bram Moolenaar62aec932022-01-29 21:45:34 +00001258func s:CatchInFunc()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001259 try
Bram Moolenaar62aec932022-01-29 21:45:34 +00001260 call s:ThrowFromDef()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001261 catch
1262 let g:thrown_func = v:exception
1263 endtry
1264endfunc
1265
Bram Moolenaar62aec932022-01-29 21:45:34 +00001266def s:CatchInDef()
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001267 try
1268 ThrowFromDef()
1269 catch
1270 g:thrown_def = v:exception
1271 endtry
1272enddef
1273
Bram Moolenaar62aec932022-01-29 21:45:34 +00001274def s:ReturnFinally(): string
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001275 try
1276 return 'intry'
Bram Moolenaar204852a2022-03-05 12:56:44 +00001277 finally
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001278 g:in_finally = 'finally'
1279 endtry
1280 return 'end'
1281enddef
1282
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001283def Test_try_catch_nested()
1284 CatchInFunc()
1285 assert_equal('getout', g:thrown_func)
1286
1287 CatchInDef()
1288 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001289
1290 assert_equal('intry', ReturnFinally())
1291 assert_equal('finally', g:in_finally)
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001292
1293 var l = []
1294 try
1295 l->add('1')
1296 throw 'bad'
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001297 l->add('x') # "unreachable code"
Bram Moolenaard3d8fee2021-06-30 19:54:43 +02001298 catch /bad/
1299 l->add('2')
1300 try
1301 l->add('3')
1302 throw 'one'
1303 l->add('x')
1304 catch /one/
1305 l->add('4')
1306 try
1307 l->add('5')
1308 throw 'more'
1309 l->add('x')
1310 catch /more/
1311 l->add('6')
1312 endtry
1313 endtry
1314 endtry
1315 assert_equal(['1', '2', '3', '4', '5', '6'], l)
Bram Moolenaar834193a2021-06-30 20:39:15 +02001316
1317 l = []
1318 try
1319 try
1320 l->add('1')
1321 throw 'foo'
1322 l->add('x')
1323 catch
1324 l->add('2')
1325 throw 'bar'
1326 l->add('x')
1327 finally
1328 l->add('3')
1329 endtry
1330 l->add('x')
1331 catch /bar/
1332 l->add('4')
1333 endtry
1334 assert_equal(['1', '2', '3', '4'], l)
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001335enddef
1336
Bram Moolenaar9d383f32023-05-14 21:38:12 +01001337call test_override('unreachable', 1)
1338defcompile Test_try_catch_nested
1339call test_override('unreachable', 0)
1340
Bram Moolenaar62aec932022-01-29 21:45:34 +00001341def s:TryOne(): number
Bram Moolenaar9939f572020-09-16 22:29:52 +02001342 try
1343 return 0
1344 catch
1345 endtry
1346 return 0
1347enddef
1348
Bram Moolenaar62aec932022-01-29 21:45:34 +00001349def s:TryTwo(n: number): string
Bram Moolenaar9939f572020-09-16 22:29:52 +02001350 try
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001351 var x = {}
Bram Moolenaar9939f572020-09-16 22:29:52 +02001352 catch
1353 endtry
1354 return 'text'
1355enddef
1356
1357def Test_try_catch_twice()
1358 assert_equal('text', TryOne()->TryTwo())
1359enddef
1360
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001361def Test_try_catch_match()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001362 var seq = 'a'
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001363 try
1364 throw 'something'
1365 catch /nothing/
1366 seq ..= 'x'
1367 catch /some/
1368 seq ..= 'b'
1369 catch /asdf/
1370 seq ..= 'x'
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001371 catch ?a\?sdf?
1372 seq ..= 'y'
Bram Moolenaarf575adf2020-02-20 20:41:06 +01001373 finally
1374 seq ..= 'c'
1375 endtry
1376 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +01001377enddef
1378
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001379def Test_try_catch_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001380 v9.CheckDefFailure(['catch'], 'E603:')
1381 v9.CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
1382 v9.CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
1383 v9.CheckDefFailure(['finally'], 'E606:')
1384 v9.CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
1385 v9.CheckDefFailure(['endtry'], 'E602:')
1386 v9.CheckDefFailure(['while 1', 'endtry'], 'E170:')
1387 v9.CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
1388 v9.CheckDefFailure(['if 1', 'endtry'], 'E171:')
1389 v9.CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001390
Bram Moolenaar62aec932022-01-29 21:45:34 +00001391 v9.CheckDefFailure(['throw'], 'E1143:')
1392 v9.CheckDefFailure(['throw xxx'], 'E1001:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001393enddef
1394
Bram Moolenaar7c5b3c0362021-02-14 22:40:57 +01001395def Try_catch_skipped()
1396 var l = []
1397 try
1398 finally
1399 endtry
1400
1401 if 1
1402 else
1403 try
1404 endtry
1405 endif
1406enddef
1407
1408" The skipped try/endtry was updating the wrong instruction.
1409def Test_try_catch_skipped()
1410 var instr = execute('disassemble Try_catch_skipped')
1411 assert_match("NEWLIST size 0\n", instr)
1412enddef
1413
Bram Moolenaar90a57162022-02-12 14:23:17 +00001414def Test_throw_line_number()
1415 def Func()
1416 eval 1 + 1
1417 eval 2 + 2
1418 throw 'exception'
1419 enddef
1420 try
1421 Func()
1422 catch /exception/
1423 assert_match('line 3', v:throwpoint)
1424 endtry
1425enddef
Bram Moolenaar7c5b3c0362021-02-14 22:40:57 +01001426
1427
Bram Moolenaar006ad482020-06-30 20:55:15 +02001428def Test_throw_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001429 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001430 var lines =<< trim END
Bram Moolenaar006ad482020-06-30 20:55:15 +02001431 vim9script
1432 try
1433 throw 'one'
1434 .. 'two'
1435 catch
1436 assert_equal('onetwo', v:exception)
1437 endtry
1438 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001439 v9.CheckScriptSuccess(lines)
Bram Moolenaar1e021e62020-10-16 20:25:23 +02001440
1441 lines =<< trim END
1442 vim9script
Bram Moolenaar352134b2020-10-17 22:04:08 +02001443 @r = ''
Bram Moolenaar1e021e62020-10-16 20:25:23 +02001444 def Func()
1445 throw @r
1446 enddef
1447 var result = ''
1448 try
1449 Func()
1450 catch /E1129:/
1451 result = 'caught'
1452 endtry
1453 assert_equal('caught', result)
1454 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001455 v9.CheckScriptSuccess(lines)
Bram Moolenaar006ad482020-06-30 20:55:15 +02001456enddef
1457
Bram Moolenaared677f52020-08-12 16:38:10 +02001458def Test_error_in_nested_function()
Bram Moolenaar03dfde22021-02-14 13:17:22 +01001459 # an error in a nested :function aborts executing in the calling :def function
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001460 var lines =<< trim END
Bram Moolenaared677f52020-08-12 16:38:10 +02001461 vim9script
1462 def Func()
1463 Error()
1464 g:test_var = 1
1465 enddef
1466 func Error() abort
1467 eval [][0]
1468 endfunc
1469 Func()
1470 END
1471 g:test_var = 0
Bram Moolenaar62aec932022-01-29 21:45:34 +00001472 v9.CheckScriptFailure(lines, 'E684:')
Bram Moolenaared677f52020-08-12 16:38:10 +02001473 assert_equal(0, g:test_var)
1474enddef
1475
Bram Moolenaar227c58a2021-04-28 20:40:44 +02001476def Test_abort_after_error()
1477 var lines =<< trim END
1478 vim9script
1479 while true
1480 echo notfound
1481 endwhile
1482 g:gotthere = true
1483 END
1484 g:gotthere = false
Bram Moolenaar62aec932022-01-29 21:45:34 +00001485 v9.CheckScriptFailure(lines, 'E121:')
Bram Moolenaar227c58a2021-04-28 20:40:44 +02001486 assert_false(g:gotthere)
1487 unlet g:gotthere
1488enddef
1489
Bram Moolenaar37c83712020-06-30 21:18:36 +02001490def Test_cexpr_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001491 # only checks line continuation
Bram Moolenaar37c83712020-06-30 21:18:36 +02001492 set errorformat=File\ %f\ line\ %l
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001493 var lines =<< trim END
Bram Moolenaar37c83712020-06-30 21:18:36 +02001494 vim9script
1495 cexpr 'File'
1496 .. ' someFile' ..
1497 ' line 19'
1498 assert_equal(19, getqflist()[0].lnum)
1499 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001500 v9.CheckScriptSuccess(lines)
Bram Moolenaar397a87a2022-03-20 21:14:15 +00001501
1502 lines =<< trim END
1503 vim9script
1504 def CexprFail()
1505 au QuickfixCmdPre * echo g:doesnotexist
1506 cexpr 'File otherFile line 99'
1507 g:didContinue = 'yes'
1508 enddef
1509 CexprFail()
1510 g:didContinue = 'also'
1511 END
1512 g:didContinue = 'no'
1513 v9.CheckScriptFailure(lines, 'E121: Undefined variable: g:doesnotexist')
1514 assert_equal('no', g:didContinue)
1515 au! QuickfixCmdPre
1516
1517 lines =<< trim END
1518 vim9script
1519 def CexprFail()
1520 cexpr g:aNumber
1521 g:didContinue = 'yes'
1522 enddef
1523 CexprFail()
1524 g:didContinue = 'also'
1525 END
1526 g:aNumber = 123
1527 g:didContinue = 'no'
1528 v9.CheckScriptFailure(lines, 'E777: String or List expected')
1529 assert_equal('no', g:didContinue)
1530 unlet g:didContinue
1531
Bram Moolenaar37c83712020-06-30 21:18:36 +02001532 set errorformat&
1533enddef
1534
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001535def Test_statusline_syntax()
1536 # legacy syntax is used for 'statusline'
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001537 var lines =<< trim END
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001538 vim9script
1539 func g:Status()
1540 return '%{"x" is# "x"}'
1541 endfunc
1542 set laststatus=2 statusline=%!Status()
1543 redrawstatus
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00001544 set laststatus statusline=
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001545 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001546 v9.CheckScriptSuccess(lines)
Bram Moolenaarc9edd6b2020-08-12 22:18:23 +02001547enddef
1548
Bram Moolenaarb2097502020-07-19 17:17:02 +02001549def Test_list_vimscript()
1550 # checks line continuation and comments
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001551 var lines =<< trim END
Bram Moolenaarb2097502020-07-19 17:17:02 +02001552 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001553 var mylist = [
Bram Moolenaarb2097502020-07-19 17:17:02 +02001554 'one',
1555 # comment
1556 'two', # empty line follows
1557
1558 'three',
1559 ]
1560 assert_equal(['one', 'two', 'three'], mylist)
1561 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001562 v9.CheckScriptSuccess(lines)
Bram Moolenaar66250c92020-08-20 15:02:42 +02001563
1564 # check all lines from heredoc are kept
1565 lines =<< trim END
1566 # comment 1
1567 two
1568 # comment 3
1569
1570 five
1571 # comment 6
1572 END
1573 assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines)
Bram Moolenaar4bce26b2021-01-22 22:06:56 +01001574
1575 lines =<< trim END
1576 [{
1577 a: 0}]->string()->assert_equal("[{'a': 0}]")
1578 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001579 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarb2097502020-07-19 17:17:02 +02001580enddef
1581
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001582if has('channel')
1583 let someJob = test_null_job()
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001584
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001585 def FuncWithError()
1586 echomsg g:someJob
1587 enddef
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001588
Bram Moolenaar2a1381c2020-05-05 23:32:58 +02001589 func Test_convert_emsg_to_exception()
1590 try
1591 call FuncWithError()
1592 catch
1593 call assert_match('Vim:E908:', v:exception)
1594 endtry
1595 endfunc
1596endif
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001597
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001598def Test_vim9script_mix()
1599 var lines =<< trim END
1600 if has(g:feature)
1601 " legacy script
1602 let g:legacy = 1
1603 finish
1604 endif
1605 vim9script
1606 g:legacy = 0
1607 END
1608 g:feature = 'eval'
1609 g:legacy = -1
Bram Moolenaar62aec932022-01-29 21:45:34 +00001610 v9.CheckScriptSuccess(lines)
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001611 assert_equal(1, g:legacy)
1612
1613 g:feature = 'noteval'
1614 g:legacy = -1
Bram Moolenaar62aec932022-01-29 21:45:34 +00001615 v9.CheckScriptSuccess(lines)
Bram Moolenaard3f8a9e2021-02-17 21:57:03 +01001616 assert_equal(0, g:legacy)
1617enddef
1618
Bram Moolenaar750802b2020-02-23 18:08:33 +01001619def Test_vim9script_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001620 v9.CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
1621 v9.CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +01001622
Bram Moolenaar62aec932022-01-29 21:45:34 +00001623 v9.CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:')
1624 v9.CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
Bram Moolenaarc785b9a2020-06-19 18:34:15 +02001625
Bram Moolenaare2e40752020-09-04 21:18:46 +02001626 assert_fails('vim9script', 'E1038:')
Bram Moolenaar107f7322022-02-06 17:30:41 +00001627 v9.CheckDefFailure(['vim9script'], 'E1038:')
Bram Moolenaar8cbf2492022-02-06 20:28:13 +00001628
1629 # no error when skipping
1630 if has('nothing')
1631 vim9script
1632 endif
Bram Moolenaarc970e422021-03-17 15:03:04 +01001633enddef
1634
Bram Moolenaar6c3843c2021-03-04 12:38:21 +01001635def Test_script_var_shadows_function()
1636 var lines =<< trim END
1637 vim9script
1638 def Func(): number
1639 return 123
1640 enddef
1641 var Func = 1
1642 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001643 v9.CheckScriptFailure(lines, 'E1041:', 5)
Bram Moolenaar6c3843c2021-03-04 12:38:21 +01001644enddef
1645
Bram Moolenaar052ff292021-12-11 13:54:46 +00001646def Test_function_shadows_script_var()
1647 var lines =<< trim END
1648 vim9script
1649 var Func = 1
1650 def Func(): number
1651 return 123
1652 enddef
1653 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001654 v9.CheckScriptFailure(lines, 'E1041:', 3)
Bram Moolenaar052ff292021-12-11 13:54:46 +00001655enddef
1656
Bram Moolenaarc3235272021-07-10 19:42:03 +02001657def Test_script_var_shadows_command()
1658 var lines =<< trim END
1659 var undo = 1
1660 undo = 2
1661 assert_equal(2, undo)
1662 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001663 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc3235272021-07-10 19:42:03 +02001664
1665 lines =<< trim END
1666 var undo = 1
1667 undo
1668 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001669 v9.CheckDefAndScriptFailure(lines, 'E1207:', 2)
Bram Moolenaarc3235272021-07-10 19:42:03 +02001670enddef
1671
Bram Moolenaar2ef91562021-12-11 16:14:07 +00001672def Test_vim9script_call_wrong_type()
1673 var lines =<< trim END
1674 vim9script
1675 var Time = 'localtime'
1676 Time()
1677 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001678 v9.CheckScriptFailure(lines, 'E1085:')
Bram Moolenaar2ef91562021-12-11 16:14:07 +00001679enddef
1680
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001681def Test_vim9script_reload_delfunc()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001682 var first_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001683 vim9script
1684 def FuncYes(): string
1685 return 'yes'
1686 enddef
1687 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001688 var withno_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001689 def FuncNo(): string
1690 return 'no'
1691 enddef
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001692 def g:DoCheck(no_exists: bool)
1693 assert_equal('yes', FuncYes())
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001694 assert_equal('no', FuncNo())
1695 enddef
1696 END
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001697 var nono_lines =<< trim END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001698 def g:DoCheck(no_exists: bool)
1699 assert_equal('yes', FuncYes())
Bram Moolenaar44d66522020-09-06 22:26:57 +02001700 assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001701 enddef
1702 END
1703
1704 # FuncNo() is defined
Bram Moolenaardd674772022-09-15 22:26:18 +01001705 writefile(first_lines + withno_lines, 'Xreloaded.vim', 'D')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001706 source Xreloaded.vim
1707 g:DoCheck(true)
1708
1709 # FuncNo() is not redefined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001710 writefile(first_lines + nono_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001711 source Xreloaded.vim
Bram Moolenaar50824712020-12-20 21:10:17 +01001712 g:DoCheck(false)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001713
1714 # FuncNo() is back
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001715 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001716 source Xreloaded.vim
Bram Moolenaar50824712020-12-20 21:10:17 +01001717 g:DoCheck(false)
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001718enddef
1719
Bram Moolenaar89483d42020-05-10 15:24:44 +02001720def Test_vim9script_reload_delvar()
1721 # write the script with a script-local variable
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001722 var lines =<< trim END
Bram Moolenaar89483d42020-05-10 15:24:44 +02001723 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001724 var name = 'string'
Bram Moolenaar89483d42020-05-10 15:24:44 +02001725 END
Bram Moolenaardd674772022-09-15 22:26:18 +01001726 writefile(lines, 'XreloadVar.vim', 'D')
Bram Moolenaar89483d42020-05-10 15:24:44 +02001727 source XreloadVar.vim
1728
1729 # now write the script using the same variable locally - works
1730 lines =<< trim END
1731 vim9script
1732 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001733 var name = 'string'
Bram Moolenaar89483d42020-05-10 15:24:44 +02001734 enddef
1735 END
1736 writefile(lines, 'XreloadVar.vim')
1737 source XreloadVar.vim
Bram Moolenaar89483d42020-05-10 15:24:44 +02001738enddef
1739
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001740def Test_func_redefine_error()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001741 var lines = [
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001742 'vim9script',
1743 'def Func()',
1744 ' eval [][0]',
1745 'enddef',
1746 'Func()',
1747 ]
Bram Moolenaardd674772022-09-15 22:26:18 +01001748 writefile(lines, 'Xtestscript.vim', 'D')
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001749
1750 for count in range(3)
1751 try
1752 source Xtestscript.vim
1753 catch /E684/
1754 # function name should contain <SNR> every time
Bram Moolenaarec892232022-05-06 17:53:06 +01001755 assert_match('E684: List index out of range', v:exception)
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001756 assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint)
1757 endtry
1758 endfor
Bram Moolenaarc4ce36d2020-08-14 17:08:15 +02001759enddef
1760
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001761def Test_func_redefine_fails()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001762 var lines =<< trim END
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001763 vim9script
1764 def Func()
1765 echo 'one'
1766 enddef
1767 def Func()
1768 echo 'two'
1769 enddef
1770 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001771 v9.CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001772
1773 lines =<< trim END
1774 vim9script
1775 def Foo(): string
1776 return 'foo'
Bram Moolenaar052ff292021-12-11 13:54:46 +00001777 enddef
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001778 def Func()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001779 var Foo = {-> 'lambda'}
Bram Moolenaarfa211f32020-08-07 22:00:26 +02001780 enddef
1781 defcompile
1782 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001783 v9.CheckScriptFailure(lines, 'E1073:')
Bram Moolenaarb9a2cac2020-08-01 22:23:20 +02001784enddef
1785
Bram Moolenaar91c7cbf2022-08-18 13:28:31 +01001786def Test_lambda_split()
1787 # this was using freed memory, because of the split expression
1788 var lines =<< trim END
1789 vim9script
1790 try
1791 0
1792 0->(0
1793 ->a.0(
1794 ->u
1795 END
1796 v9.CheckScriptFailure(lines, 'E1050:')
1797enddef
1798
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001799def Test_fixed_size_list()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001800 # will be allocated as one piece of memory, check that changes work
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001801 var l = [1, 2, 3, 4]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001802 l->remove(0)
1803 l->add(5)
1804 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001805 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001806enddef
1807
Bram Moolenaarae616492020-07-28 20:07:27 +02001808def Test_no_insert_xit()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001809 v9.CheckDefExecFailure(['a = 1'], 'E1100:')
1810 v9.CheckDefExecFailure(['c = 1'], 'E1100:')
1811 v9.CheckDefExecFailure(['i = 1'], 'E1100:')
1812 v9.CheckDefExecFailure(['t = 1'], 'E1100:')
1813 v9.CheckDefExecFailure(['x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02001814
Bram Moolenaar62aec932022-01-29 21:45:34 +00001815 v9.CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1816 v9.CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1817 v9.CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1818 v9.CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1819 v9.CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1820 v9.CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1821 v9.CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:')
1822 v9.CheckScriptFailure(['vim9script', 'o'], 'E1100:')
1823 v9.CheckScriptFailure(['vim9script', 't'], 'E1100:')
1824 v9.CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1825 v9.CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
Bram Moolenaarae616492020-07-28 20:07:27 +02001826enddef
1827
Bram Moolenaar62aec932022-01-29 21:45:34 +00001828def s:IfElse(what: number): string
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001829 var res = ''
Bram Moolenaar158906c2020-02-06 20:39:45 +01001830 if what == 1
1831 res = "one"
1832 elseif what == 2
1833 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001834 else
Bram Moolenaar158906c2020-02-06 20:39:45 +01001835 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001836 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +01001837 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001838enddef
1839
Bram Moolenaar158906c2020-02-06 20:39:45 +01001840def Test_if_elseif_else()
1841 assert_equal('one', IfElse(1))
1842 assert_equal('two', IfElse(2))
1843 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001844enddef
1845
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001846def Test_if_elseif_else_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001847 v9.CheckDefFailure(['elseif true'], 'E582:')
1848 v9.CheckDefFailure(['else'], 'E581:')
1849 v9.CheckDefFailure(['endif'], 'E580:')
1850 v9.CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:')
1851 v9.CheckDefFailure(['if true', 'echo 1'], 'E171:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01001852
1853 var lines =<< trim END
1854 var s = ''
1855 if s = ''
1856 endif
1857 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001858 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01001859
1860 lines =<< trim END
1861 var s = ''
1862 if s == ''
1863 elseif s = ''
1864 endif
1865 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001866 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaarfa010cd2022-04-03 16:13:07 +01001867
1868 lines =<< trim END
1869 var cond = true
1870 if cond
1871 echo 'true'
1872 elseif
1873 echo 'false'
1874 endif
1875 END
1876 v9.CheckDefAndScriptFailure(lines, ['E1143:', 'E15:'], 4)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001877enddef
1878
Bram Moolenaar505ed0c2022-05-05 17:02:46 +01001879def Test_if_else_func_using_var()
1880 var lines =<< trim END
1881 vim9script
1882
1883 const debug = true
1884 if debug
1885 var mode_chars = 'something'
1886 def Bits2Ascii()
1887 var x = mode_chars
1888 g:where = 'in true'
1889 enddef
1890 else
1891 def Bits2Ascii()
1892 g:where = 'in false'
1893 enddef
1894 endif
1895
1896 Bits2Ascii()
1897 END
1898 v9.CheckScriptSuccess(lines)
1899 assert_equal('in true', g:where)
1900 unlet g:where
1901
1902 lines =<< trim END
1903 vim9script
1904
1905 const debug = false
1906 if debug
1907 var mode_chars = 'something'
1908 def Bits2Ascii()
1909 g:where = 'in true'
1910 enddef
1911 else
1912 def Bits2Ascii()
1913 var x = mode_chars
1914 g:where = 'in false'
1915 enddef
1916 endif
1917
1918 Bits2Ascii()
1919 END
1920 v9.CheckScriptFailure(lines, 'E1001: Variable not found: mode_chars')
1921enddef
1922
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001923let g:bool_true = v:true
1924let g:bool_false = v:false
1925
1926def Test_if_const_expr()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02001927 var res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001928 if true ? true : false
1929 res = true
1930 endif
1931 assert_equal(true, res)
1932
Bram Moolenaar585fea72020-04-02 22:33:21 +02001933 g:glob = 2
1934 if false
Bram Moolenaar67979662020-06-20 22:50:47 +02001935 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001936 endif
1937 assert_equal(2, g:glob)
1938 if true
Bram Moolenaar67979662020-06-20 22:50:47 +02001939 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001940 endif
1941 assert_equal(3, g:glob)
1942
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001943 res = false
1944 if g:bool_true ? true : false
1945 res = true
1946 endif
1947 assert_equal(true, res)
1948
1949 res = false
1950 if true ? g:bool_true : false
1951 res = true
1952 endif
1953 assert_equal(true, res)
1954
1955 res = false
1956 if true ? true : g:bool_false
1957 res = true
1958 endif
1959 assert_equal(true, res)
1960
1961 res = false
1962 if true ? false : true
1963 res = true
1964 endif
1965 assert_equal(false, res)
1966
1967 res = false
1968 if false ? false : true
1969 res = true
1970 endif
1971 assert_equal(true, res)
1972
1973 res = false
1974 if false ? true : false
1975 res = true
1976 endif
1977 assert_equal(false, res)
1978
1979 res = false
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001980 if has('xyz') ? true : false
1981 res = true
1982 endif
1983 assert_equal(false, res)
1984
1985 res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001986 if true && true
1987 res = true
1988 endif
1989 assert_equal(true, res)
1990
1991 res = false
1992 if true && false
1993 res = true
1994 endif
1995 assert_equal(false, res)
1996
1997 res = false
1998 if g:bool_true && false
1999 res = true
2000 endif
2001 assert_equal(false, res)
2002
2003 res = false
2004 if true && g:bool_false
2005 res = true
2006 endif
2007 assert_equal(false, res)
2008
2009 res = false
2010 if false && false
2011 res = true
2012 endif
2013 assert_equal(false, res)
2014
2015 res = false
2016 if true || false
2017 res = true
2018 endif
2019 assert_equal(true, res)
2020
2021 res = false
2022 if g:bool_true || false
2023 res = true
2024 endif
2025 assert_equal(true, res)
2026
2027 res = false
2028 if true || g:bool_false
2029 res = true
2030 endif
2031 assert_equal(true, res)
2032
2033 res = false
2034 if false || false
2035 res = true
2036 endif
2037 assert_equal(false, res)
Bram Moolenaar3988f642020-08-27 22:43:03 +02002038
2039 # with constant "false" expression may be invalid so long as the syntax is OK
Bram Moolenaarc3235272021-07-10 19:42:03 +02002040 if false | eval 1 + 2 | endif
Bram Moolenaar3988f642020-08-27 22:43:03 +02002041 if false | eval burp + 234 | endif
2042 if false | echo burp 234 'asd' | endif
2043 if false
2044 burp
2045 endif
Bram Moolenaare525bdd2021-08-07 18:12:40 +02002046
Bram Moolenaar21ebb082022-02-04 21:58:58 +00002047 if 0
2048 if 1
2049 echo nothing
2050 elseif 1
2051 echo still nothing
2052 endif
2053 endif
2054
Bram Moolenaare525bdd2021-08-07 18:12:40 +02002055 # expression with line breaks skipped
2056 if false
2057 ('aaa'
2058 .. 'bbb'
2059 .. 'ccc'
2060 )->setline(1)
2061 endif
Yegappan Lakshmanane2038412024-12-14 19:59:24 +01002062
2063 if 1
2064 # do nothing
2065 else
2066 var [a] = [10]
2067 endif
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02002068enddef
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002069
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02002070def Test_if_const_expr_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00002071 v9.CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
2072 v9.CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
2073 v9.CheckDefFailure(["if has('aaa'"], 'E110:')
2074 v9.CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01002075enddef
2076
Bram Moolenaar62aec932022-01-29 21:45:34 +00002077def s:RunNested(i: number): number
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002078 var x: number = 0
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002079 if i % 2
2080 if 1
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002081 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002082 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002083 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02002084 endif
2085 x += 1
2086 else
2087 x += 1000
2088 endif
2089 return x
2090enddef
2091
2092def Test_nested_if()
2093 assert_equal(1, RunNested(1))
2094 assert_equal(1000, RunNested(2))
2095enddef
2096
Bram Moolenaarad39c092020-02-26 18:23:43 +01002097def Test_execute_cmd()
Bram Moolenaare4984292020-12-13 14:19:25 +01002098 # missing argument is ignored
2099 execute
2100 execute # comment
2101
Bram Moolenaarad39c092020-02-26 18:23:43 +01002102 new
2103 setline(1, 'default')
Bram Moolenaard2c61702020-09-06 15:58:36 +02002104 execute 'setline(1, "execute-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002105 assert_equal('execute-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002106
Bram Moolenaard2c61702020-09-06 15:58:36 +02002107 execute "setline(1, 'execute-string')"
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002108 assert_equal('execute-string', getline(1))
2109
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002110 var cmd1 = 'setline(1,'
2111 var cmd2 = '"execute-var")'
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002112 execute cmd1 cmd2 # comment
Bram Moolenaarad39c092020-02-26 18:23:43 +01002113 assert_equal('execute-var', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002114
Bram Moolenaard2c61702020-09-06 15:58:36 +02002115 execute cmd1 cmd2 '|setline(1, "execute-var-string")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002116 assert_equal('execute-var-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002117
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002118 var cmd_first = 'call '
2119 var cmd_last = 'setline(1, "execute-var-var")'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002120 execute cmd_first .. cmd_last
2121 assert_equal('execute-var-var', getline(1))
2122 bwipe!
Bram Moolenaar585fea72020-04-02 22:33:21 +02002123
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002124 var n = true
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02002125 execute 'echomsg' (n ? '"true"' : '"no"')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002126 assert_match('^true$', g:Screenline(&lines))
Bram Moolenaar2d6b20d2020-07-25 19:30:59 +02002127
Bram Moolenaare0de1712020-12-02 17:36:54 +01002128 echomsg [1, 2, 3] {a: 1, b: 2}
Bram Moolenaar62aec932022-01-29 21:45:34 +00002129 assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', g:Screenline(&lines))
Bram Moolenaare5abf7a2020-08-16 18:29:35 +02002130
Bram Moolenaar62aec932022-01-29 21:45:34 +00002131 v9.CheckDefFailure(['execute xxx'], 'E1001:', 1)
2132 v9.CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1)
2133 v9.CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1)
Bram Moolenaar0c7f2612022-02-17 19:44:07 +00002134 if has('channel')
2135 v9.CheckDefExecFailure(['execute test_null_channel()'], 'E908:', 1)
2136 endif
Bram Moolenaarad39c092020-02-26 18:23:43 +01002137enddef
2138
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002139def Test_execute_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002140 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002141 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002142 vim9script
2143 execute 'g:someVar'
2144 .. ' = ' ..
2145 '28'
2146 assert_equal(28, g:someVar)
2147 unlet g:someVar
2148 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002149 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002150enddef
2151
Bram Moolenaar43216612022-03-25 11:16:28 +00002152def Test_execute_finish()
2153 # the empty lines are relevant here
2154 var lines =<< trim END
2155 vim9script
2156
2157 var vname = "g:hello"
2158
2159 if exists(vname) | finish | endif | execute vname '= "world"'
2160
2161 assert_equal('world', g:hello)
2162
2163 if exists(vname) | finish | endif | execute vname '= "world"'
2164
2165 assert_report('should not be reached')
2166 END
2167 v9.CheckScriptSuccess(lines)
2168enddef
2169
Bram Moolenaarad39c092020-02-26 18:23:43 +01002170def Test_echo_cmd()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002171 echo 'some' # comment
Bram Moolenaar585fea72020-04-02 22:33:21 +02002172 echon 'thing'
Bram Moolenaar62aec932022-01-29 21:45:34 +00002173 assert_match('^something$', g:Screenline(&lines))
Bram Moolenaarad39c092020-02-26 18:23:43 +01002174
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002175 echo "some" # comment
2176 echon "thing"
Bram Moolenaar62aec932022-01-29 21:45:34 +00002177 assert_match('^something$', g:Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002178
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002179 var str1 = 'some'
2180 var str2 = 'more'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002181 echo str1 str2
Bram Moolenaar62aec932022-01-29 21:45:34 +00002182 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002183
Bram Moolenaar397a87a2022-03-20 21:14:15 +00002184 echo "one\ntwo"
2185 assert_match('^one$', g:Screenline(&lines - 1))
2186 assert_match('^two$', g:Screenline(&lines))
2187
Bram Moolenaar62aec932022-01-29 21:45:34 +00002188 v9.CheckDefFailure(['echo "xxx"# comment'], 'E488:')
Yegappan Lakshmanan22029ed2024-05-20 13:57:11 +02002189
2190 # Test for echoing a script local function name
2191 var lines =<< trim END
2192 vim9script
2193 def ScriptLocalEcho()
2194 enddef
2195 echo ScriptLocalEcho
2196 END
2197 new
2198 setline(1, lines)
2199 assert_match('<SNR>\d\+_ScriptLocalEcho', execute('source')->split("\n")[0])
2200 bw!
Bram Moolenaarad39c092020-02-26 18:23:43 +01002201enddef
2202
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002203def Test_echomsg_cmd()
2204 echomsg 'some' 'more' # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00002205 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002206 echo 'clear'
Bram Moolenaardf069ee2020-06-22 23:02:51 +02002207 :1messages
Bram Moolenaar62aec932022-01-29 21:45:34 +00002208 assert_match('^some more$', g:Screenline(&lines))
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002209
Bram Moolenaar62aec932022-01-29 21:45:34 +00002210 v9.CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002211enddef
2212
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002213def Test_echomsg_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002214 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002215 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002216 vim9script
2217 echomsg 'here'
2218 .. ' is ' ..
2219 'a message'
Bram Moolenaar62aec932022-01-29 21:45:34 +00002220 assert_match('^here is a message$', g:Screenline(&lines))
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002221 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002222 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002223enddef
2224
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002225def Test_echoerr_cmd()
Bram Moolenaar7de62622021-08-07 15:05:47 +02002226 var local = 'local'
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002227 try
Bram Moolenaar7de62622021-08-07 15:05:47 +02002228 echoerr 'something' local 'wrong' # comment
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002229 catch
Bram Moolenaar7de62622021-08-07 15:05:47 +02002230 assert_match('something local wrong', v:exception)
Bram Moolenaar40ee4662020-05-05 22:08:26 +02002231 endtry
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002232enddef
2233
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002234def Test_echoerr_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002235 # only checks line continuation
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002236 var lines =<< trim END
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002237 vim9script
2238 try
2239 echoerr 'this'
2240 .. ' is ' ..
2241 'wrong'
2242 catch
2243 assert_match('this is wrong', v:exception)
2244 endtry
2245 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002246 v9.CheckScriptSuccess(lines)
Bram Moolenaar47e880d2020-06-30 22:02:02 +02002247enddef
2248
Bram Moolenaar7de62622021-08-07 15:05:47 +02002249def Test_echoconsole_cmd()
2250 var local = 'local'
2251 echoconsole 'something' local # comment
2252 # output goes anywhere
2253enddef
2254
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002255def Test_echowindow_cmd()
2256 var local = 'local'
2257 echowindow 'something' local # comment
Bram Moolenaar2435adf2022-10-21 12:05:46 +01002258
2259 # with modifier
2260 unsilent echowin 'loud'
2261
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002262 # output goes in message window
2263 popup_clear()
Yegappan Lakshmanane2038412024-12-14 19:59:24 +01002264
2265 # Invalid range
2266 var lines =<< trim END
2267 def Foo()
2268 :$echowindow "foo"
2269 enddef
2270 defcompile
2271 END
2272 v9.CheckDefAndScriptFailure(lines, 'E16: Invalid range')
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002273enddef
2274
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002275def Test_for_outside_of_function()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02002276 var lines =<< trim END
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002277 vim9script
2278 new
2279 for var in range(0, 3)
2280 append(line('$'), var)
2281 endfor
2282 assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
2283 bwipe!
Bram Moolenaar522eefd2021-03-26 18:49:22 +01002284
2285 var result = ''
2286 for i in [1, 2, 3]
2287 var loop = ' loop ' .. i
2288 result ..= loop
2289 endfor
2290 assert_equal(' loop 1 loop 2 loop 3', result)
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002291 END
Bram Moolenaardd674772022-09-15 22:26:18 +01002292 writefile(lines, 'Xvim9for.vim', 'D')
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002293 source Xvim9for.vim
Bram Moolenaar41fe0612020-03-01 16:22:40 +01002294enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002295
rbtnnbebf0692021-08-21 17:26:50 +02002296def Test_for_skipped_block()
2297 # test skipped blocks at outside of function
2298 var lines =<< trim END
2299 var result = []
2300 if true
2301 for n in [1, 2]
2302 result += [n]
2303 endfor
2304 else
2305 for n in [3, 4]
2306 result += [n]
2307 endfor
2308 endif
2309 assert_equal([1, 2], result)
2310
2311 result = []
2312 if false
2313 for n in [1, 2]
2314 result += [n]
2315 endfor
2316 else
2317 for n in [3, 4]
2318 result += [n]
2319 endfor
2320 endif
2321 assert_equal([3, 4], result)
2322 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002323 v9.CheckDefAndScriptSuccess(lines)
rbtnnbebf0692021-08-21 17:26:50 +02002324
2325 # test skipped blocks at inside of function
2326 lines =<< trim END
2327 def DefTrue()
2328 var result = []
2329 if true
2330 for n in [1, 2]
2331 result += [n]
2332 endfor
2333 else
2334 for n in [3, 4]
2335 result += [n]
2336 endfor
2337 endif
2338 assert_equal([1, 2], result)
2339 enddef
2340 DefTrue()
2341
2342 def DefFalse()
2343 var result = []
2344 if false
2345 for n in [1, 2]
2346 result += [n]
2347 endfor
2348 else
2349 for n in [3, 4]
2350 result += [n]
2351 endfor
2352 endif
2353 assert_equal([3, 4], result)
2354 enddef
2355 DefFalse()
Bram Moolenaar97f8c102022-04-02 19:43:57 +01002356
2357 def BuildDiagrams()
2358 var diagrams: list<any>
2359 if false
2360 var max = 0
2361 for v in diagrams
2362 var l = 3
2363 if max < l | max = l | endif
2364 v->add(l)
2365 endfor
2366 endif
2367 enddef
2368 BuildDiagrams()
rbtnnbebf0692021-08-21 17:26:50 +02002369 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002370 v9.CheckDefAndScriptSuccess(lines)
rbtnnbebf0692021-08-21 17:26:50 +02002371enddef
2372
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002373def Test_skipped_redir()
2374 var lines =<< trim END
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002375 def Tredir()
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002376 if 0
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002377 redir => l[0]
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002378 redir END
2379 endif
2380 enddef
2381 defcompile
2382 END
2383 v9.CheckScriptSuccess(lines)
Bram Moolenaar3558afe2022-10-13 16:12:57 +01002384 delfunc g:Tredir
2385
2386 lines =<< trim END
2387 def Tredir()
2388 if 0
2389 redir => l[0]
2390 endif
2391 echo 'executed'
2392 if 0
2393 redir END
2394 endif
2395 enddef
2396 defcompile
2397 END
2398 v9.CheckScriptSuccess(lines)
2399 delfunc g:Tredir
2400
2401 lines =<< trim END
2402 def Tredir()
2403 var l = ['']
2404 if 1
2405 redir => l[0]
2406 endif
2407 echo 'executed'
2408 if 0
2409 redir END
2410 else
2411 redir END
2412 endif
2413 enddef
2414 defcompile
2415 END
2416 v9.CheckScriptSuccess(lines)
2417 delfunc g:Tredir
2418
2419 lines =<< trim END
2420 let doit = 1
2421 def Tredir()
2422 var l = ['']
2423 if g:doit
2424 redir => l[0]
2425 endif
2426 echo 'executed'
2427 if g:doit
2428 redir END
2429 endif
2430 enddef
2431 defcompile
2432 END
2433 v9.CheckScriptSuccess(lines)
2434 delfunc g:Tredir
Bram Moolenaar4875d6a2022-08-17 15:55:51 +01002435enddef
2436
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002437def Test_for_loop()
Bram Moolenaarf2253962021-04-13 20:53:13 +02002438 var lines =<< trim END
2439 var result = ''
2440 for cnt in range(7)
2441 if cnt == 4
2442 break
2443 endif
2444 if cnt == 2
2445 continue
2446 endif
2447 result ..= cnt .. '_'
2448 endfor
2449 assert_equal('0_1_3_', result)
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02002450
Bram Moolenaarf2253962021-04-13 20:53:13 +02002451 var concat = ''
2452 for str in eval('["one", "two"]')
2453 concat ..= str
2454 endfor
2455 assert_equal('onetwo', concat)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002456
Bram Moolenaarf2253962021-04-13 20:53:13 +02002457 var total = 0
2458 for nr in
2459 [1, 2, 3]
2460 total += nr
2461 endfor
2462 assert_equal(6, total)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002463
Bram Moolenaarf2253962021-04-13 20:53:13 +02002464 total = 0
2465 for nr
2466 in [1, 2, 3]
2467 total += nr
2468 endfor
2469 assert_equal(6, total)
Bram Moolenaar38bd8de2020-12-02 13:23:36 +01002470
Bram Moolenaarf2253962021-04-13 20:53:13 +02002471 total = 0
2472 for nr
2473 in
2474 [1, 2, 3]
2475 total += nr
2476 endfor
2477 assert_equal(6, total)
Bram Moolenaar036d0712021-01-17 20:23:38 +01002478
Bram Moolenaara3589a02021-04-14 13:30:46 +02002479 # with type
2480 total = 0
2481 for n: number in [1, 2, 3]
2482 total += n
2483 endfor
2484 assert_equal(6, total)
2485
Bram Moolenaarefd73ae2022-03-20 18:51:00 +00002486 total = 0
2487 for b in 0z010203
2488 total += b
2489 endfor
2490 assert_equal(6, total)
2491
Bram Moolenaarfe090eb2021-04-15 21:48:32 +02002492 var chars = ''
2493 for s: string in 'foobar'
2494 chars ..= s
2495 endfor
2496 assert_equal('foobar', chars)
2497
Bram Moolenaar5ede5b22021-07-07 21:55:25 +02002498 chars = ''
2499 for x: string in {a: 'a', b: 'b'}->values()
2500 chars ..= x
2501 endfor
2502 assert_equal('ab', chars)
2503
Bram Moolenaara3589a02021-04-14 13:30:46 +02002504 # unpack with type
Bram Moolenaarf2253962021-04-13 20:53:13 +02002505 var res = ''
Bram Moolenaara3589a02021-04-14 13:30:46 +02002506 for [n: number, s: string] in [[1, 'a'], [2, 'b']]
2507 res ..= n .. s
2508 endfor
2509 assert_equal('1a2b', res)
2510
Bram Moolenaar444d8782021-06-26 12:40:56 +02002511 # unpack with one var
2512 var reslist = []
2513 for [x] in [['aaa'], ['bbb']]
2514 reslist->add(x)
2515 endfor
2516 assert_equal(['aaa', 'bbb'], reslist)
2517
Bram Moolenaara3589a02021-04-14 13:30:46 +02002518 # loop over string
2519 res = ''
Bram Moolenaarf2253962021-04-13 20:53:13 +02002520 for c in 'aéc̀d'
2521 res ..= c .. '-'
2522 endfor
2523 assert_equal('a-é-c̀-d-', res)
2524
2525 res = ''
2526 for c in ''
2527 res ..= c .. '-'
2528 endfor
2529 assert_equal('', res)
2530
2531 res = ''
2532 for c in test_null_string()
2533 res ..= c .. '-'
2534 endfor
2535 assert_equal('', res)
2536
Bram Moolenaar10611952022-04-03 21:11:34 +01002537 total = 0
2538 for c in null_list
2539 total += 1
2540 endfor
2541 assert_equal(0, total)
2542
2543 for c in null_blob
2544 total += 1
2545 endfor
2546 assert_equal(0, total)
2547
Bram Moolenaarf2253962021-04-13 20:53:13 +02002548 var foo: list<dict<any>> = [
2549 {a: 'Cat'}
2550 ]
2551 for dd in foo
2552 dd.counter = 12
2553 endfor
2554 assert_equal([{a: 'Cat', counter: 12}], foo)
Bram Moolenaarad2d4962021-07-18 17:08:50 +02002555
2556 reslist = []
2557 for _ in range(3)
2558 reslist->add('x')
2559 endfor
2560 assert_equal(['x', 'x', 'x'], reslist)
Yegappan Lakshmanan4776e642024-05-19 09:06:50 +02002561
2562 # Test for trying to use the loop variable "_" inside the loop
2563 for _ in "a"
2564 assert_fails('echo _', 'E1181: Cannot use an underscore here')
2565 endfor
Bram Moolenaarf2253962021-04-13 20:53:13 +02002566 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002567 v9.CheckDefAndScriptSuccess(lines)
Yegappan Lakshmananfe424d12024-05-17 18:20:43 +02002568
2569 lines =<< trim END
2570 for i : number : [1, 2]
2571 echo i
2572 endfor
2573 END
2574 v9.CheckSourceDefAndScriptFailure(lines, 'E1059: No white space allowed before colon: : [1, 2]', 1)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002575enddef
2576
Bram Moolenaar159b2d52022-10-11 21:41:25 +01002577def Test_for_loop_list_of_lists()
2578 # loop variable is final, not const
2579 var lines =<< trim END
2580 # Filter out all odd numbers in each sublist
2581 var list: list<list<number>> = [[1], [1, 2], [1, 2, 3], [1, 2, 3, 4]]
2582 for i in list
2583 filter(i, (_, n: number): bool => n % 2 == 0)
2584 endfor
2585
2586 assert_equal([[], [2], [2], [2, 4]], list)
2587 END
2588 v9.CheckDefAndScriptSuccess(lines)
2589enddef
2590
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002591def Test_for_loop_with_closure()
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002592 # using the loop variable in a closure results in the last used value
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002593 var lines =<< trim END
2594 var flist: list<func>
2595 for i in range(5)
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002596 flist[i] = () => i
2597 endfor
2598 for i in range(5)
2599 assert_equal(4, flist[i]())
2600 endfor
2601 END
2602 v9.CheckDefAndScriptSuccess(lines)
2603
Bram Moolenaardd674772022-09-15 22:26:18 +01002604 # also works when the loop variable is used only once halfway the loops
2605 lines =<< trim END
2606 var Clo: func
2607 for i in range(5)
2608 if i == 3
2609 Clo = () => i
2610 endif
2611 endfor
2612 assert_equal(4, Clo())
2613 END
2614 v9.CheckDefAndScriptSuccess(lines)
2615
Bram Moolenaar766ae5b2022-09-14 00:30:51 +01002616 # using a local variable set to the loop variable in a closure results in the
2617 # value at that moment
2618 lines =<< trim END
2619 var flist: list<func>
2620 for i in range(5)
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002621 var inloop = i
2622 flist[i] = () => inloop
2623 endfor
2624 for i in range(5)
Bram Moolenaar353b68a2022-09-13 21:10:45 +01002625 assert_equal(i, flist[i]())
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002626 endfor
2627 END
Bram Moolenaar0cdfb7c2022-09-17 15:44:52 +01002628 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002629
Bram Moolenaara275f2c2022-10-11 20:04:09 +01002630 # also with an extra block level
2631 lines =<< trim END
2632 var flist: list<func>
2633 for i in range(5)
2634 {
2635 var inloop = i
2636 flist[i] = () => inloop
2637 }
2638 endfor
2639 for i in range(5)
2640 assert_equal(i, flist[i]())
2641 endfor
2642 END
2643 v9.CheckDefAndScriptSuccess(lines)
2644
2645 # and declaration in higher block
2646 lines =<< trim END
2647 var flist: list<func>
2648 for i in range(5)
2649 var inloop = i
2650 {
2651 flist[i] = () => inloop
2652 }
2653 endfor
2654 for i in range(5)
2655 assert_equal(i, flist[i]())
2656 endfor
2657 END
2658 v9.CheckDefAndScriptSuccess(lines)
2659
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002660 lines =<< trim END
2661 var flist: list<func>
2662 for i in range(5)
2663 var inloop = i
2664 flist[i] = () => {
2665 return inloop
2666 }
2667 endfor
2668 for i in range(5)
Bram Moolenaar353b68a2022-09-13 21:10:45 +01002669 assert_equal(i, flist[i]())
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002670 endfor
2671 END
Bram Moolenaar0cdfb7c2022-09-17 15:44:52 +01002672 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaardbbb02b2022-09-18 12:00:21 +01002673
2674 # Also works for a nested loop
2675 lines =<< trim END
2676 var flist: list<func>
2677 var n = 0
2678 for i in range(3)
2679 var ii = i
2680 for a in ['a', 'b', 'c']
2681 var aa = a
2682 flist[n] = () => ii .. aa
2683 ++n
2684 endfor
2685 endfor
2686
2687 n = 0
2688 for i in range(3)
2689 for a in ['a', 'b', 'c']
2690 assert_equal(i .. a, flist[n]())
2691 ++n
2692 endfor
2693 endfor
2694 END
Bram Moolenaarcc341812022-09-19 15:54:34 +01002695 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaare8e369a2022-09-21 18:59:14 +01002696
2697 # using two loop variables
2698 lines =<< trim END
2699 var lv_list: list<func>
2700 var copy_list: list<func>
2701 for [idx, c] in items('word')
2702 var lidx = idx
2703 var lc = c
2704 lv_list[idx] = () => {
2705 return idx .. c
2706 }
2707 copy_list[idx] = () => {
2708 return lidx .. lc
2709 }
2710 endfor
2711 for [i, c] in items('word')
2712 assert_equal(3 .. 'd', lv_list[i]())
2713 assert_equal(i .. c, copy_list[i]())
2714 endfor
2715 END
2716 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarcc341812022-09-19 15:54:34 +01002717enddef
2718
2719def Test_define_global_closure_in_loops()
2720 var lines =<< trim END
2721 vim9script
2722
2723 def Func()
2724 for i in range(3)
2725 var ii = i
2726 for a in ['a', 'b', 'c']
2727 var aa = a
2728 if ii == 0 && aa == 'a'
2729 def g:Global_0a(): string
2730 return ii .. aa
2731 enddef
2732 endif
2733 if ii == 1 && aa == 'b'
2734 def g:Global_1b(): string
2735 return ii .. aa
2736 enddef
2737 endif
2738 if ii == 2 && aa == 'c'
2739 def g:Global_2c(): string
2740 return ii .. aa
2741 enddef
2742 endif
2743 endfor
2744 endfor
2745 enddef
2746 Func()
2747 END
2748 v9.CheckScriptSuccess(lines)
2749 assert_equal("0a", g:Global_0a())
2750 assert_equal("1b", g:Global_1b())
2751 assert_equal("2c", g:Global_2c())
2752
2753 delfunc g:Global_0a
2754 delfunc g:Global_1b
2755 delfunc g:Global_2c
Bram Moolenaar2eb6fc32021-07-25 14:13:53 +02002756enddef
2757
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002758def Test_for_loop_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00002759 v9.CheckDefAndScriptFailure(['for '], ['E1097:', 'E690:'])
2760 v9.CheckDefAndScriptFailure(['for x'], ['E1097:', 'E690:'])
2761 v9.CheckDefAndScriptFailure(['for x in'], ['E1097:', 'E15:'])
2762 v9.CheckDefAndScriptFailure(['for # in range(5)'], 'E690:')
2763 v9.CheckDefAndScriptFailure(['for i In range(5)'], 'E690:')
2764 v9.CheckDefAndScriptFailure(['var x = 5', 'for x in range(5)', 'endfor'], ['E1017:', 'E1041:'])
2765 v9.CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3)
2766 v9.CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01002767 delfunc! g:Func
Bram Moolenaar62aec932022-01-29 21:45:34 +00002768 v9.CheckDefFailure(['for i in xxx'], 'E1001:')
2769 v9.CheckDefFailure(['endfor'], 'E588:')
2770 v9.CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002771
2772 # wrong type detected at compile time
Bram Moolenaar62aec932022-01-29 21:45:34 +00002773 v9.CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002774
2775 # wrong type detected at runtime
2776 g:adict = {a: 1}
Bram Moolenaar62aec932022-01-29 21:45:34 +00002777 v9.CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported')
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01002778 unlet g:adict
Bram Moolenaarf6a8d422021-04-13 21:48:03 +02002779
2780 var lines =<< trim END
2781 var d: list<dict<any>> = [{a: 0}]
2782 for e in d
2783 e = {a: 0, b: ''}
2784 endfor
2785 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002786 v9.CheckDefAndScriptFailure(lines, ['E1018:', 'E46:'], 3)
Bram Moolenaarfe090eb2021-04-15 21:48:32 +02002787
2788 lines =<< trim END
2789 for nr: number in ['foo']
2790 endfor
2791 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002792 v9.CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1)
Bram Moolenaar404557e2021-07-05 21:41:48 +02002793
2794 lines =<< trim END
2795 for n : number in [1, 2]
2796 echo n
2797 endfor
2798 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002799 v9.CheckDefAndScriptFailure(lines, 'E1059:', 1)
Bram Moolenaarefc5db52021-07-07 21:21:30 +02002800
2801 lines =<< trim END
2802 var d: dict<number> = {a: 1, b: 2}
2803 for [k: job, v: job] in d->items()
2804 echo k v
2805 endfor
2806 END
Bram Moolenaarbd3a9d22022-05-17 16:12:39 +01002807 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 +00002808
2809 lines =<< trim END
2810 var i = 0
2811 for i in [1, 2, 3]
2812 echo i
2813 endfor
2814 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002815 v9.CheckDefExecAndScriptFailure(lines, ['E1017:', 'E1041:'])
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002816
2817 lines =<< trim END
2818 var l = [0]
2819 for l[0] in [1, 2, 3]
2820 echo l[0]
2821 endfor
2822 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002823 v9.CheckDefExecAndScriptFailure(lines, ['E461:', 'E1017:'])
Bram Moolenaar3b3755f2021-11-22 20:10:18 +00002824
2825 lines =<< trim END
2826 var d = {x: 0}
2827 for d.x in [1, 2, 3]
2828 echo d.x
2829 endfor
2830 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002831 v9.CheckDefExecAndScriptFailure(lines, ['E461:', 'E1017:'])
Bram Moolenaara1c51952022-02-02 16:20:26 +00002832
2833 lines =<< trim END
2834 var l: list<dict<any>> = [{a: 1, b: 'x'}]
2835 for item: dict<number> in l
2836 echo item
2837 endfor
2838 END
2839 v9.CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected dict<number> but got dict<any>')
2840
2841 lines =<< trim END
2842 var l: list<dict<any>> = [{n: 1}]
2843 for item: dict<number> in l
Bram Moolenaarfa103972022-09-29 19:14:42 +01002844 var d = {s: ''}
2845 d->extend(item)
Bram Moolenaara1c51952022-02-02 16:20:26 +00002846 endfor
2847 END
Bram Moolenaarfa103972022-09-29 19:14:42 +01002848 v9.CheckDefExecAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected dict<string> but got dict<number>')
Bram Moolenaarcc341812022-09-19 15:54:34 +01002849
2850 lines =<< trim END
2851 for a in range(3)
2852 while a > 3
2853 for b in range(2)
2854 while b < 0
2855 for c in range(5)
2856 while c > 6
2857 while c < 0
2858 for d in range(1)
2859 for e in range(3)
2860 while e > 3
2861 endwhile
2862 endfor
2863 endfor
2864 endwhile
2865 endwhile
2866 endfor
2867 endwhile
2868 endfor
2869 endwhile
2870 endfor
2871 END
2872 v9.CheckDefSuccess(lines)
2873
2874 v9.CheckDefFailure(['for x in range(3)'] + lines + ['endfor'], 'E1306:')
Yegappan Lakshmanan062bb6b2023-12-16 14:46:40 +01002875
2876 # Test for too many for loops
2877 lines =<< trim END
2878 vim9script
2879 def Foo()
2880 for a in range(1)
2881 for b in range(1)
2882 for c in range(1)
2883 for d in range(1)
2884 for e in range(1)
2885 for f in range(1)
2886 for g in range(1)
2887 for h in range(1)
2888 for i in range(1)
2889 for j in range(1)
2890 for k in range(1)
2891 endfor
2892 endfor
2893 endfor
2894 endfor
2895 endfor
2896 endfor
2897 endfor
2898 endfor
2899 endfor
2900 endfor
2901 endfor
2902 enddef
2903 defcompile
2904 END
2905 v9.CheckSourceFailure(lines, 'E1306: Loop nesting too deep', 11)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02002906enddef
2907
Bram Moolenaarea870692020-12-02 14:24:30 +01002908def Test_for_loop_script_var()
2909 # cannot use s:var in a :def function
Bram Moolenaar62aec932022-01-29 21:45:34 +00002910 v9.CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1254:')
Bram Moolenaarea870692020-12-02 14:24:30 +01002911
2912 # can use s:var in Vim9 script, with or without s:
2913 var lines =<< trim END
2914 vim9script
2915 var total = 0
2916 for s:var in [1, 2, 3]
2917 total += s:var
2918 endfor
2919 assert_equal(6, total)
2920
2921 total = 0
2922 for var in [1, 2, 3]
2923 total += var
2924 endfor
2925 assert_equal(6, total)
2926 END
2927enddef
2928
Bram Moolenaar792f7862020-11-23 08:31:18 +01002929def Test_for_loop_unpack()
Bram Moolenaar792f7862020-11-23 08:31:18 +01002930 var lines =<< trim END
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002931 var result = []
2932 for [v1, v2] in [[1, 2], [3, 4]]
2933 result->add(v1)
2934 result->add(v2)
2935 endfor
2936 assert_equal([1, 2, 3, 4], result)
2937
2938 result = []
2939 for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]]
2940 result->add(v1)
2941 result->add(v2)
2942 result->add(v3)
2943 endfor
2944 assert_equal([1, 2, [], 3, 4, [5, 6]], result)
2945
2946 result = []
2947 for [&ts, &sw] in [[1, 2], [3, 4]]
2948 result->add(&ts)
2949 result->add(&sw)
2950 endfor
2951 assert_equal([1, 2, 3, 4], result)
2952
2953 var slist: list<string>
2954 for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']]
2955 slist->add($LOOPVAR)
2956 slist->add(@r)
2957 slist->add(v:errmsg)
2958 endfor
2959 assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist)
2960
2961 slist = []
2962 for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']]
2963 slist->add(g:globalvar)
2964 slist->add(b:bufvar)
2965 slist->add(w:winvar)
2966 slist->add(t:tabvar)
2967 endfor
2968 assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist)
Bram Moolenaarf6c177a2020-12-04 17:38:00 +01002969 unlet! g:globalvar b:bufvar w:winvar t:tabvar
Bram Moolenaarb777da92021-05-22 21:40:39 +02002970
2971 var res = []
2972 for [_, n, _] in [[1, 2, 3], [4, 5, 6]]
2973 res->add(n)
2974 endfor
2975 assert_equal([2, 5], res)
Bram Moolenaar61efa162022-03-18 13:10:48 +00002976
2977 var text: list<string> = ["hello there", "goodbye now"]
2978 var splitted = ''
2979 for [first; next] in mapnew(text, (i, v) => split(v))
2980 splitted ..= string(first) .. string(next) .. '/'
2981 endfor
2982 assert_equal("'hello'['there']/'goodbye'['now']/", splitted)
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002983 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002984 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaar4b8a0652020-12-01 16:30:44 +01002985
2986 lines =<< trim END
Bram Moolenaar792f7862020-11-23 08:31:18 +01002987 for [v1, v2] in [[1, 2, 3], [3, 4]]
2988 echo v1 v2
2989 endfor
2990 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002991 v9.CheckDefExecFailure(lines, 'E710:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01002992
2993 lines =<< trim END
2994 for [v1, v2] in [[1], [3, 4]]
2995 echo v1 v2
2996 endfor
2997 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002998 v9.CheckDefExecFailure(lines, 'E711:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01002999
3000 lines =<< trim END
3001 for [v1, v1] in [[1, 2], [3, 4]]
3002 echo v1
3003 endfor
3004 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003005 v9.CheckDefExecFailure(lines, 'E1017:', 1)
Bram Moolenaar95e4dd82022-04-27 22:15:40 +01003006
3007 lines =<< trim END
3008 for [a, b] in g:listlist
3009 echo a
3010 endfor
3011 END
3012 g:listlist = [1, 2, 3]
3013 v9.CheckDefExecFailure(lines, 'E1140:', 1)
Bram Moolenaar792f7862020-11-23 08:31:18 +01003014enddef
3015
Bram Moolenaarc150c092021-02-13 15:02:46 +01003016def Test_for_loop_with_try_continue()
Bram Moolenaarf2253962021-04-13 20:53:13 +02003017 var lines =<< trim END
3018 var looped = 0
3019 var cleanup = 0
3020 for i in range(3)
3021 looped += 1
3022 try
3023 eval [][0]
3024 catch
3025 continue
3026 finally
3027 cleanup += 1
3028 endtry
3029 endfor
3030 assert_equal(3, looped)
3031 assert_equal(3, cleanup)
3032 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003033 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarc150c092021-02-13 15:02:46 +01003034enddef
3035
rbtnnd895b1d2021-08-20 20:54:25 +02003036def Test_while_skipped_block()
3037 # test skipped blocks at outside of function
3038 var lines =<< trim END
3039 var result = []
3040 var n = 0
3041 if true
3042 n = 1
3043 while n < 3
3044 result += [n]
3045 n += 1
3046 endwhile
3047 else
3048 n = 3
3049 while n < 5
3050 result += [n]
3051 n += 1
3052 endwhile
3053 endif
3054 assert_equal([1, 2], result)
3055
3056 result = []
3057 if false
3058 n = 1
3059 while n < 3
3060 result += [n]
3061 n += 1
3062 endwhile
3063 else
3064 n = 3
3065 while n < 5
3066 result += [n]
3067 n += 1
3068 endwhile
3069 endif
3070 assert_equal([3, 4], result)
3071 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003072 v9.CheckDefAndScriptSuccess(lines)
rbtnnd895b1d2021-08-20 20:54:25 +02003073
3074 # test skipped blocks at inside of function
3075 lines =<< trim END
3076 def DefTrue()
3077 var result = []
3078 var n = 0
3079 if true
3080 n = 1
3081 while n < 3
3082 result += [n]
3083 n += 1
3084 endwhile
3085 else
3086 n = 3
3087 while n < 5
3088 result += [n]
3089 n += 1
3090 endwhile
3091 endif
3092 assert_equal([1, 2], result)
3093 enddef
3094 DefTrue()
3095
3096 def DefFalse()
3097 var result = []
3098 var n = 0
3099 if false
3100 n = 1
3101 while n < 3
3102 result += [n]
3103 n += 1
3104 endwhile
3105 else
3106 n = 3
3107 while n < 5
3108 result += [n]
3109 n += 1
3110 endwhile
3111 endif
3112 assert_equal([3, 4], result)
3113 enddef
3114 DefFalse()
3115 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003116 v9.CheckDefAndScriptSuccess(lines)
rbtnnd895b1d2021-08-20 20:54:25 +02003117enddef
3118
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003119def Test_while_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003120 var result = ''
3121 var cnt = 0
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003122 while cnt < 555
3123 if cnt == 3
3124 break
3125 endif
3126 cnt += 1
3127 if cnt == 2
3128 continue
3129 endif
3130 result ..= cnt .. '_'
3131 endwhile
3132 assert_equal('1_3_', result)
Bram Moolenaardee37dc2021-02-07 16:40:05 +01003133
3134 var s = ''
Bram Moolenaar4b3e1962021-03-18 21:37:55 +01003135 while s == 'x' # {comment}
Bram Moolenaardee37dc2021-02-07 16:40:05 +01003136 endwhile
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01003137enddef
3138
Bram Moolenaar7a53f292021-11-22 18:31:02 +00003139def Test_while_loop_in_script()
3140 var lines =<< trim END
3141 vim9script
3142 var result = ''
3143 var cnt = 0
3144 while cnt < 3
3145 var s = 'v' .. cnt
3146 result ..= s
3147 cnt += 1
3148 endwhile
3149 assert_equal('v0v1v2', result)
3150 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003151 v9.CheckScriptSuccess(lines)
Bram Moolenaar7a53f292021-11-22 18:31:02 +00003152enddef
3153
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02003154def Test_while_loop_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00003155 v9.CheckDefFailure(['while xxx'], 'E1001:')
3156 v9.CheckDefFailure(['endwhile'], 'E588:')
3157 v9.CheckDefFailure(['continue'], 'E586:')
3158 v9.CheckDefFailure(['if true', 'continue'], 'E586:')
3159 v9.CheckDefFailure(['break'], 'E587:')
3160 v9.CheckDefFailure(['if true', 'break'], 'E587:')
3161 v9.CheckDefFailure(['while 1', 'echo 3'], 'E170:')
Bram Moolenaar6628b7e2021-02-07 16:33:35 +01003162
3163 var lines =<< trim END
3164 var s = ''
3165 while s = ''
3166 endwhile
3167 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003168 v9.CheckDefFailure(lines, 'E488:')
Bram Moolenaarbd5da372020-03-31 23:13:10 +02003169enddef
3170
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01003171def Test_interrupt_loop()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003172 var caught = false
3173 var x = 0
Bram Moolenaar97acfc72020-03-22 13:44:28 +01003174 try
3175 while 1
3176 x += 1
3177 if x == 100
3178 feedkeys("\<C-C>", 'Lt')
3179 endif
3180 endwhile
3181 catch
3182 caught = true
3183 assert_equal(100, x)
3184 endtry
3185 assert_true(caught, 'should have caught an exception')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02003186 # consume the CTRL-C
3187 getchar(0)
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01003188enddef
Bram Moolenaar20431c92020-03-20 18:39:46 +01003189
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003190def Test_automatic_line_continuation()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003191 var mylist = [
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003192 'one',
3193 'two',
3194 'three',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003195 ] # comment
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003196 assert_equal(['one', 'two', 'three'], mylist)
3197
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003198 var mydict = {
Bram Moolenaare0de1712020-12-02 17:36:54 +01003199 ['one']: 1,
3200 ['two']: 2,
3201 ['three']:
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003202 3,
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003203 } # comment
Bram Moolenaare0de1712020-12-02 17:36:54 +01003204 assert_equal({one: 1, two: 2, three: 3}, mydict)
3205 mydict = {
Bram Moolenaar2c330432020-04-13 14:41:35 +02003206 one: 1, # comment
3207 two: # comment
3208 2, # comment
3209 three: 3 # comment
3210 }
Bram Moolenaare0de1712020-12-02 17:36:54 +01003211 assert_equal({one: 1, two: 2, three: 3}, mydict)
3212 mydict = {
Bram Moolenaar2c330432020-04-13 14:41:35 +02003213 one: 1,
3214 two:
3215 2,
3216 three: 3
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003217 }
Bram Moolenaare0de1712020-12-02 17:36:54 +01003218 assert_equal({one: 1, two: 2, three: 3}, mydict)
Bram Moolenaare6085c52020-04-12 20:19:16 +02003219
3220 assert_equal(
3221 ['one', 'two', 'three'],
3222 split('one two three')
3223 )
Bram Moolenaar4fdae992020-04-12 16:38:57 +02003224enddef
3225
Bram Moolenaar7a092242020-04-16 22:10:49 +02003226def Test_vim9_comment()
Bram Moolenaar62aec932022-01-29 21:45:34 +00003227 v9.CheckScriptSuccess([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003228 'vim9script',
3229 '# something',
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003230 '#something',
Bram Moolenaar3f74c0a2022-08-06 18:12:06 +01003231 '#{{something',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003232 ])
Bram Moolenaar3f74c0a2022-08-06 18:12:06 +01003233 v9.CheckScriptFailure([
3234 'vim9script',
3235 '#{something',
3236 ], 'E1170:')
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003237
Bram Moolenaarb18b4962022-09-02 21:55:50 +01003238 split Xv9cfile
Bram Moolenaar62aec932022-01-29 21:45:34 +00003239 v9.CheckScriptSuccess([
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003240 'vim9script',
3241 'edit #something',
3242 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003243 v9.CheckScriptSuccess([
Bram Moolenaar93f82cb2020-12-12 21:25:56 +01003244 'vim9script',
3245 'edit #{something',
3246 ])
3247 close
3248
Bram Moolenaar62aec932022-01-29 21:45:34 +00003249 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003250 'vim9script',
3251 ':# something',
3252 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003253 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003254 '# something',
3255 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003256 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003257 ':# something',
3258 ], 'E488:')
3259
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003260 { # block start
3261 } # block end
Bram Moolenaar62aec932022-01-29 21:45:34 +00003262 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003263 '{# comment',
3264 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003265 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003266 '{',
3267 '}# comment',
3268 ], 'E488:')
3269
3270 echo "yes" # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00003271 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003272 'echo "yes"# comment',
3273 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003274 v9.CheckScriptSuccess([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003275 'vim9script',
3276 'echo "yes" # something',
3277 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003278 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003279 'vim9script',
3280 'echo "yes"# something',
3281 ], 'E121:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003282 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003283 'vim9script',
3284 'echo# something',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003285 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003286 v9.CheckScriptFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003287 'echo "yes" # something',
3288 ], 'E121:')
3289
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003290 exe "echo" # comment
Bram Moolenaar62aec932022-01-29 21:45:34 +00003291 v9.CheckDefFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003292 'exe "echo"# comment',
3293 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003294 v9.CheckScriptSuccess([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003295 'vim9script',
3296 'exe "echo" # something',
3297 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003298 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003299 'vim9script',
3300 'exe "echo"# something',
3301 ], 'E121:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003302 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003303 'vim9script',
3304 'exe# something',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003305 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003306 v9.CheckScriptFailure([
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02003307 'exe "echo" # something',
3308 ], 'E121:')
3309
Bram Moolenaar62aec932022-01-29 21:45:34 +00003310 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003311 'try# comment',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003312 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003313 'catch',
3314 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003315 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003316 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003317 'vim9script',
3318 'try# comment',
3319 'echo "yes"',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003320 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003321 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003322 'try',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003323 ' throw#comment',
3324 'catch',
3325 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003326 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003327 v9.CheckDefFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003328 'try',
3329 ' throw "yes"#comment',
3330 'catch',
3331 'endtry',
3332 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003333 v9.CheckDefFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003334 'try',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003335 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02003336 'catch# comment',
3337 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003338 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003339 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003340 'vim9script',
3341 'try',
3342 ' echo "yes"',
3343 'catch# comment',
3344 'endtry',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003345 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003346 v9.CheckDefFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003347 'try',
3348 ' echo "yes"',
3349 'catch /pat/# comment',
3350 'endtry',
3351 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003352 v9.CheckDefFailure([
Bram Moolenaar7a092242020-04-16 22:10:49 +02003353 'try',
3354 'echo "yes"',
3355 'catch',
3356 'endtry# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003357 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003358 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003359 'vim9script',
3360 'try',
3361 ' echo "yes"',
3362 'catch',
3363 'endtry# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003364 ], 'E1144:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003365
Bram Moolenaar62aec932022-01-29 21:45:34 +00003366 v9.CheckScriptSuccess([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003367 'vim9script',
3368 'hi # comment',
3369 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003370 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003371 'vim9script',
3372 'hi# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003373 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003374 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003375 'vim9script',
3376 'hi Search # comment',
3377 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003378 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003379 'vim9script',
3380 'hi Search# comment',
3381 ], 'E416:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003382 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003383 'vim9script',
3384 'hi link This Search # comment',
3385 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003386 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003387 'vim9script',
3388 'hi link This That# comment',
3389 ], 'E413:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003390 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003391 'vim9script',
3392 'hi clear This # comment',
3393 'hi clear # comment',
3394 ])
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003395 # not tested, because it doesn't give an error but a warning:
3396 # hi clear This# comment',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003397 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003398 'vim9script',
3399 'hi clear# comment',
3400 ], 'E416:')
3401
Bram Moolenaar62aec932022-01-29 21:45:34 +00003402 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003403 'vim9script',
3404 'hi Group term=bold',
3405 'match Group /todo/ # comment',
3406 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003407 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003408 'vim9script',
3409 'hi Group term=bold',
3410 'match Group /todo/# comment',
3411 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003412 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003413 'vim9script',
3414 'match # comment',
3415 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003416 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003417 'vim9script',
3418 'match# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003419 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003420 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003421 'vim9script',
3422 'match none # comment',
3423 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003424 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003425 'vim9script',
3426 'match none# comment',
3427 ], 'E475:')
3428
Bram Moolenaar62aec932022-01-29 21:45:34 +00003429 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003430 'vim9script',
3431 'menutrans clear # comment',
3432 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003433 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003434 'vim9script',
3435 'menutrans clear# comment text',
3436 ], 'E474:')
3437
Bram Moolenaar62aec932022-01-29 21:45:34 +00003438 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003439 'vim9script',
3440 'syntax clear # comment',
3441 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003442 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003443 'vim9script',
3444 'syntax clear# comment text',
3445 ], 'E28:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003446 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003447 'vim9script',
3448 'syntax keyword Word some',
3449 'syntax clear Word # comment',
3450 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003451 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003452 'vim9script',
3453 'syntax keyword Word some',
3454 'syntax clear Word# comment text',
3455 ], 'E28:')
3456
Bram Moolenaar62aec932022-01-29 21:45:34 +00003457 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003458 'vim9script',
3459 'syntax list # comment',
3460 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003461 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003462 'vim9script',
3463 'syntax list# comment text',
3464 ], 'E28:')
3465
Bram Moolenaar62aec932022-01-29 21:45:34 +00003466 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003467 'vim9script',
3468 'syntax match Word /pat/ oneline # comment',
3469 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003470 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003471 'vim9script',
3472 'syntax match Word /pat/ oneline# comment',
3473 ], 'E475:')
3474
Bram Moolenaar62aec932022-01-29 21:45:34 +00003475 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003476 'vim9script',
3477 'syntax keyword Word word # comm[ent',
3478 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003479 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003480 'vim9script',
3481 'syntax keyword Word word# comm[ent',
3482 ], 'E789:')
3483
Bram Moolenaar62aec932022-01-29 21:45:34 +00003484 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003485 'vim9script',
3486 'syntax match Word /pat/ # comment',
3487 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003488 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003489 'vim9script',
3490 'syntax match Word /pat/# comment',
3491 ], 'E402:')
3492
Bram Moolenaar62aec932022-01-29 21:45:34 +00003493 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003494 'vim9script',
3495 'syntax match Word /pat/ contains=Something # comment',
3496 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003497 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003498 'vim9script',
3499 'syntax match Word /pat/ contains=Something# comment',
3500 ], 'E475:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003501 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003502 'vim9script',
3503 'syntax match Word /pat/ contains= # comment',
3504 ], 'E406:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003505 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003506 'vim9script',
3507 'syntax match Word /pat/ contains=# comment',
3508 ], 'E475:')
3509
Bram Moolenaar62aec932022-01-29 21:45:34 +00003510 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003511 'vim9script',
3512 'syntax region Word start=/pat/ end=/pat/ # comment',
3513 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003514 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003515 'vim9script',
3516 'syntax region Word start=/pat/ end=/pat/# comment',
Bram Moolenaard032f342020-07-18 18:13:02 +02003517 ], 'E402:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02003518
Bram Moolenaar62aec932022-01-29 21:45:34 +00003519 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003520 'vim9script',
3521 'syntax sync # comment',
3522 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003523 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003524 'vim9script',
3525 'syntax sync# comment',
3526 ], 'E404:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003527 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003528 'vim9script',
3529 'syntax sync ccomment # comment',
3530 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003531 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003532 'vim9script',
3533 'syntax sync ccomment# comment',
3534 ], 'E404:')
3535
Bram Moolenaar62aec932022-01-29 21:45:34 +00003536 v9.CheckScriptSuccess([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003537 'vim9script',
3538 'syntax cluster Some contains=Word # comment',
3539 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003540 v9.CheckScriptFailure([
Bram Moolenaar1966c242020-04-20 22:42:32 +02003541 'vim9script',
3542 'syntax cluster Some contains=Word# comment',
3543 ], 'E475:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003544
Bram Moolenaar62aec932022-01-29 21:45:34 +00003545 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003546 'vim9script',
3547 'command Echo echo # comment',
3548 'command Echo # comment',
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003549 'delcommand Echo',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003550 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003551 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003552 'vim9script',
3553 'command Echo echo# comment',
3554 'Echo',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003555 ], 'E1144:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003556 delcommand Echo
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003557
3558 var curdir = getcwd()
Bram Moolenaar62aec932022-01-29 21:45:34 +00003559 v9.CheckScriptSuccess([
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003560 'command Echo cd " comment',
3561 'Echo',
3562 'delcommand Echo',
3563 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003564 v9.CheckScriptSuccess([
Bram Moolenaar090728a2020-12-20 15:43:31 +01003565 'vim9script',
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003566 'command Echo cd # comment',
3567 'Echo',
3568 'delcommand Echo',
3569 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003570 v9.CheckScriptFailure([
Bram Moolenaar70249ee2020-12-10 21:01:30 +01003571 'vim9script',
3572 'command Echo cd " comment',
3573 'Echo',
3574 ], 'E344:')
3575 delcommand Echo
3576 chdir(curdir)
3577
Bram Moolenaar62aec932022-01-29 21:45:34 +00003578 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003579 'vim9script',
3580 'command Echo# comment',
3581 ], 'E182:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003582 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003583 'vim9script',
3584 'command Echo echo',
3585 'command Echo# comment',
3586 ], 'E182:')
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003587 delcommand Echo
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003588
Bram Moolenaar62aec932022-01-29 21:45:34 +00003589 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003590 'vim9script',
3591 'function # comment',
3592 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003593 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003594 'vim9script',
Bram Moolenaar98981072020-07-29 14:40:25 +02003595 'function " comment',
3596 ], 'E129:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003597 v9.CheckScriptFailure([
Bram Moolenaar98981072020-07-29 14:40:25 +02003598 'vim9script',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003599 'function# comment',
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003600 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003601 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003602 'vim9script',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003603 'import "./vim9.vim" as v9',
3604 'function v9.CheckScriptSuccess # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003605 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003606 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003607 'vim9script',
Bram Moolenaar62aec932022-01-29 21:45:34 +00003608 'import "./vim9.vim" as v9',
3609 'function v9.CheckScriptSuccess# comment',
3610 ], 'E1048: Item not found in script: CheckScriptSuccess#')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003611
Bram Moolenaar62aec932022-01-29 21:45:34 +00003612 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003613 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003614 'func g:DeleteMeA()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003615 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003616 'delfunction g:DeleteMeA # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003617 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003618 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003619 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003620 'func g:DeleteMeB()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003621 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02003622 'delfunction g:DeleteMeB# comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003623 ], 'E488:')
3624
Bram Moolenaar62aec932022-01-29 21:45:34 +00003625 v9.CheckScriptSuccess([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003626 'vim9script',
3627 'call execute("ls") # comment',
3628 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003629 v9.CheckScriptFailure([
Bram Moolenaara72cfb82020-04-23 17:07:30 +02003630 'vim9script',
3631 'call execute("ls")# comment',
3632 ], 'E488:')
Bram Moolenaare7e48382020-07-22 18:17:08 +02003633
Bram Moolenaar62aec932022-01-29 21:45:34 +00003634 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003635 'def Test() " comment',
3636 'enddef',
3637 ], 'E488:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003638 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003639 'vim9script',
3640 'def Test() " comment',
3641 'enddef',
3642 ], 'E488:')
3643
Bram Moolenaar62aec932022-01-29 21:45:34 +00003644 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003645 'func Test() " comment',
3646 'endfunc',
Bram Moolenaar2d870f82020-12-05 13:41:01 +01003647 'delfunc Test',
Bram Moolenaare7e48382020-07-22 18:17:08 +02003648 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003649 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003650 'vim9script',
3651 'func Test() " comment',
3652 'endfunc',
Bram Moolenaar98981072020-07-29 14:40:25 +02003653 ])
Bram Moolenaare7e48382020-07-22 18:17:08 +02003654
Bram Moolenaar62aec932022-01-29 21:45:34 +00003655 v9.CheckScriptSuccess([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003656 'def Test() # comment',
3657 'enddef',
3658 ])
Bram Moolenaar62aec932022-01-29 21:45:34 +00003659 v9.CheckScriptFailure([
Bram Moolenaare7e48382020-07-22 18:17:08 +02003660 'func Test() # comment',
3661 'endfunc',
3662 ], 'E488:')
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003663
3664 var lines =<< trim END
3665 vim9script
3666 syn region Text
3667 \ start='foo'
3668 #\ comment
3669 \ end='bar'
Bram Moolenaar5072b472021-06-03 21:56:10 +02003670 syn region Text start='foo'
3671 #\ comment
3672 \ end='bar'
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003673 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003674 v9.CheckScriptSuccess(lines)
Bram Moolenaar0f37e352021-06-02 15:28:15 +02003675
3676 lines =<< trim END
3677 vim9script
3678 syn region Text
3679 \ start='foo'
3680 "\ comment
3681 \ end='bar'
3682 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003683 v9.CheckScriptFailure(lines, 'E399:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003684enddef
3685
3686def Test_vim9_comment_gui()
3687 CheckCanRunGui
3688
Bram Moolenaar62aec932022-01-29 21:45:34 +00003689 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003690 'vim9script',
3691 'gui#comment'
Bram Moolenaarf8103f22020-12-25 17:36:27 +01003692 ], 'E1144:')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003693 v9.CheckScriptFailure([
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02003694 'vim9script',
3695 'gui -f#comment'
Bram Moolenaarb8bd2e62021-08-21 17:13:14 +02003696 ], 'E194:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02003697enddef
3698
Bram Moolenaara26b9702020-04-18 19:53:28 +02003699def Test_vim9_comment_not_compiled()
Bram Moolenaar67979662020-06-20 22:50:47 +02003700 au TabEnter *.vim g:entered = 1
3701 au TabEnter *.x g:entered = 2
Bram Moolenaara26b9702020-04-18 19:53:28 +02003702
3703 edit test.vim
3704 doautocmd TabEnter #comment
3705 assert_equal(1, g:entered)
3706
3707 doautocmd TabEnter f.x
3708 assert_equal(2, g:entered)
3709
3710 g:entered = 0
3711 doautocmd TabEnter f.x #comment
3712 assert_equal(2, g:entered)
3713
3714 assert_fails('doautocmd Syntax#comment', 'E216:')
3715
3716 au! TabEnter
3717 unlet g:entered
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003718
Bram Moolenaar62aec932022-01-29 21:45:34 +00003719 v9.CheckScriptSuccess([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003720 'vim9script',
Bram Moolenaar67979662020-06-20 22:50:47 +02003721 'g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003722 'b:var = 456',
3723 'w:var = 777',
3724 't:var = 888',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003725 'unlet g:var w:var # something',
3726 ])
3727
Bram Moolenaar62aec932022-01-29 21:45:34 +00003728 v9.CheckScriptFailure([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003729 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003730 'let var = 123',
3731 ], 'E1126: Cannot use :let in Vim9 script')
3732
Bram Moolenaar62aec932022-01-29 21:45:34 +00003733 v9.CheckScriptFailure([
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003734 'vim9script',
3735 'var g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003736 ], 'E1016: Cannot declare a global variable:')
3737
Bram Moolenaar62aec932022-01-29 21:45:34 +00003738 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003739 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003740 'var b:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003741 ], 'E1016: Cannot declare a buffer variable:')
3742
Bram Moolenaar62aec932022-01-29 21:45:34 +00003743 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003744 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003745 'var w:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003746 ], 'E1016: Cannot declare a window variable:')
3747
Bram Moolenaar62aec932022-01-29 21:45:34 +00003748 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003749 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003750 'var t:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003751 ], 'E1016: Cannot declare a tab variable:')
3752
Bram Moolenaar62aec932022-01-29 21:45:34 +00003753 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003754 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003755 'var v:version = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003756 ], 'E1016: Cannot declare a v: variable:')
3757
Bram Moolenaar62aec932022-01-29 21:45:34 +00003758 v9.CheckScriptFailure([
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003759 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003760 'var $VARIABLE = "text"',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02003761 ], 'E1016: Cannot declare an environment variable:')
Bram Moolenaar67979662020-06-20 22:50:47 +02003762
Bram Moolenaar62aec932022-01-29 21:45:34 +00003763 v9.CheckScriptFailure([
Bram Moolenaar67979662020-06-20 22:50:47 +02003764 'vim9script',
3765 'g:var = 123',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003766 'unlet g:var# comment1',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003767 ], 'E108:')
3768
Bram Moolenaar62aec932022-01-29 21:45:34 +00003769 v9.CheckScriptFailure([
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02003770 'let g:var = 123',
3771 'unlet g:var # something',
3772 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003773
Bram Moolenaar62aec932022-01-29 21:45:34 +00003774 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003775 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003776 'if 1 # comment2',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003777 ' echo "yes"',
3778 'elseif 2 #comment',
3779 ' echo "no"',
3780 'endif',
3781 ])
3782
Bram Moolenaar62aec932022-01-29 21:45:34 +00003783 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003784 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003785 'if 1# comment3',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003786 ' echo "yes"',
3787 'endif',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003788 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003789
Bram Moolenaar62aec932022-01-29 21:45:34 +00003790 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003791 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02003792 'if 0 # comment4',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003793 ' echo "yes"',
3794 'elseif 2#comment',
3795 ' echo "no"',
3796 'endif',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003797 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003798
Bram Moolenaar62aec932022-01-29 21:45:34 +00003799 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003800 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003801 'var v = 1 # comment5',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003802 ])
3803
Bram Moolenaar62aec932022-01-29 21:45:34 +00003804 v9.CheckScriptFailure([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003805 'vim9script',
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003806 'var v = 1# comment6',
Bram Moolenaarfae55a92021-06-17 22:08:30 +02003807 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003808
Bram Moolenaar62aec932022-01-29 21:45:34 +00003809 v9.CheckScriptSuccess([
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003810 'vim9script',
Bram Moolenaar2984ed32022-08-20 14:51:17 +01003811 'new',
Bram Moolenaard2c61702020-09-06 15:58:36 +02003812 'setline(1, ["# define pat", "last"])',
Bram Moolenaardf069ee2020-06-22 23:02:51 +02003813 ':$',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02003814 'dsearch /pat/ #comment',
3815 'bwipe!',
3816 ])
3817
Bram Moolenaar62aec932022-01-29 21:45:34 +00003818 v9.CheckScriptFailure([
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003819 'vim9script',
Bram Moolenaar2984ed32022-08-20 14:51:17 +01003820 'new',
Bram Moolenaard2c61702020-09-06 15:58:36 +02003821 'setline(1, ["# define pat", "last"])',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003822 ':$',
3823 'dsearch /pat/#comment',
3824 'bwipe!',
3825 ], 'E488:')
3826
Bram Moolenaar62aec932022-01-29 21:45:34 +00003827 v9.CheckScriptFailure([
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02003828 'vim9script',
3829 'func! SomeFunc()',
3830 ], 'E477:')
Bram Moolenaara26b9702020-04-18 19:53:28 +02003831enddef
3832
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003833def Test_finish()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003834 var lines =<< trim END
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003835 vim9script
Bram Moolenaar67979662020-06-20 22:50:47 +02003836 g:res = 'one'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003837 if v:false | finish | endif
Bram Moolenaar67979662020-06-20 22:50:47 +02003838 g:res = 'two'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003839 finish
Bram Moolenaar67979662020-06-20 22:50:47 +02003840 g:res = 'three'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003841 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003842 writefile(lines, 'Xfinished', 'D')
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003843 source Xfinished
3844 assert_equal('two', g:res)
3845
3846 unlet g:res
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02003847enddef
3848
Bram Moolenaara5d00772020-05-14 23:20:55 +02003849def Test_forward_declaration()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003850 var lines =<< trim END
Bram Moolenaara5d00772020-05-14 23:20:55 +02003851 vim9script
Bram Moolenaara5d00772020-05-14 23:20:55 +02003852 def GetValue(): string
3853 return theVal
3854 enddef
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003855 var theVal = 'something'
Bram Moolenaar822ba242020-05-24 23:00:18 +02003856 g:initVal = GetValue()
Bram Moolenaara5d00772020-05-14 23:20:55 +02003857 theVal = 'else'
3858 g:laterVal = GetValue()
3859 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003860 writefile(lines, 'Xforward', 'D')
Bram Moolenaara5d00772020-05-14 23:20:55 +02003861 source Xforward
3862 assert_equal('something', g:initVal)
3863 assert_equal('else', g:laterVal)
3864
3865 unlet g:initVal
3866 unlet g:laterVal
Bram Moolenaara5d00772020-05-14 23:20:55 +02003867enddef
3868
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003869def Test_declare_script_var_in_func()
Bram Moolenaare535db82021-03-31 21:07:24 +02003870 var lines =<< trim END
3871 vim9script
3872 func Declare()
3873 let s:local = 123
3874 endfunc
3875 Declare()
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003876 END
3877 v9.CheckScriptFailure(lines, 'E1269:')
3878enddef
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00003879
Bram Moolenaar75e27d72022-02-13 13:56:29 +00003880def Test_lock_script_var()
3881 var lines =<< trim END
3882 vim9script
3883 var local = 123
Bram Moolenaare535db82021-03-31 21:07:24 +02003884 assert_equal(123, local)
3885
3886 var error: string
3887 try
3888 local = 'asdf'
3889 catch
3890 error = v:exception
3891 endtry
3892 assert_match('E1012: Type mismatch; expected number but got string', error)
3893
3894 lockvar local
3895 try
3896 local = 999
3897 catch
3898 error = v:exception
3899 endtry
3900 assert_match('E741: Value is locked: local', error)
3901 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003902 v9.CheckScriptSuccess(lines)
Bram Moolenaare535db82021-03-31 21:07:24 +02003903enddef
Bram Moolenaar755bf2b2023-01-28 19:38:49 +00003904
Bram Moolenaare535db82021-03-31 21:07:24 +02003905
Bram Moolenaar7d699702020-08-14 20:52:28 +02003906func Test_vim9script_not_global()
3907 " check that items defined in Vim9 script are script-local, not global
3908 let vim9lines =<< trim END
3909 vim9script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003910 var name = 'local'
Bram Moolenaar7d699702020-08-14 20:52:28 +02003911 func TheFunc()
3912 echo 'local'
3913 endfunc
3914 def DefFunc()
3915 echo 'local'
3916 enddef
3917 END
Bram Moolenaardd674772022-09-15 22:26:18 +01003918 call writefile(vim9lines, 'Xvim9script.vim', 'D')
Bram Moolenaar7d699702020-08-14 20:52:28 +02003919 source Xvim9script.vim
3920 try
3921 echo g:var
3922 assert_report('did not fail')
3923 catch /E121:/
3924 " caught
3925 endtry
3926 try
3927 call TheFunc()
3928 assert_report('did not fail')
3929 catch /E117:/
3930 " caught
3931 endtry
3932 try
3933 call DefFunc()
3934 assert_report('did not fail')
3935 catch /E117:/
3936 " caught
3937 endtry
Bram Moolenaar7d699702020-08-14 20:52:28 +02003938endfunc
3939
Bram Moolenaareeb27bf2020-07-04 17:39:10 +02003940def Test_vim9_copen()
3941 # this was giving an error for setting w:quickfix_title
3942 copen
3943 quit
3944enddef
3945
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02003946def Test_script_var_in_autocmd()
3947 # using a script variable from an autocommand, defined in a :def function in a
3948 # legacy Vim script, cannot check the variable type.
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02003949 var lines =<< trim END
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02003950 let s:counter = 1
3951 def s:Func()
3952 au! CursorHold
3953 au CursorHold * s:counter += 1
3954 enddef
3955 call s:Func()
3956 doau CursorHold
3957 call assert_equal(2, s:counter)
3958 au! CursorHold
3959 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003960 v9.CheckScriptSuccess(lines)
Bram Moolenaar81e17fb2020-08-21 21:55:43 +02003961enddef
3962
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003963def Test_error_in_autoload_script()
3964 var save_rtp = &rtp
3965 var dir = getcwd() .. '/Xruntime'
3966 &rtp = dir
Bram Moolenaardd674772022-09-15 22:26:18 +01003967 mkdir(dir .. '/autoload', 'pR')
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003968
3969 var lines =<< trim END
3970 vim9script noclear
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003971 export def Autoloaded()
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003972 enddef
3973 def Broken()
3974 var x: any = ''
3975 eval x != 0
3976 enddef
3977 Broken()
3978 END
3979 writefile(lines, dir .. '/autoload/script.vim')
3980
3981 lines =<< trim END
3982 vim9script
3983 def CallAutoloaded()
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003984 script#Autoloaded()
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003985 enddef
3986
3987 function Legacy()
3988 try
3989 call s:CallAutoloaded()
3990 catch
3991 call assert_match('E1030: Using a String as a Number', v:exception)
3992 endtry
3993 endfunction
3994
3995 Legacy()
3996 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003997 v9.CheckScriptSuccess(lines)
Bram Moolenaarb5841b92021-07-15 18:09:53 +02003998
3999 &rtp = save_rtp
Bram Moolenaarb5841b92021-07-15 18:09:53 +02004000enddef
4001
Bram Moolenaar6809ff92022-07-26 15:10:56 +01004002def Test_error_in_autoload_script_foldexpr()
4003 var save_rtp = &rtp
Bram Moolenaardd674772022-09-15 22:26:18 +01004004 mkdir('Xvim/autoload', 'pR')
Bram Moolenaar6809ff92022-07-26 15:10:56 +01004005 &runtimepath = 'Xvim'
4006
4007 var lines =<< trim END
4008 vim9script
4009 eval [][0]
4010 echomsg 'no error'
4011 END
4012 lines->writefile('Xvim/autoload/script.vim')
4013
4014 lines =<< trim END
4015 vim9script
4016 import autoload 'script.vim'
4017 &foldmethod = 'expr'
4018 &foldexpr = 'script.Func()'
4019 redraw
4020 END
4021 v9.CheckScriptFailure(lines, 'E684: List index out of range: 0')
Bram Moolenaar6809ff92022-07-26 15:10:56 +01004022enddef
4023
Bram Moolenaare3d46852020-08-29 13:39:17 +02004024def Test_invalid_sid()
4025 assert_fails('func <SNR>1234_func', 'E123:')
Bram Moolenaar25859dd2020-08-30 12:54:53 +02004026
Bram Moolenaar62aec932022-01-29 21:45:34 +00004027 if g:RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"')
Bram Moolenaard2c61702020-09-06 15:58:36 +02004028 assert_equal([], readfile('Xdidit'))
Bram Moolenaare3d46852020-08-29 13:39:17 +02004029 endif
4030 delete('Xdidit')
4031enddef
4032
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004033def Test_restoring_cpo()
Bram Moolenaardd674772022-09-15 22:26:18 +01004034 writefile(['vim9script', 'set nocp'], 'Xsourced', 'D')
4035 writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00004036 if g:RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose')
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004037 assert_equal(['done'], readfile('Xdone'))
4038 endif
Bram Moolenaar090728a2020-12-20 15:43:31 +01004039 delete('Xdone')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004040
Bram Moolenaardd674772022-09-15 22:26:18 +01004041 writefile(['vim9script', 'g:cpoval = &cpo'], 'XanotherScript', 'D')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004042 set cpo=aABceFsMny>
4043 edit XanotherScript
4044 so %
4045 assert_equal('aABceFsMny>', &cpo)
Christian Brabandt22105fd2024-07-15 20:51:11 +02004046 assert_equal('aABceFsz', g:cpoval)
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004047 :1del
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004048 setline(1, 'let g:cpoval = &cpo')
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004049 w
4050 so %
4051 assert_equal('aABceFsMny>', &cpo)
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004052 assert_equal('aABceFsMny>', g:cpoval)
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004053
Bram Moolenaar0123cc12021-02-07 17:17:58 +01004054 set cpo&vim
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004055 unlet g:cpoval
4056
4057 if has('unix')
4058 # 'cpo' is not restored in main vimrc
4059 var save_HOME = $HOME
4060 $HOME = getcwd() .. '/Xhome'
Bram Moolenaardd674772022-09-15 22:26:18 +01004061 mkdir('Xhome', 'R')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004062 var lines =<< trim END
4063 vim9script
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004064 writefile(['before: ' .. &cpo], 'Xrporesult')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004065 set cpo+=M
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004066 writefile(['after: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004067 END
4068 writefile(lines, 'Xhome/.vimrc')
4069
4070 lines =<< trim END
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004071 call writefile(['later: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004072 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004073 writefile(lines, 'Xlegacy', 'D')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004074
4075 lines =<< trim END
4076 vim9script
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004077 call writefile(['vim9: ' .. &cpo], 'Xrporesult', 'a')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004078 qa
4079 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004080 writefile(lines, 'Xvim9', 'D')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004081
Bram Moolenaar62aec932022-01-29 21:45:34 +00004082 var cmd = g:GetVimCommand() .. " -S Xlegacy -S Xvim9"
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004083 cmd = substitute(cmd, '-u NONE', '', '')
4084 exe "silent !" .. cmd
4085
4086 assert_equal([
Christian Brabandt22105fd2024-07-15 20:51:11 +02004087 'before: aABceFsz',
4088 'after: aABceFszM',
4089 'later: aABceFszM',
4090 'vim9: aABceFsz'], readfile('Xrporesult'))
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004091
4092 $HOME = save_HOME
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004093 delete('Xrporesult')
Bram Moolenaar71eb3ad2021-12-26 12:07:30 +00004094 endif
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004095enddef
4096
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004097" Use :function so we can use Check commands
4098func Test_no_redraw_when_restoring_cpo()
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004099 CheckScreendump
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004100 CheckFeature timers
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004101 call Run_test_no_redraw_when_restoring_cpo()
4102endfunc
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004103
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004104def Run_test_no_redraw_when_restoring_cpo()
4105 var lines =<< trim END
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004106 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00004107 export def Func()
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004108 enddef
4109 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004110 mkdir('Xnordir/autoload', 'pR')
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01004111 writefile(lines, 'Xnordir/autoload/script.vim')
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004112
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004113 lines =<< trim END
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004114 vim9script
4115 set cpo+=M
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01004116 exe 'set rtp^=' .. getcwd() .. '/Xnordir'
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00004117 au CmdlineEnter : ++once timer_start(0, (_) => script#Func())
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004118 setline(1, 'some text')
4119 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004120 writefile(lines, 'XTest_redraw_cpo', 'D')
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004121 var buf = g:RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6})
4122 term_sendkeys(buf, "V:")
4123 g:VerifyScreenDump(buf, 'Test_vim9_no_redraw', {})
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004124
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004125 # clean up
4126 term_sendkeys(buf, "\<Esc>u")
4127 g:StopVimInTerminal(buf)
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004128enddef
4129
4130func Test_reject_declaration()
4131 CheckScreendump
4132 call Run_test_reject_declaration()
Bram Moolenaarffb7dcd2021-03-10 14:00:18 +01004133endfunc
Bram Moolenaar37294bd2021-03-10 13:40:08 +01004134
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004135def Run_test_reject_declaration()
4136 var buf = g:RunVimInTerminal('', {'rows': 6})
4137 term_sendkeys(buf, ":vim9cmd var x: number\<CR>")
Bram Moolenaar330a3882022-03-05 11:05:57 +00004138 g:VerifyScreenDump(buf, 'Test_vim9_reject_declaration_1', {})
4139 term_sendkeys(buf, ":\<CR>")
4140 term_sendkeys(buf, ":vim9cmd g:foo = 123 | echo g:foo\<CR>")
4141 g:VerifyScreenDump(buf, 'Test_vim9_reject_declaration_2', {})
Bram Moolenaar0e1574c2022-03-03 17:05:35 +00004142
4143 # clean up
4144 g:StopVimInTerminal(buf)
4145enddef
Bram Moolenaar9ec70262020-12-09 17:16:59 +01004146
Bram Moolenaar204852a2022-03-05 12:56:44 +00004147def Test_minimal_command_name_length()
4148 var names = [
4149 'cons',
4150 'brea',
4151 'cat',
4152 'catc',
4153 'con',
Bram Moolenaarb2175222022-03-05 20:24:41 +00004154 'cont',
4155 'conti',
4156 'contin',
4157 'continu',
Bram Moolenaar204852a2022-03-05 12:56:44 +00004158 'el',
4159 'els',
4160 'elsei',
4161 'endfo',
4162 'en',
4163 'end',
4164 'endi',
4165 'endw',
4166 'endt',
4167 'endtr',
Bram Moolenaarb2175222022-03-05 20:24:41 +00004168 'exp',
4169 'expo',
4170 'expor',
Bram Moolenaar204852a2022-03-05 12:56:44 +00004171 'fina',
4172 'finall',
Bram Moolenaard523c7b2022-03-06 14:51:22 +00004173 'fini',
4174 'finis',
Bram Moolenaarb2175222022-03-05 20:24:41 +00004175 'imp',
4176 'impo',
4177 'impor',
4178 'retu',
4179 'retur',
Bram Moolenaar204852a2022-03-05 12:56:44 +00004180 'th',
4181 'thr',
4182 'thro',
4183 'wh',
4184 'whi',
4185 'whil',
4186 ]
4187 for name in names
4188 v9.CheckDefAndScriptFailure([name .. ' '], 'E1065:')
4189 endfor
Bram Moolenaarb2175222022-03-05 20:24:41 +00004190
4191 var lines =<< trim END
4192 vim9script
4193 def SomeFunc()
4194 endd
4195 END
4196 v9.CheckScriptFailure(lines, 'E1065:')
4197 lines =<< trim END
4198 vim9script
4199 def SomeFunc()
4200 endde
4201 END
4202 v9.CheckScriptFailure(lines, 'E1065:')
Bram Moolenaar204852a2022-03-05 12:56:44 +00004203enddef
4204
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004205def Test_unset_any_variable()
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004206 var lines =<< trim END
4207 var name: any
4208 assert_equal(0, name)
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004209 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004210 v9.CheckDefAndScriptSuccess(lines)
Bram Moolenaarf0afd9e2020-09-13 18:57:47 +02004211enddef
4212
Bram Moolenaar7e9210e2020-09-25 23:12:51 +02004213func Test_define_func_at_command_line()
Bram Moolenaar58dbef32020-09-25 22:13:05 +02004214 CheckRunVimInTerminal
4215
Bram Moolenaar7e9210e2020-09-25 23:12:51 +02004216 " call indirectly to avoid compilation error for missing functions
4217 call Run_Test_define_func_at_command_line()
4218endfunc
4219
4220def Run_Test_define_func_at_command_line()
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004221 # run in a separate Vim instance to avoid the script context
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02004222 var lines =<< trim END
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004223 func CheckAndQuit()
4224 call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc')
4225 call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd')
4226 endfunc
4227 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004228 writefile([''], 'Xdidcmd', 'D')
4229 writefile(lines, 'XcallFunc', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00004230 var buf = g:RunVimInTerminal('-S XcallFunc', {rows: 6})
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004231 # define Afunc() on the command line
4232 term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>")
4233 term_sendkeys(buf, ":call CheckAndQuit()\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004234 g:WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd')))
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004235
Bram Moolenaar62aec932022-01-29 21:45:34 +00004236 call g:StopVimInTerminal(buf)
Bram Moolenaar9c4f5522020-09-25 21:47:28 +02004237enddef
4238
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004239def Test_script_var_scope()
4240 var lines =<< trim END
4241 vim9script
4242 if true
4243 if true
4244 var one = 'one'
4245 echo one
4246 endif
4247 echo one
4248 endif
4249 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004250 v9.CheckScriptFailure(lines, 'E121:', 7)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004251
4252 lines =<< trim END
4253 vim9script
4254 if true
4255 if false
4256 var one = 'one'
4257 echo one
4258 else
4259 var one = 'one'
4260 echo one
4261 endif
4262 echo one
4263 endif
4264 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004265 v9.CheckScriptFailure(lines, 'E121:', 10)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004266
4267 lines =<< trim END
4268 vim9script
4269 while true
4270 var one = 'one'
4271 echo one
4272 break
4273 endwhile
4274 echo one
4275 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004276 v9.CheckScriptFailure(lines, 'E121:', 7)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004277
4278 lines =<< trim END
4279 vim9script
4280 for i in range(1)
4281 var one = 'one'
4282 echo one
4283 endfor
4284 echo one
4285 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004286 v9.CheckScriptFailure(lines, 'E121:', 6)
Bram Moolenaar9becdf22020-10-10 21:33:48 +02004287
4288 lines =<< trim END
4289 vim9script
4290 {
4291 var one = 'one'
4292 assert_equal('one', one)
4293 }
4294 assert_false(exists('one'))
4295 assert_false(exists('s:one'))
4296 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004297 v9.CheckScriptSuccess(lines)
Bram Moolenaar9becdf22020-10-10 21:33:48 +02004298
4299 lines =<< trim END
4300 vim9script
4301 {
4302 var one = 'one'
4303 echo one
4304 }
4305 echo one
4306 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004307 v9.CheckScriptFailure(lines, 'E121:', 6)
Bram Moolenaarfcdc5d82020-10-10 19:07:09 +02004308enddef
4309
Bram Moolenaar352134b2020-10-17 22:04:08 +02004310def Test_catch_exception_in_callback()
4311 var lines =<< trim END
4312 vim9script
Bram Moolenaar2a389082021-04-09 20:24:31 +02004313 def Callback(...l: list<any>)
Bram Moolenaar352134b2020-10-17 22:04:08 +02004314 try
4315 var x: string
4316 var y: string
4317 # this error should be caught with CHECKLEN
Bram Moolenaardb9ff9a2021-12-01 17:38:01 +00004318 var sl = ['']
4319 [x, y] = sl
Bram Moolenaar352134b2020-10-17 22:04:08 +02004320 catch
4321 g:caught = 'yes'
4322 endtry
4323 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01004324 popup_menu('popup', {callback: Callback})
Bram Moolenaar352134b2020-10-17 22:04:08 +02004325 feedkeys("\r", 'xt')
4326 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004327 v9.CheckScriptSuccess(lines)
Bram Moolenaar352134b2020-10-17 22:04:08 +02004328
4329 unlet g:caught
4330enddef
4331
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004332def Test_no_unknown_error_after_error()
4333 if !has('unix') || !has('job')
4334 throw 'Skipped: not unix of missing +job feature'
4335 endif
Bram Moolenaarb16ff292021-09-26 20:14:39 +01004336 # FIXME: this check should not be needed
4337 if has('win32')
4338 throw 'Skipped: does not work on MS-Windows'
4339 endif
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004340 var lines =<< trim END
4341 vim9script
4342 var source: list<number>
Bram Moolenaar2a389082021-04-09 20:24:31 +02004343 def Out_cb(...l: list<any>)
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004344 eval [][0]
4345 enddef
Bram Moolenaar2a389082021-04-09 20:24:31 +02004346 def Exit_cb(...l: list<any>)
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004347 sleep 1m
Bram Moolenaar23d44492022-05-04 16:24:57 +01004348 g:did_call_exit_cb = true
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004349 source += l
4350 enddef
Bram Moolenaare0de1712020-12-02 17:36:54 +01004351 var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'})
Bram Moolenaar6f17a3f2020-12-21 18:11:24 +01004352 while job_status(myjob) == 'run'
4353 sleep 10m
4354 endwhile
Bram Moolenaar206c2a62021-01-31 14:04:44 +01004355 # wait for Exit_cb() to be called
Bram Moolenaar23d44492022-05-04 16:24:57 +01004356 for x in range(100)
4357 if exists('g:did_call_exit_cb')
4358 unlet g:did_call_exit_cb
4359 break
4360 endif
4361 sleep 10m
4362 endfor
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004363 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004364 writefile(lines, 'Xdef', 'D')
Yee Cheng Chin69a8bb82022-11-06 12:25:47 +00004365 # Either the exit or out callback is called first, accept them in any order
4366 assert_fails('so Xdef', ['E684:\|E1012:', 'E1012:\|E684:'])
Bram Moolenaar631e8f92020-11-04 15:07:16 +01004367enddef
4368
Bram Moolenaar4324d872020-12-01 20:12:24 +01004369def InvokeNormal()
4370 exe "norm! :m+1\r"
4371enddef
4372
4373def Test_invoke_normal_in_visual_mode()
4374 xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR>
4375 new
4376 setline(1, ['aaa', 'bbb'])
4377 feedkeys("V\<F3>", 'xt')
4378 assert_equal(['bbb', 'aaa'], getline(1, 2))
4379 xunmap <F3>
4380enddef
4381
Bram Moolenaarb5b94802020-12-13 17:50:20 +01004382def Test_white_space_after_command()
4383 var lines =<< trim END
4384 exit_cb: Func})
4385 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004386 v9.CheckDefAndScriptFailure(lines, 'E1144:', 1)
Bram Moolenaarf8103f22020-12-25 17:36:27 +01004387
4388 lines =<< trim END
4389 e#
4390 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004391 v9.CheckDefAndScriptFailure(lines, 'E1144:', 1)
Bram Moolenaarb5b94802020-12-13 17:50:20 +01004392enddef
4393
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004394def Test_script_var_gone_when_sourced_twice()
4395 var lines =<< trim END
4396 vim9script
4397 if exists('g:guard')
4398 finish
4399 endif
4400 g:guard = 1
4401 var name = 'thename'
4402 def g:GetName(): string
4403 return name
4404 enddef
4405 def g:SetName(arg: string)
4406 name = arg
4407 enddef
4408 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004409 writefile(lines, 'XscriptTwice.vim', 'D')
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004410 so XscriptTwice.vim
4411 assert_equal('thename', g:GetName())
4412 g:SetName('newname')
4413 assert_equal('newname', g:GetName())
4414 so XscriptTwice.vim
4415 assert_fails('call g:GetName()', 'E1149:')
4416 assert_fails('call g:SetName("x")', 'E1149:')
4417
4418 delfunc g:GetName
4419 delfunc g:SetName
Bram Moolenaar4aab88d2020-12-24 21:56:41 +01004420 unlet g:guard
4421enddef
4422
Bram Moolenaar10b94212021-02-19 21:42:57 +01004423def Test_unsupported_commands()
4424 var lines =<< trim END
4425 ka
4426 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004427 v9.CheckDefAndScriptFailure(lines, ['E476:', 'E492:'])
Bram Moolenaar10b94212021-02-19 21:42:57 +01004428
4429 lines =<< trim END
Bram Moolenaarada1d872021-02-20 08:16:51 +01004430 :1ka
4431 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004432 v9.CheckDefAndScriptFailure(lines, ['E476:', 'E492:'])
Bram Moolenaarada1d872021-02-20 08:16:51 +01004433
4434 lines =<< trim END
Yegappan Lakshmanan885de442022-04-23 10:51:14 +01004435 :k a
4436 END
4437 v9.CheckDefAndScriptFailure(lines, 'E1100:')
4438
4439 lines =<< trim END
4440 :1k a
4441 END
4442 v9.CheckDefAndScriptFailure(lines, 'E481:')
4443
4444 lines =<< trim END
Bram Moolenaar10b94212021-02-19 21:42:57 +01004445 t
4446 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004447 v9.CheckDefAndScriptFailure(lines, 'E1100:')
Bram Moolenaar10b94212021-02-19 21:42:57 +01004448
4449 lines =<< trim END
4450 x
4451 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004452 v9.CheckDefAndScriptFailure(lines, 'E1100:')
Bram Moolenaar10b94212021-02-19 21:42:57 +01004453
4454 lines =<< trim END
4455 xit
4456 END
Bram Moolenaar6aca4d32022-03-04 17:10:19 +00004457 v9.CheckDefAndScriptFailure(lines, 'E1100:')
4458
4459 lines =<< trim END
4460 Print
4461 END
4462 v9.CheckDefAndScriptFailure(lines, ['E476: Invalid command: Print', 'E492: Not an editor command: Print'])
4463
4464 lines =<< trim END
4465 mode 4
4466 END
4467 v9.CheckDefAndScriptFailure(lines, ['E476: Invalid command: mode 4', 'E492: Not an editor command: mode 4'])
Bram Moolenaar10b94212021-02-19 21:42:57 +01004468enddef
4469
Bram Moolenaarc70fe462021-04-17 17:59:19 +02004470def Test_mapping_line_number()
4471 var lines =<< trim END
4472 vim9script
4473 def g:FuncA()
4474 # Some comment
4475 FuncB(0)
4476 enddef
4477 # Some comment
4478 def FuncB(
4479 # Some comment
4480 n: number
4481 )
4482 exe 'nno '
4483 # Some comment
4484 .. '<F3> a'
4485 .. 'b'
4486 .. 'c'
4487 enddef
4488 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004489 v9.CheckScriptSuccess(lines)
Bram Moolenaarc70fe462021-04-17 17:59:19 +02004490 var res = execute('verbose nmap <F3>')
4491 assert_match('No mapping found', res)
4492
4493 g:FuncA()
4494 res = execute('verbose nmap <F3>')
4495 assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res)
4496
4497 nunmap <F3>
4498 delfunc g:FuncA
4499enddef
4500
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004501def Test_option_set()
4502 # legacy script allows for white space
4503 var lines =<< trim END
4504 set foldlevel =11
4505 call assert_equal(11, &foldlevel)
4506 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004507 v9.CheckScriptSuccess(lines)
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004508
4509 set foldlevel
4510 set foldlevel=12
4511 assert_equal(12, &foldlevel)
4512 set foldlevel+=2
4513 assert_equal(14, &foldlevel)
4514 set foldlevel-=3
4515 assert_equal(11, &foldlevel)
4516
4517 lines =<< trim END
4518 set foldlevel =1
4519 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004520 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004521
4522 lines =<< trim END
4523 set foldlevel +=1
4524 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004525 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004526
4527 lines =<< trim END
4528 set foldlevel ^=1
4529 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004530 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004531
4532 lines =<< trim END
4533 set foldlevel -=1
4534 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004535 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1')
Bram Moolenaardeb108b2021-07-08 17:35:36 +02004536
4537 set foldlevel&
4538enddef
4539
LemonBoy32f34612023-09-02 21:52:05 +02004540def Test_option_set_line_number()
4541 var lines =<< trim END
4542 vim9script
4543 # line2
4544 # line3
4545 def F()
4546 # line5
4547 &foldlevel = -128
4548 enddef
4549 F()
4550 END
4551 v9.CheckScriptSuccess(lines)
4552
4553 var res = execute('verbose set foldlevel')
4554 assert_match(' foldlevel.*Last set from .*XScriptSuccess\d\+ line 6', res)
4555enddef
4556
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004557def Test_option_modifier()
Bram Moolenaar1594f312021-07-08 16:40:13 +02004558 # legacy script allows for white space
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004559 var lines =<< trim END
4560 set hlsearch & hlsearch !
4561 call assert_equal(1, &hlsearch)
4562 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004563 v9.CheckScriptSuccess(lines)
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004564
Bram Moolenaar1594f312021-07-08 16:40:13 +02004565 set hlsearch
4566 set hlsearch!
4567 assert_equal(false, &hlsearch)
4568
4569 set hlsearch
4570 set hlsearch&
4571 assert_equal(false, &hlsearch)
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004572
4573 lines =<< trim END
Bram Moolenaar1594f312021-07-08 16:40:13 +02004574 set hlsearch &
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004575 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004576 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &')
Bram Moolenaar1594f312021-07-08 16:40:13 +02004577
4578 lines =<< trim END
4579 set hlsearch !
4580 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004581 v9.CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !')
Bram Moolenaar1594f312021-07-08 16:40:13 +02004582
4583 set hlsearch&
Bram Moolenaar208f0b42021-06-20 12:40:08 +02004584enddef
4585
Bram Moolenaarc03fe662021-07-11 16:52:45 +02004586" This must be called last, it may cause following :def functions to fail
4587def Test_xxx_echoerr_line_number()
4588 var lines =<< trim END
4589 echoerr 'some'
4590 .. ' error'
4591 .. ' continued'
4592 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004593 v9.CheckDefExecAndScriptFailure(lines, 'some error continued', 1)
Bram Moolenaarc03fe662021-07-11 16:52:45 +02004594enddef
4595
Bram Moolenaar9537e372021-12-10 21:05:53 +00004596func Test_debug_with_lambda()
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004597 CheckRunVimInTerminal
4598
Bram Moolenaar9537e372021-12-10 21:05:53 +00004599 " call indirectly to avoid compilation error for missing functions
4600 call Run_Test_debug_with_lambda()
4601endfunc
4602
4603def Run_Test_debug_with_lambda()
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004604 var lines =<< trim END
4605 vim9script
4606 def Func()
4607 var n = 0
4608 echo [0]->filter((_, v) => v == n)
4609 enddef
4610 breakadd func Func
4611 Func()
4612 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004613 writefile(lines, 'XdebugFunc', 'D')
Christian Brabandt7edde3f2024-05-04 09:38:59 +02004614 var buf = g:RunVimInTerminal('-S XdebugFunc', {rows: 10, wait_for_ruler: 0})
4615 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 10)))
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004616
4617 term_sendkeys(buf, "cont\<CR>")
Christian Brabandt7edde3f2024-05-04 09:38:59 +02004618 g:WaitForAssert(() => assert_match('\[0\]', term_getline(buf, 9)))
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004619
Bram Moolenaar62aec932022-01-29 21:45:34 +00004620 g:StopVimInTerminal(buf)
Bram Moolenaar9fffef92021-12-10 16:55:58 +00004621enddef
4622
Bram Moolenaar310091d2021-12-23 21:14:37 +00004623func Test_debug_running_out_of_lines()
4624 CheckRunVimInTerminal
4625
4626 " call indirectly to avoid compilation error for missing functions
4627 call Run_Test_debug_running_out_of_lines()
4628endfunc
4629
4630def Run_Test_debug_running_out_of_lines()
4631 var lines =<< trim END
4632 vim9script
4633 def Crash()
4634 #
4635 #
4636 #
4637 #
4638 #
4639 #
4640 #
4641 if true
4642 #
4643 endif
4644 enddef
4645 breakadd func Crash
4646 Crash()
4647 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004648 writefile(lines, 'XdebugFunc', 'D')
Christian Brabandt7edde3f2024-05-04 09:38:59 +02004649 var buf = g:RunVimInTerminal('-S XdebugFunc', {rows: 10, wait_for_ruler: 0})
4650 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 10)))
Bram Moolenaar310091d2021-12-23 21:14:37 +00004651
4652 term_sendkeys(buf, "next\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004653 g:TermWait(buf)
Christian Brabandt7edde3f2024-05-04 09:38:59 +02004654 g:WaitForAssert(() => assert_match('^>', term_getline(buf, 10)))
Bram Moolenaar310091d2021-12-23 21:14:37 +00004655
4656 term_sendkeys(buf, "cont\<CR>")
Bram Moolenaar62aec932022-01-29 21:45:34 +00004657 g:TermWait(buf)
Bram Moolenaar310091d2021-12-23 21:14:37 +00004658
Bram Moolenaar62aec932022-01-29 21:45:34 +00004659 g:StopVimInTerminal(buf)
Bram Moolenaar310091d2021-12-23 21:14:37 +00004660enddef
4661
dundargocc57b5bc2022-11-02 13:30:51 +00004662def Test_ambiguous_command_error()
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004663 var lines =<< trim END
4664 vim9script
4665 command CmdA echomsg 'CmdA'
4666 command CmdB echomsg 'CmdB'
4667 Cmd
4668 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004669 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 4)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004670
4671 lines =<< trim END
4672 vim9script
4673 def Func()
4674 Cmd
4675 enddef
4676 Func()
4677 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004678 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 1)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004679
4680 lines =<< trim END
4681 vim9script
4682 nnoremap <F3> <ScriptCmd>Cmd<CR>
4683 feedkeys("\<F3>", 'xt')
4684 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00004685 v9.CheckScriptFailure(lines, 'E464: Ambiguous use of user-defined command: Cmd', 3)
Bram Moolenaarbed34f02022-01-19 20:48:37 +00004686
4687 delcommand CmdA
4688 delcommand CmdB
4689 nunmap <F3>
4690enddef
4691
Dominique Pelle923dce22021-11-21 11:36:04 +00004692" Execute this near the end, profiling doesn't stop until Vim exits.
Bram Moolenaard9162552021-07-11 15:26:13 +02004693" This only tests that it works, not the profiling output.
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004694def Test_profile_with_lambda()
Bram Moolenaar4ece1522021-07-11 16:31:51 +02004695 CheckFeature profile
4696
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004697 var lines =<< trim END
4698 vim9script
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004699
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004700 def ProfiledWithLambda()
4701 var n = 3
4702 echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n)
4703 enddef
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004704
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004705 def ProfiledNested()
4706 var x = 0
4707 def Nested(): any
4708 return x
4709 enddef
4710 Nested()
4711 enddef
Bram Moolenaarffcfddc2021-07-11 20:22:30 +02004712
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004713 def g:ProfiledNestedProfiled()
4714 var x = 0
4715 def Nested(): any
4716 return x
4717 enddef
4718 Nested()
4719 enddef
4720
4721 def Profile()
Bram Moolenaar48f69cd2022-03-15 16:16:47 +00004722 ProfiledWithLambda()
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004723 ProfiledNested()
4724
Bram Moolenaar48f69cd2022-03-15 16:16:47 +00004725 # Also profile the nested function. Use a different function, although
4726 # the contents is the same, to make sure it was not already compiled.
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004727 profile func *
4728 g:ProfiledNestedProfiled()
4729
4730 profdel func *
4731 profile pause
4732 enddef
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004733
4734 var result = 'done'
4735 try
4736 # mark functions for profiling now to avoid E1271
4737 profile start Xprofile.log
4738 profile func ProfiledWithLambda
4739 profile func ProfiledNested
4740
4741 Profile()
4742 catch
4743 result = 'failed: ' .. v:exception
4744 finally
4745 writefile([result], 'Xdidprofile')
4746 endtry
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004747 END
Bram Moolenaardd674772022-09-15 22:26:18 +01004748 writefile(lines, 'Xprofile.vim', 'D')
Bram Moolenaar129e33e2022-03-14 10:50:23 +00004749 call system(g:GetVimCommand()
4750 .. ' --clean'
4751 .. ' -c "so Xprofile.vim"'
4752 .. ' -c "qall!"')
4753 call assert_equal(0, v:shell_error)
4754
4755 assert_equal(['done'], readfile('Xdidprofile'))
4756 assert_true(filereadable('Xprofile.log'))
4757 delete('Xdidprofile')
4758 delete('Xprofile.log')
Bram Moolenaard9162552021-07-11 15:26:13 +02004759enddef
4760
Bram Moolenaar4f6e7722022-03-16 20:26:02 +00004761func Test_misplaced_type()
4762 CheckRunVimInTerminal
4763 call Run_Test_misplaced_type()
4764endfunc
4765
4766def Run_Test_misplaced_type()
Bram Moolenaar9510d222022-09-11 15:14:05 +01004767 writefile(['let g:somevar = "asdf"'], 'XTest_misplaced_type', 'D')
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004768 var buf = g:RunVimInTerminal('-S XTest_misplaced_type', {'rows': 6})
Bram Moolenaar9510d222022-09-11 15:14:05 +01004769 term_sendkeys(buf, ":vim9cmd echo islocked('somevar: string')\<CR>")
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004770 g:VerifyScreenDump(buf, 'Test_misplaced_type', {})
4771
4772 g:StopVimInTerminal(buf)
Bram Moolenaar4c8b5462022-03-16 20:01:39 +00004773enddef
4774
LemonBoya5d35902022-04-29 21:15:02 +01004775" Ensure echo doesn't crash when stringifying empty variables.
4776def Test_echo_uninit_variables()
4777 var res: string
4778
4779 var var_bool: bool
4780 var var_num: number
4781 var var_float: float
4782 var Var_func: func
4783 var var_string: string
4784 var var_blob: blob
LemonBoya5d35902022-04-29 21:15:02 +01004785 var var_list: list<any>
4786 var var_dict: dict<any>
4787
4788 redir => res
4789 echo var_bool
4790 echo var_num
4791 echo var_float
4792 echo Var_func
4793 echo var_string
4794 echo var_blob
LemonBoya5d35902022-04-29 21:15:02 +01004795 echo var_list
4796 echo var_dict
4797 redir END
4798
Bram Moolenaarf1d63b92022-05-06 13:37:42 +01004799 assert_equal(['false', '0', '0.0', 'function()', '', '0z', '[]', '{}'], res->split('\n'))
4800
4801 if has('job')
4802 var var_job: job
4803 var var_channel: channel
4804
4805 redir => res
4806 echo var_job
4807 echo var_channel
4808 redir END
4809
4810 assert_equal(['no process', 'channel fail'], res->split('\n'))
4811 endif
LemonBoya5d35902022-04-29 21:15:02 +01004812enddef
4813
Bram Moolenaar6342e2c2022-12-12 18:56:32 +00004814def Test_free_type_before_use()
4815 # this rather complicated script was freeing a type before using it
4816 var lines =<< trim END
4817 vim9script
4818
4819 def Scan(rel: list<dict<any>>): func(func(dict<any>))
4820 return (Emit: func(dict<any>)) => {
4821 for t in rel
4822 Emit(t)
4823 endfor
4824 }
4825 enddef
4826
4827 def Build(Cont: func(func(dict<any>))): list<dict<any>>
4828 var rel: list<dict<any>> = []
4829 Cont((t) => {
4830 add(rel, t)
4831 })
4832 return rel
4833 enddef
4834
4835 var R = [{A: 0}]
4836 var result = Scan(R)->Build()
4837 result = Scan(R)->Build()
4838
4839 assert_equal(R, result)
4840 END
4841 v9.CheckScriptSuccess(lines)
4842enddef
4843
Yegappan Lakshmanana76fbe62023-09-27 18:51:43 +02004844" The following complicated script used to cause an internal error (E340)
4845" because the funcref instruction memory was referenced after the instruction
4846" memory was reallocated (Github issue #13178)
4847def Test_refer_funcref_instr_after_realloc()
4848 var lines =<< trim END
4849 vim9script
4850 def A(d: bool)
4851 var e = abs(0)
4852 var f = &emoji
4853 &emoji = true
4854 if ['', '', '']->index('xxx') == 0
4855 eval 0 + 0
4856 endif
4857 if &filetype == 'xxx'
4858 var g = abs(0)
4859 while g > 0
4860 if getline(g) == ''
4861 break
4862 endif
4863 --g
4864 endwhile
4865 if g == 0
4866 return
4867 endif
4868 if d
4869 feedkeys($'{g}G')
4870 g = abs(0)
4871 endif
4872 var h = abs(0)
4873 var i = abs(0)
4874 var j = abs(0)
4875 while j < 0
4876 if abs(0) < h && getline(j) != ''
4877 break
4878 endif
4879 ++j
4880 endwhile
4881 feedkeys($'{g}G{j}G')
4882 return
4883 endif
4884 def B()
4885 enddef
4886 def C()
4887 enddef
4888 enddef
4889 A(false)
4890 END
4891 v9.CheckScriptSuccess(lines)
4892enddef
4893
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004894" Test for calling a deferred function after an exception
4895def Test_defer_after_exception()
4896 var lines =<< trim END
4897 vim9script
4898
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004899 var callTrace: list<number> = []
4900 def Bar()
4901 callTrace += [1]
4902 throw 'InnerException'
4903 enddef
4904
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004905 def Defer()
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004906 callTrace += [2]
4907 callTrace += [3]
4908 try
4909 Bar()
4910 catch /InnerException/
4911 callTrace += [4]
4912 endtry
4913 callTrace += [5]
4914 callTrace += [6]
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004915 enddef
4916
4917 def Foo()
4918 defer Defer()
4919 throw "TestException"
4920 enddef
4921
4922 try
4923 Foo()
4924 catch /TestException/
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004925 callTrace += [7]
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004926 endtry
4927
Yegappan Lakshmananc59c1e02023-10-19 10:52:34 +02004928 assert_equal([2, 3, 1, 4, 5, 6, 7], callTrace)
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004929 END
Yegappan Lakshmananec3cebb2023-10-27 19:35:26 +02004930 v9.CheckSourceSuccess(lines)
Yegappan Lakshmanan06725952023-10-18 11:47:37 +02004931enddef
4932
Yegappan Lakshmanan0ab500d2023-10-21 11:59:42 +02004933" Test for multiple deferred function which throw exceptions.
4934" Exceptions thrown by deferred functions should result in error messages but
4935" not propagated into the calling functions.
4936def Test_multidefer_with_exception()
4937 var lines =<< trim END
4938 vim9script
4939
4940 var callTrace: list<number> = []
4941 def Except()
4942 callTrace += [1]
4943 throw 'InnerException'
4944 callTrace += [2]
4945 enddef
4946
4947 def FirstDefer()
4948 callTrace += [3]
4949 callTrace += [4]
4950 enddef
4951
4952 def SecondDeferWithExcept()
4953 callTrace += [5]
4954 Except()
4955 callTrace += [6]
4956 enddef
4957
4958 def ThirdDefer()
4959 callTrace += [7]
4960 callTrace += [8]
4961 enddef
4962
4963 def Foo()
4964 callTrace += [9]
4965 defer FirstDefer()
4966 defer SecondDeferWithExcept()
4967 defer ThirdDefer()
4968 callTrace += [10]
4969 enddef
4970
4971 v:errmsg = ''
4972 try
4973 callTrace += [11]
4974 Foo()
4975 callTrace += [12]
4976 catch /TestException/
4977 callTrace += [13]
4978 catch
4979 callTrace += [14]
4980 finally
4981 callTrace += [15]
4982 endtry
4983 callTrace += [16]
4984
4985 assert_equal('E605: Exception not caught: InnerException', v:errmsg)
4986 assert_equal([11, 9, 10, 7, 8, 5, 1, 3, 4, 12, 15, 16], callTrace)
4987 END
Yegappan Lakshmananec3cebb2023-10-27 19:35:26 +02004988 v9.CheckSourceSuccess(lines)
4989enddef
4990
Yegappan Lakshmanana185a312023-12-16 14:36:08 +01004991" Test for using ":defer" inside an if statement with a false condition
4992def Test_defer_skipped()
4993 var lines =<< trim END
4994 def Foo()
4995 if false
4996 defer execute('echow "hello"', "")
4997 endif
4998 enddef
4999 defcompile
5000 END
5001 v9.CheckSourceSuccess(lines)
5002enddef
5003
Yegappan Lakshmanan062bb6b2023-12-16 14:46:40 +01005004" Test for using defer without parenthesis for the function name
5005def Test_defer_func_without_paren()
5006 var lines =<< trim END
5007 vim9script
5008 def Foo()
5009 defer Bar
5010 enddef
5011 defcompile
5012 END
5013 v9.CheckScriptFailure(lines, 'E107: Missing parentheses: Bar', 1)
5014enddef
5015
5016" Test for using defer without parenthesis for the function name
5017def Test_defer_non_existing_func()
5018 var lines =<< trim END
5019 vim9script
5020 def Foo()
5021 defer Bar()
5022 enddef
5023 defcompile
5024 END
5025 v9.CheckScriptFailure(lines, 'E1001: Variable not found: Bar', 1)
5026enddef
5027
5028" Test for using defer with an invalid function name
5029def Test_defer_invalid_func()
5030 var lines =<< trim END
5031 vim9script
5032 def Foo()
5033 var Abc = 10
5034 defer Abc()
5035 enddef
5036 defcompile
5037 END
5038 v9.CheckScriptFailure(lines, 'E129: Function name required', 2)
5039enddef
5040
5041" Test for using defer with an invalid argument to a function
5042def Test_defer_invalid_func_arg()
5043 var lines =<< trim END
5044 vim9script
5045 def Bar(x: number)
5046 enddef
5047 def Foo()
5048 defer Bar(a)
5049 enddef
5050 defcompile
5051 END
5052 v9.CheckScriptFailure(lines, 'E1001: Variable not found: a', 1)
5053enddef
5054
5055" Test for using an non-existing type in a "for" statement.
5056def Test_invalid_type_in_for()
5057 var lines =<< trim END
5058 vim9script
5059 def Foo()
5060 for b: x in range(10)
5061 endfor
5062 enddef
5063 defcompile
5064 END
Yegappan Lakshmanan1b531722024-05-09 09:12:31 +02005065 v9.CheckSourceFailure(lines, 'E1010: Type not recognized: x', 1)
Yegappan Lakshmanan062bb6b2023-12-16 14:46:40 +01005066enddef
5067
5068" Test for using a line break between the variable name and the type in a for
5069" statement.
5070def Test_for_stmt_space_before_type()
5071 var lines =<< trim END
5072 vim9script
5073 def Foo()
5074 for a
5075 :number in range(10)
5076 endfor
5077 enddef
5078 defcompile
5079 END
5080 v9.CheckSourceFailure(lines, 'E1059: No white space allowed before colon: :number in range(10)', 2)
5081enddef
5082
zeertzjqc029c132024-03-28 11:37:26 +01005083" This test used to cause a use-after-free memory access
Yegappan Lakshmanan28d71b52024-01-12 17:21:55 +01005084def Test_for_empty_line_after_lambda()
5085 var lines =<< trim END
5086 vim9script
5087 echomsg range(0, 2)->map((_, v) => {
5088 return 1
5089 })
5090
5091 assert_equal('[1, 1, 1]', v:statusmsg)
5092 END
5093 v9.CheckSourceSuccess(lines)
5094
5095 lines =<< trim END
5096 vim9script
5097 echomsg range(0, 1)->map((_, v) => {
5098 return 1
5099 }) range(0, 1)->map((_, v) => {
5100 return 2
5101 }) # comment
5102
5103 assert_equal('[1, 1] [2, 2]', v:statusmsg)
5104 END
5105 v9.CheckSourceSuccess(lines)
5106enddef
5107
Yegappan Lakshmanan3fa8f772024-04-04 21:42:07 +02005108" Test for evaluating a lambda block from a string
5109def Test_eval_lambda_block()
5110 var lines =<< trim END
5111 vim9script
5112 var Fn = eval("(x: number): number => {\nreturn x * 2\n}")
5113 assert_equal(6, Fn(3))
5114 END
5115 v9.CheckSourceSuccess(lines)
5116enddef
5117
Yegappan Lakshmananda9d3452024-05-02 13:02:36 +02005118" Test for using various null values
5119def Test_null_values()
5120 var lines =<< trim END
5121 var nullValues = [
5122 [null, 1, 'null', 7, 'special'],
5123 [null_blob, 1, '0z', 10, 'blob'],
Yegappan Lakshmananda9d3452024-05-02 13:02:36 +02005124 [null_dict, 1, '{}', 4, 'dict<any>'],
5125 [null_function, 1, "function('')", 2, 'func(...): unknown'],
Yegappan Lakshmananda9d3452024-05-02 13:02:36 +02005126 [null_list, 1, '[]', 3, 'list<any>'],
5127 [null_object, 1, 'object of [unknown]', 13, 'object<Unknown>'],
5128 [null_partial, 1, "function('')", 2, 'func(...): unknown'],
5129 [null_string, 1, "''", 1, 'string']
5130 ]
Dominique Pellé52123872024-07-07 20:37:12 +02005131 if has('channel')
5132 nullValues->add([null_channel, 1, 'channel fail', 9, 'channel'])
5133 endif
5134 if has('job')
5135 nullValues->add([null_job, 1, 'no process', 8, 'job'])
5136 endif
Yegappan Lakshmananda9d3452024-05-02 13:02:36 +02005137
5138 for [Val, emptyExp, stringExp, typeExp, typenameExp] in nullValues
5139 assert_equal(emptyExp, empty(Val))
5140 assert_equal(stringExp, string(Val))
5141 assert_equal(typeExp, type(Val))
5142 assert_equal(typenameExp, typename(Val))
5143 assert_equal(Val, copy(Val))
5144 assert_equal(-1, test_refcount(Val))
5145 endfor
5146 END
5147 v9.CheckSourceDefAndScriptSuccess(lines)
5148enddef
5149
Yegappan Lakshmanan1b531722024-05-09 09:12:31 +02005150" Test for using an unknown type in a typecast
5151def Test_unknown_type_in_typecast()
5152 var lines =<< trim END
5153 vim9script
5154 var a = <MyType>b
5155 END
5156 v9.CheckSourceFailure(lines, 'E1010: Type not recognized: MyType', 2)
5157
5158 lines =<< trim END
5159 vim9script
5160 var Fn = <funcx(number, number): number>b
5161 END
5162 v9.CheckSourceFailure(lines, 'E1010: Type not recognized: funcx(number, number): number', 2)
Yegappan Lakshmananfe424d12024-05-17 18:20:43 +02005163
5164 # Wrong type in a type cast
5165 lines =<< trim END
5166 vim9script
5167 var i: number = <number>true
5168 END
5169 v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected number but got bool', 2)
Yegappan Lakshmanan1b531722024-05-09 09:12:31 +02005170enddef
5171
Yegappan Lakshmanane2038412024-12-14 19:59:24 +01005172" Test for calling a function as a method with a list argument
5173" This exercises some conditions in the assignment statement parsing code.
5174def Test_method_call_with_list_arg()
5175 var lines =<< trim END
5176 vim9script
5177
5178 def Foo(l: list<number>)
5179 g:save_list = l
5180 enddef
5181
5182 def Bar()
5183 var a = 10
5184 var b = 20
5185 [a, b]->Foo()
5186 enddef
5187
5188 g:save_list = []
5189 Bar()
5190 assert_equal([10, 20], g:save_list)
5191 END
5192 v9.CheckSourceSuccess(lines)
5193enddef
5194
Bram Moolenaar585fea72020-04-02 22:33:21 +02005195" Keep this last, it messes up highlighting.
5196def Test_substitute_cmd()
5197 new
5198 setline(1, 'something')
5199 :substitute(some(other(
5200 assert_equal('otherthing', getline(1))
5201 bwipe!
5202
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02005203 # also when the context is Vim9 script
Bram Moolenaarcfcd0112020-09-27 15:19:27 +02005204 var lines =<< trim END
Bram Moolenaar585fea72020-04-02 22:33:21 +02005205 vim9script
5206 new
5207 setline(1, 'something')
5208 :substitute(some(other(
5209 assert_equal('otherthing', getline(1))
5210 bwipe!
5211 END
Bram Moolenaardd674772022-09-15 22:26:18 +01005212 writefile(lines, 'Xvim9lines', 'D')
Bram Moolenaar585fea72020-04-02 22:33:21 +02005213 source Xvim9lines
Bram Moolenaar585fea72020-04-02 22:33:21 +02005214enddef
5215
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01005216" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker