blob: a030686dc679d18a6122ad6ec5f3582104b06606 [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'}
Bram Moolenaar74fae512020-05-21 21:50:58 +0200139 let dict5: dict<blob> = #{one: 0z01, two: 0z02}
Bram Moolenaar84370082020-05-18 14:20:36 +0200140
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 Moolenaar47a519a2020-06-14 23:05:10 +0200226def Test_assignment_var_list()
227 let v1: string
228 let v2: string
229 [v1, v2] = ['one', 'two']
230 assert_equal('one', v1)
231 assert_equal('two', v2)
232enddef
233
Bram Moolenaarcab27672020-04-09 20:10:55 +0200234def Mess(): string
235 v:foldstart = 123
236 return 'xxx'
237enddef
238
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200239def Test_assignment_failure()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100240 call CheckDefFailure(['let var=234'], 'E1004:')
241 call CheckDefFailure(['let var =234'], 'E1004:')
242 call CheckDefFailure(['let var= 234'], 'E1004:')
243
244 call CheckDefFailure(['let true = 1'], 'E1034:')
245 call CheckDefFailure(['let false = 1'], 'E1034:')
246
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200247 call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:')
248
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200249 call CheckDefFailure(['let somevar'], "E1022:")
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200250 call CheckDefFailure(['let &option'], 'E1052:')
251 call CheckDefFailure(['&g:option = 5'], 'E113:')
252
253 call CheckDefFailure(['let $VAR = 5'], 'E1065:')
254
255 call CheckDefFailure(['let @~ = 5'], 'E354:')
256 call CheckDefFailure(['let @a = 5'], 'E1066:')
257
258 call CheckDefFailure(['let g:var = 5'], 'E1016:')
Bram Moolenaard3aac292020-04-19 14:32:17 +0200259 call CheckDefFailure(['let w:var = 5'], 'E1079:')
260 call CheckDefFailure(['let b:var = 5'], 'E1078:')
261 call CheckDefFailure(['let t:var = 5'], 'E1080:')
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200262
263 call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
264 call CheckDefFailure(['let xnr += 4'], 'E1020:')
265
Bram Moolenaar822ba242020-05-24 23:00:18 +0200266 call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:')
Bram Moolenaar33fa29c2020-03-28 19:41:33 +0100267
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100268 call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
269 call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
270
271 call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
272 call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
273
274 call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
275 call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100276
Bram Moolenaard77a8522020-04-03 21:59:57 +0200277 call CheckDefFailure(['let var: dict <number>'], 'E1068:')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100278 call CheckDefFailure(['let var: dict<number'], 'E1009:')
Bram Moolenaarcab27672020-04-09 20:10:55 +0200279
280 call assert_fails('s/^/\=Mess()/n', 'E794:')
281 call CheckDefFailure(['let var: dict<number'], 'E1009:')
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200282enddef
283
284def Test_unlet()
285 g:somevar = 'yes'
286 assert_true(exists('g:somevar'))
287 unlet g:somevar
288 assert_false(exists('g:somevar'))
289 unlet! g:somevar
290
291 call CheckScriptFailure([
292 'vim9script',
293 'let svar = 123',
294 'unlet svar',
295 ], 'E1081:')
296 call CheckScriptFailure([
297 'vim9script',
298 'let svar = 123',
299 'unlet s:svar',
300 ], 'E1081:')
301 call CheckScriptFailure([
302 'vim9script',
303 'let svar = 123',
304 'def Func()',
305 ' unlet svar',
306 'enddef',
Bram Moolenaar822ba242020-05-24 23:00:18 +0200307 'defcompile',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200308 ], 'E1081:')
309 call CheckScriptFailure([
310 'vim9script',
311 'let svar = 123',
312 'def Func()',
313 ' unlet s:svar',
314 'enddef',
Bram Moolenaar822ba242020-05-24 23:00:18 +0200315 'defcompile',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200316 ], 'E1081:')
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200317
318 $ENVVAR = 'foobar'
319 assert_equal('foobar', $ENVVAR)
320 unlet $ENVVAR
321 assert_equal('', $ENVVAR)
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200322enddef
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100323
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200324def Test_delfunction()
325 " Check function is defined in script namespace
326 CheckScriptSuccess([
327 'vim9script',
328 'func CheckMe()',
329 ' return 123',
330 'endfunc',
331 'assert_equal(123, s:CheckMe())',
332 ])
333
334 " Check function in script namespace cannot be deleted
335 CheckScriptFailure([
336 'vim9script',
337 'func DeleteMe1()',
338 'endfunc',
339 'delfunction DeleteMe1',
340 ], 'E1084:')
341 CheckScriptFailure([
342 'vim9script',
343 'func DeleteMe2()',
344 'endfunc',
345 'def DoThat()',
346 ' delfunction DeleteMe2',
347 'enddef',
348 'DoThat()',
349 ], 'E1084:')
350 CheckScriptFailure([
351 'vim9script',
352 'def DeleteMe3()',
353 'enddef',
354 'delfunction DeleteMe3',
355 ], 'E1084:')
356 CheckScriptFailure([
357 'vim9script',
358 'def DeleteMe4()',
359 'enddef',
360 'def DoThat()',
361 ' delfunction DeleteMe4',
362 'enddef',
363 'DoThat()',
364 ], 'E1084:')
365enddef
366
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100367func Test_wrong_type()
368 call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
369 call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
370 call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
371 call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
372
373 call CheckDefFailure(['let var: dict<number'], 'E1009:')
374 call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100375
376 call CheckDefFailure(['let var: ally'], 'E1010:')
377 call CheckDefFailure(['let var: bram'], 'E1010:')
378 call CheckDefFailure(['let var: cathy'], 'E1010:')
379 call CheckDefFailure(['let var: dom'], 'E1010:')
380 call CheckDefFailure(['let var: freddy'], 'E1010:')
381 call CheckDefFailure(['let var: john'], 'E1010:')
382 call CheckDefFailure(['let var: larry'], 'E1010:')
383 call CheckDefFailure(['let var: ned'], 'E1010:')
384 call CheckDefFailure(['let var: pam'], 'E1010:')
385 call CheckDefFailure(['let var: sam'], 'E1010:')
386 call CheckDefFailure(['let var: vim'], 'E1010:')
Bram Moolenaara0a9f432020-04-28 21:29:34 +0200387
388 call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
389 call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100390endfunc
391
392func Test_const()
393 call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
394 call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
395 call CheckDefFailure(['const two'], 'E1021:')
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200396 call CheckDefFailure(['const &option'], 'E996:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100397endfunc
398
399def Test_block()
400 let outer = 1
401 {
402 let inner = 2
403 assert_equal(1, outer)
404 assert_equal(2, inner)
405 }
406 assert_equal(1, outer)
407enddef
408
409func Test_block_failure()
410 call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200411 call CheckDefFailure(['}'], 'E1025:')
412 call CheckDefFailure(['{', 'echo 1'], 'E1026:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100413endfunc
414
Bram Moolenaar585fea72020-04-02 22:33:21 +0200415def Test_cmd_modifier()
416 tab echo '0'
417 call CheckDefFailure(['5tab echo 3'], 'E16:')
418enddef
419
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100420def Test_try_catch()
421 let l = []
Bram Moolenaar7a092242020-04-16 22:10:49 +0200422 try # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100423 add(l, '1')
424 throw 'wrong'
425 add(l, '2')
Bram Moolenaar7a092242020-04-16 22:10:49 +0200426 catch # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100427 add(l, v:exception)
Bram Moolenaar7a092242020-04-16 22:10:49 +0200428 finally # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100429 add(l, '3')
Bram Moolenaar7a092242020-04-16 22:10:49 +0200430 endtry # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100431 assert_equal(['1', 'wrong', '3'], l)
432enddef
433
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100434def ThrowFromDef()
Bram Moolenaara72cfb82020-04-23 17:07:30 +0200435 throw "getout" # comment
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100436enddef
437
438func CatchInFunc()
439 try
440 call ThrowFromDef()
441 catch
442 let g:thrown_func = v:exception
443 endtry
444endfunc
445
446def CatchInDef()
447 try
448 ThrowFromDef()
449 catch
450 g:thrown_def = v:exception
451 endtry
452enddef
453
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100454def ReturnFinally(): string
455 try
456 return 'intry'
457 finally
458 g:in_finally = 'finally'
459 endtry
460 return 'end'
461enddef
462
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100463def Test_try_catch_nested()
464 CatchInFunc()
465 assert_equal('getout', g:thrown_func)
466
467 CatchInDef()
468 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100469
470 assert_equal('intry', ReturnFinally())
471 assert_equal('finally', g:in_finally)
472enddef
473
474def Test_try_catch_match()
475 let seq = 'a'
476 try
477 throw 'something'
478 catch /nothing/
479 seq ..= 'x'
480 catch /some/
481 seq ..= 'b'
482 catch /asdf/
483 seq ..= 'x'
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200484 catch ?a\?sdf?
485 seq ..= 'y'
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100486 finally
487 seq ..= 'c'
488 endtry
489 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100490enddef
491
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200492def Test_try_catch_fails()
493 call CheckDefFailure(['catch'], 'E603:')
494 call CheckDefFailure(['try', 'echo 0', 'catch','catch'], 'E1033:')
495 call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200496 call CheckDefFailure(['finally'], 'E606:')
497 call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
498 call CheckDefFailure(['endtry'], 'E602:')
499 call CheckDefFailure(['while 1', 'endtry'], 'E170:')
500 call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
501 call CheckDefFailure(['if 2', 'endtry'], 'E171:')
502 call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
503
Bram Moolenaara72cfb82020-04-23 17:07:30 +0200504 call CheckDefFailure(['throw'], 'E1015:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200505 call CheckDefFailure(['throw xxx'], 'E1001:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200506enddef
507
Bram Moolenaar2a1381c2020-05-05 23:32:58 +0200508if has('channel')
509 let someJob = test_null_job()
Bram Moolenaar40ee4662020-05-05 22:08:26 +0200510
Bram Moolenaar2a1381c2020-05-05 23:32:58 +0200511 def FuncWithError()
512 echomsg g:someJob
513 enddef
Bram Moolenaar40ee4662020-05-05 22:08:26 +0200514
Bram Moolenaar2a1381c2020-05-05 23:32:58 +0200515 func Test_convert_emsg_to_exception()
516 try
517 call FuncWithError()
518 catch
519 call assert_match('Vim:E908:', v:exception)
520 endtry
521 endfunc
522endif
Bram Moolenaar40ee4662020-05-05 22:08:26 +0200523
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100524let s:export_script_lines =<< trim END
525 vim9script
526 let name: string = 'bob'
527 def Concat(arg: string): string
528 return name .. arg
529 enddef
Bram Moolenaar227a69d2020-05-15 18:17:28 +0200530 g:result = Concat('bie')
531 g:localname = name
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100532
533 export const CONST = 1234
534 export let exported = 9876
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100535 export let exp_name = 'John'
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100536 export def Exported(): string
537 return 'Exported'
538 enddef
539END
540
Bram Moolenaar5269bd22020-03-09 19:25:27 +0100541def Test_vim9_import_export()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100542 let import_script_lines =<< trim END
543 vim9script
544 import {exported, Exported} from './Xexport.vim'
545 g:imported = exported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100546 exported += 3
547 g:imported_added = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100548 g:imported_func = Exported()
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100549
550 import {exp_name} from './Xexport.vim'
551 g:imported_name = exp_name
552 exp_name ..= ' Doe'
553 g:imported_name_appended = exp_name
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100554 g:imported_later = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100555 END
556
557 writefile(import_script_lines, 'Ximport.vim')
558 writefile(s:export_script_lines, 'Xexport.vim')
559
560 source Ximport.vim
561
562 assert_equal('bobbie', g:result)
563 assert_equal('bob', g:localname)
564 assert_equal(9876, g:imported)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100565 assert_equal(9879, g:imported_added)
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100566 assert_equal(9879, g:imported_later)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100567 assert_equal('Exported', g:imported_func)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100568 assert_equal('John', g:imported_name)
569 assert_equal('John Doe', g:imported_name_appended)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100570 assert_false(exists('g:name'))
571
572 unlet g:result
573 unlet g:localname
574 unlet g:imported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100575 unlet g:imported_added
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100576 unlet g:imported_later
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100577 unlet g:imported_func
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100578 unlet g:imported_name g:imported_name_appended
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100579 delete('Ximport.vim')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100580
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100581 let import_in_def_lines =<< trim END
582 vim9script
583 def ImportInDef()
584 import exported from './Xexport.vim'
585 g:imported = exported
586 exported += 7
587 g:imported_added = exported
588 enddef
589 ImportInDef()
590 END
591 writefile(import_in_def_lines, 'Ximport2.vim')
592 source Ximport2.vim
593 " TODO: this should be 9879
594 assert_equal(9876, g:imported)
595 assert_equal(9883, g:imported_added)
596 unlet g:imported
597 unlet g:imported_added
598 delete('Ximport2.vim')
599
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100600 let import_star_as_lines =<< trim END
601 vim9script
602 import * as Export from './Xexport.vim'
603 def UseExport()
604 g:imported = Export.exported
605 enddef
606 UseExport()
607 END
608 writefile(import_star_as_lines, 'Ximport.vim')
609 source Ximport.vim
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100610 assert_equal(9883, g:imported)
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100611
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100612 let import_star_as_lines_no_dot =<< trim END
613 vim9script
614 import * as Export from './Xexport.vim'
615 def Func()
616 let dummy = 1
617 let imported = Export + dummy
618 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200619 defcompile
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100620 END
621 writefile(import_star_as_lines_no_dot, 'Ximport.vim')
622 assert_fails('source Ximport.vim', 'E1060:')
623
624 let import_star_as_lines_dot_space =<< trim END
625 vim9script
626 import * as Export from './Xexport.vim'
627 def Func()
628 let imported = Export . exported
629 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200630 defcompile
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100631 END
632 writefile(import_star_as_lines_dot_space, 'Ximport.vim')
633 assert_fails('source Ximport.vim', 'E1074:')
634
635 let import_star_as_lines_missing_name =<< trim END
636 vim9script
637 import * as Export from './Xexport.vim'
638 def Func()
639 let imported = Export.
640 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200641 defcompile
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100642 END
643 writefile(import_star_as_lines_missing_name, 'Ximport.vim')
644 assert_fails('source Ximport.vim', 'E1048:')
645
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100646 let import_star_lines =<< trim END
647 vim9script
648 import * from './Xexport.vim'
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100649 END
650 writefile(import_star_lines, 'Ximport.vim')
651 assert_fails('source Ximport.vim', 'E1045:')
652
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +0100653 " try to import something that exists but is not exported
654 let import_not_exported_lines =<< trim END
655 vim9script
656 import name from './Xexport.vim'
657 END
658 writefile(import_not_exported_lines, 'Ximport.vim')
659 assert_fails('source Ximport.vim', 'E1049:')
660
Bram Moolenaar5269bd22020-03-09 19:25:27 +0100661 " try to import something that is already defined
662 let import_already_defined =<< trim END
663 vim9script
664 let exported = 'something'
665 import exported from './Xexport.vim'
666 END
667 writefile(import_already_defined, 'Ximport.vim')
668 assert_fails('source Ximport.vim', 'E1073:')
669
670 " try to import something that is already defined
671 import_already_defined =<< trim END
672 vim9script
673 let exported = 'something'
674 import * as exported from './Xexport.vim'
675 END
676 writefile(import_already_defined, 'Ximport.vim')
677 assert_fails('source Ximport.vim', 'E1073:')
678
679 " try to import something that is already defined
680 import_already_defined =<< trim END
681 vim9script
682 let exported = 'something'
683 import {exported} from './Xexport.vim'
684 END
685 writefile(import_already_defined, 'Ximport.vim')
686 assert_fails('source Ximport.vim', 'E1073:')
687
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +0100688 " import a very long name, requires making a copy
689 let import_long_name_lines =<< trim END
690 vim9script
691 import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
692 END
693 writefile(import_long_name_lines, 'Ximport.vim')
694 assert_fails('source Ximport.vim', 'E1048:')
695
696 let import_no_from_lines =<< trim END
697 vim9script
698 import name './Xexport.vim'
699 END
700 writefile(import_no_from_lines, 'Ximport.vim')
701 assert_fails('source Ximport.vim', 'E1070:')
702
703 let import_invalid_string_lines =<< trim END
704 vim9script
705 import name from Xexport.vim
706 END
707 writefile(import_invalid_string_lines, 'Ximport.vim')
708 assert_fails('source Ximport.vim', 'E1071:')
709
710 let import_wrong_name_lines =<< trim END
711 vim9script
712 import name from './XnoExport.vim'
713 END
714 writefile(import_wrong_name_lines, 'Ximport.vim')
715 assert_fails('source Ximport.vim', 'E1053:')
716
717 let import_missing_comma_lines =<< trim END
718 vim9script
719 import {exported name} from './Xexport.vim'
720 END
Bram Moolenaar5269bd22020-03-09 19:25:27 +0100721 writefile(import_missing_comma_lines, 'Ximport3.vim')
722 assert_fails('source Ximport3.vim', 'E1046:')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +0100723
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100724 delete('Ximport.vim')
Bram Moolenaar5269bd22020-03-09 19:25:27 +0100725 delete('Ximport3.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100726 delete('Xexport.vim')
727
Bram Moolenaar750802b2020-02-23 18:08:33 +0100728 " Check that in a Vim9 script 'cpo' is set to the Vim default.
729 set cpo&vi
730 let cpo_before = &cpo
731 let lines =<< trim END
732 vim9script
733 g:cpo_in_vim9script = &cpo
734 END
735 writefile(lines, 'Xvim9_script')
736 source Xvim9_script
737 assert_equal(cpo_before, &cpo)
738 set cpo&vim
739 assert_equal(&cpo, g:cpo_in_vim9script)
740 delete('Xvim9_script')
741enddef
742
743def Test_vim9script_fails()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100744 CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
745 CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +0100746 CheckScriptFailure(['export let some = 123'], 'E1042:')
Bram Moolenaar9721fb42020-06-11 23:10:46 +0200747 CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
Bram Moolenaar750802b2020-02-23 18:08:33 +0100748 CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
749 CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
750
751 assert_fails('vim9script', 'E1038')
Bram Moolenaara26b9702020-04-18 19:53:28 +0200752 assert_fails('export something', 'E1043')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100753enddef
754
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200755def Test_vim9script_reload_import()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100756 let lines =<< trim END
757 vim9script
758 const var = ''
759 let valone = 1234
760 def MyFunc(arg: string)
761 valone = 5678
762 enddef
763 END
764 let morelines =<< trim END
765 let valtwo = 222
766 export def GetValtwo(): number
767 return valtwo
768 enddef
769 END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +0200770 writefile(lines + morelines, 'Xreload.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100771 source Xreload.vim
772 source Xreload.vim
773 source Xreload.vim
774
775 let testlines =<< trim END
776 vim9script
777 def TheFunc()
778 import GetValtwo from './Xreload.vim'
779 assert_equal(222, GetValtwo())
780 enddef
781 TheFunc()
782 END
783 writefile(testlines, 'Ximport.vim')
784 source Ximport.vim
785
Bram Moolenaar03afdcf2020-04-27 23:39:30 +0200786 " Test that when not using "morelines" GetValtwo() and valtwo are still
787 " defined, because import doesn't reload a script.
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100788 writefile(lines, 'Xreload.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100789 source Ximport.vim
790
791 " cannot declare a var twice
792 lines =<< trim END
793 vim9script
794 let valone = 1234
795 let valone = 5678
796 END
797 writefile(lines, 'Xreload.vim')
798 assert_fails('source Xreload.vim', 'E1041:')
799
800 delete('Xreload.vim')
801 delete('Ximport.vim')
802enddef
803
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200804def Test_vim9script_reload_delfunc()
805 let first_lines =<< trim END
806 vim9script
807 def FuncYes(): string
808 return 'yes'
809 enddef
810 END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +0200811 let withno_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200812 def FuncNo(): string
813 return 'no'
814 enddef
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200815 def g:DoCheck(no_exists: bool)
816 assert_equal('yes', FuncYes())
Bram Moolenaar03afdcf2020-04-27 23:39:30 +0200817 assert_equal('no', FuncNo())
818 enddef
819 END
820 let nono_lines =<< trim END
821 def g:DoCheck(no_exists: bool)
822 assert_equal('yes', FuncYes())
823 assert_fails('call FuncNo()', 'E117:')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200824 enddef
825 END
826
827 # FuncNo() is defined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +0200828 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200829 source Xreloaded.vim
830 g:DoCheck(true)
831
832 # FuncNo() is not redefined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +0200833 writefile(first_lines + nono_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200834 source Xreloaded.vim
Bram Moolenaar03afdcf2020-04-27 23:39:30 +0200835 g:DoCheck()
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200836
837 # FuncNo() is back
Bram Moolenaar03afdcf2020-04-27 23:39:30 +0200838 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200839 source Xreloaded.vim
Bram Moolenaar03afdcf2020-04-27 23:39:30 +0200840 g:DoCheck()
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200841
842 delete('Xreloaded.vim')
843enddef
844
Bram Moolenaar89483d42020-05-10 15:24:44 +0200845def Test_vim9script_reload_delvar()
846 # write the script with a script-local variable
847 let lines =<< trim END
848 vim9script
849 let var = 'string'
850 END
851 writefile(lines, 'XreloadVar.vim')
852 source XreloadVar.vim
853
854 # now write the script using the same variable locally - works
855 lines =<< trim END
856 vim9script
857 def Func()
858 let var = 'string'
859 enddef
860 END
861 writefile(lines, 'XreloadVar.vim')
862 source XreloadVar.vim
863
864 delete('XreloadVar.vim')
865enddef
866
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100867def Test_import_absolute()
868 let import_lines = [
Bram Moolenaare6085c52020-04-12 20:19:16 +0200869 'vim9script',
870 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
871 'def UseExported()',
872 ' g:imported_abs = exported',
873 ' exported = 8888',
874 ' g:imported_after = exported',
875 'enddef',
876 'UseExported()',
877 'g:import_disassembled = execute("disass UseExported")',
878 ]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100879 writefile(import_lines, 'Ximport_abs.vim')
880 writefile(s:export_script_lines, 'Xexport_abs.vim')
881
882 source Ximport_abs.vim
883
884 assert_equal(9876, g:imported_abs)
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100885 assert_equal(8888, g:imported_after)
Bram Moolenaar675f7162020-04-12 22:53:54 +0200886 assert_match('<SNR>\d\+_UseExported.*' ..
887 'g:imported_abs = exported.*' ..
888 '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
889 '1 STOREG g:imported_abs.*' ..
890 'exported = 8888.*' ..
891 '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
892 'g:imported_after = exported.*' ..
893 '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
894 '5 STOREG g:imported_after.*',
Bram Moolenaare6085c52020-04-12 20:19:16 +0200895 g:import_disassembled)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100896 unlet g:imported_abs
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100897 unlet g:import_disassembled
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100898
899 delete('Ximport_abs.vim')
900 delete('Xexport_abs.vim')
901enddef
902
903def Test_import_rtp()
904 let import_lines = [
Bram Moolenaare6085c52020-04-12 20:19:16 +0200905 'vim9script',
906 'import exported from "Xexport_rtp.vim"',
907 'g:imported_rtp = exported',
908 ]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100909 writefile(import_lines, 'Ximport_rtp.vim')
910 mkdir('import')
911 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
912
913 let save_rtp = &rtp
914 &rtp = getcwd()
915 source Ximport_rtp.vim
916 &rtp = save_rtp
917
918 assert_equal(9876, g:imported_rtp)
919 unlet g:imported_rtp
920
921 delete('Ximport_rtp.vim')
Bram Moolenaar89483d42020-05-10 15:24:44 +0200922 delete('import', 'rf')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100923enddef
924
Bram Moolenaar25e0f582020-05-25 22:36:50 +0200925def Test_import_compile_error()
926 let export_lines = [
927 'vim9script',
928 'export def ExpFunc(): string',
929 ' return notDefined',
930 'enddef',
931 ]
932 writefile(export_lines, 'Xexported.vim')
933
934 let import_lines = [
935 'vim9script',
936 'import ExpFunc from "./Xexported.vim"',
937 'def ImpFunc()',
938 ' echo ExpFunc()',
939 'enddef',
940 'defcompile',
941 ]
942 writefile(import_lines, 'Ximport.vim')
943
944 try
945 source Ximport.vim
946 catch /E1001/
947 " Error should be fore the Xexported.vim file.
948 assert_match('E1001: variable not found: notDefined', v:exception)
949 assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
950 endtry
951
952 delete('Xexported.vim')
953 delete('Ximport.vim')
954enddef
955
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100956def Test_fixed_size_list()
957 " will be allocated as one piece of memory, check that changes work
958 let l = [1, 2, 3, 4]
959 l->remove(0)
960 l->add(5)
961 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100962 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100963enddef
964
Bram Moolenaar158906c2020-02-06 20:39:45 +0100965def IfElse(what: number): string
966 let res = ''
967 if what == 1
968 res = "one"
969 elseif what == 2
970 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100971 else
Bram Moolenaar158906c2020-02-06 20:39:45 +0100972 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100973 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +0100974 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100975enddef
976
Bram Moolenaar158906c2020-02-06 20:39:45 +0100977def Test_if_elseif_else()
978 assert_equal('one', IfElse(1))
979 assert_equal('two', IfElse(2))
980 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100981enddef
982
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200983def Test_if_elseif_else_fails()
984 call CheckDefFailure(['elseif true'], 'E582:')
985 call CheckDefFailure(['else'], 'E581:')
986 call CheckDefFailure(['endif'], 'E580:')
987 call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200988 call CheckDefFailure(['if true', 'echo 1'], 'E171:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200989enddef
990
Bram Moolenaar6d69bf62020-03-03 19:02:12 +0100991let g:bool_true = v:true
992let g:bool_false = v:false
993
994def Test_if_const_expr()
995 let res = false
996 if true ? true : false
997 res = true
998 endif
999 assert_equal(true, res)
1000
Bram Moolenaar585fea72020-04-02 22:33:21 +02001001 g:glob = 2
1002 if false
1003 execute('let g:glob = 3')
1004 endif
1005 assert_equal(2, g:glob)
1006 if true
1007 execute('let g:glob = 3')
1008 endif
1009 assert_equal(3, g:glob)
1010
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001011 res = false
1012 if g:bool_true ? true : false
1013 res = true
1014 endif
1015 assert_equal(true, res)
1016
1017 res = false
1018 if true ? g:bool_true : false
1019 res = true
1020 endif
1021 assert_equal(true, res)
1022
1023 res = false
1024 if true ? true : g:bool_false
1025 res = true
1026 endif
1027 assert_equal(true, res)
1028
1029 res = false
1030 if true ? false : true
1031 res = true
1032 endif
1033 assert_equal(false, res)
1034
1035 res = false
1036 if false ? false : true
1037 res = true
1038 endif
1039 assert_equal(true, res)
1040
1041 res = false
1042 if false ? true : false
1043 res = true
1044 endif
1045 assert_equal(false, res)
1046
1047 res = false
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001048 if has('xyz') ? true : false
1049 res = true
1050 endif
1051 assert_equal(false, res)
1052
1053 res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001054 if true && true
1055 res = true
1056 endif
1057 assert_equal(true, res)
1058
1059 res = false
1060 if true && false
1061 res = true
1062 endif
1063 assert_equal(false, res)
1064
1065 res = false
1066 if g:bool_true && false
1067 res = true
1068 endif
1069 assert_equal(false, res)
1070
1071 res = false
1072 if true && g:bool_false
1073 res = true
1074 endif
1075 assert_equal(false, res)
1076
1077 res = false
1078 if false && false
1079 res = true
1080 endif
1081 assert_equal(false, res)
1082
1083 res = false
1084 if true || false
1085 res = true
1086 endif
1087 assert_equal(true, res)
1088
1089 res = false
1090 if g:bool_true || false
1091 res = true
1092 endif
1093 assert_equal(true, res)
1094
1095 res = false
1096 if true || g:bool_false
1097 res = true
1098 endif
1099 assert_equal(true, res)
1100
1101 res = false
1102 if false || false
1103 res = true
1104 endif
1105 assert_equal(false, res)
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02001106enddef
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001107
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02001108def Test_if_const_expr_fails()
1109 call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1110 call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001111 call CheckDefFailure(["if has('aaa'"], 'E110:')
1112 call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001113enddef
1114
Bram Moolenaarad39c092020-02-26 18:23:43 +01001115def Test_execute_cmd()
1116 new
1117 setline(1, 'default')
1118 execute 'call setline(1, "execute-string")'
1119 assert_equal('execute-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001120
1121 execute "call setline(1, 'execute-string')"
1122 assert_equal('execute-string', getline(1))
1123
Bram Moolenaarad39c092020-02-26 18:23:43 +01001124 let cmd1 = 'call setline(1,'
1125 let cmd2 = '"execute-var")'
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001126 execute cmd1 cmd2 # comment
Bram Moolenaarad39c092020-02-26 18:23:43 +01001127 assert_equal('execute-var', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001128
Bram Moolenaarad39c092020-02-26 18:23:43 +01001129 execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1130 assert_equal('execute-var-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001131
Bram Moolenaarad39c092020-02-26 18:23:43 +01001132 let cmd_first = 'call '
1133 let cmd_last = 'setline(1, "execute-var-var")'
1134 execute cmd_first .. cmd_last
1135 assert_equal('execute-var-var', getline(1))
1136 bwipe!
Bram Moolenaar585fea72020-04-02 22:33:21 +02001137
1138 call CheckDefFailure(['execute xxx'], 'E1001:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001139 call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
Bram Moolenaarad39c092020-02-26 18:23:43 +01001140enddef
1141
1142def Test_echo_cmd()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001143 echo 'some' # comment
Bram Moolenaar585fea72020-04-02 22:33:21 +02001144 echon 'thing'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001145 assert_match('^something$', Screenline(&lines))
1146
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001147 echo "some" # comment
1148 echon "thing"
1149 assert_match('^something$', Screenline(&lines))
1150
Bram Moolenaarad39c092020-02-26 18:23:43 +01001151 let str1 = 'some'
1152 let str2 = 'more'
1153 echo str1 str2
1154 assert_match('^some more$', Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001155
1156 call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
Bram Moolenaarad39c092020-02-26 18:23:43 +01001157enddef
1158
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001159def Test_echomsg_cmd()
1160 echomsg 'some' 'more' # comment
1161 assert_match('^some more$', Screenline(&lines))
1162 echo 'clear'
1163 1messages
1164 assert_match('^some more$', Screenline(&lines))
1165
1166 call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1167enddef
1168
1169def Test_echoerr_cmd()
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001170 try
1171 echoerr 'something' 'wrong' # comment
1172 catch
1173 assert_match('something wrong', v:exception)
1174 endtry
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001175enddef
1176
Bram Moolenaar41fe0612020-03-01 16:22:40 +01001177def Test_for_outside_of_function()
1178 let lines =<< trim END
1179 vim9script
1180 new
1181 for var in range(0, 3)
1182 append(line('$'), var)
1183 endfor
1184 assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
1185 bwipe!
1186 END
1187 writefile(lines, 'Xvim9for.vim')
1188 source Xvim9for.vim
1189 delete('Xvim9for.vim')
1190enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001191
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001192def Test_for_loop()
1193 let result = ''
1194 for cnt in range(7)
1195 if cnt == 4
1196 break
1197 endif
1198 if cnt == 2
1199 continue
1200 endif
1201 result ..= cnt .. '_'
1202 endfor
1203 assert_equal('0_1_3_', result)
1204enddef
1205
1206def Test_for_loop_fails()
Bram Moolenaar675f7162020-04-12 22:53:54 +02001207 CheckDefFailure(['for # in range(5)'], 'E690:')
1208 CheckDefFailure(['for i In range(5)'], 'E690:')
1209 CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
Bram Moolenaar822ba242020-05-24 23:00:18 +02001210 CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001211 CheckDefFailure(['for i in "text"'], 'E1024:')
1212 CheckDefFailure(['for i in xxx'], 'E1001:')
1213 CheckDefFailure(['endfor'], 'E588:')
1214 CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001215enddef
1216
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01001217def Test_while_loop()
1218 let result = ''
1219 let cnt = 0
1220 while cnt < 555
1221 if cnt == 3
1222 break
1223 endif
1224 cnt += 1
1225 if cnt == 2
1226 continue
1227 endif
1228 result ..= cnt .. '_'
1229 endwhile
1230 assert_equal('1_3_', result)
1231enddef
1232
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001233def Test_while_loop_fails()
Bram Moolenaar675f7162020-04-12 22:53:54 +02001234 CheckDefFailure(['while xxx'], 'E1001:')
1235 CheckDefFailure(['endwhile'], 'E588:')
1236 CheckDefFailure(['continue'], 'E586:')
1237 CheckDefFailure(['if true', 'continue'], 'E586:')
1238 CheckDefFailure(['break'], 'E587:')
1239 CheckDefFailure(['if true', 'break'], 'E587:')
1240 CheckDefFailure(['while 1', 'echo 3'], 'E170:')
Bram Moolenaarbd5da372020-03-31 23:13:10 +02001241enddef
1242
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001243def Test_interrupt_loop()
Bram Moolenaar97acfc72020-03-22 13:44:28 +01001244 let caught = false
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001245 let x = 0
Bram Moolenaar97acfc72020-03-22 13:44:28 +01001246 try
1247 while 1
1248 x += 1
1249 if x == 100
1250 feedkeys("\<C-C>", 'Lt')
1251 endif
1252 endwhile
1253 catch
1254 caught = true
1255 assert_equal(100, x)
1256 endtry
1257 assert_true(caught, 'should have caught an exception')
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001258enddef
Bram Moolenaar20431c92020-03-20 18:39:46 +01001259
Bram Moolenaar4fdae992020-04-12 16:38:57 +02001260def Test_automatic_line_continuation()
1261 let mylist = [
1262 'one',
1263 'two',
1264 'three',
1265 ] " comment
1266 assert_equal(['one', 'two', 'three'], mylist)
1267
1268 let mydict = {
1269 'one': 1,
1270 'two': 2,
1271 'three':
1272 3,
1273 } " comment
1274 assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
1275 mydict = #{
Bram Moolenaar2c330432020-04-13 14:41:35 +02001276 one: 1, # comment
1277 two: # comment
1278 2, # comment
1279 three: 3 # comment
1280 }
1281 assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1282 mydict = #{
1283 one: 1,
1284 two:
1285 2,
1286 three: 3
Bram Moolenaar4fdae992020-04-12 16:38:57 +02001287 }
1288 assert_equal(#{one: 1, two: 2, three: 3}, mydict)
Bram Moolenaare6085c52020-04-12 20:19:16 +02001289
1290 assert_equal(
1291 ['one', 'two', 'three'],
1292 split('one two three')
1293 )
Bram Moolenaar4fdae992020-04-12 16:38:57 +02001294enddef
1295
Bram Moolenaar7a092242020-04-16 22:10:49 +02001296def Test_vim9_comment()
1297 CheckScriptSuccess([
1298 'vim9script',
1299 '# something',
1300 ])
1301 CheckScriptFailure([
1302 'vim9script',
1303 ':# something',
1304 ], 'E488:')
1305 CheckScriptFailure([
1306 '# something',
1307 ], 'E488:')
1308 CheckScriptFailure([
1309 ':# something',
1310 ], 'E488:')
1311
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02001312 { # block start
1313 } # block end
1314 CheckDefFailure([
1315 '{# comment',
1316 ], 'E488:')
1317 CheckDefFailure([
1318 '{',
1319 '}# comment',
1320 ], 'E488:')
1321
1322 echo "yes" # comment
1323 CheckDefFailure([
1324 'echo "yes"# comment',
1325 ], 'E488:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02001326 CheckScriptSuccess([
1327 'vim9script',
1328 'echo "yes" # something',
1329 ])
1330 CheckScriptFailure([
1331 'vim9script',
1332 'echo "yes"# something',
1333 ], 'E121:')
1334 CheckScriptFailure([
1335 'vim9script',
1336 'echo# something',
1337 ], 'E121:')
1338 CheckScriptFailure([
1339 'echo "yes" # something',
1340 ], 'E121:')
1341
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02001342 exe "echo" # comment
1343 CheckDefFailure([
1344 'exe "echo"# comment',
1345 ], 'E488:')
1346 CheckScriptSuccess([
1347 'vim9script',
1348 'exe "echo" # something',
1349 ])
1350 CheckScriptFailure([
1351 'vim9script',
1352 'exe "echo"# something',
1353 ], 'E121:')
1354 CheckDefFailure([
1355 'exe # comment',
1356 ], 'E1015:')
1357 CheckScriptFailure([
1358 'vim9script',
1359 'exe# something',
1360 ], 'E121:')
1361 CheckScriptFailure([
1362 'exe "echo" # something',
1363 ], 'E121:')
1364
Bram Moolenaar7a092242020-04-16 22:10:49 +02001365 CheckDefFailure([
1366 'try# comment',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001367 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02001368 'catch',
1369 'endtry',
1370 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001371 CheckScriptFailure([
1372 'vim9script',
1373 'try# comment',
1374 'echo "yes"',
1375 ], 'E488:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02001376 CheckDefFailure([
1377 'try',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001378 ' throw#comment',
1379 'catch',
1380 'endtry',
1381 ], 'E1015:')
1382 CheckDefFailure([
1383 'try',
1384 ' throw "yes"#comment',
1385 'catch',
1386 'endtry',
1387 ], 'E488:')
1388 CheckDefFailure([
1389 'try',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001390 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02001391 'catch# comment',
1392 'endtry',
1393 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001394 CheckScriptFailure([
1395 'vim9script',
1396 'try',
1397 ' echo "yes"',
1398 'catch# comment',
1399 'endtry',
1400 ], 'E654:')
1401 CheckDefFailure([
1402 'try',
1403 ' echo "yes"',
1404 'catch /pat/# comment',
1405 'endtry',
1406 ], 'E488:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02001407 CheckDefFailure([
1408 'try',
1409 'echo "yes"',
1410 'catch',
1411 'endtry# comment',
1412 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001413 CheckScriptFailure([
1414 'vim9script',
1415 'try',
1416 ' echo "yes"',
1417 'catch',
1418 'endtry# comment',
1419 ], 'E600:')
1420
1421 CheckScriptSuccess([
1422 'vim9script',
1423 'hi # comment',
1424 ])
1425 CheckScriptFailure([
1426 'vim9script',
1427 'hi# comment',
1428 ], 'E416:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02001429 CheckScriptSuccess([
1430 'vim9script',
1431 'hi Search # comment',
1432 ])
1433 CheckScriptFailure([
1434 'vim9script',
1435 'hi Search# comment',
1436 ], 'E416:')
1437 CheckScriptSuccess([
1438 'vim9script',
1439 'hi link This Search # comment',
1440 ])
1441 CheckScriptFailure([
1442 'vim9script',
1443 'hi link This That# comment',
1444 ], 'E413:')
1445 CheckScriptSuccess([
1446 'vim9script',
1447 'hi clear This # comment',
1448 'hi clear # comment',
1449 ])
1450 " not tested, because it doesn't give an error but a warning:
1451 " hi clear This# comment',
1452 CheckScriptFailure([
1453 'vim9script',
1454 'hi clear# comment',
1455 ], 'E416:')
1456
1457 CheckScriptSuccess([
1458 'vim9script',
1459 'hi Group term=bold',
1460 'match Group /todo/ # comment',
1461 ])
1462 CheckScriptFailure([
1463 'vim9script',
1464 'hi Group term=bold',
1465 'match Group /todo/# comment',
1466 ], 'E488:')
1467 CheckScriptSuccess([
1468 'vim9script',
1469 'match # comment',
1470 ])
1471 CheckScriptFailure([
1472 'vim9script',
1473 'match# comment',
1474 ], 'E475:')
1475 CheckScriptSuccess([
1476 'vim9script',
1477 'match none # comment',
1478 ])
1479 CheckScriptFailure([
1480 'vim9script',
1481 'match none# comment',
1482 ], 'E475:')
1483
1484 CheckScriptSuccess([
1485 'vim9script',
1486 'menutrans clear # comment',
1487 ])
1488 CheckScriptFailure([
1489 'vim9script',
1490 'menutrans clear# comment text',
1491 ], 'E474:')
1492
1493 CheckScriptSuccess([
1494 'vim9script',
1495 'syntax clear # comment',
1496 ])
1497 CheckScriptFailure([
1498 'vim9script',
1499 'syntax clear# comment text',
1500 ], 'E28:')
1501 CheckScriptSuccess([
1502 'vim9script',
1503 'syntax keyword Word some',
1504 'syntax clear Word # comment',
1505 ])
1506 CheckScriptFailure([
1507 'vim9script',
1508 'syntax keyword Word some',
1509 'syntax clear Word# comment text',
1510 ], 'E28:')
1511
1512 CheckScriptSuccess([
1513 'vim9script',
1514 'syntax list # comment',
1515 ])
1516 CheckScriptFailure([
1517 'vim9script',
1518 'syntax list# comment text',
1519 ], 'E28:')
1520
1521 CheckScriptSuccess([
1522 'vim9script',
1523 'syntax match Word /pat/ oneline # comment',
1524 ])
1525 CheckScriptFailure([
1526 'vim9script',
1527 'syntax match Word /pat/ oneline# comment',
1528 ], 'E475:')
1529
1530 CheckScriptSuccess([
1531 'vim9script',
1532 'syntax keyword Word word # comm[ent',
1533 ])
1534 CheckScriptFailure([
1535 'vim9script',
1536 'syntax keyword Word word# comm[ent',
1537 ], 'E789:')
1538
1539 CheckScriptSuccess([
1540 'vim9script',
1541 'syntax match Word /pat/ # comment',
1542 ])
1543 CheckScriptFailure([
1544 'vim9script',
1545 'syntax match Word /pat/# comment',
1546 ], 'E402:')
1547
1548 CheckScriptSuccess([
1549 'vim9script',
1550 'syntax match Word /pat/ contains=Something # comment',
1551 ])
1552 CheckScriptFailure([
1553 'vim9script',
1554 'syntax match Word /pat/ contains=Something# comment',
1555 ], 'E475:')
1556 CheckScriptFailure([
1557 'vim9script',
1558 'syntax match Word /pat/ contains= # comment',
1559 ], 'E406:')
1560 CheckScriptFailure([
1561 'vim9script',
1562 'syntax match Word /pat/ contains=# comment',
1563 ], 'E475:')
1564
1565 CheckScriptSuccess([
1566 'vim9script',
1567 'syntax region Word start=/pat/ end=/pat/ # comment',
1568 ])
1569 CheckScriptFailure([
1570 'vim9script',
1571 'syntax region Word start=/pat/ end=/pat/# comment',
1572 ], 'E475:')
1573
1574 CheckScriptSuccess([
1575 'vim9script',
1576 'syntax sync # comment',
1577 ])
1578 CheckScriptFailure([
1579 'vim9script',
1580 'syntax sync# comment',
1581 ], 'E404:')
1582 CheckScriptSuccess([
1583 'vim9script',
1584 'syntax sync ccomment # comment',
1585 ])
1586 CheckScriptFailure([
1587 'vim9script',
1588 'syntax sync ccomment# comment',
1589 ], 'E404:')
1590
1591 CheckScriptSuccess([
1592 'vim9script',
1593 'syntax cluster Some contains=Word # comment',
1594 ])
1595 CheckScriptFailure([
1596 'vim9script',
1597 'syntax cluster Some contains=Word# comment',
1598 ], 'E475:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001599
1600 CheckScriptSuccess([
1601 'vim9script',
1602 'command Echo echo # comment',
1603 'command Echo # comment',
1604 ])
1605 CheckScriptFailure([
1606 'vim9script',
1607 'command Echo echo# comment',
1608 'Echo',
1609 ], 'E121:')
1610 CheckScriptFailure([
1611 'vim9script',
1612 'command Echo# comment',
1613 ], 'E182:')
1614 CheckScriptFailure([
1615 'vim9script',
1616 'command Echo echo',
1617 'command Echo# comment',
1618 ], 'E182:')
1619
1620 CheckScriptSuccess([
1621 'vim9script',
1622 'function # comment',
1623 ])
1624 CheckScriptFailure([
1625 'vim9script',
1626 'function# comment',
1627 ], 'E129:')
1628 CheckScriptSuccess([
1629 'vim9script',
1630 'function CheckScriptSuccess # comment',
1631 ])
1632 CheckScriptFailure([
1633 'vim9script',
1634 'function CheckScriptSuccess# comment',
1635 ], 'E488:')
1636
1637 CheckScriptSuccess([
1638 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001639 'func g:DeleteMeA()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001640 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001641 'delfunction g:DeleteMeA # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001642 ])
1643 CheckScriptFailure([
1644 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001645 'func g:DeleteMeB()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001646 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001647 'delfunction g:DeleteMeB# comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001648 ], 'E488:')
1649
1650 CheckScriptSuccess([
1651 'vim9script',
1652 'call execute("ls") # comment',
1653 ])
1654 CheckScriptFailure([
1655 'vim9script',
1656 'call execute("ls")# comment',
1657 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001658enddef
1659
1660def Test_vim9_comment_gui()
1661 CheckCanRunGui
1662
1663 CheckScriptFailure([
1664 'vim9script',
1665 'gui#comment'
1666 ], 'E499:')
1667 CheckScriptFailure([
1668 'vim9script',
1669 'gui -f#comment'
1670 ], 'E499:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02001671enddef
1672
Bram Moolenaara26b9702020-04-18 19:53:28 +02001673def Test_vim9_comment_not_compiled()
1674 au TabEnter *.vim let g:entered = 1
1675 au TabEnter *.x let g:entered = 2
1676
1677 edit test.vim
1678 doautocmd TabEnter #comment
1679 assert_equal(1, g:entered)
1680
1681 doautocmd TabEnter f.x
1682 assert_equal(2, g:entered)
1683
1684 g:entered = 0
1685 doautocmd TabEnter f.x #comment
1686 assert_equal(2, g:entered)
1687
1688 assert_fails('doautocmd Syntax#comment', 'E216:')
1689
1690 au! TabEnter
1691 unlet g:entered
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02001692
1693 CheckScriptSuccess([
1694 'vim9script',
1695 'let g:var = 123',
1696 'let w:var = 777',
1697 'unlet g:var w:var # something',
1698 ])
1699
1700 CheckScriptFailure([
1701 'vim9script',
1702 'let g:var = 123',
Bram Moolenaar32e35112020-05-14 22:41:15 +02001703 'unlet g:var# comment1',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02001704 ], 'E108:')
1705
1706 CheckScriptFailure([
1707 'let g:var = 123',
1708 'unlet g:var # something',
1709 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02001710
1711 CheckScriptSuccess([
1712 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02001713 'if 1 # comment2',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02001714 ' echo "yes"',
1715 'elseif 2 #comment',
1716 ' echo "no"',
1717 'endif',
1718 ])
1719
1720 CheckScriptFailure([
1721 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02001722 'if 1# comment3',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02001723 ' echo "yes"',
1724 'endif',
1725 ], 'E15:')
1726
1727 CheckScriptFailure([
1728 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02001729 'if 0 # comment4',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02001730 ' echo "yes"',
1731 'elseif 2#comment',
1732 ' echo "no"',
1733 'endif',
1734 ], 'E15:')
1735
1736 CheckScriptSuccess([
1737 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02001738 'let v = 1 # comment5',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02001739 ])
1740
1741 CheckScriptFailure([
1742 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02001743 'let v = 1# comment6',
1744 ], 'E15:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02001745
Bram Moolenaarfaac4102020-04-20 17:46:14 +02001746 CheckScriptSuccess([
1747 'vim9script',
1748 'new'
1749 'call setline(1, ["# define pat", "last"])',
1750 '$',
1751 'dsearch /pat/ #comment',
1752 'bwipe!',
1753 ])
1754
1755 CheckScriptFailure([
1756 'vim9script',
1757 'new'
1758 'call setline(1, ["# define pat", "last"])',
1759 '$',
1760 'dsearch /pat/#comment',
1761 'bwipe!',
1762 ], 'E488:')
Bram Moolenaar74fae512020-05-21 21:50:58 +02001763
1764 CheckScriptFailure([
1765 'vim9script',
1766 'func! SomeFunc()',
1767 ], 'E477:')
Bram Moolenaara26b9702020-04-18 19:53:28 +02001768enddef
1769
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02001770def Test_finish()
1771 let lines =<< trim END
1772 vim9script
1773 let g:res = 'one'
1774 if v:false | finish | endif
1775 let g:res = 'two'
1776 finish
1777 let g:res = 'three'
1778 END
1779 writefile(lines, 'Xfinished')
1780 source Xfinished
1781 assert_equal('two', g:res)
1782
1783 unlet g:res
1784 delete('Xfinished')
1785enddef
1786
Bram Moolenaar32e35112020-05-14 22:41:15 +02001787def Test_let_func_call()
1788 let lines =<< trim END
1789 vim9script
1790 func GetValue()
1791 if exists('g:count')
1792 let g:count += 1
1793 else
1794 let g:count = 1
1795 endif
1796 return 'this'
1797 endfunc
1798 let val: string = GetValue()
Bram Moolenaardf671b42020-05-16 22:33:33 +02001799 " env var is always a string
1800 let env = $TERM
Bram Moolenaar32e35112020-05-14 22:41:15 +02001801 END
1802 writefile(lines, 'Xfinished')
1803 source Xfinished
Bram Moolenaara5d00772020-05-14 23:20:55 +02001804 " GetValue() is not called during discovery phase
Bram Moolenaar32e35112020-05-14 22:41:15 +02001805 assert_equal(1, g:count)
1806
1807 unlet g:count
1808 delete('Xfinished')
1809enddef
1810
1811def Test_let_missing_type()
1812 let lines =<< trim END
1813 vim9script
Bram Moolenaardf671b42020-05-16 22:33:33 +02001814 let var = g:unknown
Bram Moolenaar227a69d2020-05-15 18:17:28 +02001815 END
Bram Moolenaar822ba242020-05-24 23:00:18 +02001816 CheckScriptFailure(lines, 'E121:')
Bram Moolenaar227a69d2020-05-15 18:17:28 +02001817
1818 lines =<< trim END
1819 vim9script
1820 let nr: number = 123
1821 let var = nr
1822 END
Bram Moolenaar822ba242020-05-24 23:00:18 +02001823 CheckScriptSuccess(lines)
Bram Moolenaar32e35112020-05-14 22:41:15 +02001824enddef
1825
Bram Moolenaarc82a5b52020-06-13 18:09:19 +02001826def Test_let_declaration()
1827 let lines =<< trim END
1828 vim9script
1829 let var: string
1830 g:var_uninit = var
1831 var = 'text'
1832 g:var_test = var
Bram Moolenaar984dddb2020-06-14 12:50:24 +02001833 " prefixing s: is optional
1834 s:var = 'prefixed'
1835 g:var_prefixed = s:var
1836
1837 let s:other: number
1838 other = 1234
1839 g:other_var = other
Bram Moolenaarc82a5b52020-06-13 18:09:19 +02001840 END
1841 CheckScriptSuccess(lines)
1842 assert_equal('', g:var_uninit)
1843 assert_equal('text', g:var_test)
Bram Moolenaar984dddb2020-06-14 12:50:24 +02001844 assert_equal('prefixed', g:var_prefixed)
1845 assert_equal(1234, g:other_var)
Bram Moolenaarc82a5b52020-06-13 18:09:19 +02001846
1847 unlet g:var_uninit
1848 unlet g:var_test
Bram Moolenaar984dddb2020-06-14 12:50:24 +02001849 unlet g:var_prefixed
1850 unlet g:other_var
Bram Moolenaarc82a5b52020-06-13 18:09:19 +02001851enddef
1852
Bram Moolenaar34db91f2020-06-13 19:00:10 +02001853def Test_let_type_check()
1854 let lines =<< trim END
1855 vim9script
1856 let var: string
1857 var = 1234
1858 END
1859 CheckScriptFailure(lines, 'E1013:')
Bram Moolenaar984dddb2020-06-14 12:50:24 +02001860
1861 lines =<< trim END
1862 vim9script
1863 let var:string
1864 END
1865 CheckScriptFailure(lines, 'E1069:')
Bram Moolenaar34db91f2020-06-13 19:00:10 +02001866enddef
1867
Bram Moolenaara5d00772020-05-14 23:20:55 +02001868def Test_forward_declaration()
1869 let lines =<< trim END
1870 vim9script
Bram Moolenaara5d00772020-05-14 23:20:55 +02001871 def GetValue(): string
1872 return theVal
1873 enddef
1874 let theVal = 'something'
Bram Moolenaar822ba242020-05-24 23:00:18 +02001875 g:initVal = GetValue()
Bram Moolenaara5d00772020-05-14 23:20:55 +02001876 theVal = 'else'
1877 g:laterVal = GetValue()
1878 END
1879 writefile(lines, 'Xforward')
1880 source Xforward
1881 assert_equal('something', g:initVal)
1882 assert_equal('else', g:laterVal)
1883
1884 unlet g:initVal
1885 unlet g:laterVal
1886 delete('Xforward')
1887enddef
1888
Bram Moolenaar9721fb42020-06-11 23:10:46 +02001889def Test_source_vim9_from_legacy()
1890 let legacy_lines =<< trim END
1891 source Xvim9_script.vim
1892
1893 call assert_false(exists('local'))
1894 call assert_false(exists('exported'))
1895 call assert_false(exists('s:exported'))
1896 call assert_equal('global', global)
1897 call assert_equal('global', g:global)
1898
1899 " imported variable becomes script-local
1900 import exported from './Xvim9_script.vim'
1901 call assert_equal('exported', s:exported)
1902 call assert_false(exists('exported'))
1903
1904 " imported function becomes script-local
1905 import GetText from './Xvim9_script.vim'
1906 call assert_equal('text', s:GetText())
1907 call assert_false(exists('*GetText'))
1908 END
1909 writefile(legacy_lines, 'Xlegacy_script.vim')
1910
1911 let vim9_lines =<< trim END
1912 vim9script
1913 let local = 'local'
1914 g:global = 'global'
1915 export let exported = 'exported'
1916 export def GetText(): string
1917 return 'text'
1918 enddef
1919 END
1920 writefile(vim9_lines, 'Xvim9_script.vim')
1921
1922 source Xlegacy_script.vim
1923
1924 assert_equal('global', g:global)
1925" unlet g:global
1926
1927 delete('Xlegacy_script.vim')
1928 delete('Xvim9_script.vim')
1929enddef
Bram Moolenaara5d00772020-05-14 23:20:55 +02001930
Bram Moolenaar585fea72020-04-02 22:33:21 +02001931" Keep this last, it messes up highlighting.
1932def Test_substitute_cmd()
1933 new
1934 setline(1, 'something')
1935 :substitute(some(other(
1936 assert_equal('otherthing', getline(1))
1937 bwipe!
1938
1939 " also when the context is Vim9 script
1940 let lines =<< trim END
1941 vim9script
1942 new
1943 setline(1, 'something')
1944 :substitute(some(other(
1945 assert_equal('otherthing', getline(1))
1946 bwipe!
1947 END
1948 writefile(lines, 'Xvim9lines')
1949 source Xvim9lines
1950
1951 delete('Xvim9lines')
1952enddef
1953
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001954" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker