blob: 22166fcb90cdd3db704f1ef8f558d001816828d7 [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 Moolenaarad39c092020-02-26 18:23:43 +01004source view_util.vim
Bram Moolenaarcfe435d2020-04-25 20:02:55 +02005source vim9.vim
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01006
7def Test_syntax()
8 let var = 234
9 let other: list<string> = ['asdf']
10enddef
11
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010012let s:appendToMe = 'xxx'
13let s:addToMe = 111
Bram Moolenaar401d9ff2020-02-19 18:14:44 +010014let g:existing = 'yes'
Bram Moolenaara8c17702020-04-01 21:17:24 +020015let g:inc_counter = 1
16let $SOME_ENV_VAR = 'some'
Bram Moolenaara6e67e42020-05-15 23:36:40 +020017let g:alist = [7]
18let g:astring = 'text'
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010019
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010020def Test_assignment()
21 let bool1: bool = true
22 assert_equal(v:true, bool1)
23 let bool2: bool = false
24 assert_equal(v:false, bool2)
25
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +020026 call CheckDefFailure(['let x:string'], 'E1069:')
27 call CheckDefFailure(['let x:string = "x"'], 'E1069:')
Bram Moolenaar1cc2a942020-05-10 19:10:31 +020028 call CheckDefFailure(['let a:string = "x"'], 'E1069:')
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +020029
Bram Moolenaar9be61bb2020-03-30 22:51:24 +020030 let a: number = 6
31 assert_equal(6, a)
32
Bram Moolenaar42a480b2020-02-29 23:23:47 +010033 if has('channel')
34 let chan1: channel
Bram Moolenaarfbdd08e2020-03-01 14:04:46 +010035 let job1: job
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +010036 let job2: job = job_start('willfail')
Bram Moolenaar42a480b2020-02-29 23:23:47 +010037 endif
Bram Moolenaarfbdd08e2020-03-01 14:04:46 +010038 if has('float')
39 let float1: float = 3.4
40 endif
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +020041 let Funky1: func
42 let Funky2: func = function('len')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +020043 let Party2: func = funcref('g:Test_syntax')
Bram Moolenaar42a480b2020-02-29 23:23:47 +010044
Bram Moolenaar401d9ff2020-02-19 18:14:44 +010045 g:newvar = 'new'
46 assert_equal('new', g:newvar)
47
48 assert_equal('yes', g:existing)
49 g:existing = 'no'
50 assert_equal('no', g:existing)
51
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010052 v:char = 'abc'
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010053 assert_equal('abc', v:char)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010054
55 $ENVVAR = 'foobar'
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010056 assert_equal('foobar', $ENVVAR)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010057 $ENVVAR = ''
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010058
Bram Moolenaarfd1823e2020-02-19 20:23:11 +010059 s:appendToMe ..= 'yyy'
60 assert_equal('xxxyyy', s:appendToMe)
61 s:addToMe += 222
62 assert_equal(333, s:addToMe)
Bram Moolenaar0bbf7222020-02-19 22:31:48 +010063 s:newVar = 'new'
64 assert_equal('new', s:newVar)
Bram Moolenaara8c17702020-04-01 21:17:24 +020065
66 set ts=7
67 &ts += 1
68 assert_equal(8, &ts)
Bram Moolenaar80c34ca2020-04-01 23:05:18 +020069 &ts -= 3
70 assert_equal(5, &ts)
71 &ts *= 2
72 assert_equal(10, &ts)
73 &ts /= 3
74 assert_equal(3, &ts)
75 set ts=10
76 &ts %= 4
77 assert_equal(2, &ts)
Bram Moolenaara8c17702020-04-01 21:17:24 +020078 call CheckDefFailure(['&notex += 3'], 'E113:')
79 call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
Bram Moolenaara6e67e42020-05-15 23:36:40 +020080 call CheckDefFailure(['&ts = [7]'], 'E1013:')
81 call CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list')
82 call CheckDefFailure(['&ts = "xx"'], 'E1013:')
83 call CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string')
Bram Moolenaara8c17702020-04-01 21:17:24 +020084 call CheckDefFailure(['&path += 3'], 'E1013:')
Bram Moolenaara6e67e42020-05-15 23:36:40 +020085 call CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
Bram Moolenaarcb711ab2020-04-16 13:00:29 +020086 # test freeing ISN_STOREOPT
Bram Moolenaar585fea72020-04-02 22:33:21 +020087 call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
Bram Moolenaar80c34ca2020-04-01 23:05:18 +020088 &ts = 8
Bram Moolenaara8c17702020-04-01 21:17:24 +020089
90 g:inc_counter += 1
91 assert_equal(2, g:inc_counter)
92
93 $SOME_ENV_VAR ..= 'more'
94 assert_equal('somemore', $SOME_ENV_VAR)
95 call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:')
96 call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:')
97
98 @a = 'areg'
99 @a ..= 'add'
100 assert_equal('aregadd', @a)
101 call CheckDefFailure(['@a += "more"'], 'E1013:')
102 call CheckDefFailure(['@a += 123'], 'E1013:')
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200103
104 v:errmsg = 'none'
105 v:errmsg ..= 'again'
106 assert_equal('noneagain', v:errmsg)
107 call CheckDefFailure(['v:errmsg += "more"'], 'E1013:')
108 call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200109enddef
110
Bram Moolenaar84370082020-05-18 14:20:36 +0200111def Test_assignment_list()
112 let list1: list<bool> = [false, true, false]
113 let list2: list<number> = [1, 2, 3]
114 let list3: list<string> = ['sdf', 'asdf']
115 let list4: list<any> = ['yes', true, 1234]
116 let list5: list<blob> = [0z01, 0z02]
117
118 let listS: list<string> = []
119 let listN: list<number> = []
120
121 assert_equal([1, 2, 3], list2)
122 list2[-1] = 99
123 assert_equal([1, 2, 99], list2)
124 list2[-2] = 88
125 assert_equal([1, 88, 99], list2)
126 list2[-3] = 77
127 assert_equal([77, 88, 99], list2)
128 call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
129
130 # type becomes list<any>
131 let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
132enddef
133
134def Test_assignment_dict()
135 let dict1: dict<bool> = #{one: false, two: true}
136 let dict2: dict<number> = #{one: 1, two: 2}
137 let dict3: dict<string> = #{key: 'value'}
138 let dict4: dict<any> = #{one: 1, two: '2'}
139 let dict5: dict<blob> = #{one: 0z01, tw: 0z02}
140
141 call CheckDefExecFailure(['let dd = {}', 'dd[""] = 6'], 'E713:')
142
143 # type becomes dict<any>
144 let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
145enddef
146
Bram Moolenaard3aac292020-04-19 14:32:17 +0200147def Test_assignment_local()
148 " Test in a separated file in order not to the current buffer/window/tab is
149 " changed.
150 let script_lines: list<string> =<< trim END
151 let b:existing = 'yes'
152 let w:existing = 'yes'
153 let t:existing = 'yes'
154
155 def Test_assignment_local_internal()
156 b:newvar = 'new'
157 assert_equal('new', b:newvar)
158 assert_equal('yes', b:existing)
159 b:existing = 'no'
160 assert_equal('no', b:existing)
Bram Moolenaar396f3132020-05-09 18:44:56 +0200161 b:existing ..= 'NO'
162 assert_equal('noNO', b:existing)
Bram Moolenaard3aac292020-04-19 14:32:17 +0200163
164 w:newvar = 'new'
165 assert_equal('new', w:newvar)
166 assert_equal('yes', w:existing)
167 w:existing = 'no'
168 assert_equal('no', w:existing)
Bram Moolenaar396f3132020-05-09 18:44:56 +0200169 w:existing ..= 'NO'
170 assert_equal('noNO', w:existing)
Bram Moolenaard3aac292020-04-19 14:32:17 +0200171
172 t:newvar = 'new'
173 assert_equal('new', t:newvar)
174 assert_equal('yes', t:existing)
175 t:existing = 'no'
176 assert_equal('no', t:existing)
Bram Moolenaar396f3132020-05-09 18:44:56 +0200177 t:existing ..= 'NO'
178 assert_equal('noNO', t:existing)
Bram Moolenaard3aac292020-04-19 14:32:17 +0200179 enddef
180 call Test_assignment_local_internal()
181 END
182 call CheckScriptSuccess(script_lines)
183enddef
184
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200185def Test_assignment_default()
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200186
Bram Moolenaarcb711ab2020-04-16 13:00:29 +0200187 # Test default values.
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200188 let thebool: bool
189 assert_equal(v:false, thebool)
190
191 let thenumber: number
192 assert_equal(0, thenumber)
193
194 if has('float')
195 let thefloat: float
196 assert_equal(0.0, thefloat)
197 endif
198
199 let thestring: string
200 assert_equal('', thestring)
201
202 let theblob: blob
203 assert_equal(0z, theblob)
204
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200205 let Thefunc: func
206 assert_equal(test_null_function(), Thefunc)
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200207
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200208 let thelist: list<any>
209 assert_equal([], thelist)
210
211 let thedict: dict<any>
212 assert_equal({}, thedict)
213
Bram Moolenaar2c869de2020-04-02 19:12:08 +0200214 if has('channel')
215 let thejob: job
216 assert_equal(test_null_job(), thejob)
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200217
Bram Moolenaar2c869de2020-04-02 19:12:08 +0200218 let thechannel: channel
219 assert_equal(test_null_channel(), thechannel)
220 endif
Bram Moolenaar585fea72020-04-02 22:33:21 +0200221
222 let nr = 1234 | nr = 5678
223 assert_equal(5678, nr)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100224enddef
225
Bram Moolenaarcab27672020-04-09 20:10:55 +0200226def Mess(): string
227 v:foldstart = 123
228 return 'xxx'
229enddef
230
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200231def Test_assignment_failure()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100232 call CheckDefFailure(['let var=234'], 'E1004:')
233 call CheckDefFailure(['let var =234'], 'E1004:')
234 call CheckDefFailure(['let var= 234'], 'E1004:')
235
236 call CheckDefFailure(['let true = 1'], 'E1034:')
237 call CheckDefFailure(['let false = 1'], 'E1034:')
238
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200239 call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:')
240
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200241 call CheckDefFailure(['let somevar'], "E1022:")
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200242 call CheckDefFailure(['let &option'], 'E1052:')
243 call CheckDefFailure(['&g:option = 5'], 'E113:')
244
245 call CheckDefFailure(['let $VAR = 5'], 'E1065:')
246
247 call CheckDefFailure(['let @~ = 5'], 'E354:')
248 call CheckDefFailure(['let @a = 5'], 'E1066:')
249
250 call CheckDefFailure(['let g:var = 5'], 'E1016:')
Bram Moolenaard3aac292020-04-19 14:32:17 +0200251 call CheckDefFailure(['let w:var = 5'], 'E1079:')
252 call CheckDefFailure(['let b:var = 5'], 'E1078:')
253 call CheckDefFailure(['let t:var = 5'], 'E1080:')
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200254
255 call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
256 call CheckDefFailure(['let xnr += 4'], 'E1020:')
257
Bram Moolenaar33fa29c2020-03-28 19:41:33 +0100258 call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:')
259
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100260 call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
261 call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
262
263 call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
264 call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
265
266 call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
267 call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100268
Bram Moolenaard77a8522020-04-03 21:59:57 +0200269 call CheckDefFailure(['let var: dict <number>'], 'E1068:')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100270 call CheckDefFailure(['let var: dict<number'], 'E1009:')
Bram Moolenaarcab27672020-04-09 20:10:55 +0200271
272 call assert_fails('s/^/\=Mess()/n', 'E794:')
273 call CheckDefFailure(['let var: dict<number'], 'E1009:')
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200274enddef
275
276def Test_unlet()
277 g:somevar = 'yes'
278 assert_true(exists('g:somevar'))
279 unlet g:somevar
280 assert_false(exists('g:somevar'))
281 unlet! g:somevar
282
283 call CheckScriptFailure([
284 'vim9script',
285 'let svar = 123',
286 'unlet svar',
287 ], 'E1081:')
288 call CheckScriptFailure([
289 'vim9script',
290 'let svar = 123',
291 'unlet s:svar',
292 ], 'E1081:')
293 call CheckScriptFailure([
294 'vim9script',
295 'let svar = 123',
296 'def Func()',
297 ' unlet svar',
298 'enddef',
299 ], 'E1081:')
300 call CheckScriptFailure([
301 'vim9script',
302 'let svar = 123',
303 'def Func()',
304 ' unlet s:svar',
305 'enddef',
306 ], 'E1081:')
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200307
308 $ENVVAR = 'foobar'
309 assert_equal('foobar', $ENVVAR)
310 unlet $ENVVAR
311 assert_equal('', $ENVVAR)
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200312enddef
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100313
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200314def Test_delfunction()
315 " Check function is defined in script namespace
316 CheckScriptSuccess([
317 'vim9script',
318 'func CheckMe()',
319 ' return 123',
320 'endfunc',
321 'assert_equal(123, s:CheckMe())',
322 ])
323
324 " Check function in script namespace cannot be deleted
325 CheckScriptFailure([
326 'vim9script',
327 'func DeleteMe1()',
328 'endfunc',
329 'delfunction DeleteMe1',
330 ], 'E1084:')
331 CheckScriptFailure([
332 'vim9script',
333 'func DeleteMe2()',
334 'endfunc',
335 'def DoThat()',
336 ' delfunction DeleteMe2',
337 'enddef',
338 'DoThat()',
339 ], 'E1084:')
340 CheckScriptFailure([
341 'vim9script',
342 'def DeleteMe3()',
343 'enddef',
344 'delfunction DeleteMe3',
345 ], 'E1084:')
346 CheckScriptFailure([
347 'vim9script',
348 'def DeleteMe4()',
349 'enddef',
350 'def DoThat()',
351 ' delfunction DeleteMe4',
352 'enddef',
353 'DoThat()',
354 ], 'E1084:')
355enddef
356
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100357func Test_wrong_type()
358 call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
359 call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
360 call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
361 call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
362
363 call CheckDefFailure(['let var: dict<number'], 'E1009:')
364 call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100365
366 call CheckDefFailure(['let var: ally'], 'E1010:')
367 call CheckDefFailure(['let var: bram'], 'E1010:')
368 call CheckDefFailure(['let var: cathy'], 'E1010:')
369 call CheckDefFailure(['let var: dom'], 'E1010:')
370 call CheckDefFailure(['let var: freddy'], 'E1010:')
371 call CheckDefFailure(['let var: john'], 'E1010:')
372 call CheckDefFailure(['let var: larry'], 'E1010:')
373 call CheckDefFailure(['let var: ned'], 'E1010:')
374 call CheckDefFailure(['let var: pam'], 'E1010:')
375 call CheckDefFailure(['let var: sam'], 'E1010:')
376 call CheckDefFailure(['let var: vim'], 'E1010:')
Bram Moolenaara0a9f432020-04-28 21:29:34 +0200377
378 call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
379 call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100380endfunc
381
382func Test_const()
383 call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
384 call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
385 call CheckDefFailure(['const two'], 'E1021:')
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200386 call CheckDefFailure(['const &option'], 'E996:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100387endfunc
388
389def Test_block()
390 let outer = 1
391 {
392 let inner = 2
393 assert_equal(1, outer)
394 assert_equal(2, inner)
395 }
396 assert_equal(1, outer)
397enddef
398
399func Test_block_failure()
400 call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200401 call CheckDefFailure(['}'], 'E1025:')
402 call CheckDefFailure(['{', 'echo 1'], 'E1026:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100403endfunc
404
Bram Moolenaar585fea72020-04-02 22:33:21 +0200405def Test_cmd_modifier()
406 tab echo '0'
407 call CheckDefFailure(['5tab echo 3'], 'E16:')
408enddef
409
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100410def Test_try_catch()
411 let l = []
Bram Moolenaar7a092242020-04-16 22:10:49 +0200412 try # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100413 add(l, '1')
414 throw 'wrong'
415 add(l, '2')
Bram Moolenaar7a092242020-04-16 22:10:49 +0200416 catch # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100417 add(l, v:exception)
Bram Moolenaar7a092242020-04-16 22:10:49 +0200418 finally # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100419 add(l, '3')
Bram Moolenaar7a092242020-04-16 22:10:49 +0200420 endtry # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100421 assert_equal(['1', 'wrong', '3'], l)
422enddef
423
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100424def ThrowFromDef()
Bram Moolenaara72cfb82020-04-23 17:07:30 +0200425 throw "getout" # comment
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100426enddef
427
428func CatchInFunc()
429 try
430 call ThrowFromDef()
431 catch
432 let g:thrown_func = v:exception
433 endtry
434endfunc
435
436def CatchInDef()
437 try
438 ThrowFromDef()
439 catch
440 g:thrown_def = v:exception
441 endtry
442enddef
443
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100444def ReturnFinally(): string
445 try
446 return 'intry'
447 finally
448 g:in_finally = 'finally'
449 endtry
450 return 'end'
451enddef
452
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100453def Test_try_catch_nested()
454 CatchInFunc()
455 assert_equal('getout', g:thrown_func)
456
457 CatchInDef()
458 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100459
460 assert_equal('intry', ReturnFinally())
461 assert_equal('finally', g:in_finally)
462enddef
463
464def Test_try_catch_match()
465 let seq = 'a'
466 try
467 throw 'something'
468 catch /nothing/
469 seq ..= 'x'
470 catch /some/
471 seq ..= 'b'
472 catch /asdf/
473 seq ..= 'x'
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200474 catch ?a\?sdf?
475 seq ..= 'y'
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100476 finally
477 seq ..= 'c'
478 endtry
479 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100480enddef
481
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200482def Test_try_catch_fails()
483 call CheckDefFailure(['catch'], 'E603:')
484 call CheckDefFailure(['try', 'echo 0', 'catch','catch'], 'E1033:')
485 call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200486 call CheckDefFailure(['finally'], 'E606:')
487 call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
488 call CheckDefFailure(['endtry'], 'E602:')
489 call CheckDefFailure(['while 1', 'endtry'], 'E170:')
490 call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
491 call CheckDefFailure(['if 2', 'endtry'], 'E171:')
492 call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
493
Bram Moolenaara72cfb82020-04-23 17:07:30 +0200494 call CheckDefFailure(['throw'], 'E1015:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200495 call CheckDefFailure(['throw xxx'], 'E1001:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200496enddef
497
Bram Moolenaar2a1381c2020-05-05 23:32:58 +0200498if has('channel')
499 let someJob = test_null_job()
Bram Moolenaar40ee4662020-05-05 22:08:26 +0200500
Bram Moolenaar2a1381c2020-05-05 23:32:58 +0200501 def FuncWithError()
502 echomsg g:someJob
503 enddef
Bram Moolenaar40ee4662020-05-05 22:08:26 +0200504
Bram Moolenaar2a1381c2020-05-05 23:32:58 +0200505 func Test_convert_emsg_to_exception()
506 try
507 call FuncWithError()
508 catch
509 call assert_match('Vim:E908:', v:exception)
510 endtry
511 endfunc
512endif
Bram Moolenaar40ee4662020-05-05 22:08:26 +0200513
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100514let s:export_script_lines =<< trim END
515 vim9script
516 let name: string = 'bob'
517 def Concat(arg: string): string
518 return name .. arg
519 enddef
Bram Moolenaar227a69d2020-05-15 18:17:28 +0200520 g:result = Concat('bie')
521 g:localname = name
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100522
523 export const CONST = 1234
524 export let exported = 9876
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100525 export let exp_name = 'John'
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100526 export def Exported(): string
527 return 'Exported'
528 enddef
529END
530
Bram Moolenaar5269bd22020-03-09 19:25:27 +0100531def Test_vim9_import_export()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100532 let import_script_lines =<< trim END
533 vim9script
534 import {exported, Exported} from './Xexport.vim'
535 g:imported = exported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100536 exported += 3
537 g:imported_added = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100538 g:imported_func = Exported()
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100539
540 import {exp_name} from './Xexport.vim'
541 g:imported_name = exp_name
542 exp_name ..= ' Doe'
543 g:imported_name_appended = exp_name
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100544 g:imported_later = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100545 END
546
547 writefile(import_script_lines, 'Ximport.vim')
548 writefile(s:export_script_lines, 'Xexport.vim')
549
550 source Ximport.vim
551
552 assert_equal('bobbie', g:result)
553 assert_equal('bob', g:localname)
554 assert_equal(9876, g:imported)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100555 assert_equal(9879, g:imported_added)
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100556 assert_equal(9879, g:imported_later)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100557 assert_equal('Exported', g:imported_func)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100558 assert_equal('John', g:imported_name)
559 assert_equal('John Doe', g:imported_name_appended)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100560 assert_false(exists('g:name'))
561
562 unlet g:result
563 unlet g:localname
564 unlet g:imported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100565 unlet g:imported_added
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100566 unlet g:imported_later
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100567 unlet g:imported_func
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100568 unlet g:imported_name g:imported_name_appended
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100569 delete('Ximport.vim')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100570
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100571 let import_in_def_lines =<< trim END
572 vim9script
573 def ImportInDef()
574 import exported from './Xexport.vim'
575 g:imported = exported
576 exported += 7
577 g:imported_added = exported
578 enddef
579 ImportInDef()
580 END
581 writefile(import_in_def_lines, 'Ximport2.vim')
582 source Ximport2.vim
583 " TODO: this should be 9879
584 assert_equal(9876, g:imported)
585 assert_equal(9883, g:imported_added)
586 unlet g:imported
587 unlet g:imported_added
588 delete('Ximport2.vim')
589
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100590 let import_star_as_lines =<< trim END
591 vim9script
592 import * as Export from './Xexport.vim'
593 def UseExport()
594 g:imported = Export.exported
595 enddef
596 UseExport()
597 END
598 writefile(import_star_as_lines, 'Ximport.vim')
599 source Ximport.vim
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100600 assert_equal(9883, g:imported)
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100601
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100602 let import_star_as_lines_no_dot =<< trim END
603 vim9script
604 import * as Export from './Xexport.vim'
605 def Func()
606 let dummy = 1
607 let imported = Export + dummy
608 enddef
609 END
610 writefile(import_star_as_lines_no_dot, 'Ximport.vim')
611 assert_fails('source Ximport.vim', 'E1060:')
612
613 let import_star_as_lines_dot_space =<< trim END
614 vim9script
615 import * as Export from './Xexport.vim'
616 def Func()
617 let imported = Export . exported
618 enddef
619 END
620 writefile(import_star_as_lines_dot_space, 'Ximport.vim')
621 assert_fails('source Ximport.vim', 'E1074:')
622
623 let import_star_as_lines_missing_name =<< trim END
624 vim9script
625 import * as Export from './Xexport.vim'
626 def Func()
627 let imported = Export.
628 enddef
629 END
630 writefile(import_star_as_lines_missing_name, 'Ximport.vim')
631 assert_fails('source Ximport.vim', 'E1048:')
632
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100633 let import_star_lines =<< trim END
634 vim9script
635 import * from './Xexport.vim'
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100636 END
637 writefile(import_star_lines, 'Ximport.vim')
638 assert_fails('source Ximport.vim', 'E1045:')
639
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +0100640 " try to import something that exists but is not exported
641 let import_not_exported_lines =<< trim END
642 vim9script
643 import name from './Xexport.vim'
644 END
645 writefile(import_not_exported_lines, 'Ximport.vim')
646 assert_fails('source Ximport.vim', 'E1049:')
647
Bram Moolenaar5269bd22020-03-09 19:25:27 +0100648 " try to import something that is already defined
649 let import_already_defined =<< trim END
650 vim9script
651 let exported = 'something'
652 import exported from './Xexport.vim'
653 END
654 writefile(import_already_defined, 'Ximport.vim')
655 assert_fails('source Ximport.vim', 'E1073:')
656
657 " try to import something that is already defined
658 import_already_defined =<< trim END
659 vim9script
660 let exported = 'something'
661 import * as exported from './Xexport.vim'
662 END
663 writefile(import_already_defined, 'Ximport.vim')
664 assert_fails('source Ximport.vim', 'E1073:')
665
666 " try to import something that is already defined
667 import_already_defined =<< trim END
668 vim9script
669 let exported = 'something'
670 import {exported} from './Xexport.vim'
671 END
672 writefile(import_already_defined, 'Ximport.vim')
673 assert_fails('source Ximport.vim', 'E1073:')
674
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +0100675 " import a very long name, requires making a copy
676 let import_long_name_lines =<< trim END
677 vim9script
678 import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
679 END
680 writefile(import_long_name_lines, 'Ximport.vim')
681 assert_fails('source Ximport.vim', 'E1048:')
682
683 let import_no_from_lines =<< trim END
684 vim9script
685 import name './Xexport.vim'
686 END
687 writefile(import_no_from_lines, 'Ximport.vim')
688 assert_fails('source Ximport.vim', 'E1070:')
689
690 let import_invalid_string_lines =<< trim END
691 vim9script
692 import name from Xexport.vim
693 END
694 writefile(import_invalid_string_lines, 'Ximport.vim')
695 assert_fails('source Ximport.vim', 'E1071:')
696
697 let import_wrong_name_lines =<< trim END
698 vim9script
699 import name from './XnoExport.vim'
700 END
701 writefile(import_wrong_name_lines, 'Ximport.vim')
702 assert_fails('source Ximport.vim', 'E1053:')
703
704 let import_missing_comma_lines =<< trim END
705 vim9script
706 import {exported name} from './Xexport.vim'
707 END
Bram Moolenaar5269bd22020-03-09 19:25:27 +0100708 writefile(import_missing_comma_lines, 'Ximport3.vim')
709 assert_fails('source Ximport3.vim', 'E1046:')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +0100710
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100711 delete('Ximport.vim')
Bram Moolenaar5269bd22020-03-09 19:25:27 +0100712 delete('Ximport3.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100713 delete('Xexport.vim')
714
Bram Moolenaar750802b2020-02-23 18:08:33 +0100715 " Check that in a Vim9 script 'cpo' is set to the Vim default.
716 set cpo&vi
717 let cpo_before = &cpo
718 let lines =<< trim END
719 vim9script
720 g:cpo_in_vim9script = &cpo
721 END
722 writefile(lines, 'Xvim9_script')
723 source Xvim9_script
724 assert_equal(cpo_before, &cpo)
725 set cpo&vim
726 assert_equal(&cpo, g:cpo_in_vim9script)
727 delete('Xvim9_script')
728enddef
729
730def Test_vim9script_fails()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100731 CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
732 CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +0100733 CheckScriptFailure(['export let some = 123'], 'E1042:')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100734 CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
Bram Moolenaar750802b2020-02-23 18:08:33 +0100735 CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
736 CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
737
738 assert_fails('vim9script', 'E1038')
Bram Moolenaara26b9702020-04-18 19:53:28 +0200739 assert_fails('export something', 'E1043')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100740enddef
741
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200742def Test_vim9script_reload_import()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100743 let lines =<< trim END
744 vim9script
745 const var = ''
746 let valone = 1234
747 def MyFunc(arg: string)
748 valone = 5678
749 enddef
750 END
751 let morelines =<< trim END
752 let valtwo = 222
753 export def GetValtwo(): number
754 return valtwo
755 enddef
756 END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +0200757 writefile(lines + morelines, 'Xreload.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100758 source Xreload.vim
759 source Xreload.vim
760 source Xreload.vim
761
762 let testlines =<< trim END
763 vim9script
764 def TheFunc()
765 import GetValtwo from './Xreload.vim'
766 assert_equal(222, GetValtwo())
767 enddef
768 TheFunc()
769 END
770 writefile(testlines, 'Ximport.vim')
771 source Ximport.vim
772
Bram Moolenaar03afdcf2020-04-27 23:39:30 +0200773 " Test that when not using "morelines" GetValtwo() and valtwo are still
774 " defined, because import doesn't reload a script.
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100775 writefile(lines, 'Xreload.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100776 source Ximport.vim
777
778 " cannot declare a var twice
779 lines =<< trim END
780 vim9script
781 let valone = 1234
782 let valone = 5678
783 END
784 writefile(lines, 'Xreload.vim')
785 assert_fails('source Xreload.vim', 'E1041:')
786
787 delete('Xreload.vim')
788 delete('Ximport.vim')
789enddef
790
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200791def Test_vim9script_reload_delfunc()
792 let first_lines =<< trim END
793 vim9script
794 def FuncYes(): string
795 return 'yes'
796 enddef
797 END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +0200798 let withno_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200799 def FuncNo(): string
800 return 'no'
801 enddef
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200802 def g:DoCheck(no_exists: bool)
803 assert_equal('yes', FuncYes())
Bram Moolenaar03afdcf2020-04-27 23:39:30 +0200804 assert_equal('no', FuncNo())
805 enddef
806 END
807 let nono_lines =<< trim END
808 def g:DoCheck(no_exists: bool)
809 assert_equal('yes', FuncYes())
810 assert_fails('call FuncNo()', 'E117:')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200811 enddef
812 END
813
814 # FuncNo() is defined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +0200815 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200816 source Xreloaded.vim
817 g:DoCheck(true)
818
819 # FuncNo() is not redefined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +0200820 writefile(first_lines + nono_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200821 source Xreloaded.vim
Bram Moolenaar03afdcf2020-04-27 23:39:30 +0200822 g:DoCheck()
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200823
824 # FuncNo() is back
Bram Moolenaar03afdcf2020-04-27 23:39:30 +0200825 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200826 source Xreloaded.vim
Bram Moolenaar03afdcf2020-04-27 23:39:30 +0200827 g:DoCheck()
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200828
829 delete('Xreloaded.vim')
830enddef
831
Bram Moolenaar89483d42020-05-10 15:24:44 +0200832def Test_vim9script_reload_delvar()
833 # write the script with a script-local variable
834 let lines =<< trim END
835 vim9script
836 let var = 'string'
837 END
838 writefile(lines, 'XreloadVar.vim')
839 source XreloadVar.vim
840
841 # now write the script using the same variable locally - works
842 lines =<< trim END
843 vim9script
844 def Func()
845 let var = 'string'
846 enddef
847 END
848 writefile(lines, 'XreloadVar.vim')
849 source XreloadVar.vim
850
851 delete('XreloadVar.vim')
852enddef
853
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100854def Test_import_absolute()
855 let import_lines = [
Bram Moolenaare6085c52020-04-12 20:19:16 +0200856 'vim9script',
857 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
858 'def UseExported()',
859 ' g:imported_abs = exported',
860 ' exported = 8888',
861 ' g:imported_after = exported',
862 'enddef',
863 'UseExported()',
864 'g:import_disassembled = execute("disass UseExported")',
865 ]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100866 writefile(import_lines, 'Ximport_abs.vim')
867 writefile(s:export_script_lines, 'Xexport_abs.vim')
868
869 source Ximport_abs.vim
870
871 assert_equal(9876, g:imported_abs)
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100872 assert_equal(8888, g:imported_after)
Bram Moolenaar675f7162020-04-12 22:53:54 +0200873 assert_match('<SNR>\d\+_UseExported.*' ..
874 'g:imported_abs = exported.*' ..
875 '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
876 '1 STOREG g:imported_abs.*' ..
877 'exported = 8888.*' ..
878 '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
879 'g:imported_after = exported.*' ..
880 '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
881 '5 STOREG g:imported_after.*',
Bram Moolenaare6085c52020-04-12 20:19:16 +0200882 g:import_disassembled)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100883 unlet g:imported_abs
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100884 unlet g:import_disassembled
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100885
886 delete('Ximport_abs.vim')
887 delete('Xexport_abs.vim')
888enddef
889
890def Test_import_rtp()
891 let import_lines = [
Bram Moolenaare6085c52020-04-12 20:19:16 +0200892 'vim9script',
893 'import exported from "Xexport_rtp.vim"',
894 'g:imported_rtp = exported',
895 ]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100896 writefile(import_lines, 'Ximport_rtp.vim')
897 mkdir('import')
898 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
899
900 let save_rtp = &rtp
901 &rtp = getcwd()
902 source Ximport_rtp.vim
903 &rtp = save_rtp
904
905 assert_equal(9876, g:imported_rtp)
906 unlet g:imported_rtp
907
908 delete('Ximport_rtp.vim')
Bram Moolenaar89483d42020-05-10 15:24:44 +0200909 delete('import', 'rf')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100910enddef
911
912def Test_fixed_size_list()
913 " will be allocated as one piece of memory, check that changes work
914 let l = [1, 2, 3, 4]
915 l->remove(0)
916 l->add(5)
917 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100918 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100919enddef
920
Bram Moolenaar158906c2020-02-06 20:39:45 +0100921def IfElse(what: number): string
922 let res = ''
923 if what == 1
924 res = "one"
925 elseif what == 2
926 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100927 else
Bram Moolenaar158906c2020-02-06 20:39:45 +0100928 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100929 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +0100930 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100931enddef
932
Bram Moolenaar158906c2020-02-06 20:39:45 +0100933def Test_if_elseif_else()
934 assert_equal('one', IfElse(1))
935 assert_equal('two', IfElse(2))
936 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100937enddef
938
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200939def Test_if_elseif_else_fails()
940 call CheckDefFailure(['elseif true'], 'E582:')
941 call CheckDefFailure(['else'], 'E581:')
942 call CheckDefFailure(['endif'], 'E580:')
943 call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200944 call CheckDefFailure(['if true', 'echo 1'], 'E171:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200945enddef
946
Bram Moolenaar6d69bf62020-03-03 19:02:12 +0100947let g:bool_true = v:true
948let g:bool_false = v:false
949
950def Test_if_const_expr()
951 let res = false
952 if true ? true : false
953 res = true
954 endif
955 assert_equal(true, res)
956
Bram Moolenaar585fea72020-04-02 22:33:21 +0200957 g:glob = 2
958 if false
959 execute('let g:glob = 3')
960 endif
961 assert_equal(2, g:glob)
962 if true
963 execute('let g:glob = 3')
964 endif
965 assert_equal(3, g:glob)
966
Bram Moolenaar6d69bf62020-03-03 19:02:12 +0100967 res = false
968 if g:bool_true ? true : false
969 res = true
970 endif
971 assert_equal(true, res)
972
973 res = false
974 if true ? g:bool_true : false
975 res = true
976 endif
977 assert_equal(true, res)
978
979 res = false
980 if true ? true : g:bool_false
981 res = true
982 endif
983 assert_equal(true, res)
984
985 res = false
986 if true ? false : true
987 res = true
988 endif
989 assert_equal(false, res)
990
991 res = false
992 if false ? false : true
993 res = true
994 endif
995 assert_equal(true, res)
996
997 res = false
998 if false ? true : false
999 res = true
1000 endif
1001 assert_equal(false, res)
1002
1003 res = false
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001004 if has('xyz') ? true : false
1005 res = true
1006 endif
1007 assert_equal(false, res)
1008
1009 res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001010 if true && true
1011 res = true
1012 endif
1013 assert_equal(true, res)
1014
1015 res = false
1016 if true && false
1017 res = true
1018 endif
1019 assert_equal(false, res)
1020
1021 res = false
1022 if g:bool_true && false
1023 res = true
1024 endif
1025 assert_equal(false, res)
1026
1027 res = false
1028 if true && g:bool_false
1029 res = true
1030 endif
1031 assert_equal(false, res)
1032
1033 res = false
1034 if false && false
1035 res = true
1036 endif
1037 assert_equal(false, res)
1038
1039 res = false
1040 if true || false
1041 res = true
1042 endif
1043 assert_equal(true, res)
1044
1045 res = false
1046 if g:bool_true || false
1047 res = true
1048 endif
1049 assert_equal(true, res)
1050
1051 res = false
1052 if true || g:bool_false
1053 res = true
1054 endif
1055 assert_equal(true, res)
1056
1057 res = false
1058 if false || false
1059 res = true
1060 endif
1061 assert_equal(false, res)
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02001062enddef
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001063
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02001064def Test_if_const_expr_fails()
1065 call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1066 call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001067 call CheckDefFailure(["if has('aaa'"], 'E110:')
1068 call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001069enddef
1070
Bram Moolenaarad39c092020-02-26 18:23:43 +01001071def Test_execute_cmd()
1072 new
1073 setline(1, 'default')
1074 execute 'call setline(1, "execute-string")'
1075 assert_equal('execute-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001076
1077 execute "call setline(1, 'execute-string')"
1078 assert_equal('execute-string', getline(1))
1079
Bram Moolenaarad39c092020-02-26 18:23:43 +01001080 let cmd1 = 'call setline(1,'
1081 let cmd2 = '"execute-var")'
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001082 execute cmd1 cmd2 # comment
Bram Moolenaarad39c092020-02-26 18:23:43 +01001083 assert_equal('execute-var', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001084
Bram Moolenaarad39c092020-02-26 18:23:43 +01001085 execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1086 assert_equal('execute-var-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001087
Bram Moolenaarad39c092020-02-26 18:23:43 +01001088 let cmd_first = 'call '
1089 let cmd_last = 'setline(1, "execute-var-var")'
1090 execute cmd_first .. cmd_last
1091 assert_equal('execute-var-var', getline(1))
1092 bwipe!
Bram Moolenaar585fea72020-04-02 22:33:21 +02001093
1094 call CheckDefFailure(['execute xxx'], 'E1001:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001095 call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
Bram Moolenaarad39c092020-02-26 18:23:43 +01001096enddef
1097
1098def Test_echo_cmd()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001099 echo 'some' # comment
Bram Moolenaar585fea72020-04-02 22:33:21 +02001100 echon 'thing'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001101 assert_match('^something$', Screenline(&lines))
1102
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001103 echo "some" # comment
1104 echon "thing"
1105 assert_match('^something$', Screenline(&lines))
1106
Bram Moolenaarad39c092020-02-26 18:23:43 +01001107 let str1 = 'some'
1108 let str2 = 'more'
1109 echo str1 str2
1110 assert_match('^some more$', Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001111
1112 call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
Bram Moolenaarad39c092020-02-26 18:23:43 +01001113enddef
1114
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001115def Test_echomsg_cmd()
1116 echomsg 'some' 'more' # comment
1117 assert_match('^some more$', Screenline(&lines))
1118 echo 'clear'
1119 1messages
1120 assert_match('^some more$', Screenline(&lines))
1121
1122 call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1123enddef
1124
1125def Test_echoerr_cmd()
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001126 try
1127 echoerr 'something' 'wrong' # comment
1128 catch
1129 assert_match('something wrong', v:exception)
1130 endtry
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001131enddef
1132
Bram Moolenaar41fe0612020-03-01 16:22:40 +01001133def Test_for_outside_of_function()
1134 let lines =<< trim END
1135 vim9script
1136 new
1137 for var in range(0, 3)
1138 append(line('$'), var)
1139 endfor
1140 assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
1141 bwipe!
1142 END
1143 writefile(lines, 'Xvim9for.vim')
1144 source Xvim9for.vim
1145 delete('Xvim9for.vim')
1146enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001147
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001148def Test_for_loop()
1149 let result = ''
1150 for cnt in range(7)
1151 if cnt == 4
1152 break
1153 endif
1154 if cnt == 2
1155 continue
1156 endif
1157 result ..= cnt .. '_'
1158 endfor
1159 assert_equal('0_1_3_', result)
1160enddef
1161
1162def Test_for_loop_fails()
Bram Moolenaar675f7162020-04-12 22:53:54 +02001163 CheckDefFailure(['for # in range(5)'], 'E690:')
1164 CheckDefFailure(['for i In range(5)'], 'E690:')
1165 CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
Bram Moolenaar6e949782020-04-13 17:21:00 +02001166 CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef'], 'E1006:')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001167 CheckDefFailure(['for i in "text"'], 'E1024:')
1168 CheckDefFailure(['for i in xxx'], 'E1001:')
1169 CheckDefFailure(['endfor'], 'E588:')
1170 CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001171enddef
1172
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01001173def Test_while_loop()
1174 let result = ''
1175 let cnt = 0
1176 while cnt < 555
1177 if cnt == 3
1178 break
1179 endif
1180 cnt += 1
1181 if cnt == 2
1182 continue
1183 endif
1184 result ..= cnt .. '_'
1185 endwhile
1186 assert_equal('1_3_', result)
1187enddef
1188
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001189def Test_while_loop_fails()
Bram Moolenaar675f7162020-04-12 22:53:54 +02001190 CheckDefFailure(['while xxx'], 'E1001:')
1191 CheckDefFailure(['endwhile'], 'E588:')
1192 CheckDefFailure(['continue'], 'E586:')
1193 CheckDefFailure(['if true', 'continue'], 'E586:')
1194 CheckDefFailure(['break'], 'E587:')
1195 CheckDefFailure(['if true', 'break'], 'E587:')
1196 CheckDefFailure(['while 1', 'echo 3'], 'E170:')
Bram Moolenaarbd5da372020-03-31 23:13:10 +02001197enddef
1198
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001199def Test_interrupt_loop()
Bram Moolenaar97acfc72020-03-22 13:44:28 +01001200 let caught = false
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001201 let x = 0
Bram Moolenaar97acfc72020-03-22 13:44:28 +01001202 try
1203 while 1
1204 x += 1
1205 if x == 100
1206 feedkeys("\<C-C>", 'Lt')
1207 endif
1208 endwhile
1209 catch
1210 caught = true
1211 assert_equal(100, x)
1212 endtry
1213 assert_true(caught, 'should have caught an exception')
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001214enddef
Bram Moolenaar20431c92020-03-20 18:39:46 +01001215
Bram Moolenaar4fdae992020-04-12 16:38:57 +02001216def Test_automatic_line_continuation()
1217 let mylist = [
1218 'one',
1219 'two',
1220 'three',
1221 ] " comment
1222 assert_equal(['one', 'two', 'three'], mylist)
1223
1224 let mydict = {
1225 'one': 1,
1226 'two': 2,
1227 'three':
1228 3,
1229 } " comment
1230 assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
1231 mydict = #{
Bram Moolenaar2c330432020-04-13 14:41:35 +02001232 one: 1, # comment
1233 two: # comment
1234 2, # comment
1235 three: 3 # comment
1236 }
1237 assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1238 mydict = #{
1239 one: 1,
1240 two:
1241 2,
1242 three: 3
Bram Moolenaar4fdae992020-04-12 16:38:57 +02001243 }
1244 assert_equal(#{one: 1, two: 2, three: 3}, mydict)
Bram Moolenaare6085c52020-04-12 20:19:16 +02001245
1246 assert_equal(
1247 ['one', 'two', 'three'],
1248 split('one two three')
1249 )
Bram Moolenaar4fdae992020-04-12 16:38:57 +02001250enddef
1251
Bram Moolenaar7a092242020-04-16 22:10:49 +02001252def Test_vim9_comment()
1253 CheckScriptSuccess([
1254 'vim9script',
1255 '# something',
1256 ])
1257 CheckScriptFailure([
1258 'vim9script',
1259 ':# something',
1260 ], 'E488:')
1261 CheckScriptFailure([
1262 '# something',
1263 ], 'E488:')
1264 CheckScriptFailure([
1265 ':# something',
1266 ], 'E488:')
1267
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02001268 { # block start
1269 } # block end
1270 CheckDefFailure([
1271 '{# comment',
1272 ], 'E488:')
1273 CheckDefFailure([
1274 '{',
1275 '}# comment',
1276 ], 'E488:')
1277
1278 echo "yes" # comment
1279 CheckDefFailure([
1280 'echo "yes"# comment',
1281 ], 'E488:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02001282 CheckScriptSuccess([
1283 'vim9script',
1284 'echo "yes" # something',
1285 ])
1286 CheckScriptFailure([
1287 'vim9script',
1288 'echo "yes"# something',
1289 ], 'E121:')
1290 CheckScriptFailure([
1291 'vim9script',
1292 'echo# something',
1293 ], 'E121:')
1294 CheckScriptFailure([
1295 'echo "yes" # something',
1296 ], 'E121:')
1297
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02001298 exe "echo" # comment
1299 CheckDefFailure([
1300 'exe "echo"# comment',
1301 ], 'E488:')
1302 CheckScriptSuccess([
1303 'vim9script',
1304 'exe "echo" # something',
1305 ])
1306 CheckScriptFailure([
1307 'vim9script',
1308 'exe "echo"# something',
1309 ], 'E121:')
1310 CheckDefFailure([
1311 'exe # comment',
1312 ], 'E1015:')
1313 CheckScriptFailure([
1314 'vim9script',
1315 'exe# something',
1316 ], 'E121:')
1317 CheckScriptFailure([
1318 'exe "echo" # something',
1319 ], 'E121:')
1320
Bram Moolenaar7a092242020-04-16 22:10:49 +02001321 CheckDefFailure([
1322 'try# comment',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001323 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02001324 'catch',
1325 'endtry',
1326 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001327 CheckScriptFailure([
1328 'vim9script',
1329 'try# comment',
1330 'echo "yes"',
1331 ], 'E488:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02001332 CheckDefFailure([
1333 'try',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001334 ' throw#comment',
1335 'catch',
1336 'endtry',
1337 ], 'E1015:')
1338 CheckDefFailure([
1339 'try',
1340 ' throw "yes"#comment',
1341 'catch',
1342 'endtry',
1343 ], 'E488:')
1344 CheckDefFailure([
1345 'try',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001346 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02001347 'catch# comment',
1348 'endtry',
1349 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001350 CheckScriptFailure([
1351 'vim9script',
1352 'try',
1353 ' echo "yes"',
1354 'catch# comment',
1355 'endtry',
1356 ], 'E654:')
1357 CheckDefFailure([
1358 'try',
1359 ' echo "yes"',
1360 'catch /pat/# comment',
1361 'endtry',
1362 ], 'E488:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02001363 CheckDefFailure([
1364 'try',
1365 'echo "yes"',
1366 'catch',
1367 'endtry# comment',
1368 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001369 CheckScriptFailure([
1370 'vim9script',
1371 'try',
1372 ' echo "yes"',
1373 'catch',
1374 'endtry# comment',
1375 ], 'E600:')
1376
1377 CheckScriptSuccess([
1378 'vim9script',
1379 'hi # comment',
1380 ])
1381 CheckScriptFailure([
1382 'vim9script',
1383 'hi# comment',
1384 ], 'E416:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02001385 CheckScriptSuccess([
1386 'vim9script',
1387 'hi Search # comment',
1388 ])
1389 CheckScriptFailure([
1390 'vim9script',
1391 'hi Search# comment',
1392 ], 'E416:')
1393 CheckScriptSuccess([
1394 'vim9script',
1395 'hi link This Search # comment',
1396 ])
1397 CheckScriptFailure([
1398 'vim9script',
1399 'hi link This That# comment',
1400 ], 'E413:')
1401 CheckScriptSuccess([
1402 'vim9script',
1403 'hi clear This # comment',
1404 'hi clear # comment',
1405 ])
1406 " not tested, because it doesn't give an error but a warning:
1407 " hi clear This# comment',
1408 CheckScriptFailure([
1409 'vim9script',
1410 'hi clear# comment',
1411 ], 'E416:')
1412
1413 CheckScriptSuccess([
1414 'vim9script',
1415 'hi Group term=bold',
1416 'match Group /todo/ # comment',
1417 ])
1418 CheckScriptFailure([
1419 'vim9script',
1420 'hi Group term=bold',
1421 'match Group /todo/# comment',
1422 ], 'E488:')
1423 CheckScriptSuccess([
1424 'vim9script',
1425 'match # comment',
1426 ])
1427 CheckScriptFailure([
1428 'vim9script',
1429 'match# comment',
1430 ], 'E475:')
1431 CheckScriptSuccess([
1432 'vim9script',
1433 'match none # comment',
1434 ])
1435 CheckScriptFailure([
1436 'vim9script',
1437 'match none# comment',
1438 ], 'E475:')
1439
1440 CheckScriptSuccess([
1441 'vim9script',
1442 'menutrans clear # comment',
1443 ])
1444 CheckScriptFailure([
1445 'vim9script',
1446 'menutrans clear# comment text',
1447 ], 'E474:')
1448
1449 CheckScriptSuccess([
1450 'vim9script',
1451 'syntax clear # comment',
1452 ])
1453 CheckScriptFailure([
1454 'vim9script',
1455 'syntax clear# comment text',
1456 ], 'E28:')
1457 CheckScriptSuccess([
1458 'vim9script',
1459 'syntax keyword Word some',
1460 'syntax clear Word # comment',
1461 ])
1462 CheckScriptFailure([
1463 'vim9script',
1464 'syntax keyword Word some',
1465 'syntax clear Word# comment text',
1466 ], 'E28:')
1467
1468 CheckScriptSuccess([
1469 'vim9script',
1470 'syntax list # comment',
1471 ])
1472 CheckScriptFailure([
1473 'vim9script',
1474 'syntax list# comment text',
1475 ], 'E28:')
1476
1477 CheckScriptSuccess([
1478 'vim9script',
1479 'syntax match Word /pat/ oneline # comment',
1480 ])
1481 CheckScriptFailure([
1482 'vim9script',
1483 'syntax match Word /pat/ oneline# comment',
1484 ], 'E475:')
1485
1486 CheckScriptSuccess([
1487 'vim9script',
1488 'syntax keyword Word word # comm[ent',
1489 ])
1490 CheckScriptFailure([
1491 'vim9script',
1492 'syntax keyword Word word# comm[ent',
1493 ], 'E789:')
1494
1495 CheckScriptSuccess([
1496 'vim9script',
1497 'syntax match Word /pat/ # comment',
1498 ])
1499 CheckScriptFailure([
1500 'vim9script',
1501 'syntax match Word /pat/# comment',
1502 ], 'E402:')
1503
1504 CheckScriptSuccess([
1505 'vim9script',
1506 'syntax match Word /pat/ contains=Something # comment',
1507 ])
1508 CheckScriptFailure([
1509 'vim9script',
1510 'syntax match Word /pat/ contains=Something# comment',
1511 ], 'E475:')
1512 CheckScriptFailure([
1513 'vim9script',
1514 'syntax match Word /pat/ contains= # comment',
1515 ], 'E406:')
1516 CheckScriptFailure([
1517 'vim9script',
1518 'syntax match Word /pat/ contains=# comment',
1519 ], 'E475:')
1520
1521 CheckScriptSuccess([
1522 'vim9script',
1523 'syntax region Word start=/pat/ end=/pat/ # comment',
1524 ])
1525 CheckScriptFailure([
1526 'vim9script',
1527 'syntax region Word start=/pat/ end=/pat/# comment',
1528 ], 'E475:')
1529
1530 CheckScriptSuccess([
1531 'vim9script',
1532 'syntax sync # comment',
1533 ])
1534 CheckScriptFailure([
1535 'vim9script',
1536 'syntax sync# comment',
1537 ], 'E404:')
1538 CheckScriptSuccess([
1539 'vim9script',
1540 'syntax sync ccomment # comment',
1541 ])
1542 CheckScriptFailure([
1543 'vim9script',
1544 'syntax sync ccomment# comment',
1545 ], 'E404:')
1546
1547 CheckScriptSuccess([
1548 'vim9script',
1549 'syntax cluster Some contains=Word # comment',
1550 ])
1551 CheckScriptFailure([
1552 'vim9script',
1553 'syntax cluster Some contains=Word# comment',
1554 ], 'E475:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001555
1556 CheckScriptSuccess([
1557 'vim9script',
1558 'command Echo echo # comment',
1559 'command Echo # comment',
1560 ])
1561 CheckScriptFailure([
1562 'vim9script',
1563 'command Echo echo# comment',
1564 'Echo',
1565 ], 'E121:')
1566 CheckScriptFailure([
1567 'vim9script',
1568 'command Echo# comment',
1569 ], 'E182:')
1570 CheckScriptFailure([
1571 'vim9script',
1572 'command Echo echo',
1573 'command Echo# comment',
1574 ], 'E182:')
1575
1576 CheckScriptSuccess([
1577 'vim9script',
1578 'function # comment',
1579 ])
1580 CheckScriptFailure([
1581 'vim9script',
1582 'function# comment',
1583 ], 'E129:')
1584 CheckScriptSuccess([
1585 'vim9script',
1586 'function CheckScriptSuccess # comment',
1587 ])
1588 CheckScriptFailure([
1589 'vim9script',
1590 'function CheckScriptSuccess# comment',
1591 ], 'E488:')
1592
1593 CheckScriptSuccess([
1594 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001595 'func g:DeleteMeA()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001596 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001597 'delfunction g:DeleteMeA # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001598 ])
1599 CheckScriptFailure([
1600 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001601 'func g:DeleteMeB()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001602 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001603 'delfunction g:DeleteMeB# comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001604 ], 'E488:')
1605
1606 CheckScriptSuccess([
1607 'vim9script',
1608 'call execute("ls") # comment',
1609 ])
1610 CheckScriptFailure([
1611 'vim9script',
1612 'call execute("ls")# comment',
1613 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001614enddef
1615
1616def Test_vim9_comment_gui()
1617 CheckCanRunGui
1618
1619 CheckScriptFailure([
1620 'vim9script',
1621 'gui#comment'
1622 ], 'E499:')
1623 CheckScriptFailure([
1624 'vim9script',
1625 'gui -f#comment'
1626 ], 'E499:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02001627enddef
1628
Bram Moolenaara26b9702020-04-18 19:53:28 +02001629def Test_vim9_comment_not_compiled()
1630 au TabEnter *.vim let g:entered = 1
1631 au TabEnter *.x let g:entered = 2
1632
1633 edit test.vim
1634 doautocmd TabEnter #comment
1635 assert_equal(1, g:entered)
1636
1637 doautocmd TabEnter f.x
1638 assert_equal(2, g:entered)
1639
1640 g:entered = 0
1641 doautocmd TabEnter f.x #comment
1642 assert_equal(2, g:entered)
1643
1644 assert_fails('doautocmd Syntax#comment', 'E216:')
1645
1646 au! TabEnter
1647 unlet g:entered
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02001648
1649 CheckScriptSuccess([
1650 'vim9script',
1651 'let g:var = 123',
1652 'let w:var = 777',
1653 'unlet g:var w:var # something',
1654 ])
1655
1656 CheckScriptFailure([
1657 'vim9script',
1658 'let g:var = 123',
Bram Moolenaar32e35112020-05-14 22:41:15 +02001659 'unlet g:var# comment1',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02001660 ], 'E108:')
1661
1662 CheckScriptFailure([
1663 'let g:var = 123',
1664 'unlet g:var # something',
1665 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02001666
1667 CheckScriptSuccess([
1668 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02001669 'if 1 # comment2',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02001670 ' echo "yes"',
1671 'elseif 2 #comment',
1672 ' echo "no"',
1673 'endif',
1674 ])
1675
1676 CheckScriptFailure([
1677 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02001678 'if 1# comment3',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02001679 ' echo "yes"',
1680 'endif',
1681 ], 'E15:')
1682
1683 CheckScriptFailure([
1684 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02001685 'if 0 # comment4',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02001686 ' echo "yes"',
1687 'elseif 2#comment',
1688 ' echo "no"',
1689 'endif',
1690 ], 'E15:')
1691
1692 CheckScriptSuccess([
1693 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02001694 'let v = 1 # comment5',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02001695 ])
1696
1697 CheckScriptFailure([
1698 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02001699 'let v = 1# comment6',
1700 ], 'E15:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02001701
1702 CheckScriptFailure([
1703 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02001704 'let v:version',
1705 ], 'E1091:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02001706
1707 CheckScriptSuccess([
1708 'vim9script',
1709 'new'
1710 'call setline(1, ["# define pat", "last"])',
1711 '$',
1712 'dsearch /pat/ #comment',
1713 'bwipe!',
1714 ])
1715
1716 CheckScriptFailure([
1717 'vim9script',
1718 'new'
1719 'call setline(1, ["# define pat", "last"])',
1720 '$',
1721 'dsearch /pat/#comment',
1722 'bwipe!',
1723 ], 'E488:')
Bram Moolenaara26b9702020-04-18 19:53:28 +02001724enddef
1725
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02001726def Test_finish()
1727 let lines =<< trim END
1728 vim9script
1729 let g:res = 'one'
1730 if v:false | finish | endif
1731 let g:res = 'two'
1732 finish
1733 let g:res = 'three'
1734 END
1735 writefile(lines, 'Xfinished')
1736 source Xfinished
1737 assert_equal('two', g:res)
1738
1739 unlet g:res
1740 delete('Xfinished')
1741enddef
1742
Bram Moolenaar32e35112020-05-14 22:41:15 +02001743def Test_let_func_call()
1744 let lines =<< trim END
1745 vim9script
1746 func GetValue()
1747 if exists('g:count')
1748 let g:count += 1
1749 else
1750 let g:count = 1
1751 endif
1752 return 'this'
1753 endfunc
1754 let val: string = GetValue()
Bram Moolenaardf671b42020-05-16 22:33:33 +02001755 " env var is always a string
1756 let env = $TERM
Bram Moolenaar32e35112020-05-14 22:41:15 +02001757 END
1758 writefile(lines, 'Xfinished')
1759 source Xfinished
Bram Moolenaara5d00772020-05-14 23:20:55 +02001760 " GetValue() is not called during discovery phase
Bram Moolenaar32e35112020-05-14 22:41:15 +02001761 assert_equal(1, g:count)
1762
1763 unlet g:count
1764 delete('Xfinished')
1765enddef
1766
1767def Test_let_missing_type()
1768 let lines =<< trim END
1769 vim9script
1770 func GetValue()
1771 return 'this'
1772 endfunc
Bram Moolenaardf671b42020-05-16 22:33:33 +02001773 let val = GetValue()
Bram Moolenaar32e35112020-05-14 22:41:15 +02001774 END
Bram Moolenaar227a69d2020-05-15 18:17:28 +02001775 CheckScriptFailure(lines, 'E1091:')
Bram Moolenaar32e35112020-05-14 22:41:15 +02001776
Bram Moolenaar227a69d2020-05-15 18:17:28 +02001777 lines =<< trim END
1778 vim9script
Bram Moolenaardf671b42020-05-16 22:33:33 +02001779 func GetValue()
1780 return 'this'
1781 endfunc
1782 let val = [GetValue()]
1783 END
1784 CheckScriptFailure(lines, 'E1091:')
1785
1786 lines =<< trim END
1787 vim9script
1788 func GetValue()
1789 return 'this'
1790 endfunc
1791 let val = {GetValue(): 123}
1792 END
1793 CheckScriptFailure(lines, 'E1091:')
1794
1795 lines =<< trim END
1796 vim9script
1797 func GetValue()
1798 return 'this'
1799 endfunc
1800 let val = {'a': GetValue()}
1801 END
1802 CheckScriptFailure(lines, 'E1091:')
1803
1804 lines =<< trim END
1805 vim9script
1806 let var = g:unknown
Bram Moolenaar227a69d2020-05-15 18:17:28 +02001807 END
1808 CheckScriptFailure(lines, 'E1091:')
1809
1810 " TODO: eventually this would work
1811 lines =<< trim END
1812 vim9script
1813 let var = has('eval')
1814 END
1815 CheckScriptFailure(lines, 'E1091:')
1816
1817 " TODO: eventually this would work
1818 lines =<< trim END
1819 vim9script
1820 let var = len('string')
1821 END
1822 CheckScriptFailure(lines, 'E1091:')
1823
1824 lines =<< trim END
1825 vim9script
1826 let nr: number = 123
1827 let var = nr
1828 END
1829 CheckScriptFailure(lines, 'E1091:')
Bram Moolenaar32e35112020-05-14 22:41:15 +02001830enddef
1831
Bram Moolenaara5d00772020-05-14 23:20:55 +02001832def Test_forward_declaration()
1833 let lines =<< trim END
1834 vim9script
1835 g:initVal = GetValue()
1836 def GetValue(): string
1837 return theVal
1838 enddef
1839 let theVal = 'something'
1840 theVal = 'else'
1841 g:laterVal = GetValue()
1842 END
1843 writefile(lines, 'Xforward')
1844 source Xforward
1845 assert_equal('something', g:initVal)
1846 assert_equal('else', g:laterVal)
1847
1848 unlet g:initVal
1849 unlet g:laterVal
1850 delete('Xforward')
1851enddef
1852
1853
Bram Moolenaar585fea72020-04-02 22:33:21 +02001854" Keep this last, it messes up highlighting.
1855def Test_substitute_cmd()
1856 new
1857 setline(1, 'something')
1858 :substitute(some(other(
1859 assert_equal('otherthing', getline(1))
1860 bwipe!
1861
1862 " also when the context is Vim9 script
1863 let lines =<< trim END
1864 vim9script
1865 new
1866 setline(1, 'something')
1867 :substitute(some(other(
1868 assert_equal('otherthing', getline(1))
1869 bwipe!
1870 END
1871 writefile(lines, 'Xvim9lines')
1872 source Xvim9lines
1873
1874 delete('Xvim9lines')
1875enddef
1876
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001877" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker