blob: cf12e85bb7f56c07953b508e629621417274c5f9 [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')
Bram Moolenaard77a8522020-04-03 21:59:57 +020071 let party2: func = funcref('Test_syntax')
Bram Moolenaar42a480b2020-02-29 23:23:47 +010072
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +010073 " type becomes list<any>
74 let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
Bram Moolenaar5381c7a2020-03-02 22:53:32 +010075 " type becomes dict<any>
76 let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +010077
Bram Moolenaar401d9ff2020-02-19 18:14:44 +010078 g:newvar = 'new'
79 assert_equal('new', g:newvar)
80
81 assert_equal('yes', g:existing)
82 g:existing = 'no'
83 assert_equal('no', g:existing)
84
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010085 v:char = 'abc'
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010086 assert_equal('abc', v:char)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010087
88 $ENVVAR = 'foobar'
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010089 assert_equal('foobar', $ENVVAR)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010090 $ENVVAR = ''
Bram Moolenaar6e587dc2020-02-06 13:15:52 +010091
Bram Moolenaarfd1823e2020-02-19 20:23:11 +010092 s:appendToMe ..= 'yyy'
93 assert_equal('xxxyyy', s:appendToMe)
94 s:addToMe += 222
95 assert_equal(333, s:addToMe)
Bram Moolenaar0bbf7222020-02-19 22:31:48 +010096 s:newVar = 'new'
97 assert_equal('new', s:newVar)
Bram Moolenaara8c17702020-04-01 21:17:24 +020098
99 set ts=7
100 &ts += 1
101 assert_equal(8, &ts)
Bram Moolenaar80c34ca2020-04-01 23:05:18 +0200102 &ts -= 3
103 assert_equal(5, &ts)
104 &ts *= 2
105 assert_equal(10, &ts)
106 &ts /= 3
107 assert_equal(3, &ts)
108 set ts=10
109 &ts %= 4
110 assert_equal(2, &ts)
Bram Moolenaara8c17702020-04-01 21:17:24 +0200111 call CheckDefFailure(['&notex += 3'], 'E113:')
112 call CheckDefFailure(['&ts ..= "xxx"'], 'E1019:')
113 call CheckDefFailure(['&path += 3'], 'E1013:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200114 " test freeing ISN_STOREOPT
115 call CheckDefFailure(['&ts = 3', 'let asdf'], 'E1022:')
Bram Moolenaar80c34ca2020-04-01 23:05:18 +0200116 &ts = 8
Bram Moolenaara8c17702020-04-01 21:17:24 +0200117
118 g:inc_counter += 1
119 assert_equal(2, g:inc_counter)
120
121 $SOME_ENV_VAR ..= 'more'
122 assert_equal('somemore', $SOME_ENV_VAR)
123 call CheckDefFailure(['$SOME_ENV_VAR += "more"'], 'E1013:')
124 call CheckDefFailure(['$SOME_ENV_VAR += 123'], 'E1013:')
125
126 @a = 'areg'
127 @a ..= 'add'
128 assert_equal('aregadd', @a)
129 call CheckDefFailure(['@a += "more"'], 'E1013:')
130 call CheckDefFailure(['@a += 123'], 'E1013:')
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200131
132 v:errmsg = 'none'
133 v:errmsg ..= 'again'
134 assert_equal('noneagain', v:errmsg)
135 call CheckDefFailure(['v:errmsg += "more"'], 'E1013:')
136 call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
137
138 " Test default values.
139 let thebool: bool
140 assert_equal(v:false, thebool)
141
142 let thenumber: number
143 assert_equal(0, thenumber)
144
145 if has('float')
146 let thefloat: float
147 assert_equal(0.0, thefloat)
148 endif
149
150 let thestring: string
151 assert_equal('', thestring)
152
153 let theblob: blob
154 assert_equal(0z, theblob)
155
156 let thefunc: func
157 assert_equal(test_null_function(), thefunc)
158
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200159 let thelist: list<any>
160 assert_equal([], thelist)
161
162 let thedict: dict<any>
163 assert_equal({}, thedict)
164
Bram Moolenaar2c869de2020-04-02 19:12:08 +0200165 if has('channel')
166 let thejob: job
167 assert_equal(test_null_job(), thejob)
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200168
Bram Moolenaar2c869de2020-04-02 19:12:08 +0200169 let thechannel: channel
170 assert_equal(test_null_channel(), thechannel)
171 endif
Bram Moolenaar585fea72020-04-02 22:33:21 +0200172
173 let nr = 1234 | nr = 5678
174 assert_equal(5678, nr)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100175enddef
176
177func Test_assignment_failure()
178 call CheckDefFailure(['let var=234'], 'E1004:')
179 call CheckDefFailure(['let var =234'], 'E1004:')
180 call CheckDefFailure(['let var= 234'], 'E1004:')
181
182 call CheckDefFailure(['let true = 1'], 'E1034:')
183 call CheckDefFailure(['let false = 1'], 'E1034:')
184
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200185 call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:')
186
Bram Moolenaare69f6d02020-04-01 22:11:01 +0200187 call CheckDefFailure(['let somevar'], "E1022:")
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200188 call CheckDefFailure(['let &option'], 'E1052:')
189 call CheckDefFailure(['&g:option = 5'], 'E113:')
190
191 call CheckDefFailure(['let $VAR = 5'], 'E1065:')
192
193 call CheckDefFailure(['let @~ = 5'], 'E354:')
194 call CheckDefFailure(['let @a = 5'], 'E1066:')
195
196 call CheckDefFailure(['let g:var = 5'], 'E1016:')
197
198 call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
199 call CheckDefFailure(['let xnr += 4'], 'E1020:')
200
Bram Moolenaar33fa29c2020-03-28 19:41:33 +0100201 call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:')
202
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100203 call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
204 call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
205
206 call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
207 call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
208
209 call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
210 call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100211
Bram Moolenaard77a8522020-04-03 21:59:57 +0200212 call CheckDefFailure(['let var: dict <number>'], 'E1068:')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100213 call CheckDefFailure(['let var: dict<number'], 'E1009:')
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100214endfunc
215
216func Test_wrong_type()
217 call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
218 call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
219 call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
220 call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
221
222 call CheckDefFailure(['let var: dict<number'], 'E1009:')
223 call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100224
225 call CheckDefFailure(['let var: ally'], 'E1010:')
226 call CheckDefFailure(['let var: bram'], 'E1010:')
227 call CheckDefFailure(['let var: cathy'], 'E1010:')
228 call CheckDefFailure(['let var: dom'], 'E1010:')
229 call CheckDefFailure(['let var: freddy'], 'E1010:')
230 call CheckDefFailure(['let var: john'], 'E1010:')
231 call CheckDefFailure(['let var: larry'], 'E1010:')
232 call CheckDefFailure(['let var: ned'], 'E1010:')
233 call CheckDefFailure(['let var: pam'], 'E1010:')
234 call CheckDefFailure(['let var: sam'], 'E1010:')
235 call CheckDefFailure(['let var: vim'], 'E1010:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100236endfunc
237
238func Test_const()
239 call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
240 call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
241 call CheckDefFailure(['const two'], 'E1021:')
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200242 call CheckDefFailure(['const &option'], 'E996:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100243endfunc
244
245def Test_block()
246 let outer = 1
247 {
248 let inner = 2
249 assert_equal(1, outer)
250 assert_equal(2, inner)
251 }
252 assert_equal(1, outer)
253enddef
254
255func Test_block_failure()
256 call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200257 call CheckDefFailure(['}'], 'E1025:')
258 call CheckDefFailure(['{', 'echo 1'], 'E1026:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100259endfunc
260
Bram Moolenaar585fea72020-04-02 22:33:21 +0200261def Test_cmd_modifier()
262 tab echo '0'
263 call CheckDefFailure(['5tab echo 3'], 'E16:')
264enddef
265
266
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100267def ReturnString(): string
268 return 'string'
269enddef
270
271def ReturnNumber(): number
272 return 123
273enddef
274
Bram Moolenaar09f28f42020-02-20 23:08:34 +0100275let g:notNumber = 'string'
276
277def ReturnGlobal(): number
278 return g:notNumber
279enddef
280
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200281def Test_return_something()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100282 assert_equal('string', ReturnString())
283 assert_equal(123, ReturnNumber())
Bram Moolenaar09f28f42020-02-20 23:08:34 +0100284 assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100285enddef
286
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200287let s:nothing = 0
288def ReturnNothing()
289 s:nothing = 1
290 if true
291 return
292 endif
293 s:nothing = 2
294enddef
295
296def Test_return_nothing()
297 ReturnNothing()
298 assert_equal(1, s:nothing)
299enddef
300
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100301func Increment()
302 let g:counter += 1
303endfunc
304
305def Test_call_ufunc_count()
306 g:counter = 1
307 Increment()
308 Increment()
309 Increment()
310 " works with and without :call
311 assert_equal(4, g:counter)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100312 call assert_equal(4, g:counter)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100313 unlet g:counter
314enddef
315
316def MyVarargs(arg: string, ...rest: list<string>): string
317 let res = arg
318 for s in rest
319 res ..= ',' .. s
320 endfor
321 return res
322enddef
323
324def Test_call_varargs()
325 assert_equal('one', MyVarargs('one'))
326 assert_equal('one,two', MyVarargs('one', 'two'))
327 assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
328enddef
329
Bram Moolenaar170fcfc2020-02-06 17:51:35 +0100330def MyDefaultArgs(name = 'string'): string
331 return name
332enddef
333
334def Test_call_default_args()
335 assert_equal('string', MyDefaultArgs())
336 assert_equal('one', MyDefaultArgs('one'))
337 assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200338
339 call CheckScriptFailure(['def Func(arg: number = asdf)', 'enddef'], 'E1001:')
Bram Moolenaar170fcfc2020-02-06 17:51:35 +0100340enddef
341
342func Test_call_default_args_from_func()
343 call assert_equal('string', MyDefaultArgs())
344 call assert_equal('one', MyDefaultArgs('one'))
345 call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
346endfunc
347
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100348func TakesOneArg(arg)
349 echo a:arg
350endfunc
351
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200352def Test_call_wrong_args()
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100353 call CheckDefFailure(['TakesOneArg()'], 'E119:')
354 call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200355 call CheckDefFailure(['bufnr(xxx)'], 'E1001:')
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100356enddef
357
Bram Moolenaar170fcfc2020-02-06 17:51:35 +0100358" Default arg and varargs
359def MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
360 let res = one .. ',' .. two
361 for s in rest
362 res ..= ',' .. s
363 endfor
364 return res
365enddef
366
367def Test_call_def_varargs()
368 call assert_fails('call MyDefVarargs()', 'E119:')
369 assert_equal('one,foo', MyDefVarargs('one'))
370 assert_equal('one,two', MyDefVarargs('one', 'two'))
371 assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
372enddef
373
Bram Moolenaar42a480b2020-02-29 23:23:47 +0100374def Test_using_var_as_arg()
375 call writefile(['def Func(x: number)', 'let x = 234', 'enddef'], 'Xdef')
376 call assert_fails('so Xdef', 'E1006:')
377 call delete('Xdef')
378enddef
379
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100380def Test_call_func_defined_later()
381 call assert_equal('one', DefinedLater('one'))
382 call assert_fails('call NotDefined("one")', 'E117:')
383enddef
Bram Moolenaar170fcfc2020-02-06 17:51:35 +0100384
Bram Moolenaarb35efa52020-02-26 20:15:18 +0100385func DefinedLater(arg)
Bram Moolenaar26e117e2020-02-04 21:24:15 +0100386 return a:arg
387endfunc
388
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100389def FuncWithForwardCall()
390 return DefinedEvenLater("yes")
391enddef
392
393def DefinedEvenLater(arg: string): string
394 return arg
395enddef
396
397def Test_error_in_nested_function()
398 " Error in called function requires unwinding the call stack.
399 assert_fails('call FuncWithForwardCall()', 'E1029')
400enddef
401
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100402def Test_return_type_wrong()
Bram Moolenaar978d1702020-01-26 17:38:12 +0100403 CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
404 CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
405 CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
406 CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
Bram Moolenaarcf3f8bf2020-03-26 13:15:42 +0100407
Bram Moolenaar9be61bb2020-03-30 22:51:24 +0200408 CheckScriptFailure(['def Func(): number', 'return', 'enddef'], 'E1003:')
409
Bram Moolenaarcf3f8bf2020-03-26 13:15:42 +0100410 CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:')
411 CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100412enddef
413
Bram Moolenaarbfe12042020-02-04 21:54:07 +0100414def Test_arg_type_wrong()
415 CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
416enddef
417
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100418def Test_try_catch()
419 let l = []
420 try
421 add(l, '1')
422 throw 'wrong'
423 add(l, '2')
424 catch
425 add(l, v:exception)
426 finally
427 add(l, '3')
428 endtry
429 assert_equal(['1', 'wrong', '3'], l)
430enddef
431
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100432def ThrowFromDef()
433 throw 'getout'
434enddef
435
436func CatchInFunc()
437 try
438 call ThrowFromDef()
439 catch
440 let g:thrown_func = v:exception
441 endtry
442endfunc
443
444def CatchInDef()
445 try
446 ThrowFromDef()
447 catch
448 g:thrown_def = v:exception
449 endtry
450enddef
451
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100452def ReturnFinally(): string
453 try
454 return 'intry'
455 finally
456 g:in_finally = 'finally'
457 endtry
458 return 'end'
459enddef
460
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100461def Test_try_catch_nested()
462 CatchInFunc()
463 assert_equal('getout', g:thrown_func)
464
465 CatchInDef()
466 assert_equal('getout', g:thrown_def)
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100467
468 assert_equal('intry', ReturnFinally())
469 assert_equal('finally', g:in_finally)
470enddef
471
472def Test_try_catch_match()
473 let seq = 'a'
474 try
475 throw 'something'
476 catch /nothing/
477 seq ..= 'x'
478 catch /some/
479 seq ..= 'b'
480 catch /asdf/
481 seq ..= 'x'
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200482 catch ?a\?sdf?
483 seq ..= 'y'
Bram Moolenaarf575adf2020-02-20 20:41:06 +0100484 finally
485 seq ..= 'c'
486 endtry
487 assert_equal('abc', seq)
Bram Moolenaar257cc5e2020-02-19 17:06:11 +0100488enddef
489
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200490def Test_try_catch_fails()
491 call CheckDefFailure(['catch'], 'E603:')
492 call CheckDefFailure(['try', 'echo 0', 'catch','catch'], 'E1033:')
493 call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200494 call CheckDefFailure(['finally'], 'E606:')
495 call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
496 call CheckDefFailure(['endtry'], 'E602:')
497 call CheckDefFailure(['while 1', 'endtry'], 'E170:')
498 call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
499 call CheckDefFailure(['if 2', 'endtry'], 'E171:')
500 call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
501
502 call CheckDefFailure(['throw'], 'E471:')
503 call CheckDefFailure(['throw xxx'], 'E1001:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200504enddef
505
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100506let s:export_script_lines =<< trim END
507 vim9script
508 let name: string = 'bob'
509 def Concat(arg: string): string
510 return name .. arg
511 enddef
512 let g:result = Concat('bie')
513 let g:localname = name
514
515 export const CONST = 1234
516 export let exported = 9876
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100517 export let exp_name = 'John'
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100518 export def Exported(): string
519 return 'Exported'
520 enddef
521END
522
Bram Moolenaar5269bd22020-03-09 19:25:27 +0100523def Test_vim9_import_export()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100524 let import_script_lines =<< trim END
525 vim9script
526 import {exported, Exported} from './Xexport.vim'
527 g:imported = exported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100528 exported += 3
529 g:imported_added = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100530 g:imported_func = Exported()
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100531
532 import {exp_name} from './Xexport.vim'
533 g:imported_name = exp_name
534 exp_name ..= ' Doe'
535 g:imported_name_appended = exp_name
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100536 g:imported_later = exported
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100537 END
538
539 writefile(import_script_lines, 'Ximport.vim')
540 writefile(s:export_script_lines, 'Xexport.vim')
541
542 source Ximport.vim
543
544 assert_equal('bobbie', g:result)
545 assert_equal('bob', g:localname)
546 assert_equal(9876, g:imported)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100547 assert_equal(9879, g:imported_added)
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100548 assert_equal(9879, g:imported_later)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100549 assert_equal('Exported', g:imported_func)
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100550 assert_equal('John', g:imported_name)
551 assert_equal('John Doe', g:imported_name_appended)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100552 assert_false(exists('g:name'))
553
554 unlet g:result
555 unlet g:localname
556 unlet g:imported
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100557 unlet g:imported_added
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100558 unlet g:imported_later
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100559 unlet g:imported_func
Bram Moolenaar6e587dc2020-02-06 13:15:52 +0100560 unlet g:imported_name g:imported_name_appended
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100561 delete('Ximport.vim')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100562
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100563 let import_in_def_lines =<< trim END
564 vim9script
565 def ImportInDef()
566 import exported from './Xexport.vim'
567 g:imported = exported
568 exported += 7
569 g:imported_added = exported
570 enddef
571 ImportInDef()
572 END
573 writefile(import_in_def_lines, 'Ximport2.vim')
574 source Ximport2.vim
575 " TODO: this should be 9879
576 assert_equal(9876, g:imported)
577 assert_equal(9883, g:imported_added)
578 unlet g:imported
579 unlet g:imported_added
580 delete('Ximport2.vim')
581
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100582 let import_star_as_lines =<< trim END
583 vim9script
584 import * as Export from './Xexport.vim'
585 def UseExport()
586 g:imported = Export.exported
587 enddef
588 UseExport()
589 END
590 writefile(import_star_as_lines, 'Ximport.vim')
591 source Ximport.vim
Bram Moolenaar5381c7a2020-03-02 22:53:32 +0100592 assert_equal(9883, g:imported)
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100593
Bram Moolenaar599c89c2020-03-28 14:53:20 +0100594 let import_star_as_lines_no_dot =<< trim END
595 vim9script
596 import * as Export from './Xexport.vim'
597 def Func()
598 let dummy = 1
599 let imported = Export + dummy
600 enddef
601 END
602 writefile(import_star_as_lines_no_dot, 'Ximport.vim')
603 assert_fails('source Ximport.vim', 'E1060:')
604
605 let import_star_as_lines_dot_space =<< trim END
606 vim9script
607 import * as Export from './Xexport.vim'
608 def Func()
609 let imported = Export . exported
610 enddef
611 END
612 writefile(import_star_as_lines_dot_space, 'Ximport.vim')
613 assert_fails('source Ximport.vim', 'E1074:')
614
615 let import_star_as_lines_missing_name =<< trim END
616 vim9script
617 import * as Export from './Xexport.vim'
618 def Func()
619 let imported = Export.
620 enddef
621 END
622 writefile(import_star_as_lines_missing_name, 'Ximport.vim')
623 assert_fails('source Ximport.vim', 'E1048:')
624
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100625 let import_star_lines =<< trim END
626 vim9script
627 import * from './Xexport.vim'
628 g:imported = exported
629 END
630 writefile(import_star_lines, 'Ximport.vim')
631 assert_fails('source Ximport.vim', 'E1045:')
632
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +0100633 " try to import something that exists but is not exported
634 let import_not_exported_lines =<< trim END
635 vim9script
636 import name from './Xexport.vim'
637 END
638 writefile(import_not_exported_lines, 'Ximport.vim')
639 assert_fails('source Ximport.vim', 'E1049:')
640
Bram Moolenaar5269bd22020-03-09 19:25:27 +0100641 " try to import something that is already defined
642 let import_already_defined =<< trim END
643 vim9script
644 let exported = 'something'
645 import exported from './Xexport.vim'
646 END
647 writefile(import_already_defined, 'Ximport.vim')
648 assert_fails('source Ximport.vim', 'E1073:')
649
650 " try to import something that is already defined
651 import_already_defined =<< trim END
652 vim9script
653 let exported = 'something'
654 import * as exported from './Xexport.vim'
655 END
656 writefile(import_already_defined, 'Ximport.vim')
657 assert_fails('source Ximport.vim', 'E1073:')
658
659 " try to import something that is already defined
660 import_already_defined =<< trim END
661 vim9script
662 let exported = 'something'
663 import {exported} from './Xexport.vim'
664 END
665 writefile(import_already_defined, 'Ximport.vim')
666 assert_fails('source Ximport.vim', 'E1073:')
667
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +0100668 " import a very long name, requires making a copy
669 let import_long_name_lines =<< trim END
670 vim9script
671 import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
672 END
673 writefile(import_long_name_lines, 'Ximport.vim')
674 assert_fails('source Ximport.vim', 'E1048:')
675
676 let import_no_from_lines =<< trim END
677 vim9script
678 import name './Xexport.vim'
679 END
680 writefile(import_no_from_lines, 'Ximport.vim')
681 assert_fails('source Ximport.vim', 'E1070:')
682
683 let import_invalid_string_lines =<< trim END
684 vim9script
685 import name from Xexport.vim
686 END
687 writefile(import_invalid_string_lines, 'Ximport.vim')
688 assert_fails('source Ximport.vim', 'E1071:')
689
690 let import_wrong_name_lines =<< trim END
691 vim9script
692 import name from './XnoExport.vim'
693 END
694 writefile(import_wrong_name_lines, 'Ximport.vim')
695 assert_fails('source Ximport.vim', 'E1053:')
696
697 let import_missing_comma_lines =<< trim END
698 vim9script
699 import {exported name} from './Xexport.vim'
700 END
Bram Moolenaar5269bd22020-03-09 19:25:27 +0100701 writefile(import_missing_comma_lines, 'Ximport3.vim')
702 assert_fails('source Ximport3.vim', 'E1046:')
Bram Moolenaarfa29c8a2020-02-23 22:35:05 +0100703
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100704 delete('Ximport.vim')
Bram Moolenaar5269bd22020-03-09 19:25:27 +0100705 delete('Ximport3.vim')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100706 delete('Xexport.vim')
707
Bram Moolenaar750802b2020-02-23 18:08:33 +0100708 " Check that in a Vim9 script 'cpo' is set to the Vim default.
709 set cpo&vi
710 let cpo_before = &cpo
711 let lines =<< trim END
712 vim9script
713 g:cpo_in_vim9script = &cpo
714 END
715 writefile(lines, 'Xvim9_script')
716 source Xvim9_script
717 assert_equal(cpo_before, &cpo)
718 set cpo&vim
719 assert_equal(&cpo, g:cpo_in_vim9script)
720 delete('Xvim9_script')
721enddef
722
723def Test_vim9script_fails()
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100724 CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
725 CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
Bram Moolenaar750802b2020-02-23 18:08:33 +0100726 CheckScriptFailure(['export let some = 123'], 'E1042:')
Bram Moolenaarf2d5c242020-02-23 21:25:54 +0100727 CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
Bram Moolenaar750802b2020-02-23 18:08:33 +0100728 CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
729 CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
730
731 assert_fails('vim9script', 'E1038')
732 assert_fails('export something', 'E1042')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100733enddef
734
735def Test_vim9script_call()
736 let lines =<< trim END
737 vim9script
738 let var = ''
739 def MyFunc(arg: string)
740 var = arg
741 enddef
742 MyFunc('foobar')
743 assert_equal('foobar', var)
744
745 let str = 'barfoo'
746 str->MyFunc()
747 assert_equal('barfoo', var)
748
749 let g:value = 'value'
750 g:value->MyFunc()
751 assert_equal('value', var)
752
753 let listvar = []
754 def ListFunc(arg: list<number>)
755 listvar = arg
756 enddef
757 [1, 2, 3]->ListFunc()
758 assert_equal([1, 2, 3], listvar)
759
760 let dictvar = {}
761 def DictFunc(arg: dict<number>)
762 dictvar = arg
763 enddef
764 {'a': 1, 'b': 2}->DictFunc()
765 assert_equal(#{a: 1, b: 2}, dictvar)
Bram Moolenaar33fa29c2020-03-28 19:41:33 +0100766 def CompiledDict()
767 {'a': 3, 'b': 4}->DictFunc()
768 enddef
769 CompiledDict()
770 assert_equal(#{a: 3, b: 4}, dictvar)
771
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100772 #{a: 3, b: 4}->DictFunc()
773 assert_equal(#{a: 3, b: 4}, dictvar)
Bram Moolenaar0c6ceaf2020-02-22 18:36:32 +0100774
775 ('text')->MyFunc()
776 assert_equal('text', var)
777 ("some")->MyFunc()
778 assert_equal('some', var)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100779 END
780 writefile(lines, 'Xcall.vim')
781 source Xcall.vim
782 delete('Xcall.vim')
783enddef
784
785def Test_vim9script_call_fail_decl()
786 let lines =<< trim END
787 vim9script
788 let var = ''
789 def MyFunc(arg: string)
790 let var = 123
791 enddef
792 END
793 writefile(lines, 'Xcall_decl.vim')
794 assert_fails('source Xcall_decl.vim', 'E1054:')
795 delete('Xcall_decl.vim')
796enddef
797
798def Test_vim9script_call_fail_const()
799 let lines =<< trim END
800 vim9script
801 const var = ''
802 def MyFunc(arg: string)
803 var = 'asdf'
804 enddef
805 END
806 writefile(lines, 'Xcall_const.vim')
807 assert_fails('source Xcall_const.vim', 'E46:')
808 delete('Xcall_const.vim')
809enddef
810
811def Test_vim9script_reload()
812 let lines =<< trim END
813 vim9script
814 const var = ''
815 let valone = 1234
816 def MyFunc(arg: string)
817 valone = 5678
818 enddef
819 END
820 let morelines =<< trim END
821 let valtwo = 222
822 export def GetValtwo(): number
823 return valtwo
824 enddef
825 END
826 writefile(lines + morelines, 'Xreload.vim')
827 source Xreload.vim
828 source Xreload.vim
829 source Xreload.vim
830
831 let testlines =<< trim END
832 vim9script
833 def TheFunc()
834 import GetValtwo from './Xreload.vim'
835 assert_equal(222, GetValtwo())
836 enddef
837 TheFunc()
838 END
839 writefile(testlines, 'Ximport.vim')
840 source Ximport.vim
841
842 " test that when not using "morelines" valtwo is still defined
843 " need to source Xreload.vim again, import doesn't reload a script
844 writefile(lines, 'Xreload.vim')
845 source Xreload.vim
846 source Ximport.vim
847
848 " cannot declare a var twice
849 lines =<< trim END
850 vim9script
851 let valone = 1234
852 let valone = 5678
853 END
854 writefile(lines, 'Xreload.vim')
855 assert_fails('source Xreload.vim', 'E1041:')
856
857 delete('Xreload.vim')
858 delete('Ximport.vim')
859enddef
860
861def Test_import_absolute()
862 let import_lines = [
863 \ 'vim9script',
864 \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100865 \ 'def UseExported()',
866 \ ' g:imported_abs = exported',
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100867 \ ' exported = 8888',
868 \ ' g:imported_after = exported',
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100869 \ 'enddef',
870 \ 'UseExported()',
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100871 \ 'g:import_disassembled = execute("disass UseExported")',
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100872 \ ]
873 writefile(import_lines, 'Ximport_abs.vim')
874 writefile(s:export_script_lines, 'Xexport_abs.vim')
875
876 source Ximport_abs.vim
877
878 assert_equal(9876, g:imported_abs)
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100879 assert_equal(8888, g:imported_after)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100880 assert_match('<SNR>\d\+_UseExported.*'
881 \ .. 'g:imported_abs = exported.*'
882 \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100883 \ .. '1 STOREG g:imported_abs.*'
884 \ .. 'exported = 8888.*'
885 \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
886 \ .. 'g:imported_after = exported.*'
887 \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
888 \ .. '5 STOREG g:imported_after.*'
889 \, g:import_disassembled)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100890 unlet g:imported_abs
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100891 unlet g:import_disassembled
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100892
893 delete('Ximport_abs.vim')
894 delete('Xexport_abs.vim')
895enddef
896
897def Test_import_rtp()
898 let import_lines = [
899 \ 'vim9script',
900 \ 'import exported from "Xexport_rtp.vim"',
901 \ 'g:imported_rtp = exported',
902 \ ]
903 writefile(import_lines, 'Ximport_rtp.vim')
904 mkdir('import')
905 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
906
907 let save_rtp = &rtp
908 &rtp = getcwd()
909 source Ximport_rtp.vim
910 &rtp = save_rtp
911
912 assert_equal(9876, g:imported_rtp)
913 unlet g:imported_rtp
914
915 delete('Ximport_rtp.vim')
916 delete('import/Xexport_rtp.vim')
917 delete('import', 'd')
918enddef
919
920def Test_fixed_size_list()
921 " will be allocated as one piece of memory, check that changes work
922 let l = [1, 2, 3, 4]
923 l->remove(0)
924 l->add(5)
925 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100926 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100927enddef
928
Bram Moolenaar673660a2020-01-26 16:50:05 +0100929" Test that inside :function a Python function can be defined, :def is not
930" recognized.
931func Test_function_python()
932 CheckFeature python3
933 let py = 'python3'
934 execute py "<< EOF"
935def do_something():
936 return 1
937EOF
938endfunc
939
Bram Moolenaar158906c2020-02-06 20:39:45 +0100940def IfElse(what: number): string
941 let res = ''
942 if what == 1
943 res = "one"
944 elseif what == 2
945 res = "two"
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100946 else
Bram Moolenaar158906c2020-02-06 20:39:45 +0100947 res = "three"
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100948 endif
Bram Moolenaar158906c2020-02-06 20:39:45 +0100949 return res
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100950enddef
951
Bram Moolenaar158906c2020-02-06 20:39:45 +0100952def Test_if_elseif_else()
953 assert_equal('one', IfElse(1))
954 assert_equal('two', IfElse(2))
955 assert_equal('three', IfElse(3))
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100956enddef
957
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200958def Test_if_elseif_else_fails()
959 call CheckDefFailure(['elseif true'], 'E582:')
960 call CheckDefFailure(['else'], 'E581:')
961 call CheckDefFailure(['endif'], 'E580:')
962 call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
Bram Moolenaar585fea72020-04-02 22:33:21 +0200963 call CheckDefFailure(['if true', 'echo 1'], 'E171:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +0200964enddef
965
Bram Moolenaar6d69bf62020-03-03 19:02:12 +0100966let g:bool_true = v:true
967let g:bool_false = v:false
968
969def Test_if_const_expr()
970 let res = false
971 if true ? true : false
972 res = true
973 endif
974 assert_equal(true, res)
975
Bram Moolenaar585fea72020-04-02 22:33:21 +0200976 g:glob = 2
977 if false
978 execute('let g:glob = 3')
979 endif
980 assert_equal(2, g:glob)
981 if true
982 execute('let g:glob = 3')
983 endif
984 assert_equal(3, g:glob)
985
Bram Moolenaar6d69bf62020-03-03 19:02:12 +0100986 res = false
987 if g:bool_true ? true : false
988 res = true
989 endif
990 assert_equal(true, res)
991
992 res = false
993 if true ? g:bool_true : false
994 res = true
995 endif
996 assert_equal(true, res)
997
998 res = false
999 if true ? true : g:bool_false
1000 res = true
1001 endif
1002 assert_equal(true, res)
1003
1004 res = false
1005 if true ? false : true
1006 res = true
1007 endif
1008 assert_equal(false, res)
1009
1010 res = false
1011 if false ? false : true
1012 res = true
1013 endif
1014 assert_equal(true, res)
1015
1016 res = false
1017 if false ? true : false
1018 res = true
1019 endif
1020 assert_equal(false, res)
1021
1022 res = false
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001023 if has('xyz') ? true : false
1024 res = true
1025 endif
1026 assert_equal(false, res)
1027
1028 res = false
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001029 if true && true
1030 res = true
1031 endif
1032 assert_equal(true, res)
1033
1034 res = false
1035 if true && false
1036 res = true
1037 endif
1038 assert_equal(false, res)
1039
1040 res = false
1041 if g:bool_true && false
1042 res = true
1043 endif
1044 assert_equal(false, res)
1045
1046 res = false
1047 if true && g:bool_false
1048 res = true
1049 endif
1050 assert_equal(false, res)
1051
1052 res = false
1053 if false && false
1054 res = true
1055 endif
1056 assert_equal(false, res)
1057
1058 res = false
1059 if true || false
1060 res = true
1061 endif
1062 assert_equal(true, res)
1063
1064 res = false
1065 if g:bool_true || false
1066 res = true
1067 endif
1068 assert_equal(true, res)
1069
1070 res = false
1071 if true || g:bool_false
1072 res = true
1073 endif
1074 assert_equal(true, res)
1075
1076 res = false
1077 if false || false
1078 res = true
1079 endif
1080 assert_equal(false, res)
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02001081enddef
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001082
Bram Moolenaar80c34ca2020-04-01 23:05:18 +02001083def Test_if_const_expr_fails()
1084 call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
1085 call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001086 call CheckDefFailure(["if has('aaa'"], 'E110:')
1087 call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
Bram Moolenaar6d69bf62020-03-03 19:02:12 +01001088enddef
1089
Bram Moolenaar63ce4842020-02-19 15:46:48 +01001090def Test_delfunc()
1091 let lines =<< trim END
1092 vim9script
1093 def GoneSoon()
1094 echo 'hello'
1095 enddef
1096
1097 def CallGoneSoon()
1098 GoneSoon()
1099 enddef
1100
1101 delfunc GoneSoon
1102 CallGoneSoon()
1103 END
1104 writefile(lines, 'XToDelFunc')
1105 assert_fails('so XToDelFunc', 'E933')
1106 assert_fails('so XToDelFunc', 'E933')
1107
1108 delete('XToDelFunc')
1109enddef
1110
Bram Moolenaarad39c092020-02-26 18:23:43 +01001111def Test_execute_cmd()
1112 new
1113 setline(1, 'default')
1114 execute 'call setline(1, "execute-string")'
1115 assert_equal('execute-string', getline(1))
1116 let cmd1 = 'call setline(1,'
1117 let cmd2 = '"execute-var")'
1118 execute cmd1 cmd2
1119 assert_equal('execute-var', getline(1))
1120 execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1121 assert_equal('execute-var-string', getline(1))
1122 let cmd_first = 'call '
1123 let cmd_last = 'setline(1, "execute-var-var")'
1124 execute cmd_first .. cmd_last
1125 assert_equal('execute-var-var', getline(1))
1126 bwipe!
Bram Moolenaar585fea72020-04-02 22:33:21 +02001127
1128 call CheckDefFailure(['execute xxx'], 'E1001:')
Bram Moolenaarad39c092020-02-26 18:23:43 +01001129enddef
1130
1131def Test_echo_cmd()
Bram Moolenaar585fea72020-04-02 22:33:21 +02001132 echo 'some'
1133 echon 'thing'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001134 assert_match('^something$', Screenline(&lines))
1135
1136 let str1 = 'some'
1137 let str2 = 'more'
1138 echo str1 str2
1139 assert_match('^some more$', Screenline(&lines))
1140enddef
1141
Bram Moolenaar41fe0612020-03-01 16:22:40 +01001142def Test_for_outside_of_function()
1143 let lines =<< trim END
1144 vim9script
1145 new
1146 for var in range(0, 3)
1147 append(line('$'), var)
1148 endfor
1149 assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
1150 bwipe!
1151 END
1152 writefile(lines, 'Xvim9for.vim')
1153 source Xvim9for.vim
1154 delete('Xvim9for.vim')
1155enddef
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001156
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001157def Test_for_loop()
1158 let result = ''
1159 for cnt in range(7)
1160 if cnt == 4
1161 break
1162 endif
1163 if cnt == 2
1164 continue
1165 endif
1166 result ..= cnt .. '_'
1167 endfor
1168 assert_equal('0_1_3_', result)
1169enddef
1170
1171def Test_for_loop_fails()
1172 call CheckDefFailure(['for # in range(5)'], 'E690:')
1173 call CheckDefFailure(['for i In range(5)'], 'E690:')
1174 call CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
1175 call CheckScriptFailure(['def Func(arg)', 'for arg in range(5)', 'enddef'], 'E1006:')
1176 call CheckDefFailure(['for i in "text"'], 'E1024:')
1177 call CheckDefFailure(['for i in xxx'], 'E1001:')
1178 call CheckDefFailure(['endfor'], 'E588:')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001179 call CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001180enddef
1181
Bram Moolenaard0df1aa2020-03-04 21:50:46 +01001182def Test_while_loop()
1183 let result = ''
1184 let cnt = 0
1185 while cnt < 555
1186 if cnt == 3
1187 break
1188 endif
1189 cnt += 1
1190 if cnt == 2
1191 continue
1192 endif
1193 result ..= cnt .. '_'
1194 endwhile
1195 assert_equal('1_3_', result)
1196enddef
1197
Bram Moolenaare8c4abb2020-04-02 21:13:25 +02001198def Test_while_loop_fails()
1199 call CheckDefFailure(['while xxx'], 'E1001:')
1200 call CheckDefFailure(['endwhile'], 'E588:')
1201 call CheckDefFailure(['continue'], 'E586:')
1202 call CheckDefFailure(['if true', 'continue'], 'E586:')
1203 call CheckDefFailure(['break'], 'E587:')
1204 call CheckDefFailure(['if true', 'break'], 'E587:')
Bram Moolenaar585fea72020-04-02 22:33:21 +02001205 call CheckDefFailure(['while 1', 'echo 3'], 'E170:')
Bram Moolenaarbd5da372020-03-31 23:13:10 +02001206enddef
1207
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001208def Test_interrupt_loop()
Bram Moolenaar97acfc72020-03-22 13:44:28 +01001209 let caught = false
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001210 let x = 0
Bram Moolenaar97acfc72020-03-22 13:44:28 +01001211 try
1212 while 1
1213 x += 1
1214 if x == 100
1215 feedkeys("\<C-C>", 'Lt')
1216 endif
1217 endwhile
1218 catch
1219 caught = true
1220 assert_equal(100, x)
1221 endtry
1222 assert_true(caught, 'should have caught an exception')
Bram Moolenaar9645e2d2020-03-20 20:48:49 +01001223enddef
Bram Moolenaar20431c92020-03-20 18:39:46 +01001224
Bram Moolenaar20431c92020-03-20 18:39:46 +01001225def Test_redef_failure()
1226 call writefile(['def Func0(): string', 'return "Func0"', 'enddef'], 'Xdef')
1227 so Xdef
1228 call writefile(['def Func1(): string', 'return "Func1"', 'enddef'], 'Xdef')
1229 so Xdef
1230 call writefile(['def! Func0(): string', 'enddef'], 'Xdef')
1231 call assert_fails('so Xdef', 'E1027:')
1232 call writefile(['def Func2(): string', 'return "Func2"', 'enddef'], 'Xdef')
1233 so Xdef
1234 call delete('Xdef')
1235
1236 call assert_equal(0, Func0())
1237 call assert_equal('Func1', Func1())
1238 call assert_equal('Func2', Func2())
1239
1240 delfunc! Func0
1241 delfunc! Func1
1242 delfunc! Func2
1243enddef
1244
Bram Moolenaar7d941ee2020-03-26 14:11:58 +01001245" Test for internal functions returning different types
1246func Test_InternalFuncRetType()
1247 let lines =<< trim END
1248 def RetFloat(): float
1249 return ceil(1.456)
1250 enddef
1251
1252 def RetListAny(): list<any>
1253 return items({'k' : 'v'})
1254 enddef
1255
1256 def RetListString(): list<string>
1257 return split('a:b:c', ':')
1258 enddef
1259
1260 def RetListDictAny(): list<dict<any>>
1261 return getbufinfo()
1262 enddef
1263
1264 def RetDictNumber(): dict<number>
1265 return wordcount()
1266 enddef
1267
1268 def RetDictString(): dict<string>
1269 return environ()
1270 enddef
1271 END
1272 call writefile(lines, 'Xscript')
1273 source Xscript
1274
1275 call assert_equal(2.0, RetFloat())
1276 call assert_equal([['k', 'v']], RetListAny())
1277 call assert_equal(['a', 'b', 'c'], RetListString())
1278 call assert_notequal([], RetListDictAny())
1279 call assert_notequal({}, RetDictNumber())
1280 call assert_notequal({}, RetDictString())
1281 call delete('Xscript')
1282endfunc
1283
1284" Test for passing too many or too few arguments to internal functions
1285func Test_internalfunc_arg_error()
1286 let l =<< trim END
1287 def! FArgErr(): float
1288 return ceil(1.1, 2)
1289 enddef
1290 END
1291 call writefile(l, 'Xinvalidarg')
1292 call assert_fails('so Xinvalidarg', 'E118:')
1293 let l =<< trim END
1294 def! FArgErr(): float
1295 return ceil()
1296 enddef
1297 END
1298 call writefile(l, 'Xinvalidarg')
1299 call assert_fails('so Xinvalidarg', 'E119:')
1300 call delete('Xinvalidarg')
1301endfunc
1302
Bram Moolenaar585fea72020-04-02 22:33:21 +02001303" Keep this last, it messes up highlighting.
1304def Test_substitute_cmd()
1305 new
1306 setline(1, 'something')
1307 :substitute(some(other(
1308 assert_equal('otherthing', getline(1))
1309 bwipe!
1310
1311 " also when the context is Vim9 script
1312 let lines =<< trim END
1313 vim9script
1314 new
1315 setline(1, 'something')
1316 :substitute(some(other(
1317 assert_equal('otherthing', getline(1))
1318 bwipe!
1319 END
1320 writefile(lines, 'Xvim9lines')
1321 source Xvim9lines
1322
1323 delete('Xvim9lines')
1324enddef
1325
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001326" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker