blob: d7464856b3a8e4581167e7533887698d776a68ad [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 Moolenaar43e969d2020-07-23 21:14:43 +0200379
380 call CheckDefFailure(['w:foo: number = 10'],
381 'E488: Trailing characters: : number = 1')
382 call CheckDefFailure(['t:foo: bool = true'],
383 'E488: Trailing characters: : bool = true')
384 call CheckDefFailure(['b:foo: string = "x"'],
385 'E488: Trailing characters: : string = "x"')
386 call CheckDefFailure(['g:foo: number = 123'],
387 'E488: Trailing characters: : number = 123')
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200388enddef
389
390def Test_unlet()
391 g:somevar = 'yes'
392 assert_true(exists('g:somevar'))
393 unlet g:somevar
394 assert_false(exists('g:somevar'))
395 unlet! g:somevar
396
397 call CheckScriptFailure([
398 'vim9script',
399 'let svar = 123',
400 'unlet svar',
401 ], 'E1081:')
402 call CheckScriptFailure([
403 'vim9script',
404 'let svar = 123',
405 'unlet s:svar',
406 ], 'E1081:')
407 call CheckScriptFailure([
408 'vim9script',
409 'let svar = 123',
410 'def Func()',
411 ' unlet svar',
412 'enddef',
Bram Moolenaar822ba242020-05-24 23:00:18 +0200413 'defcompile',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200414 ], 'E1081:')
415 call CheckScriptFailure([
416 'vim9script',
417 'let svar = 123',
418 'def Func()',
419 ' unlet s:svar',
420 'enddef',
Bram Moolenaar822ba242020-05-24 23:00:18 +0200421 'defcompile',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200422 ], 'E1081:')
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200423
424 $ENVVAR = 'foobar'
425 assert_equal('foobar', $ENVVAR)
426 unlet $ENVVAR
427 assert_equal('', $ENVVAR)
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200428enddef
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100429
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200430def Test_delfunction()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200431 # Check function is defined in script namespace
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200432 CheckScriptSuccess([
433 'vim9script',
434 'func CheckMe()',
435 ' return 123',
436 'endfunc',
437 'assert_equal(123, s:CheckMe())',
438 ])
439
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200440 # Check function in script namespace cannot be deleted
Bram Moolenaar4c17ad92020-04-27 22:47:51 +0200441 CheckScriptFailure([
442 'vim9script',
443 'func DeleteMe1()',
444 'endfunc',
445 'delfunction DeleteMe1',
446 ], 'E1084:')
447 CheckScriptFailure([
448 'vim9script',
449 'func DeleteMe2()',
450 'endfunc',
451 'def DoThat()',
452 ' delfunction DeleteMe2',
453 'enddef',
454 'DoThat()',
455 ], 'E1084:')
456 CheckScriptFailure([
457 'vim9script',
458 'def DeleteMe3()',
459 'enddef',
460 'delfunction DeleteMe3',
461 ], 'E1084:')
462 CheckScriptFailure([
463 'vim9script',
464 'def DeleteMe4()',
465 'enddef',
466 'def DoThat()',
467 ' delfunction DeleteMe4',
468 'enddef',
469 'DoThat()',
470 ], 'E1084:')
471enddef
472
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100473func Test_wrong_type()
474 call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
475 call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
476 call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
477 call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
478
479 call CheckDefFailure(['let var: dict<number'], 'E1009:')
480 call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100481
482 call CheckDefFailure(['let var: ally'], 'E1010:')
483 call CheckDefFailure(['let var: bram'], 'E1010:')
484 call CheckDefFailure(['let var: cathy'], 'E1010:')
485 call CheckDefFailure(['let var: dom'], 'E1010:')
486 call CheckDefFailure(['let var: freddy'], 'E1010:')
487 call CheckDefFailure(['let var: john'], 'E1010:')
488 call CheckDefFailure(['let var: larry'], 'E1010:')
489 call CheckDefFailure(['let var: ned'], 'E1010:')
490 call CheckDefFailure(['let var: pam'], 'E1010:')
491 call CheckDefFailure(['let var: sam'], 'E1010:')
492 call CheckDefFailure(['let var: vim'], 'E1010:')
Bram Moolenaara0a9f432020-04-28 21:29:34 +0200493
494 call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
495 call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100496endfunc
497
498func Test_const()
499 call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
500 call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
501 call CheckDefFailure(['const two'], 'E1021:')
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200502 call CheckDefFailure(['const &option'], 'E996:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100503endfunc
504
Bram Moolenaardf069ee2020-06-22 23:02:51 +0200505def Test_range_no_colon()
506 call CheckDefFailure(['%s/a/b/'], 'E1050:')
507 call CheckDefFailure(['+ s/a/b/'], 'E1050:')
508 call CheckDefFailure(['- s/a/b/'], 'E1050:')
509 call CheckDefFailure(['. s/a/b/'], 'E1050:')
510enddef
511
512
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100513def Test_block()
514 let outer = 1
515 {
516 let inner = 2
517 assert_equal(1, outer)
518 assert_equal(2, inner)
519 }
520 assert_equal(1, outer)
521enddef
522
523func Test_block_failure()
524 call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200525 call CheckDefFailure(['}'], 'E1025:')
526 call CheckDefFailure(['{', 'echo 1'], 'E1026:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100527endfunc
528
Bram Moolenaar585fea72020-04-02 22:33:21 +0200529def Test_cmd_modifier()
530 tab echo '0'
531 call CheckDefFailure(['5tab echo 3'], 'E16:')
532enddef
533
Bram Moolenaard032f342020-07-18 18:13:02 +0200534func g:NoSuchFunc()
535 echo 'none'
536endfunc
537
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100538def Test_try_catch()
539 let l = []
Bram Moolenaar7a092242020-04-16 22:10:49 +0200540 try # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100541 add(l, '1')
542 throw 'wrong'
543 add(l, '2')
Bram Moolenaar7a092242020-04-16 22:10:49 +0200544 catch # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100545 add(l, v:exception)
Bram Moolenaar7a092242020-04-16 22:10:49 +0200546 finally # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100547 add(l, '3')
Bram Moolenaar7a092242020-04-16 22:10:49 +0200548 endtry # comment
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100549 assert_equal(['1', 'wrong', '3'], l)
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200550
Bram Moolenaare8593122020-07-18 15:17:02 +0200551 l = []
552 try
553 try
554 add(l, '1')
555 throw 'wrong'
556 add(l, '2')
557 catch /right/
558 add(l, v:exception)
559 endtry
560 catch /wrong/
561 add(l, 'caught')
562 finally
563 add(l, 'finally')
564 endtry
565 assert_equal(['1', 'caught', 'finally'], l)
566
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200567 let n: number
568 try
569 n = l[3]
570 catch /E684:/
571 n = 99
572 endtry
573 assert_equal(99, n)
574
575 try
576 n = g:astring[3]
577 catch /E714:/
578 n = 77
579 endtry
580 assert_equal(77, n)
581
582 try
583 n = l[g:astring]
584 catch /E39:/
585 n = 77
586 endtry
587 assert_equal(77, n)
588
589 try
590 n = s:does_not_exist
591 catch /E121:/
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200592 n = 111
593 endtry
594 assert_equal(111, n)
595
596 try
597 n = g:does_not_exist
598 catch /E121:/
Bram Moolenaar68d130c2020-07-17 22:06:44 +0200599 n = 121
600 endtry
601 assert_equal(121, n)
602
603 let d = #{one: 1}
604 try
605 n = d[g:astring]
606 catch /E716:/
607 n = 222
608 endtry
609 assert_equal(222, n)
Bram Moolenaarf0b9f432020-07-17 23:03:17 +0200610
611 try
612 n = -g:astring
613 catch /E39:/
614 n = 233
615 endtry
616 assert_equal(233, n)
617
618 try
619 n = +g:astring
620 catch /E1030:/
621 n = 244
622 endtry
623 assert_equal(244, n)
624
625 try
626 n = +g:alist
627 catch /E745:/
628 n = 255
629 endtry
630 assert_equal(255, n)
631
632 let nd: dict<any>
633 try
634 nd = {g:anumber: 1}
635 catch /E1029:/
636 n = 266
637 endtry
638 assert_equal(266, n)
639
640 try
641 [n] = [1, 2, 3]
642 catch /E1093:/
643 n = 277
644 endtry
645 assert_equal(277, n)
646
Bram Moolenaare8593122020-07-18 15:17:02 +0200647 try
648 &ts = g:astring
649 catch /E1029:/
650 n = 288
651 endtry
652 assert_equal(288, n)
653
654 try
655 &backspace = 'asdf'
656 catch /E474:/
657 n = 299
658 endtry
659 assert_equal(299, n)
660
661 l = [1]
662 try
663 l[3] = 3
664 catch /E684:/
665 n = 300
666 endtry
667 assert_equal(300, n)
668
669 try
670 d[''] = 3
671 catch /E713:/
672 n = 311
673 endtry
674 assert_equal(311, n)
675
676 try
677 unlet g:does_not_exist
678 catch /E108:/
679 n = 322
680 endtry
681 assert_equal(322, n)
682
683 try
684 d = {'text': 1, g:astring: 2}
685 catch /E721:/
686 n = 333
687 endtry
688 assert_equal(333, n)
689
690 try
691 l = DeletedFunc()
692 catch /E933:/
693 n = 344
694 endtry
695 assert_equal(344, n)
Bram Moolenaard032f342020-07-18 18:13:02 +0200696
697 try
698 echo len(v:true)
699 catch /E701:/
700 n = 355
701 endtry
702 assert_equal(355, n)
703
704 let P = function('g:NoSuchFunc')
705 delfunc g:NoSuchFunc
706 try
707 echo P()
708 catch /E117:/
709 n = 366
710 endtry
711 assert_equal(366, n)
712
713 try
714 echo g:NoSuchFunc()
715 catch /E117:/
716 n = 377
717 endtry
718 assert_equal(377, n)
719
720 try
721 echo g:alist + 4
722 catch /E745:/
723 n = 388
724 endtry
725 assert_equal(388, n)
726
727 try
728 echo 4 + g:alist
729 catch /E745:/
730 n = 399
731 endtry
732 assert_equal(399, n)
733
734 try
735 echo g:alist.member
736 catch /E715:/
737 n = 400
738 endtry
739 assert_equal(400, n)
740
741 try
742 echo d.member
743 catch /E716:/
744 n = 411
745 endtry
746 assert_equal(411, n)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100747enddef
748
Bram Moolenaare8593122020-07-18 15:17:02 +0200749def DeletedFunc(): list<any>
750 return ['delete me']
751enddef
752defcompile
753delfunc DeletedFunc
754
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100755def ThrowFromDef()
Bram Moolenaara72cfb82020-04-23 17:07:30 +0200756 throw "getout" # comment
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100757enddef
758
759func CatchInFunc()
760 try
761 call ThrowFromDef()
762 catch
763 let g:thrown_func = v:exception
764 endtry
765endfunc
766
767def CatchInDef()
768 try
769 ThrowFromDef()
770 catch
771 g:thrown_def = v:exception
772 endtry
773enddef
774
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100775def ReturnFinally(): string
776 try
777 return 'intry'
778 finally
779 g:in_finally = 'finally'
780 endtry
781 return 'end'
782enddef
783
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100784def Test_try_catch_nested()
785 CatchInFunc()
786 assert_equal('getout', g:thrown_func)
787
788 CatchInDef()
789 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100790
791 assert_equal('intry', ReturnFinally())
792 assert_equal('finally', g:in_finally)
793enddef
794
795def Test_try_catch_match()
796 let seq = 'a'
797 try
798 throw 'something'
799 catch /nothing/
800 seq ..= 'x'
801 catch /some/
802 seq ..= 'b'
803 catch /asdf/
804 seq ..= 'x'
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200805 catch ?a\?sdf?
806 seq ..= 'y'
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100807 finally
808 seq ..= 'c'
809 endtry
810 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100811enddef
812
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200813def Test_try_catch_fails()
814 call CheckDefFailure(['catch'], 'E603:')
Bram Moolenaar6b7a0a82020-07-08 18:38:08 +0200815 call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200816 call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200817 call CheckDefFailure(['finally'], 'E606:')
818 call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
819 call CheckDefFailure(['endtry'], 'E602:')
820 call CheckDefFailure(['while 1', 'endtry'], 'E170:')
821 call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
822 call CheckDefFailure(['if 2', 'endtry'], 'E171:')
823 call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
824
Bram Moolenaara72cfb82020-04-23 17:07:30 +0200825 call CheckDefFailure(['throw'], 'E1015:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200826 call CheckDefFailure(['throw xxx'], 'E1001:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200827enddef
828
Bram Moolenaar006ad482020-06-30 20:55:15 +0200829def Test_throw_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200830 # only checks line continuation
Bram Moolenaar006ad482020-06-30 20:55:15 +0200831 let lines =<< trim END
832 vim9script
833 try
834 throw 'one'
835 .. 'two'
836 catch
837 assert_equal('onetwo', v:exception)
838 endtry
839 END
840 CheckScriptSuccess(lines)
841enddef
842
Bram Moolenaar37c83712020-06-30 21:18:36 +0200843def Test_cexpr_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200844 # only checks line continuation
Bram Moolenaar37c83712020-06-30 21:18:36 +0200845 set errorformat=File\ %f\ line\ %l
846 let lines =<< trim END
847 vim9script
848 cexpr 'File'
849 .. ' someFile' ..
850 ' line 19'
851 assert_equal(19, getqflist()[0].lnum)
852 END
853 CheckScriptSuccess(lines)
854 set errorformat&
855enddef
856
Bram Moolenaarb2097502020-07-19 17:17:02 +0200857def Test_list_vimscript()
858 # checks line continuation and comments
859 let lines =<< trim END
860 vim9script
861 let mylist = [
862 'one',
863 # comment
864 'two', # empty line follows
865
866 'three',
867 ]
868 assert_equal(['one', 'two', 'three'], mylist)
869 END
870 CheckScriptSuccess(lines)
871enddef
872
Bram Moolenaar2a1381c2020-05-05 23:32:58 +0200873if has('channel')
874 let someJob = test_null_job()
Bram Moolenaar40ee4662020-05-05 22:08:26 +0200875
Bram Moolenaar2a1381c2020-05-05 23:32:58 +0200876 def FuncWithError()
877 echomsg g:someJob
878 enddef
Bram Moolenaar40ee4662020-05-05 22:08:26 +0200879
Bram Moolenaar2a1381c2020-05-05 23:32:58 +0200880 func Test_convert_emsg_to_exception()
881 try
882 call FuncWithError()
883 catch
884 call assert_match('Vim:E908:', v:exception)
885 endtry
886 endfunc
887endif
Bram Moolenaar40ee4662020-05-05 22:08:26 +0200888
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100889let s:export_script_lines =<< trim END
890 vim9script
891 let name: string = 'bob'
892 def Concat(arg: string): string
893 return name .. arg
894 enddef
Bram Moolenaar227a69d2020-05-15 18:17:28 +0200895 g:result = Concat('bie')
896 g:localname = name
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100897
898 export const CONST = 1234
899 export let exported = 9876
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100900 export let exp_name = 'John'
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100901 export def Exported(): string
902 return 'Exported'
903 enddef
904END
905
Bram Moolenaar5269bd22020-03-09 19:25:27 +0100906def Test_vim9_import_export()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100907 let import_script_lines =<< trim END
908 vim9script
909 import {exported, Exported} from './Xexport.vim'
910 g:imported = exported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100911 exported += 3
912 g:imported_added = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100913 g:imported_func = Exported()
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100914
915 import {exp_name} from './Xexport.vim'
916 g:imported_name = exp_name
917 exp_name ..= ' Doe'
918 g:imported_name_appended = exp_name
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100919 g:imported_later = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100920 END
921
922 writefile(import_script_lines, 'Ximport.vim')
923 writefile(s:export_script_lines, 'Xexport.vim')
924
925 source Ximport.vim
926
927 assert_equal('bobbie', g:result)
928 assert_equal('bob', g:localname)
929 assert_equal(9876, g:imported)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100930 assert_equal(9879, g:imported_added)
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100931 assert_equal(9879, g:imported_later)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100932 assert_equal('Exported', g:imported_func)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100933 assert_equal('John', g:imported_name)
934 assert_equal('John Doe', g:imported_name_appended)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100935 assert_false(exists('g:name'))
936
937 unlet g:result
938 unlet g:localname
939 unlet g:imported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100940 unlet g:imported_added
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100941 unlet g:imported_later
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100942 unlet g:imported_func
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100943 unlet g:imported_name g:imported_name_appended
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100944 delete('Ximport.vim')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100945
Bram Moolenaar1c991142020-07-04 13:15:31 +0200946 # similar, with line breaks
947 let import_line_break_script_lines =<< trim END
948 vim9script
949 import {
950 exported,
951 Exported,
952 }
953 from
954 './Xexport.vim'
955 g:imported = exported
956 exported += 5
957 g:imported_added = exported
958 g:imported_func = Exported()
959 END
960 writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
961 source Ximport_lbr.vim
962
963 assert_equal(9876, g:imported)
964 assert_equal(9881, g:imported_added)
965 assert_equal('Exported', g:imported_func)
966
967 # exported script not sourced again
968 assert_false(exists('g:result'))
969 unlet g:imported
970 unlet g:imported_added
971 unlet g:imported_func
972 delete('Ximport_lbr.vim')
973
974 # import inside :def function
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100975 let import_in_def_lines =<< trim END
976 vim9script
977 def ImportInDef()
978 import exported from './Xexport.vim'
979 g:imported = exported
980 exported += 7
981 g:imported_added = exported
982 enddef
983 ImportInDef()
984 END
985 writefile(import_in_def_lines, 'Ximport2.vim')
986 source Ximport2.vim
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200987 # TODO: this should be 9879
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100988 assert_equal(9876, g:imported)
989 assert_equal(9883, g:imported_added)
990 unlet g:imported
991 unlet g:imported_added
992 delete('Ximport2.vim')
993
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100994 let import_star_as_lines =<< trim END
995 vim9script
996 import * as Export from './Xexport.vim'
997 def UseExport()
998 g:imported = Export.exported
999 enddef
1000 UseExport()
1001 END
1002 writefile(import_star_as_lines, 'Ximport.vim')
1003 source Ximport.vim
Bram Moolenaar5381c7a2020-03-02 22:53:32 +01001004 assert_equal(9883, g:imported)
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001005
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001006 let import_star_as_lines_no_dot =<< trim END
1007 vim9script
1008 import * as Export from './Xexport.vim'
1009 def Func()
1010 let dummy = 1
1011 let imported = Export + dummy
1012 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +02001013 defcompile
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001014 END
1015 writefile(import_star_as_lines_no_dot, 'Ximport.vim')
1016 assert_fails('source Ximport.vim', 'E1060:')
1017
1018 let import_star_as_lines_dot_space =<< trim END
1019 vim9script
1020 import * as Export from './Xexport.vim'
1021 def Func()
1022 let imported = Export . exported
1023 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +02001024 defcompile
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001025 END
1026 writefile(import_star_as_lines_dot_space, 'Ximport.vim')
1027 assert_fails('source Ximport.vim', 'E1074:')
1028
1029 let import_star_as_lines_missing_name =<< trim END
1030 vim9script
1031 import * as Export from './Xexport.vim'
1032 def Func()
1033 let imported = Export.
1034 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +02001035 defcompile
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001036 END
1037 writefile(import_star_as_lines_missing_name, 'Ximport.vim')
1038 assert_fails('source Ximport.vim', 'E1048:')
1039
Bram Moolenaar1c991142020-07-04 13:15:31 +02001040 let import_star_as_lbr_lines =<< trim END
1041 vim9script
1042 import *
1043 as Export
1044 from
1045 './Xexport.vim'
1046 def UseExport()
1047 g:imported = Export.exported
1048 enddef
1049 UseExport()
1050 END
1051 writefile(import_star_as_lbr_lines, 'Ximport.vim')
1052 source Ximport.vim
1053 assert_equal(9883, g:imported)
1054
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001055 let import_star_lines =<< trim END
1056 vim9script
1057 import * from './Xexport.vim'
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001058 END
1059 writefile(import_star_lines, 'Ximport.vim')
1060 assert_fails('source Ximport.vim', 'E1045:')
1061
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001062 # try to import something that exists but is not exported
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001063 let import_not_exported_lines =<< trim END
1064 vim9script
1065 import name from './Xexport.vim'
1066 END
1067 writefile(import_not_exported_lines, 'Ximport.vim')
1068 assert_fails('source Ximport.vim', 'E1049:')
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 let import_already_defined =<< trim END
1072 vim9script
1073 let exported = 'something'
1074 import 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 * as 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 # try to import something that is already defined
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001089 import_already_defined =<< trim END
1090 vim9script
1091 let exported = 'something'
1092 import {exported} from './Xexport.vim'
1093 END
1094 writefile(import_already_defined, 'Ximport.vim')
1095 assert_fails('source Ximport.vim', 'E1073:')
1096
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001097 # import a very long name, requires making a copy
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001098 let import_long_name_lines =<< trim END
1099 vim9script
1100 import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1101 END
1102 writefile(import_long_name_lines, 'Ximport.vim')
1103 assert_fails('source Ximport.vim', 'E1048:')
1104
1105 let import_no_from_lines =<< trim END
1106 vim9script
1107 import name './Xexport.vim'
1108 END
1109 writefile(import_no_from_lines, 'Ximport.vim')
1110 assert_fails('source Ximport.vim', 'E1070:')
1111
1112 let import_invalid_string_lines =<< trim END
1113 vim9script
1114 import name from Xexport.vim
1115 END
1116 writefile(import_invalid_string_lines, 'Ximport.vim')
1117 assert_fails('source Ximport.vim', 'E1071:')
1118
1119 let import_wrong_name_lines =<< trim END
1120 vim9script
1121 import name from './XnoExport.vim'
1122 END
1123 writefile(import_wrong_name_lines, 'Ximport.vim')
1124 assert_fails('source Ximport.vim', 'E1053:')
1125
1126 let import_missing_comma_lines =<< trim END
1127 vim9script
1128 import {exported name} from './Xexport.vim'
1129 END
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001130 writefile(import_missing_comma_lines, 'Ximport3.vim')
1131 assert_fails('source Ximport3.vim', 'E1046:')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001132
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001133 delete('Ximport.vim')
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001134 delete('Ximport3.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001135 delete('Xexport.vim')
1136
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001137 # Check that in a Vim9 script 'cpo' is set to the Vim default.
Bram Moolenaar750802b2020-02-23 18:08:33 +01001138 set cpo&vi
1139 let cpo_before = &cpo
1140 let lines =<< trim END
1141 vim9script
1142 g:cpo_in_vim9script = &cpo
1143 END
1144 writefile(lines, 'Xvim9_script')
1145 source Xvim9_script
1146 assert_equal(cpo_before, &cpo)
1147 set cpo&vim
1148 assert_equal(&cpo, g:cpo_in_vim9script)
1149 delete('Xvim9_script')
1150enddef
1151
1152def Test_vim9script_fails()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001153 CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
1154 CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +01001155 CheckScriptFailure(['export let some = 123'], 'E1042:')
Bram Moolenaar9721fb42020-06-11 23:10:46 +02001156 CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +02001157 CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
Bram Moolenaar750802b2020-02-23 18:08:33 +01001158 CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1159
Bram Moolenaarc785b9a2020-06-19 18:34:15 +02001160 CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:')
1161 CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1162
Bram Moolenaar750802b2020-02-23 18:08:33 +01001163 assert_fails('vim9script', 'E1038')
Bram Moolenaara26b9702020-04-18 19:53:28 +02001164 assert_fails('export something', 'E1043')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001165enddef
1166
Bram Moolenaarf7d267e2020-06-17 12:04:54 +02001167func Test_import_fails_without_script()
Bram Moolenaar101f4812020-06-16 23:18:51 +02001168 CheckRunVimInTerminal
1169
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001170 " call indirectly to avoid compilation error for missing functions
Bram Moolenaarc620c052020-07-08 15:16:19 +02001171 call Run_Test_import_fails_on_command_line()
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001172endfunc
1173
Bram Moolenaarc620c052020-07-08 15:16:19 +02001174def Run_Test_import_fails_on_command_line()
Bram Moolenaar101f4812020-06-16 23:18:51 +02001175 let export =<< trim END
1176 vim9script
1177 export def Foo(): number
1178 return 0
1179 enddef
1180 END
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001181 writefile(export, 'Xexport.vim')
Bram Moolenaar101f4812020-06-16 23:18:51 +02001182
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001183 let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{
1184 rows: 6, wait_for_ruler: 0})
1185 WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
Bram Moolenaar101f4812020-06-16 23:18:51 +02001186
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001187 delete('Xexport.vim')
1188 StopVimInTerminal(buf)
1189enddef
Bram Moolenaar101f4812020-06-16 23:18:51 +02001190
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001191def Test_vim9script_reload_import()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001192 let lines =<< trim END
1193 vim9script
1194 const var = ''
1195 let valone = 1234
1196 def MyFunc(arg: string)
1197 valone = 5678
1198 enddef
1199 END
1200 let morelines =<< trim END
1201 let valtwo = 222
1202 export def GetValtwo(): number
1203 return valtwo
1204 enddef
1205 END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001206 writefile(lines + morelines, 'Xreload.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001207 source Xreload.vim
1208 source Xreload.vim
1209 source Xreload.vim
1210
1211 let testlines =<< trim END
1212 vim9script
1213 def TheFunc()
1214 import GetValtwo from './Xreload.vim'
1215 assert_equal(222, GetValtwo())
1216 enddef
1217 TheFunc()
1218 END
1219 writefile(testlines, 'Ximport.vim')
1220 source Ximport.vim
1221
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001222 # Test that when not using "morelines" GetValtwo() and valtwo are still
1223 # defined, because import doesn't reload a script.
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001224 writefile(lines, 'Xreload.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001225 source Ximport.vim
1226
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001227 # cannot declare a var twice
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001228 lines =<< trim END
1229 vim9script
1230 let valone = 1234
1231 let valone = 5678
1232 END
1233 writefile(lines, 'Xreload.vim')
1234 assert_fails('source Xreload.vim', 'E1041:')
1235
1236 delete('Xreload.vim')
1237 delete('Ximport.vim')
1238enddef
1239
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001240" Not exported function that is referenced needs to be accessed by the
1241" script-local name.
1242def Test_vim9script_funcref()
1243 let sortlines =<< trim END
1244 vim9script
1245 def Compare(i1: number, i2: number): number
Bram Moolenaarbed36b92020-07-07 23:31:36 +02001246 return i2 - i1
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001247 enddef
1248
1249 export def FastSort(): list<number>
1250 return range(5)->sort(Compare)
1251 enddef
1252 END
1253 writefile(sortlines, 'Xsort.vim')
1254
1255 let lines =<< trim END
1256 vim9script
1257 import FastSort from './Xsort.vim'
1258 def Test()
1259 g:result = FastSort()
1260 enddef
1261 Test()
1262 END
1263 writefile(lines, 'Xscript.vim')
1264
1265 source Xscript.vim
1266 assert_equal([4, 3, 2, 1, 0], g:result)
1267
1268 unlet g:result
1269 delete('Xsort.vim')
1270 delete('Xscript.vim')
1271enddef
1272
Bram Moolenaarc620c052020-07-08 15:16:19 +02001273" Check that when searcing for "FilterFunc" it doesn't find the import in the
1274" script where FastFilter() is called from.
1275def Test_vim9script_funcref_other_script()
1276 let filterLines =<< trim END
1277 vim9script
1278 export def FilterFunc(idx: number, val: number): bool
1279 return idx % 2 == 1
1280 enddef
1281 export def FastFilter(): list<number>
1282 return range(10)->filter('FilterFunc')
1283 enddef
1284 END
1285 writefile(filterLines, 'Xfilter.vim')
1286
1287 let lines =<< trim END
1288 vim9script
1289 import {FilterFunc, FastFilter} from './Xfilter.vim'
1290 def Test()
1291 let x: list<number> = FastFilter()
1292 enddef
1293 Test()
1294 END
1295 writefile(lines, 'Ximport.vim')
1296 assert_fails('source Ximport.vim', 'E121:')
1297
1298 delete('Xfilter.vim')
1299 delete('Ximport.vim')
1300enddef
1301
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001302def Test_vim9script_reload_delfunc()
1303 let first_lines =<< trim END
1304 vim9script
1305 def FuncYes(): string
1306 return 'yes'
1307 enddef
1308 END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001309 let withno_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001310 def FuncNo(): string
1311 return 'no'
1312 enddef
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001313 def g:DoCheck(no_exists: bool)
1314 assert_equal('yes', FuncYes())
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001315 assert_equal('no', FuncNo())
1316 enddef
1317 END
1318 let nono_lines =<< trim END
1319 def g:DoCheck(no_exists: bool)
1320 assert_equal('yes', FuncYes())
1321 assert_fails('call FuncNo()', 'E117:')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001322 enddef
1323 END
1324
1325 # FuncNo() is defined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001326 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001327 source Xreloaded.vim
1328 g:DoCheck(true)
1329
1330 # FuncNo() is not redefined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001331 writefile(first_lines + nono_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001332 source Xreloaded.vim
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001333 g:DoCheck()
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001334
1335 # FuncNo() is back
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001336 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001337 source Xreloaded.vim
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001338 g:DoCheck()
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001339
1340 delete('Xreloaded.vim')
1341enddef
1342
Bram Moolenaar89483d42020-05-10 15:24:44 +02001343def Test_vim9script_reload_delvar()
1344 # write the script with a script-local variable
1345 let lines =<< trim END
1346 vim9script
1347 let var = 'string'
1348 END
1349 writefile(lines, 'XreloadVar.vim')
1350 source XreloadVar.vim
1351
1352 # now write the script using the same variable locally - works
1353 lines =<< trim END
1354 vim9script
1355 def Func()
1356 let var = 'string'
1357 enddef
1358 END
1359 writefile(lines, 'XreloadVar.vim')
1360 source XreloadVar.vim
1361
1362 delete('XreloadVar.vim')
1363enddef
1364
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001365def Test_import_absolute()
1366 let import_lines = [
Bram Moolenaare6085c52020-04-12 20:19:16 +02001367 'vim9script',
1368 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1369 'def UseExported()',
1370 ' g:imported_abs = exported',
1371 ' exported = 8888',
1372 ' g:imported_after = exported',
1373 'enddef',
1374 'UseExported()',
1375 'g:import_disassembled = execute("disass UseExported")',
1376 ]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001377 writefile(import_lines, 'Ximport_abs.vim')
1378 writefile(s:export_script_lines, 'Xexport_abs.vim')
1379
1380 source Ximport_abs.vim
1381
1382 assert_equal(9876, g:imported_abs)
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +01001383 assert_equal(8888, g:imported_after)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001384 assert_match('<SNR>\d\+_UseExported.*' ..
1385 'g:imported_abs = exported.*' ..
1386 '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1387 '1 STOREG g:imported_abs.*' ..
1388 'exported = 8888.*' ..
1389 '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1390 'g:imported_after = exported.*' ..
1391 '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1392 '5 STOREG g:imported_after.*',
Bram Moolenaare6085c52020-04-12 20:19:16 +02001393 g:import_disassembled)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001394 unlet g:imported_abs
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +01001395 unlet g:import_disassembled
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001396
1397 delete('Ximport_abs.vim')
1398 delete('Xexport_abs.vim')
1399enddef
1400
1401def Test_import_rtp()
1402 let import_lines = [
Bram Moolenaare6085c52020-04-12 20:19:16 +02001403 'vim9script',
1404 'import exported from "Xexport_rtp.vim"',
1405 'g:imported_rtp = exported',
1406 ]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001407 writefile(import_lines, 'Ximport_rtp.vim')
1408 mkdir('import')
1409 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
1410
1411 let save_rtp = &rtp
1412 &rtp = getcwd()
1413 source Ximport_rtp.vim
1414 &rtp = save_rtp
1415
1416 assert_equal(9876, g:imported_rtp)
1417 unlet g:imported_rtp
1418
1419 delete('Ximport_rtp.vim')
Bram Moolenaar89483d42020-05-10 15:24:44 +02001420 delete('import', 'rf')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001421enddef
1422
Bram Moolenaar25e0f582020-05-25 22:36:50 +02001423def Test_import_compile_error()
1424 let export_lines = [
1425 'vim9script',
1426 'export def ExpFunc(): string',
1427 ' return notDefined',
1428 'enddef',
1429 ]
1430 writefile(export_lines, 'Xexported.vim')
1431
1432 let import_lines = [
1433 'vim9script',
1434 'import ExpFunc from "./Xexported.vim"',
1435 'def ImpFunc()',
1436 ' echo ExpFunc()',
1437 'enddef',
1438 'defcompile',
1439 ]
1440 writefile(import_lines, 'Ximport.vim')
1441
1442 try
1443 source Ximport.vim
1444 catch /E1001/
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001445 # Error should be fore the Xexported.vim file.
Bram Moolenaar25e0f582020-05-25 22:36:50 +02001446 assert_match('E1001: variable not found: notDefined', v:exception)
1447 assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
1448 endtry
1449
1450 delete('Xexported.vim')
1451 delete('Ximport.vim')
1452enddef
1453
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001454def Test_fixed_size_list()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001455 # will be allocated as one piece of memory, check that changes work
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001456 let l = [1, 2, 3, 4]
1457 l->remove(0)
1458 l->add(5)
1459 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001460 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001461enddef
1462
Bram Moolenaar158906c2020-02-06 20:39:45 +01001463def IfElse(what: number): string
1464 let res = ''
1465 if what == 1
1466 res = "one"
1467 elseif what == 2
1468 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001469 else
Bram Moolenaar158906c2020-02-06 20:39:45 +01001470 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001471 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +01001472 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001473enddef
1474
Bram Moolenaar158906c2020-02-06 20:39:45 +01001475def Test_if_elseif_else()
1476 assert_equal('one', IfElse(1))
1477 assert_equal('two', IfElse(2))
1478 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001479enddef
1480
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001481def Test_if_elseif_else_fails()
1482 call CheckDefFailure(['elseif true'], 'E582:')
1483 call CheckDefFailure(['else'], 'E581:')
1484 call CheckDefFailure(['endif'], 'E580:')
1485 call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001486 call CheckDefFailure(['if true', 'echo 1'], 'E171:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001487enddef
1488
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001489let g:bool_true = v:true
1490let g:bool_false = v:false
1491
1492def Test_if_const_expr()
1493 let res = false
1494 if true ? true : false
1495 res = true
1496 endif
1497 assert_equal(true, res)
1498
Bram Moolenaar585fea72020-04-02 22:33:21 +02001499 g:glob = 2
1500 if false
Bram Moolenaar67979662020-06-20 22:50:47 +02001501 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001502 endif
1503 assert_equal(2, g:glob)
1504 if true
Bram Moolenaar67979662020-06-20 22:50:47 +02001505 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001506 endif
1507 assert_equal(3, g:glob)
1508
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001509 res = false
1510 if g:bool_true ? true : false
1511 res = true
1512 endif
1513 assert_equal(true, res)
1514
1515 res = false
1516 if true ? g:bool_true : false
1517 res = true
1518 endif
1519 assert_equal(true, res)
1520
1521 res = false
1522 if true ? true : g:bool_false
1523 res = true
1524 endif
1525 assert_equal(true, res)
1526
1527 res = false
1528 if true ? false : true
1529 res = true
1530 endif
1531 assert_equal(false, res)
1532
1533 res = false
1534 if false ? false : true
1535 res = true
1536 endif
1537 assert_equal(true, res)
1538
1539 res = false
1540 if false ? true : false
1541 res = true
1542 endif
1543 assert_equal(false, res)
1544
1545 res = false
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001546 if has('xyz') ? true : false
1547 res = true
1548 endif
1549 assert_equal(false, res)
1550
1551 res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001552 if true && true
1553 res = true
1554 endif
1555 assert_equal(true, res)
1556
1557 res = false
1558 if true && false
1559 res = true
1560 endif
1561 assert_equal(false, res)
1562
1563 res = false
1564 if g:bool_true && false
1565 res = true
1566 endif
1567 assert_equal(false, res)
1568
1569 res = false
1570 if true && g:bool_false
1571 res = true
1572 endif
1573 assert_equal(false, res)
1574
1575 res = false
1576 if false && false
1577 res = true
1578 endif
1579 assert_equal(false, res)
1580
1581 res = false
1582 if true || false
1583 res = true
1584 endif
1585 assert_equal(true, res)
1586
1587 res = false
1588 if g:bool_true || false
1589 res = true
1590 endif
1591 assert_equal(true, res)
1592
1593 res = false
1594 if true || g:bool_false
1595 res = true
1596 endif
1597 assert_equal(true, res)
1598
1599 res = false
1600 if false || false
1601 res = true
1602 endif
1603 assert_equal(false, res)
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02001604enddef
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001605
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02001606def Test_if_const_expr_fails()
1607 call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1608 call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001609 call CheckDefFailure(["if has('aaa'"], 'E110:')
1610 call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001611enddef
1612
Bram Moolenaar72abcf42020-06-18 18:26:24 +02001613def RunNested(i: number): number
1614 let x: number = 0
1615 if i % 2
1616 if 1
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001617 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02001618 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001619 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02001620 endif
1621 x += 1
1622 else
1623 x += 1000
1624 endif
1625 return x
1626enddef
1627
1628def Test_nested_if()
1629 assert_equal(1, RunNested(1))
1630 assert_equal(1000, RunNested(2))
1631enddef
1632
Bram Moolenaarad39c092020-02-26 18:23:43 +01001633def Test_execute_cmd()
1634 new
1635 setline(1, 'default')
1636 execute 'call setline(1, "execute-string")'
1637 assert_equal('execute-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001638
1639 execute "call setline(1, 'execute-string')"
1640 assert_equal('execute-string', getline(1))
1641
Bram Moolenaarad39c092020-02-26 18:23:43 +01001642 let cmd1 = 'call setline(1,'
1643 let cmd2 = '"execute-var")'
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001644 execute cmd1 cmd2 # comment
Bram Moolenaarad39c092020-02-26 18:23:43 +01001645 assert_equal('execute-var', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001646
Bram Moolenaarad39c092020-02-26 18:23:43 +01001647 execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1648 assert_equal('execute-var-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001649
Bram Moolenaarad39c092020-02-26 18:23:43 +01001650 let cmd_first = 'call '
1651 let cmd_last = 'setline(1, "execute-var-var")'
1652 execute cmd_first .. cmd_last
1653 assert_equal('execute-var-var', getline(1))
1654 bwipe!
Bram Moolenaar585fea72020-04-02 22:33:21 +02001655
1656 call CheckDefFailure(['execute xxx'], 'E1001:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001657 call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
Bram Moolenaarad39c092020-02-26 18:23:43 +01001658enddef
1659
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001660def Test_execute_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001661 # only checks line continuation
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001662 let lines =<< trim END
1663 vim9script
1664 execute 'g:someVar'
1665 .. ' = ' ..
1666 '28'
1667 assert_equal(28, g:someVar)
1668 unlet g:someVar
1669 END
1670 CheckScriptSuccess(lines)
1671enddef
1672
Bram Moolenaarad39c092020-02-26 18:23:43 +01001673def Test_echo_cmd()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001674 echo 'some' # comment
Bram Moolenaar585fea72020-04-02 22:33:21 +02001675 echon 'thing'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001676 assert_match('^something$', Screenline(&lines))
1677
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001678 echo "some" # comment
1679 echon "thing"
1680 assert_match('^something$', Screenline(&lines))
1681
Bram Moolenaarad39c092020-02-26 18:23:43 +01001682 let str1 = 'some'
1683 let str2 = 'more'
1684 echo str1 str2
1685 assert_match('^some more$', Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001686
1687 call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
Bram Moolenaarad39c092020-02-26 18:23:43 +01001688enddef
1689
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001690def Test_echomsg_cmd()
1691 echomsg 'some' 'more' # comment
1692 assert_match('^some more$', Screenline(&lines))
1693 echo 'clear'
Bram Moolenaardf069ee2020-06-22 23:02:51 +02001694 :1messages
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001695 assert_match('^some more$', Screenline(&lines))
1696
1697 call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1698enddef
1699
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001700def Test_echomsg_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001701 # only checks line continuation
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001702 let lines =<< trim END
1703 vim9script
1704 echomsg 'here'
1705 .. ' is ' ..
1706 'a message'
1707 assert_match('^here is a message$', Screenline(&lines))
1708 END
1709 CheckScriptSuccess(lines)
1710enddef
1711
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001712def Test_echoerr_cmd()
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001713 try
1714 echoerr 'something' 'wrong' # comment
1715 catch
1716 assert_match('something wrong', v:exception)
1717 endtry
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001718enddef
1719
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001720def Test_echoerr_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001721 # only checks line continuation
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001722 let lines =<< trim END
1723 vim9script
1724 try
1725 echoerr 'this'
1726 .. ' is ' ..
1727 'wrong'
1728 catch
1729 assert_match('this is wrong', v:exception)
1730 endtry
1731 END
1732 CheckScriptSuccess(lines)
1733enddef
1734
Bram Moolenaar41fe0612020-03-01 16:22:40 +01001735def Test_for_outside_of_function()
1736 let lines =<< trim END
1737 vim9script
1738 new
1739 for var in range(0, 3)
1740 append(line('$'), var)
1741 endfor
1742 assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
1743 bwipe!
1744 END
1745 writefile(lines, 'Xvim9for.vim')
1746 source Xvim9for.vim
1747 delete('Xvim9for.vim')
1748enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001749
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001750def Test_for_loop()
1751 let result = ''
1752 for cnt in range(7)
1753 if cnt == 4
1754 break
1755 endif
1756 if cnt == 2
1757 continue
1758 endif
1759 result ..= cnt .. '_'
1760 endfor
1761 assert_equal('0_1_3_', result)
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001762
1763 let concat = ''
1764 for str in eval('["one", "two"]')
1765 concat ..= str
1766 endfor
1767 assert_equal('onetwo', concat)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001768enddef
1769
1770def Test_for_loop_fails()
Bram Moolenaar675f7162020-04-12 22:53:54 +02001771 CheckDefFailure(['for # in range(5)'], 'E690:')
1772 CheckDefFailure(['for i In range(5)'], 'E690:')
1773 CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
Bram Moolenaar822ba242020-05-24 23:00:18 +02001774 CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001775 CheckDefFailure(['for i in "text"'], 'E1013:')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001776 CheckDefFailure(['for i in xxx'], 'E1001:')
1777 CheckDefFailure(['endfor'], 'E588:')
1778 CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001779enddef
1780
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01001781def Test_while_loop()
1782 let result = ''
1783 let cnt = 0
1784 while cnt < 555
1785 if cnt == 3
1786 break
1787 endif
1788 cnt += 1
1789 if cnt == 2
1790 continue
1791 endif
1792 result ..= cnt .. '_'
1793 endwhile
1794 assert_equal('1_3_', result)
1795enddef
1796
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001797def Test_while_loop_fails()
Bram Moolenaar675f7162020-04-12 22:53:54 +02001798 CheckDefFailure(['while xxx'], 'E1001:')
1799 CheckDefFailure(['endwhile'], 'E588:')
1800 CheckDefFailure(['continue'], 'E586:')
1801 CheckDefFailure(['if true', 'continue'], 'E586:')
1802 CheckDefFailure(['break'], 'E587:')
1803 CheckDefFailure(['if true', 'break'], 'E587:')
1804 CheckDefFailure(['while 1', 'echo 3'], 'E170:')
Bram Moolenaarbd5da372020-03-31 23:13:10 +02001805enddef
1806
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001807def Test_interrupt_loop()
Bram Moolenaar97acfc72020-03-22 13:44:28 +01001808 let caught = false
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001809 let x = 0
Bram Moolenaar97acfc72020-03-22 13:44:28 +01001810 try
1811 while 1
1812 x += 1
1813 if x == 100
1814 feedkeys("\<C-C>", 'Lt')
1815 endif
1816 endwhile
1817 catch
1818 caught = true
1819 assert_equal(100, x)
1820 endtry
1821 assert_true(caught, 'should have caught an exception')
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001822enddef
Bram Moolenaar20431c92020-03-20 18:39:46 +01001823
Bram Moolenaar4fdae992020-04-12 16:38:57 +02001824def Test_automatic_line_continuation()
1825 let mylist = [
1826 'one',
1827 'two',
1828 'three',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001829 ] # comment
Bram Moolenaar4fdae992020-04-12 16:38:57 +02001830 assert_equal(['one', 'two', 'three'], mylist)
1831
1832 let mydict = {
1833 'one': 1,
1834 'two': 2,
1835 'three':
1836 3,
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001837 } # comment
Bram Moolenaar4fdae992020-04-12 16:38:57 +02001838 assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
1839 mydict = #{
Bram Moolenaar2c330432020-04-13 14:41:35 +02001840 one: 1, # comment
1841 two: # comment
1842 2, # comment
1843 three: 3 # comment
1844 }
1845 assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1846 mydict = #{
1847 one: 1,
1848 two:
1849 2,
1850 three: 3
Bram Moolenaar4fdae992020-04-12 16:38:57 +02001851 }
1852 assert_equal(#{one: 1, two: 2, three: 3}, mydict)
Bram Moolenaare6085c52020-04-12 20:19:16 +02001853
1854 assert_equal(
1855 ['one', 'two', 'three'],
1856 split('one two three')
1857 )
Bram Moolenaar4fdae992020-04-12 16:38:57 +02001858enddef
1859
Bram Moolenaar7a092242020-04-16 22:10:49 +02001860def Test_vim9_comment()
1861 CheckScriptSuccess([
1862 'vim9script',
1863 '# something',
1864 ])
1865 CheckScriptFailure([
1866 'vim9script',
1867 ':# something',
1868 ], 'E488:')
1869 CheckScriptFailure([
1870 '# something',
1871 ], 'E488:')
1872 CheckScriptFailure([
1873 ':# something',
1874 ], 'E488:')
1875
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02001876 { # block start
1877 } # block end
1878 CheckDefFailure([
1879 '{# comment',
1880 ], 'E488:')
1881 CheckDefFailure([
1882 '{',
1883 '}# comment',
1884 ], 'E488:')
1885
1886 echo "yes" # comment
1887 CheckDefFailure([
1888 'echo "yes"# comment',
1889 ], 'E488:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02001890 CheckScriptSuccess([
1891 'vim9script',
1892 'echo "yes" # something',
1893 ])
1894 CheckScriptFailure([
1895 'vim9script',
1896 'echo "yes"# something',
1897 ], 'E121:')
1898 CheckScriptFailure([
1899 'vim9script',
1900 'echo# something',
1901 ], 'E121:')
1902 CheckScriptFailure([
1903 'echo "yes" # something',
1904 ], 'E121:')
1905
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02001906 exe "echo" # comment
1907 CheckDefFailure([
1908 'exe "echo"# comment',
1909 ], 'E488:')
1910 CheckScriptSuccess([
1911 'vim9script',
1912 'exe "echo" # something',
1913 ])
1914 CheckScriptFailure([
1915 'vim9script',
1916 'exe "echo"# something',
1917 ], 'E121:')
1918 CheckDefFailure([
1919 'exe # comment',
1920 ], 'E1015:')
1921 CheckScriptFailure([
1922 'vim9script',
1923 'exe# something',
1924 ], 'E121:')
1925 CheckScriptFailure([
1926 'exe "echo" # something',
1927 ], 'E121:')
1928
Bram Moolenaar7a092242020-04-16 22:10:49 +02001929 CheckDefFailure([
1930 'try# comment',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001931 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02001932 'catch',
1933 'endtry',
1934 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001935 CheckScriptFailure([
1936 'vim9script',
1937 'try# comment',
1938 'echo "yes"',
1939 ], 'E488:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02001940 CheckDefFailure([
1941 'try',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001942 ' throw#comment',
1943 'catch',
1944 'endtry',
1945 ], 'E1015:')
1946 CheckDefFailure([
1947 'try',
1948 ' throw "yes"#comment',
1949 'catch',
1950 'endtry',
1951 ], 'E488:')
1952 CheckDefFailure([
1953 'try',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001954 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02001955 'catch# comment',
1956 'endtry',
1957 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001958 CheckScriptFailure([
1959 'vim9script',
1960 'try',
1961 ' echo "yes"',
1962 'catch# comment',
1963 'endtry',
1964 ], 'E654:')
1965 CheckDefFailure([
1966 'try',
1967 ' echo "yes"',
1968 'catch /pat/# comment',
1969 'endtry',
1970 ], 'E488:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02001971 CheckDefFailure([
1972 'try',
1973 'echo "yes"',
1974 'catch',
1975 'endtry# comment',
1976 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001977 CheckScriptFailure([
1978 'vim9script',
1979 'try',
1980 ' echo "yes"',
1981 'catch',
1982 'endtry# comment',
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +02001983 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001984
1985 CheckScriptSuccess([
1986 'vim9script',
1987 'hi # comment',
1988 ])
1989 CheckScriptFailure([
1990 'vim9script',
1991 'hi# comment',
1992 ], 'E416:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02001993 CheckScriptSuccess([
1994 'vim9script',
1995 'hi Search # comment',
1996 ])
1997 CheckScriptFailure([
1998 'vim9script',
1999 'hi Search# comment',
2000 ], 'E416:')
2001 CheckScriptSuccess([
2002 'vim9script',
2003 'hi link This Search # comment',
2004 ])
2005 CheckScriptFailure([
2006 'vim9script',
2007 'hi link This That# comment',
2008 ], 'E413:')
2009 CheckScriptSuccess([
2010 'vim9script',
2011 'hi clear This # comment',
2012 'hi clear # comment',
2013 ])
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002014 # not tested, because it doesn't give an error but a warning:
2015 # hi clear This# comment',
Bram Moolenaar1966c242020-04-20 22:42:32 +02002016 CheckScriptFailure([
2017 'vim9script',
2018 'hi clear# comment',
2019 ], 'E416:')
2020
2021 CheckScriptSuccess([
2022 'vim9script',
2023 'hi Group term=bold',
2024 'match Group /todo/ # comment',
2025 ])
2026 CheckScriptFailure([
2027 'vim9script',
2028 'hi Group term=bold',
2029 'match Group /todo/# comment',
2030 ], 'E488:')
2031 CheckScriptSuccess([
2032 'vim9script',
2033 'match # comment',
2034 ])
2035 CheckScriptFailure([
2036 'vim9script',
2037 'match# comment',
2038 ], 'E475:')
2039 CheckScriptSuccess([
2040 'vim9script',
2041 'match none # comment',
2042 ])
2043 CheckScriptFailure([
2044 'vim9script',
2045 'match none# comment',
2046 ], 'E475:')
2047
2048 CheckScriptSuccess([
2049 'vim9script',
2050 'menutrans clear # comment',
2051 ])
2052 CheckScriptFailure([
2053 'vim9script',
2054 'menutrans clear# comment text',
2055 ], 'E474:')
2056
2057 CheckScriptSuccess([
2058 'vim9script',
2059 'syntax clear # comment',
2060 ])
2061 CheckScriptFailure([
2062 'vim9script',
2063 'syntax clear# comment text',
2064 ], 'E28:')
2065 CheckScriptSuccess([
2066 'vim9script',
2067 'syntax keyword Word some',
2068 'syntax clear Word # comment',
2069 ])
2070 CheckScriptFailure([
2071 'vim9script',
2072 'syntax keyword Word some',
2073 'syntax clear Word# comment text',
2074 ], 'E28:')
2075
2076 CheckScriptSuccess([
2077 'vim9script',
2078 'syntax list # comment',
2079 ])
2080 CheckScriptFailure([
2081 'vim9script',
2082 'syntax list# comment text',
2083 ], 'E28:')
2084
2085 CheckScriptSuccess([
2086 'vim9script',
2087 'syntax match Word /pat/ oneline # comment',
2088 ])
2089 CheckScriptFailure([
2090 'vim9script',
2091 'syntax match Word /pat/ oneline# comment',
2092 ], 'E475:')
2093
2094 CheckScriptSuccess([
2095 'vim9script',
2096 'syntax keyword Word word # comm[ent',
2097 ])
2098 CheckScriptFailure([
2099 'vim9script',
2100 'syntax keyword Word word# comm[ent',
2101 ], 'E789:')
2102
2103 CheckScriptSuccess([
2104 'vim9script',
2105 'syntax match Word /pat/ # comment',
2106 ])
2107 CheckScriptFailure([
2108 'vim9script',
2109 'syntax match Word /pat/# comment',
2110 ], 'E402:')
2111
2112 CheckScriptSuccess([
2113 'vim9script',
2114 'syntax match Word /pat/ contains=Something # comment',
2115 ])
2116 CheckScriptFailure([
2117 'vim9script',
2118 'syntax match Word /pat/ contains=Something# comment',
2119 ], 'E475:')
2120 CheckScriptFailure([
2121 'vim9script',
2122 'syntax match Word /pat/ contains= # comment',
2123 ], 'E406:')
2124 CheckScriptFailure([
2125 'vim9script',
2126 'syntax match Word /pat/ contains=# comment',
2127 ], 'E475:')
2128
2129 CheckScriptSuccess([
2130 'vim9script',
2131 'syntax region Word start=/pat/ end=/pat/ # comment',
2132 ])
2133 CheckScriptFailure([
2134 'vim9script',
2135 'syntax region Word start=/pat/ end=/pat/# comment',
Bram Moolenaard032f342020-07-18 18:13:02 +02002136 ], 'E402:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02002137
2138 CheckScriptSuccess([
2139 'vim9script',
2140 'syntax sync # comment',
2141 ])
2142 CheckScriptFailure([
2143 'vim9script',
2144 'syntax sync# comment',
2145 ], 'E404:')
2146 CheckScriptSuccess([
2147 'vim9script',
2148 'syntax sync ccomment # comment',
2149 ])
2150 CheckScriptFailure([
2151 'vim9script',
2152 'syntax sync ccomment# comment',
2153 ], 'E404:')
2154
2155 CheckScriptSuccess([
2156 'vim9script',
2157 'syntax cluster Some contains=Word # comment',
2158 ])
2159 CheckScriptFailure([
2160 'vim9script',
2161 'syntax cluster Some contains=Word# comment',
2162 ], 'E475:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002163
2164 CheckScriptSuccess([
2165 'vim9script',
2166 'command Echo echo # comment',
2167 'command Echo # comment',
2168 ])
2169 CheckScriptFailure([
2170 'vim9script',
2171 'command Echo echo# comment',
2172 'Echo',
2173 ], 'E121:')
2174 CheckScriptFailure([
2175 'vim9script',
2176 'command Echo# comment',
2177 ], 'E182:')
2178 CheckScriptFailure([
2179 'vim9script',
2180 'command Echo echo',
2181 'command Echo# comment',
2182 ], 'E182:')
2183
2184 CheckScriptSuccess([
2185 'vim9script',
2186 'function # comment',
2187 ])
2188 CheckScriptFailure([
2189 'vim9script',
2190 'function# comment',
2191 ], 'E129:')
2192 CheckScriptSuccess([
2193 'vim9script',
2194 'function CheckScriptSuccess # comment',
2195 ])
2196 CheckScriptFailure([
2197 'vim9script',
2198 'function CheckScriptSuccess# comment',
2199 ], 'E488:')
2200
2201 CheckScriptSuccess([
2202 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002203 'func g:DeleteMeA()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002204 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002205 'delfunction g:DeleteMeA # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002206 ])
2207 CheckScriptFailure([
2208 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002209 'func g:DeleteMeB()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002210 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002211 'delfunction g:DeleteMeB# comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002212 ], 'E488:')
2213
2214 CheckScriptSuccess([
2215 'vim9script',
2216 'call execute("ls") # comment',
2217 ])
2218 CheckScriptFailure([
2219 'vim9script',
2220 'call execute("ls")# comment',
2221 ], 'E488:')
Bram Moolenaare7e48382020-07-22 18:17:08 +02002222
2223 CheckScriptFailure([
2224 'def Test() " comment',
2225 'enddef',
2226 ], 'E488:')
2227 CheckScriptFailure([
2228 'vim9script',
2229 'def Test() " comment',
2230 'enddef',
2231 ], 'E488:')
2232
2233 CheckScriptSuccess([
2234 'func Test() " comment',
2235 'endfunc',
2236 ])
2237 CheckScriptFailure([
2238 'vim9script',
2239 'func Test() " comment',
2240 'endfunc',
2241 ], 'E488:')
2242
2243 CheckScriptSuccess([
2244 'def Test() # comment',
2245 'enddef',
2246 ])
2247 CheckScriptFailure([
2248 'func Test() # comment',
2249 'endfunc',
2250 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002251enddef
2252
2253def Test_vim9_comment_gui()
2254 CheckCanRunGui
2255
2256 CheckScriptFailure([
2257 'vim9script',
2258 'gui#comment'
2259 ], 'E499:')
2260 CheckScriptFailure([
2261 'vim9script',
2262 'gui -f#comment'
2263 ], 'E499:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02002264enddef
2265
Bram Moolenaara26b9702020-04-18 19:53:28 +02002266def Test_vim9_comment_not_compiled()
Bram Moolenaar67979662020-06-20 22:50:47 +02002267 au TabEnter *.vim g:entered = 1
2268 au TabEnter *.x g:entered = 2
Bram Moolenaara26b9702020-04-18 19:53:28 +02002269
2270 edit test.vim
2271 doautocmd TabEnter #comment
2272 assert_equal(1, g:entered)
2273
2274 doautocmd TabEnter f.x
2275 assert_equal(2, g:entered)
2276
2277 g:entered = 0
2278 doautocmd TabEnter f.x #comment
2279 assert_equal(2, g:entered)
2280
2281 assert_fails('doautocmd Syntax#comment', 'E216:')
2282
2283 au! TabEnter
2284 unlet g:entered
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02002285
2286 CheckScriptSuccess([
2287 'vim9script',
Bram Moolenaar67979662020-06-20 22:50:47 +02002288 'g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02002289 'b:var = 456',
2290 'w:var = 777',
2291 't:var = 888',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02002292 'unlet g:var w:var # something',
2293 ])
2294
2295 CheckScriptFailure([
2296 'vim9script',
2297 'let g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02002298 ], 'E1016: Cannot declare a global variable:')
2299
2300 CheckScriptFailure([
2301 'vim9script',
2302 'let b:var = 123',
2303 ], 'E1016: Cannot declare a buffer variable:')
2304
2305 CheckScriptFailure([
2306 'vim9script',
2307 'let w:var = 123',
2308 ], 'E1016: Cannot declare a window variable:')
2309
2310 CheckScriptFailure([
2311 'vim9script',
2312 'let t:var = 123',
2313 ], 'E1016: Cannot declare a tab variable:')
2314
2315 CheckScriptFailure([
2316 'vim9script',
2317 'let v:version = 123',
2318 ], 'E1016: Cannot declare a v: variable:')
2319
2320 CheckScriptFailure([
2321 'vim9script',
2322 'let $VARIABLE = "text"',
2323 ], 'E1016: Cannot declare an environment variable:')
Bram Moolenaar67979662020-06-20 22:50:47 +02002324
2325 CheckScriptFailure([
2326 'vim9script',
2327 'g:var = 123',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002328 'unlet g:var# comment1',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02002329 ], 'E108:')
2330
2331 CheckScriptFailure([
2332 'let g:var = 123',
2333 'unlet g:var # something',
2334 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002335
2336 CheckScriptSuccess([
2337 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002338 'if 1 # comment2',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002339 ' echo "yes"',
2340 'elseif 2 #comment',
2341 ' echo "no"',
2342 'endif',
2343 ])
2344
2345 CheckScriptFailure([
2346 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002347 'if 1# comment3',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002348 ' echo "yes"',
2349 'endif',
2350 ], 'E15:')
2351
2352 CheckScriptFailure([
2353 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002354 'if 0 # comment4',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002355 ' echo "yes"',
2356 'elseif 2#comment',
2357 ' echo "no"',
2358 'endif',
2359 ], 'E15:')
2360
2361 CheckScriptSuccess([
2362 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002363 'let v = 1 # comment5',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002364 ])
2365
2366 CheckScriptFailure([
2367 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002368 'let v = 1# comment6',
2369 ], 'E15:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002370
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002371 CheckScriptSuccess([
2372 'vim9script',
2373 'new'
2374 'call setline(1, ["# define pat", "last"])',
Bram Moolenaardf069ee2020-06-22 23:02:51 +02002375 ':$',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002376 'dsearch /pat/ #comment',
2377 'bwipe!',
2378 ])
2379
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002380 CheckScriptFailure([
2381 'vim9script',
2382 'new'
2383 'call setline(1, ["# define pat", "last"])',
2384 ':$',
2385 'dsearch /pat/#comment',
2386 'bwipe!',
2387 ], 'E488:')
2388
2389 CheckScriptFailure([
2390 'vim9script',
2391 'func! SomeFunc()',
2392 ], 'E477:')
Bram Moolenaara26b9702020-04-18 19:53:28 +02002393enddef
2394
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02002395def Test_finish()
2396 let lines =<< trim END
2397 vim9script
Bram Moolenaar67979662020-06-20 22:50:47 +02002398 g:res = 'one'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02002399 if v:false | finish | endif
Bram Moolenaar67979662020-06-20 22:50:47 +02002400 g:res = 'two'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02002401 finish
Bram Moolenaar67979662020-06-20 22:50:47 +02002402 g:res = 'three'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02002403 END
2404 writefile(lines, 'Xfinished')
2405 source Xfinished
2406 assert_equal('two', g:res)
2407
2408 unlet g:res
2409 delete('Xfinished')
2410enddef
2411
Bram Moolenaar32e35112020-05-14 22:41:15 +02002412def Test_let_func_call()
2413 let lines =<< trim END
2414 vim9script
2415 func GetValue()
2416 if exists('g:count')
2417 let g:count += 1
2418 else
2419 let g:count = 1
2420 endif
2421 return 'this'
2422 endfunc
2423 let val: string = GetValue()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002424 # env var is always a string
Bram Moolenaardf671b42020-05-16 22:33:33 +02002425 let env = $TERM
Bram Moolenaar32e35112020-05-14 22:41:15 +02002426 END
2427 writefile(lines, 'Xfinished')
2428 source Xfinished
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002429 # GetValue() is not called during discovery phase
Bram Moolenaar32e35112020-05-14 22:41:15 +02002430 assert_equal(1, g:count)
2431
2432 unlet g:count
2433 delete('Xfinished')
2434enddef
2435
2436def Test_let_missing_type()
2437 let lines =<< trim END
2438 vim9script
Bram Moolenaardf671b42020-05-16 22:33:33 +02002439 let var = g:unknown
Bram Moolenaar227a69d2020-05-15 18:17:28 +02002440 END
Bram Moolenaar822ba242020-05-24 23:00:18 +02002441 CheckScriptFailure(lines, 'E121:')
Bram Moolenaar227a69d2020-05-15 18:17:28 +02002442
2443 lines =<< trim END
2444 vim9script
2445 let nr: number = 123
2446 let var = nr
2447 END
Bram Moolenaar822ba242020-05-24 23:00:18 +02002448 CheckScriptSuccess(lines)
Bram Moolenaar32e35112020-05-14 22:41:15 +02002449enddef
2450
Bram Moolenaarc82a5b52020-06-13 18:09:19 +02002451def Test_let_declaration()
2452 let lines =<< trim END
2453 vim9script
2454 let var: string
2455 g:var_uninit = var
2456 var = 'text'
2457 g:var_test = var
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002458 # prefixing s: is optional
Bram Moolenaar984dddb2020-06-14 12:50:24 +02002459 s:var = 'prefixed'
2460 g:var_prefixed = s:var
2461
2462 let s:other: number
2463 other = 1234
2464 g:other_var = other
Bram Moolenaarc82a5b52020-06-13 18:09:19 +02002465 END
2466 CheckScriptSuccess(lines)
2467 assert_equal('', g:var_uninit)
2468 assert_equal('text', g:var_test)
Bram Moolenaar984dddb2020-06-14 12:50:24 +02002469 assert_equal('prefixed', g:var_prefixed)
2470 assert_equal(1234, g:other_var)
Bram Moolenaarc82a5b52020-06-13 18:09:19 +02002471
2472 unlet g:var_uninit
2473 unlet g:var_test
Bram Moolenaar984dddb2020-06-14 12:50:24 +02002474 unlet g:var_prefixed
2475 unlet g:other_var
Bram Moolenaarc82a5b52020-06-13 18:09:19 +02002476enddef
2477
Bram Moolenaarc5b1c202020-06-18 22:43:27 +02002478def Test_let_declaration_fails()
2479 let lines =<< trim END
2480 vim9script
2481 const var: string
2482 END
2483 CheckScriptFailure(lines, 'E1021:')
2484
2485 lines =<< trim END
2486 vim9script
2487 let 9var: string
2488 END
2489 CheckScriptFailure(lines, 'E475:')
2490enddef
2491
Bram Moolenaar34db91f2020-06-13 19:00:10 +02002492def Test_let_type_check()
2493 let lines =<< trim END
2494 vim9script
2495 let var: string
2496 var = 1234
2497 END
2498 CheckScriptFailure(lines, 'E1013:')
Bram Moolenaar984dddb2020-06-14 12:50:24 +02002499
2500 lines =<< trim END
2501 vim9script
2502 let var:string
2503 END
2504 CheckScriptFailure(lines, 'E1069:')
Bram Moolenaarc5b1c202020-06-18 22:43:27 +02002505
2506 lines =<< trim END
2507 vim9script
2508 let var: asdf
2509 END
2510 CheckScriptFailure(lines, 'E1010:')
Bram Moolenaar34db91f2020-06-13 19:00:10 +02002511enddef
2512
Bram Moolenaara5d00772020-05-14 23:20:55 +02002513def Test_forward_declaration()
2514 let lines =<< trim END
2515 vim9script
Bram Moolenaara5d00772020-05-14 23:20:55 +02002516 def GetValue(): string
2517 return theVal
2518 enddef
2519 let theVal = 'something'
Bram Moolenaar822ba242020-05-24 23:00:18 +02002520 g:initVal = GetValue()
Bram Moolenaara5d00772020-05-14 23:20:55 +02002521 theVal = 'else'
2522 g:laterVal = GetValue()
2523 END
2524 writefile(lines, 'Xforward')
2525 source Xforward
2526 assert_equal('something', g:initVal)
2527 assert_equal('else', g:laterVal)
2528
2529 unlet g:initVal
2530 unlet g:laterVal
2531 delete('Xforward')
2532enddef
2533
Bram Moolenaar9721fb42020-06-11 23:10:46 +02002534def Test_source_vim9_from_legacy()
2535 let legacy_lines =<< trim END
2536 source Xvim9_script.vim
2537
2538 call assert_false(exists('local'))
2539 call assert_false(exists('exported'))
2540 call assert_false(exists('s:exported'))
2541 call assert_equal('global', global)
2542 call assert_equal('global', g:global)
2543
2544 " imported variable becomes script-local
2545 import exported from './Xvim9_script.vim'
2546 call assert_equal('exported', s:exported)
2547 call assert_false(exists('exported'))
2548
2549 " imported function becomes script-local
2550 import GetText from './Xvim9_script.vim'
2551 call assert_equal('text', s:GetText())
2552 call assert_false(exists('*GetText'))
2553 END
2554 writefile(legacy_lines, 'Xlegacy_script.vim')
2555
2556 let vim9_lines =<< trim END
2557 vim9script
2558 let local = 'local'
2559 g:global = 'global'
2560 export let exported = 'exported'
2561 export def GetText(): string
2562 return 'text'
2563 enddef
2564 END
2565 writefile(vim9_lines, 'Xvim9_script.vim')
2566
2567 source Xlegacy_script.vim
2568
2569 assert_equal('global', g:global)
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002570 unlet g:global
Bram Moolenaar9721fb42020-06-11 23:10:46 +02002571
2572 delete('Xlegacy_script.vim')
2573 delete('Xvim9_script.vim')
2574enddef
Bram Moolenaara5d00772020-05-14 23:20:55 +02002575
Bram Moolenaareeb27bf2020-07-04 17:39:10 +02002576def Test_vim9_copen()
2577 # this was giving an error for setting w:quickfix_title
2578 copen
2579 quit
2580enddef
2581
Bram Moolenaar585fea72020-04-02 22:33:21 +02002582" Keep this last, it messes up highlighting.
2583def Test_substitute_cmd()
2584 new
2585 setline(1, 'something')
2586 :substitute(some(other(
2587 assert_equal('otherthing', getline(1))
2588 bwipe!
2589
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002590 # also when the context is Vim9 script
Bram Moolenaar585fea72020-04-02 22:33:21 +02002591 let lines =<< trim END
2592 vim9script
2593 new
2594 setline(1, 'something')
2595 :substitute(some(other(
2596 assert_equal('otherthing', getline(1))
2597 bwipe!
2598 END
2599 writefile(lines, 'Xvim9lines')
2600 source Xvim9lines
2601
2602 delete('Xvim9lines')
2603enddef
2604
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002605" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker