blob: fd572d742fc4be293456f147cdc354f3c2500c63 [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 Moolenaar4cdb13c2020-07-22 21:45:14 +020032 let nr: number = 1234
33 call CheckDefFailure(['let nr: number = "asdf"'], 'E1013:')
34
Bram Moolenaarb2097502020-07-19 17:17:02 +020035 let a: number = 6 #comment
Bram Moolenaar9be61bb2020-03-30 22:51:24 +020036 assert_equal(6, a)
37
Bram Moolenaar42a480b2020-02-29 23:23:47 +010038 if has('channel')
39 let chan1: channel
Bram Moolenaarfbdd08e2020-03-01 14:04:46 +010040 let job1: job
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +010041 let job2: job = job_start('willfail')
Bram Moolenaar42a480b2020-02-29 23:23:47 +010042 endif
Bram Moolenaarfbdd08e2020-03-01 14:04:46 +010043 if has('float')
44 let float1: float = 3.4
45 endif
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +020046 let Funky1: func
47 let Funky2: func = function('len')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +020048 let Party2: func = funcref('g:Test_syntax')
Bram Moolenaar42a480b2020-02-29 23:23:47 +010049
Bram Moolenaarb2097502020-07-19 17:17:02 +020050 g:newvar = 'new' #comment
Bram Moolenaar401d9ff2020-02-19 18:14:44 +010051 assert_equal('new', g:newvar)
52
53 assert_equal('yes', g:existing)
54 g:existing = 'no'
55 assert_equal('no', g:existing)
56
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010057 v:char = 'abc'
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010058 assert_equal('abc', v:char)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010059
60 $ENVVAR = 'foobar'
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010061 assert_equal('foobar', $ENVVAR)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010062 $ENVVAR = ''
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010063
Bram Moolenaarfd1823e2020-02-19 20:23:11 +010064 s:appendToMe ..= 'yyy'
65 assert_equal('xxxyyy', s:appendToMe)
66 s:addToMe += 222
67 assert_equal(333, s:addToMe)
Bram Moolenaar0bbf7222020-02-19 22:31:48 +010068 s:newVar = 'new'
69 assert_equal('new', s:newVar)
Bram Moolenaara8c17702020-04-01 21:17:24 +020070
71 set ts=7
72 &ts += 1
73 assert_equal(8, &ts)
Bram Moolenaar80c34ca2020-04-01 23:05:18 +020074 &ts -= 3
75 assert_equal(5, &ts)
76 &ts *= 2
77 assert_equal(10, &ts)
78 &ts /= 3
79 assert_equal(3, &ts)
80 set ts=10
81 &ts %= 4
82 assert_equal(2, &ts)
Bram Moolenaara8c17702020-04-01 21:17:24 +020083 call CheckDefFailure(['&notex += 3'], 'E113:')
84 call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
Bram Moolenaara6e67e42020-05-15 23:36:40 +020085 call CheckDefFailure(['&ts = [7]'], 'E1013:')
86 call CheckDefExecFailure(['&ts = g:alist'], 'E1029: Expected number but got list')
87 call CheckDefFailure(['&ts = "xx"'], 'E1013:')
88 call CheckDefExecFailure(['&ts = g:astring'], 'E1029: Expected number but got string')
Bram Moolenaara8c17702020-04-01 21:17:24 +020089 call CheckDefFailure(['&path += 3'], 'E1013:')
Bram Moolenaara6e67e42020-05-15 23:36:40 +020090 call CheckDefExecFailure(['&bs = "asdf"'], 'E474:')
Bram Moolenaarcb711ab2020-04-16 13:00:29 +020091 # test freeing ISN_STOREOPT
Bram Moolenaar585fea72020-04-02 22:33:21 +020092 call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
Bram Moolenaar80c34ca2020-04-01 23:05:18 +020093 &ts = 8
Bram Moolenaara8c17702020-04-01 21:17:24 +020094
95 g:inc_counter += 1
96 assert_equal(2, g:inc_counter)
97
98 $SOME_ENV_VAR ..= 'more'
99 assert_equal('somemore', $SOME_ENV_VAR)
100 call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:')
101 call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:')
102
103 @a = 'areg'
104 @a ..= 'add'
105 assert_equal('aregadd', @a)
106 call CheckDefFailure(['@a += "more"'], 'E1013:')
107 call CheckDefFailure(['@a += 123'], 'E1013:')
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200108
109 v:errmsg = 'none'
110 v:errmsg ..= 'again'
111 assert_equal('noneagain', v:errmsg)
112 call CheckDefFailure(['v:errmsg += "more"'], 'E1013:')
113 call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200114enddef
115
Bram Moolenaar3b74b6b2020-06-19 19:01:43 +0200116def Test_vim9_single_char_vars()
117 let lines =<< trim END
118 vim9script
119
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200120 # single character variable declarations work
Bram Moolenaar3b74b6b2020-06-19 19:01:43 +0200121 let a: string
122 let b: number
123 let l: list<any>
124 let s: string
125 let t: number
126 let v: number
127 let w: number
128
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200129 # script-local variables can be used without s: prefix
Bram Moolenaar3b74b6b2020-06-19 19:01:43 +0200130 a = 'script-a'
131 b = 111
132 l = [1, 2, 3]
133 s = 'script-s'
134 t = 222
135 v = 333
136 w = 444
137
138 assert_equal('script-a', a)
139 assert_equal(111, b)
140 assert_equal([1, 2, 3], l)
141 assert_equal('script-s', s)
142 assert_equal(222, t)
143 assert_equal(333, v)
144 assert_equal(444, w)
145 END
146 writefile(lines, 'Xsinglechar')
147 source Xsinglechar
148 delete('Xsinglechar')
149enddef
150
Bram Moolenaar84370082020-05-18 14:20:36 +0200151def Test_assignment_list()
152 let list1: list<bool> = [false, true, false]
153 let list2: list<number> = [1, 2, 3]
154 let list3: list<string> = ['sdf', 'asdf']
155 let list4: list<any> = ['yes', true, 1234]
156 let list5: list<blob> = [0z01, 0z02]
157
158 let listS: list<string> = []
159 let listN: list<number> = []
160
161 assert_equal([1, 2, 3], list2)
162 list2[-1] = 99
163 assert_equal([1, 2, 99], list2)
164 list2[-2] = 88
165 assert_equal([1, 88, 99], list2)
166 list2[-3] = 77
167 assert_equal([77, 88, 99], list2)
168 call CheckDefExecFailure(['let ll = [1, 2, 3]', 'll[-4] = 6'], 'E684:')
Bram Moolenaarc5b1c202020-06-18 22:43:27 +0200169 call CheckDefExecFailure(['let [v1, v2] = [1, 2]'], 'E1092:')
Bram Moolenaar84370082020-05-18 14:20:36 +0200170
171 # type becomes list<any>
172 let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
173enddef
174
Bram Moolenaarb31be3f2020-07-20 22:37:44 +0200175def Test_assignment_list_vim9script()
176 let lines =<< trim END
177 vim9script
178 let v1: number
179 let v2: number
180 let v3: number
181 [v1, v2, v3] = [1, 2, 3]
182 assert_equal([1, 2, 3], [v1, v2, v3])
183 END
184 call CheckScriptSuccess(lines)
185enddef
186
Bram Moolenaar84370082020-05-18 14:20:36 +0200187def Test_assignment_dict()
188 let dict1: dict<bool> = #{one: false, two: true}
189 let dict2: dict<number> = #{one: 1, two: 2}
190 let dict3: dict<string> = #{key: 'value'}
191 let dict4: dict<any> = #{one: 1, two: '2'}
Bram Moolenaar74fae512020-05-21 21:50:58 +0200192 let dict5: dict<blob> = #{one: 0z01, two: 0z02}
Bram Moolenaar84370082020-05-18 14:20:36 +0200193
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200194 # overwrite
Bram Moolenaarc785b9a2020-06-19 18:34:15 +0200195 dict3['key'] = 'another'
196
Bram Moolenaar84370082020-05-18 14:20:36 +0200197 call CheckDefExecFailure(['let dd = {}', 'dd[""] = 6'], 'E713:')
198
199 # type becomes dict<any>
200 let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
201enddef
202
Bram Moolenaard3aac292020-04-19 14:32:17 +0200203def Test_assignment_local()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200204 # Test in a separated file in order not to the current buffer/window/tab is
205 # changed.
Bram Moolenaard3aac292020-04-19 14:32:17 +0200206 let script_lines: list<string> =<< trim END
207 let b:existing = 'yes'
208 let w:existing = 'yes'
209 let t:existing = 'yes'
210
211 def Test_assignment_local_internal()
212 b:newvar = 'new'
213 assert_equal('new', b:newvar)
214 assert_equal('yes', b:existing)
215 b:existing = 'no'
216 assert_equal('no', b:existing)
Bram Moolenaar396f3132020-05-09 18:44:56 +0200217 b:existing ..= 'NO'
218 assert_equal('noNO', b:existing)
Bram Moolenaard3aac292020-04-19 14:32:17 +0200219
220 w:newvar = 'new'
221 assert_equal('new', w:newvar)
222 assert_equal('yes', w:existing)
223 w:existing = 'no'
224 assert_equal('no', w:existing)
Bram Moolenaar396f3132020-05-09 18:44:56 +0200225 w:existing ..= 'NO'
226 assert_equal('noNO', w:existing)
Bram Moolenaard3aac292020-04-19 14:32:17 +0200227
228 t:newvar = 'new'
229 assert_equal('new', t:newvar)
230 assert_equal('yes', t:existing)
231 t:existing = 'no'
232 assert_equal('no', t:existing)
Bram Moolenaar396f3132020-05-09 18:44:56 +0200233 t:existing ..= 'NO'
234 assert_equal('noNO', t:existing)
Bram Moolenaard3aac292020-04-19 14:32:17 +0200235 enddef
236 call Test_assignment_local_internal()
237 END
238 call CheckScriptSuccess(script_lines)
239enddef
240
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200241def Test_assignment_default()
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200242
Bram Moolenaarcb711ab2020-04-16 13:00:29 +0200243 # Test default values.
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200244 let thebool: bool
245 assert_equal(v:false, thebool)
246
247 let thenumber: number
248 assert_equal(0, thenumber)
249
250 if has('float')
251 let thefloat: float
252 assert_equal(0.0, thefloat)
253 endif
254
255 let thestring: string
256 assert_equal('', thestring)
257
258 let theblob: blob
259 assert_equal(0z, theblob)
260
Bram Moolenaar5deeb3f2020-04-05 17:08:17 +0200261 let Thefunc: func
262 assert_equal(test_null_function(), Thefunc)
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200263
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200264 let thelist: list<any>
265 assert_equal([], thelist)
266
267 let thedict: dict<any>
268 assert_equal({}, thedict)
269
Bram Moolenaar2c869de2020-04-02 19:12:08 +0200270 if has('channel')
271 let thejob: job
272 assert_equal(test_null_job(), thejob)
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200273
Bram Moolenaar2c869de2020-04-02 19:12:08 +0200274 let thechannel: channel
275 assert_equal(test_null_channel(), thechannel)
Bram Moolenaarc785b9a2020-06-19 18:34:15 +0200276
277 if has('unix') && executable('cat')
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200278 # check with non-null job and channel, types must match
Bram Moolenaarc785b9a2020-06-19 18:34:15 +0200279 thejob = job_start("cat ", #{})
280 thechannel = job_getchannel(thejob)
281 job_stop(thejob, 'kill')
282 endif
Bram Moolenaar2c869de2020-04-02 19:12:08 +0200283 endif
Bram Moolenaar585fea72020-04-02 22:33:21 +0200284
285 let nr = 1234 | nr = 5678
286 assert_equal(5678, nr)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100287enddef
288
Bram Moolenaar47a519a2020-06-14 23:05:10 +0200289def Test_assignment_var_list()
290 let v1: string
291 let v2: string
Bram Moolenaar9af78762020-06-16 11:34:42 +0200292 let vrem: list<string>
293 [v1] = ['aaa']
294 assert_equal('aaa', v1)
295
Bram Moolenaar47a519a2020-06-14 23:05:10 +0200296 [v1, v2] = ['one', 'two']
297 assert_equal('one', v1)
298 assert_equal('two', v2)
Bram Moolenaar9af78762020-06-16 11:34:42 +0200299
300 [v1, v2; vrem] = ['one', 'two']
301 assert_equal('one', v1)
302 assert_equal('two', v2)
303 assert_equal([], vrem)
304
305 [v1, v2; vrem] = ['one', 'two', 'three']
306 assert_equal('one', v1)
307 assert_equal('two', v2)
308 assert_equal(['three'], vrem)
Bram Moolenaar47a519a2020-06-14 23:05:10 +0200309enddef
310
Bram Moolenaarcab27672020-04-09 20:10:55 +0200311def Mess(): string
312 v:foldstart = 123
313 return 'xxx'
314enddef
315
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200316def Test_assignment_failure()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100317 call CheckDefFailure(['let var=234'], 'E1004:')
318 call CheckDefFailure(['let var =234'], 'E1004:')
319 call CheckDefFailure(['let var= 234'], 'E1004:')
320
Bram Moolenaar63be3d42020-07-23 13:11:37 +0200321 call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:')
322 call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='")
323 call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:')
324 call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:')
325 call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:')
326 call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='")
327 call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:')
328 call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='")
329
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100330 call CheckDefFailure(['let true = 1'], 'E1034:')
331 call CheckDefFailure(['let false = 1'], 'E1034:')
332
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +0200333 call CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
Bram Moolenaar9af78762020-06-16 11:34:42 +0200334 call CheckDefExecFailure(['let a: number',
335 '[a] = test_null_list()'], 'E1093:')
336 call CheckDefExecFailure(['let a: number',
337 '[a] = []'], 'E1093:')
338 call CheckDefExecFailure(['let x: number',
339 'let y: number',
340 '[x, y] = [1]'], 'E1093:')
341 call CheckDefExecFailure(['let x: number',
342 'let y: number',
343 'let z: list<number>',
344 '[x, y; z] = [1]'], 'E1093:')
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200345
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200346 call CheckDefFailure(['let somevar'], "E1022:")
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200347 call CheckDefFailure(['let &option'], 'E1052:')
348 call CheckDefFailure(['&g:option = 5'], 'E113:')
349
Bram Moolenaare55b1c02020-06-21 15:52:59 +0200350 call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200351
352 call CheckDefFailure(['let @~ = 5'], 'E354:')
353 call CheckDefFailure(['let @a = 5'], 'E1066:')
354
Bram Moolenaare55b1c02020-06-21 15:52:59 +0200355 call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
356 call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
357 call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
358 call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200359
360 call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
361 call CheckDefFailure(['let xnr += 4'], 'E1020:')
362
Bram Moolenaar822ba242020-05-24 23:00:18 +0200363 call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:')
Bram Moolenaar33fa29c2020-03-28 19:41:33 +0100364
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100365 call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
366 call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
367
368 call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
369 call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
370
371 call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
372 call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100373
Bram Moolenaard77a8522020-04-03 21:59:57 +0200374 call CheckDefFailure(['let var: dict <number>'], 'E1068:')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100375 call CheckDefFailure(['let var: dict<number'], 'E1009:')
Bram Moolenaarcab27672020-04-09 20:10:55 +0200376
377 call assert_fails('s/^/\=Mess()/n', 'E794:')
378 call CheckDefFailure(['let var: dict<number'], 'E1009:')
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200379enddef
380
381def Test_unlet()
382 g:somevar = 'yes'
383 assert_true(exists('g:somevar'))
384 unlet g:somevar
385 assert_false(exists('g:somevar'))
386 unlet! g:somevar
387
388 call CheckScriptFailure([
389 'vim9script',
390 'let svar = 123',
391 'unlet svar',
392 ], 'E1081:')
393 call CheckScriptFailure([
394 'vim9script',
395 'let svar = 123',
396 'unlet s:svar',
397 ], 'E1081:')
398 call CheckScriptFailure([
399 'vim9script',
400 'let svar = 123',
401 'def Func()',
402 ' unlet svar',
403 'enddef',
Bram Moolenaar822ba242020-05-24 23:00:18 +0200404 'defcompile',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200405 ], 'E1081:')
406 call CheckScriptFailure([
407 'vim9script',
408 'let svar = 123',
409 'def Func()',
410 ' unlet s:svar',
411 'enddef',
Bram Moolenaar822ba242020-05-24 23:00:18 +0200412 'defcompile',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200413 ], 'E1081:')
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200414
415 $ENVVAR = 'foobar'
416 assert_equal('foobar', $ENVVAR)
417 unlet $ENVVAR
418 assert_equal('', $ENVVAR)
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200419enddef
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100420
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200421def Test_delfunction()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200422 # Check function is defined in script namespace
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200423 CheckScriptSuccess([
424 'vim9script',
425 'func CheckMe()',
426 ' return 123',
427 'endfunc',
428 'assert_equal(123, s:CheckMe())',
429 ])
430
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200431 # Check function in script namespace cannot be deleted
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200432 CheckScriptFailure([
433 'vim9script',
434 'func DeleteMe1()',
435 'endfunc',
436 'delfunction DeleteMe1',
437 ], 'E1084:')
438 CheckScriptFailure([
439 'vim9script',
440 'func DeleteMe2()',
441 'endfunc',
442 'def DoThat()',
443 ' delfunction DeleteMe2',
444 'enddef',
445 'DoThat()',
446 ], 'E1084:')
447 CheckScriptFailure([
448 'vim9script',
449 'def DeleteMe3()',
450 'enddef',
451 'delfunction DeleteMe3',
452 ], 'E1084:')
453 CheckScriptFailure([
454 'vim9script',
455 'def DeleteMe4()',
456 'enddef',
457 'def DoThat()',
458 ' delfunction DeleteMe4',
459 'enddef',
460 'DoThat()',
461 ], 'E1084:')
462enddef
463
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100464func Test_wrong_type()
465 call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
466 call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
467 call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
468 call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
469
470 call CheckDefFailure(['let var: dict<number'], 'E1009:')
471 call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100472
473 call CheckDefFailure(['let var: ally'], 'E1010:')
474 call CheckDefFailure(['let var: bram'], 'E1010:')
475 call CheckDefFailure(['let var: cathy'], 'E1010:')
476 call CheckDefFailure(['let var: dom'], 'E1010:')
477 call CheckDefFailure(['let var: freddy'], 'E1010:')
478 call CheckDefFailure(['let var: john'], 'E1010:')
479 call CheckDefFailure(['let var: larry'], 'E1010:')
480 call CheckDefFailure(['let var: ned'], 'E1010:')
481 call CheckDefFailure(['let var: pam'], 'E1010:')
482 call CheckDefFailure(['let var: sam'], 'E1010:')
483 call CheckDefFailure(['let var: vim'], 'E1010:')
Bram Moolenaara0a9f432020-04-28 21:29:34 +0200484
485 call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
486 call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100487endfunc
488
489func Test_const()
490 call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
491 call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
492 call CheckDefFailure(['const two'], 'E1021:')
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200493 call CheckDefFailure(['const &option'], 'E996:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100494endfunc
495
Bram Moolenaardf069ee2020-06-22 23:02:51 +0200496def Test_range_no_colon()
497 call CheckDefFailure(['%s/a/b/'], 'E1050:')
498 call CheckDefFailure(['+ s/a/b/'], 'E1050:')
499 call CheckDefFailure(['- s/a/b/'], 'E1050:')
500 call CheckDefFailure(['. s/a/b/'], 'E1050:')
501enddef
502
503
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100504def Test_block()
505 let outer = 1
506 {
507 let inner = 2
508 assert_equal(1, outer)
509 assert_equal(2, inner)
510 }
511 assert_equal(1, outer)
512enddef
513
514func Test_block_failure()
515 call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200516 call CheckDefFailure(['}'], 'E1025:')
517 call CheckDefFailure(['{', 'echo 1'], 'E1026:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100518endfunc
519
Bram Moolenaar585fea72020-04-02 22:33:21 +0200520def Test_cmd_modifier()
521 tab echo '0'
522 call CheckDefFailure(['5tab echo 3'], 'E16:')
523enddef
524
Bram Moolenaard032f342020-07-18 18:13:02 +0200525func g:NoSuchFunc()
526 echo 'none'
527endfunc
528
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100529def Test_try_catch()
530 let l = []
Bram Moolenaar7a092242020-04-16 22:10:49 +0200531 try # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100532 add(l, '1')
533 throw 'wrong'
534 add(l, '2')
Bram Moolenaar7a092242020-04-16 22:10:49 +0200535 catch # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100536 add(l, v:exception)
Bram Moolenaar7a092242020-04-16 22:10:49 +0200537 finally # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100538 add(l, '3')
Bram Moolenaar7a092242020-04-16 22:10:49 +0200539 endtry # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100540 assert_equal(['1', 'wrong', '3'], l)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200541
Bram Moolenaare8593122020-07-18 15:17:02 +0200542 l = []
543 try
544 try
545 add(l, '1')
546 throw 'wrong'
547 add(l, '2')
548 catch /right/
549 add(l, v:exception)
550 endtry
551 catch /wrong/
552 add(l, 'caught')
553 finally
554 add(l, 'finally')
555 endtry
556 assert_equal(['1', 'caught', 'finally'], l)
557
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200558 let n: number
559 try
560 n = l[3]
561 catch /E684:/
562 n = 99
563 endtry
564 assert_equal(99, n)
565
566 try
567 n = g:astring[3]
568 catch /E714:/
569 n = 77
570 endtry
571 assert_equal(77, n)
572
573 try
574 n = l[g:astring]
575 catch /E39:/
576 n = 77
577 endtry
578 assert_equal(77, n)
579
580 try
581 n = s:does_not_exist
582 catch /E121:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200583 n = 111
584 endtry
585 assert_equal(111, n)
586
587 try
588 n = g:does_not_exist
589 catch /E121:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200590 n = 121
591 endtry
592 assert_equal(121, n)
593
594 let d = #{one: 1}
595 try
596 n = d[g:astring]
597 catch /E716:/
598 n = 222
599 endtry
600 assert_equal(222, n)
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200601
602 try
603 n = -g:astring
604 catch /E39:/
605 n = 233
606 endtry
607 assert_equal(233, n)
608
609 try
610 n = +g:astring
611 catch /E1030:/
612 n = 244
613 endtry
614 assert_equal(244, n)
615
616 try
617 n = +g:alist
618 catch /E745:/
619 n = 255
620 endtry
621 assert_equal(255, n)
622
623 let nd: dict<any>
624 try
625 nd = {g:anumber: 1}
626 catch /E1029:/
627 n = 266
628 endtry
629 assert_equal(266, n)
630
631 try
632 [n] = [1, 2, 3]
633 catch /E1093:/
634 n = 277
635 endtry
636 assert_equal(277, n)
637
Bram Moolenaare8593122020-07-18 15:17:02 +0200638 try
639 &ts = g:astring
640 catch /E1029:/
641 n = 288
642 endtry
643 assert_equal(288, n)
644
645 try
646 &backspace = 'asdf'
647 catch /E474:/
648 n = 299
649 endtry
650 assert_equal(299, n)
651
652 l = [1]
653 try
654 l[3] = 3
655 catch /E684:/
656 n = 300
657 endtry
658 assert_equal(300, n)
659
660 try
661 d[''] = 3
662 catch /E713:/
663 n = 311
664 endtry
665 assert_equal(311, n)
666
667 try
668 unlet g:does_not_exist
669 catch /E108:/
670 n = 322
671 endtry
672 assert_equal(322, n)
673
674 try
675 d = {'text': 1, g:astring: 2}
676 catch /E721:/
677 n = 333
678 endtry
679 assert_equal(333, n)
680
681 try
682 l = DeletedFunc()
683 catch /E933:/
684 n = 344
685 endtry
686 assert_equal(344, n)
Bram Moolenaard032f342020-07-18 18:13:02 +0200687
688 try
689 echo len(v:true)
690 catch /E701:/
691 n = 355
692 endtry
693 assert_equal(355, n)
694
695 let P = function('g:NoSuchFunc')
696 delfunc g:NoSuchFunc
697 try
698 echo P()
699 catch /E117:/
700 n = 366
701 endtry
702 assert_equal(366, n)
703
704 try
705 echo g:NoSuchFunc()
706 catch /E117:/
707 n = 377
708 endtry
709 assert_equal(377, n)
710
711 try
712 echo g:alist + 4
713 catch /E745:/
714 n = 388
715 endtry
716 assert_equal(388, n)
717
718 try
719 echo 4 + g:alist
720 catch /E745:/
721 n = 399
722 endtry
723 assert_equal(399, n)
724
725 try
726 echo g:alist.member
727 catch /E715:/
728 n = 400
729 endtry
730 assert_equal(400, n)
731
732 try
733 echo d.member
734 catch /E716:/
735 n = 411
736 endtry
737 assert_equal(411, n)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100738enddef
739
Bram Moolenaare8593122020-07-18 15:17:02 +0200740def DeletedFunc(): list<any>
741 return ['delete me']
742enddef
743defcompile
744delfunc DeletedFunc
745
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100746def ThrowFromDef()
Bram Moolenaara72cfb82020-04-23 17:07:30 +0200747 throw "getout" # comment
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100748enddef
749
750func CatchInFunc()
751 try
752 call ThrowFromDef()
753 catch
754 let g:thrown_func = v:exception
755 endtry
756endfunc
757
758def CatchInDef()
759 try
760 ThrowFromDef()
761 catch
762 g:thrown_def = v:exception
763 endtry
764enddef
765
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100766def ReturnFinally(): string
767 try
768 return 'intry'
769 finally
770 g:in_finally = 'finally'
771 endtry
772 return 'end'
773enddef
774
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100775def Test_try_catch_nested()
776 CatchInFunc()
777 assert_equal('getout', g:thrown_func)
778
779 CatchInDef()
780 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100781
782 assert_equal('intry', ReturnFinally())
783 assert_equal('finally', g:in_finally)
784enddef
785
786def Test_try_catch_match()
787 let seq = 'a'
788 try
789 throw 'something'
790 catch /nothing/
791 seq ..= 'x'
792 catch /some/
793 seq ..= 'b'
794 catch /asdf/
795 seq ..= 'x'
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200796 catch ?a\?sdf?
797 seq ..= 'y'
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100798 finally
799 seq ..= 'c'
800 endtry
801 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100802enddef
803
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200804def Test_try_catch_fails()
805 call CheckDefFailure(['catch'], 'E603:')
Bram Moolenaar6b7a0a82020-07-08 18:38:08 +0200806 call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200807 call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200808 call CheckDefFailure(['finally'], 'E606:')
809 call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
810 call CheckDefFailure(['endtry'], 'E602:')
811 call CheckDefFailure(['while 1', 'endtry'], 'E170:')
812 call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
813 call CheckDefFailure(['if 2', 'endtry'], 'E171:')
814 call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
815
Bram Moolenaara72cfb82020-04-23 17:07:30 +0200816 call CheckDefFailure(['throw'], 'E1015:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200817 call CheckDefFailure(['throw xxx'], 'E1001:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200818enddef
819
Bram Moolenaar006ad482020-06-30 20:55:15 +0200820def Test_throw_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200821 # only checks line continuation
Bram Moolenaar006ad482020-06-30 20:55:15 +0200822 let lines =<< trim END
823 vim9script
824 try
825 throw 'one'
826 .. 'two'
827 catch
828 assert_equal('onetwo', v:exception)
829 endtry
830 END
831 CheckScriptSuccess(lines)
832enddef
833
Bram Moolenaar37c83712020-06-30 21:18:36 +0200834def Test_cexpr_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200835 # only checks line continuation
Bram Moolenaar37c83712020-06-30 21:18:36 +0200836 set errorformat=File\ %f\ line\ %l
837 let lines =<< trim END
838 vim9script
839 cexpr 'File'
840 .. ' someFile' ..
841 ' line 19'
842 assert_equal(19, getqflist()[0].lnum)
843 END
844 CheckScriptSuccess(lines)
845 set errorformat&
846enddef
847
Bram Moolenaarb2097502020-07-19 17:17:02 +0200848def Test_list_vimscript()
849 # checks line continuation and comments
850 let lines =<< trim END
851 vim9script
852 let mylist = [
853 'one',
854 # comment
855 'two', # empty line follows
856
857 'three',
858 ]
859 assert_equal(['one', 'two', 'three'], mylist)
860 END
861 CheckScriptSuccess(lines)
862enddef
863
Bram Moolenaar2a1381c2020-05-05 23:32:58 +0200864if has('channel')
865 let someJob = test_null_job()
Bram Moolenaar40ee4662020-05-05 22:08:26 +0200866
Bram Moolenaar2a1381c2020-05-05 23:32:58 +0200867 def FuncWithError()
868 echomsg g:someJob
869 enddef
Bram Moolenaar40ee4662020-05-05 22:08:26 +0200870
Bram Moolenaar2a1381c2020-05-05 23:32:58 +0200871 func Test_convert_emsg_to_exception()
872 try
873 call FuncWithError()
874 catch
875 call assert_match('Vim:E908:', v:exception)
876 endtry
877 endfunc
878endif
Bram Moolenaar40ee4662020-05-05 22:08:26 +0200879
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100880let s:export_script_lines =<< trim END
881 vim9script
882 let name: string = 'bob'
883 def Concat(arg: string): string
884 return name .. arg
885 enddef
Bram Moolenaar227a69d2020-05-15 18:17:28 +0200886 g:result = Concat('bie')
887 g:localname = name
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100888
889 export const CONST = 1234
890 export let exported = 9876
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100891 export let exp_name = 'John'
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100892 export def Exported(): string
893 return 'Exported'
894 enddef
895END
896
Bram Moolenaar5269bd22020-03-09 19:25:27 +0100897def Test_vim9_import_export()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100898 let import_script_lines =<< trim END
899 vim9script
900 import {exported, Exported} from './Xexport.vim'
901 g:imported = exported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100902 exported += 3
903 g:imported_added = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100904 g:imported_func = Exported()
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100905
906 import {exp_name} from './Xexport.vim'
907 g:imported_name = exp_name
908 exp_name ..= ' Doe'
909 g:imported_name_appended = exp_name
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100910 g:imported_later = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100911 END
912
913 writefile(import_script_lines, 'Ximport.vim')
914 writefile(s:export_script_lines, 'Xexport.vim')
915
916 source Ximport.vim
917
918 assert_equal('bobbie', g:result)
919 assert_equal('bob', g:localname)
920 assert_equal(9876, g:imported)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100921 assert_equal(9879, g:imported_added)
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100922 assert_equal(9879, g:imported_later)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100923 assert_equal('Exported', g:imported_func)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100924 assert_equal('John', g:imported_name)
925 assert_equal('John Doe', g:imported_name_appended)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100926 assert_false(exists('g:name'))
927
928 unlet g:result
929 unlet g:localname
930 unlet g:imported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100931 unlet g:imported_added
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100932 unlet g:imported_later
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100933 unlet g:imported_func
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100934 unlet g:imported_name g:imported_name_appended
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100935 delete('Ximport.vim')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100936
Bram Moolenaar1c991142020-07-04 13:15:31 +0200937 # similar, with line breaks
938 let import_line_break_script_lines =<< trim END
939 vim9script
940 import {
941 exported,
942 Exported,
943 }
944 from
945 './Xexport.vim'
946 g:imported = exported
947 exported += 5
948 g:imported_added = exported
949 g:imported_func = Exported()
950 END
951 writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
952 source Ximport_lbr.vim
953
954 assert_equal(9876, g:imported)
955 assert_equal(9881, g:imported_added)
956 assert_equal('Exported', g:imported_func)
957
958 # exported script not sourced again
959 assert_false(exists('g:result'))
960 unlet g:imported
961 unlet g:imported_added
962 unlet g:imported_func
963 delete('Ximport_lbr.vim')
964
965 # import inside :def function
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100966 let import_in_def_lines =<< trim END
967 vim9script
968 def ImportInDef()
969 import exported from './Xexport.vim'
970 g:imported = exported
971 exported += 7
972 g:imported_added = exported
973 enddef
974 ImportInDef()
975 END
976 writefile(import_in_def_lines, 'Ximport2.vim')
977 source Ximport2.vim
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200978 # TODO: this should be 9879
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100979 assert_equal(9876, g:imported)
980 assert_equal(9883, g:imported_added)
981 unlet g:imported
982 unlet g:imported_added
983 delete('Ximport2.vim')
984
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100985 let import_star_as_lines =<< trim END
986 vim9script
987 import * as Export from './Xexport.vim'
988 def UseExport()
989 g:imported = Export.exported
990 enddef
991 UseExport()
992 END
993 writefile(import_star_as_lines, 'Ximport.vim')
994 source Ximport.vim
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100995 assert_equal(9883, g:imported)
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100996
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100997 let import_star_as_lines_no_dot =<< trim END
998 vim9script
999 import * as Export from './Xexport.vim'
1000 def Func()
1001 let dummy = 1
1002 let imported = Export + dummy
1003 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +02001004 defcompile
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001005 END
1006 writefile(import_star_as_lines_no_dot, 'Ximport.vim')
1007 assert_fails('source Ximport.vim', 'E1060:')
1008
1009 let import_star_as_lines_dot_space =<< trim END
1010 vim9script
1011 import * as Export from './Xexport.vim'
1012 def Func()
1013 let imported = Export . exported
1014 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +02001015 defcompile
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001016 END
1017 writefile(import_star_as_lines_dot_space, 'Ximport.vim')
1018 assert_fails('source Ximport.vim', 'E1074:')
1019
1020 let import_star_as_lines_missing_name =<< trim END
1021 vim9script
1022 import * as Export from './Xexport.vim'
1023 def Func()
1024 let imported = Export.
1025 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +02001026 defcompile
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001027 END
1028 writefile(import_star_as_lines_missing_name, 'Ximport.vim')
1029 assert_fails('source Ximport.vim', 'E1048:')
1030
Bram Moolenaar1c991142020-07-04 13:15:31 +02001031 let import_star_as_lbr_lines =<< trim END
1032 vim9script
1033 import *
1034 as Export
1035 from
1036 './Xexport.vim'
1037 def UseExport()
1038 g:imported = Export.exported
1039 enddef
1040 UseExport()
1041 END
1042 writefile(import_star_as_lbr_lines, 'Ximport.vim')
1043 source Ximport.vim
1044 assert_equal(9883, g:imported)
1045
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001046 let import_star_lines =<< trim END
1047 vim9script
1048 import * from './Xexport.vim'
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001049 END
1050 writefile(import_star_lines, 'Ximport.vim')
1051 assert_fails('source Ximport.vim', 'E1045:')
1052
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001053 # try to import something that exists but is not exported
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001054 let import_not_exported_lines =<< trim END
1055 vim9script
1056 import name from './Xexport.vim'
1057 END
1058 writefile(import_not_exported_lines, 'Ximport.vim')
1059 assert_fails('source Ximport.vim', 'E1049:')
1060
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001061 # try to import something that is already defined
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001062 let import_already_defined =<< trim END
1063 vim9script
1064 let exported = 'something'
1065 import exported from './Xexport.vim'
1066 END
1067 writefile(import_already_defined, 'Ximport.vim')
1068 assert_fails('source Ximport.vim', 'E1073:')
1069
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001070 # try to import something that is already defined
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001071 import_already_defined =<< trim END
1072 vim9script
1073 let exported = 'something'
1074 import * as exported from './Xexport.vim'
1075 END
1076 writefile(import_already_defined, 'Ximport.vim')
1077 assert_fails('source Ximport.vim', 'E1073:')
1078
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001079 # try to import something that is already defined
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001080 import_already_defined =<< trim END
1081 vim9script
1082 let exported = 'something'
1083 import {exported} from './Xexport.vim'
1084 END
1085 writefile(import_already_defined, 'Ximport.vim')
1086 assert_fails('source Ximport.vim', 'E1073:')
1087
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001088 # import a very long name, requires making a copy
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001089 let import_long_name_lines =<< trim END
1090 vim9script
1091 import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1092 END
1093 writefile(import_long_name_lines, 'Ximport.vim')
1094 assert_fails('source Ximport.vim', 'E1048:')
1095
1096 let import_no_from_lines =<< trim END
1097 vim9script
1098 import name './Xexport.vim'
1099 END
1100 writefile(import_no_from_lines, 'Ximport.vim')
1101 assert_fails('source Ximport.vim', 'E1070:')
1102
1103 let import_invalid_string_lines =<< trim END
1104 vim9script
1105 import name from Xexport.vim
1106 END
1107 writefile(import_invalid_string_lines, 'Ximport.vim')
1108 assert_fails('source Ximport.vim', 'E1071:')
1109
1110 let import_wrong_name_lines =<< trim END
1111 vim9script
1112 import name from './XnoExport.vim'
1113 END
1114 writefile(import_wrong_name_lines, 'Ximport.vim')
1115 assert_fails('source Ximport.vim', 'E1053:')
1116
1117 let import_missing_comma_lines =<< trim END
1118 vim9script
1119 import {exported name} from './Xexport.vim'
1120 END
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001121 writefile(import_missing_comma_lines, 'Ximport3.vim')
1122 assert_fails('source Ximport3.vim', 'E1046:')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001123
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001124 delete('Ximport.vim')
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001125 delete('Ximport3.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001126 delete('Xexport.vim')
1127
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001128 # Check that in a Vim9 script 'cpo' is set to the Vim default.
Bram Moolenaar750802b2020-02-23 18:08:33 +01001129 set cpo&vi
1130 let cpo_before = &cpo
1131 let lines =<< trim END
1132 vim9script
1133 g:cpo_in_vim9script = &cpo
1134 END
1135 writefile(lines, 'Xvim9_script')
1136 source Xvim9_script
1137 assert_equal(cpo_before, &cpo)
1138 set cpo&vim
1139 assert_equal(&cpo, g:cpo_in_vim9script)
1140 delete('Xvim9_script')
1141enddef
1142
1143def Test_vim9script_fails()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001144 CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
1145 CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +01001146 CheckScriptFailure(['export let some = 123'], 'E1042:')
Bram Moolenaar9721fb42020-06-11 23:10:46 +02001147 CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +02001148 CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
Bram Moolenaar750802b2020-02-23 18:08:33 +01001149 CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1150
Bram Moolenaarc785b9a2020-06-19 18:34:15 +02001151 CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:')
1152 CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1153
Bram Moolenaar750802b2020-02-23 18:08:33 +01001154 assert_fails('vim9script', 'E1038')
Bram Moolenaara26b9702020-04-18 19:53:28 +02001155 assert_fails('export something', 'E1043')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001156enddef
1157
Bram Moolenaarf7d267e2020-06-17 12:04:54 +02001158func Test_import_fails_without_script()
Bram Moolenaar101f4812020-06-16 23:18:51 +02001159 CheckRunVimInTerminal
1160
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001161 " call indirectly to avoid compilation error for missing functions
Bram Moolenaarc620c052020-07-08 15:16:19 +02001162 call Run_Test_import_fails_on_command_line()
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001163endfunc
1164
Bram Moolenaarc620c052020-07-08 15:16:19 +02001165def Run_Test_import_fails_on_command_line()
Bram Moolenaar101f4812020-06-16 23:18:51 +02001166 let export =<< trim END
1167 vim9script
1168 export def Foo(): number
1169 return 0
1170 enddef
1171 END
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001172 writefile(export, 'Xexport.vim')
Bram Moolenaar101f4812020-06-16 23:18:51 +02001173
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001174 let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{
1175 rows: 6, wait_for_ruler: 0})
1176 WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
Bram Moolenaar101f4812020-06-16 23:18:51 +02001177
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001178 delete('Xexport.vim')
1179 StopVimInTerminal(buf)
1180enddef
Bram Moolenaar101f4812020-06-16 23:18:51 +02001181
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001182def Test_vim9script_reload_import()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001183 let lines =<< trim END
1184 vim9script
1185 const var = ''
1186 let valone = 1234
1187 def MyFunc(arg: string)
1188 valone = 5678
1189 enddef
1190 END
1191 let morelines =<< trim END
1192 let valtwo = 222
1193 export def GetValtwo(): number
1194 return valtwo
1195 enddef
1196 END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001197 writefile(lines + morelines, 'Xreload.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001198 source Xreload.vim
1199 source Xreload.vim
1200 source Xreload.vim
1201
1202 let testlines =<< trim END
1203 vim9script
1204 def TheFunc()
1205 import GetValtwo from './Xreload.vim'
1206 assert_equal(222, GetValtwo())
1207 enddef
1208 TheFunc()
1209 END
1210 writefile(testlines, 'Ximport.vim')
1211 source Ximport.vim
1212
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001213 # Test that when not using "morelines" GetValtwo() and valtwo are still
1214 # defined, because import doesn't reload a script.
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001215 writefile(lines, 'Xreload.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001216 source Ximport.vim
1217
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001218 # cannot declare a var twice
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001219 lines =<< trim END
1220 vim9script
1221 let valone = 1234
1222 let valone = 5678
1223 END
1224 writefile(lines, 'Xreload.vim')
1225 assert_fails('source Xreload.vim', 'E1041:')
1226
1227 delete('Xreload.vim')
1228 delete('Ximport.vim')
1229enddef
1230
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001231" Not exported function that is referenced needs to be accessed by the
1232" script-local name.
1233def Test_vim9script_funcref()
1234 let sortlines =<< trim END
1235 vim9script
1236 def Compare(i1: number, i2: number): number
Bram Moolenaarbed36b92020-07-07 23:31:36 +02001237 return i2 - i1
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001238 enddef
1239
1240 export def FastSort(): list<number>
1241 return range(5)->sort(Compare)
1242 enddef
1243 END
1244 writefile(sortlines, 'Xsort.vim')
1245
1246 let lines =<< trim END
1247 vim9script
1248 import FastSort from './Xsort.vim'
1249 def Test()
1250 g:result = FastSort()
1251 enddef
1252 Test()
1253 END
1254 writefile(lines, 'Xscript.vim')
1255
1256 source Xscript.vim
1257 assert_equal([4, 3, 2, 1, 0], g:result)
1258
1259 unlet g:result
1260 delete('Xsort.vim')
1261 delete('Xscript.vim')
1262enddef
1263
Bram Moolenaarc620c052020-07-08 15:16:19 +02001264" Check that when searcing for "FilterFunc" it doesn't find the import in the
1265" script where FastFilter() is called from.
1266def Test_vim9script_funcref_other_script()
1267 let filterLines =<< trim END
1268 vim9script
1269 export def FilterFunc(idx: number, val: number): bool
1270 return idx % 2 == 1
1271 enddef
1272 export def FastFilter(): list<number>
1273 return range(10)->filter('FilterFunc')
1274 enddef
1275 END
1276 writefile(filterLines, 'Xfilter.vim')
1277
1278 let lines =<< trim END
1279 vim9script
1280 import {FilterFunc, FastFilter} from './Xfilter.vim'
1281 def Test()
1282 let x: list<number> = FastFilter()
1283 enddef
1284 Test()
1285 END
1286 writefile(lines, 'Ximport.vim')
1287 assert_fails('source Ximport.vim', 'E121:')
1288
1289 delete('Xfilter.vim')
1290 delete('Ximport.vim')
1291enddef
1292
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001293def Test_vim9script_reload_delfunc()
1294 let first_lines =<< trim END
1295 vim9script
1296 def FuncYes(): string
1297 return 'yes'
1298 enddef
1299 END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001300 let withno_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001301 def FuncNo(): string
1302 return 'no'
1303 enddef
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001304 def g:DoCheck(no_exists: bool)
1305 assert_equal('yes', FuncYes())
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001306 assert_equal('no', FuncNo())
1307 enddef
1308 END
1309 let nono_lines =<< trim END
1310 def g:DoCheck(no_exists: bool)
1311 assert_equal('yes', FuncYes())
1312 assert_fails('call FuncNo()', 'E117:')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001313 enddef
1314 END
1315
1316 # FuncNo() is defined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001317 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001318 source Xreloaded.vim
1319 g:DoCheck(true)
1320
1321 # FuncNo() is not redefined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001322 writefile(first_lines + nono_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001323 source Xreloaded.vim
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001324 g:DoCheck()
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001325
1326 # FuncNo() is back
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001327 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001328 source Xreloaded.vim
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001329 g:DoCheck()
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001330
1331 delete('Xreloaded.vim')
1332enddef
1333
Bram Moolenaar89483d42020-05-10 15:24:44 +02001334def Test_vim9script_reload_delvar()
1335 # write the script with a script-local variable
1336 let lines =<< trim END
1337 vim9script
1338 let var = 'string'
1339 END
1340 writefile(lines, 'XreloadVar.vim')
1341 source XreloadVar.vim
1342
1343 # now write the script using the same variable locally - works
1344 lines =<< trim END
1345 vim9script
1346 def Func()
1347 let var = 'string'
1348 enddef
1349 END
1350 writefile(lines, 'XreloadVar.vim')
1351 source XreloadVar.vim
1352
1353 delete('XreloadVar.vim')
1354enddef
1355
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001356def Test_import_absolute()
1357 let import_lines = [
Bram Moolenaare6085c52020-04-12 20:19:16 +02001358 'vim9script',
1359 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1360 'def UseExported()',
1361 ' g:imported_abs = exported',
1362 ' exported = 8888',
1363 ' g:imported_after = exported',
1364 'enddef',
1365 'UseExported()',
1366 'g:import_disassembled = execute("disass UseExported")',
1367 ]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001368 writefile(import_lines, 'Ximport_abs.vim')
1369 writefile(s:export_script_lines, 'Xexport_abs.vim')
1370
1371 source Ximport_abs.vim
1372
1373 assert_equal(9876, g:imported_abs)
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +01001374 assert_equal(8888, g:imported_after)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001375 assert_match('<SNR>\d\+_UseExported.*' ..
1376 'g:imported_abs = exported.*' ..
1377 '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1378 '1 STOREG g:imported_abs.*' ..
1379 'exported = 8888.*' ..
1380 '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1381 'g:imported_after = exported.*' ..
1382 '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1383 '5 STOREG g:imported_after.*',
Bram Moolenaare6085c52020-04-12 20:19:16 +02001384 g:import_disassembled)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001385 unlet g:imported_abs
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +01001386 unlet g:import_disassembled
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001387
1388 delete('Ximport_abs.vim')
1389 delete('Xexport_abs.vim')
1390enddef
1391
1392def Test_import_rtp()
1393 let import_lines = [
Bram Moolenaare6085c52020-04-12 20:19:16 +02001394 'vim9script',
1395 'import exported from "Xexport_rtp.vim"',
1396 'g:imported_rtp = exported',
1397 ]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001398 writefile(import_lines, 'Ximport_rtp.vim')
1399 mkdir('import')
1400 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
1401
1402 let save_rtp = &rtp
1403 &rtp = getcwd()
1404 source Ximport_rtp.vim
1405 &rtp = save_rtp
1406
1407 assert_equal(9876, g:imported_rtp)
1408 unlet g:imported_rtp
1409
1410 delete('Ximport_rtp.vim')
Bram Moolenaar89483d42020-05-10 15:24:44 +02001411 delete('import', 'rf')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001412enddef
1413
Bram Moolenaar25e0f582020-05-25 22:36:50 +02001414def Test_import_compile_error()
1415 let export_lines = [
1416 'vim9script',
1417 'export def ExpFunc(): string',
1418 ' return notDefined',
1419 'enddef',
1420 ]
1421 writefile(export_lines, 'Xexported.vim')
1422
1423 let import_lines = [
1424 'vim9script',
1425 'import ExpFunc from "./Xexported.vim"',
1426 'def ImpFunc()',
1427 ' echo ExpFunc()',
1428 'enddef',
1429 'defcompile',
1430 ]
1431 writefile(import_lines, 'Ximport.vim')
1432
1433 try
1434 source Ximport.vim
1435 catch /E1001/
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001436 # Error should be fore the Xexported.vim file.
Bram Moolenaar25e0f582020-05-25 22:36:50 +02001437 assert_match('E1001: variable not found: notDefined', v:exception)
1438 assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
1439 endtry
1440
1441 delete('Xexported.vim')
1442 delete('Ximport.vim')
1443enddef
1444
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001445def Test_fixed_size_list()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001446 # will be allocated as one piece of memory, check that changes work
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001447 let l = [1, 2, 3, 4]
1448 l->remove(0)
1449 l->add(5)
1450 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001451 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001452enddef
1453
Bram Moolenaar158906c2020-02-06 20:39:45 +01001454def IfElse(what: number): string
1455 let res = ''
1456 if what == 1
1457 res = "one"
1458 elseif what == 2
1459 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001460 else
Bram Moolenaar158906c2020-02-06 20:39:45 +01001461 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001462 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +01001463 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001464enddef
1465
Bram Moolenaar158906c2020-02-06 20:39:45 +01001466def Test_if_elseif_else()
1467 assert_equal('one', IfElse(1))
1468 assert_equal('two', IfElse(2))
1469 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001470enddef
1471
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001472def Test_if_elseif_else_fails()
1473 call CheckDefFailure(['elseif true'], 'E582:')
1474 call CheckDefFailure(['else'], 'E581:')
1475 call CheckDefFailure(['endif'], 'E580:')
1476 call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001477 call CheckDefFailure(['if true', 'echo 1'], 'E171:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001478enddef
1479
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001480let g:bool_true = v:true
1481let g:bool_false = v:false
1482
1483def Test_if_const_expr()
1484 let res = false
1485 if true ? true : false
1486 res = true
1487 endif
1488 assert_equal(true, res)
1489
Bram Moolenaar585fea72020-04-02 22:33:21 +02001490 g:glob = 2
1491 if false
Bram Moolenaar67979662020-06-20 22:50:47 +02001492 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001493 endif
1494 assert_equal(2, g:glob)
1495 if true
Bram Moolenaar67979662020-06-20 22:50:47 +02001496 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001497 endif
1498 assert_equal(3, g:glob)
1499
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001500 res = false
1501 if g:bool_true ? true : false
1502 res = true
1503 endif
1504 assert_equal(true, res)
1505
1506 res = false
1507 if true ? g:bool_true : false
1508 res = true
1509 endif
1510 assert_equal(true, res)
1511
1512 res = false
1513 if true ? true : g:bool_false
1514 res = true
1515 endif
1516 assert_equal(true, res)
1517
1518 res = false
1519 if true ? false : true
1520 res = true
1521 endif
1522 assert_equal(false, res)
1523
1524 res = false
1525 if false ? false : true
1526 res = true
1527 endif
1528 assert_equal(true, res)
1529
1530 res = false
1531 if false ? true : false
1532 res = true
1533 endif
1534 assert_equal(false, res)
1535
1536 res = false
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001537 if has('xyz') ? true : false
1538 res = true
1539 endif
1540 assert_equal(false, res)
1541
1542 res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001543 if true && true
1544 res = true
1545 endif
1546 assert_equal(true, res)
1547
1548 res = false
1549 if true && false
1550 res = true
1551 endif
1552 assert_equal(false, res)
1553
1554 res = false
1555 if g:bool_true && false
1556 res = true
1557 endif
1558 assert_equal(false, res)
1559
1560 res = false
1561 if true && g:bool_false
1562 res = true
1563 endif
1564 assert_equal(false, res)
1565
1566 res = false
1567 if false && false
1568 res = true
1569 endif
1570 assert_equal(false, res)
1571
1572 res = false
1573 if true || false
1574 res = true
1575 endif
1576 assert_equal(true, res)
1577
1578 res = false
1579 if g:bool_true || false
1580 res = true
1581 endif
1582 assert_equal(true, res)
1583
1584 res = false
1585 if true || g:bool_false
1586 res = true
1587 endif
1588 assert_equal(true, res)
1589
1590 res = false
1591 if false || false
1592 res = true
1593 endif
1594 assert_equal(false, res)
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02001595enddef
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001596
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02001597def Test_if_const_expr_fails()
1598 call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1599 call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001600 call CheckDefFailure(["if has('aaa'"], 'E110:')
1601 call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001602enddef
1603
Bram Moolenaar72abcf42020-06-18 18:26:24 +02001604def RunNested(i: number): number
1605 let x: number = 0
1606 if i % 2
1607 if 1
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001608 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02001609 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001610 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02001611 endif
1612 x += 1
1613 else
1614 x += 1000
1615 endif
1616 return x
1617enddef
1618
1619def Test_nested_if()
1620 assert_equal(1, RunNested(1))
1621 assert_equal(1000, RunNested(2))
1622enddef
1623
Bram Moolenaarad39c092020-02-26 18:23:43 +01001624def Test_execute_cmd()
1625 new
1626 setline(1, 'default')
1627 execute 'call setline(1, "execute-string")'
1628 assert_equal('execute-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001629
1630 execute "call setline(1, 'execute-string')"
1631 assert_equal('execute-string', getline(1))
1632
Bram Moolenaarad39c092020-02-26 18:23:43 +01001633 let cmd1 = 'call setline(1,'
1634 let cmd2 = '"execute-var")'
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001635 execute cmd1 cmd2 # comment
Bram Moolenaarad39c092020-02-26 18:23:43 +01001636 assert_equal('execute-var', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001637
Bram Moolenaarad39c092020-02-26 18:23:43 +01001638 execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1639 assert_equal('execute-var-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001640
Bram Moolenaarad39c092020-02-26 18:23:43 +01001641 let cmd_first = 'call '
1642 let cmd_last = 'setline(1, "execute-var-var")'
1643 execute cmd_first .. cmd_last
1644 assert_equal('execute-var-var', getline(1))
1645 bwipe!
Bram Moolenaar585fea72020-04-02 22:33:21 +02001646
1647 call CheckDefFailure(['execute xxx'], 'E1001:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001648 call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
Bram Moolenaarad39c092020-02-26 18:23:43 +01001649enddef
1650
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001651def Test_execute_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001652 # only checks line continuation
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001653 let lines =<< trim END
1654 vim9script
1655 execute 'g:someVar'
1656 .. ' = ' ..
1657 '28'
1658 assert_equal(28, g:someVar)
1659 unlet g:someVar
1660 END
1661 CheckScriptSuccess(lines)
1662enddef
1663
Bram Moolenaarad39c092020-02-26 18:23:43 +01001664def Test_echo_cmd()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001665 echo 'some' # comment
Bram Moolenaar585fea72020-04-02 22:33:21 +02001666 echon 'thing'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001667 assert_match('^something$', Screenline(&lines))
1668
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001669 echo "some" # comment
1670 echon "thing"
1671 assert_match('^something$', Screenline(&lines))
1672
Bram Moolenaarad39c092020-02-26 18:23:43 +01001673 let str1 = 'some'
1674 let str2 = 'more'
1675 echo str1 str2
1676 assert_match('^some more$', Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001677
1678 call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
Bram Moolenaarad39c092020-02-26 18:23:43 +01001679enddef
1680
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001681def Test_echomsg_cmd()
1682 echomsg 'some' 'more' # comment
1683 assert_match('^some more$', Screenline(&lines))
1684 echo 'clear'
Bram Moolenaardf069ee2020-06-22 23:02:51 +02001685 :1messages
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001686 assert_match('^some more$', Screenline(&lines))
1687
1688 call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1689enddef
1690
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001691def Test_echomsg_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001692 # only checks line continuation
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001693 let lines =<< trim END
1694 vim9script
1695 echomsg 'here'
1696 .. ' is ' ..
1697 'a message'
1698 assert_match('^here is a message$', Screenline(&lines))
1699 END
1700 CheckScriptSuccess(lines)
1701enddef
1702
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001703def Test_echoerr_cmd()
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001704 try
1705 echoerr 'something' 'wrong' # comment
1706 catch
1707 assert_match('something wrong', v:exception)
1708 endtry
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001709enddef
1710
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001711def Test_echoerr_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001712 # only checks line continuation
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001713 let lines =<< trim END
1714 vim9script
1715 try
1716 echoerr 'this'
1717 .. ' is ' ..
1718 'wrong'
1719 catch
1720 assert_match('this is wrong', v:exception)
1721 endtry
1722 END
1723 CheckScriptSuccess(lines)
1724enddef
1725
Bram Moolenaar41fe0612020-03-01 16:22:40 +01001726def Test_for_outside_of_function()
1727 let lines =<< trim END
1728 vim9script
1729 new
1730 for var in range(0, 3)
1731 append(line('$'), var)
1732 endfor
1733 assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
1734 bwipe!
1735 END
1736 writefile(lines, 'Xvim9for.vim')
1737 source Xvim9for.vim
1738 delete('Xvim9for.vim')
1739enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001740
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001741def Test_for_loop()
1742 let result = ''
1743 for cnt in range(7)
1744 if cnt == 4
1745 break
1746 endif
1747 if cnt == 2
1748 continue
1749 endif
1750 result ..= cnt .. '_'
1751 endfor
1752 assert_equal('0_1_3_', result)
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001753
1754 let concat = ''
1755 for str in eval('["one", "two"]')
1756 concat ..= str
1757 endfor
1758 assert_equal('onetwo', concat)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001759enddef
1760
1761def Test_for_loop_fails()
Bram Moolenaar675f7162020-04-12 22:53:54 +02001762 CheckDefFailure(['for # in range(5)'], 'E690:')
1763 CheckDefFailure(['for i In range(5)'], 'E690:')
1764 CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
Bram Moolenaar822ba242020-05-24 23:00:18 +02001765 CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001766 CheckDefFailure(['for i in "text"'], 'E1013:')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001767 CheckDefFailure(['for i in xxx'], 'E1001:')
1768 CheckDefFailure(['endfor'], 'E588:')
1769 CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001770enddef
1771
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01001772def Test_while_loop()
1773 let result = ''
1774 let cnt = 0
1775 while cnt < 555
1776 if cnt == 3
1777 break
1778 endif
1779 cnt += 1
1780 if cnt == 2
1781 continue
1782 endif
1783 result ..= cnt .. '_'
1784 endwhile
1785 assert_equal('1_3_', result)
1786enddef
1787
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001788def Test_while_loop_fails()
Bram Moolenaar675f7162020-04-12 22:53:54 +02001789 CheckDefFailure(['while xxx'], 'E1001:')
1790 CheckDefFailure(['endwhile'], 'E588:')
1791 CheckDefFailure(['continue'], 'E586:')
1792 CheckDefFailure(['if true', 'continue'], 'E586:')
1793 CheckDefFailure(['break'], 'E587:')
1794 CheckDefFailure(['if true', 'break'], 'E587:')
1795 CheckDefFailure(['while 1', 'echo 3'], 'E170:')
Bram Moolenaarbd5da372020-03-31 23:13:10 +02001796enddef
1797
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001798def Test_interrupt_loop()
Bram Moolenaar97acfc72020-03-22 13:44:28 +01001799 let caught = false
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001800 let x = 0
Bram Moolenaar97acfc72020-03-22 13:44:28 +01001801 try
1802 while 1
1803 x += 1
1804 if x == 100
1805 feedkeys("\<C-C>", 'Lt')
1806 endif
1807 endwhile
1808 catch
1809 caught = true
1810 assert_equal(100, x)
1811 endtry
1812 assert_true(caught, 'should have caught an exception')
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001813enddef
Bram Moolenaar20431c92020-03-20 18:39:46 +01001814
Bram Moolenaar4fdae992020-04-12 16:38:57 +02001815def Test_automatic_line_continuation()
1816 let mylist = [
1817 'one',
1818 'two',
1819 'three',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001820 ] # comment
Bram Moolenaar4fdae992020-04-12 16:38:57 +02001821 assert_equal(['one', 'two', 'three'], mylist)
1822
1823 let mydict = {
1824 'one': 1,
1825 'two': 2,
1826 'three':
1827 3,
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001828 } # comment
Bram Moolenaar4fdae992020-04-12 16:38:57 +02001829 assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
1830 mydict = #{
Bram Moolenaar2c330432020-04-13 14:41:35 +02001831 one: 1, # comment
1832 two: # comment
1833 2, # comment
1834 three: 3 # comment
1835 }
1836 assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1837 mydict = #{
1838 one: 1,
1839 two:
1840 2,
1841 three: 3
Bram Moolenaar4fdae992020-04-12 16:38:57 +02001842 }
1843 assert_equal(#{one: 1, two: 2, three: 3}, mydict)
Bram Moolenaare6085c52020-04-12 20:19:16 +02001844
1845 assert_equal(
1846 ['one', 'two', 'three'],
1847 split('one two three')
1848 )
Bram Moolenaar4fdae992020-04-12 16:38:57 +02001849enddef
1850
Bram Moolenaar7a092242020-04-16 22:10:49 +02001851def Test_vim9_comment()
1852 CheckScriptSuccess([
1853 'vim9script',
1854 '# something',
1855 ])
1856 CheckScriptFailure([
1857 'vim9script',
1858 ':# something',
1859 ], 'E488:')
1860 CheckScriptFailure([
1861 '# something',
1862 ], 'E488:')
1863 CheckScriptFailure([
1864 ':# something',
1865 ], 'E488:')
1866
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02001867 { # block start
1868 } # block end
1869 CheckDefFailure([
1870 '{# comment',
1871 ], 'E488:')
1872 CheckDefFailure([
1873 '{',
1874 '}# comment',
1875 ], 'E488:')
1876
1877 echo "yes" # comment
1878 CheckDefFailure([
1879 'echo "yes"# comment',
1880 ], 'E488:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02001881 CheckScriptSuccess([
1882 'vim9script',
1883 'echo "yes" # something',
1884 ])
1885 CheckScriptFailure([
1886 'vim9script',
1887 'echo "yes"# something',
1888 ], 'E121:')
1889 CheckScriptFailure([
1890 'vim9script',
1891 'echo# something',
1892 ], 'E121:')
1893 CheckScriptFailure([
1894 'echo "yes" # something',
1895 ], 'E121:')
1896
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02001897 exe "echo" # comment
1898 CheckDefFailure([
1899 'exe "echo"# comment',
1900 ], 'E488:')
1901 CheckScriptSuccess([
1902 'vim9script',
1903 'exe "echo" # something',
1904 ])
1905 CheckScriptFailure([
1906 'vim9script',
1907 'exe "echo"# something',
1908 ], 'E121:')
1909 CheckDefFailure([
1910 'exe # comment',
1911 ], 'E1015:')
1912 CheckScriptFailure([
1913 'vim9script',
1914 'exe# something',
1915 ], 'E121:')
1916 CheckScriptFailure([
1917 'exe "echo" # something',
1918 ], 'E121:')
1919
Bram Moolenaar7a092242020-04-16 22:10:49 +02001920 CheckDefFailure([
1921 'try# comment',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001922 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02001923 'catch',
1924 'endtry',
1925 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001926 CheckScriptFailure([
1927 'vim9script',
1928 'try# comment',
1929 'echo "yes"',
1930 ], 'E488:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02001931 CheckDefFailure([
1932 'try',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001933 ' throw#comment',
1934 'catch',
1935 'endtry',
1936 ], 'E1015:')
1937 CheckDefFailure([
1938 'try',
1939 ' throw "yes"#comment',
1940 'catch',
1941 'endtry',
1942 ], 'E488:')
1943 CheckDefFailure([
1944 'try',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001945 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02001946 'catch# comment',
1947 'endtry',
1948 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001949 CheckScriptFailure([
1950 'vim9script',
1951 'try',
1952 ' echo "yes"',
1953 'catch# comment',
1954 'endtry',
1955 ], 'E654:')
1956 CheckDefFailure([
1957 'try',
1958 ' echo "yes"',
1959 'catch /pat/# comment',
1960 'endtry',
1961 ], 'E488:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02001962 CheckDefFailure([
1963 'try',
1964 'echo "yes"',
1965 'catch',
1966 'endtry# comment',
1967 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001968 CheckScriptFailure([
1969 'vim9script',
1970 'try',
1971 ' echo "yes"',
1972 'catch',
1973 'endtry# comment',
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +02001974 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001975
1976 CheckScriptSuccess([
1977 'vim9script',
1978 'hi # comment',
1979 ])
1980 CheckScriptFailure([
1981 'vim9script',
1982 'hi# comment',
1983 ], 'E416:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02001984 CheckScriptSuccess([
1985 'vim9script',
1986 'hi Search # comment',
1987 ])
1988 CheckScriptFailure([
1989 'vim9script',
1990 'hi Search# comment',
1991 ], 'E416:')
1992 CheckScriptSuccess([
1993 'vim9script',
1994 'hi link This Search # comment',
1995 ])
1996 CheckScriptFailure([
1997 'vim9script',
1998 'hi link This That# comment',
1999 ], 'E413:')
2000 CheckScriptSuccess([
2001 'vim9script',
2002 'hi clear This # comment',
2003 'hi clear # comment',
2004 ])
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002005 # not tested, because it doesn't give an error but a warning:
2006 # hi clear This# comment',
Bram Moolenaar1966c242020-04-20 22:42:32 +02002007 CheckScriptFailure([
2008 'vim9script',
2009 'hi clear# comment',
2010 ], 'E416:')
2011
2012 CheckScriptSuccess([
2013 'vim9script',
2014 'hi Group term=bold',
2015 'match Group /todo/ # comment',
2016 ])
2017 CheckScriptFailure([
2018 'vim9script',
2019 'hi Group term=bold',
2020 'match Group /todo/# comment',
2021 ], 'E488:')
2022 CheckScriptSuccess([
2023 'vim9script',
2024 'match # comment',
2025 ])
2026 CheckScriptFailure([
2027 'vim9script',
2028 'match# comment',
2029 ], 'E475:')
2030 CheckScriptSuccess([
2031 'vim9script',
2032 'match none # comment',
2033 ])
2034 CheckScriptFailure([
2035 'vim9script',
2036 'match none# comment',
2037 ], 'E475:')
2038
2039 CheckScriptSuccess([
2040 'vim9script',
2041 'menutrans clear # comment',
2042 ])
2043 CheckScriptFailure([
2044 'vim9script',
2045 'menutrans clear# comment text',
2046 ], 'E474:')
2047
2048 CheckScriptSuccess([
2049 'vim9script',
2050 'syntax clear # comment',
2051 ])
2052 CheckScriptFailure([
2053 'vim9script',
2054 'syntax clear# comment text',
2055 ], 'E28:')
2056 CheckScriptSuccess([
2057 'vim9script',
2058 'syntax keyword Word some',
2059 'syntax clear Word # comment',
2060 ])
2061 CheckScriptFailure([
2062 'vim9script',
2063 'syntax keyword Word some',
2064 'syntax clear Word# comment text',
2065 ], 'E28:')
2066
2067 CheckScriptSuccess([
2068 'vim9script',
2069 'syntax list # comment',
2070 ])
2071 CheckScriptFailure([
2072 'vim9script',
2073 'syntax list# comment text',
2074 ], 'E28:')
2075
2076 CheckScriptSuccess([
2077 'vim9script',
2078 'syntax match Word /pat/ oneline # comment',
2079 ])
2080 CheckScriptFailure([
2081 'vim9script',
2082 'syntax match Word /pat/ oneline# comment',
2083 ], 'E475:')
2084
2085 CheckScriptSuccess([
2086 'vim9script',
2087 'syntax keyword Word word # comm[ent',
2088 ])
2089 CheckScriptFailure([
2090 'vim9script',
2091 'syntax keyword Word word# comm[ent',
2092 ], 'E789:')
2093
2094 CheckScriptSuccess([
2095 'vim9script',
2096 'syntax match Word /pat/ # comment',
2097 ])
2098 CheckScriptFailure([
2099 'vim9script',
2100 'syntax match Word /pat/# comment',
2101 ], 'E402:')
2102
2103 CheckScriptSuccess([
2104 'vim9script',
2105 'syntax match Word /pat/ contains=Something # comment',
2106 ])
2107 CheckScriptFailure([
2108 'vim9script',
2109 'syntax match Word /pat/ contains=Something# comment',
2110 ], 'E475:')
2111 CheckScriptFailure([
2112 'vim9script',
2113 'syntax match Word /pat/ contains= # comment',
2114 ], 'E406:')
2115 CheckScriptFailure([
2116 'vim9script',
2117 'syntax match Word /pat/ contains=# comment',
2118 ], 'E475:')
2119
2120 CheckScriptSuccess([
2121 'vim9script',
2122 'syntax region Word start=/pat/ end=/pat/ # comment',
2123 ])
2124 CheckScriptFailure([
2125 'vim9script',
2126 'syntax region Word start=/pat/ end=/pat/# comment',
Bram Moolenaard032f342020-07-18 18:13:02 +02002127 ], 'E402:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02002128
2129 CheckScriptSuccess([
2130 'vim9script',
2131 'syntax sync # comment',
2132 ])
2133 CheckScriptFailure([
2134 'vim9script',
2135 'syntax sync# comment',
2136 ], 'E404:')
2137 CheckScriptSuccess([
2138 'vim9script',
2139 'syntax sync ccomment # comment',
2140 ])
2141 CheckScriptFailure([
2142 'vim9script',
2143 'syntax sync ccomment# comment',
2144 ], 'E404:')
2145
2146 CheckScriptSuccess([
2147 'vim9script',
2148 'syntax cluster Some contains=Word # comment',
2149 ])
2150 CheckScriptFailure([
2151 'vim9script',
2152 'syntax cluster Some contains=Word# comment',
2153 ], 'E475:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002154
2155 CheckScriptSuccess([
2156 'vim9script',
2157 'command Echo echo # comment',
2158 'command Echo # comment',
2159 ])
2160 CheckScriptFailure([
2161 'vim9script',
2162 'command Echo echo# comment',
2163 'Echo',
2164 ], 'E121:')
2165 CheckScriptFailure([
2166 'vim9script',
2167 'command Echo# comment',
2168 ], 'E182:')
2169 CheckScriptFailure([
2170 'vim9script',
2171 'command Echo echo',
2172 'command Echo# comment',
2173 ], 'E182:')
2174
2175 CheckScriptSuccess([
2176 'vim9script',
2177 'function # comment',
2178 ])
2179 CheckScriptFailure([
2180 'vim9script',
2181 'function# comment',
2182 ], 'E129:')
2183 CheckScriptSuccess([
2184 'vim9script',
2185 'function CheckScriptSuccess # comment',
2186 ])
2187 CheckScriptFailure([
2188 'vim9script',
2189 'function CheckScriptSuccess# comment',
2190 ], 'E488:')
2191
2192 CheckScriptSuccess([
2193 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002194 'func g:DeleteMeA()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002195 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002196 'delfunction g:DeleteMeA # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002197 ])
2198 CheckScriptFailure([
2199 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002200 'func g:DeleteMeB()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002201 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002202 'delfunction g:DeleteMeB# comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002203 ], 'E488:')
2204
2205 CheckScriptSuccess([
2206 'vim9script',
2207 'call execute("ls") # comment',
2208 ])
2209 CheckScriptFailure([
2210 'vim9script',
2211 'call execute("ls")# comment',
2212 ], 'E488:')
Bram Moolenaare7e48382020-07-22 18:17:08 +02002213
2214 CheckScriptFailure([
2215 'def Test() " comment',
2216 'enddef',
2217 ], 'E488:')
2218 CheckScriptFailure([
2219 'vim9script',
2220 'def Test() " comment',
2221 'enddef',
2222 ], 'E488:')
2223
2224 CheckScriptSuccess([
2225 'func Test() " comment',
2226 'endfunc',
2227 ])
2228 CheckScriptFailure([
2229 'vim9script',
2230 'func Test() " comment',
2231 'endfunc',
2232 ], 'E488:')
2233
2234 CheckScriptSuccess([
2235 'def Test() # comment',
2236 'enddef',
2237 ])
2238 CheckScriptFailure([
2239 'func Test() # comment',
2240 'endfunc',
2241 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002242enddef
2243
2244def Test_vim9_comment_gui()
2245 CheckCanRunGui
2246
2247 CheckScriptFailure([
2248 'vim9script',
2249 'gui#comment'
2250 ], 'E499:')
2251 CheckScriptFailure([
2252 'vim9script',
2253 'gui -f#comment'
2254 ], 'E499:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02002255enddef
2256
Bram Moolenaara26b9702020-04-18 19:53:28 +02002257def Test_vim9_comment_not_compiled()
Bram Moolenaar67979662020-06-20 22:50:47 +02002258 au TabEnter *.vim g:entered = 1
2259 au TabEnter *.x g:entered = 2
Bram Moolenaara26b9702020-04-18 19:53:28 +02002260
2261 edit test.vim
2262 doautocmd TabEnter #comment
2263 assert_equal(1, g:entered)
2264
2265 doautocmd TabEnter f.x
2266 assert_equal(2, g:entered)
2267
2268 g:entered = 0
2269 doautocmd TabEnter f.x #comment
2270 assert_equal(2, g:entered)
2271
2272 assert_fails('doautocmd Syntax#comment', 'E216:')
2273
2274 au! TabEnter
2275 unlet g:entered
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02002276
2277 CheckScriptSuccess([
2278 'vim9script',
Bram Moolenaar67979662020-06-20 22:50:47 +02002279 'g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02002280 'b:var = 456',
2281 'w:var = 777',
2282 't:var = 888',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02002283 'unlet g:var w:var # something',
2284 ])
2285
2286 CheckScriptFailure([
2287 'vim9script',
2288 'let g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02002289 ], 'E1016: Cannot declare a global variable:')
2290
2291 CheckScriptFailure([
2292 'vim9script',
2293 'let b:var = 123',
2294 ], 'E1016: Cannot declare a buffer variable:')
2295
2296 CheckScriptFailure([
2297 'vim9script',
2298 'let w:var = 123',
2299 ], 'E1016: Cannot declare a window variable:')
2300
2301 CheckScriptFailure([
2302 'vim9script',
2303 'let t:var = 123',
2304 ], 'E1016: Cannot declare a tab variable:')
2305
2306 CheckScriptFailure([
2307 'vim9script',
2308 'let v:version = 123',
2309 ], 'E1016: Cannot declare a v: variable:')
2310
2311 CheckScriptFailure([
2312 'vim9script',
2313 'let $VARIABLE = "text"',
2314 ], 'E1016: Cannot declare an environment variable:')
Bram Moolenaar67979662020-06-20 22:50:47 +02002315
2316 CheckScriptFailure([
2317 'vim9script',
2318 'g:var = 123',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002319 'unlet g:var# comment1',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02002320 ], 'E108:')
2321
2322 CheckScriptFailure([
2323 'let g:var = 123',
2324 'unlet g:var # something',
2325 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002326
2327 CheckScriptSuccess([
2328 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002329 'if 1 # comment2',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002330 ' echo "yes"',
2331 'elseif 2 #comment',
2332 ' echo "no"',
2333 'endif',
2334 ])
2335
2336 CheckScriptFailure([
2337 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002338 'if 1# comment3',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002339 ' echo "yes"',
2340 'endif',
2341 ], 'E15:')
2342
2343 CheckScriptFailure([
2344 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002345 'if 0 # comment4',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002346 ' echo "yes"',
2347 'elseif 2#comment',
2348 ' echo "no"',
2349 'endif',
2350 ], 'E15:')
2351
2352 CheckScriptSuccess([
2353 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002354 'let v = 1 # comment5',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002355 ])
2356
2357 CheckScriptFailure([
2358 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002359 'let v = 1# comment6',
2360 ], 'E15:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002361
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002362 CheckScriptSuccess([
2363 'vim9script',
2364 'new'
2365 'call setline(1, ["# define pat", "last"])',
Bram Moolenaardf069ee2020-06-22 23:02:51 +02002366 ':$',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002367 'dsearch /pat/ #comment',
2368 'bwipe!',
2369 ])
2370
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002371 CheckScriptFailure([
2372 'vim9script',
2373 'new'
2374 'call setline(1, ["# define pat", "last"])',
2375 ':$',
2376 'dsearch /pat/#comment',
2377 'bwipe!',
2378 ], 'E488:')
2379
2380 CheckScriptFailure([
2381 'vim9script',
2382 'func! SomeFunc()',
2383 ], 'E477:')
Bram Moolenaara26b9702020-04-18 19:53:28 +02002384enddef
2385
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02002386def Test_finish()
2387 let lines =<< trim END
2388 vim9script
Bram Moolenaar67979662020-06-20 22:50:47 +02002389 g:res = 'one'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02002390 if v:false | finish | endif
Bram Moolenaar67979662020-06-20 22:50:47 +02002391 g:res = 'two'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02002392 finish
Bram Moolenaar67979662020-06-20 22:50:47 +02002393 g:res = 'three'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02002394 END
2395 writefile(lines, 'Xfinished')
2396 source Xfinished
2397 assert_equal('two', g:res)
2398
2399 unlet g:res
2400 delete('Xfinished')
2401enddef
2402
Bram Moolenaar32e35112020-05-14 22:41:15 +02002403def Test_let_func_call()
2404 let lines =<< trim END
2405 vim9script
2406 func GetValue()
2407 if exists('g:count')
2408 let g:count += 1
2409 else
2410 let g:count = 1
2411 endif
2412 return 'this'
2413 endfunc
2414 let val: string = GetValue()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002415 # env var is always a string
Bram Moolenaardf671b42020-05-16 22:33:33 +02002416 let env = $TERM
Bram Moolenaar32e35112020-05-14 22:41:15 +02002417 END
2418 writefile(lines, 'Xfinished')
2419 source Xfinished
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002420 # GetValue() is not called during discovery phase
Bram Moolenaar32e35112020-05-14 22:41:15 +02002421 assert_equal(1, g:count)
2422
2423 unlet g:count
2424 delete('Xfinished')
2425enddef
2426
2427def Test_let_missing_type()
2428 let lines =<< trim END
2429 vim9script
Bram Moolenaardf671b42020-05-16 22:33:33 +02002430 let var = g:unknown
Bram Moolenaar227a69d2020-05-15 18:17:28 +02002431 END
Bram Moolenaar822ba242020-05-24 23:00:18 +02002432 CheckScriptFailure(lines, 'E121:')
Bram Moolenaar227a69d2020-05-15 18:17:28 +02002433
2434 lines =<< trim END
2435 vim9script
2436 let nr: number = 123
2437 let var = nr
2438 END
Bram Moolenaar822ba242020-05-24 23:00:18 +02002439 CheckScriptSuccess(lines)
Bram Moolenaar32e35112020-05-14 22:41:15 +02002440enddef
2441
Bram Moolenaarc82a5b52020-06-13 18:09:19 +02002442def Test_let_declaration()
2443 let lines =<< trim END
2444 vim9script
2445 let var: string
2446 g:var_uninit = var
2447 var = 'text'
2448 g:var_test = var
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002449 # prefixing s: is optional
Bram Moolenaar984dddb2020-06-14 12:50:24 +02002450 s:var = 'prefixed'
2451 g:var_prefixed = s:var
2452
2453 let s:other: number
2454 other = 1234
2455 g:other_var = other
Bram Moolenaarc82a5b52020-06-13 18:09:19 +02002456 END
2457 CheckScriptSuccess(lines)
2458 assert_equal('', g:var_uninit)
2459 assert_equal('text', g:var_test)
Bram Moolenaar984dddb2020-06-14 12:50:24 +02002460 assert_equal('prefixed', g:var_prefixed)
2461 assert_equal(1234, g:other_var)
Bram Moolenaarc82a5b52020-06-13 18:09:19 +02002462
2463 unlet g:var_uninit
2464 unlet g:var_test
Bram Moolenaar984dddb2020-06-14 12:50:24 +02002465 unlet g:var_prefixed
2466 unlet g:other_var
Bram Moolenaarc82a5b52020-06-13 18:09:19 +02002467enddef
2468
Bram Moolenaarc5b1c202020-06-18 22:43:27 +02002469def Test_let_declaration_fails()
2470 let lines =<< trim END
2471 vim9script
2472 const var: string
2473 END
2474 CheckScriptFailure(lines, 'E1021:')
2475
2476 lines =<< trim END
2477 vim9script
2478 let 9var: string
2479 END
2480 CheckScriptFailure(lines, 'E475:')
2481enddef
2482
Bram Moolenaar34db91f2020-06-13 19:00:10 +02002483def Test_let_type_check()
2484 let lines =<< trim END
2485 vim9script
2486 let var: string
2487 var = 1234
2488 END
2489 CheckScriptFailure(lines, 'E1013:')
Bram Moolenaar984dddb2020-06-14 12:50:24 +02002490
2491 lines =<< trim END
2492 vim9script
2493 let var:string
2494 END
2495 CheckScriptFailure(lines, 'E1069:')
Bram Moolenaarc5b1c202020-06-18 22:43:27 +02002496
2497 lines =<< trim END
2498 vim9script
2499 let var: asdf
2500 END
2501 CheckScriptFailure(lines, 'E1010:')
Bram Moolenaar34db91f2020-06-13 19:00:10 +02002502enddef
2503
Bram Moolenaara5d00772020-05-14 23:20:55 +02002504def Test_forward_declaration()
2505 let lines =<< trim END
2506 vim9script
Bram Moolenaara5d00772020-05-14 23:20:55 +02002507 def GetValue(): string
2508 return theVal
2509 enddef
2510 let theVal = 'something'
Bram Moolenaar822ba242020-05-24 23:00:18 +02002511 g:initVal = GetValue()
Bram Moolenaara5d00772020-05-14 23:20:55 +02002512 theVal = 'else'
2513 g:laterVal = GetValue()
2514 END
2515 writefile(lines, 'Xforward')
2516 source Xforward
2517 assert_equal('something', g:initVal)
2518 assert_equal('else', g:laterVal)
2519
2520 unlet g:initVal
2521 unlet g:laterVal
2522 delete('Xforward')
2523enddef
2524
Bram Moolenaar9721fb42020-06-11 23:10:46 +02002525def Test_source_vim9_from_legacy()
2526 let legacy_lines =<< trim END
2527 source Xvim9_script.vim
2528
2529 call assert_false(exists('local'))
2530 call assert_false(exists('exported'))
2531 call assert_false(exists('s:exported'))
2532 call assert_equal('global', global)
2533 call assert_equal('global', g:global)
2534
2535 " imported variable becomes script-local
2536 import exported from './Xvim9_script.vim'
2537 call assert_equal('exported', s:exported)
2538 call assert_false(exists('exported'))
2539
2540 " imported function becomes script-local
2541 import GetText from './Xvim9_script.vim'
2542 call assert_equal('text', s:GetText())
2543 call assert_false(exists('*GetText'))
2544 END
2545 writefile(legacy_lines, 'Xlegacy_script.vim')
2546
2547 let vim9_lines =<< trim END
2548 vim9script
2549 let local = 'local'
2550 g:global = 'global'
2551 export let exported = 'exported'
2552 export def GetText(): string
2553 return 'text'
2554 enddef
2555 END
2556 writefile(vim9_lines, 'Xvim9_script.vim')
2557
2558 source Xlegacy_script.vim
2559
2560 assert_equal('global', g:global)
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002561 unlet g:global
Bram Moolenaar9721fb42020-06-11 23:10:46 +02002562
2563 delete('Xlegacy_script.vim')
2564 delete('Xvim9_script.vim')
2565enddef
Bram Moolenaara5d00772020-05-14 23:20:55 +02002566
Bram Moolenaareeb27bf2020-07-04 17:39:10 +02002567def Test_vim9_copen()
2568 # this was giving an error for setting w:quickfix_title
2569 copen
2570 quit
2571enddef
2572
Bram Moolenaar585fea72020-04-02 22:33:21 +02002573" Keep this last, it messes up highlighting.
2574def Test_substitute_cmd()
2575 new
2576 setline(1, 'something')
2577 :substitute(some(other(
2578 assert_equal('otherthing', getline(1))
2579 bwipe!
2580
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002581 # also when the context is Vim9 script
Bram Moolenaar585fea72020-04-02 22:33:21 +02002582 let lines =<< trim END
2583 vim9script
2584 new
2585 setline(1, 'something')
2586 :substitute(some(other(
2587 assert_equal('otherthing', getline(1))
2588 bwipe!
2589 END
2590 writefile(lines, 'Xvim9lines')
2591 source Xvim9lines
2592
2593 delete('Xvim9lines')
2594enddef
2595
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002596" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker