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
5642a480bfSBram Moolenaar  if has('channel')
5742a480bfSBram Moolenaar    let chan1: channel
58fbdd08edSBram Moolenaar    let job1: job
59f51cb4e0SBram Moolenaar    let job2: job = job_start('willfail')
6042a480bfSBram Moolenaar  endif
61fbdd08edSBram Moolenaar  if has('float')
62fbdd08edSBram Moolenaar    let float1: float = 3.4
63fbdd08edSBram Moolenaar  endif
64087d2e15SBram Moolenaar  let funky1: func
65087d2e15SBram Moolenaar  let funky2: func = function('len')
66087d2e15SBram Moolenaar  let party1: partial
67087d2e15SBram Moolenaar  let party2: partial = funcref('Test_syntax')
6842a480bfSBram Moolenaar
6961a6d4e4SBram Moolenaar  " type becomes list<any>
7061a6d4e4SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
715381c7a1SBram Moolenaar  " type becomes dict<any>
725381c7a1SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
7361a6d4e4SBram Moolenaar
74401d9ffbSBram Moolenaar  g:newvar = 'new'
75401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
76401d9ffbSBram Moolenaar
77401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
78401d9ffbSBram Moolenaar  g:existing = 'no'
79401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
80401d9ffbSBram Moolenaar
81b283a8a6SBram Moolenaar  v:char = 'abc'
826e587dcbSBram Moolenaar  assert_equal('abc', v:char)
83b283a8a6SBram Moolenaar
84b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
856e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
86b283a8a6SBram Moolenaar  $ENVVAR = ''
876e587dcbSBram Moolenaar
88fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
89fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
90fd1823e0SBram Moolenaar  s:addToMe += 222
91fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
920bbf722aSBram Moolenaar  s:newVar = 'new'
930bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
948a7d6542SBram Moolenaarenddef
958a7d6542SBram Moolenaar
968a7d6542SBram Moolenaarfunc Test_assignment_failure()
978a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
988a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
998a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
1008a7d6542SBram Moolenaar
1018a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
1028a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
1038a7d6542SBram Moolenaar
104*33fa29cfSBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:')
105*33fa29cfSBram Moolenaar
1068a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
1078a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
1088a7d6542SBram Moolenaar
1098a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
1108a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
1118a7d6542SBram Moolenaar
1128a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
1138a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
11442a480bfSBram Moolenaar
11542a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1007:')
11642a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
117599c89c8SBram Moolenaarendfunc
118599c89c8SBram Moolenaar
119599c89c8SBram Moolenaarfunc Test_wrong_type()
120599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
121599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
122599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
123599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
124599c89c8SBram Moolenaar
125599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
126599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
12742a480bfSBram Moolenaar
12842a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
12942a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
13042a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
13142a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
13242a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
13342a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
13442a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
13542a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
13642a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
13742a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
13842a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
1398a7d6542SBram Moolenaarendfunc
1408a7d6542SBram Moolenaar
1418a7d6542SBram Moolenaarfunc Test_const()
1428a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
1438a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
1448a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
1458a7d6542SBram Moolenaarendfunc
1468a7d6542SBram Moolenaar
1478a7d6542SBram Moolenaardef Test_block()
1488a7d6542SBram Moolenaar  let outer = 1
1498a7d6542SBram Moolenaar  {
1508a7d6542SBram Moolenaar    let inner = 2
1518a7d6542SBram Moolenaar    assert_equal(1, outer)
1528a7d6542SBram Moolenaar    assert_equal(2, inner)
1538a7d6542SBram Moolenaar  }
1548a7d6542SBram Moolenaar  assert_equal(1, outer)
1558a7d6542SBram Moolenaarenddef
1568a7d6542SBram Moolenaar
1578a7d6542SBram Moolenaarfunc Test_block_failure()
1588a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
1598a7d6542SBram Moolenaarendfunc
1608a7d6542SBram Moolenaar
1618a7d6542SBram Moolenaardef ReturnString(): string
1628a7d6542SBram Moolenaar  return 'string'
1638a7d6542SBram Moolenaarenddef
1648a7d6542SBram Moolenaar
1658a7d6542SBram Moolenaardef ReturnNumber(): number
1668a7d6542SBram Moolenaar  return 123
1678a7d6542SBram Moolenaarenddef
1688a7d6542SBram Moolenaar
16909f28f49SBram Moolenaarlet g:notNumber = 'string'
17009f28f49SBram Moolenaar
17109f28f49SBram Moolenaardef ReturnGlobal(): number
17209f28f49SBram Moolenaar  return g:notNumber
17309f28f49SBram Moolenaarenddef
17409f28f49SBram Moolenaar
1758a7d6542SBram Moolenaardef Test_return_string()
1768a7d6542SBram Moolenaar  assert_equal('string', ReturnString())
1778a7d6542SBram Moolenaar  assert_equal(123, ReturnNumber())
17809f28f49SBram Moolenaar  assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string')
1798a7d6542SBram Moolenaarenddef
1808a7d6542SBram Moolenaar
1818a7d6542SBram Moolenaarfunc Increment()
1828a7d6542SBram Moolenaar  let g:counter += 1
1838a7d6542SBram Moolenaarendfunc
1848a7d6542SBram Moolenaar
1858a7d6542SBram Moolenaardef Test_call_ufunc_count()
1868a7d6542SBram Moolenaar  g:counter = 1
1878a7d6542SBram Moolenaar  Increment()
1888a7d6542SBram Moolenaar  Increment()
1898a7d6542SBram Moolenaar  Increment()
1908a7d6542SBram Moolenaar  " works with and without :call
1918a7d6542SBram Moolenaar  assert_equal(4, g:counter)
192b283a8a6SBram Moolenaar  call assert_equal(4, g:counter)
1938a7d6542SBram Moolenaar  unlet g:counter
1948a7d6542SBram Moolenaarenddef
1958a7d6542SBram Moolenaar
1968a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string
1978a7d6542SBram Moolenaar  let res = arg
1988a7d6542SBram Moolenaar  for s in rest
1998a7d6542SBram Moolenaar    res ..= ',' .. s
2008a7d6542SBram Moolenaar  endfor
2018a7d6542SBram Moolenaar  return res
2028a7d6542SBram Moolenaarenddef
2038a7d6542SBram Moolenaar
2048a7d6542SBram Moolenaardef Test_call_varargs()
2058a7d6542SBram Moolenaar  assert_equal('one', MyVarargs('one'))
2068a7d6542SBram Moolenaar  assert_equal('one,two', MyVarargs('one', 'two'))
2078a7d6542SBram Moolenaar  assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
2088a7d6542SBram Moolenaarenddef
2098a7d6542SBram Moolenaar
210170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string
211170fcfcfSBram Moolenaar  return name
212170fcfcfSBram Moolenaarenddef
213170fcfcfSBram Moolenaar
214170fcfcfSBram Moolenaardef Test_call_default_args()
215170fcfcfSBram Moolenaar  assert_equal('string', MyDefaultArgs())
216170fcfcfSBram Moolenaar  assert_equal('one', MyDefaultArgs('one'))
217170fcfcfSBram Moolenaar  assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
218170fcfcfSBram Moolenaarenddef
219170fcfcfSBram Moolenaar
220170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func()
221170fcfcfSBram Moolenaar  call assert_equal('string', MyDefaultArgs())
222170fcfcfSBram Moolenaar  call assert_equal('one', MyDefaultArgs('one'))
223170fcfcfSBram Moolenaar  call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
224170fcfcfSBram Moolenaarendfunc
225170fcfcfSBram Moolenaar
226b35efa5eSBram Moolenaarfunc TakesOneArg(arg)
227b35efa5eSBram Moolenaar  echo a:arg
228b35efa5eSBram Moolenaarendfunc
229b35efa5eSBram Moolenaar
230b35efa5eSBram Moolenaardef Test_call_wrong_arg_count()
231b35efa5eSBram Moolenaar  call CheckDefFailure(['TakesOneArg()'], 'E119:')
232b35efa5eSBram Moolenaar  call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
233b35efa5eSBram Moolenaarenddef
234b35efa5eSBram Moolenaar
235170fcfcfSBram Moolenaar" Default arg and varargs
236170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
237170fcfcfSBram Moolenaar  let res = one .. ',' .. two
238170fcfcfSBram Moolenaar  for s in rest
239170fcfcfSBram Moolenaar    res ..= ',' .. s
240170fcfcfSBram Moolenaar  endfor
241170fcfcfSBram Moolenaar  return res
242170fcfcfSBram Moolenaarenddef
243170fcfcfSBram Moolenaar
244170fcfcfSBram Moolenaardef Test_call_def_varargs()
245170fcfcfSBram Moolenaar  call assert_fails('call MyDefVarargs()', 'E119:')
246170fcfcfSBram Moolenaar  assert_equal('one,foo', MyDefVarargs('one'))
247170fcfcfSBram Moolenaar  assert_equal('one,two', MyDefVarargs('one', 'two'))
248170fcfcfSBram Moolenaar  assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
249170fcfcfSBram Moolenaarenddef
250170fcfcfSBram Moolenaar
25142a480bfSBram Moolenaardef Test_using_var_as_arg()
25242a480bfSBram Moolenaar  call writefile(['def Func(x: number)',  'let x = 234', 'enddef'], 'Xdef')
25342a480bfSBram Moolenaar  call assert_fails('so Xdef', 'E1006:')
25442a480bfSBram Moolenaar  call delete('Xdef')
25542a480bfSBram Moolenaarenddef
25642a480bfSBram Moolenaar
257b35efa5eSBram Moolenaardef Test_call_func_defined_later()
258b35efa5eSBram Moolenaar  call assert_equal('one', DefinedLater('one'))
259b35efa5eSBram Moolenaar  call assert_fails('call NotDefined("one")', 'E117:')
260b35efa5eSBram Moolenaarenddef
261170fcfcfSBram Moolenaar
262b35efa5eSBram Moolenaarfunc DefinedLater(arg)
26326e117e9SBram Moolenaar  return a:arg
26426e117e9SBram Moolenaarendfunc
26526e117e9SBram Moolenaar
2667eeefd4aSBram Moolenaardef FuncWithForwardCall()
2677eeefd4aSBram Moolenaar  return DefinedEvenLater("yes")
2687eeefd4aSBram Moolenaarenddef
2697eeefd4aSBram Moolenaar
2707eeefd4aSBram Moolenaardef DefinedEvenLater(arg: string): string
2717eeefd4aSBram Moolenaar  return arg
2727eeefd4aSBram Moolenaarenddef
2737eeefd4aSBram Moolenaar
2747eeefd4aSBram Moolenaardef Test_error_in_nested_function()
2757eeefd4aSBram Moolenaar  " Error in called function requires unwinding the call stack.
2767eeefd4aSBram Moolenaar  assert_fails('call FuncWithForwardCall()', 'E1029')
2777eeefd4aSBram Moolenaarenddef
2787eeefd4aSBram Moolenaar
2798a7d6542SBram Moolenaardef Test_return_type_wrong()
280978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
281978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
282978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
283978d170bSBram Moolenaar  CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
284cf3f8bf4SBram Moolenaar
285cf3f8bf4SBram Moolenaar  CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:')
286cf3f8bf4SBram Moolenaar  CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:')
2878a7d6542SBram Moolenaarenddef
2888a7d6542SBram Moolenaar
289bfe12043SBram Moolenaardef Test_arg_type_wrong()
290bfe12043SBram Moolenaar  CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
291bfe12043SBram Moolenaarenddef
292bfe12043SBram Moolenaar
2938a7d6542SBram Moolenaardef Test_try_catch()
2948a7d6542SBram Moolenaar  let l = []
2958a7d6542SBram Moolenaar  try
2968a7d6542SBram Moolenaar    add(l, '1')
2978a7d6542SBram Moolenaar    throw 'wrong'
2988a7d6542SBram Moolenaar    add(l, '2')
2998a7d6542SBram Moolenaar  catch
3008a7d6542SBram Moolenaar    add(l, v:exception)
3018a7d6542SBram Moolenaar  finally
3028a7d6542SBram Moolenaar    add(l, '3')
3038a7d6542SBram Moolenaar  endtry
3048a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
3058a7d6542SBram Moolenaarenddef
3068a7d6542SBram Moolenaar
307257cc5eeSBram Moolenaardef ThrowFromDef()
308257cc5eeSBram Moolenaar  throw 'getout'
309257cc5eeSBram Moolenaarenddef
310257cc5eeSBram Moolenaar
311257cc5eeSBram Moolenaarfunc CatchInFunc()
312257cc5eeSBram Moolenaar  try
313257cc5eeSBram Moolenaar    call ThrowFromDef()
314257cc5eeSBram Moolenaar  catch
315257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
316257cc5eeSBram Moolenaar  endtry
317257cc5eeSBram Moolenaarendfunc
318257cc5eeSBram Moolenaar
319257cc5eeSBram Moolenaardef CatchInDef()
320257cc5eeSBram Moolenaar  try
321257cc5eeSBram Moolenaar    ThrowFromDef()
322257cc5eeSBram Moolenaar  catch
323257cc5eeSBram Moolenaar    g:thrown_def = v:exception
324257cc5eeSBram Moolenaar  endtry
325257cc5eeSBram Moolenaarenddef
326257cc5eeSBram Moolenaar
327f575adffSBram Moolenaardef ReturnFinally(): string
328f575adffSBram Moolenaar  try
329f575adffSBram Moolenaar    return 'intry'
330f575adffSBram Moolenaar  finally
331f575adffSBram Moolenaar    g:in_finally = 'finally'
332f575adffSBram Moolenaar  endtry
333f575adffSBram Moolenaar  return 'end'
334f575adffSBram Moolenaarenddef
335f575adffSBram Moolenaar
336257cc5eeSBram Moolenaardef Test_try_catch_nested()
337257cc5eeSBram Moolenaar  CatchInFunc()
338257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
339257cc5eeSBram Moolenaar
340257cc5eeSBram Moolenaar  CatchInDef()
341257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
342f575adffSBram Moolenaar
343f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
344f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
345f575adffSBram Moolenaarenddef
346f575adffSBram Moolenaar
347f575adffSBram Moolenaardef Test_try_catch_match()
348f575adffSBram Moolenaar  let seq = 'a'
349f575adffSBram Moolenaar  try
350f575adffSBram Moolenaar    throw 'something'
351f575adffSBram Moolenaar  catch /nothing/
352f575adffSBram Moolenaar    seq ..= 'x'
353f575adffSBram Moolenaar  catch /some/
354f575adffSBram Moolenaar    seq ..= 'b'
355f575adffSBram Moolenaar  catch /asdf/
356f575adffSBram Moolenaar    seq ..= 'x'
357f575adffSBram Moolenaar  finally
358f575adffSBram Moolenaar    seq ..= 'c'
359f575adffSBram Moolenaar  endtry
360f575adffSBram Moolenaar  assert_equal('abc', seq)
361257cc5eeSBram Moolenaarenddef
362257cc5eeSBram Moolenaar
3638a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
3648a7d6542SBram Moolenaar  vim9script
3658a7d6542SBram Moolenaar  let name: string = 'bob'
3668a7d6542SBram Moolenaar  def Concat(arg: string): string
3678a7d6542SBram Moolenaar    return name .. arg
3688a7d6542SBram Moolenaar  enddef
3698a7d6542SBram Moolenaar  let g:result = Concat('bie')
3708a7d6542SBram Moolenaar  let g:localname = name
3718a7d6542SBram Moolenaar
3728a7d6542SBram Moolenaar  export const CONST = 1234
3738a7d6542SBram Moolenaar  export let exported = 9876
3746e587dcbSBram Moolenaar  export let exp_name = 'John'
3758a7d6542SBram Moolenaar  export def Exported(): string
3768a7d6542SBram Moolenaar    return 'Exported'
3778a7d6542SBram Moolenaar  enddef
3788a7d6542SBram MoolenaarEND
3798a7d6542SBram Moolenaar
3805269bd2aSBram Moolenaardef Test_vim9_import_export()
3818a7d6542SBram Moolenaar  let import_script_lines =<< trim END
3828a7d6542SBram Moolenaar    vim9script
3838a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
3848a7d6542SBram Moolenaar    g:imported = exported
3856e587dcbSBram Moolenaar    exported += 3
3866e587dcbSBram Moolenaar    g:imported_added = exported
3878a7d6542SBram Moolenaar    g:imported_func = Exported()
3886e587dcbSBram Moolenaar
3896e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
3906e587dcbSBram Moolenaar    g:imported_name = exp_name
3916e587dcbSBram Moolenaar    exp_name ..= ' Doe'
3926e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
3935381c7a1SBram Moolenaar    g:imported_later = exported
3948a7d6542SBram Moolenaar  END
3958a7d6542SBram Moolenaar
3968a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
3978a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
3988a7d6542SBram Moolenaar
3998a7d6542SBram Moolenaar  source Ximport.vim
4008a7d6542SBram Moolenaar
4018a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
4028a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
4038a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
4046e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
4055381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
4068a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
4076e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
4086e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
4098a7d6542SBram Moolenaar  assert_false(exists('g:name'))
4108a7d6542SBram Moolenaar
4118a7d6542SBram Moolenaar  unlet g:result
4128a7d6542SBram Moolenaar  unlet g:localname
4138a7d6542SBram Moolenaar  unlet g:imported
4146e587dcbSBram Moolenaar  unlet g:imported_added
4155381c7a1SBram Moolenaar  unlet g:imported_later
4168a7d6542SBram Moolenaar  unlet g:imported_func
4176e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
4188a7d6542SBram Moolenaar  delete('Ximport.vim')
419f2d5c240SBram Moolenaar
4205381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
4215381c7a1SBram Moolenaar    vim9script
4225381c7a1SBram Moolenaar    def ImportInDef()
4235381c7a1SBram Moolenaar      import exported from './Xexport.vim'
4245381c7a1SBram Moolenaar      g:imported = exported
4255381c7a1SBram Moolenaar      exported += 7
4265381c7a1SBram Moolenaar      g:imported_added = exported
4275381c7a1SBram Moolenaar    enddef
4285381c7a1SBram Moolenaar    ImportInDef()
4295381c7a1SBram Moolenaar  END
4305381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
4315381c7a1SBram Moolenaar  source Ximport2.vim
4325381c7a1SBram Moolenaar  " TODO: this should be 9879
4335381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
4345381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
4355381c7a1SBram Moolenaar  unlet g:imported
4365381c7a1SBram Moolenaar  unlet g:imported_added
4375381c7a1SBram Moolenaar  delete('Ximport2.vim')
4385381c7a1SBram Moolenaar
439f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
440f2d5c240SBram Moolenaar    vim9script
441f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
442f2d5c240SBram Moolenaar    def UseExport()
443f2d5c240SBram Moolenaar      g:imported = Export.exported
444f2d5c240SBram Moolenaar    enddef
445f2d5c240SBram Moolenaar    UseExport()
446f2d5c240SBram Moolenaar  END
447f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
448f2d5c240SBram Moolenaar  source Ximport.vim
4495381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
450f2d5c240SBram Moolenaar
451599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
452599c89c8SBram Moolenaar    vim9script
453599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
454599c89c8SBram Moolenaar    def Func()
455599c89c8SBram Moolenaar      let dummy = 1
456599c89c8SBram Moolenaar      let imported = Export + dummy
457599c89c8SBram Moolenaar    enddef
458599c89c8SBram Moolenaar  END
459599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
460599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
461599c89c8SBram Moolenaar
462599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
463599c89c8SBram Moolenaar    vim9script
464599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
465599c89c8SBram Moolenaar    def Func()
466599c89c8SBram Moolenaar      let imported = Export . exported
467599c89c8SBram Moolenaar    enddef
468599c89c8SBram Moolenaar  END
469599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
470599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
471599c89c8SBram Moolenaar
472599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
473599c89c8SBram Moolenaar    vim9script
474599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
475599c89c8SBram Moolenaar    def Func()
476599c89c8SBram Moolenaar      let imported = Export.
477599c89c8SBram Moolenaar    enddef
478599c89c8SBram Moolenaar  END
479599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
480599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
481599c89c8SBram Moolenaar
482f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
483f2d5c240SBram Moolenaar    vim9script
484f2d5c240SBram Moolenaar    import * from './Xexport.vim'
485f2d5c240SBram Moolenaar    g:imported = exported
486f2d5c240SBram Moolenaar  END
487f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
488f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
489f2d5c240SBram Moolenaar
490fa29c8abSBram Moolenaar  " try to import something that exists but is not exported
491fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
492fa29c8abSBram Moolenaar    vim9script
493fa29c8abSBram Moolenaar    import name from './Xexport.vim'
494fa29c8abSBram Moolenaar  END
495fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
496fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
497fa29c8abSBram Moolenaar
4985269bd2aSBram Moolenaar  " try to import something that is already defined
4995269bd2aSBram Moolenaar  let import_already_defined =<< trim END
5005269bd2aSBram Moolenaar    vim9script
5015269bd2aSBram Moolenaar    let exported = 'something'
5025269bd2aSBram Moolenaar    import exported from './Xexport.vim'
5035269bd2aSBram Moolenaar  END
5045269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
5055269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
5065269bd2aSBram Moolenaar
5075269bd2aSBram Moolenaar  " try to import something that is already defined
5085269bd2aSBram Moolenaar  import_already_defined =<< trim END
5095269bd2aSBram Moolenaar    vim9script
5105269bd2aSBram Moolenaar    let exported = 'something'
5115269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
5125269bd2aSBram Moolenaar  END
5135269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
5145269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
5155269bd2aSBram Moolenaar
5165269bd2aSBram Moolenaar  " try to import something that is already defined
5175269bd2aSBram Moolenaar  import_already_defined =<< trim END
5185269bd2aSBram Moolenaar    vim9script
5195269bd2aSBram Moolenaar    let exported = 'something'
5205269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
5215269bd2aSBram Moolenaar  END
5225269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
5235269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
5245269bd2aSBram Moolenaar
525fa29c8abSBram Moolenaar  " import a very long name, requires making a copy
526fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
527fa29c8abSBram Moolenaar    vim9script
528fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
529fa29c8abSBram Moolenaar  END
530fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
531fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
532fa29c8abSBram Moolenaar
533fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
534fa29c8abSBram Moolenaar    vim9script
535fa29c8abSBram Moolenaar    import name './Xexport.vim'
536fa29c8abSBram Moolenaar  END
537fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
538fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
539fa29c8abSBram Moolenaar
540fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
541fa29c8abSBram Moolenaar    vim9script
542fa29c8abSBram Moolenaar    import name from Xexport.vim
543fa29c8abSBram Moolenaar  END
544fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
545fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
546fa29c8abSBram Moolenaar
547fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
548fa29c8abSBram Moolenaar    vim9script
549fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
550fa29c8abSBram Moolenaar  END
551fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
552fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
553fa29c8abSBram Moolenaar
554fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
555fa29c8abSBram Moolenaar    vim9script
556fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
557fa29c8abSBram Moolenaar  END
5585269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
5595269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
560fa29c8abSBram Moolenaar
561f2d5c240SBram Moolenaar  delete('Ximport.vim')
5625269bd2aSBram Moolenaar  delete('Ximport3.vim')
5638a7d6542SBram Moolenaar  delete('Xexport.vim')
5648a7d6542SBram Moolenaar
565750802b5SBram Moolenaar  " Check that in a Vim9 script 'cpo' is set to the Vim default.
566750802b5SBram Moolenaar  set cpo&vi
567750802b5SBram Moolenaar  let cpo_before = &cpo
568750802b5SBram Moolenaar  let lines =<< trim END
569750802b5SBram Moolenaar    vim9script
570750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
571750802b5SBram Moolenaar  END
572750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
573750802b5SBram Moolenaar  source Xvim9_script
574750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
575750802b5SBram Moolenaar  set cpo&vim
576750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
577750802b5SBram Moolenaar  delete('Xvim9_script')
578750802b5SBram Moolenaarenddef
579750802b5SBram Moolenaar
580750802b5SBram Moolenaardef Test_vim9script_fails()
5818a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
5828a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
583750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
584f2d5c240SBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
585750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
586750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
587750802b5SBram Moolenaar
588750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
589750802b5SBram Moolenaar  assert_fails('export something', 'E1042')
5908a7d6542SBram Moolenaarenddef
5918a7d6542SBram Moolenaar
5928a7d6542SBram Moolenaardef Test_vim9script_call()
5938a7d6542SBram Moolenaar  let lines =<< trim END
5948a7d6542SBram Moolenaar    vim9script
5958a7d6542SBram Moolenaar    let var = ''
5968a7d6542SBram Moolenaar    def MyFunc(arg: string)
5978a7d6542SBram Moolenaar       var = arg
5988a7d6542SBram Moolenaar    enddef
5998a7d6542SBram Moolenaar    MyFunc('foobar')
6008a7d6542SBram Moolenaar    assert_equal('foobar', var)
6018a7d6542SBram Moolenaar
6028a7d6542SBram Moolenaar    let str = 'barfoo'
6038a7d6542SBram Moolenaar    str->MyFunc()
6048a7d6542SBram Moolenaar    assert_equal('barfoo', var)
6058a7d6542SBram Moolenaar
6068a7d6542SBram Moolenaar    let g:value = 'value'
6078a7d6542SBram Moolenaar    g:value->MyFunc()
6088a7d6542SBram Moolenaar    assert_equal('value', var)
6098a7d6542SBram Moolenaar
6108a7d6542SBram Moolenaar    let listvar = []
6118a7d6542SBram Moolenaar    def ListFunc(arg: list<number>)
6128a7d6542SBram Moolenaar       listvar = arg
6138a7d6542SBram Moolenaar    enddef
6148a7d6542SBram Moolenaar    [1, 2, 3]->ListFunc()
6158a7d6542SBram Moolenaar    assert_equal([1, 2, 3], listvar)
6168a7d6542SBram Moolenaar
6178a7d6542SBram Moolenaar    let dictvar = {}
6188a7d6542SBram Moolenaar    def DictFunc(arg: dict<number>)
6198a7d6542SBram Moolenaar       dictvar = arg
6208a7d6542SBram Moolenaar    enddef
6218a7d6542SBram Moolenaar    {'a': 1, 'b': 2}->DictFunc()
6228a7d6542SBram Moolenaar    assert_equal(#{a: 1, b: 2}, dictvar)
623*33fa29cfSBram Moolenaar    def CompiledDict()
624*33fa29cfSBram Moolenaar      {'a': 3, 'b': 4}->DictFunc()
625*33fa29cfSBram Moolenaar    enddef
626*33fa29cfSBram Moolenaar    CompiledDict()
627*33fa29cfSBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
628*33fa29cfSBram Moolenaar
6298a7d6542SBram Moolenaar    #{a: 3, b: 4}->DictFunc()
6308a7d6542SBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
6310c6ceaf9SBram Moolenaar
6320c6ceaf9SBram Moolenaar    ('text')->MyFunc()
6330c6ceaf9SBram Moolenaar    assert_equal('text', var)
6340c6ceaf9SBram Moolenaar    ("some")->MyFunc()
6350c6ceaf9SBram Moolenaar    assert_equal('some', var)
6368a7d6542SBram Moolenaar  END
6378a7d6542SBram Moolenaar  writefile(lines, 'Xcall.vim')
6388a7d6542SBram Moolenaar  source Xcall.vim
6398a7d6542SBram Moolenaar  delete('Xcall.vim')
6408a7d6542SBram Moolenaarenddef
6418a7d6542SBram Moolenaar
6428a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl()
6438a7d6542SBram Moolenaar  let lines =<< trim END
6448a7d6542SBram Moolenaar    vim9script
6458a7d6542SBram Moolenaar    let var = ''
6468a7d6542SBram Moolenaar    def MyFunc(arg: string)
6478a7d6542SBram Moolenaar       let var = 123
6488a7d6542SBram Moolenaar    enddef
6498a7d6542SBram Moolenaar  END
6508a7d6542SBram Moolenaar  writefile(lines, 'Xcall_decl.vim')
6518a7d6542SBram Moolenaar  assert_fails('source Xcall_decl.vim', 'E1054:')
6528a7d6542SBram Moolenaar  delete('Xcall_decl.vim')
6538a7d6542SBram Moolenaarenddef
6548a7d6542SBram Moolenaar
6558a7d6542SBram Moolenaardef Test_vim9script_call_fail_const()
6568a7d6542SBram Moolenaar  let lines =<< trim END
6578a7d6542SBram Moolenaar    vim9script
6588a7d6542SBram Moolenaar    const var = ''
6598a7d6542SBram Moolenaar    def MyFunc(arg: string)
6608a7d6542SBram Moolenaar       var = 'asdf'
6618a7d6542SBram Moolenaar    enddef
6628a7d6542SBram Moolenaar  END
6638a7d6542SBram Moolenaar  writefile(lines, 'Xcall_const.vim')
6648a7d6542SBram Moolenaar  assert_fails('source Xcall_const.vim', 'E46:')
6658a7d6542SBram Moolenaar  delete('Xcall_const.vim')
6668a7d6542SBram Moolenaarenddef
6678a7d6542SBram Moolenaar
6688a7d6542SBram Moolenaardef Test_vim9script_reload()
6698a7d6542SBram Moolenaar  let lines =<< trim END
6708a7d6542SBram Moolenaar    vim9script
6718a7d6542SBram Moolenaar    const var = ''
6728a7d6542SBram Moolenaar    let valone = 1234
6738a7d6542SBram Moolenaar    def MyFunc(arg: string)
6748a7d6542SBram Moolenaar       valone = 5678
6758a7d6542SBram Moolenaar    enddef
6768a7d6542SBram Moolenaar  END
6778a7d6542SBram Moolenaar  let morelines =<< trim END
6788a7d6542SBram Moolenaar    let valtwo = 222
6798a7d6542SBram Moolenaar    export def GetValtwo(): number
6808a7d6542SBram Moolenaar      return valtwo
6818a7d6542SBram Moolenaar    enddef
6828a7d6542SBram Moolenaar  END
6838a7d6542SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
6848a7d6542SBram Moolenaar  source Xreload.vim
6858a7d6542SBram Moolenaar  source Xreload.vim
6868a7d6542SBram Moolenaar  source Xreload.vim
6878a7d6542SBram Moolenaar
6888a7d6542SBram Moolenaar  let testlines =<< trim END
6898a7d6542SBram Moolenaar    vim9script
6908a7d6542SBram Moolenaar    def TheFunc()
6918a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
6928a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
6938a7d6542SBram Moolenaar    enddef
6948a7d6542SBram Moolenaar    TheFunc()
6958a7d6542SBram Moolenaar  END
6968a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
6978a7d6542SBram Moolenaar  source Ximport.vim
6988a7d6542SBram Moolenaar
6998a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
7008a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
7018a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
7028a7d6542SBram Moolenaar  source Xreload.vim
7038a7d6542SBram Moolenaar  source Ximport.vim
7048a7d6542SBram Moolenaar
7058a7d6542SBram Moolenaar  " cannot declare a var twice
7068a7d6542SBram Moolenaar  lines =<< trim END
7078a7d6542SBram Moolenaar    vim9script
7088a7d6542SBram Moolenaar    let valone = 1234
7098a7d6542SBram Moolenaar    let valone = 5678
7108a7d6542SBram Moolenaar  END
7118a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
7128a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
7138a7d6542SBram Moolenaar
7148a7d6542SBram Moolenaar  delete('Xreload.vim')
7158a7d6542SBram Moolenaar  delete('Ximport.vim')
7168a7d6542SBram Moolenaarenddef
7178a7d6542SBram Moolenaar
7188a7d6542SBram Moolenaardef Test_import_absolute()
7198a7d6542SBram Moolenaar  let import_lines = [
7208a7d6542SBram Moolenaar        \ 'vim9script',
7218a7d6542SBram Moolenaar        \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
722b283a8a6SBram Moolenaar        \ 'def UseExported()',
7238a7d6542SBram Moolenaar        \ '  g:imported_abs = exported',
7244e12a5dfSBram Moolenaar        \ '  exported = 8888',
7254e12a5dfSBram Moolenaar        \ '  g:imported_after = exported',
726b283a8a6SBram Moolenaar        \ 'enddef',
727b283a8a6SBram Moolenaar        \ 'UseExported()',
7284e12a5dfSBram Moolenaar        \ 'g:import_disassembled = execute("disass UseExported")',
7298a7d6542SBram Moolenaar        \ ]
7308a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
7318a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
7328a7d6542SBram Moolenaar
7338a7d6542SBram Moolenaar  source Ximport_abs.vim
7348a7d6542SBram Moolenaar
7358a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
7364e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
737b283a8a6SBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*'
738b283a8a6SBram Moolenaar        \ .. 'g:imported_abs = exported.*'
739b283a8a6SBram Moolenaar        \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
7404e12a5dfSBram Moolenaar        \ .. '1 STOREG g:imported_abs.*'
7414e12a5dfSBram Moolenaar        \ .. 'exported = 8888.*'
7424e12a5dfSBram Moolenaar        \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
7434e12a5dfSBram Moolenaar        \ .. 'g:imported_after = exported.*'
7444e12a5dfSBram Moolenaar        \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
7454e12a5dfSBram Moolenaar        \ .. '5 STOREG g:imported_after.*'
7464e12a5dfSBram Moolenaar        \, g:import_disassembled)
7478a7d6542SBram Moolenaar  unlet g:imported_abs
7484e12a5dfSBram Moolenaar  unlet g:import_disassembled
7498a7d6542SBram Moolenaar
7508a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
7518a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
7528a7d6542SBram Moolenaarenddef
7538a7d6542SBram Moolenaar
7548a7d6542SBram Moolenaardef Test_import_rtp()
7558a7d6542SBram Moolenaar  let import_lines = [
7568a7d6542SBram Moolenaar        \ 'vim9script',
7578a7d6542SBram Moolenaar        \ 'import exported from "Xexport_rtp.vim"',
7588a7d6542SBram Moolenaar        \ 'g:imported_rtp = exported',
7598a7d6542SBram Moolenaar        \ ]
7608a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
7618a7d6542SBram Moolenaar  mkdir('import')
7628a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
7638a7d6542SBram Moolenaar
7648a7d6542SBram Moolenaar  let save_rtp = &rtp
7658a7d6542SBram Moolenaar  &rtp = getcwd()
7668a7d6542SBram Moolenaar  source Ximport_rtp.vim
7678a7d6542SBram Moolenaar  &rtp = save_rtp
7688a7d6542SBram Moolenaar
7698a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
7708a7d6542SBram Moolenaar  unlet g:imported_rtp
7718a7d6542SBram Moolenaar
7728a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
7738a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
7748a7d6542SBram Moolenaar  delete('import', 'd')
7758a7d6542SBram Moolenaarenddef
7768a7d6542SBram Moolenaar
7778a7d6542SBram Moolenaardef Test_fixed_size_list()
7788a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
7798a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
7808a7d6542SBram Moolenaar  l->remove(0)
7818a7d6542SBram Moolenaar  l->add(5)
7828a7d6542SBram Moolenaar  l->insert(99, 1)
7830f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
7848a7d6542SBram Moolenaarenddef
7858a7d6542SBram Moolenaar
786673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not
787673660abSBram Moolenaar" recognized.
788673660abSBram Moolenaarfunc Test_function_python()
789673660abSBram Moolenaar  CheckFeature python3
790673660abSBram Moolenaar  let py = 'python3'
791673660abSBram Moolenaar  execute py "<< EOF"
792673660abSBram Moolenaardef do_something():
793673660abSBram Moolenaar  return 1
794673660abSBram MoolenaarEOF
795673660abSBram Moolenaarendfunc
796673660abSBram Moolenaar
797158906cfSBram Moolenaardef IfElse(what: number): string
798158906cfSBram Moolenaar  let res = ''
799158906cfSBram Moolenaar  if what == 1
800158906cfSBram Moolenaar    res = "one"
801158906cfSBram Moolenaar  elseif what == 2
802158906cfSBram Moolenaar    res = "two"
803a259d8d3SBram Moolenaar  else
804158906cfSBram Moolenaar    res = "three"
805a259d8d3SBram Moolenaar  endif
806158906cfSBram Moolenaar  return res
807a259d8d3SBram Moolenaarenddef
808a259d8d3SBram Moolenaar
809158906cfSBram Moolenaardef Test_if_elseif_else()
810158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
811158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
812158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
8130f18b6d1SBram Moolenaarenddef
8140f18b6d1SBram Moolenaar
8156d69bf60SBram Moolenaarlet g:bool_true = v:true
8166d69bf60SBram Moolenaarlet g:bool_false = v:false
8176d69bf60SBram Moolenaar
8186d69bf60SBram Moolenaardef Test_if_const_expr()
8196d69bf60SBram Moolenaar  let res = false
8206d69bf60SBram Moolenaar  if true ? true : false
8216d69bf60SBram Moolenaar    res = true
8226d69bf60SBram Moolenaar  endif
8236d69bf60SBram Moolenaar  assert_equal(true, res)
8246d69bf60SBram Moolenaar
8256d69bf60SBram Moolenaar  res = false
8266d69bf60SBram Moolenaar  if g:bool_true ? true : false
8276d69bf60SBram Moolenaar    res = true
8286d69bf60SBram Moolenaar  endif
8296d69bf60SBram Moolenaar  assert_equal(true, res)
8306d69bf60SBram Moolenaar
8316d69bf60SBram Moolenaar  res = false
8326d69bf60SBram Moolenaar  if true ? g:bool_true : false
8336d69bf60SBram Moolenaar    res = true
8346d69bf60SBram Moolenaar  endif
8356d69bf60SBram Moolenaar  assert_equal(true, res)
8366d69bf60SBram Moolenaar
8376d69bf60SBram Moolenaar  res = false
8386d69bf60SBram Moolenaar  if true ? true : g:bool_false
8396d69bf60SBram Moolenaar    res = true
8406d69bf60SBram Moolenaar  endif
8416d69bf60SBram Moolenaar  assert_equal(true, res)
8426d69bf60SBram Moolenaar
8436d69bf60SBram Moolenaar  res = false
8446d69bf60SBram Moolenaar  if true ? false : true
8456d69bf60SBram Moolenaar    res = true
8466d69bf60SBram Moolenaar  endif
8476d69bf60SBram Moolenaar  assert_equal(false, res)
8486d69bf60SBram Moolenaar
8496d69bf60SBram Moolenaar  res = false
8506d69bf60SBram Moolenaar  if false ? false : true
8516d69bf60SBram Moolenaar    res = true
8526d69bf60SBram Moolenaar  endif
8536d69bf60SBram Moolenaar  assert_equal(true, res)
8546d69bf60SBram Moolenaar
8556d69bf60SBram Moolenaar  res = false
8566d69bf60SBram Moolenaar  if false ? true : false
8576d69bf60SBram Moolenaar    res = true
8586d69bf60SBram Moolenaar  endif
8596d69bf60SBram Moolenaar  assert_equal(false, res)
8606d69bf60SBram Moolenaar
8616d69bf60SBram Moolenaar  res = false
8626d69bf60SBram Moolenaar  if true && true
8636d69bf60SBram Moolenaar    res = true
8646d69bf60SBram Moolenaar  endif
8656d69bf60SBram Moolenaar  assert_equal(true, res)
8666d69bf60SBram Moolenaar
8676d69bf60SBram Moolenaar  res = false
8686d69bf60SBram Moolenaar  if true && false
8696d69bf60SBram Moolenaar    res = true
8706d69bf60SBram Moolenaar  endif
8716d69bf60SBram Moolenaar  assert_equal(false, res)
8726d69bf60SBram Moolenaar
8736d69bf60SBram Moolenaar  res = false
8746d69bf60SBram Moolenaar  if g:bool_true && false
8756d69bf60SBram Moolenaar    res = true
8766d69bf60SBram Moolenaar  endif
8776d69bf60SBram Moolenaar  assert_equal(false, res)
8786d69bf60SBram Moolenaar
8796d69bf60SBram Moolenaar  res = false
8806d69bf60SBram Moolenaar  if true && g:bool_false
8816d69bf60SBram Moolenaar    res = true
8826d69bf60SBram Moolenaar  endif
8836d69bf60SBram Moolenaar  assert_equal(false, res)
8846d69bf60SBram Moolenaar
8856d69bf60SBram Moolenaar  res = false
8866d69bf60SBram Moolenaar  if false && false
8876d69bf60SBram Moolenaar    res = true
8886d69bf60SBram Moolenaar  endif
8896d69bf60SBram Moolenaar  assert_equal(false, res)
8906d69bf60SBram Moolenaar
8916d69bf60SBram Moolenaar  res = false
8926d69bf60SBram Moolenaar  if true || false
8936d69bf60SBram Moolenaar    res = true
8946d69bf60SBram Moolenaar  endif
8956d69bf60SBram Moolenaar  assert_equal(true, res)
8966d69bf60SBram Moolenaar
8976d69bf60SBram Moolenaar  res = false
8986d69bf60SBram Moolenaar  if g:bool_true || false
8996d69bf60SBram Moolenaar    res = true
9006d69bf60SBram Moolenaar  endif
9016d69bf60SBram Moolenaar  assert_equal(true, res)
9026d69bf60SBram Moolenaar
9036d69bf60SBram Moolenaar  res = false
9046d69bf60SBram Moolenaar  if true || g:bool_false
9056d69bf60SBram Moolenaar    res = true
9066d69bf60SBram Moolenaar  endif
9076d69bf60SBram Moolenaar  assert_equal(true, res)
9086d69bf60SBram Moolenaar
9096d69bf60SBram Moolenaar  res = false
9106d69bf60SBram Moolenaar  if false || false
9116d69bf60SBram Moolenaar    res = true
9126d69bf60SBram Moolenaar  endif
9136d69bf60SBram Moolenaar  assert_equal(false, res)
9146d69bf60SBram Moolenaar
9156d69bf60SBram Moolenaarenddef
9166d69bf60SBram Moolenaar
91763ce4849SBram Moolenaardef Test_delfunc()
91863ce4849SBram Moolenaar  let lines =<< trim END
91963ce4849SBram Moolenaar    vim9script
92063ce4849SBram Moolenaar    def GoneSoon()
92163ce4849SBram Moolenaar      echo 'hello'
92263ce4849SBram Moolenaar    enddef
92363ce4849SBram Moolenaar
92463ce4849SBram Moolenaar    def CallGoneSoon()
92563ce4849SBram Moolenaar      GoneSoon()
92663ce4849SBram Moolenaar    enddef
92763ce4849SBram Moolenaar
92863ce4849SBram Moolenaar    delfunc GoneSoon
92963ce4849SBram Moolenaar    CallGoneSoon()
93063ce4849SBram Moolenaar  END
93163ce4849SBram Moolenaar  writefile(lines, 'XToDelFunc')
93263ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
93363ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
93463ce4849SBram Moolenaar
93563ce4849SBram Moolenaar  delete('XToDelFunc')
93663ce4849SBram Moolenaarenddef
93763ce4849SBram Moolenaar
938ad39c094SBram Moolenaardef Test_execute_cmd()
939ad39c094SBram Moolenaar  new
940ad39c094SBram Moolenaar  setline(1, 'default')
941ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
942ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
943ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
944ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
945ad39c094SBram Moolenaar  execute cmd1 cmd2
946ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
947ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
948ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
949ad39c094SBram Moolenaar  let cmd_first = 'call '
950ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
951ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
952ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
953ad39c094SBram Moolenaar  bwipe!
954ad39c094SBram Moolenaarenddef
955ad39c094SBram Moolenaar
956ad39c094SBram Moolenaardef Test_echo_cmd()
957ad39c094SBram Moolenaar  echo 'something'
958ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
959ad39c094SBram Moolenaar
960ad39c094SBram Moolenaar  let str1 = 'some'
961ad39c094SBram Moolenaar  let str2 = 'more'
962ad39c094SBram Moolenaar  echo str1 str2
963ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
964ad39c094SBram Moolenaarenddef
965ad39c094SBram Moolenaar
96641fe0617SBram Moolenaardef Test_for_outside_of_function()
96741fe0617SBram Moolenaar  let lines =<< trim END
96841fe0617SBram Moolenaar    vim9script
96941fe0617SBram Moolenaar    new
97041fe0617SBram Moolenaar    for var in range(0, 3)
97141fe0617SBram Moolenaar      append(line('$'), var)
97241fe0617SBram Moolenaar    endfor
97341fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
97441fe0617SBram Moolenaar    bwipe!
97541fe0617SBram Moolenaar  END
97641fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
97741fe0617SBram Moolenaar  source Xvim9for.vim
97841fe0617SBram Moolenaar  delete('Xvim9for.vim')
97941fe0617SBram Moolenaarenddef
9808a7d6542SBram Moolenaar
981d0df1aacSBram Moolenaardef Test_while_loop()
982d0df1aacSBram Moolenaar  let result = ''
983d0df1aacSBram Moolenaar  let cnt = 0
984d0df1aacSBram Moolenaar  while cnt < 555
985d0df1aacSBram Moolenaar    if cnt == 3
986d0df1aacSBram Moolenaar      break
987d0df1aacSBram Moolenaar    endif
988d0df1aacSBram Moolenaar    cnt += 1
989d0df1aacSBram Moolenaar    if cnt == 2
990d0df1aacSBram Moolenaar      continue
991d0df1aacSBram Moolenaar    endif
992d0df1aacSBram Moolenaar    result ..= cnt .. '_'
993d0df1aacSBram Moolenaar  endwhile
994d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
995d0df1aacSBram Moolenaarenddef
996d0df1aacSBram Moolenaar
9979645e2d9SBram Moolenaardef Test_interrupt_loop()
99897acfc78SBram Moolenaar  let caught = false
9999645e2d9SBram Moolenaar  let x = 0
100097acfc78SBram Moolenaar  try
10019645e2d9SBram Moolenaar    while 1
10029645e2d9SBram Moolenaar      x += 1
10039645e2d9SBram Moolenaar      if x == 100
10049645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
10059645e2d9SBram Moolenaar      endif
10069645e2d9SBram Moolenaar    endwhile
100797acfc78SBram Moolenaar  catch
100897acfc78SBram Moolenaar    caught = true
100997acfc78SBram Moolenaar    assert_equal(100, x)
101097acfc78SBram Moolenaar  endtry
101197acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
10129645e2d9SBram Moolenaarenddef
101320431c9dSBram Moolenaar
1014d0df1aacSBram Moolenaardef Test_substitute_cmd()
1015d0df1aacSBram Moolenaar  new
1016d0df1aacSBram Moolenaar  setline(1, 'something')
1017d0df1aacSBram Moolenaar  :substitute(some(other(
1018d0df1aacSBram Moolenaar  assert_equal('otherthing', getline(1))
1019d0df1aacSBram Moolenaar  bwipe!
1020d0df1aacSBram Moolenaar
1021d0df1aacSBram Moolenaar  " also when the context is Vim9 script
1022d0df1aacSBram Moolenaar  let lines =<< trim END
1023d0df1aacSBram Moolenaar    vim9script
1024d0df1aacSBram Moolenaar    new
1025d0df1aacSBram Moolenaar    setline(1, 'something')
1026d0df1aacSBram Moolenaar    :substitute(some(other(
1027d0df1aacSBram Moolenaar    assert_equal('otherthing', getline(1))
1028d0df1aacSBram Moolenaar    bwipe!
1029d0df1aacSBram Moolenaar  END
1030d0df1aacSBram Moolenaar  writefile(lines, 'Xvim9lines')
1031d0df1aacSBram Moolenaar  source Xvim9lines
1032d0df1aacSBram Moolenaar
1033d0df1aacSBram Moolenaar  delete('Xvim9lines')
1034d0df1aacSBram Moolenaarenddef
1035d0df1aacSBram Moolenaar
103620431c9dSBram Moolenaardef Test_redef_failure()
103720431c9dSBram Moolenaar  call writefile(['def Func0(): string',  'return "Func0"', 'enddef'], 'Xdef')
103820431c9dSBram Moolenaar  so Xdef
103920431c9dSBram Moolenaar  call writefile(['def Func1(): string',  'return "Func1"', 'enddef'], 'Xdef')
104020431c9dSBram Moolenaar  so Xdef
104120431c9dSBram Moolenaar  call writefile(['def! Func0(): string', 'enddef'], 'Xdef')
104220431c9dSBram Moolenaar  call assert_fails('so Xdef', 'E1027:')
104320431c9dSBram Moolenaar  call writefile(['def Func2(): string',  'return "Func2"', 'enddef'], 'Xdef')
104420431c9dSBram Moolenaar  so Xdef
104520431c9dSBram Moolenaar  call delete('Xdef')
104620431c9dSBram Moolenaar
104720431c9dSBram Moolenaar  call assert_equal(0, Func0())
104820431c9dSBram Moolenaar  call assert_equal('Func1', Func1())
104920431c9dSBram Moolenaar  call assert_equal('Func2', Func2())
105020431c9dSBram Moolenaar
105120431c9dSBram Moolenaar  delfunc! Func0
105220431c9dSBram Moolenaar  delfunc! Func1
105320431c9dSBram Moolenaar  delfunc! Func2
105420431c9dSBram Moolenaarenddef
105520431c9dSBram Moolenaar
10567d941ee0SBram Moolenaar" Test for internal functions returning different types
10577d941ee0SBram Moolenaarfunc Test_InternalFuncRetType()
10587d941ee0SBram Moolenaar  let lines =<< trim END
10597d941ee0SBram Moolenaar    def RetFloat(): float
10607d941ee0SBram Moolenaar      return ceil(1.456)
10617d941ee0SBram Moolenaar    enddef
10627d941ee0SBram Moolenaar
10637d941ee0SBram Moolenaar    def RetListAny(): list<any>
10647d941ee0SBram Moolenaar      return items({'k' : 'v'})
10657d941ee0SBram Moolenaar    enddef
10667d941ee0SBram Moolenaar
10677d941ee0SBram Moolenaar    def RetListString(): list<string>
10687d941ee0SBram Moolenaar      return split('a:b:c', ':')
10697d941ee0SBram Moolenaar    enddef
10707d941ee0SBram Moolenaar
10717d941ee0SBram Moolenaar    def RetListDictAny(): list<dict<any>>
10727d941ee0SBram Moolenaar      return getbufinfo()
10737d941ee0SBram Moolenaar    enddef
10747d941ee0SBram Moolenaar
10757d941ee0SBram Moolenaar    def RetDictNumber(): dict<number>
10767d941ee0SBram Moolenaar      return wordcount()
10777d941ee0SBram Moolenaar    enddef
10787d941ee0SBram Moolenaar
10797d941ee0SBram Moolenaar    def RetDictString(): dict<string>
10807d941ee0SBram Moolenaar      return environ()
10817d941ee0SBram Moolenaar    enddef
10827d941ee0SBram Moolenaar  END
10837d941ee0SBram Moolenaar  call writefile(lines, 'Xscript')
10847d941ee0SBram Moolenaar  source Xscript
10857d941ee0SBram Moolenaar
10867d941ee0SBram Moolenaar  call assert_equal(2.0, RetFloat())
10877d941ee0SBram Moolenaar  call assert_equal([['k', 'v']], RetListAny())
10887d941ee0SBram Moolenaar  call assert_equal(['a', 'b', 'c'], RetListString())
10897d941ee0SBram Moolenaar  call assert_notequal([], RetListDictAny())
10907d941ee0SBram Moolenaar  call assert_notequal({}, RetDictNumber())
10917d941ee0SBram Moolenaar  call assert_notequal({}, RetDictString())
10927d941ee0SBram Moolenaar  call delete('Xscript')
10937d941ee0SBram Moolenaarendfunc
10947d941ee0SBram Moolenaar
10957d941ee0SBram Moolenaar" Test for passing too many or too few arguments to internal functions
10967d941ee0SBram Moolenaarfunc Test_internalfunc_arg_error()
10977d941ee0SBram Moolenaar  let l =<< trim END
10987d941ee0SBram Moolenaar    def! FArgErr(): float
10997d941ee0SBram Moolenaar      return ceil(1.1, 2)
11007d941ee0SBram Moolenaar    enddef
11017d941ee0SBram Moolenaar  END
11027d941ee0SBram Moolenaar  call writefile(l, 'Xinvalidarg')
11037d941ee0SBram Moolenaar  call assert_fails('so Xinvalidarg', 'E118:')
11047d941ee0SBram Moolenaar  let l =<< trim END
11057d941ee0SBram Moolenaar    def! FArgErr(): float
11067d941ee0SBram Moolenaar      return ceil()
11077d941ee0SBram Moolenaar    enddef
11087d941ee0SBram Moolenaar  END
11097d941ee0SBram Moolenaar  call writefile(l, 'Xinvalidarg')
11107d941ee0SBram Moolenaar  call assert_fails('so Xinvalidarg', 'E119:')
11117d941ee0SBram Moolenaar  call delete('Xinvalidarg')
11127d941ee0SBram Moolenaarendfunc
11137d941ee0SBram Moolenaar
11148a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
1115