18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4ad39c094SBram Moolenaarsource view_util.vim
5673660abSBram Moolenaar
68a7d6542SBram Moolenaar" Check that "lines" inside ":def" results in an "error" message.
78a7d6542SBram Moolenaarfunc CheckDefFailure(lines, error)
8978d170bSBram Moolenaar  call writefile(['def Func()'] + a:lines + ['enddef'], 'Xdef')
98a7d6542SBram Moolenaar  call assert_fails('so Xdef', a:error, a:lines)
108a7d6542SBram Moolenaar  call delete('Xdef')
118a7d6542SBram Moolenaarendfunc
128a7d6542SBram Moolenaar
138a7d6542SBram Moolenaarfunc CheckScriptFailure(lines, error)
148a7d6542SBram Moolenaar  call writefile(a:lines, 'Xdef')
158a7d6542SBram Moolenaar  call assert_fails('so Xdef', a:error, a:lines)
168a7d6542SBram Moolenaar  call delete('Xdef')
178a7d6542SBram Moolenaarendfunc
188a7d6542SBram Moolenaar
198a7d6542SBram Moolenaardef Test_syntax()
208a7d6542SBram Moolenaar  let var = 234
218a7d6542SBram Moolenaar  let other: list<string> = ['asdf']
228a7d6542SBram Moolenaarenddef
238a7d6542SBram Moolenaar
248a7d6542SBram Moolenaarfunc Test_def_basic()
258a7d6542SBram Moolenaar  def SomeFunc(): string
268a7d6542SBram Moolenaar    return 'yes'
278a7d6542SBram Moolenaar  enddef
288a7d6542SBram Moolenaar  call assert_equal('yes', SomeFunc())
298a7d6542SBram Moolenaarendfunc
308a7d6542SBram Moolenaar
316e587dcbSBram Moolenaarlet s:appendToMe = 'xxx'
326e587dcbSBram Moolenaarlet s:addToMe = 111
33401d9ffbSBram Moolenaarlet g:existing = 'yes'
346e587dcbSBram Moolenaar
358a7d6542SBram Moolenaardef Test_assignment()
368a7d6542SBram Moolenaar  let bool1: bool = true
378a7d6542SBram Moolenaar  assert_equal(v:true, bool1)
388a7d6542SBram Moolenaar  let bool2: bool = false
398a7d6542SBram Moolenaar  assert_equal(v:false, bool2)
408a7d6542SBram Moolenaar
410c2ca58eSBram Moolenaar  let list1: list<bool> = [false, true, false]
428a7d6542SBram Moolenaar  let list2: list<number> = [1, 2, 3]
430c2ca58eSBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
440c2ca58eSBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
450c2ca58eSBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
468a7d6542SBram Moolenaar
47436472f5SBram Moolenaar  let listS: list<string> = []
48436472f5SBram Moolenaar  let listN: list<number> = []
498a7d6542SBram Moolenaar
500c2ca58eSBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
518a7d6542SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
520c2ca58eSBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
530c2ca58eSBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
540c2ca58eSBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, tw: 0z02}
55b283a8a6SBram Moolenaar
56*9be61bbbSBram Moolenaar  let a: number = 6
57*9be61bbbSBram Moolenaar  assert_equal(6, a)
58*9be61bbbSBram Moolenaar
5942a480bfSBram Moolenaar  if has('channel')
6042a480bfSBram Moolenaar    let chan1: channel
61fbdd08edSBram Moolenaar    let job1: job
62f51cb4e0SBram Moolenaar    let job2: job = job_start('willfail')
6342a480bfSBram Moolenaar  endif
64fbdd08edSBram Moolenaar  if has('float')
65fbdd08edSBram Moolenaar    let float1: float = 3.4
66fbdd08edSBram Moolenaar  endif
67087d2e15SBram Moolenaar  let funky1: func
68087d2e15SBram Moolenaar  let funky2: func = function('len')
69087d2e15SBram Moolenaar  let party1: partial
70087d2e15SBram Moolenaar  let party2: partial = funcref('Test_syntax')
7142a480bfSBram Moolenaar
7261a6d4e4SBram Moolenaar  " type becomes list<any>
7361a6d4e4SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
745381c7a1SBram Moolenaar  " type becomes dict<any>
755381c7a1SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
7661a6d4e4SBram Moolenaar
77401d9ffbSBram Moolenaar  g:newvar = 'new'
78401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
79401d9ffbSBram Moolenaar
80401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
81401d9ffbSBram Moolenaar  g:existing = 'no'
82401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
83401d9ffbSBram Moolenaar
84b283a8a6SBram Moolenaar  v:char = 'abc'
856e587dcbSBram Moolenaar  assert_equal('abc', v:char)
86b283a8a6SBram Moolenaar
87b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
886e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
89b283a8a6SBram Moolenaar  $ENVVAR = ''
906e587dcbSBram Moolenaar
91fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
92fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
93fd1823e0SBram Moolenaar  s:addToMe += 222
94fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
950bbf722aSBram Moolenaar  s:newVar = 'new'
960bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
978a7d6542SBram Moolenaarenddef
988a7d6542SBram Moolenaar
998a7d6542SBram Moolenaarfunc Test_assignment_failure()
1008a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
1018a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
1028a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
1038a7d6542SBram Moolenaar
1048a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
1058a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
1068a7d6542SBram Moolenaar
107*9be61bbbSBram Moolenaar  call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:')
108*9be61bbbSBram Moolenaar
109*9be61bbbSBram Moolenaar  call CheckDefFailure(['let &option'], 'E1052:')
110*9be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
111*9be61bbbSBram Moolenaar
112*9be61bbbSBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1065:')
113*9be61bbbSBram Moolenaar
114*9be61bbbSBram Moolenaar  call CheckDefFailure(['let @~ = 5'], 'E354:')
115*9be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
116*9be61bbbSBram Moolenaar
117*9be61bbbSBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016:')
118*9be61bbbSBram Moolenaar
119*9be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
120*9be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
121*9be61bbbSBram Moolenaar
12233fa29cfSBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:')
12333fa29cfSBram Moolenaar
1248a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
1258a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
1268a7d6542SBram Moolenaar
1278a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
1288a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
1298a7d6542SBram Moolenaar
1308a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
1318a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
13242a480bfSBram Moolenaar
13342a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1007:')
13442a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
135599c89c8SBram Moolenaarendfunc
136599c89c8SBram Moolenaar
137599c89c8SBram Moolenaarfunc Test_wrong_type()
138599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
139599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
140599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
141599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
142599c89c8SBram Moolenaar
143599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
144599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
14542a480bfSBram Moolenaar
14642a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
14742a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
14842a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
14942a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
15042a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
15142a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
15242a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
15342a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
15442a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
15542a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
15642a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
1578a7d6542SBram Moolenaarendfunc
1588a7d6542SBram Moolenaar
1598a7d6542SBram Moolenaarfunc Test_const()
1608a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
1618a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
1628a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
163*9be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
1648a7d6542SBram Moolenaarendfunc
1658a7d6542SBram Moolenaar
1668a7d6542SBram Moolenaardef Test_block()
1678a7d6542SBram Moolenaar  let outer = 1
1688a7d6542SBram Moolenaar  {
1698a7d6542SBram Moolenaar    let inner = 2
1708a7d6542SBram Moolenaar    assert_equal(1, outer)
1718a7d6542SBram Moolenaar    assert_equal(2, inner)
1728a7d6542SBram Moolenaar  }
1738a7d6542SBram Moolenaar  assert_equal(1, outer)
1748a7d6542SBram Moolenaarenddef
1758a7d6542SBram Moolenaar
1768a7d6542SBram Moolenaarfunc Test_block_failure()
1778a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
1788a7d6542SBram Moolenaarendfunc
1798a7d6542SBram Moolenaar
1808a7d6542SBram Moolenaardef ReturnString(): string
1818a7d6542SBram Moolenaar  return 'string'
1828a7d6542SBram Moolenaarenddef
1838a7d6542SBram Moolenaar
1848a7d6542SBram Moolenaardef ReturnNumber(): number
1858a7d6542SBram Moolenaar  return 123
1868a7d6542SBram Moolenaarenddef
1878a7d6542SBram Moolenaar
18809f28f49SBram Moolenaarlet g:notNumber = 'string'
18909f28f49SBram Moolenaar
19009f28f49SBram Moolenaardef ReturnGlobal(): number
19109f28f49SBram Moolenaar  return g:notNumber
19209f28f49SBram Moolenaarenddef
19309f28f49SBram Moolenaar
194*9be61bbbSBram Moolenaardef Test_return_something()
1958a7d6542SBram Moolenaar  assert_equal('string', ReturnString())
1968a7d6542SBram Moolenaar  assert_equal(123, ReturnNumber())
19709f28f49SBram Moolenaar  assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string')
1988a7d6542SBram Moolenaarenddef
1998a7d6542SBram Moolenaar
200*9be61bbbSBram Moolenaarlet s:nothing = 0
201*9be61bbbSBram Moolenaardef ReturnNothing()
202*9be61bbbSBram Moolenaar  s:nothing = 1
203*9be61bbbSBram Moolenaar  if true
204*9be61bbbSBram Moolenaar    return
205*9be61bbbSBram Moolenaar  endif
206*9be61bbbSBram Moolenaar  s:nothing = 2
207*9be61bbbSBram Moolenaarenddef
208*9be61bbbSBram Moolenaar
209*9be61bbbSBram Moolenaardef Test_return_nothing()
210*9be61bbbSBram Moolenaar  ReturnNothing()
211*9be61bbbSBram Moolenaar  assert_equal(1, s:nothing)
212*9be61bbbSBram Moolenaarenddef
213*9be61bbbSBram Moolenaar
2148a7d6542SBram Moolenaarfunc Increment()
2158a7d6542SBram Moolenaar  let g:counter += 1
2168a7d6542SBram Moolenaarendfunc
2178a7d6542SBram Moolenaar
2188a7d6542SBram Moolenaardef Test_call_ufunc_count()
2198a7d6542SBram Moolenaar  g:counter = 1
2208a7d6542SBram Moolenaar  Increment()
2218a7d6542SBram Moolenaar  Increment()
2228a7d6542SBram Moolenaar  Increment()
2238a7d6542SBram Moolenaar  " works with and without :call
2248a7d6542SBram Moolenaar  assert_equal(4, g:counter)
225b283a8a6SBram Moolenaar  call assert_equal(4, g:counter)
2268a7d6542SBram Moolenaar  unlet g:counter
2278a7d6542SBram Moolenaarenddef
2288a7d6542SBram Moolenaar
2298a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string
2308a7d6542SBram Moolenaar  let res = arg
2318a7d6542SBram Moolenaar  for s in rest
2328a7d6542SBram Moolenaar    res ..= ',' .. s
2338a7d6542SBram Moolenaar  endfor
2348a7d6542SBram Moolenaar  return res
2358a7d6542SBram Moolenaarenddef
2368a7d6542SBram Moolenaar
2378a7d6542SBram Moolenaardef Test_call_varargs()
2388a7d6542SBram Moolenaar  assert_equal('one', MyVarargs('one'))
2398a7d6542SBram Moolenaar  assert_equal('one,two', MyVarargs('one', 'two'))
2408a7d6542SBram Moolenaar  assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
2418a7d6542SBram Moolenaarenddef
2428a7d6542SBram Moolenaar
243170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string
244170fcfcfSBram Moolenaar  return name
245170fcfcfSBram Moolenaarenddef
246170fcfcfSBram Moolenaar
247170fcfcfSBram Moolenaardef Test_call_default_args()
248170fcfcfSBram Moolenaar  assert_equal('string', MyDefaultArgs())
249170fcfcfSBram Moolenaar  assert_equal('one', MyDefaultArgs('one'))
250170fcfcfSBram Moolenaar  assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
251170fcfcfSBram Moolenaarenddef
252170fcfcfSBram Moolenaar
253170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func()
254170fcfcfSBram Moolenaar  call assert_equal('string', MyDefaultArgs())
255170fcfcfSBram Moolenaar  call assert_equal('one', MyDefaultArgs('one'))
256170fcfcfSBram Moolenaar  call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
257170fcfcfSBram Moolenaarendfunc
258170fcfcfSBram Moolenaar
259b35efa5eSBram Moolenaarfunc TakesOneArg(arg)
260b35efa5eSBram Moolenaar  echo a:arg
261b35efa5eSBram Moolenaarendfunc
262b35efa5eSBram Moolenaar
263b35efa5eSBram Moolenaardef Test_call_wrong_arg_count()
264b35efa5eSBram Moolenaar  call CheckDefFailure(['TakesOneArg()'], 'E119:')
265b35efa5eSBram Moolenaar  call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
266b35efa5eSBram Moolenaarenddef
267b35efa5eSBram Moolenaar
268170fcfcfSBram Moolenaar" Default arg and varargs
269170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
270170fcfcfSBram Moolenaar  let res = one .. ',' .. two
271170fcfcfSBram Moolenaar  for s in rest
272170fcfcfSBram Moolenaar    res ..= ',' .. s
273170fcfcfSBram Moolenaar  endfor
274170fcfcfSBram Moolenaar  return res
275170fcfcfSBram Moolenaarenddef
276170fcfcfSBram Moolenaar
277170fcfcfSBram Moolenaardef Test_call_def_varargs()
278170fcfcfSBram Moolenaar  call assert_fails('call MyDefVarargs()', 'E119:')
279170fcfcfSBram Moolenaar  assert_equal('one,foo', MyDefVarargs('one'))
280170fcfcfSBram Moolenaar  assert_equal('one,two', MyDefVarargs('one', 'two'))
281170fcfcfSBram Moolenaar  assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
282170fcfcfSBram Moolenaarenddef
283170fcfcfSBram Moolenaar
28442a480bfSBram Moolenaardef Test_using_var_as_arg()
28542a480bfSBram Moolenaar  call writefile(['def Func(x: number)',  'let x = 234', 'enddef'], 'Xdef')
28642a480bfSBram Moolenaar  call assert_fails('so Xdef', 'E1006:')
28742a480bfSBram Moolenaar  call delete('Xdef')
28842a480bfSBram Moolenaarenddef
28942a480bfSBram Moolenaar
290b35efa5eSBram Moolenaardef Test_call_func_defined_later()
291b35efa5eSBram Moolenaar  call assert_equal('one', DefinedLater('one'))
292b35efa5eSBram Moolenaar  call assert_fails('call NotDefined("one")', 'E117:')
293b35efa5eSBram Moolenaarenddef
294170fcfcfSBram Moolenaar
295b35efa5eSBram Moolenaarfunc DefinedLater(arg)
29626e117e9SBram Moolenaar  return a:arg
29726e117e9SBram Moolenaarendfunc
29826e117e9SBram Moolenaar
2997eeefd4aSBram Moolenaardef FuncWithForwardCall()
3007eeefd4aSBram Moolenaar  return DefinedEvenLater("yes")
3017eeefd4aSBram Moolenaarenddef
3027eeefd4aSBram Moolenaar
3037eeefd4aSBram Moolenaardef DefinedEvenLater(arg: string): string
3047eeefd4aSBram Moolenaar  return arg
3057eeefd4aSBram Moolenaarenddef
3067eeefd4aSBram Moolenaar
3077eeefd4aSBram Moolenaardef Test_error_in_nested_function()
3087eeefd4aSBram Moolenaar  " Error in called function requires unwinding the call stack.
3097eeefd4aSBram Moolenaar  assert_fails('call FuncWithForwardCall()', 'E1029')
3107eeefd4aSBram Moolenaarenddef
3117eeefd4aSBram Moolenaar
3128a7d6542SBram Moolenaardef Test_return_type_wrong()
313978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
314978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
315978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
316978d170bSBram Moolenaar  CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
317cf3f8bf4SBram Moolenaar
318*9be61bbbSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return', 'enddef'], 'E1003:')
319*9be61bbbSBram Moolenaar
320cf3f8bf4SBram Moolenaar  CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:')
321cf3f8bf4SBram Moolenaar  CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:')
3228a7d6542SBram Moolenaarenddef
3238a7d6542SBram Moolenaar
324bfe12043SBram Moolenaardef Test_arg_type_wrong()
325bfe12043SBram Moolenaar  CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
326bfe12043SBram Moolenaarenddef
327bfe12043SBram Moolenaar
3288a7d6542SBram Moolenaardef Test_try_catch()
3298a7d6542SBram Moolenaar  let l = []
3308a7d6542SBram Moolenaar  try
3318a7d6542SBram Moolenaar    add(l, '1')
3328a7d6542SBram Moolenaar    throw 'wrong'
3338a7d6542SBram Moolenaar    add(l, '2')
3348a7d6542SBram Moolenaar  catch
3358a7d6542SBram Moolenaar    add(l, v:exception)
3368a7d6542SBram Moolenaar  finally
3378a7d6542SBram Moolenaar    add(l, '3')
3388a7d6542SBram Moolenaar  endtry
3398a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
3408a7d6542SBram Moolenaarenddef
3418a7d6542SBram Moolenaar
342257cc5eeSBram Moolenaardef ThrowFromDef()
343257cc5eeSBram Moolenaar  throw 'getout'
344257cc5eeSBram Moolenaarenddef
345257cc5eeSBram Moolenaar
346257cc5eeSBram Moolenaarfunc CatchInFunc()
347257cc5eeSBram Moolenaar  try
348257cc5eeSBram Moolenaar    call ThrowFromDef()
349257cc5eeSBram Moolenaar  catch
350257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
351257cc5eeSBram Moolenaar  endtry
352257cc5eeSBram Moolenaarendfunc
353257cc5eeSBram Moolenaar
354257cc5eeSBram Moolenaardef CatchInDef()
355257cc5eeSBram Moolenaar  try
356257cc5eeSBram Moolenaar    ThrowFromDef()
357257cc5eeSBram Moolenaar  catch
358257cc5eeSBram Moolenaar    g:thrown_def = v:exception
359257cc5eeSBram Moolenaar  endtry
360257cc5eeSBram Moolenaarenddef
361257cc5eeSBram Moolenaar
362f575adffSBram Moolenaardef ReturnFinally(): string
363f575adffSBram Moolenaar  try
364f575adffSBram Moolenaar    return 'intry'
365f575adffSBram Moolenaar  finally
366f575adffSBram Moolenaar    g:in_finally = 'finally'
367f575adffSBram Moolenaar  endtry
368f575adffSBram Moolenaar  return 'end'
369f575adffSBram Moolenaarenddef
370f575adffSBram Moolenaar
371257cc5eeSBram Moolenaardef Test_try_catch_nested()
372257cc5eeSBram Moolenaar  CatchInFunc()
373257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
374257cc5eeSBram Moolenaar
375257cc5eeSBram Moolenaar  CatchInDef()
376257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
377f575adffSBram Moolenaar
378f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
379f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
380f575adffSBram Moolenaarenddef
381f575adffSBram Moolenaar
382f575adffSBram Moolenaardef Test_try_catch_match()
383f575adffSBram Moolenaar  let seq = 'a'
384f575adffSBram Moolenaar  try
385f575adffSBram Moolenaar    throw 'something'
386f575adffSBram Moolenaar  catch /nothing/
387f575adffSBram Moolenaar    seq ..= 'x'
388f575adffSBram Moolenaar  catch /some/
389f575adffSBram Moolenaar    seq ..= 'b'
390f575adffSBram Moolenaar  catch /asdf/
391f575adffSBram Moolenaar    seq ..= 'x'
392f575adffSBram Moolenaar  finally
393f575adffSBram Moolenaar    seq ..= 'c'
394f575adffSBram Moolenaar  endtry
395f575adffSBram Moolenaar  assert_equal('abc', seq)
396257cc5eeSBram Moolenaarenddef
397257cc5eeSBram Moolenaar
3988a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
3998a7d6542SBram Moolenaar  vim9script
4008a7d6542SBram Moolenaar  let name: string = 'bob'
4018a7d6542SBram Moolenaar  def Concat(arg: string): string
4028a7d6542SBram Moolenaar    return name .. arg
4038a7d6542SBram Moolenaar  enddef
4048a7d6542SBram Moolenaar  let g:result = Concat('bie')
4058a7d6542SBram Moolenaar  let g:localname = name
4068a7d6542SBram Moolenaar
4078a7d6542SBram Moolenaar  export const CONST = 1234
4088a7d6542SBram Moolenaar  export let exported = 9876
4096e587dcbSBram Moolenaar  export let exp_name = 'John'
4108a7d6542SBram Moolenaar  export def Exported(): string
4118a7d6542SBram Moolenaar    return 'Exported'
4128a7d6542SBram Moolenaar  enddef
4138a7d6542SBram MoolenaarEND
4148a7d6542SBram Moolenaar
4155269bd2aSBram Moolenaardef Test_vim9_import_export()
4168a7d6542SBram Moolenaar  let import_script_lines =<< trim END
4178a7d6542SBram Moolenaar    vim9script
4188a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
4198a7d6542SBram Moolenaar    g:imported = exported
4206e587dcbSBram Moolenaar    exported += 3
4216e587dcbSBram Moolenaar    g:imported_added = exported
4228a7d6542SBram Moolenaar    g:imported_func = Exported()
4236e587dcbSBram Moolenaar
4246e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
4256e587dcbSBram Moolenaar    g:imported_name = exp_name
4266e587dcbSBram Moolenaar    exp_name ..= ' Doe'
4276e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
4285381c7a1SBram Moolenaar    g:imported_later = exported
4298a7d6542SBram Moolenaar  END
4308a7d6542SBram Moolenaar
4318a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
4328a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
4338a7d6542SBram Moolenaar
4348a7d6542SBram Moolenaar  source Ximport.vim
4358a7d6542SBram Moolenaar
4368a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
4378a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
4388a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
4396e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
4405381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
4418a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
4426e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
4436e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
4448a7d6542SBram Moolenaar  assert_false(exists('g:name'))
4458a7d6542SBram Moolenaar
4468a7d6542SBram Moolenaar  unlet g:result
4478a7d6542SBram Moolenaar  unlet g:localname
4488a7d6542SBram Moolenaar  unlet g:imported
4496e587dcbSBram Moolenaar  unlet g:imported_added
4505381c7a1SBram Moolenaar  unlet g:imported_later
4518a7d6542SBram Moolenaar  unlet g:imported_func
4526e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
4538a7d6542SBram Moolenaar  delete('Ximport.vim')
454f2d5c240SBram Moolenaar
4555381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
4565381c7a1SBram Moolenaar    vim9script
4575381c7a1SBram Moolenaar    def ImportInDef()
4585381c7a1SBram Moolenaar      import exported from './Xexport.vim'
4595381c7a1SBram Moolenaar      g:imported = exported
4605381c7a1SBram Moolenaar      exported += 7
4615381c7a1SBram Moolenaar      g:imported_added = exported
4625381c7a1SBram Moolenaar    enddef
4635381c7a1SBram Moolenaar    ImportInDef()
4645381c7a1SBram Moolenaar  END
4655381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
4665381c7a1SBram Moolenaar  source Ximport2.vim
4675381c7a1SBram Moolenaar  " TODO: this should be 9879
4685381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
4695381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
4705381c7a1SBram Moolenaar  unlet g:imported
4715381c7a1SBram Moolenaar  unlet g:imported_added
4725381c7a1SBram Moolenaar  delete('Ximport2.vim')
4735381c7a1SBram Moolenaar
474f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
475f2d5c240SBram Moolenaar    vim9script
476f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
477f2d5c240SBram Moolenaar    def UseExport()
478f2d5c240SBram Moolenaar      g:imported = Export.exported
479f2d5c240SBram Moolenaar    enddef
480f2d5c240SBram Moolenaar    UseExport()
481f2d5c240SBram Moolenaar  END
482f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
483f2d5c240SBram Moolenaar  source Ximport.vim
4845381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
485f2d5c240SBram Moolenaar
486599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
487599c89c8SBram Moolenaar    vim9script
488599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
489599c89c8SBram Moolenaar    def Func()
490599c89c8SBram Moolenaar      let dummy = 1
491599c89c8SBram Moolenaar      let imported = Export + dummy
492599c89c8SBram Moolenaar    enddef
493599c89c8SBram Moolenaar  END
494599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
495599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
496599c89c8SBram Moolenaar
497599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
498599c89c8SBram Moolenaar    vim9script
499599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
500599c89c8SBram Moolenaar    def Func()
501599c89c8SBram Moolenaar      let imported = Export . exported
502599c89c8SBram Moolenaar    enddef
503599c89c8SBram Moolenaar  END
504599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
505599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
506599c89c8SBram Moolenaar
507599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
508599c89c8SBram Moolenaar    vim9script
509599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
510599c89c8SBram Moolenaar    def Func()
511599c89c8SBram Moolenaar      let imported = Export.
512599c89c8SBram Moolenaar    enddef
513599c89c8SBram Moolenaar  END
514599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
515599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
516599c89c8SBram Moolenaar
517f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
518f2d5c240SBram Moolenaar    vim9script
519f2d5c240SBram Moolenaar    import * from './Xexport.vim'
520f2d5c240SBram Moolenaar    g:imported = exported
521f2d5c240SBram Moolenaar  END
522f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
523f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
524f2d5c240SBram Moolenaar
525fa29c8abSBram Moolenaar  " try to import something that exists but is not exported
526fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
527fa29c8abSBram Moolenaar    vim9script
528fa29c8abSBram Moolenaar    import name from './Xexport.vim'
529fa29c8abSBram Moolenaar  END
530fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
531fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
532fa29c8abSBram Moolenaar
5335269bd2aSBram Moolenaar  " try to import something that is already defined
5345269bd2aSBram Moolenaar  let import_already_defined =<< trim END
5355269bd2aSBram Moolenaar    vim9script
5365269bd2aSBram Moolenaar    let exported = 'something'
5375269bd2aSBram Moolenaar    import exported from './Xexport.vim'
5385269bd2aSBram Moolenaar  END
5395269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
5405269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
5415269bd2aSBram Moolenaar
5425269bd2aSBram Moolenaar  " try to import something that is already defined
5435269bd2aSBram Moolenaar  import_already_defined =<< trim END
5445269bd2aSBram Moolenaar    vim9script
5455269bd2aSBram Moolenaar    let exported = 'something'
5465269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
5475269bd2aSBram Moolenaar  END
5485269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
5495269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
5505269bd2aSBram Moolenaar
5515269bd2aSBram Moolenaar  " try to import something that is already defined
5525269bd2aSBram Moolenaar  import_already_defined =<< trim END
5535269bd2aSBram Moolenaar    vim9script
5545269bd2aSBram Moolenaar    let exported = 'something'
5555269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
5565269bd2aSBram Moolenaar  END
5575269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
5585269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
5595269bd2aSBram Moolenaar
560fa29c8abSBram Moolenaar  " import a very long name, requires making a copy
561fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
562fa29c8abSBram Moolenaar    vim9script
563fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
564fa29c8abSBram Moolenaar  END
565fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
566fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
567fa29c8abSBram Moolenaar
568fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
569fa29c8abSBram Moolenaar    vim9script
570fa29c8abSBram Moolenaar    import name './Xexport.vim'
571fa29c8abSBram Moolenaar  END
572fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
573fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
574fa29c8abSBram Moolenaar
575fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
576fa29c8abSBram Moolenaar    vim9script
577fa29c8abSBram Moolenaar    import name from Xexport.vim
578fa29c8abSBram Moolenaar  END
579fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
580fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
581fa29c8abSBram Moolenaar
582fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
583fa29c8abSBram Moolenaar    vim9script
584fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
585fa29c8abSBram Moolenaar  END
586fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
587fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
588fa29c8abSBram Moolenaar
589fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
590fa29c8abSBram Moolenaar    vim9script
591fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
592fa29c8abSBram Moolenaar  END
5935269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
5945269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
595fa29c8abSBram Moolenaar
596f2d5c240SBram Moolenaar  delete('Ximport.vim')
5975269bd2aSBram Moolenaar  delete('Ximport3.vim')
5988a7d6542SBram Moolenaar  delete('Xexport.vim')
5998a7d6542SBram Moolenaar
600750802b5SBram Moolenaar  " Check that in a Vim9 script 'cpo' is set to the Vim default.
601750802b5SBram Moolenaar  set cpo&vi
602750802b5SBram Moolenaar  let cpo_before = &cpo
603750802b5SBram Moolenaar  let lines =<< trim END
604750802b5SBram Moolenaar    vim9script
605750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
606750802b5SBram Moolenaar  END
607750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
608750802b5SBram Moolenaar  source Xvim9_script
609750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
610750802b5SBram Moolenaar  set cpo&vim
611750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
612750802b5SBram Moolenaar  delete('Xvim9_script')
613750802b5SBram Moolenaarenddef
614750802b5SBram Moolenaar
615750802b5SBram Moolenaardef Test_vim9script_fails()
6168a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
6178a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
618750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
619f2d5c240SBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
620750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
621750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
622750802b5SBram Moolenaar
623750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
624750802b5SBram Moolenaar  assert_fails('export something', 'E1042')
6258a7d6542SBram Moolenaarenddef
6268a7d6542SBram Moolenaar
6278a7d6542SBram Moolenaardef Test_vim9script_call()
6288a7d6542SBram Moolenaar  let lines =<< trim END
6298a7d6542SBram Moolenaar    vim9script
6308a7d6542SBram Moolenaar    let var = ''
6318a7d6542SBram Moolenaar    def MyFunc(arg: string)
6328a7d6542SBram Moolenaar       var = arg
6338a7d6542SBram Moolenaar    enddef
6348a7d6542SBram Moolenaar    MyFunc('foobar')
6358a7d6542SBram Moolenaar    assert_equal('foobar', var)
6368a7d6542SBram Moolenaar
6378a7d6542SBram Moolenaar    let str = 'barfoo'
6388a7d6542SBram Moolenaar    str->MyFunc()
6398a7d6542SBram Moolenaar    assert_equal('barfoo', var)
6408a7d6542SBram Moolenaar
6418a7d6542SBram Moolenaar    let g:value = 'value'
6428a7d6542SBram Moolenaar    g:value->MyFunc()
6438a7d6542SBram Moolenaar    assert_equal('value', var)
6448a7d6542SBram Moolenaar
6458a7d6542SBram Moolenaar    let listvar = []
6468a7d6542SBram Moolenaar    def ListFunc(arg: list<number>)
6478a7d6542SBram Moolenaar       listvar = arg
6488a7d6542SBram Moolenaar    enddef
6498a7d6542SBram Moolenaar    [1, 2, 3]->ListFunc()
6508a7d6542SBram Moolenaar    assert_equal([1, 2, 3], listvar)
6518a7d6542SBram Moolenaar
6528a7d6542SBram Moolenaar    let dictvar = {}
6538a7d6542SBram Moolenaar    def DictFunc(arg: dict<number>)
6548a7d6542SBram Moolenaar       dictvar = arg
6558a7d6542SBram Moolenaar    enddef
6568a7d6542SBram Moolenaar    {'a': 1, 'b': 2}->DictFunc()
6578a7d6542SBram Moolenaar    assert_equal(#{a: 1, b: 2}, dictvar)
65833fa29cfSBram Moolenaar    def CompiledDict()
65933fa29cfSBram Moolenaar      {'a': 3, 'b': 4}->DictFunc()
66033fa29cfSBram Moolenaar    enddef
66133fa29cfSBram Moolenaar    CompiledDict()
66233fa29cfSBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
66333fa29cfSBram Moolenaar
6648a7d6542SBram Moolenaar    #{a: 3, b: 4}->DictFunc()
6658a7d6542SBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
6660c6ceaf9SBram Moolenaar
6670c6ceaf9SBram Moolenaar    ('text')->MyFunc()
6680c6ceaf9SBram Moolenaar    assert_equal('text', var)
6690c6ceaf9SBram Moolenaar    ("some")->MyFunc()
6700c6ceaf9SBram Moolenaar    assert_equal('some', var)
6718a7d6542SBram Moolenaar  END
6728a7d6542SBram Moolenaar  writefile(lines, 'Xcall.vim')
6738a7d6542SBram Moolenaar  source Xcall.vim
6748a7d6542SBram Moolenaar  delete('Xcall.vim')
6758a7d6542SBram Moolenaarenddef
6768a7d6542SBram Moolenaar
6778a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl()
6788a7d6542SBram Moolenaar  let lines =<< trim END
6798a7d6542SBram Moolenaar    vim9script
6808a7d6542SBram Moolenaar    let var = ''
6818a7d6542SBram Moolenaar    def MyFunc(arg: string)
6828a7d6542SBram Moolenaar       let var = 123
6838a7d6542SBram Moolenaar    enddef
6848a7d6542SBram Moolenaar  END
6858a7d6542SBram Moolenaar  writefile(lines, 'Xcall_decl.vim')
6868a7d6542SBram Moolenaar  assert_fails('source Xcall_decl.vim', 'E1054:')
6878a7d6542SBram Moolenaar  delete('Xcall_decl.vim')
6888a7d6542SBram Moolenaarenddef
6898a7d6542SBram Moolenaar
6908a7d6542SBram Moolenaardef Test_vim9script_call_fail_const()
6918a7d6542SBram Moolenaar  let lines =<< trim END
6928a7d6542SBram Moolenaar    vim9script
6938a7d6542SBram Moolenaar    const var = ''
6948a7d6542SBram Moolenaar    def MyFunc(arg: string)
6958a7d6542SBram Moolenaar       var = 'asdf'
6968a7d6542SBram Moolenaar    enddef
6978a7d6542SBram Moolenaar  END
6988a7d6542SBram Moolenaar  writefile(lines, 'Xcall_const.vim')
6998a7d6542SBram Moolenaar  assert_fails('source Xcall_const.vim', 'E46:')
7008a7d6542SBram Moolenaar  delete('Xcall_const.vim')
7018a7d6542SBram Moolenaarenddef
7028a7d6542SBram Moolenaar
7038a7d6542SBram Moolenaardef Test_vim9script_reload()
7048a7d6542SBram Moolenaar  let lines =<< trim END
7058a7d6542SBram Moolenaar    vim9script
7068a7d6542SBram Moolenaar    const var = ''
7078a7d6542SBram Moolenaar    let valone = 1234
7088a7d6542SBram Moolenaar    def MyFunc(arg: string)
7098a7d6542SBram Moolenaar       valone = 5678
7108a7d6542SBram Moolenaar    enddef
7118a7d6542SBram Moolenaar  END
7128a7d6542SBram Moolenaar  let morelines =<< trim END
7138a7d6542SBram Moolenaar    let valtwo = 222
7148a7d6542SBram Moolenaar    export def GetValtwo(): number
7158a7d6542SBram Moolenaar      return valtwo
7168a7d6542SBram Moolenaar    enddef
7178a7d6542SBram Moolenaar  END
7188a7d6542SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
7198a7d6542SBram Moolenaar  source Xreload.vim
7208a7d6542SBram Moolenaar  source Xreload.vim
7218a7d6542SBram Moolenaar  source Xreload.vim
7228a7d6542SBram Moolenaar
7238a7d6542SBram Moolenaar  let testlines =<< trim END
7248a7d6542SBram Moolenaar    vim9script
7258a7d6542SBram Moolenaar    def TheFunc()
7268a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
7278a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
7288a7d6542SBram Moolenaar    enddef
7298a7d6542SBram Moolenaar    TheFunc()
7308a7d6542SBram Moolenaar  END
7318a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
7328a7d6542SBram Moolenaar  source Ximport.vim
7338a7d6542SBram Moolenaar
7348a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
7358a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
7368a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
7378a7d6542SBram Moolenaar  source Xreload.vim
7388a7d6542SBram Moolenaar  source Ximport.vim
7398a7d6542SBram Moolenaar
7408a7d6542SBram Moolenaar  " cannot declare a var twice
7418a7d6542SBram Moolenaar  lines =<< trim END
7428a7d6542SBram Moolenaar    vim9script
7438a7d6542SBram Moolenaar    let valone = 1234
7448a7d6542SBram Moolenaar    let valone = 5678
7458a7d6542SBram Moolenaar  END
7468a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
7478a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
7488a7d6542SBram Moolenaar
7498a7d6542SBram Moolenaar  delete('Xreload.vim')
7508a7d6542SBram Moolenaar  delete('Ximport.vim')
7518a7d6542SBram Moolenaarenddef
7528a7d6542SBram Moolenaar
7538a7d6542SBram Moolenaardef Test_import_absolute()
7548a7d6542SBram Moolenaar  let import_lines = [
7558a7d6542SBram Moolenaar        \ 'vim9script',
7568a7d6542SBram Moolenaar        \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
757b283a8a6SBram Moolenaar        \ 'def UseExported()',
7588a7d6542SBram Moolenaar        \ '  g:imported_abs = exported',
7594e12a5dfSBram Moolenaar        \ '  exported = 8888',
7604e12a5dfSBram Moolenaar        \ '  g:imported_after = exported',
761b283a8a6SBram Moolenaar        \ 'enddef',
762b283a8a6SBram Moolenaar        \ 'UseExported()',
7634e12a5dfSBram Moolenaar        \ 'g:import_disassembled = execute("disass UseExported")',
7648a7d6542SBram Moolenaar        \ ]
7658a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
7668a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
7678a7d6542SBram Moolenaar
7688a7d6542SBram Moolenaar  source Ximport_abs.vim
7698a7d6542SBram Moolenaar
7708a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
7714e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
772b283a8a6SBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*'
773b283a8a6SBram Moolenaar        \ .. 'g:imported_abs = exported.*'
774b283a8a6SBram Moolenaar        \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
7754e12a5dfSBram Moolenaar        \ .. '1 STOREG g:imported_abs.*'
7764e12a5dfSBram Moolenaar        \ .. 'exported = 8888.*'
7774e12a5dfSBram Moolenaar        \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
7784e12a5dfSBram Moolenaar        \ .. 'g:imported_after = exported.*'
7794e12a5dfSBram Moolenaar        \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
7804e12a5dfSBram Moolenaar        \ .. '5 STOREG g:imported_after.*'
7814e12a5dfSBram Moolenaar        \, g:import_disassembled)
7828a7d6542SBram Moolenaar  unlet g:imported_abs
7834e12a5dfSBram Moolenaar  unlet g:import_disassembled
7848a7d6542SBram Moolenaar
7858a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
7868a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
7878a7d6542SBram Moolenaarenddef
7888a7d6542SBram Moolenaar
7898a7d6542SBram Moolenaardef Test_import_rtp()
7908a7d6542SBram Moolenaar  let import_lines = [
7918a7d6542SBram Moolenaar        \ 'vim9script',
7928a7d6542SBram Moolenaar        \ 'import exported from "Xexport_rtp.vim"',
7938a7d6542SBram Moolenaar        \ 'g:imported_rtp = exported',
7948a7d6542SBram Moolenaar        \ ]
7958a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
7968a7d6542SBram Moolenaar  mkdir('import')
7978a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
7988a7d6542SBram Moolenaar
7998a7d6542SBram Moolenaar  let save_rtp = &rtp
8008a7d6542SBram Moolenaar  &rtp = getcwd()
8018a7d6542SBram Moolenaar  source Ximport_rtp.vim
8028a7d6542SBram Moolenaar  &rtp = save_rtp
8038a7d6542SBram Moolenaar
8048a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
8058a7d6542SBram Moolenaar  unlet g:imported_rtp
8068a7d6542SBram Moolenaar
8078a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
8088a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
8098a7d6542SBram Moolenaar  delete('import', 'd')
8108a7d6542SBram Moolenaarenddef
8118a7d6542SBram Moolenaar
8128a7d6542SBram Moolenaardef Test_fixed_size_list()
8138a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
8148a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
8158a7d6542SBram Moolenaar  l->remove(0)
8168a7d6542SBram Moolenaar  l->add(5)
8178a7d6542SBram Moolenaar  l->insert(99, 1)
8180f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
8198a7d6542SBram Moolenaarenddef
8208a7d6542SBram Moolenaar
821673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not
822673660abSBram Moolenaar" recognized.
823673660abSBram Moolenaarfunc Test_function_python()
824673660abSBram Moolenaar  CheckFeature python3
825673660abSBram Moolenaar  let py = 'python3'
826673660abSBram Moolenaar  execute py "<< EOF"
827673660abSBram Moolenaardef do_something():
828673660abSBram Moolenaar  return 1
829673660abSBram MoolenaarEOF
830673660abSBram Moolenaarendfunc
831673660abSBram Moolenaar
832158906cfSBram Moolenaardef IfElse(what: number): string
833158906cfSBram Moolenaar  let res = ''
834158906cfSBram Moolenaar  if what == 1
835158906cfSBram Moolenaar    res = "one"
836158906cfSBram Moolenaar  elseif what == 2
837158906cfSBram Moolenaar    res = "two"
838a259d8d3SBram Moolenaar  else
839158906cfSBram Moolenaar    res = "three"
840a259d8d3SBram Moolenaar  endif
841158906cfSBram Moolenaar  return res
842a259d8d3SBram Moolenaarenddef
843a259d8d3SBram Moolenaar
844158906cfSBram Moolenaardef Test_if_elseif_else()
845158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
846158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
847158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
8480f18b6d1SBram Moolenaarenddef
8490f18b6d1SBram Moolenaar
8506d69bf60SBram Moolenaarlet g:bool_true = v:true
8516d69bf60SBram Moolenaarlet g:bool_false = v:false
8526d69bf60SBram Moolenaar
8536d69bf60SBram Moolenaardef Test_if_const_expr()
8546d69bf60SBram Moolenaar  let res = false
8556d69bf60SBram Moolenaar  if true ? true : false
8566d69bf60SBram Moolenaar    res = true
8576d69bf60SBram Moolenaar  endif
8586d69bf60SBram Moolenaar  assert_equal(true, res)
8596d69bf60SBram Moolenaar
8606d69bf60SBram Moolenaar  res = false
8616d69bf60SBram Moolenaar  if g:bool_true ? true : false
8626d69bf60SBram Moolenaar    res = true
8636d69bf60SBram Moolenaar  endif
8646d69bf60SBram Moolenaar  assert_equal(true, res)
8656d69bf60SBram Moolenaar
8666d69bf60SBram Moolenaar  res = false
8676d69bf60SBram Moolenaar  if true ? g:bool_true : false
8686d69bf60SBram Moolenaar    res = true
8696d69bf60SBram Moolenaar  endif
8706d69bf60SBram Moolenaar  assert_equal(true, res)
8716d69bf60SBram Moolenaar
8726d69bf60SBram Moolenaar  res = false
8736d69bf60SBram Moolenaar  if true ? true : g:bool_false
8746d69bf60SBram Moolenaar    res = true
8756d69bf60SBram Moolenaar  endif
8766d69bf60SBram Moolenaar  assert_equal(true, res)
8776d69bf60SBram Moolenaar
8786d69bf60SBram Moolenaar  res = false
8796d69bf60SBram Moolenaar  if true ? false : true
8806d69bf60SBram Moolenaar    res = true
8816d69bf60SBram Moolenaar  endif
8826d69bf60SBram Moolenaar  assert_equal(false, res)
8836d69bf60SBram Moolenaar
8846d69bf60SBram Moolenaar  res = false
8856d69bf60SBram Moolenaar  if false ? false : true
8866d69bf60SBram Moolenaar    res = true
8876d69bf60SBram Moolenaar  endif
8886d69bf60SBram Moolenaar  assert_equal(true, res)
8896d69bf60SBram Moolenaar
8906d69bf60SBram Moolenaar  res = false
8916d69bf60SBram Moolenaar  if false ? true : false
8926d69bf60SBram Moolenaar    res = true
8936d69bf60SBram Moolenaar  endif
8946d69bf60SBram Moolenaar  assert_equal(false, res)
8956d69bf60SBram Moolenaar
8966d69bf60SBram Moolenaar  res = false
8976d69bf60SBram Moolenaar  if true && true
8986d69bf60SBram Moolenaar    res = true
8996d69bf60SBram Moolenaar  endif
9006d69bf60SBram Moolenaar  assert_equal(true, res)
9016d69bf60SBram Moolenaar
9026d69bf60SBram Moolenaar  res = false
9036d69bf60SBram Moolenaar  if true && false
9046d69bf60SBram Moolenaar    res = true
9056d69bf60SBram Moolenaar  endif
9066d69bf60SBram Moolenaar  assert_equal(false, res)
9076d69bf60SBram Moolenaar
9086d69bf60SBram Moolenaar  res = false
9096d69bf60SBram Moolenaar  if g:bool_true && false
9106d69bf60SBram Moolenaar    res = true
9116d69bf60SBram Moolenaar  endif
9126d69bf60SBram Moolenaar  assert_equal(false, res)
9136d69bf60SBram Moolenaar
9146d69bf60SBram Moolenaar  res = false
9156d69bf60SBram Moolenaar  if true && g:bool_false
9166d69bf60SBram Moolenaar    res = true
9176d69bf60SBram Moolenaar  endif
9186d69bf60SBram Moolenaar  assert_equal(false, res)
9196d69bf60SBram Moolenaar
9206d69bf60SBram Moolenaar  res = false
9216d69bf60SBram Moolenaar  if false && false
9226d69bf60SBram Moolenaar    res = true
9236d69bf60SBram Moolenaar  endif
9246d69bf60SBram Moolenaar  assert_equal(false, res)
9256d69bf60SBram Moolenaar
9266d69bf60SBram Moolenaar  res = false
9276d69bf60SBram Moolenaar  if true || false
9286d69bf60SBram Moolenaar    res = true
9296d69bf60SBram Moolenaar  endif
9306d69bf60SBram Moolenaar  assert_equal(true, res)
9316d69bf60SBram Moolenaar
9326d69bf60SBram Moolenaar  res = false
9336d69bf60SBram Moolenaar  if g:bool_true || false
9346d69bf60SBram Moolenaar    res = true
9356d69bf60SBram Moolenaar  endif
9366d69bf60SBram Moolenaar  assert_equal(true, res)
9376d69bf60SBram Moolenaar
9386d69bf60SBram Moolenaar  res = false
9396d69bf60SBram Moolenaar  if true || g:bool_false
9406d69bf60SBram Moolenaar    res = true
9416d69bf60SBram Moolenaar  endif
9426d69bf60SBram Moolenaar  assert_equal(true, res)
9436d69bf60SBram Moolenaar
9446d69bf60SBram Moolenaar  res = false
9456d69bf60SBram Moolenaar  if false || false
9466d69bf60SBram Moolenaar    res = true
9476d69bf60SBram Moolenaar  endif
9486d69bf60SBram Moolenaar  assert_equal(false, res)
9496d69bf60SBram Moolenaar
9506d69bf60SBram Moolenaarenddef
9516d69bf60SBram Moolenaar
95263ce4849SBram Moolenaardef Test_delfunc()
95363ce4849SBram Moolenaar  let lines =<< trim END
95463ce4849SBram Moolenaar    vim9script
95563ce4849SBram Moolenaar    def GoneSoon()
95663ce4849SBram Moolenaar      echo 'hello'
95763ce4849SBram Moolenaar    enddef
95863ce4849SBram Moolenaar
95963ce4849SBram Moolenaar    def CallGoneSoon()
96063ce4849SBram Moolenaar      GoneSoon()
96163ce4849SBram Moolenaar    enddef
96263ce4849SBram Moolenaar
96363ce4849SBram Moolenaar    delfunc GoneSoon
96463ce4849SBram Moolenaar    CallGoneSoon()
96563ce4849SBram Moolenaar  END
96663ce4849SBram Moolenaar  writefile(lines, 'XToDelFunc')
96763ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
96863ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
96963ce4849SBram Moolenaar
97063ce4849SBram Moolenaar  delete('XToDelFunc')
97163ce4849SBram Moolenaarenddef
97263ce4849SBram Moolenaar
973ad39c094SBram Moolenaardef Test_execute_cmd()
974ad39c094SBram Moolenaar  new
975ad39c094SBram Moolenaar  setline(1, 'default')
976ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
977ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
978ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
979ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
980ad39c094SBram Moolenaar  execute cmd1 cmd2
981ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
982ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
983ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
984ad39c094SBram Moolenaar  let cmd_first = 'call '
985ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
986ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
987ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
988ad39c094SBram Moolenaar  bwipe!
989ad39c094SBram Moolenaarenddef
990ad39c094SBram Moolenaar
991ad39c094SBram Moolenaardef Test_echo_cmd()
992ad39c094SBram Moolenaar  echo 'something'
993ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
994ad39c094SBram Moolenaar
995ad39c094SBram Moolenaar  let str1 = 'some'
996ad39c094SBram Moolenaar  let str2 = 'more'
997ad39c094SBram Moolenaar  echo str1 str2
998ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
999ad39c094SBram Moolenaarenddef
1000ad39c094SBram Moolenaar
100141fe0617SBram Moolenaardef Test_for_outside_of_function()
100241fe0617SBram Moolenaar  let lines =<< trim END
100341fe0617SBram Moolenaar    vim9script
100441fe0617SBram Moolenaar    new
100541fe0617SBram Moolenaar    for var in range(0, 3)
100641fe0617SBram Moolenaar      append(line('$'), var)
100741fe0617SBram Moolenaar    endfor
100841fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
100941fe0617SBram Moolenaar    bwipe!
101041fe0617SBram Moolenaar  END
101141fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
101241fe0617SBram Moolenaar  source Xvim9for.vim
101341fe0617SBram Moolenaar  delete('Xvim9for.vim')
101441fe0617SBram Moolenaarenddef
10158a7d6542SBram Moolenaar
1016d0df1aacSBram Moolenaardef Test_while_loop()
1017d0df1aacSBram Moolenaar  let result = ''
1018d0df1aacSBram Moolenaar  let cnt = 0
1019d0df1aacSBram Moolenaar  while cnt < 555
1020d0df1aacSBram Moolenaar    if cnt == 3
1021d0df1aacSBram Moolenaar      break
1022d0df1aacSBram Moolenaar    endif
1023d0df1aacSBram Moolenaar    cnt += 1
1024d0df1aacSBram Moolenaar    if cnt == 2
1025d0df1aacSBram Moolenaar      continue
1026d0df1aacSBram Moolenaar    endif
1027d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1028d0df1aacSBram Moolenaar  endwhile
1029d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1030d0df1aacSBram Moolenaarenddef
1031d0df1aacSBram Moolenaar
10329645e2d9SBram Moolenaardef Test_interrupt_loop()
103397acfc78SBram Moolenaar  let caught = false
10349645e2d9SBram Moolenaar  let x = 0
103597acfc78SBram Moolenaar  try
10369645e2d9SBram Moolenaar    while 1
10379645e2d9SBram Moolenaar      x += 1
10389645e2d9SBram Moolenaar      if x == 100
10399645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
10409645e2d9SBram Moolenaar      endif
10419645e2d9SBram Moolenaar    endwhile
104297acfc78SBram Moolenaar  catch
104397acfc78SBram Moolenaar    caught = true
104497acfc78SBram Moolenaar    assert_equal(100, x)
104597acfc78SBram Moolenaar  endtry
104697acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
10479645e2d9SBram Moolenaarenddef
104820431c9dSBram Moolenaar
1049d0df1aacSBram Moolenaardef Test_substitute_cmd()
1050d0df1aacSBram Moolenaar  new
1051d0df1aacSBram Moolenaar  setline(1, 'something')
1052d0df1aacSBram Moolenaar  :substitute(some(other(
1053d0df1aacSBram Moolenaar  assert_equal('otherthing', getline(1))
1054d0df1aacSBram Moolenaar  bwipe!
1055d0df1aacSBram Moolenaar
1056d0df1aacSBram Moolenaar  " also when the context is Vim9 script
1057d0df1aacSBram Moolenaar  let lines =<< trim END
1058d0df1aacSBram Moolenaar    vim9script
1059d0df1aacSBram Moolenaar    new
1060d0df1aacSBram Moolenaar    setline(1, 'something')
1061d0df1aacSBram Moolenaar    :substitute(some(other(
1062d0df1aacSBram Moolenaar    assert_equal('otherthing', getline(1))
1063d0df1aacSBram Moolenaar    bwipe!
1064d0df1aacSBram Moolenaar  END
1065d0df1aacSBram Moolenaar  writefile(lines, 'Xvim9lines')
1066d0df1aacSBram Moolenaar  source Xvim9lines
1067d0df1aacSBram Moolenaar
1068d0df1aacSBram Moolenaar  delete('Xvim9lines')
1069d0df1aacSBram Moolenaarenddef
1070d0df1aacSBram Moolenaar
107120431c9dSBram Moolenaardef Test_redef_failure()
107220431c9dSBram Moolenaar  call writefile(['def Func0(): string',  'return "Func0"', 'enddef'], 'Xdef')
107320431c9dSBram Moolenaar  so Xdef
107420431c9dSBram Moolenaar  call writefile(['def Func1(): string',  'return "Func1"', 'enddef'], 'Xdef')
107520431c9dSBram Moolenaar  so Xdef
107620431c9dSBram Moolenaar  call writefile(['def! Func0(): string', 'enddef'], 'Xdef')
107720431c9dSBram Moolenaar  call assert_fails('so Xdef', 'E1027:')
107820431c9dSBram Moolenaar  call writefile(['def Func2(): string',  'return "Func2"', 'enddef'], 'Xdef')
107920431c9dSBram Moolenaar  so Xdef
108020431c9dSBram Moolenaar  call delete('Xdef')
108120431c9dSBram Moolenaar
108220431c9dSBram Moolenaar  call assert_equal(0, Func0())
108320431c9dSBram Moolenaar  call assert_equal('Func1', Func1())
108420431c9dSBram Moolenaar  call assert_equal('Func2', Func2())
108520431c9dSBram Moolenaar
108620431c9dSBram Moolenaar  delfunc! Func0
108720431c9dSBram Moolenaar  delfunc! Func1
108820431c9dSBram Moolenaar  delfunc! Func2
108920431c9dSBram Moolenaarenddef
109020431c9dSBram Moolenaar
10917d941ee0SBram Moolenaar" Test for internal functions returning different types
10927d941ee0SBram Moolenaarfunc Test_InternalFuncRetType()
10937d941ee0SBram Moolenaar  let lines =<< trim END
10947d941ee0SBram Moolenaar    def RetFloat(): float
10957d941ee0SBram Moolenaar      return ceil(1.456)
10967d941ee0SBram Moolenaar    enddef
10977d941ee0SBram Moolenaar
10987d941ee0SBram Moolenaar    def RetListAny(): list<any>
10997d941ee0SBram Moolenaar      return items({'k' : 'v'})
11007d941ee0SBram Moolenaar    enddef
11017d941ee0SBram Moolenaar
11027d941ee0SBram Moolenaar    def RetListString(): list<string>
11037d941ee0SBram Moolenaar      return split('a:b:c', ':')
11047d941ee0SBram Moolenaar    enddef
11057d941ee0SBram Moolenaar
11067d941ee0SBram Moolenaar    def RetListDictAny(): list<dict<any>>
11077d941ee0SBram Moolenaar      return getbufinfo()
11087d941ee0SBram Moolenaar    enddef
11097d941ee0SBram Moolenaar
11107d941ee0SBram Moolenaar    def RetDictNumber(): dict<number>
11117d941ee0SBram Moolenaar      return wordcount()
11127d941ee0SBram Moolenaar    enddef
11137d941ee0SBram Moolenaar
11147d941ee0SBram Moolenaar    def RetDictString(): dict<string>
11157d941ee0SBram Moolenaar      return environ()
11167d941ee0SBram Moolenaar    enddef
11177d941ee0SBram Moolenaar  END
11187d941ee0SBram Moolenaar  call writefile(lines, 'Xscript')
11197d941ee0SBram Moolenaar  source Xscript
11207d941ee0SBram Moolenaar
11217d941ee0SBram Moolenaar  call assert_equal(2.0, RetFloat())
11227d941ee0SBram Moolenaar  call assert_equal([['k', 'v']], RetListAny())
11237d941ee0SBram Moolenaar  call assert_equal(['a', 'b', 'c'], RetListString())
11247d941ee0SBram Moolenaar  call assert_notequal([], RetListDictAny())
11257d941ee0SBram Moolenaar  call assert_notequal({}, RetDictNumber())
11267d941ee0SBram Moolenaar  call assert_notequal({}, RetDictString())
11277d941ee0SBram Moolenaar  call delete('Xscript')
11287d941ee0SBram Moolenaarendfunc
11297d941ee0SBram Moolenaar
11307d941ee0SBram Moolenaar" Test for passing too many or too few arguments to internal functions
11317d941ee0SBram Moolenaarfunc Test_internalfunc_arg_error()
11327d941ee0SBram Moolenaar  let l =<< trim END
11337d941ee0SBram Moolenaar    def! FArgErr(): float
11347d941ee0SBram Moolenaar      return ceil(1.1, 2)
11357d941ee0SBram Moolenaar    enddef
11367d941ee0SBram Moolenaar  END
11377d941ee0SBram Moolenaar  call writefile(l, 'Xinvalidarg')
11387d941ee0SBram Moolenaar  call assert_fails('so Xinvalidarg', 'E118:')
11397d941ee0SBram Moolenaar  let l =<< trim END
11407d941ee0SBram Moolenaar    def! FArgErr(): float
11417d941ee0SBram Moolenaar      return ceil()
11427d941ee0SBram Moolenaar    enddef
11437d941ee0SBram Moolenaar  END
11447d941ee0SBram Moolenaar  call writefile(l, 'Xinvalidarg')
11457d941ee0SBram Moolenaar  call assert_fails('so Xinvalidarg', 'E119:')
11467d941ee0SBram Moolenaar  call delete('Xinvalidarg')
11477d941ee0SBram Moolenaarendfunc
11487d941ee0SBram Moolenaar
11498a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
1150