blob: 3e2ced0a93f3b152135534748e1451e93628727b [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
Bram Moolenaar40f4f7a2020-07-23 22:41:43 +0200915 def GetExported(): string
916 let local_dict = #{ref: Exported}
917 return local_dict.ref()
918 enddef
919 g:funcref_result = GetExported()
920
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100921 import {exp_name} from './Xexport.vim'
922 g:imported_name = exp_name
923 exp_name ..= ' Doe'
924 g:imported_name_appended = exp_name
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100925 g:imported_later = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100926 END
927
928 writefile(import_script_lines, 'Ximport.vim')
929 writefile(s:export_script_lines, 'Xexport.vim')
930
931 source Ximport.vim
932
933 assert_equal('bobbie', g:result)
934 assert_equal('bob', g:localname)
935 assert_equal(9876, g:imported)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100936 assert_equal(9879, g:imported_added)
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100937 assert_equal(9879, g:imported_later)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100938 assert_equal('Exported', g:imported_func)
Bram Moolenaar40f4f7a2020-07-23 22:41:43 +0200939 assert_equal('Exported', g:funcref_result)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100940 assert_equal('John', g:imported_name)
941 assert_equal('John Doe', g:imported_name_appended)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100942 assert_false(exists('g:name'))
943
944 unlet g:result
945 unlet g:localname
946 unlet g:imported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100947 unlet g:imported_added
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100948 unlet g:imported_later
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100949 unlet g:imported_func
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100950 unlet g:imported_name g:imported_name_appended
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100951 delete('Ximport.vim')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100952
Bram Moolenaar1c991142020-07-04 13:15:31 +0200953 # similar, with line breaks
954 let import_line_break_script_lines =<< trim END
955 vim9script
956 import {
957 exported,
958 Exported,
959 }
960 from
961 './Xexport.vim'
962 g:imported = exported
963 exported += 5
964 g:imported_added = exported
965 g:imported_func = Exported()
966 END
967 writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
968 source Ximport_lbr.vim
969
970 assert_equal(9876, g:imported)
971 assert_equal(9881, g:imported_added)
972 assert_equal('Exported', g:imported_func)
973
974 # exported script not sourced again
975 assert_false(exists('g:result'))
976 unlet g:imported
977 unlet g:imported_added
978 unlet g:imported_func
979 delete('Ximport_lbr.vim')
980
981 # import inside :def function
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100982 let import_in_def_lines =<< trim END
983 vim9script
984 def ImportInDef()
985 import exported from './Xexport.vim'
986 g:imported = exported
987 exported += 7
988 g:imported_added = exported
989 enddef
990 ImportInDef()
991 END
992 writefile(import_in_def_lines, 'Ximport2.vim')
993 source Ximport2.vim
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200994 # TODO: this should be 9879
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100995 assert_equal(9876, g:imported)
996 assert_equal(9883, g:imported_added)
997 unlet g:imported
998 unlet g:imported_added
999 delete('Ximport2.vim')
1000
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001001 let import_star_as_lines =<< trim END
1002 vim9script
1003 import * as Export from './Xexport.vim'
1004 def UseExport()
1005 g:imported = Export.exported
1006 enddef
1007 UseExport()
1008 END
1009 writefile(import_star_as_lines, 'Ximport.vim')
1010 source Ximport.vim
Bram Moolenaar5381c7a2020-03-02 22:53:32 +01001011 assert_equal(9883, g:imported)
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001012
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001013 let import_star_as_lines_no_dot =<< trim END
1014 vim9script
1015 import * as Export from './Xexport.vim'
1016 def Func()
1017 let dummy = 1
1018 let imported = Export + dummy
1019 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +02001020 defcompile
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001021 END
1022 writefile(import_star_as_lines_no_dot, 'Ximport.vim')
1023 assert_fails('source Ximport.vim', 'E1060:')
1024
1025 let import_star_as_lines_dot_space =<< trim END
1026 vim9script
1027 import * as Export from './Xexport.vim'
1028 def Func()
1029 let imported = Export . exported
1030 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +02001031 defcompile
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001032 END
1033 writefile(import_star_as_lines_dot_space, 'Ximport.vim')
1034 assert_fails('source Ximport.vim', 'E1074:')
1035
1036 let import_star_as_lines_missing_name =<< trim END
1037 vim9script
1038 import * as Export from './Xexport.vim'
1039 def Func()
1040 let imported = Export.
1041 enddef
Bram Moolenaar822ba242020-05-24 23:00:18 +02001042 defcompile
Bram Moolenaar599c89c2020-03-28 14:53:20 +01001043 END
1044 writefile(import_star_as_lines_missing_name, 'Ximport.vim')
1045 assert_fails('source Ximport.vim', 'E1048:')
1046
Bram Moolenaar1c991142020-07-04 13:15:31 +02001047 let import_star_as_lbr_lines =<< trim END
1048 vim9script
1049 import *
1050 as Export
1051 from
1052 './Xexport.vim'
1053 def UseExport()
1054 g:imported = Export.exported
1055 enddef
1056 UseExport()
1057 END
1058 writefile(import_star_as_lbr_lines, 'Ximport.vim')
1059 source Ximport.vim
1060 assert_equal(9883, g:imported)
1061
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001062 let import_star_lines =<< trim END
1063 vim9script
1064 import * from './Xexport.vim'
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001065 END
1066 writefile(import_star_lines, 'Ximport.vim')
1067 assert_fails('source Ximport.vim', 'E1045:')
1068
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001069 # try to import something that exists but is not exported
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001070 let import_not_exported_lines =<< trim END
1071 vim9script
1072 import name from './Xexport.vim'
1073 END
1074 writefile(import_not_exported_lines, 'Ximport.vim')
1075 assert_fails('source Ximport.vim', 'E1049:')
1076
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001077 # try to import something that is already defined
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001078 let import_already_defined =<< trim END
1079 vim9script
1080 let exported = 'something'
1081 import exported from './Xexport.vim'
1082 END
1083 writefile(import_already_defined, 'Ximport.vim')
1084 assert_fails('source Ximport.vim', 'E1073:')
1085
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001086 # try to import something that is already defined
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001087 import_already_defined =<< trim END
1088 vim9script
1089 let exported = 'something'
1090 import * as exported from './Xexport.vim'
1091 END
1092 writefile(import_already_defined, 'Ximport.vim')
1093 assert_fails('source Ximport.vim', 'E1073:')
1094
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001095 # try to import something that is already defined
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001096 import_already_defined =<< trim END
1097 vim9script
1098 let exported = 'something'
1099 import {exported} from './Xexport.vim'
1100 END
1101 writefile(import_already_defined, 'Ximport.vim')
1102 assert_fails('source Ximport.vim', 'E1073:')
1103
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001104 # import a very long name, requires making a copy
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001105 let import_long_name_lines =<< trim END
1106 vim9script
1107 import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1108 END
1109 writefile(import_long_name_lines, 'Ximport.vim')
1110 assert_fails('source Ximport.vim', 'E1048:')
1111
1112 let import_no_from_lines =<< trim END
1113 vim9script
1114 import name './Xexport.vim'
1115 END
1116 writefile(import_no_from_lines, 'Ximport.vim')
1117 assert_fails('source Ximport.vim', 'E1070:')
1118
1119 let import_invalid_string_lines =<< trim END
1120 vim9script
1121 import name from Xexport.vim
1122 END
1123 writefile(import_invalid_string_lines, 'Ximport.vim')
1124 assert_fails('source Ximport.vim', 'E1071:')
1125
1126 let import_wrong_name_lines =<< trim END
1127 vim9script
1128 import name from './XnoExport.vim'
1129 END
1130 writefile(import_wrong_name_lines, 'Ximport.vim')
1131 assert_fails('source Ximport.vim', 'E1053:')
1132
1133 let import_missing_comma_lines =<< trim END
1134 vim9script
1135 import {exported name} from './Xexport.vim'
1136 END
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001137 writefile(import_missing_comma_lines, 'Ximport3.vim')
1138 assert_fails('source Ximport3.vim', 'E1046:')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +01001139
Bram Moolenaarf2d5c242020-02-23 21:25:54 +01001140 delete('Ximport.vim')
Bram Moolenaar5269bd22020-03-09 19:25:27 +01001141 delete('Ximport3.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001142 delete('Xexport.vim')
1143
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001144 # Check that in a Vim9 script 'cpo' is set to the Vim default.
Bram Moolenaar750802b2020-02-23 18:08:33 +01001145 set cpo&vi
1146 let cpo_before = &cpo
1147 let lines =<< trim END
1148 vim9script
1149 g:cpo_in_vim9script = &cpo
1150 END
1151 writefile(lines, 'Xvim9_script')
1152 source Xvim9_script
1153 assert_equal(cpo_before, &cpo)
1154 set cpo&vim
1155 assert_equal(&cpo, g:cpo_in_vim9script)
1156 delete('Xvim9_script')
1157enddef
1158
1159def Test_vim9script_fails()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001160 CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
1161 CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +01001162 CheckScriptFailure(['export let some = 123'], 'E1042:')
Bram Moolenaar9721fb42020-06-11 23:10:46 +02001163 CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +02001164 CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
Bram Moolenaar750802b2020-02-23 18:08:33 +01001165 CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1166
Bram Moolenaarc785b9a2020-06-19 18:34:15 +02001167 CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:')
1168 CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1169
Bram Moolenaar750802b2020-02-23 18:08:33 +01001170 assert_fails('vim9script', 'E1038')
Bram Moolenaara26b9702020-04-18 19:53:28 +02001171 assert_fails('export something', 'E1043')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001172enddef
1173
Bram Moolenaarf7d267e2020-06-17 12:04:54 +02001174func Test_import_fails_without_script()
Bram Moolenaar101f4812020-06-16 23:18:51 +02001175 CheckRunVimInTerminal
1176
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001177 " call indirectly to avoid compilation error for missing functions
Bram Moolenaarc620c052020-07-08 15:16:19 +02001178 call Run_Test_import_fails_on_command_line()
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001179endfunc
1180
Bram Moolenaarc620c052020-07-08 15:16:19 +02001181def Run_Test_import_fails_on_command_line()
Bram Moolenaar101f4812020-06-16 23:18:51 +02001182 let export =<< trim END
1183 vim9script
1184 export def Foo(): number
1185 return 0
1186 enddef
1187 END
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001188 writefile(export, 'Xexport.vim')
Bram Moolenaar101f4812020-06-16 23:18:51 +02001189
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001190 let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{
1191 rows: 6, wait_for_ruler: 0})
1192 WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
Bram Moolenaar101f4812020-06-16 23:18:51 +02001193
Bram Moolenaar9bb3eb32020-06-17 20:03:36 +02001194 delete('Xexport.vim')
1195 StopVimInTerminal(buf)
1196enddef
Bram Moolenaar101f4812020-06-16 23:18:51 +02001197
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001198def Test_vim9script_reload_import()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001199 let lines =<< trim END
1200 vim9script
1201 const var = ''
1202 let valone = 1234
1203 def MyFunc(arg: string)
1204 valone = 5678
1205 enddef
1206 END
1207 let morelines =<< trim END
1208 let valtwo = 222
1209 export def GetValtwo(): number
1210 return valtwo
1211 enddef
1212 END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001213 writefile(lines + morelines, 'Xreload.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001214 source Xreload.vim
1215 source Xreload.vim
1216 source Xreload.vim
1217
1218 let testlines =<< trim END
1219 vim9script
1220 def TheFunc()
1221 import GetValtwo from './Xreload.vim'
1222 assert_equal(222, GetValtwo())
1223 enddef
1224 TheFunc()
1225 END
1226 writefile(testlines, 'Ximport.vim')
1227 source Ximport.vim
1228
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001229 # Test that when not using "morelines" GetValtwo() and valtwo are still
1230 # defined, because import doesn't reload a script.
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001231 writefile(lines, 'Xreload.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001232 source Ximport.vim
1233
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001234 # cannot declare a var twice
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001235 lines =<< trim END
1236 vim9script
1237 let valone = 1234
1238 let valone = 5678
1239 END
1240 writefile(lines, 'Xreload.vim')
1241 assert_fails('source Xreload.vim', 'E1041:')
1242
1243 delete('Xreload.vim')
1244 delete('Ximport.vim')
1245enddef
1246
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001247" Not exported function that is referenced needs to be accessed by the
1248" script-local name.
1249def Test_vim9script_funcref()
1250 let sortlines =<< trim END
1251 vim9script
1252 def Compare(i1: number, i2: number): number
Bram Moolenaarbed36b92020-07-07 23:31:36 +02001253 return i2 - i1
Bram Moolenaarfe465a02020-07-07 22:50:12 +02001254 enddef
1255
1256 export def FastSort(): list<number>
1257 return range(5)->sort(Compare)
1258 enddef
1259 END
1260 writefile(sortlines, 'Xsort.vim')
1261
1262 let lines =<< trim END
1263 vim9script
1264 import FastSort from './Xsort.vim'
1265 def Test()
1266 g:result = FastSort()
1267 enddef
1268 Test()
1269 END
1270 writefile(lines, 'Xscript.vim')
1271
1272 source Xscript.vim
1273 assert_equal([4, 3, 2, 1, 0], g:result)
1274
1275 unlet g:result
1276 delete('Xsort.vim')
1277 delete('Xscript.vim')
1278enddef
1279
Bram Moolenaarc620c052020-07-08 15:16:19 +02001280" Check that when searcing for "FilterFunc" it doesn't find the import in the
1281" script where FastFilter() is called from.
1282def Test_vim9script_funcref_other_script()
1283 let filterLines =<< trim END
1284 vim9script
1285 export def FilterFunc(idx: number, val: number): bool
1286 return idx % 2 == 1
1287 enddef
1288 export def FastFilter(): list<number>
1289 return range(10)->filter('FilterFunc')
1290 enddef
1291 END
1292 writefile(filterLines, 'Xfilter.vim')
1293
1294 let lines =<< trim END
1295 vim9script
1296 import {FilterFunc, FastFilter} from './Xfilter.vim'
1297 def Test()
1298 let x: list<number> = FastFilter()
1299 enddef
1300 Test()
1301 END
1302 writefile(lines, 'Ximport.vim')
1303 assert_fails('source Ximport.vim', 'E121:')
1304
1305 delete('Xfilter.vim')
1306 delete('Ximport.vim')
1307enddef
1308
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001309def Test_vim9script_reload_delfunc()
1310 let first_lines =<< trim END
1311 vim9script
1312 def FuncYes(): string
1313 return 'yes'
1314 enddef
1315 END
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001316 let withno_lines =<< trim END
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001317 def FuncNo(): string
1318 return 'no'
1319 enddef
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001320 def g:DoCheck(no_exists: bool)
1321 assert_equal('yes', FuncYes())
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001322 assert_equal('no', FuncNo())
1323 enddef
1324 END
1325 let nono_lines =<< trim END
1326 def g:DoCheck(no_exists: bool)
1327 assert_equal('yes', FuncYes())
1328 assert_fails('call FuncNo()', 'E117:')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001329 enddef
1330 END
1331
1332 # FuncNo() is defined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001333 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001334 source Xreloaded.vim
1335 g:DoCheck(true)
1336
1337 # FuncNo() is not redefined
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001338 writefile(first_lines + nono_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001339 source Xreloaded.vim
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001340 g:DoCheck()
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001341
1342 # FuncNo() is back
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001343 writefile(first_lines + withno_lines, 'Xreloaded.vim')
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001344 source Xreloaded.vim
Bram Moolenaar03afdcf2020-04-27 23:39:30 +02001345 g:DoCheck()
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02001346
1347 delete('Xreloaded.vim')
1348enddef
1349
Bram Moolenaar89483d42020-05-10 15:24:44 +02001350def Test_vim9script_reload_delvar()
1351 # write the script with a script-local variable
1352 let lines =<< trim END
1353 vim9script
1354 let var = 'string'
1355 END
1356 writefile(lines, 'XreloadVar.vim')
1357 source XreloadVar.vim
1358
1359 # now write the script using the same variable locally - works
1360 lines =<< trim END
1361 vim9script
1362 def Func()
1363 let var = 'string'
1364 enddef
1365 END
1366 writefile(lines, 'XreloadVar.vim')
1367 source XreloadVar.vim
1368
1369 delete('XreloadVar.vim')
1370enddef
1371
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001372def Test_import_absolute()
1373 let import_lines = [
Bram Moolenaare6085c52020-04-12 20:19:16 +02001374 'vim9script',
1375 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1376 'def UseExported()',
1377 ' g:imported_abs = exported',
1378 ' exported = 8888',
1379 ' g:imported_after = exported',
1380 'enddef',
1381 'UseExported()',
1382 'g:import_disassembled = execute("disass UseExported")',
1383 ]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001384 writefile(import_lines, 'Ximport_abs.vim')
1385 writefile(s:export_script_lines, 'Xexport_abs.vim')
1386
1387 source Ximport_abs.vim
1388
1389 assert_equal(9876, g:imported_abs)
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +01001390 assert_equal(8888, g:imported_after)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001391 assert_match('<SNR>\d\+_UseExported.*' ..
1392 'g:imported_abs = exported.*' ..
1393 '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1394 '1 STOREG g:imported_abs.*' ..
1395 'exported = 8888.*' ..
1396 '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1397 'g:imported_after = exported.*' ..
1398 '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1399 '5 STOREG g:imported_after.*',
Bram Moolenaare6085c52020-04-12 20:19:16 +02001400 g:import_disassembled)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001401 unlet g:imported_abs
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +01001402 unlet g:import_disassembled
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001403
1404 delete('Ximport_abs.vim')
1405 delete('Xexport_abs.vim')
1406enddef
1407
1408def Test_import_rtp()
1409 let import_lines = [
Bram Moolenaare6085c52020-04-12 20:19:16 +02001410 'vim9script',
1411 'import exported from "Xexport_rtp.vim"',
1412 'g:imported_rtp = exported',
1413 ]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001414 writefile(import_lines, 'Ximport_rtp.vim')
1415 mkdir('import')
1416 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
1417
1418 let save_rtp = &rtp
1419 &rtp = getcwd()
1420 source Ximport_rtp.vim
1421 &rtp = save_rtp
1422
1423 assert_equal(9876, g:imported_rtp)
1424 unlet g:imported_rtp
1425
1426 delete('Ximport_rtp.vim')
Bram Moolenaar89483d42020-05-10 15:24:44 +02001427 delete('import', 'rf')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001428enddef
1429
Bram Moolenaar25e0f582020-05-25 22:36:50 +02001430def Test_import_compile_error()
1431 let export_lines = [
1432 'vim9script',
1433 'export def ExpFunc(): string',
1434 ' return notDefined',
1435 'enddef',
1436 ]
1437 writefile(export_lines, 'Xexported.vim')
1438
1439 let import_lines = [
1440 'vim9script',
1441 'import ExpFunc from "./Xexported.vim"',
1442 'def ImpFunc()',
1443 ' echo ExpFunc()',
1444 'enddef',
1445 'defcompile',
1446 ]
1447 writefile(import_lines, 'Ximport.vim')
1448
1449 try
1450 source Ximport.vim
1451 catch /E1001/
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001452 # Error should be fore the Xexported.vim file.
Bram Moolenaar25e0f582020-05-25 22:36:50 +02001453 assert_match('E1001: variable not found: notDefined', v:exception)
1454 assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
1455 endtry
1456
1457 delete('Xexported.vim')
1458 delete('Ximport.vim')
1459enddef
1460
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001461def Test_fixed_size_list()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001462 # will be allocated as one piece of memory, check that changes work
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001463 let l = [1, 2, 3, 4]
1464 l->remove(0)
1465 l->add(5)
1466 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001467 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001468enddef
1469
Bram Moolenaar158906c2020-02-06 20:39:45 +01001470def IfElse(what: number): string
1471 let res = ''
1472 if what == 1
1473 res = "one"
1474 elseif what == 2
1475 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001476 else
Bram Moolenaar158906c2020-02-06 20:39:45 +01001477 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001478 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +01001479 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +01001480enddef
1481
Bram Moolenaar158906c2020-02-06 20:39:45 +01001482def Test_if_elseif_else()
1483 assert_equal('one', IfElse(1))
1484 assert_equal('two', IfElse(2))
1485 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +01001486enddef
1487
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001488def Test_if_elseif_else_fails()
1489 call CheckDefFailure(['elseif true'], 'E582:')
1490 call CheckDefFailure(['else'], 'E581:')
1491 call CheckDefFailure(['endif'], 'E580:')
1492 call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001493 call CheckDefFailure(['if true', 'echo 1'], 'E171:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001494enddef
1495
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001496let g:bool_true = v:true
1497let g:bool_false = v:false
1498
1499def Test_if_const_expr()
1500 let res = false
1501 if true ? true : false
1502 res = true
1503 endif
1504 assert_equal(true, res)
1505
Bram Moolenaar585fea72020-04-02 22:33:21 +02001506 g:glob = 2
1507 if false
Bram Moolenaar67979662020-06-20 22:50:47 +02001508 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001509 endif
1510 assert_equal(2, g:glob)
1511 if true
Bram Moolenaar67979662020-06-20 22:50:47 +02001512 execute('g:glob = 3')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001513 endif
1514 assert_equal(3, g:glob)
1515
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001516 res = false
1517 if g:bool_true ? true : false
1518 res = true
1519 endif
1520 assert_equal(true, res)
1521
1522 res = false
1523 if true ? g:bool_true : false
1524 res = true
1525 endif
1526 assert_equal(true, res)
1527
1528 res = false
1529 if true ? true : g:bool_false
1530 res = true
1531 endif
1532 assert_equal(true, res)
1533
1534 res = false
1535 if true ? false : true
1536 res = true
1537 endif
1538 assert_equal(false, res)
1539
1540 res = false
1541 if false ? false : true
1542 res = true
1543 endif
1544 assert_equal(true, res)
1545
1546 res = false
1547 if false ? true : false
1548 res = true
1549 endif
1550 assert_equal(false, res)
1551
1552 res = false
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001553 if has('xyz') ? true : false
1554 res = true
1555 endif
1556 assert_equal(false, res)
1557
1558 res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001559 if true && true
1560 res = true
1561 endif
1562 assert_equal(true, res)
1563
1564 res = false
1565 if true && false
1566 res = true
1567 endif
1568 assert_equal(false, res)
1569
1570 res = false
1571 if g:bool_true && false
1572 res = true
1573 endif
1574 assert_equal(false, res)
1575
1576 res = false
1577 if true && g:bool_false
1578 res = true
1579 endif
1580 assert_equal(false, res)
1581
1582 res = false
1583 if false && false
1584 res = true
1585 endif
1586 assert_equal(false, res)
1587
1588 res = false
1589 if true || false
1590 res = true
1591 endif
1592 assert_equal(true, res)
1593
1594 res = false
1595 if g:bool_true || false
1596 res = true
1597 endif
1598 assert_equal(true, res)
1599
1600 res = false
1601 if true || g:bool_false
1602 res = true
1603 endif
1604 assert_equal(true, res)
1605
1606 res = false
1607 if false || false
1608 res = true
1609 endif
1610 assert_equal(false, res)
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02001611enddef
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001612
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02001613def Test_if_const_expr_fails()
1614 call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1615 call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001616 call CheckDefFailure(["if has('aaa'"], 'E110:')
1617 call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001618enddef
1619
Bram Moolenaar72abcf42020-06-18 18:26:24 +02001620def RunNested(i: number): number
1621 let x: number = 0
1622 if i % 2
1623 if 1
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001624 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02001625 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001626 # comment
Bram Moolenaar72abcf42020-06-18 18:26:24 +02001627 endif
1628 x += 1
1629 else
1630 x += 1000
1631 endif
1632 return x
1633enddef
1634
1635def Test_nested_if()
1636 assert_equal(1, RunNested(1))
1637 assert_equal(1000, RunNested(2))
1638enddef
1639
Bram Moolenaarad39c092020-02-26 18:23:43 +01001640def Test_execute_cmd()
1641 new
1642 setline(1, 'default')
1643 execute 'call setline(1, "execute-string")'
1644 assert_equal('execute-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001645
1646 execute "call setline(1, 'execute-string')"
1647 assert_equal('execute-string', getline(1))
1648
Bram Moolenaarad39c092020-02-26 18:23:43 +01001649 let cmd1 = 'call setline(1,'
1650 let cmd2 = '"execute-var")'
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001651 execute cmd1 cmd2 # comment
Bram Moolenaarad39c092020-02-26 18:23:43 +01001652 assert_equal('execute-var', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001653
Bram Moolenaarad39c092020-02-26 18:23:43 +01001654 execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1655 assert_equal('execute-var-string', getline(1))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001656
Bram Moolenaarad39c092020-02-26 18:23:43 +01001657 let cmd_first = 'call '
1658 let cmd_last = 'setline(1, "execute-var-var")'
1659 execute cmd_first .. cmd_last
1660 assert_equal('execute-var-var', getline(1))
1661 bwipe!
Bram Moolenaar585fea72020-04-02 22:33:21 +02001662
1663 call CheckDefFailure(['execute xxx'], 'E1001:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001664 call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
Bram Moolenaarad39c092020-02-26 18:23:43 +01001665enddef
1666
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001667def Test_execute_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001668 # only checks line continuation
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001669 let lines =<< trim END
1670 vim9script
1671 execute 'g:someVar'
1672 .. ' = ' ..
1673 '28'
1674 assert_equal(28, g:someVar)
1675 unlet g:someVar
1676 END
1677 CheckScriptSuccess(lines)
1678enddef
1679
Bram Moolenaarad39c092020-02-26 18:23:43 +01001680def Test_echo_cmd()
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001681 echo 'some' # comment
Bram Moolenaar585fea72020-04-02 22:33:21 +02001682 echon 'thing'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001683 assert_match('^something$', Screenline(&lines))
1684
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001685 echo "some" # comment
1686 echon "thing"
1687 assert_match('^something$', Screenline(&lines))
1688
Bram Moolenaarad39c092020-02-26 18:23:43 +01001689 let str1 = 'some'
1690 let str2 = 'more'
1691 echo str1 str2
1692 assert_match('^some more$', Screenline(&lines))
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001693
1694 call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
Bram Moolenaarad39c092020-02-26 18:23:43 +01001695enddef
1696
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001697def Test_echomsg_cmd()
1698 echomsg 'some' 'more' # comment
1699 assert_match('^some more$', Screenline(&lines))
1700 echo 'clear'
Bram Moolenaardf069ee2020-06-22 23:02:51 +02001701 :1messages
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001702 assert_match('^some more$', Screenline(&lines))
1703
1704 call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1705enddef
1706
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001707def Test_echomsg_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001708 # only checks line continuation
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001709 let lines =<< trim END
1710 vim9script
1711 echomsg 'here'
1712 .. ' is ' ..
1713 'a message'
1714 assert_match('^here is a message$', Screenline(&lines))
1715 END
1716 CheckScriptSuccess(lines)
1717enddef
1718
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001719def Test_echoerr_cmd()
Bram Moolenaar40ee4662020-05-05 22:08:26 +02001720 try
1721 echoerr 'something' 'wrong' # comment
1722 catch
1723 assert_match('something wrong', v:exception)
1724 endtry
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001725enddef
1726
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001727def Test_echoerr_cmd_vimscript()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001728 # only checks line continuation
Bram Moolenaar47e880d2020-06-30 22:02:02 +02001729 let lines =<< trim END
1730 vim9script
1731 try
1732 echoerr 'this'
1733 .. ' is ' ..
1734 'wrong'
1735 catch
1736 assert_match('this is wrong', v:exception)
1737 endtry
1738 END
1739 CheckScriptSuccess(lines)
1740enddef
1741
Bram Moolenaar41fe0612020-03-01 16:22:40 +01001742def Test_for_outside_of_function()
1743 let lines =<< trim END
1744 vim9script
1745 new
1746 for var in range(0, 3)
1747 append(line('$'), var)
1748 endfor
1749 assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
1750 bwipe!
1751 END
1752 writefile(lines, 'Xvim9for.vim')
1753 source Xvim9for.vim
1754 delete('Xvim9for.vim')
1755enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001756
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001757def Test_for_loop()
1758 let result = ''
1759 for cnt in range(7)
1760 if cnt == 4
1761 break
1762 endif
1763 if cnt == 2
1764 continue
1765 endif
1766 result ..= cnt .. '_'
1767 endfor
1768 assert_equal('0_1_3_', result)
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001769
1770 let concat = ''
1771 for str in eval('["one", "two"]')
1772 concat ..= str
1773 endfor
1774 assert_equal('onetwo', concat)
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001775enddef
1776
1777def Test_for_loop_fails()
Bram Moolenaar675f7162020-04-12 22:53:54 +02001778 CheckDefFailure(['for # in range(5)'], 'E690:')
1779 CheckDefFailure(['for i In range(5)'], 'E690:')
1780 CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
Bram Moolenaar822ba242020-05-24 23:00:18 +02001781 CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001782 CheckDefFailure(['for i in "text"'], 'E1013:')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001783 CheckDefFailure(['for i in xxx'], 'E1001:')
1784 CheckDefFailure(['endfor'], 'E588:')
1785 CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001786enddef
1787
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01001788def Test_while_loop()
1789 let result = ''
1790 let cnt = 0
1791 while cnt < 555
1792 if cnt == 3
1793 break
1794 endif
1795 cnt += 1
1796 if cnt == 2
1797 continue
1798 endif
1799 result ..= cnt .. '_'
1800 endwhile
1801 assert_equal('1_3_', result)
1802enddef
1803
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001804def Test_while_loop_fails()
Bram Moolenaar675f7162020-04-12 22:53:54 +02001805 CheckDefFailure(['while xxx'], 'E1001:')
1806 CheckDefFailure(['endwhile'], 'E588:')
1807 CheckDefFailure(['continue'], 'E586:')
1808 CheckDefFailure(['if true', 'continue'], 'E586:')
1809 CheckDefFailure(['break'], 'E587:')
1810 CheckDefFailure(['if true', 'break'], 'E587:')
1811 CheckDefFailure(['while 1', 'echo 3'], 'E170:')
Bram Moolenaarbd5da372020-03-31 23:13:10 +02001812enddef
1813
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001814def Test_interrupt_loop()
Bram Moolenaar97acfc72020-03-22 13:44:28 +01001815 let caught = false
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001816 let x = 0
Bram Moolenaar97acfc72020-03-22 13:44:28 +01001817 try
1818 while 1
1819 x += 1
1820 if x == 100
1821 feedkeys("\<C-C>", 'Lt')
1822 endif
1823 endwhile
1824 catch
1825 caught = true
1826 assert_equal(100, x)
1827 endtry
1828 assert_true(caught, 'should have caught an exception')
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001829enddef
Bram Moolenaar20431c92020-03-20 18:39:46 +01001830
Bram Moolenaar4fdae992020-04-12 16:38:57 +02001831def Test_automatic_line_continuation()
1832 let mylist = [
1833 'one',
1834 'two',
1835 'three',
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001836 ] # comment
Bram Moolenaar4fdae992020-04-12 16:38:57 +02001837 assert_equal(['one', 'two', 'three'], mylist)
1838
1839 let mydict = {
1840 'one': 1,
1841 'two': 2,
1842 'three':
1843 3,
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001844 } # comment
Bram Moolenaar4fdae992020-04-12 16:38:57 +02001845 assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
1846 mydict = #{
Bram Moolenaar2c330432020-04-13 14:41:35 +02001847 one: 1, # comment
1848 two: # comment
1849 2, # comment
1850 three: 3 # comment
1851 }
1852 assert_equal(#{one: 1, two: 2, three: 3}, mydict)
1853 mydict = #{
1854 one: 1,
1855 two:
1856 2,
1857 three: 3
Bram Moolenaar4fdae992020-04-12 16:38:57 +02001858 }
1859 assert_equal(#{one: 1, two: 2, three: 3}, mydict)
Bram Moolenaare6085c52020-04-12 20:19:16 +02001860
1861 assert_equal(
1862 ['one', 'two', 'three'],
1863 split('one two three')
1864 )
Bram Moolenaar4fdae992020-04-12 16:38:57 +02001865enddef
1866
Bram Moolenaar7a092242020-04-16 22:10:49 +02001867def Test_vim9_comment()
1868 CheckScriptSuccess([
1869 'vim9script',
1870 '# something',
1871 ])
1872 CheckScriptFailure([
1873 'vim9script',
1874 ':# something',
1875 ], 'E488:')
1876 CheckScriptFailure([
1877 '# something',
1878 ], 'E488:')
1879 CheckScriptFailure([
1880 ':# something',
1881 ], 'E488:')
1882
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02001883 { # block start
1884 } # block end
1885 CheckDefFailure([
1886 '{# comment',
1887 ], 'E488:')
1888 CheckDefFailure([
1889 '{',
1890 '}# comment',
1891 ], 'E488:')
1892
1893 echo "yes" # comment
1894 CheckDefFailure([
1895 'echo "yes"# comment',
1896 ], 'E488:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02001897 CheckScriptSuccess([
1898 'vim9script',
1899 'echo "yes" # something',
1900 ])
1901 CheckScriptFailure([
1902 'vim9script',
1903 'echo "yes"# something',
1904 ], 'E121:')
1905 CheckScriptFailure([
1906 'vim9script',
1907 'echo# something',
1908 ], 'E121:')
1909 CheckScriptFailure([
1910 'echo "yes" # something',
1911 ], 'E121:')
1912
Bram Moolenaar4a8d9f22020-04-16 22:54:32 +02001913 exe "echo" # comment
1914 CheckDefFailure([
1915 'exe "echo"# comment',
1916 ], 'E488:')
1917 CheckScriptSuccess([
1918 'vim9script',
1919 'exe "echo" # something',
1920 ])
1921 CheckScriptFailure([
1922 'vim9script',
1923 'exe "echo"# something',
1924 ], 'E121:')
1925 CheckDefFailure([
1926 'exe # comment',
1927 ], 'E1015:')
1928 CheckScriptFailure([
1929 'vim9script',
1930 'exe# something',
1931 ], 'E121:')
1932 CheckScriptFailure([
1933 'exe "echo" # something',
1934 ], 'E121:')
1935
Bram Moolenaar7a092242020-04-16 22:10:49 +02001936 CheckDefFailure([
1937 'try# comment',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001938 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02001939 'catch',
1940 'endtry',
1941 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001942 CheckScriptFailure([
1943 'vim9script',
1944 'try# comment',
1945 'echo "yes"',
1946 ], 'E488:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02001947 CheckDefFailure([
1948 'try',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02001949 ' throw#comment',
1950 'catch',
1951 'endtry',
1952 ], 'E1015:')
1953 CheckDefFailure([
1954 'try',
1955 ' throw "yes"#comment',
1956 'catch',
1957 'endtry',
1958 ], 'E488:')
1959 CheckDefFailure([
1960 'try',
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001961 ' echo "yes"',
Bram Moolenaar7a092242020-04-16 22:10:49 +02001962 'catch# comment',
1963 'endtry',
1964 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001965 CheckScriptFailure([
1966 'vim9script',
1967 'try',
1968 ' echo "yes"',
1969 'catch# comment',
1970 'endtry',
1971 ], 'E654:')
1972 CheckDefFailure([
1973 'try',
1974 ' echo "yes"',
1975 'catch /pat/# comment',
1976 'endtry',
1977 ], 'E488:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02001978 CheckDefFailure([
1979 'try',
1980 'echo "yes"',
1981 'catch',
1982 'endtry# comment',
1983 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001984 CheckScriptFailure([
1985 'vim9script',
1986 'try',
1987 ' echo "yes"',
1988 'catch',
1989 'endtry# comment',
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +02001990 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02001991
1992 CheckScriptSuccess([
1993 'vim9script',
1994 'hi # comment',
1995 ])
1996 CheckScriptFailure([
1997 'vim9script',
1998 'hi# comment',
1999 ], 'E416:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02002000 CheckScriptSuccess([
2001 'vim9script',
2002 'hi Search # comment',
2003 ])
2004 CheckScriptFailure([
2005 'vim9script',
2006 'hi Search# comment',
2007 ], 'E416:')
2008 CheckScriptSuccess([
2009 'vim9script',
2010 'hi link This Search # comment',
2011 ])
2012 CheckScriptFailure([
2013 'vim9script',
2014 'hi link This That# comment',
2015 ], 'E413:')
2016 CheckScriptSuccess([
2017 'vim9script',
2018 'hi clear This # comment',
2019 'hi clear # comment',
2020 ])
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002021 # not tested, because it doesn't give an error but a warning:
2022 # hi clear This# comment',
Bram Moolenaar1966c242020-04-20 22:42:32 +02002023 CheckScriptFailure([
2024 'vim9script',
2025 'hi clear# comment',
2026 ], 'E416:')
2027
2028 CheckScriptSuccess([
2029 'vim9script',
2030 'hi Group term=bold',
2031 'match Group /todo/ # comment',
2032 ])
2033 CheckScriptFailure([
2034 'vim9script',
2035 'hi Group term=bold',
2036 'match Group /todo/# comment',
2037 ], 'E488:')
2038 CheckScriptSuccess([
2039 'vim9script',
2040 'match # comment',
2041 ])
2042 CheckScriptFailure([
2043 'vim9script',
2044 'match# comment',
2045 ], 'E475:')
2046 CheckScriptSuccess([
2047 'vim9script',
2048 'match none # comment',
2049 ])
2050 CheckScriptFailure([
2051 'vim9script',
2052 'match none# comment',
2053 ], 'E475:')
2054
2055 CheckScriptSuccess([
2056 'vim9script',
2057 'menutrans clear # comment',
2058 ])
2059 CheckScriptFailure([
2060 'vim9script',
2061 'menutrans clear# comment text',
2062 ], 'E474:')
2063
2064 CheckScriptSuccess([
2065 'vim9script',
2066 'syntax clear # comment',
2067 ])
2068 CheckScriptFailure([
2069 'vim9script',
2070 'syntax clear# comment text',
2071 ], 'E28:')
2072 CheckScriptSuccess([
2073 'vim9script',
2074 'syntax keyword Word some',
2075 'syntax clear Word # comment',
2076 ])
2077 CheckScriptFailure([
2078 'vim9script',
2079 'syntax keyword Word some',
2080 'syntax clear Word# comment text',
2081 ], 'E28:')
2082
2083 CheckScriptSuccess([
2084 'vim9script',
2085 'syntax list # comment',
2086 ])
2087 CheckScriptFailure([
2088 'vim9script',
2089 'syntax list# comment text',
2090 ], 'E28:')
2091
2092 CheckScriptSuccess([
2093 'vim9script',
2094 'syntax match Word /pat/ oneline # comment',
2095 ])
2096 CheckScriptFailure([
2097 'vim9script',
2098 'syntax match Word /pat/ oneline# comment',
2099 ], 'E475:')
2100
2101 CheckScriptSuccess([
2102 'vim9script',
2103 'syntax keyword Word word # comm[ent',
2104 ])
2105 CheckScriptFailure([
2106 'vim9script',
2107 'syntax keyword Word word# comm[ent',
2108 ], 'E789:')
2109
2110 CheckScriptSuccess([
2111 'vim9script',
2112 'syntax match Word /pat/ # comment',
2113 ])
2114 CheckScriptFailure([
2115 'vim9script',
2116 'syntax match Word /pat/# comment',
2117 ], 'E402:')
2118
2119 CheckScriptSuccess([
2120 'vim9script',
2121 'syntax match Word /pat/ contains=Something # comment',
2122 ])
2123 CheckScriptFailure([
2124 'vim9script',
2125 'syntax match Word /pat/ contains=Something# comment',
2126 ], 'E475:')
2127 CheckScriptFailure([
2128 'vim9script',
2129 'syntax match Word /pat/ contains= # comment',
2130 ], 'E406:')
2131 CheckScriptFailure([
2132 'vim9script',
2133 'syntax match Word /pat/ contains=# comment',
2134 ], 'E475:')
2135
2136 CheckScriptSuccess([
2137 'vim9script',
2138 'syntax region Word start=/pat/ end=/pat/ # comment',
2139 ])
2140 CheckScriptFailure([
2141 'vim9script',
2142 'syntax region Word start=/pat/ end=/pat/# comment',
Bram Moolenaard032f342020-07-18 18:13:02 +02002143 ], 'E402:')
Bram Moolenaar1966c242020-04-20 22:42:32 +02002144
2145 CheckScriptSuccess([
2146 'vim9script',
2147 'syntax sync # comment',
2148 ])
2149 CheckScriptFailure([
2150 'vim9script',
2151 'syntax sync# comment',
2152 ], 'E404:')
2153 CheckScriptSuccess([
2154 'vim9script',
2155 'syntax sync ccomment # comment',
2156 ])
2157 CheckScriptFailure([
2158 'vim9script',
2159 'syntax sync ccomment# comment',
2160 ], 'E404:')
2161
2162 CheckScriptSuccess([
2163 'vim9script',
2164 'syntax cluster Some contains=Word # comment',
2165 ])
2166 CheckScriptFailure([
2167 'vim9script',
2168 'syntax cluster Some contains=Word# comment',
2169 ], 'E475:')
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002170
2171 CheckScriptSuccess([
2172 'vim9script',
2173 'command Echo echo # comment',
2174 'command Echo # comment',
2175 ])
2176 CheckScriptFailure([
2177 'vim9script',
2178 'command Echo echo# comment',
2179 'Echo',
2180 ], 'E121:')
2181 CheckScriptFailure([
2182 'vim9script',
2183 'command Echo# comment',
2184 ], 'E182:')
2185 CheckScriptFailure([
2186 'vim9script',
2187 'command Echo echo',
2188 'command Echo# comment',
2189 ], 'E182:')
2190
2191 CheckScriptSuccess([
2192 'vim9script',
2193 'function # comment',
2194 ])
2195 CheckScriptFailure([
2196 'vim9script',
2197 'function# comment',
2198 ], 'E129:')
2199 CheckScriptSuccess([
2200 'vim9script',
2201 'function CheckScriptSuccess # comment',
2202 ])
2203 CheckScriptFailure([
2204 'vim9script',
2205 'function CheckScriptSuccess# comment',
2206 ], 'E488:')
2207
2208 CheckScriptSuccess([
2209 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002210 'func g:DeleteMeA()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002211 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002212 'delfunction g:DeleteMeA # comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002213 ])
2214 CheckScriptFailure([
2215 'vim9script',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002216 'func g:DeleteMeB()',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002217 'endfunc',
Bram Moolenaar4c17ad92020-04-27 22:47:51 +02002218 'delfunction g:DeleteMeB# comment',
Bram Moolenaara72cfb82020-04-23 17:07:30 +02002219 ], 'E488:')
2220
2221 CheckScriptSuccess([
2222 'vim9script',
2223 'call execute("ls") # comment',
2224 ])
2225 CheckScriptFailure([
2226 'vim9script',
2227 'call execute("ls")# comment',
2228 ], 'E488:')
Bram Moolenaare7e48382020-07-22 18:17:08 +02002229
2230 CheckScriptFailure([
2231 'def Test() " comment',
2232 'enddef',
2233 ], 'E488:')
2234 CheckScriptFailure([
2235 'vim9script',
2236 'def Test() " comment',
2237 'enddef',
2238 ], 'E488:')
2239
2240 CheckScriptSuccess([
2241 'func Test() " comment',
2242 'endfunc',
2243 ])
2244 CheckScriptFailure([
2245 'vim9script',
2246 'func Test() " comment',
2247 'endfunc',
2248 ], 'E488:')
2249
2250 CheckScriptSuccess([
2251 'def Test() # comment',
2252 'enddef',
2253 ])
2254 CheckScriptFailure([
2255 'func Test() # comment',
2256 'endfunc',
2257 ], 'E488:')
Bram Moolenaar2c5ed4e2020-04-20 19:42:10 +02002258enddef
2259
2260def Test_vim9_comment_gui()
2261 CheckCanRunGui
2262
2263 CheckScriptFailure([
2264 'vim9script',
2265 'gui#comment'
2266 ], 'E499:')
2267 CheckScriptFailure([
2268 'vim9script',
2269 'gui -f#comment'
2270 ], 'E499:')
Bram Moolenaar7a092242020-04-16 22:10:49 +02002271enddef
2272
Bram Moolenaara26b9702020-04-18 19:53:28 +02002273def Test_vim9_comment_not_compiled()
Bram Moolenaar67979662020-06-20 22:50:47 +02002274 au TabEnter *.vim g:entered = 1
2275 au TabEnter *.x g:entered = 2
Bram Moolenaara26b9702020-04-18 19:53:28 +02002276
2277 edit test.vim
2278 doautocmd TabEnter #comment
2279 assert_equal(1, g:entered)
2280
2281 doautocmd TabEnter f.x
2282 assert_equal(2, g:entered)
2283
2284 g:entered = 0
2285 doautocmd TabEnter f.x #comment
2286 assert_equal(2, g:entered)
2287
2288 assert_fails('doautocmd Syntax#comment', 'E216:')
2289
2290 au! TabEnter
2291 unlet g:entered
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02002292
2293 CheckScriptSuccess([
2294 'vim9script',
Bram Moolenaar67979662020-06-20 22:50:47 +02002295 'g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02002296 'b:var = 456',
2297 'w:var = 777',
2298 't:var = 888',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02002299 'unlet g:var w:var # something',
2300 ])
2301
2302 CheckScriptFailure([
2303 'vim9script',
2304 'let g:var = 123',
Bram Moolenaare55b1c02020-06-21 15:52:59 +02002305 ], 'E1016: Cannot declare a global variable:')
2306
2307 CheckScriptFailure([
2308 'vim9script',
2309 'let b:var = 123',
2310 ], 'E1016: Cannot declare a buffer variable:')
2311
2312 CheckScriptFailure([
2313 'vim9script',
2314 'let w:var = 123',
2315 ], 'E1016: Cannot declare a window variable:')
2316
2317 CheckScriptFailure([
2318 'vim9script',
2319 'let t:var = 123',
2320 ], 'E1016: Cannot declare a tab variable:')
2321
2322 CheckScriptFailure([
2323 'vim9script',
2324 'let v:version = 123',
2325 ], 'E1016: Cannot declare a v: variable:')
2326
2327 CheckScriptFailure([
2328 'vim9script',
2329 'let $VARIABLE = "text"',
2330 ], 'E1016: Cannot declare an environment variable:')
Bram Moolenaar67979662020-06-20 22:50:47 +02002331
2332 CheckScriptFailure([
2333 'vim9script',
2334 'g:var = 123',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002335 'unlet g:var# comment1',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +02002336 ], 'E108:')
2337
2338 CheckScriptFailure([
2339 'let g:var = 123',
2340 'unlet g:var # something',
2341 ], 'E488:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002342
2343 CheckScriptSuccess([
2344 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002345 'if 1 # comment2',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002346 ' echo "yes"',
2347 'elseif 2 #comment',
2348 ' echo "no"',
2349 'endif',
2350 ])
2351
2352 CheckScriptFailure([
2353 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002354 'if 1# comment3',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002355 ' echo "yes"',
2356 'endif',
2357 ], 'E15:')
2358
2359 CheckScriptFailure([
2360 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002361 'if 0 # comment4',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002362 ' echo "yes"',
2363 'elseif 2#comment',
2364 ' echo "no"',
2365 'endif',
2366 ], 'E15:')
2367
2368 CheckScriptSuccess([
2369 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002370 'let v = 1 # comment5',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002371 ])
2372
2373 CheckScriptFailure([
2374 'vim9script',
Bram Moolenaar32e35112020-05-14 22:41:15 +02002375 'let v = 1# comment6',
2376 ], 'E15:')
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002377
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002378 CheckScriptSuccess([
2379 'vim9script',
2380 'new'
2381 'call setline(1, ["# define pat", "last"])',
Bram Moolenaardf069ee2020-06-22 23:02:51 +02002382 ':$',
Bram Moolenaarfaac4102020-04-20 17:46:14 +02002383 'dsearch /pat/ #comment',
2384 'bwipe!',
2385 ])
2386
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002387 CheckScriptFailure([
2388 'vim9script',
2389 'new'
2390 'call setline(1, ["# define pat", "last"])',
2391 ':$',
2392 'dsearch /pat/#comment',
2393 'bwipe!',
2394 ], 'E488:')
2395
2396 CheckScriptFailure([
2397 'vim9script',
2398 'func! SomeFunc()',
2399 ], 'E477:')
Bram Moolenaara26b9702020-04-18 19:53:28 +02002400enddef
2401
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02002402def Test_finish()
2403 let lines =<< trim END
2404 vim9script
Bram Moolenaar67979662020-06-20 22:50:47 +02002405 g:res = 'one'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02002406 if v:false | finish | endif
Bram Moolenaar67979662020-06-20 22:50:47 +02002407 g:res = 'two'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02002408 finish
Bram Moolenaar67979662020-06-20 22:50:47 +02002409 g:res = 'three'
Bram Moolenaar7e5bd912020-05-10 21:20:29 +02002410 END
2411 writefile(lines, 'Xfinished')
2412 source Xfinished
2413 assert_equal('two', g:res)
2414
2415 unlet g:res
2416 delete('Xfinished')
2417enddef
2418
Bram Moolenaar32e35112020-05-14 22:41:15 +02002419def Test_let_func_call()
2420 let lines =<< trim END
2421 vim9script
2422 func GetValue()
2423 if exists('g:count')
2424 let g:count += 1
2425 else
2426 let g:count = 1
2427 endif
2428 return 'this'
2429 endfunc
2430 let val: string = GetValue()
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002431 # env var is always a string
Bram Moolenaardf671b42020-05-16 22:33:33 +02002432 let env = $TERM
Bram Moolenaar32e35112020-05-14 22:41:15 +02002433 END
2434 writefile(lines, 'Xfinished')
2435 source Xfinished
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002436 # GetValue() is not called during discovery phase
Bram Moolenaar32e35112020-05-14 22:41:15 +02002437 assert_equal(1, g:count)
2438
2439 unlet g:count
2440 delete('Xfinished')
2441enddef
2442
2443def Test_let_missing_type()
2444 let lines =<< trim END
2445 vim9script
Bram Moolenaardf671b42020-05-16 22:33:33 +02002446 let var = g:unknown
Bram Moolenaar227a69d2020-05-15 18:17:28 +02002447 END
Bram Moolenaar822ba242020-05-24 23:00:18 +02002448 CheckScriptFailure(lines, 'E121:')
Bram Moolenaar227a69d2020-05-15 18:17:28 +02002449
2450 lines =<< trim END
2451 vim9script
2452 let nr: number = 123
2453 let var = nr
2454 END
Bram Moolenaar822ba242020-05-24 23:00:18 +02002455 CheckScriptSuccess(lines)
Bram Moolenaar32e35112020-05-14 22:41:15 +02002456enddef
2457
Bram Moolenaarc82a5b52020-06-13 18:09:19 +02002458def Test_let_declaration()
2459 let lines =<< trim END
2460 vim9script
2461 let var: string
2462 g:var_uninit = var
2463 var = 'text'
2464 g:var_test = var
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002465 # prefixing s: is optional
Bram Moolenaar984dddb2020-06-14 12:50:24 +02002466 s:var = 'prefixed'
2467 g:var_prefixed = s:var
2468
2469 let s:other: number
2470 other = 1234
2471 g:other_var = other
Bram Moolenaarc82a5b52020-06-13 18:09:19 +02002472 END
2473 CheckScriptSuccess(lines)
2474 assert_equal('', g:var_uninit)
2475 assert_equal('text', g:var_test)
Bram Moolenaar984dddb2020-06-14 12:50:24 +02002476 assert_equal('prefixed', g:var_prefixed)
2477 assert_equal(1234, g:other_var)
Bram Moolenaarc82a5b52020-06-13 18:09:19 +02002478
2479 unlet g:var_uninit
2480 unlet g:var_test
Bram Moolenaar984dddb2020-06-14 12:50:24 +02002481 unlet g:var_prefixed
2482 unlet g:other_var
Bram Moolenaarc82a5b52020-06-13 18:09:19 +02002483enddef
2484
Bram Moolenaarc5b1c202020-06-18 22:43:27 +02002485def Test_let_declaration_fails()
2486 let lines =<< trim END
2487 vim9script
2488 const var: string
2489 END
2490 CheckScriptFailure(lines, 'E1021:')
2491
2492 lines =<< trim END
2493 vim9script
2494 let 9var: string
2495 END
2496 CheckScriptFailure(lines, 'E475:')
2497enddef
2498
Bram Moolenaar34db91f2020-06-13 19:00:10 +02002499def Test_let_type_check()
2500 let lines =<< trim END
2501 vim9script
2502 let var: string
2503 var = 1234
2504 END
2505 CheckScriptFailure(lines, 'E1013:')
Bram Moolenaar984dddb2020-06-14 12:50:24 +02002506
2507 lines =<< trim END
2508 vim9script
2509 let var:string
2510 END
2511 CheckScriptFailure(lines, 'E1069:')
Bram Moolenaarc5b1c202020-06-18 22:43:27 +02002512
2513 lines =<< trim END
2514 vim9script
2515 let var: asdf
2516 END
2517 CheckScriptFailure(lines, 'E1010:')
Bram Moolenaar34db91f2020-06-13 19:00:10 +02002518enddef
2519
Bram Moolenaara5d00772020-05-14 23:20:55 +02002520def Test_forward_declaration()
2521 let lines =<< trim END
2522 vim9script
Bram Moolenaara5d00772020-05-14 23:20:55 +02002523 def GetValue(): string
2524 return theVal
2525 enddef
2526 let theVal = 'something'
Bram Moolenaar822ba242020-05-24 23:00:18 +02002527 g:initVal = GetValue()
Bram Moolenaara5d00772020-05-14 23:20:55 +02002528 theVal = 'else'
2529 g:laterVal = GetValue()
2530 END
2531 writefile(lines, 'Xforward')
2532 source Xforward
2533 assert_equal('something', g:initVal)
2534 assert_equal('else', g:laterVal)
2535
2536 unlet g:initVal
2537 unlet g:laterVal
2538 delete('Xforward')
2539enddef
2540
Bram Moolenaar9721fb42020-06-11 23:10:46 +02002541def Test_source_vim9_from_legacy()
2542 let legacy_lines =<< trim END
2543 source Xvim9_script.vim
2544
2545 call assert_false(exists('local'))
2546 call assert_false(exists('exported'))
2547 call assert_false(exists('s:exported'))
2548 call assert_equal('global', global)
2549 call assert_equal('global', g:global)
2550
2551 " imported variable becomes script-local
2552 import exported from './Xvim9_script.vim'
2553 call assert_equal('exported', s:exported)
2554 call assert_false(exists('exported'))
2555
2556 " imported function becomes script-local
2557 import GetText from './Xvim9_script.vim'
2558 call assert_equal('text', s:GetText())
2559 call assert_false(exists('*GetText'))
2560 END
2561 writefile(legacy_lines, 'Xlegacy_script.vim')
2562
2563 let vim9_lines =<< trim END
2564 vim9script
2565 let local = 'local'
2566 g:global = 'global'
2567 export let exported = 'exported'
2568 export def GetText(): string
2569 return 'text'
2570 enddef
2571 END
2572 writefile(vim9_lines, 'Xvim9_script.vim')
2573
2574 source Xlegacy_script.vim
2575
2576 assert_equal('global', g:global)
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002577 unlet g:global
Bram Moolenaar9721fb42020-06-11 23:10:46 +02002578
2579 delete('Xlegacy_script.vim')
2580 delete('Xvim9_script.vim')
2581enddef
Bram Moolenaara5d00772020-05-14 23:20:55 +02002582
Bram Moolenaareeb27bf2020-07-04 17:39:10 +02002583def Test_vim9_copen()
2584 # this was giving an error for setting w:quickfix_title
2585 copen
2586 quit
2587enddef
2588
Bram Moolenaar585fea72020-04-02 22:33:21 +02002589" Keep this last, it messes up highlighting.
2590def Test_substitute_cmd()
2591 new
2592 setline(1, 'something')
2593 :substitute(some(other(
2594 assert_equal('otherthing', getline(1))
2595 bwipe!
2596
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002597 # also when the context is Vim9 script
Bram Moolenaar585fea72020-04-02 22:33:21 +02002598 let lines =<< trim END
2599 vim9script
2600 new
2601 setline(1, 'something')
2602 :substitute(some(other(
2603 assert_equal('otherthing', getline(1))
2604 bwipe!
2605 END
2606 writefile(lines, 'Xvim9lines')
2607 source Xvim9lines
2608
2609 delete('Xvim9lines')
2610enddef
2611
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002612" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker