blob: 5fec8a2746f927f34201e6602a78b76b77da02a4 [file] [log] [blame]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001" Test various aspects of the Vim9 script language.
2
Bram Moolenaar673660a2020-01-26 16:50:05 +01003source check.vim
Bram Moolenaar101f4812020-06-16 23:18:51 +02004source term_util.vim
Bram Moolenaarad39c092020-02-26 18:23:43 +01005source view_util.vim
Bram Moolenaarcfe435d2020-04-25 20:02:55 +02006source vim9.vim
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01007
8def Test_syntax()
9 let var = 234
10 let other: list<string> = ['asdf']
11enddef
12
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010013let s:appendToMe = 'xxx'
14let s:addToMe = 111
Bram Moolenaar401d9ff2020-02-19 18:14:44 +010015let g:existing = 'yes'
Bram Moolenaara8c17702020-04-01 21:17:24 +020016let g:inc_counter = 1
17let $SOME_ENV_VAR = 'some'
Bram Moolenaara6e67e42020-05-15 23:36:40 +020018let g:alist = [7]
19let g:astring = 'text'
Bram Moolenaarf0b9f432020-07-17 23:03:17 +020020let g:anumber = 123
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010021
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010022def Test_assignment()
23 let bool1: bool = true
24 assert_equal(v:true, bool1)
25 let bool2: bool = false
26 assert_equal(v:false, bool2)
27
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +020028 call CheckDefFailure(['let x:string'], 'E1069:')
29 call CheckDefFailure(['let x:string = "x"'], 'E1069:')
Bram Moolenaar1cc2a942020-05-10 19:10:31 +020030 call CheckDefFailure(['let a:string = "x"'], 'E1069:')
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +020031
Bram Moolenaarb2097502020-07-19 17:17:02 +020032 let a: number = 6 #comment
Bram Moolenaar9be61bb2020-03-30 22:51:24 +020033 assert_equal(6, a)
34
Bram Moolenaar42a480b2020-02-29 23:23:47 +010035 if has('channel')
36 let chan1: channel
Bram Moolenaarfbdd08e2020-03-01 14:04:46 +010037 let job1: job
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +010038 let job2: job = job_start('willfail')
Bram Moolenaar42a480b2020-02-29 23:23:47 +010039 endif
Bram Moolenaarfbdd08e2020-03-01 14:04:46 +010040 if has('float')
41 let float1: float = 3.4
42 endif
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +020043 let Funky1: func
44 let Funky2: func = function('len')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +020045 let Party2: func = funcref('g:Test_syntax')
Bram Moolenaar42a480b2020-02-29 23:23:47 +010046
Bram Moolenaarb2097502020-07-19 17:17:02 +020047 g:newvar = 'new' #comment
Bram Moolenaar401d9ff2020-02-19 18:14:44 +010048 assert_equal('new', g:newvar)
49
50 assert_equal('yes', g:existing)
51 g:existing = 'no'
52 assert_equal('no', g:existing)
53
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010054 v:char = 'abc'
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010055 assert_equal('abc', v:char)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010056
57 $ENVVAR = 'foobar'
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010058 assert_equal('foobar', $ENVVAR)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010059 $ENVVAR = ''
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010060
Bram Moolenaarfd1823e2020-02-19 20:23:11 +010061 s:appendToMe ..= 'yyy'
62 assert_equal('xxxyyy', s:appendToMe)
63 s:addToMe += 222
64 assert_equal(333, s:addToMe)
Bram Moolenaar0bbf7222020-02-19 22:31:48 +010065 s:newVar = 'new'
66 assert_equal('new', s:newVar)
Bram Moolenaara8c17702020-04-01 21:17:24 +020067
68 set ts=7
69 &ts += 1
70 assert_equal(8, &ts)
Bram Moolenaar80c34ca2020-04-01 23:05:18 +020071 &ts -= 3
72 assert_equal(5, &ts)
73 &ts *= 2
74 assert_equal(10, &ts)
75 &ts /= 3
76 assert_equal(3, &ts)
77 set ts=10
78 &ts %= 4
79 assert_equal(2, &ts)
Bram Moolenaara8c17702020-04-01 21:17:24 +020080 call CheckDefFailure(['&notex += 3'], 'E113:')
81 call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
Bram Moolenaara6e67e42020-05-15 23:36:40 +020082 call CheckDefFailure(['&ts = [7]'], 'E1013:')
83 call CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list')
84 call CheckDefFailure(['&ts = "xx"'], 'E1013:')
85 call CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string')
Bram Moolenaara8c17702020-04-01 21:17:24 +020086 call CheckDefFailure(['&path += 3'], 'E1013:')
Bram Moolenaara6e67e42020-05-15 23:36:40 +020087 call CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
Bram Moolenaarcb711ab2020-04-16 13:00:29 +020088 # test freeing ISN_STOREOPT
Bram Moolenaar585fea72020-04-02 22:33:21 +020089 call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
Bram Moolenaar80c34ca2020-04-01 23:05:18 +020090 &ts = 8
Bram Moolenaara8c17702020-04-01 21:17:24 +020091
92 g:inc_counter += 1
93 assert_equal(2, g:inc_counter)
94
95 $SOME_ENV_VAR ..= 'more'
96 assert_equal('somemore', $SOME_ENV_VAR)
97 call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:')
98 call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:')
99
100 @a = 'areg'
101 @a ..= 'add'
102 assert_equal('aregadd', @a)
103 call CheckDefFailure(['@a += "more"'], 'E1013:')
104 call CheckDefFailure(['@a += 123'], 'E1013:')
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200105
106 v:errmsg = 'none'
107 v:errmsg ..= 'again'
108 assert_equal('noneagain', v:errmsg)
109 call CheckDefFailure(['v:errmsg += "more"'], 'E1013:')
110 call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200111enddef
112
Bram Moolenaar3b74b6b2020-06-19 19:01:43 +0200113def Test_vim9_single_char_vars()
114 let lines =<< trim END
115 vim9script
116
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200117 # single character variable declarations work
Bram Moolenaar3b74b6b2020-06-19 19:01:43 +0200118 let a: string
119 let b: number
120 let l: list<any>
121 let s: string
122 let t: number
123 let v: number
124 let w: number
125
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200126 # script-local variables can be used without s: prefix
Bram Moolenaar3b74b6b2020-06-19 19:01:43 +0200127 a = 'script-a'
128 b = 111
129 l = [1, 2, 3]
130 s = 'script-s'
131 t = 222
132 v = 333
133 w = 444
134
135 assert_equal('script-a', a)
136 assert_equal(111, b)
137 assert_equal([1, 2, 3], l)
138 assert_equal('script-s', s)
139 assert_equal(222, t)
140 assert_equal(333, v)
141 assert_equal(444, w)
142 END
143 writefile(lines, 'Xsinglechar')
144 source Xsinglechar
145 delete('Xsinglechar')
146enddef
147
Bram Moolenaar84370082020-05-18 14:20:36 +0200148def Test_assignment_list()
149 let list1: list<bool> = [false, true, false]
150 let list2: list<number> = [1, 2, 3]
151 let list3: list<string> = ['sdf', 'asdf']
152 let list4: list<any> = ['yes', true, 1234]
153 let list5: list<blob> = [0z01, 0z02]
154
155 let listS: list<string> = []
156 let listN: list<number> = []
157
158 assert_equal([1, 2, 3], list2)
159 list2[-1] = 99
160 assert_equal([1, 2, 99], list2)
161 list2[-2] = 88
162 assert_equal([1, 88, 99], list2)
163 list2[-3] = 77
164 assert_equal([77, 88, 99], list2)
165 call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
Bram Moolenaarc5b1c202020-06-18 22:43:27 +0200166 call CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:')
Bram Moolenaar84370082020-05-18 14:20:36 +0200167
168 # type becomes list<any>
169 let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
170enddef
171
Bram Moolenaarb31be3f2020-07-20 22:37:44 +0200172def Test_assignment_list_vim9script()
173 let lines =<< trim END
174 vim9script
175 let v1: number
176 let v2: number
177 let v3: number
178 [v1, v2, v3] = [1, 2, 3]
179 assert_equal([1, 2, 3], [v1, v2, v3])
180 END
181 call CheckScriptSuccess(lines)
182enddef
183
Bram Moolenaar84370082020-05-18 14:20:36 +0200184def Test_assignment_dict()
185 let dict1: dict<bool> = #{one: false, two: true}
186 let dict2: dict<number> = #{one: 1, two: 2}
187 let dict3: dict<string> = #{key: 'value'}
188 let dict4: dict<any> = #{one: 1, two: '2'}
Bram Moolenaar74fae512020-05-21 21:50:58 +0200189 let dict5: dict<blob> = #{one: 0z01, two: 0z02}
Bram Moolenaar84370082020-05-18 14:20:36 +0200190
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200191 # overwrite
Bram Moolenaarc785b9a2020-06-19 18:34:15 +0200192 dict3['key'] = 'another'
193
Bram Moolenaar84370082020-05-18 14:20:36 +0200194 call CheckDefExecFailure(['let dd = {}', 'dd[""] = 6'], 'E713:')
195
196 # type becomes dict<any>
197 let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
198enddef
199
Bram Moolenaard3aac292020-04-19 14:32:17 +0200200def Test_assignment_local()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200201 # Test in a separated file in order not to the current buffer/window/tab is
202 # changed.
Bram Moolenaard3aac292020-04-19 14:32:17 +0200203 let script_lines: list<string> =<< trim END
204 let b:existing = 'yes'
205 let w:existing = 'yes'
206 let t:existing = 'yes'
207
208 def Test_assignment_local_internal()
209 b:newvar = 'new'
210 assert_equal('new', b:newvar)
211 assert_equal('yes', b:existing)
212 b:existing = 'no'
213 assert_equal('no', b:existing)
Bram Moolenaar396f3132020-05-09 18:44:56 +0200214 b:existing ..= 'NO'
215 assert_equal('noNO', b:existing)
Bram Moolenaard3aac292020-04-19 14:32:17 +0200216
217 w:newvar = 'new'
218 assert_equal('new', w:newvar)
219 assert_equal('yes', w:existing)
220 w:existing = 'no'
221 assert_equal('no', w:existing)
Bram Moolenaar396f3132020-05-09 18:44:56 +0200222 w:existing ..= 'NO'
223 assert_equal('noNO', w:existing)
Bram Moolenaard3aac292020-04-19 14:32:17 +0200224
225 t:newvar = 'new'
226 assert_equal('new', t:newvar)
227 assert_equal('yes', t:existing)
228 t:existing = 'no'
229 assert_equal('no', t:existing)
Bram Moolenaar396f3132020-05-09 18:44:56 +0200230 t:existing ..= 'NO'
231 assert_equal('noNO', t:existing)
Bram Moolenaard3aac292020-04-19 14:32:17 +0200232 enddef
233 call Test_assignment_local_internal()
234 END
235 call CheckScriptSuccess(script_lines)
236enddef
237
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200238def Test_assignment_default()
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200239
Bram Moolenaarcb711ab2020-04-16 13:00:29 +0200240 # Test default values.
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200241 let thebool: bool
242 assert_equal(v:false, thebool)
243
244 let thenumber: number
245 assert_equal(0, thenumber)
246
247 if has('float')
248 let thefloat: float
249 assert_equal(0.0, thefloat)
250 endif
251
252 let thestring: string
253 assert_equal('', thestring)
254
255 let theblob: blob
256 assert_equal(0z, theblob)
257
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200258 let Thefunc: func
259 assert_equal(test_null_function(), Thefunc)
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200260
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200261 let thelist: list<any>
262 assert_equal([], thelist)
263
264 let thedict: dict<any>
265 assert_equal({}, thedict)
266
Bram Moolenaar2c869de2020-04-02 19:12:08 +0200267 if has('channel')
268 let thejob: job
269 assert_equal(test_null_job(), thejob)
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200270
Bram Moolenaar2c869de2020-04-02 19:12:08 +0200271 let thechannel: channel
272 assert_equal(test_null_channel(), thechannel)
Bram Moolenaarc785b9a2020-06-19 18:34:15 +0200273
274 if has('unix') && executable('cat')
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200275 # check with non-null job and channel, types must match
Bram Moolenaarc785b9a2020-06-19 18:34:15 +0200276 thejob = job_start("cat ", #{})
277 thechannel = job_getchannel(thejob)
278 job_stop(thejob, 'kill')
279 endif
Bram Moolenaar2c869de2020-04-02 19:12:08 +0200280 endif
Bram Moolenaar585fea72020-04-02 22:33:21 +0200281
282 let nr = 1234 | nr = 5678
283 assert_equal(5678, nr)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100284enddef
285
Bram Moolenaar47a519a2020-06-14 23:05:10 +0200286def Test_assignment_var_list()
287 let v1: string
288 let v2: string
Bram Moolenaar9af78762020-06-16 11:34:42 +0200289 let vrem: list<string>
290 [v1] = ['aaa']
291 assert_equal('aaa', v1)
292
Bram Moolenaar47a519a2020-06-14 23:05:10 +0200293 [v1, v2] = ['one', 'two']
294 assert_equal('one', v1)
295 assert_equal('two', v2)
Bram Moolenaar9af78762020-06-16 11:34:42 +0200296
297 [v1, v2; vrem] = ['one', 'two']
298 assert_equal('one', v1)
299 assert_equal('two', v2)
300 assert_equal([], vrem)
301
302 [v1, v2; vrem] = ['one', 'two', 'three']
303 assert_equal('one', v1)
304 assert_equal('two', v2)
305 assert_equal(['three'], vrem)
Bram Moolenaar47a519a2020-06-14 23:05:10 +0200306enddef
307
Bram Moolenaarcab27672020-04-09 20:10:55 +0200308def Mess(): string
309 v:foldstart = 123
310 return 'xxx'
311enddef
312
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200313def Test_assignment_failure()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100314 call CheckDefFailure(['let var=234'], 'E1004:')
315 call CheckDefFailure(['let var =234'], 'E1004:')
316 call CheckDefFailure(['let var= 234'], 'E1004:')
317
318 call CheckDefFailure(['let true = 1'], 'E1034:')
319 call CheckDefFailure(['let false = 1'], 'E1034:')
320
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +0200321 call CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
Bram Moolenaar9af78762020-06-16 11:34:42 +0200322 call CheckDefExecFailure(['let a: number',
323 '[a] = test_null_list()'], 'E1093:')
324 call CheckDefExecFailure(['let a: number',
325 '[a] = []'], 'E1093:')
326 call CheckDefExecFailure(['let x: number',
327 'let y: number',
328 '[x, y] = [1]'], 'E1093:')
329 call CheckDefExecFailure(['let x: number',
330 'let y: number',
331 'let z: list<number>',
332 '[x, y; z] = [1]'], 'E1093:')
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200333
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200334 call CheckDefFailure(['let somevar'], "E1022:")
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200335 call CheckDefFailure(['let &option'], 'E1052:')
336 call CheckDefFailure(['&g:option = 5'], 'E113:')
337
Bram Moolenaare55b1c02020-06-21 15:52:59 +0200338 call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200339
340 call CheckDefFailure(['let @~ = 5'], 'E354:')
341 call CheckDefFailure(['let @a = 5'], 'E1066:')
342
Bram Moolenaare55b1c02020-06-21 15:52:59 +0200343 call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
344 call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
345 call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
346 call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200347
348 call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
349 call CheckDefFailure(['let xnr += 4'], 'E1020:')
350
Bram Moolenaar822ba242020-05-24 23:00:18 +0200351 call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:')
Bram Moolenaar33fa29c2020-03-28 19:41:33 +0100352
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100353 call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
354 call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
355
356 call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
357 call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
358
359 call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
360 call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100361
Bram Moolenaard77a8522020-04-03 21:59:57 +0200362 call CheckDefFailure(['let var: dict <number>'], 'E1068:')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100363 call CheckDefFailure(['let var: dict<number'], 'E1009:')
Bram Moolenaarcab27672020-04-09 20:10:55 +0200364
365 call assert_fails('s/^/\=Mess()/n', 'E794:')
366 call CheckDefFailure(['let var: dict<number'], 'E1009:')
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200367enddef
368
369def Test_unlet()
370 g:somevar = 'yes'
371 assert_true(exists('g:somevar'))
372 unlet g:somevar
373 assert_false(exists('g:somevar'))
374 unlet! g:somevar
375
376 call CheckScriptFailure([
377 'vim9script',
378 'let svar = 123',
379 'unlet svar',
380 ], 'E1081:')
381 call CheckScriptFailure([
382 'vim9script',
383 'let svar = 123',
384 'unlet s:svar',
385 ], 'E1081:')
386 call CheckScriptFailure([
387 'vim9script',
388 'let svar = 123',
389 'def Func()',
390 ' unlet svar',
391 'enddef',
Bram Moolenaar822ba242020-05-24 23:00:18 +0200392 'defcompile',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200393 ], 'E1081:')
394 call CheckScriptFailure([
395 'vim9script',
396 'let svar = 123',
397 'def Func()',
398 ' unlet s:svar',
399 'enddef',
Bram Moolenaar822ba242020-05-24 23:00:18 +0200400 'defcompile',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200401 ], 'E1081:')
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200402
403 $ENVVAR = 'foobar'
404 assert_equal('foobar', $ENVVAR)
405 unlet $ENVVAR
406 assert_equal('', $ENVVAR)
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200407enddef
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100408
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200409def Test_delfunction()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200410 # Check function is defined in script namespace
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200411 CheckScriptSuccess([
412 'vim9script',
413 'func CheckMe()',
414 ' return 123',
415 'endfunc',
416 'assert_equal(123, s:CheckMe())',
417 ])
418
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200419 # Check function in script namespace cannot be deleted
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200420 CheckScriptFailure([
421 'vim9script',
422 'func DeleteMe1()',
423 'endfunc',
424 'delfunction DeleteMe1',
425 ], 'E1084:')
426 CheckScriptFailure([
427 'vim9script',
428 'func DeleteMe2()',
429 'endfunc',
430 'def DoThat()',
431 ' delfunction DeleteMe2',
432 'enddef',
433 'DoThat()',
434 ], 'E1084:')
435 CheckScriptFailure([
436 'vim9script',
437 'def DeleteMe3()',
438 'enddef',
439 'delfunction DeleteMe3',
440 ], 'E1084:')
441 CheckScriptFailure([
442 'vim9script',
443 'def DeleteMe4()',
444 'enddef',
445 'def DoThat()',
446 ' delfunction DeleteMe4',
447 'enddef',
448 'DoThat()',
449 ], 'E1084:')
450enddef
451
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100452func Test_wrong_type()
453 call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
454 call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
455 call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
456 call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
457
458 call CheckDefFailure(['let var: dict<number'], 'E1009:')
459 call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100460
461 call CheckDefFailure(['let var: ally'], 'E1010:')
462 call CheckDefFailure(['let var: bram'], 'E1010:')
463 call CheckDefFailure(['let var: cathy'], 'E1010:')
464 call CheckDefFailure(['let var: dom'], 'E1010:')
465 call CheckDefFailure(['let var: freddy'], 'E1010:')
466 call CheckDefFailure(['let var: john'], 'E1010:')
467 call CheckDefFailure(['let var: larry'], 'E1010:')
468 call CheckDefFailure(['let var: ned'], 'E1010:')
469 call CheckDefFailure(['let var: pam'], 'E1010:')
470 call CheckDefFailure(['let var: sam'], 'E1010:')
471 call CheckDefFailure(['let var: vim'], 'E1010:')
Bram Moolenaara0a9f432020-04-28 21:29:34 +0200472
473 call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
474 call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100475endfunc
476
477func Test_const()
478 call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
479 call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
480 call CheckDefFailure(['const two'], 'E1021:')
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200481 call CheckDefFailure(['const &option'], 'E996:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100482endfunc
483
Bram Moolenaardf069ee2020-06-22 23:02:51 +0200484def Test_range_no_colon()
485 call CheckDefFailure(['%s/a/b/'], 'E1050:')
486 call CheckDefFailure(['+ s/a/b/'], 'E1050:')
487 call CheckDefFailure(['- s/a/b/'], 'E1050:')
488 call CheckDefFailure(['. s/a/b/'], 'E1050:')
489enddef
490
491
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100492def Test_block()
493 let outer = 1
494 {
495 let inner = 2
496 assert_equal(1, outer)
497 assert_equal(2, inner)
498 }
499 assert_equal(1, outer)
500enddef
501
502func Test_block_failure()
503 call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200504 call CheckDefFailure(['}'], 'E1025:')
505 call CheckDefFailure(['{', 'echo 1'], 'E1026:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100506endfunc
507
Bram Moolenaar585fea72020-04-02 22:33:21 +0200508def Test_cmd_modifier()
509 tab echo '0'
510 call CheckDefFailure(['5tab echo 3'], 'E16:')
511enddef
512
Bram Moolenaard032f342020-07-18 18:13:02 +0200513func g:NoSuchFunc()
514 echo 'none'
515endfunc
516
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100517def Test_try_catch()
518 let l = []
Bram Moolenaar7a092242020-04-16 22:10:49 +0200519 try # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100520 add(l, '1')
521 throw 'wrong'
522 add(l, '2')
Bram Moolenaar7a092242020-04-16 22:10:49 +0200523 catch # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100524 add(l, v:exception)
Bram Moolenaar7a092242020-04-16 22:10:49 +0200525 finally # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100526 add(l, '3')
Bram Moolenaar7a092242020-04-16 22:10:49 +0200527 endtry # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100528 assert_equal(['1', 'wrong', '3'], l)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200529
Bram Moolenaare8593122020-07-18 15:17:02 +0200530 l = []
531 try
532 try
533 add(l, '1')
534 throw 'wrong'
535 add(l, '2')
536 catch /right/
537 add(l, v:exception)
538 endtry
539 catch /wrong/
540 add(l, 'caught')
541 finally
542 add(l, 'finally')
543 endtry
544 assert_equal(['1', 'caught', 'finally'], l)
545
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200546 let n: number
547 try
548 n = l[3]
549 catch /E684:/
550 n = 99
551 endtry
552 assert_equal(99, n)
553
554 try
555 n = g:astring[3]
556 catch /E714:/
557 n = 77
558 endtry
559 assert_equal(77, n)
560
561 try
562 n = l[g:astring]
563 catch /E39:/
564 n = 77
565 endtry
566 assert_equal(77, n)
567
568 try
569 n = s:does_not_exist
570 catch /E121:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200571 n = 111
572 endtry
573 assert_equal(111, n)
574
575 try
576 n = g:does_not_exist
577 catch /E121:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200578 n = 121
579 endtry
580 assert_equal(121, n)
581
582 let d = #{one: 1}
583 try
584 n = d[g:astring]
585 catch /E716:/
586 n = 222
587 endtry
588 assert_equal(222, n)
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200589
590 try
591 n = -g:astring
592 catch /E39:/
593 n = 233
594 endtry
595 assert_equal(233, n)
596
597 try
598 n = +g:astring
599 catch /E1030:/
600 n = 244
601 endtry
602 assert_equal(244, n)
603
604 try
605 n = +g:alist
606 catch /E745:/
607 n = 255
608 endtry
609 assert_equal(255, n)
610
611 let nd: dict<any>
612 try
613 nd = {g:anumber: 1}
614 catch /E1029:/
615 n = 266
616 endtry
617 assert_equal(266, n)
618
619 try
620 [n] = [1, 2, 3]
621 catch /E1093:/
622 n = 277
623 endtry
624 assert_equal(277, n)
625
Bram Moolenaare8593122020-07-18 15:17:02 +0200626 try
627 &ts = g:astring
628 catch /E1029:/
629 n = 288
630 endtry
631 assert_equal(288, n)
632
633 try
634 &backspace = 'asdf'
635 catch /E474:/
636 n = 299
637 endtry
638 assert_equal(299, n)
639
640 l = [1]
641 try
642 l[3] = 3
643 catch /E684:/
644 n = 300
645 endtry
646 assert_equal(300, n)
647
648 try
649 d[''] = 3
650 catch /E713:/
651 n = 311
652 endtry
653 assert_equal(311, n)
654
655 try
656 unlet g:does_not_exist
657 catch /E108:/
658 n = 322
659 endtry
660 assert_equal(322, n)
661
662 try
663 d = {'text': 1, g:astring: 2}
664 catch /E721:/
665 n = 333
666 endtry
667 assert_equal(333, n)
668
669 try
670 l = DeletedFunc()
671 catch /E933:/
672 n = 344
673 endtry
674 assert_equal(344, n)
Bram Moolenaard032f342020-07-18 18:13:02 +0200675
676 try
677 echo len(v:true)
678 catch /E701:/
679 n = 355
680 endtry
681 assert_equal(355, n)
682
683 let P = function('g:NoSuchFunc')
684 delfunc g:NoSuchFunc
685 try
686 echo P()
687 catch /E117:/
688 n = 366
689 endtry
690 assert_equal(366, n)
691
692 try
693 echo g:NoSuchFunc()
694 catch /E117:/
695 n = 377
696 endtry
697 assert_equal(377, n)
698
699 try
700 echo g:alist + 4
701 catch /E745:/
702 n = 388
703 endtry
704 assert_equal(388, n)
705
706 try
707 echo 4 + g:alist
708 catch /E745:/
709 n = 399
710 endtry
711 assert_equal(399, n)
712
713 try
714 echo g:alist.member
715 catch /E715:/
716 n = 400
717 endtry
718 assert_equal(400, n)
719
720 try
721 echo d.member
722 catch /E716:/
723 n = 411
724 endtry
725 assert_equal(411, n)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100726enddef
727
Bram Moolenaare8593122020-07-18 15:17:02 +0200728def DeletedFunc(): list<any>
729 return ['delete me']
730enddef
731defcompile
732delfunc DeletedFunc
733
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100734def ThrowFromDef()
Bram Moolenaara72cfb82020-04-23 17:07:30 +0200735 throw "getout" # comment
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100736enddef
737
738func CatchInFunc()
739 try
740 call ThrowFromDef()
741 catch
742 let g:thrown_func = v:exception
743 endtry
744endfunc
745
746def CatchInDef()
747 try
748 ThrowFromDef()
749 catch
750 g:thrown_def = v:exception
751 endtry
752enddef
753
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100754def ReturnFinally(): string
755 try
756 return 'intry'
757 finally
758 g:in_finally = 'finally'
759 endtry
760 return 'end'
761enddef
762
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100763def Test_try_catch_nested()
764 CatchInFunc()
765 assert_equal('getout', g:thrown_func)
766
767 CatchInDef()
768 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100769
770 assert_equal('intry', ReturnFinally())
771 assert_equal('finally', g:in_finally)
772enddef
773
774def Test_try_catch_match()
775 let seq = 'a'
776 try
777 throw 'something'
778 catch /nothing/
779 seq ..= 'x'
780 catch /some/
781 seq ..= 'b'
782 catch /asdf/
783 seq ..= 'x'
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200784 catch ?a\?sdf?
785 seq ..= 'y'
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100786 finally
787 seq ..= 'c'
788 endtry
789 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100790enddef
791
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200792def Test_try_catch_fails()
793 call CheckDefFailure(['catch'], 'E603:')
Bram Moolenaar6b7a0a82020-07-08 18:38:08 +0200794 call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200795 call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200796 call CheckDefFailure(['finally'], 'E606:')
797 call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
798 call CheckDefFailure(['endtry'], 'E602:')
799 call CheckDefFailure(['while 1', 'endtry'], 'E170:')
800 call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
801 call CheckDefFailure(['if 2', 'endtry'], 'E171:')
802 call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
803
Bram Moolenaara72cfb82020-04-23 17:07:30 +0200804 call CheckDefFailure(['throw'], 'E1015:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200805 call CheckDefFailure(['throw xxx'], 'E1001:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200806enddef
807
Bram Moolenaar006ad482020-06-30 20:55:15 +0200808def Test_throw_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200809 # only checks line continuation
Bram Moolenaar006ad482020-06-30 20:55:15 +0200810 let lines =<< trim END
811 vim9script
812 try
813 throw 'one'
814 .. 'two'
815 catch
816 assert_equal('onetwo', v:exception)
817 endtry
818 END
819 CheckScriptSuccess(lines)
820enddef
821
Bram Moolenaar37c83712020-06-30 21:18:36 +0200822def Test_cexpr_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200823 # only checks line continuation
Bram Moolenaar37c83712020-06-30 21:18:36 +0200824 set errorformat=File\ %f\ line\ %l
825 let lines =<< trim END
826 vim9script
827 cexpr 'File'
828 .. ' someFile' ..
829 ' line 19'
830 assert_equal(19, getqflist()[0].lnum)
831 END
832 CheckScriptSuccess(lines)
833 set errorformat&
834enddef
835
Bram Moolenaarb2097502020-07-19 17:17:02 +0200836def Test_list_vimscript()
837 # checks line continuation and comments
838 let lines =<< trim END
839 vim9script
840 let mylist = [
841 'one',
842 # comment
843 'two', # empty line follows
844
845 'three',
846 ]
847 assert_equal(['one', 'two', 'three'], mylist)
848 END
849 CheckScriptSuccess(lines)
850enddef
851
Bram Moolenaar2a1381c2020-05-05 23:32:58 +0200852if has('channel')
853 let someJob = test_null_job()
Bram Moolenaar40ee4662020-05-05 22:08:26 +0200854
Bram Moolenaar2a1381c2020-05-05 23:32:58 +0200855 def FuncWithError()
856 echomsg g:someJob
857 enddef
Bram Moolenaar40ee4662020-05-05 22:08:26 +0200858
Bram Moolenaar2a1381c2020-05-05 23:32:58 +0200859 func Test_convert_emsg_to_exception()
860 try
861 call FuncWithError()
862 catch
863 call assert_match('Vim:E908:', v:exception)
864 endtry
865 endfunc
866endif
Bram Moolenaar40ee4662020-05-05 22:08:26 +0200867
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100868let s:export_script_lines =<< trim END
869 vim9script
870 let name: string = 'bob'
871 def Concat(arg: string): string
872 return name .. arg
873 enddef
Bram Moolenaar227a69d2020-05-15 18:17:28 +0200874 g:result = Concat('bie')
875 g:localname = name
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100876
877 export const CONST = 1234
878 export let exported = 9876
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100879 export let exp_name = 'John'
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100880 export def Exported(): string
881 return 'Exported'
882 enddef
883END
884
Bram Moolenaar5269bd22020-03-09 19:25:27 +0100885def Test_vim9_import_export()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100886 let import_script_lines =<< trim END
887 vim9script
888 import {exported, Exported} from './Xexport.vim'
889 g:imported = exported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100890 exported += 3
891 g:imported_added = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100892 g:imported_func = Exported()
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100893
894 import {exp_name} from './Xexport.vim'
895 g:imported_name = exp_name
896 exp_name ..= ' Doe'
897 g:imported_name_appended = exp_name
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100898 g:imported_later = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100899 END
900
901 writefile(import_script_lines, 'Ximport.vim')
902 writefile(s:export_script_lines, 'Xexport.vim')
903
904 source Ximport.vim
905
906 assert_equal('bobbie', g:result)
907 assert_equal('bob', g:localname)
908 assert_equal(9876, g:imported)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100909 assert_equal(9879, g:imported_added)
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100910 assert_equal(9879, g:imported_later)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100911 assert_equal('Exported', g:imported_func)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100912 assert_equal('John', g:imported_name)
913 assert_equal('John Doe', g:imported_name_appended)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100914 assert_false(exists('g:name'))
915
916 unlet g:result
917 unlet g:localname
918 unlet g:imported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100919 unlet g:imported_added
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100920 unlet g:imported_later
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100921 unlet g:imported_func
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100922 unlet g:imported_name g:imported_name_appended
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100923 delete('Ximport.vim')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100924
Bram Moolenaar1c991142020-07-04 13:15:31 +0200925 # similar, with line breaks
926 let import_line_break_script_lines =<< trim END
927 vim9script
928 import {
929 exported,
930 Exported,
931 }
932 from
933 './Xexport.vim'
934 g:imported = exported
935 exported += 5
936 g:imported_added = exported
937 g:imported_func = Exported()
938 END
939 writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
940 source Ximport_lbr.vim
941
942 assert_equal(9876, g:imported)
943 assert_equal(9881, g:imported_added)
944 assert_equal('Exported', g:imported_func)
945
946 # exported script not sourced again
947 assert_false(exists('g:result'))
948 unlet g:imported
949 unlet g:imported_added
950 unlet g:imported_func
951 delete('Ximport_lbr.vim')
952
953 # import inside :def function
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100954 let import_in_def_lines =<< trim END
955 vim9script
956 def ImportInDef()
957 import exported from './Xexport.vim'
958 g:imported = exported
959 exported += 7
960 g:imported_added = exported
961 enddef
962 ImportInDef()
963 END
964 writefile(import_in_def_lines, 'Ximport2.vim')
965 source Ximport2.vim
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200966 # TODO: this should be 9879
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100967 assert_equal(9876, g:imported)
968 assert_equal(9883, g:imported_added)
969 unlet g:imported
970 unlet g:imported_added
971 delete('Ximport2.vim')
972
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100973 let import_star_as_lines =<< trim END
974 vim9script
975 import * as Export from './Xexport.vim'
976 def UseExport()
977 g:imported = Export.exported
978 enddef
979 UseExport()
980 END
981 writefile(import_star_as_lines, 'Ximport.vim')
982 source Ximport.vim
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100983 assert_equal(9883, g:imported)
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100984
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100985 let import_star_as_lines_no_dot =<< trim END
986 vim9script
987 import * as Export from './Xexport.vim'
988 def Func()
989 let dummy = 1
990 let imported = Export + dummy
991 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +0200992 defcompile
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100993 END
994 writefile(import_star_as_lines_no_dot, 'Ximport.vim')
995 assert_fails('source Ximport.vim', 'E1060:')
996
997 let import_star_as_lines_dot_space =<< trim END
998 vim9script
999 import * as Export from './Xexport.vim'
1000 def Func()
1001 let imported = Export . exported
1002 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +02001003 defcompile
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001004 END
1005 writefile(import_star_as_lines_dot_space, 'Ximport.vim')
1006 assert_fails('source Ximport.vim', 'E1074:')
1007
1008 let import_star_as_lines_missing_name =<< trim END
1009 vim9script
1010 import * as Export from './Xexport.vim'
1011 def Func()
1012 let imported = Export.
1013 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +02001014 defcompile
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001015 END
1016 writefile(import_star_as_lines_missing_name, 'Ximport.vim')
1017 assert_fails('source Ximport.vim', 'E1048:')
1018
Bram Moolenaar1c991142020-07-04 13:15:31 +02001019 let import_star_as_lbr_lines =<< trim END
1020 vim9script
1021 import *
1022 as Export
1023 from
1024 './Xexport.vim'
1025 def UseExport()
1026 g:imported = Export.exported
1027 enddef
1028 UseExport()
1029 END
1030 writefile(import_star_as_lbr_lines, 'Ximport.vim')
1031 source Ximport.vim
1032 assert_equal(9883, g:imported)
1033
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001034 let import_star_lines =<< trim END
1035 vim9script
1036 import * from './Xexport.vim'
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001037 END
1038 writefile(import_star_lines, 'Ximport.vim')
1039 assert_fails('source Ximport.vim', 'E1045:')
1040
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001041 # try to import something that exists but is not exported
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001042 let import_not_exported_lines =<< trim END
1043 vim9script
1044 import name from './Xexport.vim'
1045 END
1046 writefile(import_not_exported_lines, 'Ximport.vim')
1047 assert_fails('source Ximport.vim', 'E1049:')
1048
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001049 # try to import something that is already defined
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001050 let import_already_defined =<< trim END
1051 vim9script
1052 let exported = 'something'
1053 import exported from './Xexport.vim'
1054 END
1055 writefile(import_already_defined, 'Ximport.vim')
1056 assert_fails('source Ximport.vim', 'E1073:')
1057
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001058 # try to import something that is already defined
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001059 import_already_defined =<< trim END
1060 vim9script
1061 let exported = 'something'
1062 import * as exported from './Xexport.vim'
1063 END
1064 writefile(import_already_defined, 'Ximport.vim')
1065 assert_fails('source Ximport.vim', 'E1073:')
1066
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001067 # try to import something that is already defined
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001068 import_already_defined =<< trim END
1069 vim9script
1070 let exported = 'something'
1071 import {exported} from './Xexport.vim'
1072 END
1073 writefile(import_already_defined, 'Ximport.vim')
1074 assert_fails('source Ximport.vim', 'E1073:')
1075
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001076 # import a very long name, requires making a copy
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001077 let import_long_name_lines =<< trim END
1078 vim9script
1079 import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1080 END
1081 writefile(import_long_name_lines, 'Ximport.vim')
1082 assert_fails('source Ximport.vim', 'E1048:')
1083
1084 let import_no_from_lines =<< trim END
1085 vim9script
1086 import name './Xexport.vim'
1087 END
1088 writefile(import_no_from_lines, 'Ximport.vim')
1089 assert_fails('source Ximport.vim', 'E1070:')
1090
1091 let import_invalid_string_lines =<< trim END
1092 vim9script
1093 import name from Xexport.vim
1094 END
1095 writefile(import_invalid_string_lines, 'Ximport.vim')
1096 assert_fails('source Ximport.vim', 'E1071:')
1097
1098 let import_wrong_name_lines =<< trim END
1099 vim9script
1100 import name from './XnoExport.vim'
1101 END
1102 writefile(import_wrong_name_lines, 'Ximport.vim')
1103 assert_fails('source Ximport.vim', 'E1053:')
1104
1105 let import_missing_comma_lines =<< trim END
1106 vim9script
1107 import {exported name} from './Xexport.vim'
1108 END
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001109 writefile(import_missing_comma_lines, 'Ximport3.vim')
1110 assert_fails('source Ximport3.vim', 'E1046:')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001111
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001112 delete('Ximport.vim')
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001113 delete('Ximport3.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001114 delete('Xexport.vim')
1115
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001116 # Check that in a Vim9 script 'cpo' is set to the Vim default.
Bram Moolenaar750802b2020-02-23 18:08:33 +01001117 set cpo&vi
1118 let cpo_before = &cpo
1119 let lines =<< trim END
1120 vim9script
1121 g:cpo_in_vim9script = &cpo
1122 END
1123 writefile(lines, 'Xvim9_script')
1124 source Xvim9_script
1125 assert_equal(cpo_before, &cpo)
1126 set cpo&vim
1127 assert_equal(&cpo, g:cpo_in_vim9script)
1128 delete('Xvim9_script')
1129enddef
1130
1131def Test_vim9script_fails()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001132 CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
1133 CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +01001134 CheckScriptFailure(['export let some = 123'], 'E1042:')
Bram Moolenaar9721fb42020-06-11 23:10:46 +02001135 CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +02001136 CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
Bram Moolenaar750802b2020-02-23 18:08:33 +01001137 CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1138
Bram Moolenaarc785b9a2020-06-19 18:34:15 +02001139 CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:')
1140 CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1141
Bram Moolenaar750802b2020-02-23 18:08:33 +01001142 assert_fails('vim9script', 'E1038')
Bram Moolenaara26b9702020-04-18 19:53:28 +02001143 assert_fails('export something', 'E1043')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001144enddef
1145
Bram Moolenaarf7d267e2020-06-17 12:04:54 +02001146func Test_import_fails_without_script()
Bram Moolenaar101f4812020-06-16 23:18:51 +02001147 CheckRunVimInTerminal
1148
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001149 " call indirectly to avoid compilation error for missing functions
Bram Moolenaarc620c052020-07-08 15:16:19 +02001150 call Run_Test_import_fails_on_command_line()
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001151endfunc
1152
Bram Moolenaarc620c052020-07-08 15:16:19 +02001153def Run_Test_import_fails_on_command_line()
Bram Moolenaar101f4812020-06-16 23:18:51 +02001154 let export =<< trim END
1155 vim9script
1156 export def Foo(): number
1157 return 0
1158 enddef
1159 END
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001160 writefile(export, 'Xexport.vim')
Bram Moolenaar101f4812020-06-16 23:18:51 +02001161
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001162 let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{
1163 rows: 6, wait_for_ruler: 0})
1164 WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
Bram Moolenaar101f4812020-06-16 23:18:51 +02001165
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001166 delete('Xexport.vim')
1167 StopVimInTerminal(buf)
1168enddef
Bram Moolenaar101f4812020-06-16 23:18:51 +02001169
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001170def Test_vim9script_reload_import()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001171 let lines =<< trim END
1172 vim9script
1173 const var = ''
1174 let valone = 1234
1175 def MyFunc(arg: string)
1176 valone = 5678
1177 enddef
1178 END
1179 let morelines =<< trim END
1180 let valtwo = 222
1181 export def GetValtwo(): number
1182 return valtwo
1183 enddef
1184 END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001185 writefile(lines + morelines, 'Xreload.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001186 source Xreload.vim
1187 source Xreload.vim
1188 source Xreload.vim
1189
1190 let testlines =<< trim END
1191 vim9script
1192 def TheFunc()
1193 import GetValtwo from './Xreload.vim'
1194 assert_equal(222, GetValtwo())
1195 enddef
1196 TheFunc()
1197 END
1198 writefile(testlines, 'Ximport.vim')
1199 source Ximport.vim
1200
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001201 # Test that when not using "morelines" GetValtwo() and valtwo are still
1202 # defined, because import doesn't reload a script.
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001203 writefile(lines, 'Xreload.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001204 source Ximport.vim
1205
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001206 # cannot declare a var twice
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001207 lines =<< trim END
1208 vim9script
1209 let valone = 1234
1210 let valone = 5678
1211 END
1212 writefile(lines, 'Xreload.vim')
1213 assert_fails('source Xreload.vim', 'E1041:')
1214
1215 delete('Xreload.vim')
1216 delete('Ximport.vim')
1217enddef
1218
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001219" Not exported function that is referenced needs to be accessed by the
1220" script-local name.
1221def Test_vim9script_funcref()
1222 let sortlines =<< trim END
1223 vim9script
1224 def Compare(i1: number, i2: number): number
Bram Moolenaarbed36b92020-07-07 23:31:36 +02001225 return i2 - i1
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001226 enddef
1227
1228 export def FastSort(): list<number>
1229 return range(5)->sort(Compare)
1230 enddef
1231 END
1232 writefile(sortlines, 'Xsort.vim')
1233
1234 let lines =<< trim END
1235 vim9script
1236 import FastSort from './Xsort.vim'
1237 def Test()
1238 g:result = FastSort()
1239 enddef
1240 Test()
1241 END
1242 writefile(lines, 'Xscript.vim')
1243
1244 source Xscript.vim
1245 assert_equal([4, 3, 2, 1, 0], g:result)
1246
1247 unlet g:result
1248 delete('Xsort.vim')
1249 delete('Xscript.vim')
1250enddef
1251
Bram Moolenaarc620c052020-07-08 15:16:19 +02001252" Check that when searcing for "FilterFunc" it doesn't find the import in the
1253" script where FastFilter() is called from.
1254def Test_vim9script_funcref_other_script()
1255 let filterLines =<< trim END
1256 vim9script
1257 export def FilterFunc(idx: number, val: number): bool
1258 return idx % 2 == 1
1259 enddef
1260 export def FastFilter(): list<number>
1261 return range(10)->filter('FilterFunc')
1262 enddef
1263 END
1264 writefile(filterLines, 'Xfilter.vim')
1265
1266 let lines =<< trim END
1267 vim9script
1268 import {FilterFunc, FastFilter} from './Xfilter.vim'
1269 def Test()
1270 let x: list<number> = FastFilter()
1271 enddef
1272 Test()
1273 END
1274 writefile(lines, 'Ximport.vim')
1275 assert_fails('source Ximport.vim', 'E121:')
1276
1277 delete('Xfilter.vim')
1278 delete('Ximport.vim')
1279enddef
1280
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001281def Test_vim9script_reload_delfunc()
1282 let first_lines =<< trim END
1283 vim9script
1284 def FuncYes(): string
1285 return 'yes'
1286 enddef
1287 END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001288 let withno_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001289 def FuncNo(): string
1290 return 'no'
1291 enddef
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001292 def g:DoCheck(no_exists: bool)
1293 assert_equal('yes', FuncYes())
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001294 assert_equal('no', FuncNo())
1295 enddef
1296 END
1297 let nono_lines =<< trim END
1298 def g:DoCheck(no_exists: bool)
1299 assert_equal('yes', FuncYes())
1300 assert_fails('call FuncNo()', 'E117:')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001301 enddef
1302 END
1303
1304 # FuncNo() is defined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001305 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001306 source Xreloaded.vim
1307 g:DoCheck(true)
1308
1309 # FuncNo() is not redefined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001310 writefile(first_lines + nono_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001311 source Xreloaded.vim
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001312 g:DoCheck()
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001313
1314 # FuncNo() is back
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001315 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001316 source Xreloaded.vim
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001317 g:DoCheck()
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001318
1319 delete('Xreloaded.vim')
1320enddef
1321
Bram Moolenaar89483d42020-05-10 15:24:44 +02001322def Test_vim9script_reload_delvar()
1323 # write the script with a script-local variable
1324 let lines =<< trim END
1325 vim9script
1326 let var = 'string'
1327 END
1328 writefile(lines, 'XreloadVar.vim')
1329 source XreloadVar.vim
1330
1331 # now write the script using the same variable locally - works
1332 lines =<< trim END
1333 vim9script
1334 def Func()
1335 let var = 'string'
1336 enddef
1337 END
1338 writefile(lines, 'XreloadVar.vim')
1339 source XreloadVar.vim
1340
1341 delete('XreloadVar.vim')
1342enddef
1343
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001344def Test_import_absolute()
1345 let import_lines = [
Bram Moolenaare6085c52020-04-12 20:19:16 +02001346 'vim9script',
1347 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1348 'def UseExported()',
1349 ' g:imported_abs = exported',
1350 ' exported = 8888',
1351 ' g:imported_after = exported',
1352 'enddef',
1353 'UseExported()',
1354 'g:import_disassembled = execute("disass UseExported")',
1355 ]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001356 writefile(import_lines, 'Ximport_abs.vim')
1357 writefile(s:export_script_lines, 'Xexport_abs.vim')
1358
1359 source Ximport_abs.vim
1360
1361 assert_equal(9876, g:imported_abs)
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +01001362 assert_equal(8888, g:imported_after)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001363 assert_match('<SNR>\d\+_UseExported.*' ..
1364 'g:imported_abs = exported.*' ..
1365 '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1366 '1 STOREG g:imported_abs.*' ..
1367 'exported = 8888.*' ..
1368 '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1369 'g:imported_after = exported.*' ..
1370 '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1371 '5 STOREG g:imported_after.*',
Bram Moolenaare6085c52020-04-12 20:19:16 +02001372 g:import_disassembled)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001373 unlet g:imported_abs
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +01001374 unlet g:import_disassembled
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001375
1376 delete('Ximport_abs.vim')
1377 delete('Xexport_abs.vim')
1378enddef
1379
1380def Test_import_rtp()
1381 let import_lines = [
Bram Moolenaare6085c52020-04-12 20:19:16 +02001382 'vim9script',
1383 'import exported from "Xexport_rtp.vim"',
1384 'g:imported_rtp = exported',
1385 ]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001386 writefile(import_lines, 'Ximport_rtp.vim')
1387 mkdir('import')
1388 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
1389
1390 let save_rtp = &rtp
1391 &rtp = getcwd()
1392 source Ximport_rtp.vim
1393 &rtp = save_rtp
1394
1395 assert_equal(9876, g:imported_rtp)
1396 unlet g:imported_rtp
1397
1398 delete('Ximport_rtp.vim')
Bram Moolenaar89483d42020-05-10 15:24:44 +02001399 delete('import', 'rf')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001400enddef
1401
Bram Moolenaar25e0f582020-05-25 22:36:50 +02001402def Test_import_compile_error()
1403 let export_lines = [
1404 'vim9script',
1405 'export def ExpFunc(): string',
1406 ' return notDefined',
1407 'enddef',
1408 ]
1409 writefile(export_lines, 'Xexported.vim')
1410
1411 let import_lines = [
1412 'vim9script',
1413 'import ExpFunc from "./Xexported.vim"',
1414 'def ImpFunc()',
1415 ' echo ExpFunc()',
1416 'enddef',
1417 'defcompile',
1418 ]
1419 writefile(import_lines, 'Ximport.vim')
1420
1421 try
1422 source Ximport.vim
1423 catch /E1001/
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001424 # Error should be fore the Xexported.vim file.
Bram Moolenaar25e0f582020-05-25 22:36:50 +02001425 assert_match('E1001: variable not found: notDefined', v:exception)
1426 assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
1427 endtry
1428
1429 delete('Xexported.vim')
1430 delete('Ximport.vim')
1431enddef
1432
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001433def Test_fixed_size_list()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001434 # will be allocated as one piece of memory, check that changes work
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001435 let l = [1, 2, 3, 4]
1436 l->remove(0)
1437 l->add(5)
1438 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001439 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001440enddef
1441
Bram Moolenaar158906c2020-02-06 20:39:45 +01001442def IfElse(what: number): string
1443 let res = ''
1444 if what == 1
1445 res = "one"
1446 elseif what == 2
1447 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001448 else
Bram Moolenaar158906c2020-02-06 20:39:45 +01001449 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001450 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +01001451 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001452enddef
1453
Bram Moolenaar158906c2020-02-06 20:39:45 +01001454def Test_if_elseif_else()
1455 assert_equal('one', IfElse(1))
1456 assert_equal('two', IfElse(2))
1457 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001458enddef
1459
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001460def Test_if_elseif_else_fails()
1461 call CheckDefFailure(['elseif true'], 'E582:')
1462 call CheckDefFailure(['else'], 'E581:')
1463 call CheckDefFailure(['endif'], 'E580:')
1464 call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001465 call CheckDefFailure(['if true', 'echo 1'], 'E171:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001466enddef
1467
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001468let g:bool_true = v:true
1469let g:bool_false = v:false
1470
1471def Test_if_const_expr()
1472 let res = false
1473 if true ? true : false
1474 res = true
1475 endif
1476 assert_equal(true, res)
1477
Bram Moolenaar585fea72020-04-02 22:33:21 +02001478 g:glob = 2
1479 if false
Bram Moolenaar67979662020-06-20 22:50:47 +02001480 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001481 endif
1482 assert_equal(2, g:glob)
1483 if true
Bram Moolenaar67979662020-06-20 22:50:47 +02001484 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001485 endif
1486 assert_equal(3, g:glob)
1487
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001488 res = false
1489 if g:bool_true ? true : false
1490 res = true
1491 endif
1492 assert_equal(true, res)
1493
1494 res = false
1495 if true ? g:bool_true : false
1496 res = true
1497 endif
1498 assert_equal(true, res)
1499
1500 res = false
1501 if true ? true : g:bool_false
1502 res = true
1503 endif
1504 assert_equal(true, res)
1505
1506 res = false
1507 if true ? false : true
1508 res = true
1509 endif
1510 assert_equal(false, res)
1511
1512 res = false
1513 if false ? false : true
1514 res = true
1515 endif
1516 assert_equal(true, res)
1517
1518 res = false
1519 if false ? true : false
1520 res = true
1521 endif
1522 assert_equal(false, res)
1523
1524 res = false
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001525 if has('xyz') ? true : false
1526 res = true
1527 endif
1528 assert_equal(false, res)
1529
1530 res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001531 if true && true
1532 res = true
1533 endif
1534 assert_equal(true, res)
1535
1536 res = false
1537 if true && false
1538 res = true
1539 endif
1540 assert_equal(false, res)
1541
1542 res = false
1543 if g:bool_true && false
1544 res = true
1545 endif
1546 assert_equal(false, res)
1547
1548 res = false
1549 if true && g:bool_false
1550 res = true
1551 endif
1552 assert_equal(false, res)
1553
1554 res = false
1555 if false && false
1556 res = true
1557 endif
1558 assert_equal(false, res)
1559
1560 res = false
1561 if true || false
1562 res = true
1563 endif
1564 assert_equal(true, res)
1565
1566 res = false
1567 if g:bool_true || false
1568 res = true
1569 endif
1570 assert_equal(true, res)
1571
1572 res = false
1573 if true || g:bool_false
1574 res = true
1575 endif
1576 assert_equal(true, res)
1577
1578 res = false
1579 if false || false
1580 res = true
1581 endif
1582 assert_equal(false, res)
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02001583enddef
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001584
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02001585def Test_if_const_expr_fails()
1586 call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1587 call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001588 call CheckDefFailure(["if has('aaa'"], 'E110:')
1589 call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001590enddef
1591
Bram Moolenaar72abcf42020-06-18 18:26:24 +02001592def RunNested(i: number): number
1593 let x: number = 0
1594 if i % 2
1595 if 1
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001596 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02001597 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001598 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02001599 endif
1600 x += 1
1601 else
1602 x += 1000
1603 endif
1604 return x
1605enddef
1606
1607def Test_nested_if()
1608 assert_equal(1, RunNested(1))
1609 assert_equal(1000, RunNested(2))
1610enddef
1611
Bram Moolenaarad39c092020-02-26 18:23:43 +01001612def Test_execute_cmd()
1613 new
1614 setline(1, 'default')
1615 execute 'call setline(1, "execute-string")'
1616 assert_equal('execute-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001617
1618 execute "call setline(1, 'execute-string')"
1619 assert_equal('execute-string', getline(1))
1620
Bram Moolenaarad39c092020-02-26 18:23:43 +01001621 let cmd1 = 'call setline(1,'
1622 let cmd2 = '"execute-var")'
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001623 execute cmd1 cmd2 # comment
Bram Moolenaarad39c092020-02-26 18:23:43 +01001624 assert_equal('execute-var', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001625
Bram Moolenaarad39c092020-02-26 18:23:43 +01001626 execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1627 assert_equal('execute-var-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001628
Bram Moolenaarad39c092020-02-26 18:23:43 +01001629 let cmd_first = 'call '
1630 let cmd_last = 'setline(1, "execute-var-var")'
1631 execute cmd_first .. cmd_last
1632 assert_equal('execute-var-var', getline(1))
1633 bwipe!
Bram Moolenaar585fea72020-04-02 22:33:21 +02001634
1635 call CheckDefFailure(['execute xxx'], 'E1001:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001636 call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
Bram Moolenaarad39c092020-02-26 18:23:43 +01001637enddef
1638
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001639def Test_execute_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001640 # only checks line continuation
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001641 let lines =<< trim END
1642 vim9script
1643 execute 'g:someVar'
1644 .. ' = ' ..
1645 '28'
1646 assert_equal(28, g:someVar)
1647 unlet g:someVar
1648 END
1649 CheckScriptSuccess(lines)
1650enddef
1651
Bram Moolenaarad39c092020-02-26 18:23:43 +01001652def Test_echo_cmd()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001653 echo 'some' # comment
Bram Moolenaar585fea72020-04-02 22:33:21 +02001654 echon 'thing'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001655 assert_match('^something$', Screenline(&lines))
1656
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001657 echo "some" # comment
1658 echon "thing"
1659 assert_match('^something$', Screenline(&lines))
1660
Bram Moolenaarad39c092020-02-26 18:23:43 +01001661 let str1 = 'some'
1662 let str2 = 'more'
1663 echo str1 str2
1664 assert_match('^some more$', Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001665
1666 call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
Bram Moolenaarad39c092020-02-26 18:23:43 +01001667enddef
1668
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001669def Test_echomsg_cmd()
1670 echomsg 'some' 'more' # comment
1671 assert_match('^some more$', Screenline(&lines))
1672 echo 'clear'
Bram Moolenaardf069ee2020-06-22 23:02:51 +02001673 :1messages
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001674 assert_match('^some more$', Screenline(&lines))
1675
1676 call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1677enddef
1678
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001679def Test_echomsg_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001680 # only checks line continuation
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001681 let lines =<< trim END
1682 vim9script
1683 echomsg 'here'
1684 .. ' is ' ..
1685 'a message'
1686 assert_match('^here is a message$', Screenline(&lines))
1687 END
1688 CheckScriptSuccess(lines)
1689enddef
1690
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001691def Test_echoerr_cmd()
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001692 try
1693 echoerr 'something' 'wrong' # comment
1694 catch
1695 assert_match('something wrong', v:exception)
1696 endtry
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001697enddef
1698
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001699def Test_echoerr_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001700 # only checks line continuation
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001701 let lines =<< trim END
1702 vim9script
1703 try
1704 echoerr 'this'
1705 .. ' is ' ..
1706 'wrong'
1707 catch
1708 assert_match('this is wrong', v:exception)
1709 endtry
1710 END
1711 CheckScriptSuccess(lines)
1712enddef
1713
Bram Moolenaar41fe0612020-03-01 16:22:40 +01001714def Test_for_outside_of_function()
1715 let lines =<< trim END
1716 vim9script
1717 new
1718 for var in range(0, 3)
1719 append(line('$'), var)
1720 endfor
1721 assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
1722 bwipe!
1723 END
1724 writefile(lines, 'Xvim9for.vim')
1725 source Xvim9for.vim
1726 delete('Xvim9for.vim')
1727enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001728
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001729def Test_for_loop()
1730 let result = ''
1731 for cnt in range(7)
1732 if cnt == 4
1733 break
1734 endif
1735 if cnt == 2
1736 continue
1737 endif
1738 result ..= cnt .. '_'
1739 endfor
1740 assert_equal('0_1_3_', result)
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001741
1742 let concat = ''
1743 for str in eval('["one", "two"]')
1744 concat ..= str
1745 endfor
1746 assert_equal('onetwo', concat)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001747enddef
1748
1749def Test_for_loop_fails()
Bram Moolenaar675f7162020-04-12 22:53:54 +02001750 CheckDefFailure(['for # in range(5)'], 'E690:')
1751 CheckDefFailure(['for i In range(5)'], 'E690:')
1752 CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
Bram Moolenaar822ba242020-05-24 23:00:18 +02001753 CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001754 CheckDefFailure(['for i in "text"'], 'E1013:')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001755 CheckDefFailure(['for i in xxx'], 'E1001:')
1756 CheckDefFailure(['endfor'], 'E588:')
1757 CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001758enddef
1759
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01001760def Test_while_loop()
1761 let result = ''
1762 let cnt = 0
1763 while cnt < 555
1764 if cnt == 3
1765 break
1766 endif
1767 cnt += 1
1768 if cnt == 2
1769 continue
1770 endif
1771 result ..= cnt .. '_'
1772 endwhile
1773 assert_equal('1_3_', result)
1774enddef
1775
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001776def Test_while_loop_fails()
Bram Moolenaar675f7162020-04-12 22:53:54 +02001777 CheckDefFailure(['while xxx'], 'E1001:')
1778 CheckDefFailure(['endwhile'], 'E588:')
1779 CheckDefFailure(['continue'], 'E586:')
1780 CheckDefFailure(['if true', 'continue'], 'E586:')
1781 CheckDefFailure(['break'], 'E587:')
1782 CheckDefFailure(['if true', 'break'], 'E587:')
1783 CheckDefFailure(['while 1', 'echo 3'], 'E170:')
Bram Moolenaarbd5da372020-03-31 23:13:10 +02001784enddef
1785
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001786def Test_interrupt_loop()
Bram Moolenaar97acfc72020-03-22 13:44:28 +01001787 let caught = false
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001788 let x = 0
Bram Moolenaar97acfc72020-03-22 13:44:28 +01001789 try
1790 while 1
1791 x += 1
1792 if x == 100
1793 feedkeys("\<C-C>", 'Lt')
1794 endif
1795 endwhile
1796 catch
1797 caught = true
1798 assert_equal(100, x)
1799 endtry
1800 assert_true(caught, 'should have caught an exception')
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001801enddef
Bram Moolenaar20431c92020-03-20 18:39:46 +01001802
Bram Moolenaar4fdae992020-04-12 16:38:57 +02001803def Test_automatic_line_continuation()
1804 let mylist = [
1805 'one',
1806 'two',
1807 'three',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001808 ] # comment
Bram Moolenaar4fdae992020-04-12 16:38:57 +02001809 assert_equal(['one', 'two', 'three'], mylist)
1810
1811 let mydict = {
1812 'one': 1,
1813 'two': 2,
1814 'three':
1815 3,
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001816 } # comment
Bram Moolenaar4fdae992020-04-12 16:38:57 +02001817 assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
1818 mydict = #{
Bram Moolenaar2c330432020-04-13 14:41:35 +02001819 one: 1, # comment
1820 two: # comment
1821 2, # comment
1822 three: 3 # comment
1823 }
1824 assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1825 mydict = #{
1826 one: 1,
1827 two:
1828 2,
1829 three: 3
Bram Moolenaar4fdae992020-04-12 16:38:57 +02001830 }
1831 assert_equal(#{one: 1, two: 2, three: 3}, mydict)
Bram Moolenaare6085c52020-04-12 20:19:16 +02001832
1833 assert_equal(
1834 ['one', 'two', 'three'],
1835 split('one two three')
1836 )
Bram Moolenaar4fdae992020-04-12 16:38:57 +02001837enddef
1838
Bram Moolenaar7a092242020-04-16 22:10:49 +02001839def Test_vim9_comment()
1840 CheckScriptSuccess([
1841 'vim9script',
1842 '# something',
1843 ])
1844 CheckScriptFailure([
1845 'vim9script',
1846 ':# something',
1847 ], 'E488:')
1848 CheckScriptFailure([
1849 '# something',
1850 ], 'E488:')
1851 CheckScriptFailure([
1852 ':# something',
1853 ], 'E488:')
1854
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02001855 { # block start
1856 } # block end
1857 CheckDefFailure([
1858 '{# comment',
1859 ], 'E488:')
1860 CheckDefFailure([
1861 '{',
1862 '}# comment',
1863 ], 'E488:')
1864
1865 echo "yes" # comment
1866 CheckDefFailure([
1867 'echo "yes"# comment',
1868 ], 'E488:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02001869 CheckScriptSuccess([
1870 'vim9script',
1871 'echo "yes" # something',
1872 ])
1873 CheckScriptFailure([
1874 'vim9script',
1875 'echo "yes"# something',
1876 ], 'E121:')
1877 CheckScriptFailure([
1878 'vim9script',
1879 'echo# something',
1880 ], 'E121:')
1881 CheckScriptFailure([
1882 'echo "yes" # something',
1883 ], 'E121:')
1884
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02001885 exe "echo" # comment
1886 CheckDefFailure([
1887 'exe "echo"# comment',
1888 ], 'E488:')
1889 CheckScriptSuccess([
1890 'vim9script',
1891 'exe "echo" # something',
1892 ])
1893 CheckScriptFailure([
1894 'vim9script',
1895 'exe "echo"# something',
1896 ], 'E121:')
1897 CheckDefFailure([
1898 'exe # comment',
1899 ], 'E1015:')
1900 CheckScriptFailure([
1901 'vim9script',
1902 'exe# something',
1903 ], 'E121:')
1904 CheckScriptFailure([
1905 'exe "echo" # something',
1906 ], 'E121:')
1907
Bram Moolenaar7a092242020-04-16 22:10:49 +02001908 CheckDefFailure([
1909 'try# comment',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001910 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02001911 'catch',
1912 'endtry',
1913 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001914 CheckScriptFailure([
1915 'vim9script',
1916 'try# comment',
1917 'echo "yes"',
1918 ], 'E488:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02001919 CheckDefFailure([
1920 'try',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001921 ' throw#comment',
1922 'catch',
1923 'endtry',
1924 ], 'E1015:')
1925 CheckDefFailure([
1926 'try',
1927 ' throw "yes"#comment',
1928 'catch',
1929 'endtry',
1930 ], 'E488:')
1931 CheckDefFailure([
1932 'try',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001933 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02001934 'catch# comment',
1935 'endtry',
1936 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001937 CheckScriptFailure([
1938 'vim9script',
1939 'try',
1940 ' echo "yes"',
1941 'catch# comment',
1942 'endtry',
1943 ], 'E654:')
1944 CheckDefFailure([
1945 'try',
1946 ' echo "yes"',
1947 'catch /pat/# comment',
1948 'endtry',
1949 ], 'E488:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02001950 CheckDefFailure([
1951 'try',
1952 'echo "yes"',
1953 'catch',
1954 'endtry# comment',
1955 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001956 CheckScriptFailure([
1957 'vim9script',
1958 'try',
1959 ' echo "yes"',
1960 'catch',
1961 'endtry# comment',
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +02001962 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001963
1964 CheckScriptSuccess([
1965 'vim9script',
1966 'hi # comment',
1967 ])
1968 CheckScriptFailure([
1969 'vim9script',
1970 'hi# comment',
1971 ], 'E416:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02001972 CheckScriptSuccess([
1973 'vim9script',
1974 'hi Search # comment',
1975 ])
1976 CheckScriptFailure([
1977 'vim9script',
1978 'hi Search# comment',
1979 ], 'E416:')
1980 CheckScriptSuccess([
1981 'vim9script',
1982 'hi link This Search # comment',
1983 ])
1984 CheckScriptFailure([
1985 'vim9script',
1986 'hi link This That# comment',
1987 ], 'E413:')
1988 CheckScriptSuccess([
1989 'vim9script',
1990 'hi clear This # comment',
1991 'hi clear # comment',
1992 ])
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001993 # not tested, because it doesn't give an error but a warning:
1994 # hi clear This# comment',
Bram Moolenaar1966c242020-04-20 22:42:32 +02001995 CheckScriptFailure([
1996 'vim9script',
1997 'hi clear# comment',
1998 ], 'E416:')
1999
2000 CheckScriptSuccess([
2001 'vim9script',
2002 'hi Group term=bold',
2003 'match Group /todo/ # comment',
2004 ])
2005 CheckScriptFailure([
2006 'vim9script',
2007 'hi Group term=bold',
2008 'match Group /todo/# comment',
2009 ], 'E488:')
2010 CheckScriptSuccess([
2011 'vim9script',
2012 'match # comment',
2013 ])
2014 CheckScriptFailure([
2015 'vim9script',
2016 'match# comment',
2017 ], 'E475:')
2018 CheckScriptSuccess([
2019 'vim9script',
2020 'match none # comment',
2021 ])
2022 CheckScriptFailure([
2023 'vim9script',
2024 'match none# comment',
2025 ], 'E475:')
2026
2027 CheckScriptSuccess([
2028 'vim9script',
2029 'menutrans clear # comment',
2030 ])
2031 CheckScriptFailure([
2032 'vim9script',
2033 'menutrans clear# comment text',
2034 ], 'E474:')
2035
2036 CheckScriptSuccess([
2037 'vim9script',
2038 'syntax clear # comment',
2039 ])
2040 CheckScriptFailure([
2041 'vim9script',
2042 'syntax clear# comment text',
2043 ], 'E28:')
2044 CheckScriptSuccess([
2045 'vim9script',
2046 'syntax keyword Word some',
2047 'syntax clear Word # comment',
2048 ])
2049 CheckScriptFailure([
2050 'vim9script',
2051 'syntax keyword Word some',
2052 'syntax clear Word# comment text',
2053 ], 'E28:')
2054
2055 CheckScriptSuccess([
2056 'vim9script',
2057 'syntax list # comment',
2058 ])
2059 CheckScriptFailure([
2060 'vim9script',
2061 'syntax list# comment text',
2062 ], 'E28:')
2063
2064 CheckScriptSuccess([
2065 'vim9script',
2066 'syntax match Word /pat/ oneline # comment',
2067 ])
2068 CheckScriptFailure([
2069 'vim9script',
2070 'syntax match Word /pat/ oneline# comment',
2071 ], 'E475:')
2072
2073 CheckScriptSuccess([
2074 'vim9script',
2075 'syntax keyword Word word # comm[ent',
2076 ])
2077 CheckScriptFailure([
2078 'vim9script',
2079 'syntax keyword Word word# comm[ent',
2080 ], 'E789:')
2081
2082 CheckScriptSuccess([
2083 'vim9script',
2084 'syntax match Word /pat/ # comment',
2085 ])
2086 CheckScriptFailure([
2087 'vim9script',
2088 'syntax match Word /pat/# comment',
2089 ], 'E402:')
2090
2091 CheckScriptSuccess([
2092 'vim9script',
2093 'syntax match Word /pat/ contains=Something # comment',
2094 ])
2095 CheckScriptFailure([
2096 'vim9script',
2097 'syntax match Word /pat/ contains=Something# comment',
2098 ], 'E475:')
2099 CheckScriptFailure([
2100 'vim9script',
2101 'syntax match Word /pat/ contains= # comment',
2102 ], 'E406:')
2103 CheckScriptFailure([
2104 'vim9script',
2105 'syntax match Word /pat/ contains=# comment',
2106 ], 'E475:')
2107
2108 CheckScriptSuccess([
2109 'vim9script',
2110 'syntax region Word start=/pat/ end=/pat/ # comment',
2111 ])
2112 CheckScriptFailure([
2113 'vim9script',
2114 'syntax region Word start=/pat/ end=/pat/# comment',
Bram Moolenaard032f342020-07-18 18:13:02 +02002115 ], 'E402:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02002116
2117 CheckScriptSuccess([
2118 'vim9script',
2119 'syntax sync # comment',
2120 ])
2121 CheckScriptFailure([
2122 'vim9script',
2123 'syntax sync# comment',
2124 ], 'E404:')
2125 CheckScriptSuccess([
2126 'vim9script',
2127 'syntax sync ccomment # comment',
2128 ])
2129 CheckScriptFailure([
2130 'vim9script',
2131 'syntax sync ccomment# comment',
2132 ], 'E404:')
2133
2134 CheckScriptSuccess([
2135 'vim9script',
2136 'syntax cluster Some contains=Word # comment',
2137 ])
2138 CheckScriptFailure([
2139 'vim9script',
2140 'syntax cluster Some contains=Word# comment',
2141 ], 'E475:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002142
2143 CheckScriptSuccess([
2144 'vim9script',
2145 'command Echo echo # comment',
2146 'command Echo # comment',
2147 ])
2148 CheckScriptFailure([
2149 'vim9script',
2150 'command Echo echo# comment',
2151 'Echo',
2152 ], 'E121:')
2153 CheckScriptFailure([
2154 'vim9script',
2155 'command Echo# comment',
2156 ], 'E182:')
2157 CheckScriptFailure([
2158 'vim9script',
2159 'command Echo echo',
2160 'command Echo# comment',
2161 ], 'E182:')
2162
2163 CheckScriptSuccess([
2164 'vim9script',
2165 'function # comment',
2166 ])
2167 CheckScriptFailure([
2168 'vim9script',
2169 'function# comment',
2170 ], 'E129:')
2171 CheckScriptSuccess([
2172 'vim9script',
2173 'function CheckScriptSuccess # comment',
2174 ])
2175 CheckScriptFailure([
2176 'vim9script',
2177 'function CheckScriptSuccess# comment',
2178 ], 'E488:')
2179
2180 CheckScriptSuccess([
2181 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002182 'func g:DeleteMeA()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002183 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002184 'delfunction g:DeleteMeA # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002185 ])
2186 CheckScriptFailure([
2187 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002188 'func g:DeleteMeB()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002189 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002190 'delfunction g:DeleteMeB# comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002191 ], 'E488:')
2192
2193 CheckScriptSuccess([
2194 'vim9script',
2195 'call execute("ls") # comment',
2196 ])
2197 CheckScriptFailure([
2198 'vim9script',
2199 'call execute("ls")# comment',
2200 ], 'E488:')
Bram Moolenaare7e48382020-07-22 18:17:08 +02002201
2202 CheckScriptFailure([
2203 'def Test() " comment',
2204 'enddef',
2205 ], 'E488:')
2206 CheckScriptFailure([
2207 'vim9script',
2208 'def Test() " comment',
2209 'enddef',
2210 ], 'E488:')
2211
2212 CheckScriptSuccess([
2213 'func Test() " comment',
2214 'endfunc',
2215 ])
2216 CheckScriptFailure([
2217 'vim9script',
2218 'func Test() " comment',
2219 'endfunc',
2220 ], 'E488:')
2221
2222 CheckScriptSuccess([
2223 'def Test() # comment',
2224 'enddef',
2225 ])
2226 CheckScriptFailure([
2227 'func Test() # comment',
2228 'endfunc',
2229 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002230enddef
2231
2232def Test_vim9_comment_gui()
2233 CheckCanRunGui
2234
2235 CheckScriptFailure([
2236 'vim9script',
2237 'gui#comment'
2238 ], 'E499:')
2239 CheckScriptFailure([
2240 'vim9script',
2241 'gui -f#comment'
2242 ], 'E499:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02002243enddef
2244
Bram Moolenaara26b9702020-04-18 19:53:28 +02002245def Test_vim9_comment_not_compiled()
Bram Moolenaar67979662020-06-20 22:50:47 +02002246 au TabEnter *.vim g:entered = 1
2247 au TabEnter *.x g:entered = 2
Bram Moolenaara26b9702020-04-18 19:53:28 +02002248
2249 edit test.vim
2250 doautocmd TabEnter #comment
2251 assert_equal(1, g:entered)
2252
2253 doautocmd TabEnter f.x
2254 assert_equal(2, g:entered)
2255
2256 g:entered = 0
2257 doautocmd TabEnter f.x #comment
2258 assert_equal(2, g:entered)
2259
2260 assert_fails('doautocmd Syntax#comment', 'E216:')
2261
2262 au! TabEnter
2263 unlet g:entered
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02002264
2265 CheckScriptSuccess([
2266 'vim9script',
Bram Moolenaar67979662020-06-20 22:50:47 +02002267 'g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02002268 'b:var = 456',
2269 'w:var = 777',
2270 't:var = 888',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02002271 'unlet g:var w:var # something',
2272 ])
2273
2274 CheckScriptFailure([
2275 'vim9script',
2276 'let g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02002277 ], 'E1016: Cannot declare a global variable:')
2278
2279 CheckScriptFailure([
2280 'vim9script',
2281 'let b:var = 123',
2282 ], 'E1016: Cannot declare a buffer variable:')
2283
2284 CheckScriptFailure([
2285 'vim9script',
2286 'let w:var = 123',
2287 ], 'E1016: Cannot declare a window variable:')
2288
2289 CheckScriptFailure([
2290 'vim9script',
2291 'let t:var = 123',
2292 ], 'E1016: Cannot declare a tab variable:')
2293
2294 CheckScriptFailure([
2295 'vim9script',
2296 'let v:version = 123',
2297 ], 'E1016: Cannot declare a v: variable:')
2298
2299 CheckScriptFailure([
2300 'vim9script',
2301 'let $VARIABLE = "text"',
2302 ], 'E1016: Cannot declare an environment variable:')
Bram Moolenaar67979662020-06-20 22:50:47 +02002303
2304 CheckScriptFailure([
2305 'vim9script',
2306 'g:var = 123',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002307 'unlet g:var# comment1',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02002308 ], 'E108:')
2309
2310 CheckScriptFailure([
2311 'let g:var = 123',
2312 'unlet g:var # something',
2313 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002314
2315 CheckScriptSuccess([
2316 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002317 'if 1 # comment2',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002318 ' echo "yes"',
2319 'elseif 2 #comment',
2320 ' echo "no"',
2321 'endif',
2322 ])
2323
2324 CheckScriptFailure([
2325 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002326 'if 1# comment3',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002327 ' echo "yes"',
2328 'endif',
2329 ], 'E15:')
2330
2331 CheckScriptFailure([
2332 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002333 'if 0 # comment4',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002334 ' echo "yes"',
2335 'elseif 2#comment',
2336 ' echo "no"',
2337 'endif',
2338 ], 'E15:')
2339
2340 CheckScriptSuccess([
2341 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002342 'let v = 1 # comment5',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002343 ])
2344
2345 CheckScriptFailure([
2346 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002347 'let v = 1# comment6',
2348 ], 'E15:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002349
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002350 CheckScriptSuccess([
2351 'vim9script',
2352 'new'
2353 'call setline(1, ["# define pat", "last"])',
Bram Moolenaardf069ee2020-06-22 23:02:51 +02002354 ':$',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002355 'dsearch /pat/ #comment',
2356 'bwipe!',
2357 ])
2358
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002359 CheckScriptFailure([
2360 'vim9script',
2361 'new'
2362 'call setline(1, ["# define pat", "last"])',
2363 ':$',
2364 'dsearch /pat/#comment',
2365 'bwipe!',
2366 ], 'E488:')
2367
2368 CheckScriptFailure([
2369 'vim9script',
2370 'func! SomeFunc()',
2371 ], 'E477:')
Bram Moolenaara26b9702020-04-18 19:53:28 +02002372enddef
2373
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02002374def Test_finish()
2375 let lines =<< trim END
2376 vim9script
Bram Moolenaar67979662020-06-20 22:50:47 +02002377 g:res = 'one'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02002378 if v:false | finish | endif
Bram Moolenaar67979662020-06-20 22:50:47 +02002379 g:res = 'two'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02002380 finish
Bram Moolenaar67979662020-06-20 22:50:47 +02002381 g:res = 'three'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02002382 END
2383 writefile(lines, 'Xfinished')
2384 source Xfinished
2385 assert_equal('two', g:res)
2386
2387 unlet g:res
2388 delete('Xfinished')
2389enddef
2390
Bram Moolenaar32e35112020-05-14 22:41:15 +02002391def Test_let_func_call()
2392 let lines =<< trim END
2393 vim9script
2394 func GetValue()
2395 if exists('g:count')
2396 let g:count += 1
2397 else
2398 let g:count = 1
2399 endif
2400 return 'this'
2401 endfunc
2402 let val: string = GetValue()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002403 # env var is always a string
Bram Moolenaardf671b42020-05-16 22:33:33 +02002404 let env = $TERM
Bram Moolenaar32e35112020-05-14 22:41:15 +02002405 END
2406 writefile(lines, 'Xfinished')
2407 source Xfinished
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002408 # GetValue() is not called during discovery phase
Bram Moolenaar32e35112020-05-14 22:41:15 +02002409 assert_equal(1, g:count)
2410
2411 unlet g:count
2412 delete('Xfinished')
2413enddef
2414
2415def Test_let_missing_type()
2416 let lines =<< trim END
2417 vim9script
Bram Moolenaardf671b42020-05-16 22:33:33 +02002418 let var = g:unknown
Bram Moolenaar227a69d2020-05-15 18:17:28 +02002419 END
Bram Moolenaar822ba242020-05-24 23:00:18 +02002420 CheckScriptFailure(lines, 'E121:')
Bram Moolenaar227a69d2020-05-15 18:17:28 +02002421
2422 lines =<< trim END
2423 vim9script
2424 let nr: number = 123
2425 let var = nr
2426 END
Bram Moolenaar822ba242020-05-24 23:00:18 +02002427 CheckScriptSuccess(lines)
Bram Moolenaar32e35112020-05-14 22:41:15 +02002428enddef
2429
Bram Moolenaarc82a5b52020-06-13 18:09:19 +02002430def Test_let_declaration()
2431 let lines =<< trim END
2432 vim9script
2433 let var: string
2434 g:var_uninit = var
2435 var = 'text'
2436 g:var_test = var
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002437 # prefixing s: is optional
Bram Moolenaar984dddb2020-06-14 12:50:24 +02002438 s:var = 'prefixed'
2439 g:var_prefixed = s:var
2440
2441 let s:other: number
2442 other = 1234
2443 g:other_var = other
Bram Moolenaarc82a5b52020-06-13 18:09:19 +02002444 END
2445 CheckScriptSuccess(lines)
2446 assert_equal('', g:var_uninit)
2447 assert_equal('text', g:var_test)
Bram Moolenaar984dddb2020-06-14 12:50:24 +02002448 assert_equal('prefixed', g:var_prefixed)
2449 assert_equal(1234, g:other_var)
Bram Moolenaarc82a5b52020-06-13 18:09:19 +02002450
2451 unlet g:var_uninit
2452 unlet g:var_test
Bram Moolenaar984dddb2020-06-14 12:50:24 +02002453 unlet g:var_prefixed
2454 unlet g:other_var
Bram Moolenaarc82a5b52020-06-13 18:09:19 +02002455enddef
2456
Bram Moolenaarc5b1c202020-06-18 22:43:27 +02002457def Test_let_declaration_fails()
2458 let lines =<< trim END
2459 vim9script
2460 const var: string
2461 END
2462 CheckScriptFailure(lines, 'E1021:')
2463
2464 lines =<< trim END
2465 vim9script
2466 let 9var: string
2467 END
2468 CheckScriptFailure(lines, 'E475:')
2469enddef
2470
Bram Moolenaar34db91f2020-06-13 19:00:10 +02002471def Test_let_type_check()
2472 let lines =<< trim END
2473 vim9script
2474 let var: string
2475 var = 1234
2476 END
2477 CheckScriptFailure(lines, 'E1013:')
Bram Moolenaar984dddb2020-06-14 12:50:24 +02002478
2479 lines =<< trim END
2480 vim9script
2481 let var:string
2482 END
2483 CheckScriptFailure(lines, 'E1069:')
Bram Moolenaarc5b1c202020-06-18 22:43:27 +02002484
2485 lines =<< trim END
2486 vim9script
2487 let var: asdf
2488 END
2489 CheckScriptFailure(lines, 'E1010:')
Bram Moolenaar34db91f2020-06-13 19:00:10 +02002490enddef
2491
Bram Moolenaara5d00772020-05-14 23:20:55 +02002492def Test_forward_declaration()
2493 let lines =<< trim END
2494 vim9script
Bram Moolenaara5d00772020-05-14 23:20:55 +02002495 def GetValue(): string
2496 return theVal
2497 enddef
2498 let theVal = 'something'
Bram Moolenaar822ba242020-05-24 23:00:18 +02002499 g:initVal = GetValue()
Bram Moolenaara5d00772020-05-14 23:20:55 +02002500 theVal = 'else'
2501 g:laterVal = GetValue()
2502 END
2503 writefile(lines, 'Xforward')
2504 source Xforward
2505 assert_equal('something', g:initVal)
2506 assert_equal('else', g:laterVal)
2507
2508 unlet g:initVal
2509 unlet g:laterVal
2510 delete('Xforward')
2511enddef
2512
Bram Moolenaar9721fb42020-06-11 23:10:46 +02002513def Test_source_vim9_from_legacy()
2514 let legacy_lines =<< trim END
2515 source Xvim9_script.vim
2516
2517 call assert_false(exists('local'))
2518 call assert_false(exists('exported'))
2519 call assert_false(exists('s:exported'))
2520 call assert_equal('global', global)
2521 call assert_equal('global', g:global)
2522
2523 " imported variable becomes script-local
2524 import exported from './Xvim9_script.vim'
2525 call assert_equal('exported', s:exported)
2526 call assert_false(exists('exported'))
2527
2528 " imported function becomes script-local
2529 import GetText from './Xvim9_script.vim'
2530 call assert_equal('text', s:GetText())
2531 call assert_false(exists('*GetText'))
2532 END
2533 writefile(legacy_lines, 'Xlegacy_script.vim')
2534
2535 let vim9_lines =<< trim END
2536 vim9script
2537 let local = 'local'
2538 g:global = 'global'
2539 export let exported = 'exported'
2540 export def GetText(): string
2541 return 'text'
2542 enddef
2543 END
2544 writefile(vim9_lines, 'Xvim9_script.vim')
2545
2546 source Xlegacy_script.vim
2547
2548 assert_equal('global', g:global)
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002549 unlet g:global
Bram Moolenaar9721fb42020-06-11 23:10:46 +02002550
2551 delete('Xlegacy_script.vim')
2552 delete('Xvim9_script.vim')
2553enddef
Bram Moolenaara5d00772020-05-14 23:20:55 +02002554
Bram Moolenaareeb27bf2020-07-04 17:39:10 +02002555def Test_vim9_copen()
2556 # this was giving an error for setting w:quickfix_title
2557 copen
2558 quit
2559enddef
2560
Bram Moolenaar585fea72020-04-02 22:33:21 +02002561" Keep this last, it messes up highlighting.
2562def Test_substitute_cmd()
2563 new
2564 setline(1, 'something')
2565 :substitute(some(other(
2566 assert_equal('otherthing', getline(1))
2567 bwipe!
2568
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002569 # also when the context is Vim9 script
Bram Moolenaar585fea72020-04-02 22:33:21 +02002570 let lines =<< trim END
2571 vim9script
2572 new
2573 setline(1, 'something')
2574 :substitute(some(other(
2575 assert_equal('otherthing', getline(1))
2576 bwipe!
2577 END
2578 writefile(lines, 'Xvim9lines')
2579 source Xvim9lines
2580
2581 delete('Xvim9lines')
2582enddef
2583
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002584" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker