blob: 518f60c62c7a2223bf72fa40f31b157be8b5f76f [file] [log] [blame]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001" Test various aspects of the Vim9 script language.
2
Bram Moolenaar673660a2020-01-26 16:50:05 +01003source check.vim
Bram Moolenaarad39c092020-02-26 18:23:43 +01004source view_util.vim
Bram Moolenaar673660a2020-01-26 16:50:05 +01005
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01006" Check that "lines" inside ":def" results in an "error" message.
7func CheckDefFailure(lines, error)
Bram Moolenaar978d1702020-01-26 17:38:12 +01008 call writefile(['def Func()'] + a:lines + ['enddef'], 'Xdef')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01009 call assert_fails('so Xdef', a:error, a:lines)
10 call delete('Xdef')
11endfunc
12
13func CheckScriptFailure(lines, error)
14 call writefile(a:lines, 'Xdef')
15 call assert_fails('so Xdef', a:error, a:lines)
16 call delete('Xdef')
17endfunc
18
19def Test_syntax()
20 let var = 234
21 let other: list<string> = ['asdf']
22enddef
23
24func Test_def_basic()
25 def SomeFunc(): string
26 return 'yes'
27 enddef
28 call assert_equal('yes', SomeFunc())
29endfunc
30
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010031let s:appendToMe = 'xxx'
32let s:addToMe = 111
Bram Moolenaar401d9ff2020-02-19 18:14:44 +010033let g:existing = 'yes'
Bram Moolenaara8c17702020-04-01 21:17:24 +020034let g:inc_counter = 1
35let $SOME_ENV_VAR = 'some'
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010036
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010037def Test_assignment()
38 let bool1: bool = true
39 assert_equal(v:true, bool1)
40 let bool2: bool = false
41 assert_equal(v:false, bool2)
42
Bram Moolenaar0c2ca582020-02-25 22:58:29 +010043 let list1: list<bool> = [false, true, false]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010044 let list2: list<number> = [1, 2, 3]
Bram Moolenaar0c2ca582020-02-25 22:58:29 +010045 let list3: list<string> = ['sdf', 'asdf']
46 let list4: list<any> = ['yes', true, 1234]
47 let list5: list<blob> = [0z01, 0z02]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010048
Bram Moolenaar436472f2020-02-20 22:54:43 +010049 let listS: list<string> = []
50 let listN: list<number> = []
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010051
Bram Moolenaar0c2ca582020-02-25 22:58:29 +010052 let dict1: dict<bool> = #{one: false, two: true}
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010053 let dict2: dict<number> = #{one: 1, two: 2}
Bram Moolenaar0c2ca582020-02-25 22:58:29 +010054 let dict3: dict<string> = #{key: 'value'}
55 let dict4: dict<any> = #{one: 1, two: '2'}
56 let dict5: dict<blob> = #{one: 0z01, tw: 0z02}
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010057
Bram Moolenaar9be61bb2020-03-30 22:51:24 +020058 let a: number = 6
59 assert_equal(6, a)
60
Bram Moolenaar42a480b2020-02-29 23:23:47 +010061 if has('channel')
62 let chan1: channel
Bram Moolenaarfbdd08e2020-03-01 14:04:46 +010063 let job1: job
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +010064 let job2: job = job_start('willfail')
Bram Moolenaar42a480b2020-02-29 23:23:47 +010065 endif
Bram Moolenaarfbdd08e2020-03-01 14:04:46 +010066 if has('float')
67 let float1: float = 3.4
68 endif
Bram Moolenaar087d2e12020-03-01 15:36:42 +010069 let funky1: func
70 let funky2: func = function('len')
71 let party1: partial
72 let party2: partial = funcref('Test_syntax')
Bram Moolenaar42a480b2020-02-29 23:23:47 +010073
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +010074 " type becomes list<any>
75 let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
Bram Moolenaar5381c7a2020-03-02 22:53:32 +010076 " type becomes dict<any>
77 let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +010078
Bram Moolenaar401d9ff2020-02-19 18:14:44 +010079 g:newvar = 'new'
80 assert_equal('new', g:newvar)
81
82 assert_equal('yes', g:existing)
83 g:existing = 'no'
84 assert_equal('no', g:existing)
85
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010086 v:char = 'abc'
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010087 assert_equal('abc', v:char)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010088
89 $ENVVAR = 'foobar'
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010090 assert_equal('foobar', $ENVVAR)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010091 $ENVVAR = ''
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010092
Bram Moolenaarfd1823e2020-02-19 20:23:11 +010093 s:appendToMe ..= 'yyy'
94 assert_equal('xxxyyy', s:appendToMe)
95 s:addToMe += 222
96 assert_equal(333, s:addToMe)
Bram Moolenaar0bbf7222020-02-19 22:31:48 +010097 s:newVar = 'new'
98 assert_equal('new', s:newVar)
Bram Moolenaara8c17702020-04-01 21:17:24 +020099
100 set ts=7
101 &ts += 1
102 assert_equal(8, &ts)
Bram Moolenaar80c34ca2020-04-01 23:05:18 +0200103 &ts -= 3
104 assert_equal(5, &ts)
105 &ts *= 2
106 assert_equal(10, &ts)
107 &ts /= 3
108 assert_equal(3, &ts)
109 set ts=10
110 &ts %= 4
111 assert_equal(2, &ts)
Bram Moolenaara8c17702020-04-01 21:17:24 +0200112 call CheckDefFailure(['&notex += 3'], 'E113:')
113 call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
114 call CheckDefFailure(['&path += 3'], 'E1013:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200115 " test freeing ISN_STOREOPT
116 call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
Bram Moolenaar80c34ca2020-04-01 23:05:18 +0200117 &ts = 8
Bram Moolenaara8c17702020-04-01 21:17:24 +0200118
119 g:inc_counter += 1
120 assert_equal(2, g:inc_counter)
121
122 $SOME_ENV_VAR ..= 'more'
123 assert_equal('somemore', $SOME_ENV_VAR)
124 call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:')
125 call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:')
126
127 @a = 'areg'
128 @a ..= 'add'
129 assert_equal('aregadd', @a)
130 call CheckDefFailure(['@a += "more"'], 'E1013:')
131 call CheckDefFailure(['@a += 123'], 'E1013:')
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200132
133 v:errmsg = 'none'
134 v:errmsg ..= 'again'
135 assert_equal('noneagain', v:errmsg)
136 call CheckDefFailure(['v:errmsg += "more"'], 'E1013:')
137 call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
138
139 " Test default values.
140 let thebool: bool
141 assert_equal(v:false, thebool)
142
143 let thenumber: number
144 assert_equal(0, thenumber)
145
146 if has('float')
147 let thefloat: float
148 assert_equal(0.0, thefloat)
149 endif
150
151 let thestring: string
152 assert_equal('', thestring)
153
154 let theblob: blob
155 assert_equal(0z, theblob)
156
157 let thefunc: func
158 assert_equal(test_null_function(), thefunc)
159
160 let thepartial: partial
161 assert_equal(test_null_partial(), thepartial)
162
163 let thelist: list<any>
164 assert_equal([], thelist)
165
166 let thedict: dict<any>
167 assert_equal({}, thedict)
168
Bram Moolenaar2c869de2020-04-02 19:12:08 +0200169 if has('channel')
170 let thejob: job
171 assert_equal(test_null_job(), thejob)
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200172
Bram Moolenaar2c869de2020-04-02 19:12:08 +0200173 let thechannel: channel
174 assert_equal(test_null_channel(), thechannel)
175 endif
Bram Moolenaar585fea72020-04-02 22:33:21 +0200176
177 let nr = 1234 | nr = 5678
178 assert_equal(5678, nr)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100179enddef
180
181func Test_assignment_failure()
182 call CheckDefFailure(['let var=234'], 'E1004:')
183 call CheckDefFailure(['let var =234'], 'E1004:')
184 call CheckDefFailure(['let var= 234'], 'E1004:')
185
186 call CheckDefFailure(['let true = 1'], 'E1034:')
187 call CheckDefFailure(['let false = 1'], 'E1034:')
188
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200189 call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:')
190
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200191 call CheckDefFailure(['let somevar'], "E1022:")
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200192 call CheckDefFailure(['let &option'], 'E1052:')
193 call CheckDefFailure(['&g:option = 5'], 'E113:')
194
195 call CheckDefFailure(['let $VAR = 5'], 'E1065:')
196
197 call CheckDefFailure(['let @~ = 5'], 'E354:')
198 call CheckDefFailure(['let @a = 5'], 'E1066:')
199
200 call CheckDefFailure(['let g:var = 5'], 'E1016:')
201
202 call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
203 call CheckDefFailure(['let xnr += 4'], 'E1020:')
204
Bram Moolenaar33fa29c2020-03-28 19:41:33 +0100205 call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:')
206
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100207 call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
208 call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
209
210 call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
211 call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
212
213 call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
214 call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100215
216 call CheckDefFailure(['let var: dict <number>'], 'E1007:')
217 call CheckDefFailure(['let var: dict<number'], 'E1009:')
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100218endfunc
219
220func Test_wrong_type()
221 call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
222 call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
223 call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
224 call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
225
226 call CheckDefFailure(['let var: dict<number'], 'E1009:')
227 call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100228
229 call CheckDefFailure(['let var: ally'], 'E1010:')
230 call CheckDefFailure(['let var: bram'], 'E1010:')
231 call CheckDefFailure(['let var: cathy'], 'E1010:')
232 call CheckDefFailure(['let var: dom'], 'E1010:')
233 call CheckDefFailure(['let var: freddy'], 'E1010:')
234 call CheckDefFailure(['let var: john'], 'E1010:')
235 call CheckDefFailure(['let var: larry'], 'E1010:')
236 call CheckDefFailure(['let var: ned'], 'E1010:')
237 call CheckDefFailure(['let var: pam'], 'E1010:')
238 call CheckDefFailure(['let var: sam'], 'E1010:')
239 call CheckDefFailure(['let var: vim'], 'E1010:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100240endfunc
241
242func Test_const()
243 call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
244 call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
245 call CheckDefFailure(['const two'], 'E1021:')
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200246 call CheckDefFailure(['const &option'], 'E996:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100247endfunc
248
249def Test_block()
250 let outer = 1
251 {
252 let inner = 2
253 assert_equal(1, outer)
254 assert_equal(2, inner)
255 }
256 assert_equal(1, outer)
257enddef
258
259func Test_block_failure()
260 call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200261 call CheckDefFailure(['}'], 'E1025:')
262 call CheckDefFailure(['{', 'echo 1'], 'E1026:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100263endfunc
264
Bram Moolenaar585fea72020-04-02 22:33:21 +0200265def Test_cmd_modifier()
266 tab echo '0'
267 call CheckDefFailure(['5tab echo 3'], 'E16:')
268enddef
269
270
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100271def ReturnString(): string
272 return 'string'
273enddef
274
275def ReturnNumber(): number
276 return 123
277enddef
278
Bram Moolenaar09f28f42020-02-20 23:08:34 +0100279let g:notNumber = 'string'
280
281def ReturnGlobal(): number
282 return g:notNumber
283enddef
284
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200285def Test_return_something()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100286 assert_equal('string', ReturnString())
287 assert_equal(123, ReturnNumber())
Bram Moolenaar09f28f42020-02-20 23:08:34 +0100288 assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100289enddef
290
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200291let s:nothing = 0
292def ReturnNothing()
293 s:nothing = 1
294 if true
295 return
296 endif
297 s:nothing = 2
298enddef
299
300def Test_return_nothing()
301 ReturnNothing()
302 assert_equal(1, s:nothing)
303enddef
304
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100305func Increment()
306 let g:counter += 1
307endfunc
308
309def Test_call_ufunc_count()
310 g:counter = 1
311 Increment()
312 Increment()
313 Increment()
314 " works with and without :call
315 assert_equal(4, g:counter)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100316 call assert_equal(4, g:counter)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100317 unlet g:counter
318enddef
319
320def MyVarargs(arg: string, ...rest: list<string>): string
321 let res = arg
322 for s in rest
323 res ..= ',' .. s
324 endfor
325 return res
326enddef
327
328def Test_call_varargs()
329 assert_equal('one', MyVarargs('one'))
330 assert_equal('one,two', MyVarargs('one', 'two'))
331 assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
332enddef
333
Bram Moolenaar170fcfc2020-02-06 17:51:35 +0100334def MyDefaultArgs(name = 'string'): string
335 return name
336enddef
337
338def Test_call_default_args()
339 assert_equal('string', MyDefaultArgs())
340 assert_equal('one', MyDefaultArgs('one'))
341 assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200342
343 call CheckScriptFailure(['def Func(arg: number = asdf)', 'enddef'], 'E1001:')
Bram Moolenaar170fcfc2020-02-06 17:51:35 +0100344enddef
345
346func Test_call_default_args_from_func()
347 call assert_equal('string', MyDefaultArgs())
348 call assert_equal('one', MyDefaultArgs('one'))
349 call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
350endfunc
351
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100352func TakesOneArg(arg)
353 echo a:arg
354endfunc
355
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200356def Test_call_wrong_args()
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100357 call CheckDefFailure(['TakesOneArg()'], 'E119:')
358 call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200359 call CheckDefFailure(['bufnr(xxx)'], 'E1001:')
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100360enddef
361
Bram Moolenaar170fcfc2020-02-06 17:51:35 +0100362" Default arg and varargs
363def MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
364 let res = one .. ',' .. two
365 for s in rest
366 res ..= ',' .. s
367 endfor
368 return res
369enddef
370
371def Test_call_def_varargs()
372 call assert_fails('call MyDefVarargs()', 'E119:')
373 assert_equal('one,foo', MyDefVarargs('one'))
374 assert_equal('one,two', MyDefVarargs('one', 'two'))
375 assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
376enddef
377
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100378def Test_using_var_as_arg()
379 call writefile(['def Func(x: number)', 'let x = 234', 'enddef'], 'Xdef')
380 call assert_fails('so Xdef', 'E1006:')
381 call delete('Xdef')
382enddef
383
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100384def Test_call_func_defined_later()
385 call assert_equal('one', DefinedLater('one'))
386 call assert_fails('call NotDefined("one")', 'E117:')
387enddef
Bram Moolenaar170fcfc2020-02-06 17:51:35 +0100388
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100389func DefinedLater(arg)
Bram Moolenaar26e117e2020-02-04 21:24:15 +0100390 return a:arg
391endfunc
392
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100393def FuncWithForwardCall()
394 return DefinedEvenLater("yes")
395enddef
396
397def DefinedEvenLater(arg: string): string
398 return arg
399enddef
400
401def Test_error_in_nested_function()
402 " Error in called function requires unwinding the call stack.
403 assert_fails('call FuncWithForwardCall()', 'E1029')
404enddef
405
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100406def Test_return_type_wrong()
Bram Moolenaar978d1702020-01-26 17:38:12 +0100407 CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
408 CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
409 CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
410 CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
Bram Moolenaarcf3f8bf2020-03-26 13:15:42 +0100411
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200412 CheckScriptFailure(['def Func(): number', 'return', 'enddef'], 'E1003:')
413
Bram Moolenaarcf3f8bf2020-03-26 13:15:42 +0100414 CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:')
415 CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100416enddef
417
Bram Moolenaarbfe12042020-02-04 21:54:07 +0100418def Test_arg_type_wrong()
419 CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
420enddef
421
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100422def Test_try_catch()
423 let l = []
424 try
425 add(l, '1')
426 throw 'wrong'
427 add(l, '2')
428 catch
429 add(l, v:exception)
430 finally
431 add(l, '3')
432 endtry
433 assert_equal(['1', 'wrong', '3'], l)
434enddef
435
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100436def ThrowFromDef()
437 throw 'getout'
438enddef
439
440func CatchInFunc()
441 try
442 call ThrowFromDef()
443 catch
444 let g:thrown_func = v:exception
445 endtry
446endfunc
447
448def CatchInDef()
449 try
450 ThrowFromDef()
451 catch
452 g:thrown_def = v:exception
453 endtry
454enddef
455
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100456def ReturnFinally(): string
457 try
458 return 'intry'
459 finally
460 g:in_finally = 'finally'
461 endtry
462 return 'end'
463enddef
464
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100465def Test_try_catch_nested()
466 CatchInFunc()
467 assert_equal('getout', g:thrown_func)
468
469 CatchInDef()
470 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100471
472 assert_equal('intry', ReturnFinally())
473 assert_equal('finally', g:in_finally)
474enddef
475
476def Test_try_catch_match()
477 let seq = 'a'
478 try
479 throw 'something'
480 catch /nothing/
481 seq ..= 'x'
482 catch /some/
483 seq ..= 'b'
484 catch /asdf/
485 seq ..= 'x'
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200486 catch ?a\?sdf?
487 seq ..= 'y'
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100488 finally
489 seq ..= 'c'
490 endtry
491 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100492enddef
493
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200494def Test_try_catch_fails()
495 call CheckDefFailure(['catch'], 'E603:')
496 call CheckDefFailure(['try', 'echo 0', 'catch','catch'], 'E1033:')
497 call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200498 call CheckDefFailure(['finally'], 'E606:')
499 call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
500 call CheckDefFailure(['endtry'], 'E602:')
501 call CheckDefFailure(['while 1', 'endtry'], 'E170:')
502 call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
503 call CheckDefFailure(['if 2', 'endtry'], 'E171:')
504 call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
505
506 call CheckDefFailure(['throw'], 'E471:')
507 call CheckDefFailure(['throw xxx'], 'E1001:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200508enddef
509
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100510let s:export_script_lines =<< trim END
511 vim9script
512 let name: string = 'bob'
513 def Concat(arg: string): string
514 return name .. arg
515 enddef
516 let g:result = Concat('bie')
517 let g:localname = name
518
519 export const CONST = 1234
520 export let exported = 9876
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100521 export let exp_name = 'John'
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100522 export def Exported(): string
523 return 'Exported'
524 enddef
525END
526
Bram Moolenaar5269bd22020-03-09 19:25:27 +0100527def Test_vim9_import_export()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100528 let import_script_lines =<< trim END
529 vim9script
530 import {exported, Exported} from './Xexport.vim'
531 g:imported = exported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100532 exported += 3
533 g:imported_added = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100534 g:imported_func = Exported()
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100535
536 import {exp_name} from './Xexport.vim'
537 g:imported_name = exp_name
538 exp_name ..= ' Doe'
539 g:imported_name_appended = exp_name
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100540 g:imported_later = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100541 END
542
543 writefile(import_script_lines, 'Ximport.vim')
544 writefile(s:export_script_lines, 'Xexport.vim')
545
546 source Ximport.vim
547
548 assert_equal('bobbie', g:result)
549 assert_equal('bob', g:localname)
550 assert_equal(9876, g:imported)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100551 assert_equal(9879, g:imported_added)
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100552 assert_equal(9879, g:imported_later)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100553 assert_equal('Exported', g:imported_func)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100554 assert_equal('John', g:imported_name)
555 assert_equal('John Doe', g:imported_name_appended)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100556 assert_false(exists('g:name'))
557
558 unlet g:result
559 unlet g:localname
560 unlet g:imported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100561 unlet g:imported_added
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100562 unlet g:imported_later
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100563 unlet g:imported_func
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100564 unlet g:imported_name g:imported_name_appended
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100565 delete('Ximport.vim')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100566
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100567 let import_in_def_lines =<< trim END
568 vim9script
569 def ImportInDef()
570 import exported from './Xexport.vim'
571 g:imported = exported
572 exported += 7
573 g:imported_added = exported
574 enddef
575 ImportInDef()
576 END
577 writefile(import_in_def_lines, 'Ximport2.vim')
578 source Ximport2.vim
579 " TODO: this should be 9879
580 assert_equal(9876, g:imported)
581 assert_equal(9883, g:imported_added)
582 unlet g:imported
583 unlet g:imported_added
584 delete('Ximport2.vim')
585
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100586 let import_star_as_lines =<< trim END
587 vim9script
588 import * as Export from './Xexport.vim'
589 def UseExport()
590 g:imported = Export.exported
591 enddef
592 UseExport()
593 END
594 writefile(import_star_as_lines, 'Ximport.vim')
595 source Ximport.vim
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100596 assert_equal(9883, g:imported)
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100597
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100598 let import_star_as_lines_no_dot =<< trim END
599 vim9script
600 import * as Export from './Xexport.vim'
601 def Func()
602 let dummy = 1
603 let imported = Export + dummy
604 enddef
605 END
606 writefile(import_star_as_lines_no_dot, 'Ximport.vim')
607 assert_fails('source Ximport.vim', 'E1060:')
608
609 let import_star_as_lines_dot_space =<< trim END
610 vim9script
611 import * as Export from './Xexport.vim'
612 def Func()
613 let imported = Export . exported
614 enddef
615 END
616 writefile(import_star_as_lines_dot_space, 'Ximport.vim')
617 assert_fails('source Ximport.vim', 'E1074:')
618
619 let import_star_as_lines_missing_name =<< trim END
620 vim9script
621 import * as Export from './Xexport.vim'
622 def Func()
623 let imported = Export.
624 enddef
625 END
626 writefile(import_star_as_lines_missing_name, 'Ximport.vim')
627 assert_fails('source Ximport.vim', 'E1048:')
628
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100629 let import_star_lines =<< trim END
630 vim9script
631 import * from './Xexport.vim'
632 g:imported = exported
633 END
634 writefile(import_star_lines, 'Ximport.vim')
635 assert_fails('source Ximport.vim', 'E1045:')
636
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +0100637 " try to import something that exists but is not exported
638 let import_not_exported_lines =<< trim END
639 vim9script
640 import name from './Xexport.vim'
641 END
642 writefile(import_not_exported_lines, 'Ximport.vim')
643 assert_fails('source Ximport.vim', 'E1049:')
644
Bram Moolenaar5269bd22020-03-09 19:25:27 +0100645 " try to import something that is already defined
646 let import_already_defined =<< trim END
647 vim9script
648 let exported = 'something'
649 import exported from './Xexport.vim'
650 END
651 writefile(import_already_defined, 'Ximport.vim')
652 assert_fails('source Ximport.vim', 'E1073:')
653
654 " try to import something that is already defined
655 import_already_defined =<< trim END
656 vim9script
657 let exported = 'something'
658 import * as exported from './Xexport.vim'
659 END
660 writefile(import_already_defined, 'Ximport.vim')
661 assert_fails('source Ximport.vim', 'E1073:')
662
663 " try to import something that is already defined
664 import_already_defined =<< trim END
665 vim9script
666 let exported = 'something'
667 import {exported} from './Xexport.vim'
668 END
669 writefile(import_already_defined, 'Ximport.vim')
670 assert_fails('source Ximport.vim', 'E1073:')
671
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +0100672 " import a very long name, requires making a copy
673 let import_long_name_lines =<< trim END
674 vim9script
675 import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
676 END
677 writefile(import_long_name_lines, 'Ximport.vim')
678 assert_fails('source Ximport.vim', 'E1048:')
679
680 let import_no_from_lines =<< trim END
681 vim9script
682 import name './Xexport.vim'
683 END
684 writefile(import_no_from_lines, 'Ximport.vim')
685 assert_fails('source Ximport.vim', 'E1070:')
686
687 let import_invalid_string_lines =<< trim END
688 vim9script
689 import name from Xexport.vim
690 END
691 writefile(import_invalid_string_lines, 'Ximport.vim')
692 assert_fails('source Ximport.vim', 'E1071:')
693
694 let import_wrong_name_lines =<< trim END
695 vim9script
696 import name from './XnoExport.vim'
697 END
698 writefile(import_wrong_name_lines, 'Ximport.vim')
699 assert_fails('source Ximport.vim', 'E1053:')
700
701 let import_missing_comma_lines =<< trim END
702 vim9script
703 import {exported name} from './Xexport.vim'
704 END
Bram Moolenaar5269bd22020-03-09 19:25:27 +0100705 writefile(import_missing_comma_lines, 'Ximport3.vim')
706 assert_fails('source Ximport3.vim', 'E1046:')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +0100707
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100708 delete('Ximport.vim')
Bram Moolenaar5269bd22020-03-09 19:25:27 +0100709 delete('Ximport3.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100710 delete('Xexport.vim')
711
Bram Moolenaar750802b2020-02-23 18:08:33 +0100712 " Check that in a Vim9 script 'cpo' is set to the Vim default.
713 set cpo&vi
714 let cpo_before = &cpo
715 let lines =<< trim END
716 vim9script
717 g:cpo_in_vim9script = &cpo
718 END
719 writefile(lines, 'Xvim9_script')
720 source Xvim9_script
721 assert_equal(cpo_before, &cpo)
722 set cpo&vim
723 assert_equal(&cpo, g:cpo_in_vim9script)
724 delete('Xvim9_script')
725enddef
726
727def Test_vim9script_fails()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100728 CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
729 CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +0100730 CheckScriptFailure(['export let some = 123'], 'E1042:')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100731 CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
Bram Moolenaar750802b2020-02-23 18:08:33 +0100732 CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
733 CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
734
735 assert_fails('vim9script', 'E1038')
736 assert_fails('export something', 'E1042')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100737enddef
738
739def Test_vim9script_call()
740 let lines =<< trim END
741 vim9script
742 let var = ''
743 def MyFunc(arg: string)
744 var = arg
745 enddef
746 MyFunc('foobar')
747 assert_equal('foobar', var)
748
749 let str = 'barfoo'
750 str->MyFunc()
751 assert_equal('barfoo', var)
752
753 let g:value = 'value'
754 g:value->MyFunc()
755 assert_equal('value', var)
756
757 let listvar = []
758 def ListFunc(arg: list<number>)
759 listvar = arg
760 enddef
761 [1, 2, 3]->ListFunc()
762 assert_equal([1, 2, 3], listvar)
763
764 let dictvar = {}
765 def DictFunc(arg: dict<number>)
766 dictvar = arg
767 enddef
768 {'a': 1, 'b': 2}->DictFunc()
769 assert_equal(#{a: 1, b: 2}, dictvar)
Bram Moolenaar33fa29c2020-03-28 19:41:33 +0100770 def CompiledDict()
771 {'a': 3, 'b': 4}->DictFunc()
772 enddef
773 CompiledDict()
774 assert_equal(#{a: 3, b: 4}, dictvar)
775
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100776 #{a: 3, b: 4}->DictFunc()
777 assert_equal(#{a: 3, b: 4}, dictvar)
Bram Moolenaar0c6ceaf2020-02-22 18:36:32 +0100778
779 ('text')->MyFunc()
780 assert_equal('text', var)
781 ("some")->MyFunc()
782 assert_equal('some', var)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100783 END
784 writefile(lines, 'Xcall.vim')
785 source Xcall.vim
786 delete('Xcall.vim')
787enddef
788
789def Test_vim9script_call_fail_decl()
790 let lines =<< trim END
791 vim9script
792 let var = ''
793 def MyFunc(arg: string)
794 let var = 123
795 enddef
796 END
797 writefile(lines, 'Xcall_decl.vim')
798 assert_fails('source Xcall_decl.vim', 'E1054:')
799 delete('Xcall_decl.vim')
800enddef
801
802def Test_vim9script_call_fail_const()
803 let lines =<< trim END
804 vim9script
805 const var = ''
806 def MyFunc(arg: string)
807 var = 'asdf'
808 enddef
809 END
810 writefile(lines, 'Xcall_const.vim')
811 assert_fails('source Xcall_const.vim', 'E46:')
812 delete('Xcall_const.vim')
813enddef
814
815def Test_vim9script_reload()
816 let lines =<< trim END
817 vim9script
818 const var = ''
819 let valone = 1234
820 def MyFunc(arg: string)
821 valone = 5678
822 enddef
823 END
824 let morelines =<< trim END
825 let valtwo = 222
826 export def GetValtwo(): number
827 return valtwo
828 enddef
829 END
830 writefile(lines + morelines, 'Xreload.vim')
831 source Xreload.vim
832 source Xreload.vim
833 source Xreload.vim
834
835 let testlines =<< trim END
836 vim9script
837 def TheFunc()
838 import GetValtwo from './Xreload.vim'
839 assert_equal(222, GetValtwo())
840 enddef
841 TheFunc()
842 END
843 writefile(testlines, 'Ximport.vim')
844 source Ximport.vim
845
846 " test that when not using "morelines" valtwo is still defined
847 " need to source Xreload.vim again, import doesn't reload a script
848 writefile(lines, 'Xreload.vim')
849 source Xreload.vim
850 source Ximport.vim
851
852 " cannot declare a var twice
853 lines =<< trim END
854 vim9script
855 let valone = 1234
856 let valone = 5678
857 END
858 writefile(lines, 'Xreload.vim')
859 assert_fails('source Xreload.vim', 'E1041:')
860
861 delete('Xreload.vim')
862 delete('Ximport.vim')
863enddef
864
865def Test_import_absolute()
866 let import_lines = [
867 \ 'vim9script',
868 \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100869 \ 'def UseExported()',
870 \ ' g:imported_abs = exported',
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100871 \ ' exported = 8888',
872 \ ' g:imported_after = exported',
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100873 \ 'enddef',
874 \ 'UseExported()',
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100875 \ 'g:import_disassembled = execute("disass UseExported")',
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100876 \ ]
877 writefile(import_lines, 'Ximport_abs.vim')
878 writefile(s:export_script_lines, 'Xexport_abs.vim')
879
880 source Ximport_abs.vim
881
882 assert_equal(9876, g:imported_abs)
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100883 assert_equal(8888, g:imported_after)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100884 assert_match('<SNR>\d\+_UseExported.*'
885 \ .. 'g:imported_abs = exported.*'
886 \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100887 \ .. '1 STOREG g:imported_abs.*'
888 \ .. 'exported = 8888.*'
889 \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
890 \ .. 'g:imported_after = exported.*'
891 \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
892 \ .. '5 STOREG g:imported_after.*'
893 \, g:import_disassembled)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100894 unlet g:imported_abs
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100895 unlet g:import_disassembled
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100896
897 delete('Ximport_abs.vim')
898 delete('Xexport_abs.vim')
899enddef
900
901def Test_import_rtp()
902 let import_lines = [
903 \ 'vim9script',
904 \ 'import exported from "Xexport_rtp.vim"',
905 \ 'g:imported_rtp = exported',
906 \ ]
907 writefile(import_lines, 'Ximport_rtp.vim')
908 mkdir('import')
909 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
910
911 let save_rtp = &rtp
912 &rtp = getcwd()
913 source Ximport_rtp.vim
914 &rtp = save_rtp
915
916 assert_equal(9876, g:imported_rtp)
917 unlet g:imported_rtp
918
919 delete('Ximport_rtp.vim')
920 delete('import/Xexport_rtp.vim')
921 delete('import', 'd')
922enddef
923
924def Test_fixed_size_list()
925 " will be allocated as one piece of memory, check that changes work
926 let l = [1, 2, 3, 4]
927 l->remove(0)
928 l->add(5)
929 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100930 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100931enddef
932
Bram Moolenaar673660a2020-01-26 16:50:05 +0100933" Test that inside :function a Python function can be defined, :def is not
934" recognized.
935func Test_function_python()
936 CheckFeature python3
937 let py = 'python3'
938 execute py "<< EOF"
939def do_something():
940 return 1
941EOF
942endfunc
943
Bram Moolenaar158906c2020-02-06 20:39:45 +0100944def IfElse(what: number): string
945 let res = ''
946 if what == 1
947 res = "one"
948 elseif what == 2
949 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100950 else
Bram Moolenaar158906c2020-02-06 20:39:45 +0100951 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100952 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +0100953 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100954enddef
955
Bram Moolenaar158906c2020-02-06 20:39:45 +0100956def Test_if_elseif_else()
957 assert_equal('one', IfElse(1))
958 assert_equal('two', IfElse(2))
959 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100960enddef
961
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200962def Test_if_elseif_else_fails()
963 call CheckDefFailure(['elseif true'], 'E582:')
964 call CheckDefFailure(['else'], 'E581:')
965 call CheckDefFailure(['endif'], 'E580:')
966 call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200967 call CheckDefFailure(['if true', 'echo 1'], 'E171:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200968enddef
969
Bram Moolenaar6d69bf62020-03-03 19:02:12 +0100970let g:bool_true = v:true
971let g:bool_false = v:false
972
973def Test_if_const_expr()
974 let res = false
975 if true ? true : false
976 res = true
977 endif
978 assert_equal(true, res)
979
Bram Moolenaar585fea72020-04-02 22:33:21 +0200980 g:glob = 2
981 if false
982 execute('let g:glob = 3')
983 endif
984 assert_equal(2, g:glob)
985 if true
986 execute('let g:glob = 3')
987 endif
988 assert_equal(3, g:glob)
989
Bram Moolenaar6d69bf62020-03-03 19:02:12 +0100990 res = false
991 if g:bool_true ? true : false
992 res = true
993 endif
994 assert_equal(true, res)
995
996 res = false
997 if true ? g:bool_true : false
998 res = true
999 endif
1000 assert_equal(true, res)
1001
1002 res = false
1003 if true ? true : g:bool_false
1004 res = true
1005 endif
1006 assert_equal(true, res)
1007
1008 res = false
1009 if true ? false : true
1010 res = true
1011 endif
1012 assert_equal(false, res)
1013
1014 res = false
1015 if false ? false : true
1016 res = true
1017 endif
1018 assert_equal(true, res)
1019
1020 res = false
1021 if false ? true : false
1022 res = true
1023 endif
1024 assert_equal(false, res)
1025
1026 res = false
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001027 if has('xyz') ? true : false
1028 res = true
1029 endif
1030 assert_equal(false, res)
1031
1032 res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001033 if true && true
1034 res = true
1035 endif
1036 assert_equal(true, res)
1037
1038 res = false
1039 if true && false
1040 res = true
1041 endif
1042 assert_equal(false, res)
1043
1044 res = false
1045 if g:bool_true && false
1046 res = true
1047 endif
1048 assert_equal(false, res)
1049
1050 res = false
1051 if true && g:bool_false
1052 res = true
1053 endif
1054 assert_equal(false, res)
1055
1056 res = false
1057 if false && false
1058 res = true
1059 endif
1060 assert_equal(false, res)
1061
1062 res = false
1063 if true || false
1064 res = true
1065 endif
1066 assert_equal(true, res)
1067
1068 res = false
1069 if g:bool_true || false
1070 res = true
1071 endif
1072 assert_equal(true, res)
1073
1074 res = false
1075 if true || g:bool_false
1076 res = true
1077 endif
1078 assert_equal(true, res)
1079
1080 res = false
1081 if false || false
1082 res = true
1083 endif
1084 assert_equal(false, res)
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02001085enddef
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001086
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02001087def Test_if_const_expr_fails()
1088 call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1089 call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001090 call CheckDefFailure(["if has('aaa'"], 'E110:')
1091 call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001092enddef
1093
Bram Moolenaar63ce4842020-02-19 15:46:48 +01001094def Test_delfunc()
1095 let lines =<< trim END
1096 vim9script
1097 def GoneSoon()
1098 echo 'hello'
1099 enddef
1100
1101 def CallGoneSoon()
1102 GoneSoon()
1103 enddef
1104
1105 delfunc GoneSoon
1106 CallGoneSoon()
1107 END
1108 writefile(lines, 'XToDelFunc')
1109 assert_fails('so XToDelFunc', 'E933')
1110 assert_fails('so XToDelFunc', 'E933')
1111
1112 delete('XToDelFunc')
1113enddef
1114
Bram Moolenaarad39c092020-02-26 18:23:43 +01001115def Test_execute_cmd()
1116 new
1117 setline(1, 'default')
1118 execute 'call setline(1, "execute-string")'
1119 assert_equal('execute-string', getline(1))
1120 let cmd1 = 'call setline(1,'
1121 let cmd2 = '"execute-var")'
1122 execute cmd1 cmd2
1123 assert_equal('execute-var', getline(1))
1124 execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1125 assert_equal('execute-var-string', getline(1))
1126 let cmd_first = 'call '
1127 let cmd_last = 'setline(1, "execute-var-var")'
1128 execute cmd_first .. cmd_last
1129 assert_equal('execute-var-var', getline(1))
1130 bwipe!
Bram Moolenaar585fea72020-04-02 22:33:21 +02001131
1132 call CheckDefFailure(['execute xxx'], 'E1001:')
Bram Moolenaarad39c092020-02-26 18:23:43 +01001133enddef
1134
1135def Test_echo_cmd()
Bram Moolenaar585fea72020-04-02 22:33:21 +02001136 echo 'some'
1137 echon 'thing'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001138 assert_match('^something$', Screenline(&lines))
1139
1140 let str1 = 'some'
1141 let str2 = 'more'
1142 echo str1 str2
1143 assert_match('^some more$', Screenline(&lines))
1144enddef
1145
Bram Moolenaar41fe0612020-03-01 16:22:40 +01001146def Test_for_outside_of_function()
1147 let lines =<< trim END
1148 vim9script
1149 new
1150 for var in range(0, 3)
1151 append(line('$'), var)
1152 endfor
1153 assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
1154 bwipe!
1155 END
1156 writefile(lines, 'Xvim9for.vim')
1157 source Xvim9for.vim
1158 delete('Xvim9for.vim')
1159enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001160
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001161def Test_for_loop()
1162 let result = ''
1163 for cnt in range(7)
1164 if cnt == 4
1165 break
1166 endif
1167 if cnt == 2
1168 continue
1169 endif
1170 result ..= cnt .. '_'
1171 endfor
1172 assert_equal('0_1_3_', result)
1173enddef
1174
1175def Test_for_loop_fails()
1176 call CheckDefFailure(['for # in range(5)'], 'E690:')
1177 call CheckDefFailure(['for i In range(5)'], 'E690:')
1178 call CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
1179 call CheckScriptFailure(['def Func(arg)', 'for arg in range(5)', 'enddef'], 'E1006:')
1180 call CheckDefFailure(['for i in "text"'], 'E1024:')
1181 call CheckDefFailure(['for i in xxx'], 'E1001:')
1182 call CheckDefFailure(['endfor'], 'E588:')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001183 call CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001184enddef
1185
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01001186def Test_while_loop()
1187 let result = ''
1188 let cnt = 0
1189 while cnt < 555
1190 if cnt == 3
1191 break
1192 endif
1193 cnt += 1
1194 if cnt == 2
1195 continue
1196 endif
1197 result ..= cnt .. '_'
1198 endwhile
1199 assert_equal('1_3_', result)
1200enddef
1201
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001202def Test_while_loop_fails()
1203 call CheckDefFailure(['while xxx'], 'E1001:')
1204 call CheckDefFailure(['endwhile'], 'E588:')
1205 call CheckDefFailure(['continue'], 'E586:')
1206 call CheckDefFailure(['if true', 'continue'], 'E586:')
1207 call CheckDefFailure(['break'], 'E587:')
1208 call CheckDefFailure(['if true', 'break'], 'E587:')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001209 call CheckDefFailure(['while 1', 'echo 3'], 'E170:')
Bram Moolenaarbd5da372020-03-31 23:13:10 +02001210enddef
1211
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001212def Test_interrupt_loop()
Bram Moolenaar97acfc72020-03-22 13:44:28 +01001213 let caught = false
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001214 let x = 0
Bram Moolenaar97acfc72020-03-22 13:44:28 +01001215 try
1216 while 1
1217 x += 1
1218 if x == 100
1219 feedkeys("\<C-C>", 'Lt')
1220 endif
1221 endwhile
1222 catch
1223 caught = true
1224 assert_equal(100, x)
1225 endtry
1226 assert_true(caught, 'should have caught an exception')
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001227enddef
Bram Moolenaar20431c92020-03-20 18:39:46 +01001228
Bram Moolenaar20431c92020-03-20 18:39:46 +01001229def Test_redef_failure()
1230 call writefile(['def Func0(): string', 'return "Func0"', 'enddef'], 'Xdef')
1231 so Xdef
1232 call writefile(['def Func1(): string', 'return "Func1"', 'enddef'], 'Xdef')
1233 so Xdef
1234 call writefile(['def! Func0(): string', 'enddef'], 'Xdef')
1235 call assert_fails('so Xdef', 'E1027:')
1236 call writefile(['def Func2(): string', 'return "Func2"', 'enddef'], 'Xdef')
1237 so Xdef
1238 call delete('Xdef')
1239
1240 call assert_equal(0, Func0())
1241 call assert_equal('Func1', Func1())
1242 call assert_equal('Func2', Func2())
1243
1244 delfunc! Func0
1245 delfunc! Func1
1246 delfunc! Func2
1247enddef
1248
Bram Moolenaar7d941ee2020-03-26 14:11:58 +01001249" Test for internal functions returning different types
1250func Test_InternalFuncRetType()
1251 let lines =<< trim END
1252 def RetFloat(): float
1253 return ceil(1.456)
1254 enddef
1255
1256 def RetListAny(): list<any>
1257 return items({'k' : 'v'})
1258 enddef
1259
1260 def RetListString(): list<string>
1261 return split('a:b:c', ':')
1262 enddef
1263
1264 def RetListDictAny(): list<dict<any>>
1265 return getbufinfo()
1266 enddef
1267
1268 def RetDictNumber(): dict<number>
1269 return wordcount()
1270 enddef
1271
1272 def RetDictString(): dict<string>
1273 return environ()
1274 enddef
1275 END
1276 call writefile(lines, 'Xscript')
1277 source Xscript
1278
1279 call assert_equal(2.0, RetFloat())
1280 call assert_equal([['k', 'v']], RetListAny())
1281 call assert_equal(['a', 'b', 'c'], RetListString())
1282 call assert_notequal([], RetListDictAny())
1283 call assert_notequal({}, RetDictNumber())
1284 call assert_notequal({}, RetDictString())
1285 call delete('Xscript')
1286endfunc
1287
1288" Test for passing too many or too few arguments to internal functions
1289func Test_internalfunc_arg_error()
1290 let l =<< trim END
1291 def! FArgErr(): float
1292 return ceil(1.1, 2)
1293 enddef
1294 END
1295 call writefile(l, 'Xinvalidarg')
1296 call assert_fails('so Xinvalidarg', 'E118:')
1297 let l =<< trim END
1298 def! FArgErr(): float
1299 return ceil()
1300 enddef
1301 END
1302 call writefile(l, 'Xinvalidarg')
1303 call assert_fails('so Xinvalidarg', 'E119:')
1304 call delete('Xinvalidarg')
1305endfunc
1306
Bram Moolenaar585fea72020-04-02 22:33:21 +02001307" Keep this last, it messes up highlighting.
1308def Test_substitute_cmd()
1309 new
1310 setline(1, 'something')
1311 :substitute(some(other(
1312 assert_equal('otherthing', getline(1))
1313 bwipe!
1314
1315 " also when the context is Vim9 script
1316 let lines =<< trim END
1317 vim9script
1318 new
1319 setline(1, 'something')
1320 :substitute(some(other(
1321 assert_equal('otherthing', getline(1))
1322 bwipe!
1323 END
1324 writefile(lines, 'Xvim9lines')
1325 source Xvim9lines
1326
1327 delete('Xvim9lines')
1328enddef
1329
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001330" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker