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
569be61bbbSBram Moolenaar  let a: number = 6
579be61bbbSBram Moolenaar  assert_equal(6, a)
589be61bbbSBram 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
1079be61bbbSBram Moolenaar  call CheckDefFailure(['let [a; b; c] = g:list'], 'E452:')
1089be61bbbSBram Moolenaar
1099be61bbbSBram Moolenaar  call CheckDefFailure(['let &option'], 'E1052:')
1109be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
1119be61bbbSBram Moolenaar
1129be61bbbSBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1065:')
1139be61bbbSBram Moolenaar
1149be61bbbSBram Moolenaar  call CheckDefFailure(['let @~ = 5'], 'E354:')
1159be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
1169be61bbbSBram Moolenaar
1179be61bbbSBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016:')
1189be61bbbSBram Moolenaar
1199be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
1209be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
1219be61bbbSBram 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:')
1639be61bbbSBram 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
1949be61bbbSBram 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
2009be61bbbSBram Moolenaarlet s:nothing = 0
2019be61bbbSBram Moolenaardef ReturnNothing()
2029be61bbbSBram Moolenaar  s:nothing = 1
2039be61bbbSBram Moolenaar  if true
2049be61bbbSBram Moolenaar    return
2059be61bbbSBram Moolenaar  endif
2069be61bbbSBram Moolenaar  s:nothing = 2
2079be61bbbSBram Moolenaarenddef
2089be61bbbSBram Moolenaar
2099be61bbbSBram Moolenaardef Test_return_nothing()
2109be61bbbSBram Moolenaar  ReturnNothing()
2119be61bbbSBram Moolenaar  assert_equal(1, s:nothing)
2129be61bbbSBram Moolenaarenddef
2139be61bbbSBram 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
263*bd5da371SBram Moolenaardef Test_call_wrong_args()
264b35efa5eSBram Moolenaar  call CheckDefFailure(['TakesOneArg()'], 'E119:')
265b35efa5eSBram Moolenaar  call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
266*bd5da371SBram Moolenaar  call CheckDefFailure(['bufnr(xxx)'], 'E1001:')
267b35efa5eSBram Moolenaarenddef
268b35efa5eSBram Moolenaar
269170fcfcfSBram Moolenaar" Default arg and varargs
270170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
271170fcfcfSBram Moolenaar  let res = one .. ',' .. two
272170fcfcfSBram Moolenaar  for s in rest
273170fcfcfSBram Moolenaar    res ..= ',' .. s
274170fcfcfSBram Moolenaar  endfor
275170fcfcfSBram Moolenaar  return res
276170fcfcfSBram Moolenaarenddef
277170fcfcfSBram Moolenaar
278170fcfcfSBram Moolenaardef Test_call_def_varargs()
279170fcfcfSBram Moolenaar  call assert_fails('call MyDefVarargs()', 'E119:')
280170fcfcfSBram Moolenaar  assert_equal('one,foo', MyDefVarargs('one'))
281170fcfcfSBram Moolenaar  assert_equal('one,two', MyDefVarargs('one', 'two'))
282170fcfcfSBram Moolenaar  assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
283170fcfcfSBram Moolenaarenddef
284170fcfcfSBram Moolenaar
28542a480bfSBram Moolenaardef Test_using_var_as_arg()
28642a480bfSBram Moolenaar  call writefile(['def Func(x: number)',  'let x = 234', 'enddef'], 'Xdef')
28742a480bfSBram Moolenaar  call assert_fails('so Xdef', 'E1006:')
28842a480bfSBram Moolenaar  call delete('Xdef')
28942a480bfSBram Moolenaarenddef
29042a480bfSBram Moolenaar
291b35efa5eSBram Moolenaardef Test_call_func_defined_later()
292b35efa5eSBram Moolenaar  call assert_equal('one', DefinedLater('one'))
293b35efa5eSBram Moolenaar  call assert_fails('call NotDefined("one")', 'E117:')
294b35efa5eSBram Moolenaarenddef
295170fcfcfSBram Moolenaar
296b35efa5eSBram Moolenaarfunc DefinedLater(arg)
29726e117e9SBram Moolenaar  return a:arg
29826e117e9SBram Moolenaarendfunc
29926e117e9SBram Moolenaar
3007eeefd4aSBram Moolenaardef FuncWithForwardCall()
3017eeefd4aSBram Moolenaar  return DefinedEvenLater("yes")
3027eeefd4aSBram Moolenaarenddef
3037eeefd4aSBram Moolenaar
3047eeefd4aSBram Moolenaardef DefinedEvenLater(arg: string): string
3057eeefd4aSBram Moolenaar  return arg
3067eeefd4aSBram Moolenaarenddef
3077eeefd4aSBram Moolenaar
3087eeefd4aSBram Moolenaardef Test_error_in_nested_function()
3097eeefd4aSBram Moolenaar  " Error in called function requires unwinding the call stack.
3107eeefd4aSBram Moolenaar  assert_fails('call FuncWithForwardCall()', 'E1029')
3117eeefd4aSBram Moolenaarenddef
3127eeefd4aSBram Moolenaar
3138a7d6542SBram Moolenaardef Test_return_type_wrong()
314978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
315978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
316978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
317978d170bSBram Moolenaar  CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
318cf3f8bf4SBram Moolenaar
3199be61bbbSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return', 'enddef'], 'E1003:')
3209be61bbbSBram Moolenaar
321cf3f8bf4SBram Moolenaar  CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:')
322cf3f8bf4SBram Moolenaar  CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:')
3238a7d6542SBram Moolenaarenddef
3248a7d6542SBram Moolenaar
325bfe12043SBram Moolenaardef Test_arg_type_wrong()
326bfe12043SBram Moolenaar  CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
327bfe12043SBram Moolenaarenddef
328bfe12043SBram Moolenaar
3298a7d6542SBram Moolenaardef Test_try_catch()
3308a7d6542SBram Moolenaar  let l = []
3318a7d6542SBram Moolenaar  try
3328a7d6542SBram Moolenaar    add(l, '1')
3338a7d6542SBram Moolenaar    throw 'wrong'
3348a7d6542SBram Moolenaar    add(l, '2')
3358a7d6542SBram Moolenaar  catch
3368a7d6542SBram Moolenaar    add(l, v:exception)
3378a7d6542SBram Moolenaar  finally
3388a7d6542SBram Moolenaar    add(l, '3')
3398a7d6542SBram Moolenaar  endtry
3408a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
3418a7d6542SBram Moolenaarenddef
3428a7d6542SBram Moolenaar
343257cc5eeSBram Moolenaardef ThrowFromDef()
344257cc5eeSBram Moolenaar  throw 'getout'
345257cc5eeSBram Moolenaarenddef
346257cc5eeSBram Moolenaar
347257cc5eeSBram Moolenaarfunc CatchInFunc()
348257cc5eeSBram Moolenaar  try
349257cc5eeSBram Moolenaar    call ThrowFromDef()
350257cc5eeSBram Moolenaar  catch
351257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
352257cc5eeSBram Moolenaar  endtry
353257cc5eeSBram Moolenaarendfunc
354257cc5eeSBram Moolenaar
355257cc5eeSBram Moolenaardef CatchInDef()
356257cc5eeSBram Moolenaar  try
357257cc5eeSBram Moolenaar    ThrowFromDef()
358257cc5eeSBram Moolenaar  catch
359257cc5eeSBram Moolenaar    g:thrown_def = v:exception
360257cc5eeSBram Moolenaar  endtry
361257cc5eeSBram Moolenaarenddef
362257cc5eeSBram Moolenaar
363f575adffSBram Moolenaardef ReturnFinally(): string
364f575adffSBram Moolenaar  try
365f575adffSBram Moolenaar    return 'intry'
366f575adffSBram Moolenaar  finally
367f575adffSBram Moolenaar    g:in_finally = 'finally'
368f575adffSBram Moolenaar  endtry
369f575adffSBram Moolenaar  return 'end'
370f575adffSBram Moolenaarenddef
371f575adffSBram Moolenaar
372257cc5eeSBram Moolenaardef Test_try_catch_nested()
373257cc5eeSBram Moolenaar  CatchInFunc()
374257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
375257cc5eeSBram Moolenaar
376257cc5eeSBram Moolenaar  CatchInDef()
377257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
378f575adffSBram Moolenaar
379f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
380f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
381f575adffSBram Moolenaarenddef
382f575adffSBram Moolenaar
383f575adffSBram Moolenaardef Test_try_catch_match()
384f575adffSBram Moolenaar  let seq = 'a'
385f575adffSBram Moolenaar  try
386f575adffSBram Moolenaar    throw 'something'
387f575adffSBram Moolenaar  catch /nothing/
388f575adffSBram Moolenaar    seq ..= 'x'
389f575adffSBram Moolenaar  catch /some/
390f575adffSBram Moolenaar    seq ..= 'b'
391f575adffSBram Moolenaar  catch /asdf/
392f575adffSBram Moolenaar    seq ..= 'x'
393f575adffSBram Moolenaar  finally
394f575adffSBram Moolenaar    seq ..= 'c'
395f575adffSBram Moolenaar  endtry
396f575adffSBram Moolenaar  assert_equal('abc', seq)
397257cc5eeSBram Moolenaarenddef
398257cc5eeSBram Moolenaar
3998a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
4008a7d6542SBram Moolenaar  vim9script
4018a7d6542SBram Moolenaar  let name: string = 'bob'
4028a7d6542SBram Moolenaar  def Concat(arg: string): string
4038a7d6542SBram Moolenaar    return name .. arg
4048a7d6542SBram Moolenaar  enddef
4058a7d6542SBram Moolenaar  let g:result = Concat('bie')
4068a7d6542SBram Moolenaar  let g:localname = name
4078a7d6542SBram Moolenaar
4088a7d6542SBram Moolenaar  export const CONST = 1234
4098a7d6542SBram Moolenaar  export let exported = 9876
4106e587dcbSBram Moolenaar  export let exp_name = 'John'
4118a7d6542SBram Moolenaar  export def Exported(): string
4128a7d6542SBram Moolenaar    return 'Exported'
4138a7d6542SBram Moolenaar  enddef
4148a7d6542SBram MoolenaarEND
4158a7d6542SBram Moolenaar
4165269bd2aSBram Moolenaardef Test_vim9_import_export()
4178a7d6542SBram Moolenaar  let import_script_lines =<< trim END
4188a7d6542SBram Moolenaar    vim9script
4198a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
4208a7d6542SBram Moolenaar    g:imported = exported
4216e587dcbSBram Moolenaar    exported += 3
4226e587dcbSBram Moolenaar    g:imported_added = exported
4238a7d6542SBram Moolenaar    g:imported_func = Exported()
4246e587dcbSBram Moolenaar
4256e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
4266e587dcbSBram Moolenaar    g:imported_name = exp_name
4276e587dcbSBram Moolenaar    exp_name ..= ' Doe'
4286e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
4295381c7a1SBram Moolenaar    g:imported_later = exported
4308a7d6542SBram Moolenaar  END
4318a7d6542SBram Moolenaar
4328a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
4338a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
4348a7d6542SBram Moolenaar
4358a7d6542SBram Moolenaar  source Ximport.vim
4368a7d6542SBram Moolenaar
4378a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
4388a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
4398a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
4406e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
4415381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
4428a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
4436e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
4446e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
4458a7d6542SBram Moolenaar  assert_false(exists('g:name'))
4468a7d6542SBram Moolenaar
4478a7d6542SBram Moolenaar  unlet g:result
4488a7d6542SBram Moolenaar  unlet g:localname
4498a7d6542SBram Moolenaar  unlet g:imported
4506e587dcbSBram Moolenaar  unlet g:imported_added
4515381c7a1SBram Moolenaar  unlet g:imported_later
4528a7d6542SBram Moolenaar  unlet g:imported_func
4536e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
4548a7d6542SBram Moolenaar  delete('Ximport.vim')
455f2d5c240SBram Moolenaar
4565381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
4575381c7a1SBram Moolenaar    vim9script
4585381c7a1SBram Moolenaar    def ImportInDef()
4595381c7a1SBram Moolenaar      import exported from './Xexport.vim'
4605381c7a1SBram Moolenaar      g:imported = exported
4615381c7a1SBram Moolenaar      exported += 7
4625381c7a1SBram Moolenaar      g:imported_added = exported
4635381c7a1SBram Moolenaar    enddef
4645381c7a1SBram Moolenaar    ImportInDef()
4655381c7a1SBram Moolenaar  END
4665381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
4675381c7a1SBram Moolenaar  source Ximport2.vim
4685381c7a1SBram Moolenaar  " TODO: this should be 9879
4695381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
4705381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
4715381c7a1SBram Moolenaar  unlet g:imported
4725381c7a1SBram Moolenaar  unlet g:imported_added
4735381c7a1SBram Moolenaar  delete('Ximport2.vim')
4745381c7a1SBram Moolenaar
475f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
476f2d5c240SBram Moolenaar    vim9script
477f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
478f2d5c240SBram Moolenaar    def UseExport()
479f2d5c240SBram Moolenaar      g:imported = Export.exported
480f2d5c240SBram Moolenaar    enddef
481f2d5c240SBram Moolenaar    UseExport()
482f2d5c240SBram Moolenaar  END
483f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
484f2d5c240SBram Moolenaar  source Ximport.vim
4855381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
486f2d5c240SBram Moolenaar
487599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
488599c89c8SBram Moolenaar    vim9script
489599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
490599c89c8SBram Moolenaar    def Func()
491599c89c8SBram Moolenaar      let dummy = 1
492599c89c8SBram Moolenaar      let imported = Export + dummy
493599c89c8SBram Moolenaar    enddef
494599c89c8SBram Moolenaar  END
495599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
496599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
497599c89c8SBram Moolenaar
498599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
499599c89c8SBram Moolenaar    vim9script
500599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
501599c89c8SBram Moolenaar    def Func()
502599c89c8SBram Moolenaar      let imported = Export . exported
503599c89c8SBram Moolenaar    enddef
504599c89c8SBram Moolenaar  END
505599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
506599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
507599c89c8SBram Moolenaar
508599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
509599c89c8SBram Moolenaar    vim9script
510599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
511599c89c8SBram Moolenaar    def Func()
512599c89c8SBram Moolenaar      let imported = Export.
513599c89c8SBram Moolenaar    enddef
514599c89c8SBram Moolenaar  END
515599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
516599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
517599c89c8SBram Moolenaar
518f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
519f2d5c240SBram Moolenaar    vim9script
520f2d5c240SBram Moolenaar    import * from './Xexport.vim'
521f2d5c240SBram Moolenaar    g:imported = exported
522f2d5c240SBram Moolenaar  END
523f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
524f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
525f2d5c240SBram Moolenaar
526fa29c8abSBram Moolenaar  " try to import something that exists but is not exported
527fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
528fa29c8abSBram Moolenaar    vim9script
529fa29c8abSBram Moolenaar    import name from './Xexport.vim'
530fa29c8abSBram Moolenaar  END
531fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
532fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
533fa29c8abSBram Moolenaar
5345269bd2aSBram Moolenaar  " try to import something that is already defined
5355269bd2aSBram Moolenaar  let import_already_defined =<< trim END
5365269bd2aSBram Moolenaar    vim9script
5375269bd2aSBram Moolenaar    let exported = 'something'
5385269bd2aSBram Moolenaar    import exported from './Xexport.vim'
5395269bd2aSBram Moolenaar  END
5405269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
5415269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
5425269bd2aSBram Moolenaar
5435269bd2aSBram Moolenaar  " try to import something that is already defined
5445269bd2aSBram Moolenaar  import_already_defined =<< trim END
5455269bd2aSBram Moolenaar    vim9script
5465269bd2aSBram Moolenaar    let exported = 'something'
5475269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
5485269bd2aSBram Moolenaar  END
5495269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
5505269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
5515269bd2aSBram Moolenaar
5525269bd2aSBram Moolenaar  " try to import something that is already defined
5535269bd2aSBram Moolenaar  import_already_defined =<< trim END
5545269bd2aSBram Moolenaar    vim9script
5555269bd2aSBram Moolenaar    let exported = 'something'
5565269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
5575269bd2aSBram Moolenaar  END
5585269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
5595269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
5605269bd2aSBram Moolenaar
561fa29c8abSBram Moolenaar  " import a very long name, requires making a copy
562fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
563fa29c8abSBram Moolenaar    vim9script
564fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
565fa29c8abSBram Moolenaar  END
566fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
567fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
568fa29c8abSBram Moolenaar
569fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
570fa29c8abSBram Moolenaar    vim9script
571fa29c8abSBram Moolenaar    import name './Xexport.vim'
572fa29c8abSBram Moolenaar  END
573fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
574fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
575fa29c8abSBram Moolenaar
576fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
577fa29c8abSBram Moolenaar    vim9script
578fa29c8abSBram Moolenaar    import name from Xexport.vim
579fa29c8abSBram Moolenaar  END
580fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
581fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
582fa29c8abSBram Moolenaar
583fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
584fa29c8abSBram Moolenaar    vim9script
585fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
586fa29c8abSBram Moolenaar  END
587fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
588fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
589fa29c8abSBram Moolenaar
590fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
591fa29c8abSBram Moolenaar    vim9script
592fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
593fa29c8abSBram Moolenaar  END
5945269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
5955269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
596fa29c8abSBram Moolenaar
597f2d5c240SBram Moolenaar  delete('Ximport.vim')
5985269bd2aSBram Moolenaar  delete('Ximport3.vim')
5998a7d6542SBram Moolenaar  delete('Xexport.vim')
6008a7d6542SBram Moolenaar
601750802b5SBram Moolenaar  " Check that in a Vim9 script 'cpo' is set to the Vim default.
602750802b5SBram Moolenaar  set cpo&vi
603750802b5SBram Moolenaar  let cpo_before = &cpo
604750802b5SBram Moolenaar  let lines =<< trim END
605750802b5SBram Moolenaar    vim9script
606750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
607750802b5SBram Moolenaar  END
608750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
609750802b5SBram Moolenaar  source Xvim9_script
610750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
611750802b5SBram Moolenaar  set cpo&vim
612750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
613750802b5SBram Moolenaar  delete('Xvim9_script')
614750802b5SBram Moolenaarenddef
615750802b5SBram Moolenaar
616750802b5SBram Moolenaardef Test_vim9script_fails()
6178a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
6188a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
619750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
620f2d5c240SBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
621750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
622750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
623750802b5SBram Moolenaar
624750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
625750802b5SBram Moolenaar  assert_fails('export something', 'E1042')
6268a7d6542SBram Moolenaarenddef
6278a7d6542SBram Moolenaar
6288a7d6542SBram Moolenaardef Test_vim9script_call()
6298a7d6542SBram Moolenaar  let lines =<< trim END
6308a7d6542SBram Moolenaar    vim9script
6318a7d6542SBram Moolenaar    let var = ''
6328a7d6542SBram Moolenaar    def MyFunc(arg: string)
6338a7d6542SBram Moolenaar       var = arg
6348a7d6542SBram Moolenaar    enddef
6358a7d6542SBram Moolenaar    MyFunc('foobar')
6368a7d6542SBram Moolenaar    assert_equal('foobar', var)
6378a7d6542SBram Moolenaar
6388a7d6542SBram Moolenaar    let str = 'barfoo'
6398a7d6542SBram Moolenaar    str->MyFunc()
6408a7d6542SBram Moolenaar    assert_equal('barfoo', var)
6418a7d6542SBram Moolenaar
6428a7d6542SBram Moolenaar    let g:value = 'value'
6438a7d6542SBram Moolenaar    g:value->MyFunc()
6448a7d6542SBram Moolenaar    assert_equal('value', var)
6458a7d6542SBram Moolenaar
6468a7d6542SBram Moolenaar    let listvar = []
6478a7d6542SBram Moolenaar    def ListFunc(arg: list<number>)
6488a7d6542SBram Moolenaar       listvar = arg
6498a7d6542SBram Moolenaar    enddef
6508a7d6542SBram Moolenaar    [1, 2, 3]->ListFunc()
6518a7d6542SBram Moolenaar    assert_equal([1, 2, 3], listvar)
6528a7d6542SBram Moolenaar
6538a7d6542SBram Moolenaar    let dictvar = {}
6548a7d6542SBram Moolenaar    def DictFunc(arg: dict<number>)
6558a7d6542SBram Moolenaar       dictvar = arg
6568a7d6542SBram Moolenaar    enddef
6578a7d6542SBram Moolenaar    {'a': 1, 'b': 2}->DictFunc()
6588a7d6542SBram Moolenaar    assert_equal(#{a: 1, b: 2}, dictvar)
65933fa29cfSBram Moolenaar    def CompiledDict()
66033fa29cfSBram Moolenaar      {'a': 3, 'b': 4}->DictFunc()
66133fa29cfSBram Moolenaar    enddef
66233fa29cfSBram Moolenaar    CompiledDict()
66333fa29cfSBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
66433fa29cfSBram Moolenaar
6658a7d6542SBram Moolenaar    #{a: 3, b: 4}->DictFunc()
6668a7d6542SBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
6670c6ceaf9SBram Moolenaar
6680c6ceaf9SBram Moolenaar    ('text')->MyFunc()
6690c6ceaf9SBram Moolenaar    assert_equal('text', var)
6700c6ceaf9SBram Moolenaar    ("some")->MyFunc()
6710c6ceaf9SBram Moolenaar    assert_equal('some', var)
6728a7d6542SBram Moolenaar  END
6738a7d6542SBram Moolenaar  writefile(lines, 'Xcall.vim')
6748a7d6542SBram Moolenaar  source Xcall.vim
6758a7d6542SBram Moolenaar  delete('Xcall.vim')
6768a7d6542SBram Moolenaarenddef
6778a7d6542SBram Moolenaar
6788a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl()
6798a7d6542SBram Moolenaar  let lines =<< trim END
6808a7d6542SBram Moolenaar    vim9script
6818a7d6542SBram Moolenaar    let var = ''
6828a7d6542SBram Moolenaar    def MyFunc(arg: string)
6838a7d6542SBram Moolenaar       let var = 123
6848a7d6542SBram Moolenaar    enddef
6858a7d6542SBram Moolenaar  END
6868a7d6542SBram Moolenaar  writefile(lines, 'Xcall_decl.vim')
6878a7d6542SBram Moolenaar  assert_fails('source Xcall_decl.vim', 'E1054:')
6888a7d6542SBram Moolenaar  delete('Xcall_decl.vim')
6898a7d6542SBram Moolenaarenddef
6908a7d6542SBram Moolenaar
6918a7d6542SBram Moolenaardef Test_vim9script_call_fail_const()
6928a7d6542SBram Moolenaar  let lines =<< trim END
6938a7d6542SBram Moolenaar    vim9script
6948a7d6542SBram Moolenaar    const var = ''
6958a7d6542SBram Moolenaar    def MyFunc(arg: string)
6968a7d6542SBram Moolenaar       var = 'asdf'
6978a7d6542SBram Moolenaar    enddef
6988a7d6542SBram Moolenaar  END
6998a7d6542SBram Moolenaar  writefile(lines, 'Xcall_const.vim')
7008a7d6542SBram Moolenaar  assert_fails('source Xcall_const.vim', 'E46:')
7018a7d6542SBram Moolenaar  delete('Xcall_const.vim')
7028a7d6542SBram Moolenaarenddef
7038a7d6542SBram Moolenaar
7048a7d6542SBram Moolenaardef Test_vim9script_reload()
7058a7d6542SBram Moolenaar  let lines =<< trim END
7068a7d6542SBram Moolenaar    vim9script
7078a7d6542SBram Moolenaar    const var = ''
7088a7d6542SBram Moolenaar    let valone = 1234
7098a7d6542SBram Moolenaar    def MyFunc(arg: string)
7108a7d6542SBram Moolenaar       valone = 5678
7118a7d6542SBram Moolenaar    enddef
7128a7d6542SBram Moolenaar  END
7138a7d6542SBram Moolenaar  let morelines =<< trim END
7148a7d6542SBram Moolenaar    let valtwo = 222
7158a7d6542SBram Moolenaar    export def GetValtwo(): number
7168a7d6542SBram Moolenaar      return valtwo
7178a7d6542SBram Moolenaar    enddef
7188a7d6542SBram Moolenaar  END
7198a7d6542SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
7208a7d6542SBram Moolenaar  source Xreload.vim
7218a7d6542SBram Moolenaar  source Xreload.vim
7228a7d6542SBram Moolenaar  source Xreload.vim
7238a7d6542SBram Moolenaar
7248a7d6542SBram Moolenaar  let testlines =<< trim END
7258a7d6542SBram Moolenaar    vim9script
7268a7d6542SBram Moolenaar    def TheFunc()
7278a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
7288a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
7298a7d6542SBram Moolenaar    enddef
7308a7d6542SBram Moolenaar    TheFunc()
7318a7d6542SBram Moolenaar  END
7328a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
7338a7d6542SBram Moolenaar  source Ximport.vim
7348a7d6542SBram Moolenaar
7358a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
7368a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
7378a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
7388a7d6542SBram Moolenaar  source Xreload.vim
7398a7d6542SBram Moolenaar  source Ximport.vim
7408a7d6542SBram Moolenaar
7418a7d6542SBram Moolenaar  " cannot declare a var twice
7428a7d6542SBram Moolenaar  lines =<< trim END
7438a7d6542SBram Moolenaar    vim9script
7448a7d6542SBram Moolenaar    let valone = 1234
7458a7d6542SBram Moolenaar    let valone = 5678
7468a7d6542SBram Moolenaar  END
7478a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
7488a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
7498a7d6542SBram Moolenaar
7508a7d6542SBram Moolenaar  delete('Xreload.vim')
7518a7d6542SBram Moolenaar  delete('Ximport.vim')
7528a7d6542SBram Moolenaarenddef
7538a7d6542SBram Moolenaar
7548a7d6542SBram Moolenaardef Test_import_absolute()
7558a7d6542SBram Moolenaar  let import_lines = [
7568a7d6542SBram Moolenaar        \ 'vim9script',
7578a7d6542SBram Moolenaar        \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
758b283a8a6SBram Moolenaar        \ 'def UseExported()',
7598a7d6542SBram Moolenaar        \ '  g:imported_abs = exported',
7604e12a5dfSBram Moolenaar        \ '  exported = 8888',
7614e12a5dfSBram Moolenaar        \ '  g:imported_after = exported',
762b283a8a6SBram Moolenaar        \ 'enddef',
763b283a8a6SBram Moolenaar        \ 'UseExported()',
7644e12a5dfSBram Moolenaar        \ 'g:import_disassembled = execute("disass UseExported")',
7658a7d6542SBram Moolenaar        \ ]
7668a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
7678a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
7688a7d6542SBram Moolenaar
7698a7d6542SBram Moolenaar  source Ximport_abs.vim
7708a7d6542SBram Moolenaar
7718a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
7724e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
773b283a8a6SBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*'
774b283a8a6SBram Moolenaar        \ .. 'g:imported_abs = exported.*'
775b283a8a6SBram Moolenaar        \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
7764e12a5dfSBram Moolenaar        \ .. '1 STOREG g:imported_abs.*'
7774e12a5dfSBram Moolenaar        \ .. 'exported = 8888.*'
7784e12a5dfSBram Moolenaar        \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
7794e12a5dfSBram Moolenaar        \ .. 'g:imported_after = exported.*'
7804e12a5dfSBram Moolenaar        \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
7814e12a5dfSBram Moolenaar        \ .. '5 STOREG g:imported_after.*'
7824e12a5dfSBram Moolenaar        \, g:import_disassembled)
7838a7d6542SBram Moolenaar  unlet g:imported_abs
7844e12a5dfSBram Moolenaar  unlet g:import_disassembled
7858a7d6542SBram Moolenaar
7868a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
7878a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
7888a7d6542SBram Moolenaarenddef
7898a7d6542SBram Moolenaar
7908a7d6542SBram Moolenaardef Test_import_rtp()
7918a7d6542SBram Moolenaar  let import_lines = [
7928a7d6542SBram Moolenaar        \ 'vim9script',
7938a7d6542SBram Moolenaar        \ 'import exported from "Xexport_rtp.vim"',
7948a7d6542SBram Moolenaar        \ 'g:imported_rtp = exported',
7958a7d6542SBram Moolenaar        \ ]
7968a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
7978a7d6542SBram Moolenaar  mkdir('import')
7988a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
7998a7d6542SBram Moolenaar
8008a7d6542SBram Moolenaar  let save_rtp = &rtp
8018a7d6542SBram Moolenaar  &rtp = getcwd()
8028a7d6542SBram Moolenaar  source Ximport_rtp.vim
8038a7d6542SBram Moolenaar  &rtp = save_rtp
8048a7d6542SBram Moolenaar
8058a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
8068a7d6542SBram Moolenaar  unlet g:imported_rtp
8078a7d6542SBram Moolenaar
8088a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
8098a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
8108a7d6542SBram Moolenaar  delete('import', 'd')
8118a7d6542SBram Moolenaarenddef
8128a7d6542SBram Moolenaar
8138a7d6542SBram Moolenaardef Test_fixed_size_list()
8148a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
8158a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
8168a7d6542SBram Moolenaar  l->remove(0)
8178a7d6542SBram Moolenaar  l->add(5)
8188a7d6542SBram Moolenaar  l->insert(99, 1)
8190f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
8208a7d6542SBram Moolenaarenddef
8218a7d6542SBram Moolenaar
822673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not
823673660abSBram Moolenaar" recognized.
824673660abSBram Moolenaarfunc Test_function_python()
825673660abSBram Moolenaar  CheckFeature python3
826673660abSBram Moolenaar  let py = 'python3'
827673660abSBram Moolenaar  execute py "<< EOF"
828673660abSBram Moolenaardef do_something():
829673660abSBram Moolenaar  return 1
830673660abSBram MoolenaarEOF
831673660abSBram Moolenaarendfunc
832673660abSBram Moolenaar
833158906cfSBram Moolenaardef IfElse(what: number): string
834158906cfSBram Moolenaar  let res = ''
835158906cfSBram Moolenaar  if what == 1
836158906cfSBram Moolenaar    res = "one"
837158906cfSBram Moolenaar  elseif what == 2
838158906cfSBram Moolenaar    res = "two"
839a259d8d3SBram Moolenaar  else
840158906cfSBram Moolenaar    res = "three"
841a259d8d3SBram Moolenaar  endif
842158906cfSBram Moolenaar  return res
843a259d8d3SBram Moolenaarenddef
844a259d8d3SBram Moolenaar
845158906cfSBram Moolenaardef Test_if_elseif_else()
846158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
847158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
848158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
8490f18b6d1SBram Moolenaarenddef
8500f18b6d1SBram Moolenaar
8516d69bf60SBram Moolenaarlet g:bool_true = v:true
8526d69bf60SBram Moolenaarlet g:bool_false = v:false
8536d69bf60SBram Moolenaar
8546d69bf60SBram Moolenaardef Test_if_const_expr()
8556d69bf60SBram Moolenaar  let res = false
8566d69bf60SBram Moolenaar  if true ? true : false
8576d69bf60SBram Moolenaar    res = true
8586d69bf60SBram Moolenaar  endif
8596d69bf60SBram Moolenaar  assert_equal(true, res)
8606d69bf60SBram Moolenaar
8616d69bf60SBram Moolenaar  res = false
8626d69bf60SBram Moolenaar  if g:bool_true ? true : false
8636d69bf60SBram Moolenaar    res = true
8646d69bf60SBram Moolenaar  endif
8656d69bf60SBram Moolenaar  assert_equal(true, res)
8666d69bf60SBram Moolenaar
8676d69bf60SBram Moolenaar  res = false
8686d69bf60SBram Moolenaar  if true ? g:bool_true : false
8696d69bf60SBram Moolenaar    res = true
8706d69bf60SBram Moolenaar  endif
8716d69bf60SBram Moolenaar  assert_equal(true, res)
8726d69bf60SBram Moolenaar
8736d69bf60SBram Moolenaar  res = false
8746d69bf60SBram Moolenaar  if true ? true : g:bool_false
8756d69bf60SBram Moolenaar    res = true
8766d69bf60SBram Moolenaar  endif
8776d69bf60SBram Moolenaar  assert_equal(true, res)
8786d69bf60SBram Moolenaar
8796d69bf60SBram Moolenaar  res = false
8806d69bf60SBram Moolenaar  if true ? false : true
8816d69bf60SBram Moolenaar    res = true
8826d69bf60SBram Moolenaar  endif
8836d69bf60SBram Moolenaar  assert_equal(false, res)
8846d69bf60SBram Moolenaar
8856d69bf60SBram Moolenaar  res = false
8866d69bf60SBram Moolenaar  if false ? false : true
8876d69bf60SBram Moolenaar    res = true
8886d69bf60SBram Moolenaar  endif
8896d69bf60SBram Moolenaar  assert_equal(true, res)
8906d69bf60SBram Moolenaar
8916d69bf60SBram Moolenaar  res = false
8926d69bf60SBram Moolenaar  if false ? true : false
8936d69bf60SBram Moolenaar    res = true
8946d69bf60SBram Moolenaar  endif
8956d69bf60SBram Moolenaar  assert_equal(false, res)
8966d69bf60SBram Moolenaar
8976d69bf60SBram Moolenaar  res = false
8986d69bf60SBram Moolenaar  if true && true
8996d69bf60SBram Moolenaar    res = true
9006d69bf60SBram Moolenaar  endif
9016d69bf60SBram Moolenaar  assert_equal(true, res)
9026d69bf60SBram Moolenaar
9036d69bf60SBram Moolenaar  res = false
9046d69bf60SBram Moolenaar  if true && false
9056d69bf60SBram Moolenaar    res = true
9066d69bf60SBram Moolenaar  endif
9076d69bf60SBram Moolenaar  assert_equal(false, res)
9086d69bf60SBram Moolenaar
9096d69bf60SBram Moolenaar  res = false
9106d69bf60SBram Moolenaar  if g:bool_true && false
9116d69bf60SBram Moolenaar    res = true
9126d69bf60SBram Moolenaar  endif
9136d69bf60SBram Moolenaar  assert_equal(false, res)
9146d69bf60SBram Moolenaar
9156d69bf60SBram Moolenaar  res = false
9166d69bf60SBram Moolenaar  if true && g:bool_false
9176d69bf60SBram Moolenaar    res = true
9186d69bf60SBram Moolenaar  endif
9196d69bf60SBram Moolenaar  assert_equal(false, res)
9206d69bf60SBram Moolenaar
9216d69bf60SBram Moolenaar  res = false
9226d69bf60SBram Moolenaar  if false && false
9236d69bf60SBram Moolenaar    res = true
9246d69bf60SBram Moolenaar  endif
9256d69bf60SBram Moolenaar  assert_equal(false, res)
9266d69bf60SBram Moolenaar
9276d69bf60SBram Moolenaar  res = false
9286d69bf60SBram Moolenaar  if true || false
9296d69bf60SBram Moolenaar    res = true
9306d69bf60SBram Moolenaar  endif
9316d69bf60SBram Moolenaar  assert_equal(true, res)
9326d69bf60SBram Moolenaar
9336d69bf60SBram Moolenaar  res = false
9346d69bf60SBram Moolenaar  if g:bool_true || false
9356d69bf60SBram Moolenaar    res = true
9366d69bf60SBram Moolenaar  endif
9376d69bf60SBram Moolenaar  assert_equal(true, res)
9386d69bf60SBram Moolenaar
9396d69bf60SBram Moolenaar  res = false
9406d69bf60SBram Moolenaar  if true || g:bool_false
9416d69bf60SBram Moolenaar    res = true
9426d69bf60SBram Moolenaar  endif
9436d69bf60SBram Moolenaar  assert_equal(true, res)
9446d69bf60SBram Moolenaar
9456d69bf60SBram Moolenaar  res = false
9466d69bf60SBram Moolenaar  if false || false
9476d69bf60SBram Moolenaar    res = true
9486d69bf60SBram Moolenaar  endif
9496d69bf60SBram Moolenaar  assert_equal(false, res)
9506d69bf60SBram Moolenaar
9516d69bf60SBram Moolenaarenddef
9526d69bf60SBram Moolenaar
95363ce4849SBram Moolenaardef Test_delfunc()
95463ce4849SBram Moolenaar  let lines =<< trim END
95563ce4849SBram Moolenaar    vim9script
95663ce4849SBram Moolenaar    def GoneSoon()
95763ce4849SBram Moolenaar      echo 'hello'
95863ce4849SBram Moolenaar    enddef
95963ce4849SBram Moolenaar
96063ce4849SBram Moolenaar    def CallGoneSoon()
96163ce4849SBram Moolenaar      GoneSoon()
96263ce4849SBram Moolenaar    enddef
96363ce4849SBram Moolenaar
96463ce4849SBram Moolenaar    delfunc GoneSoon
96563ce4849SBram Moolenaar    CallGoneSoon()
96663ce4849SBram Moolenaar  END
96763ce4849SBram Moolenaar  writefile(lines, 'XToDelFunc')
96863ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
96963ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
97063ce4849SBram Moolenaar
97163ce4849SBram Moolenaar  delete('XToDelFunc')
97263ce4849SBram Moolenaarenddef
97363ce4849SBram Moolenaar
974ad39c094SBram Moolenaardef Test_execute_cmd()
975ad39c094SBram Moolenaar  new
976ad39c094SBram Moolenaar  setline(1, 'default')
977ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
978ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
979ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
980ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
981ad39c094SBram Moolenaar  execute cmd1 cmd2
982ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
983ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
984ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
985ad39c094SBram Moolenaar  let cmd_first = 'call '
986ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
987ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
988ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
989ad39c094SBram Moolenaar  bwipe!
990ad39c094SBram Moolenaarenddef
991ad39c094SBram Moolenaar
992ad39c094SBram Moolenaardef Test_echo_cmd()
993ad39c094SBram Moolenaar  echo 'something'
994ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
995ad39c094SBram Moolenaar
996ad39c094SBram Moolenaar  let str1 = 'some'
997ad39c094SBram Moolenaar  let str2 = 'more'
998ad39c094SBram Moolenaar  echo str1 str2
999ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1000ad39c094SBram Moolenaarenddef
1001ad39c094SBram Moolenaar
100241fe0617SBram Moolenaardef Test_for_outside_of_function()
100341fe0617SBram Moolenaar  let lines =<< trim END
100441fe0617SBram Moolenaar    vim9script
100541fe0617SBram Moolenaar    new
100641fe0617SBram Moolenaar    for var in range(0, 3)
100741fe0617SBram Moolenaar      append(line('$'), var)
100841fe0617SBram Moolenaar    endfor
100941fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
101041fe0617SBram Moolenaar    bwipe!
101141fe0617SBram Moolenaar  END
101241fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
101341fe0617SBram Moolenaar  source Xvim9for.vim
101441fe0617SBram Moolenaar  delete('Xvim9for.vim')
101541fe0617SBram Moolenaarenddef
10168a7d6542SBram Moolenaar
1017d0df1aacSBram Moolenaardef Test_while_loop()
1018d0df1aacSBram Moolenaar  let result = ''
1019d0df1aacSBram Moolenaar  let cnt = 0
1020d0df1aacSBram Moolenaar  while cnt < 555
1021d0df1aacSBram Moolenaar    if cnt == 3
1022d0df1aacSBram Moolenaar      break
1023d0df1aacSBram Moolenaar    endif
1024d0df1aacSBram Moolenaar    cnt += 1
1025d0df1aacSBram Moolenaar    if cnt == 2
1026d0df1aacSBram Moolenaar      continue
1027d0df1aacSBram Moolenaar    endif
1028d0df1aacSBram Moolenaar    result ..= cnt .. '_'
1029d0df1aacSBram Moolenaar  endwhile
1030d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
1031d0df1aacSBram Moolenaarenddef
1032d0df1aacSBram Moolenaar
1033*bd5da371SBram Moolenaardef Test_for_loop_fails()
1034*bd5da371SBram Moolenaar  call CheckDefFailure(['for # in range(5)'], 'E690:')
1035*bd5da371SBram Moolenaar  call CheckDefFailure(['for i In range(5)'], 'E690:')
1036*bd5da371SBram Moolenaar  call CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
1037*bd5da371SBram Moolenaar  call CheckScriptFailure(['def Func(arg)', 'for arg in range(5)', 'enddef'], 'E1006:')
1038*bd5da371SBram Moolenaar  call CheckDefFailure(['for i in "text"'], 'E1024:')
1039*bd5da371SBram Moolenaarenddef
1040*bd5da371SBram Moolenaar
10419645e2d9SBram Moolenaardef Test_interrupt_loop()
104297acfc78SBram Moolenaar  let caught = false
10439645e2d9SBram Moolenaar  let x = 0
104497acfc78SBram Moolenaar  try
10459645e2d9SBram Moolenaar    while 1
10469645e2d9SBram Moolenaar      x += 1
10479645e2d9SBram Moolenaar      if x == 100
10489645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
10499645e2d9SBram Moolenaar      endif
10509645e2d9SBram Moolenaar    endwhile
105197acfc78SBram Moolenaar  catch
105297acfc78SBram Moolenaar    caught = true
105397acfc78SBram Moolenaar    assert_equal(100, x)
105497acfc78SBram Moolenaar  endtry
105597acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
10569645e2d9SBram Moolenaarenddef
105720431c9dSBram Moolenaar
1058d0df1aacSBram Moolenaardef Test_substitute_cmd()
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
1065d0df1aacSBram Moolenaar  " also when the context is Vim9 script
1066d0df1aacSBram Moolenaar  let lines =<< trim END
1067d0df1aacSBram Moolenaar    vim9script
1068d0df1aacSBram Moolenaar    new
1069d0df1aacSBram Moolenaar    setline(1, 'something')
1070d0df1aacSBram Moolenaar    :substitute(some(other(
1071d0df1aacSBram Moolenaar    assert_equal('otherthing', getline(1))
1072d0df1aacSBram Moolenaar    bwipe!
1073d0df1aacSBram Moolenaar  END
1074d0df1aacSBram Moolenaar  writefile(lines, 'Xvim9lines')
1075d0df1aacSBram Moolenaar  source Xvim9lines
1076d0df1aacSBram Moolenaar
1077d0df1aacSBram Moolenaar  delete('Xvim9lines')
1078d0df1aacSBram Moolenaarenddef
1079d0df1aacSBram Moolenaar
108020431c9dSBram Moolenaardef Test_redef_failure()
108120431c9dSBram Moolenaar  call writefile(['def Func0(): string',  'return "Func0"', 'enddef'], 'Xdef')
108220431c9dSBram Moolenaar  so Xdef
108320431c9dSBram Moolenaar  call writefile(['def Func1(): string',  'return "Func1"', 'enddef'], 'Xdef')
108420431c9dSBram Moolenaar  so Xdef
108520431c9dSBram Moolenaar  call writefile(['def! Func0(): string', 'enddef'], 'Xdef')
108620431c9dSBram Moolenaar  call assert_fails('so Xdef', 'E1027:')
108720431c9dSBram Moolenaar  call writefile(['def Func2(): string',  'return "Func2"', 'enddef'], 'Xdef')
108820431c9dSBram Moolenaar  so Xdef
108920431c9dSBram Moolenaar  call delete('Xdef')
109020431c9dSBram Moolenaar
109120431c9dSBram Moolenaar  call assert_equal(0, Func0())
109220431c9dSBram Moolenaar  call assert_equal('Func1', Func1())
109320431c9dSBram Moolenaar  call assert_equal('Func2', Func2())
109420431c9dSBram Moolenaar
109520431c9dSBram Moolenaar  delfunc! Func0
109620431c9dSBram Moolenaar  delfunc! Func1
109720431c9dSBram Moolenaar  delfunc! Func2
109820431c9dSBram Moolenaarenddef
109920431c9dSBram Moolenaar
11007d941ee0SBram Moolenaar" Test for internal functions returning different types
11017d941ee0SBram Moolenaarfunc Test_InternalFuncRetType()
11027d941ee0SBram Moolenaar  let lines =<< trim END
11037d941ee0SBram Moolenaar    def RetFloat(): float
11047d941ee0SBram Moolenaar      return ceil(1.456)
11057d941ee0SBram Moolenaar    enddef
11067d941ee0SBram Moolenaar
11077d941ee0SBram Moolenaar    def RetListAny(): list<any>
11087d941ee0SBram Moolenaar      return items({'k' : 'v'})
11097d941ee0SBram Moolenaar    enddef
11107d941ee0SBram Moolenaar
11117d941ee0SBram Moolenaar    def RetListString(): list<string>
11127d941ee0SBram Moolenaar      return split('a:b:c', ':')
11137d941ee0SBram Moolenaar    enddef
11147d941ee0SBram Moolenaar
11157d941ee0SBram Moolenaar    def RetListDictAny(): list<dict<any>>
11167d941ee0SBram Moolenaar      return getbufinfo()
11177d941ee0SBram Moolenaar    enddef
11187d941ee0SBram Moolenaar
11197d941ee0SBram Moolenaar    def RetDictNumber(): dict<number>
11207d941ee0SBram Moolenaar      return wordcount()
11217d941ee0SBram Moolenaar    enddef
11227d941ee0SBram Moolenaar
11237d941ee0SBram Moolenaar    def RetDictString(): dict<string>
11247d941ee0SBram Moolenaar      return environ()
11257d941ee0SBram Moolenaar    enddef
11267d941ee0SBram Moolenaar  END
11277d941ee0SBram Moolenaar  call writefile(lines, 'Xscript')
11287d941ee0SBram Moolenaar  source Xscript
11297d941ee0SBram Moolenaar
11307d941ee0SBram Moolenaar  call assert_equal(2.0, RetFloat())
11317d941ee0SBram Moolenaar  call assert_equal([['k', 'v']], RetListAny())
11327d941ee0SBram Moolenaar  call assert_equal(['a', 'b', 'c'], RetListString())
11337d941ee0SBram Moolenaar  call assert_notequal([], RetListDictAny())
11347d941ee0SBram Moolenaar  call assert_notequal({}, RetDictNumber())
11357d941ee0SBram Moolenaar  call assert_notequal({}, RetDictString())
11367d941ee0SBram Moolenaar  call delete('Xscript')
11377d941ee0SBram Moolenaarendfunc
11387d941ee0SBram Moolenaar
11397d941ee0SBram Moolenaar" Test for passing too many or too few arguments to internal functions
11407d941ee0SBram Moolenaarfunc Test_internalfunc_arg_error()
11417d941ee0SBram Moolenaar  let l =<< trim END
11427d941ee0SBram Moolenaar    def! FArgErr(): float
11437d941ee0SBram Moolenaar      return ceil(1.1, 2)
11447d941ee0SBram Moolenaar    enddef
11457d941ee0SBram Moolenaar  END
11467d941ee0SBram Moolenaar  call writefile(l, 'Xinvalidarg')
11477d941ee0SBram Moolenaar  call assert_fails('so Xinvalidarg', 'E118:')
11487d941ee0SBram Moolenaar  let l =<< trim END
11497d941ee0SBram Moolenaar    def! FArgErr(): float
11507d941ee0SBram Moolenaar      return ceil()
11517d941ee0SBram Moolenaar    enddef
11527d941ee0SBram Moolenaar  END
11537d941ee0SBram Moolenaar  call writefile(l, 'Xinvalidarg')
11547d941ee0SBram Moolenaar  call assert_fails('so Xinvalidarg', 'E119:')
11557d941ee0SBram Moolenaar  call delete('Xinvalidarg')
11567d941ee0SBram Moolenaarendfunc
11577d941ee0SBram Moolenaar
11588a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
1159