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
1048a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
1058a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
1068a7d6542SBram Moolenaar
1078a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
1088a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
1098a7d6542SBram Moolenaar
1108a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
1118a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
11242a480bfSBram Moolenaar
11342a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1007:')
11442a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
11542a480bfSBram Moolenaar
11642a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
11742a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
11842a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
11942a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
12042a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
12142a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
12242a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
12342a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
12442a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
12542a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
12642a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
1278a7d6542SBram Moolenaarendfunc
1288a7d6542SBram Moolenaar
1298a7d6542SBram Moolenaarfunc Test_const()
1308a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
1318a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
1328a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
1338a7d6542SBram Moolenaarendfunc
1348a7d6542SBram Moolenaar
1358a7d6542SBram Moolenaardef Test_block()
1368a7d6542SBram Moolenaar  let outer = 1
1378a7d6542SBram Moolenaar  {
1388a7d6542SBram Moolenaar    let inner = 2
1398a7d6542SBram Moolenaar    assert_equal(1, outer)
1408a7d6542SBram Moolenaar    assert_equal(2, inner)
1418a7d6542SBram Moolenaar  }
1428a7d6542SBram Moolenaar  assert_equal(1, outer)
1438a7d6542SBram Moolenaarenddef
1448a7d6542SBram Moolenaar
1458a7d6542SBram Moolenaarfunc Test_block_failure()
1468a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
1478a7d6542SBram Moolenaarendfunc
1488a7d6542SBram Moolenaar
1498a7d6542SBram Moolenaardef ReturnString(): string
1508a7d6542SBram Moolenaar  return 'string'
1518a7d6542SBram Moolenaarenddef
1528a7d6542SBram Moolenaar
1538a7d6542SBram Moolenaardef ReturnNumber(): number
1548a7d6542SBram Moolenaar  return 123
1558a7d6542SBram Moolenaarenddef
1568a7d6542SBram Moolenaar
15709f28f49SBram Moolenaarlet g:notNumber = 'string'
15809f28f49SBram Moolenaar
15909f28f49SBram Moolenaardef ReturnGlobal(): number
16009f28f49SBram Moolenaar  return g:notNumber
16109f28f49SBram Moolenaarenddef
16209f28f49SBram Moolenaar
1638a7d6542SBram Moolenaardef Test_return_string()
1648a7d6542SBram Moolenaar  assert_equal('string', ReturnString())
1658a7d6542SBram Moolenaar  assert_equal(123, ReturnNumber())
16609f28f49SBram Moolenaar  assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string')
1678a7d6542SBram Moolenaarenddef
1688a7d6542SBram Moolenaar
1698a7d6542SBram Moolenaarfunc Increment()
1708a7d6542SBram Moolenaar  let g:counter += 1
1718a7d6542SBram Moolenaarendfunc
1728a7d6542SBram Moolenaar
1738a7d6542SBram Moolenaardef Test_call_ufunc_count()
1748a7d6542SBram Moolenaar  g:counter = 1
1758a7d6542SBram Moolenaar  Increment()
1768a7d6542SBram Moolenaar  Increment()
1778a7d6542SBram Moolenaar  Increment()
1788a7d6542SBram Moolenaar  " works with and without :call
1798a7d6542SBram Moolenaar  assert_equal(4, g:counter)
180b283a8a6SBram Moolenaar  call assert_equal(4, g:counter)
1818a7d6542SBram Moolenaar  unlet g:counter
1828a7d6542SBram Moolenaarenddef
1838a7d6542SBram Moolenaar
1848a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string
1858a7d6542SBram Moolenaar  let res = arg
1868a7d6542SBram Moolenaar  for s in rest
1878a7d6542SBram Moolenaar    res ..= ',' .. s
1888a7d6542SBram Moolenaar  endfor
1898a7d6542SBram Moolenaar  return res
1908a7d6542SBram Moolenaarenddef
1918a7d6542SBram Moolenaar
1928a7d6542SBram Moolenaardef Test_call_varargs()
1938a7d6542SBram Moolenaar  assert_equal('one', MyVarargs('one'))
1948a7d6542SBram Moolenaar  assert_equal('one,two', MyVarargs('one', 'two'))
1958a7d6542SBram Moolenaar  assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
1968a7d6542SBram Moolenaarenddef
1978a7d6542SBram Moolenaar
198170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string
199170fcfcfSBram Moolenaar  return name
200170fcfcfSBram Moolenaarenddef
201170fcfcfSBram Moolenaar
202170fcfcfSBram Moolenaardef Test_call_default_args()
203170fcfcfSBram Moolenaar  assert_equal('string', MyDefaultArgs())
204170fcfcfSBram Moolenaar  assert_equal('one', MyDefaultArgs('one'))
205170fcfcfSBram Moolenaar  assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
206170fcfcfSBram Moolenaarenddef
207170fcfcfSBram Moolenaar
208170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func()
209170fcfcfSBram Moolenaar  call assert_equal('string', MyDefaultArgs())
210170fcfcfSBram Moolenaar  call assert_equal('one', MyDefaultArgs('one'))
211170fcfcfSBram Moolenaar  call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
212170fcfcfSBram Moolenaarendfunc
213170fcfcfSBram Moolenaar
214b35efa5eSBram Moolenaarfunc TakesOneArg(arg)
215b35efa5eSBram Moolenaar  echo a:arg
216b35efa5eSBram Moolenaarendfunc
217b35efa5eSBram Moolenaar
218b35efa5eSBram Moolenaardef Test_call_wrong_arg_count()
219b35efa5eSBram Moolenaar  call CheckDefFailure(['TakesOneArg()'], 'E119:')
220b35efa5eSBram Moolenaar  call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
221b35efa5eSBram Moolenaarenddef
222b35efa5eSBram Moolenaar
223170fcfcfSBram Moolenaar" Default arg and varargs
224170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
225170fcfcfSBram Moolenaar  let res = one .. ',' .. two
226170fcfcfSBram Moolenaar  for s in rest
227170fcfcfSBram Moolenaar    res ..= ',' .. s
228170fcfcfSBram Moolenaar  endfor
229170fcfcfSBram Moolenaar  return res
230170fcfcfSBram Moolenaarenddef
231170fcfcfSBram Moolenaar
232170fcfcfSBram Moolenaardef Test_call_def_varargs()
233170fcfcfSBram Moolenaar  call assert_fails('call MyDefVarargs()', 'E119:')
234170fcfcfSBram Moolenaar  assert_equal('one,foo', MyDefVarargs('one'))
235170fcfcfSBram Moolenaar  assert_equal('one,two', MyDefVarargs('one', 'two'))
236170fcfcfSBram Moolenaar  assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
237170fcfcfSBram Moolenaarenddef
238170fcfcfSBram Moolenaar
23942a480bfSBram Moolenaardef Test_using_var_as_arg()
24042a480bfSBram Moolenaar  call writefile(['def Func(x: number)',  'let x = 234', 'enddef'], 'Xdef')
24142a480bfSBram Moolenaar  call assert_fails('so Xdef', 'E1006:')
24242a480bfSBram Moolenaar  call delete('Xdef')
24342a480bfSBram Moolenaarenddef
24442a480bfSBram Moolenaar
245b35efa5eSBram Moolenaardef Test_call_func_defined_later()
246b35efa5eSBram Moolenaar  call assert_equal('one', DefinedLater('one'))
247b35efa5eSBram Moolenaar  call assert_fails('call NotDefined("one")', 'E117:')
248b35efa5eSBram Moolenaarenddef
249170fcfcfSBram Moolenaar
250b35efa5eSBram Moolenaarfunc DefinedLater(arg)
25126e117e9SBram Moolenaar  return a:arg
25226e117e9SBram Moolenaarendfunc
25326e117e9SBram Moolenaar
2547eeefd4aSBram Moolenaardef FuncWithForwardCall()
2557eeefd4aSBram Moolenaar  return DefinedEvenLater("yes")
2567eeefd4aSBram Moolenaarenddef
2577eeefd4aSBram Moolenaar
2587eeefd4aSBram Moolenaardef DefinedEvenLater(arg: string): string
2597eeefd4aSBram Moolenaar  return arg
2607eeefd4aSBram Moolenaarenddef
2617eeefd4aSBram Moolenaar
2627eeefd4aSBram Moolenaardef Test_error_in_nested_function()
2637eeefd4aSBram Moolenaar  " Error in called function requires unwinding the call stack.
2647eeefd4aSBram Moolenaar  assert_fails('call FuncWithForwardCall()', 'E1029')
2657eeefd4aSBram Moolenaarenddef
2667eeefd4aSBram Moolenaar
2678a7d6542SBram Moolenaardef Test_return_type_wrong()
268978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
269978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
270978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
271978d170bSBram Moolenaar  CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
272*cf3f8bf4SBram Moolenaar
273*cf3f8bf4SBram Moolenaar  CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:')
274*cf3f8bf4SBram Moolenaar  CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:')
2758a7d6542SBram Moolenaarenddef
2768a7d6542SBram Moolenaar
277bfe12043SBram Moolenaardef Test_arg_type_wrong()
278bfe12043SBram Moolenaar  CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
279bfe12043SBram Moolenaarenddef
280bfe12043SBram Moolenaar
2818a7d6542SBram Moolenaardef Test_try_catch()
2828a7d6542SBram Moolenaar  let l = []
2838a7d6542SBram Moolenaar  try
2848a7d6542SBram Moolenaar    add(l, '1')
2858a7d6542SBram Moolenaar    throw 'wrong'
2868a7d6542SBram Moolenaar    add(l, '2')
2878a7d6542SBram Moolenaar  catch
2888a7d6542SBram Moolenaar    add(l, v:exception)
2898a7d6542SBram Moolenaar  finally
2908a7d6542SBram Moolenaar    add(l, '3')
2918a7d6542SBram Moolenaar  endtry
2928a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
2938a7d6542SBram Moolenaarenddef
2948a7d6542SBram Moolenaar
295257cc5eeSBram Moolenaardef ThrowFromDef()
296257cc5eeSBram Moolenaar  throw 'getout'
297257cc5eeSBram Moolenaarenddef
298257cc5eeSBram Moolenaar
299257cc5eeSBram Moolenaarfunc CatchInFunc()
300257cc5eeSBram Moolenaar  try
301257cc5eeSBram Moolenaar    call ThrowFromDef()
302257cc5eeSBram Moolenaar  catch
303257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
304257cc5eeSBram Moolenaar  endtry
305257cc5eeSBram Moolenaarendfunc
306257cc5eeSBram Moolenaar
307257cc5eeSBram Moolenaardef CatchInDef()
308257cc5eeSBram Moolenaar  try
309257cc5eeSBram Moolenaar    ThrowFromDef()
310257cc5eeSBram Moolenaar  catch
311257cc5eeSBram Moolenaar    g:thrown_def = v:exception
312257cc5eeSBram Moolenaar  endtry
313257cc5eeSBram Moolenaarenddef
314257cc5eeSBram Moolenaar
315f575adffSBram Moolenaardef ReturnFinally(): string
316f575adffSBram Moolenaar  try
317f575adffSBram Moolenaar    return 'intry'
318f575adffSBram Moolenaar  finally
319f575adffSBram Moolenaar    g:in_finally = 'finally'
320f575adffSBram Moolenaar  endtry
321f575adffSBram Moolenaar  return 'end'
322f575adffSBram Moolenaarenddef
323f575adffSBram Moolenaar
324257cc5eeSBram Moolenaardef Test_try_catch_nested()
325257cc5eeSBram Moolenaar  CatchInFunc()
326257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
327257cc5eeSBram Moolenaar
328257cc5eeSBram Moolenaar  CatchInDef()
329257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
330f575adffSBram Moolenaar
331f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
332f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
333f575adffSBram Moolenaarenddef
334f575adffSBram Moolenaar
335f575adffSBram Moolenaardef Test_try_catch_match()
336f575adffSBram Moolenaar  let seq = 'a'
337f575adffSBram Moolenaar  try
338f575adffSBram Moolenaar    throw 'something'
339f575adffSBram Moolenaar  catch /nothing/
340f575adffSBram Moolenaar    seq ..= 'x'
341f575adffSBram Moolenaar  catch /some/
342f575adffSBram Moolenaar    seq ..= 'b'
343f575adffSBram Moolenaar  catch /asdf/
344f575adffSBram Moolenaar    seq ..= 'x'
345f575adffSBram Moolenaar  finally
346f575adffSBram Moolenaar    seq ..= 'c'
347f575adffSBram Moolenaar  endtry
348f575adffSBram Moolenaar  assert_equal('abc', seq)
349257cc5eeSBram Moolenaarenddef
350257cc5eeSBram Moolenaar
3518a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
3528a7d6542SBram Moolenaar  vim9script
3538a7d6542SBram Moolenaar  let name: string = 'bob'
3548a7d6542SBram Moolenaar  def Concat(arg: string): string
3558a7d6542SBram Moolenaar    return name .. arg
3568a7d6542SBram Moolenaar  enddef
3578a7d6542SBram Moolenaar  let g:result = Concat('bie')
3588a7d6542SBram Moolenaar  let g:localname = name
3598a7d6542SBram Moolenaar
3608a7d6542SBram Moolenaar  export const CONST = 1234
3618a7d6542SBram Moolenaar  export let exported = 9876
3626e587dcbSBram Moolenaar  export let exp_name = 'John'
3638a7d6542SBram Moolenaar  export def Exported(): string
3648a7d6542SBram Moolenaar    return 'Exported'
3658a7d6542SBram Moolenaar  enddef
3668a7d6542SBram MoolenaarEND
3678a7d6542SBram Moolenaar
3685269bd2aSBram Moolenaardef Test_vim9_import_export()
3698a7d6542SBram Moolenaar  let import_script_lines =<< trim END
3708a7d6542SBram Moolenaar    vim9script
3718a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
3728a7d6542SBram Moolenaar    g:imported = exported
3736e587dcbSBram Moolenaar    exported += 3
3746e587dcbSBram Moolenaar    g:imported_added = exported
3758a7d6542SBram Moolenaar    g:imported_func = Exported()
3766e587dcbSBram Moolenaar
3776e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
3786e587dcbSBram Moolenaar    g:imported_name = exp_name
3796e587dcbSBram Moolenaar    exp_name ..= ' Doe'
3806e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
3815381c7a1SBram Moolenaar    g:imported_later = exported
3828a7d6542SBram Moolenaar  END
3838a7d6542SBram Moolenaar
3848a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
3858a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
3868a7d6542SBram Moolenaar
3878a7d6542SBram Moolenaar  source Ximport.vim
3888a7d6542SBram Moolenaar
3898a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
3908a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
3918a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
3926e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
3935381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
3948a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
3956e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
3966e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
3978a7d6542SBram Moolenaar  assert_false(exists('g:name'))
3988a7d6542SBram Moolenaar
3998a7d6542SBram Moolenaar  unlet g:result
4008a7d6542SBram Moolenaar  unlet g:localname
4018a7d6542SBram Moolenaar  unlet g:imported
4026e587dcbSBram Moolenaar  unlet g:imported_added
4035381c7a1SBram Moolenaar  unlet g:imported_later
4048a7d6542SBram Moolenaar  unlet g:imported_func
4056e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
4068a7d6542SBram Moolenaar  delete('Ximport.vim')
407f2d5c240SBram Moolenaar
4085381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
4095381c7a1SBram Moolenaar    vim9script
4105381c7a1SBram Moolenaar    def ImportInDef()
4115381c7a1SBram Moolenaar      import exported from './Xexport.vim'
4125381c7a1SBram Moolenaar      g:imported = exported
4135381c7a1SBram Moolenaar      exported += 7
4145381c7a1SBram Moolenaar      g:imported_added = exported
4155381c7a1SBram Moolenaar    enddef
4165381c7a1SBram Moolenaar    ImportInDef()
4175381c7a1SBram Moolenaar  END
4185381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
4195381c7a1SBram Moolenaar  source Ximport2.vim
4205381c7a1SBram Moolenaar  " TODO: this should be 9879
4215381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
4225381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
4235381c7a1SBram Moolenaar  unlet g:imported
4245381c7a1SBram Moolenaar  unlet g:imported_added
4255381c7a1SBram Moolenaar  delete('Ximport2.vim')
4265381c7a1SBram Moolenaar
427f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
428f2d5c240SBram Moolenaar    vim9script
429f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
430f2d5c240SBram Moolenaar    def UseExport()
431f2d5c240SBram Moolenaar      g:imported = Export.exported
432f2d5c240SBram Moolenaar    enddef
433f2d5c240SBram Moolenaar    UseExport()
434f2d5c240SBram Moolenaar  END
435f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
436f2d5c240SBram Moolenaar  source Ximport.vim
4375381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
438f2d5c240SBram Moolenaar
439f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
440f2d5c240SBram Moolenaar    vim9script
441f2d5c240SBram Moolenaar    import * from './Xexport.vim'
442f2d5c240SBram Moolenaar    g:imported = exported
443f2d5c240SBram Moolenaar  END
444f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
445f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
446f2d5c240SBram Moolenaar
447fa29c8abSBram Moolenaar  " try to import something that exists but is not exported
448fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
449fa29c8abSBram Moolenaar    vim9script
450fa29c8abSBram Moolenaar    import name from './Xexport.vim'
451fa29c8abSBram Moolenaar  END
452fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
453fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
454fa29c8abSBram Moolenaar
4555269bd2aSBram Moolenaar  " try to import something that is already defined
4565269bd2aSBram Moolenaar  let import_already_defined =<< trim END
4575269bd2aSBram Moolenaar    vim9script
4585269bd2aSBram Moolenaar    let exported = 'something'
4595269bd2aSBram Moolenaar    import exported from './Xexport.vim'
4605269bd2aSBram Moolenaar  END
4615269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
4625269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
4635269bd2aSBram Moolenaar
4645269bd2aSBram Moolenaar  " try to import something that is already defined
4655269bd2aSBram Moolenaar  import_already_defined =<< trim END
4665269bd2aSBram Moolenaar    vim9script
4675269bd2aSBram Moolenaar    let exported = 'something'
4685269bd2aSBram Moolenaar    import * as exported from './Xexport.vim'
4695269bd2aSBram Moolenaar  END
4705269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
4715269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
4725269bd2aSBram Moolenaar
4735269bd2aSBram Moolenaar  " try to import something that is already defined
4745269bd2aSBram Moolenaar  import_already_defined =<< trim END
4755269bd2aSBram Moolenaar    vim9script
4765269bd2aSBram Moolenaar    let exported = 'something'
4775269bd2aSBram Moolenaar    import {exported} from './Xexport.vim'
4785269bd2aSBram Moolenaar  END
4795269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
4805269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
4815269bd2aSBram Moolenaar
482fa29c8abSBram Moolenaar  " import a very long name, requires making a copy
483fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
484fa29c8abSBram Moolenaar    vim9script
485fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
486fa29c8abSBram Moolenaar  END
487fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
488fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
489fa29c8abSBram Moolenaar
490fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
491fa29c8abSBram Moolenaar    vim9script
492fa29c8abSBram Moolenaar    import name './Xexport.vim'
493fa29c8abSBram Moolenaar  END
494fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
495fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
496fa29c8abSBram Moolenaar
497fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
498fa29c8abSBram Moolenaar    vim9script
499fa29c8abSBram Moolenaar    import name from Xexport.vim
500fa29c8abSBram Moolenaar  END
501fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
502fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
503fa29c8abSBram Moolenaar
504fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
505fa29c8abSBram Moolenaar    vim9script
506fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
507fa29c8abSBram Moolenaar  END
508fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
509fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
510fa29c8abSBram Moolenaar
511fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
512fa29c8abSBram Moolenaar    vim9script
513fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
514fa29c8abSBram Moolenaar  END
5155269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
5165269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
517fa29c8abSBram Moolenaar
518f2d5c240SBram Moolenaar  delete('Ximport.vim')
5195269bd2aSBram Moolenaar  delete('Ximport3.vim')
5208a7d6542SBram Moolenaar  delete('Xexport.vim')
5218a7d6542SBram Moolenaar
522750802b5SBram Moolenaar  " Check that in a Vim9 script 'cpo' is set to the Vim default.
523750802b5SBram Moolenaar  set cpo&vi
524750802b5SBram Moolenaar  let cpo_before = &cpo
525750802b5SBram Moolenaar  let lines =<< trim END
526750802b5SBram Moolenaar    vim9script
527750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
528750802b5SBram Moolenaar  END
529750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
530750802b5SBram Moolenaar  source Xvim9_script
531750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
532750802b5SBram Moolenaar  set cpo&vim
533750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
534750802b5SBram Moolenaar  delete('Xvim9_script')
535750802b5SBram Moolenaarenddef
536750802b5SBram Moolenaar
537750802b5SBram Moolenaardef Test_vim9script_fails()
5388a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
5398a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
540750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
541f2d5c240SBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
542750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
543750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
544750802b5SBram Moolenaar
545750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
546750802b5SBram Moolenaar  assert_fails('export something', 'E1042')
5478a7d6542SBram Moolenaarenddef
5488a7d6542SBram Moolenaar
5498a7d6542SBram Moolenaardef Test_vim9script_call()
5508a7d6542SBram Moolenaar  let lines =<< trim END
5518a7d6542SBram Moolenaar    vim9script
5528a7d6542SBram Moolenaar    let var = ''
5538a7d6542SBram Moolenaar    def MyFunc(arg: string)
5548a7d6542SBram Moolenaar       var = arg
5558a7d6542SBram Moolenaar    enddef
5568a7d6542SBram Moolenaar    MyFunc('foobar')
5578a7d6542SBram Moolenaar    assert_equal('foobar', var)
5588a7d6542SBram Moolenaar
5598a7d6542SBram Moolenaar    let str = 'barfoo'
5608a7d6542SBram Moolenaar    str->MyFunc()
5618a7d6542SBram Moolenaar    assert_equal('barfoo', var)
5628a7d6542SBram Moolenaar
5638a7d6542SBram Moolenaar    let g:value = 'value'
5648a7d6542SBram Moolenaar    g:value->MyFunc()
5658a7d6542SBram Moolenaar    assert_equal('value', var)
5668a7d6542SBram Moolenaar
5678a7d6542SBram Moolenaar    let listvar = []
5688a7d6542SBram Moolenaar    def ListFunc(arg: list<number>)
5698a7d6542SBram Moolenaar       listvar = arg
5708a7d6542SBram Moolenaar    enddef
5718a7d6542SBram Moolenaar    [1, 2, 3]->ListFunc()
5728a7d6542SBram Moolenaar    assert_equal([1, 2, 3], listvar)
5738a7d6542SBram Moolenaar
5748a7d6542SBram Moolenaar    let dictvar = {}
5758a7d6542SBram Moolenaar    def DictFunc(arg: dict<number>)
5768a7d6542SBram Moolenaar       dictvar = arg
5778a7d6542SBram Moolenaar    enddef
5788a7d6542SBram Moolenaar    {'a': 1, 'b': 2}->DictFunc()
5798a7d6542SBram Moolenaar    assert_equal(#{a: 1, b: 2}, dictvar)
5808a7d6542SBram Moolenaar    #{a: 3, b: 4}->DictFunc()
5818a7d6542SBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
5820c6ceaf9SBram Moolenaar
5830c6ceaf9SBram Moolenaar    ('text')->MyFunc()
5840c6ceaf9SBram Moolenaar    assert_equal('text', var)
5850c6ceaf9SBram Moolenaar    ("some")->MyFunc()
5860c6ceaf9SBram Moolenaar    assert_equal('some', var)
5878a7d6542SBram Moolenaar  END
5888a7d6542SBram Moolenaar  writefile(lines, 'Xcall.vim')
5898a7d6542SBram Moolenaar  source Xcall.vim
5908a7d6542SBram Moolenaar  delete('Xcall.vim')
5918a7d6542SBram Moolenaarenddef
5928a7d6542SBram Moolenaar
5938a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl()
5948a7d6542SBram Moolenaar  let lines =<< trim END
5958a7d6542SBram Moolenaar    vim9script
5968a7d6542SBram Moolenaar    let var = ''
5978a7d6542SBram Moolenaar    def MyFunc(arg: string)
5988a7d6542SBram Moolenaar       let var = 123
5998a7d6542SBram Moolenaar    enddef
6008a7d6542SBram Moolenaar  END
6018a7d6542SBram Moolenaar  writefile(lines, 'Xcall_decl.vim')
6028a7d6542SBram Moolenaar  assert_fails('source Xcall_decl.vim', 'E1054:')
6038a7d6542SBram Moolenaar  delete('Xcall_decl.vim')
6048a7d6542SBram Moolenaarenddef
6058a7d6542SBram Moolenaar
6068a7d6542SBram Moolenaardef Test_vim9script_call_fail_const()
6078a7d6542SBram Moolenaar  let lines =<< trim END
6088a7d6542SBram Moolenaar    vim9script
6098a7d6542SBram Moolenaar    const var = ''
6108a7d6542SBram Moolenaar    def MyFunc(arg: string)
6118a7d6542SBram Moolenaar       var = 'asdf'
6128a7d6542SBram Moolenaar    enddef
6138a7d6542SBram Moolenaar  END
6148a7d6542SBram Moolenaar  writefile(lines, 'Xcall_const.vim')
6158a7d6542SBram Moolenaar  assert_fails('source Xcall_const.vim', 'E46:')
6168a7d6542SBram Moolenaar  delete('Xcall_const.vim')
6178a7d6542SBram Moolenaarenddef
6188a7d6542SBram Moolenaar
6198a7d6542SBram Moolenaardef Test_vim9script_reload()
6208a7d6542SBram Moolenaar  let lines =<< trim END
6218a7d6542SBram Moolenaar    vim9script
6228a7d6542SBram Moolenaar    const var = ''
6238a7d6542SBram Moolenaar    let valone = 1234
6248a7d6542SBram Moolenaar    def MyFunc(arg: string)
6258a7d6542SBram Moolenaar       valone = 5678
6268a7d6542SBram Moolenaar    enddef
6278a7d6542SBram Moolenaar  END
6288a7d6542SBram Moolenaar  let morelines =<< trim END
6298a7d6542SBram Moolenaar    let valtwo = 222
6308a7d6542SBram Moolenaar    export def GetValtwo(): number
6318a7d6542SBram Moolenaar      return valtwo
6328a7d6542SBram Moolenaar    enddef
6338a7d6542SBram Moolenaar  END
6348a7d6542SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
6358a7d6542SBram Moolenaar  source Xreload.vim
6368a7d6542SBram Moolenaar  source Xreload.vim
6378a7d6542SBram Moolenaar  source Xreload.vim
6388a7d6542SBram Moolenaar
6398a7d6542SBram Moolenaar  let testlines =<< trim END
6408a7d6542SBram Moolenaar    vim9script
6418a7d6542SBram Moolenaar    def TheFunc()
6428a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
6438a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
6448a7d6542SBram Moolenaar    enddef
6458a7d6542SBram Moolenaar    TheFunc()
6468a7d6542SBram Moolenaar  END
6478a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
6488a7d6542SBram Moolenaar  source Ximport.vim
6498a7d6542SBram Moolenaar
6508a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
6518a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
6528a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
6538a7d6542SBram Moolenaar  source Xreload.vim
6548a7d6542SBram Moolenaar  source Ximport.vim
6558a7d6542SBram Moolenaar
6568a7d6542SBram Moolenaar  " cannot declare a var twice
6578a7d6542SBram Moolenaar  lines =<< trim END
6588a7d6542SBram Moolenaar    vim9script
6598a7d6542SBram Moolenaar    let valone = 1234
6608a7d6542SBram Moolenaar    let valone = 5678
6618a7d6542SBram Moolenaar  END
6628a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
6638a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
6648a7d6542SBram Moolenaar
6658a7d6542SBram Moolenaar  delete('Xreload.vim')
6668a7d6542SBram Moolenaar  delete('Ximport.vim')
6678a7d6542SBram Moolenaarenddef
6688a7d6542SBram Moolenaar
6698a7d6542SBram Moolenaardef Test_import_absolute()
6708a7d6542SBram Moolenaar  let import_lines = [
6718a7d6542SBram Moolenaar        \ 'vim9script',
6728a7d6542SBram Moolenaar        \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
673b283a8a6SBram Moolenaar        \ 'def UseExported()',
6748a7d6542SBram Moolenaar        \ '  g:imported_abs = exported',
6754e12a5dfSBram Moolenaar        \ '  exported = 8888',
6764e12a5dfSBram Moolenaar        \ '  g:imported_after = exported',
677b283a8a6SBram Moolenaar        \ 'enddef',
678b283a8a6SBram Moolenaar        \ 'UseExported()',
6794e12a5dfSBram Moolenaar        \ 'g:import_disassembled = execute("disass UseExported")',
6808a7d6542SBram Moolenaar        \ ]
6818a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
6828a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
6838a7d6542SBram Moolenaar
6848a7d6542SBram Moolenaar  source Ximport_abs.vim
6858a7d6542SBram Moolenaar
6868a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
6874e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
688b283a8a6SBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*'
689b283a8a6SBram Moolenaar        \ .. 'g:imported_abs = exported.*'
690b283a8a6SBram Moolenaar        \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
6914e12a5dfSBram Moolenaar        \ .. '1 STOREG g:imported_abs.*'
6924e12a5dfSBram Moolenaar        \ .. 'exported = 8888.*'
6934e12a5dfSBram Moolenaar        \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
6944e12a5dfSBram Moolenaar        \ .. 'g:imported_after = exported.*'
6954e12a5dfSBram Moolenaar        \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
6964e12a5dfSBram Moolenaar        \ .. '5 STOREG g:imported_after.*'
6974e12a5dfSBram Moolenaar        \, g:import_disassembled)
6988a7d6542SBram Moolenaar  unlet g:imported_abs
6994e12a5dfSBram Moolenaar  unlet g:import_disassembled
7008a7d6542SBram Moolenaar
7018a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
7028a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
7038a7d6542SBram Moolenaarenddef
7048a7d6542SBram Moolenaar
7058a7d6542SBram Moolenaardef Test_import_rtp()
7068a7d6542SBram Moolenaar  let import_lines = [
7078a7d6542SBram Moolenaar        \ 'vim9script',
7088a7d6542SBram Moolenaar        \ 'import exported from "Xexport_rtp.vim"',
7098a7d6542SBram Moolenaar        \ 'g:imported_rtp = exported',
7108a7d6542SBram Moolenaar        \ ]
7118a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
7128a7d6542SBram Moolenaar  mkdir('import')
7138a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
7148a7d6542SBram Moolenaar
7158a7d6542SBram Moolenaar  let save_rtp = &rtp
7168a7d6542SBram Moolenaar  &rtp = getcwd()
7178a7d6542SBram Moolenaar  source Ximport_rtp.vim
7188a7d6542SBram Moolenaar  &rtp = save_rtp
7198a7d6542SBram Moolenaar
7208a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
7218a7d6542SBram Moolenaar  unlet g:imported_rtp
7228a7d6542SBram Moolenaar
7238a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
7248a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
7258a7d6542SBram Moolenaar  delete('import', 'd')
7268a7d6542SBram Moolenaarenddef
7278a7d6542SBram Moolenaar
7288a7d6542SBram Moolenaardef Test_fixed_size_list()
7298a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
7308a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
7318a7d6542SBram Moolenaar  l->remove(0)
7328a7d6542SBram Moolenaar  l->add(5)
7338a7d6542SBram Moolenaar  l->insert(99, 1)
7340f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
7358a7d6542SBram Moolenaarenddef
7368a7d6542SBram Moolenaar
737673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not
738673660abSBram Moolenaar" recognized.
739673660abSBram Moolenaarfunc Test_function_python()
740673660abSBram Moolenaar  CheckFeature python3
741673660abSBram Moolenaar  let py = 'python3'
742673660abSBram Moolenaar  execute py "<< EOF"
743673660abSBram Moolenaardef do_something():
744673660abSBram Moolenaar  return 1
745673660abSBram MoolenaarEOF
746673660abSBram Moolenaarendfunc
747673660abSBram Moolenaar
748158906cfSBram Moolenaardef IfElse(what: number): string
749158906cfSBram Moolenaar  let res = ''
750158906cfSBram Moolenaar  if what == 1
751158906cfSBram Moolenaar    res = "one"
752158906cfSBram Moolenaar  elseif what == 2
753158906cfSBram Moolenaar    res = "two"
754a259d8d3SBram Moolenaar  else
755158906cfSBram Moolenaar    res = "three"
756a259d8d3SBram Moolenaar  endif
757158906cfSBram Moolenaar  return res
758a259d8d3SBram Moolenaarenddef
759a259d8d3SBram Moolenaar
760158906cfSBram Moolenaardef Test_if_elseif_else()
761158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
762158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
763158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
7640f18b6d1SBram Moolenaarenddef
7650f18b6d1SBram Moolenaar
7666d69bf60SBram Moolenaarlet g:bool_true = v:true
7676d69bf60SBram Moolenaarlet g:bool_false = v:false
7686d69bf60SBram Moolenaar
7696d69bf60SBram Moolenaardef Test_if_const_expr()
7706d69bf60SBram Moolenaar  let res = false
7716d69bf60SBram Moolenaar  if true ? true : false
7726d69bf60SBram Moolenaar    res = true
7736d69bf60SBram Moolenaar  endif
7746d69bf60SBram Moolenaar  assert_equal(true, res)
7756d69bf60SBram Moolenaar
7766d69bf60SBram Moolenaar  res = false
7776d69bf60SBram Moolenaar  if g:bool_true ? true : false
7786d69bf60SBram Moolenaar    res = true
7796d69bf60SBram Moolenaar  endif
7806d69bf60SBram Moolenaar  assert_equal(true, res)
7816d69bf60SBram Moolenaar
7826d69bf60SBram Moolenaar  res = false
7836d69bf60SBram Moolenaar  if true ? g:bool_true : false
7846d69bf60SBram Moolenaar    res = true
7856d69bf60SBram Moolenaar  endif
7866d69bf60SBram Moolenaar  assert_equal(true, res)
7876d69bf60SBram Moolenaar
7886d69bf60SBram Moolenaar  res = false
7896d69bf60SBram Moolenaar  if true ? true : g:bool_false
7906d69bf60SBram Moolenaar    res = true
7916d69bf60SBram Moolenaar  endif
7926d69bf60SBram Moolenaar  assert_equal(true, res)
7936d69bf60SBram Moolenaar
7946d69bf60SBram Moolenaar  res = false
7956d69bf60SBram Moolenaar  if true ? false : true
7966d69bf60SBram Moolenaar    res = true
7976d69bf60SBram Moolenaar  endif
7986d69bf60SBram Moolenaar  assert_equal(false, res)
7996d69bf60SBram Moolenaar
8006d69bf60SBram Moolenaar  res = false
8016d69bf60SBram Moolenaar  if false ? false : true
8026d69bf60SBram Moolenaar    res = true
8036d69bf60SBram Moolenaar  endif
8046d69bf60SBram Moolenaar  assert_equal(true, res)
8056d69bf60SBram Moolenaar
8066d69bf60SBram Moolenaar  res = false
8076d69bf60SBram Moolenaar  if false ? true : false
8086d69bf60SBram Moolenaar    res = true
8096d69bf60SBram Moolenaar  endif
8106d69bf60SBram Moolenaar  assert_equal(false, res)
8116d69bf60SBram Moolenaar
8126d69bf60SBram Moolenaar  res = false
8136d69bf60SBram Moolenaar  if true && true
8146d69bf60SBram Moolenaar    res = true
8156d69bf60SBram Moolenaar  endif
8166d69bf60SBram Moolenaar  assert_equal(true, res)
8176d69bf60SBram Moolenaar
8186d69bf60SBram Moolenaar  res = false
8196d69bf60SBram Moolenaar  if true && false
8206d69bf60SBram Moolenaar    res = true
8216d69bf60SBram Moolenaar  endif
8226d69bf60SBram Moolenaar  assert_equal(false, res)
8236d69bf60SBram Moolenaar
8246d69bf60SBram Moolenaar  res = false
8256d69bf60SBram Moolenaar  if g:bool_true && false
8266d69bf60SBram Moolenaar    res = true
8276d69bf60SBram Moolenaar  endif
8286d69bf60SBram Moolenaar  assert_equal(false, res)
8296d69bf60SBram Moolenaar
8306d69bf60SBram Moolenaar  res = false
8316d69bf60SBram Moolenaar  if true && g:bool_false
8326d69bf60SBram Moolenaar    res = true
8336d69bf60SBram Moolenaar  endif
8346d69bf60SBram Moolenaar  assert_equal(false, res)
8356d69bf60SBram Moolenaar
8366d69bf60SBram Moolenaar  res = false
8376d69bf60SBram Moolenaar  if false && false
8386d69bf60SBram Moolenaar    res = true
8396d69bf60SBram Moolenaar  endif
8406d69bf60SBram Moolenaar  assert_equal(false, res)
8416d69bf60SBram Moolenaar
8426d69bf60SBram Moolenaar  res = false
8436d69bf60SBram Moolenaar  if true || false
8446d69bf60SBram Moolenaar    res = true
8456d69bf60SBram Moolenaar  endif
8466d69bf60SBram Moolenaar  assert_equal(true, res)
8476d69bf60SBram Moolenaar
8486d69bf60SBram Moolenaar  res = false
8496d69bf60SBram Moolenaar  if g:bool_true || false
8506d69bf60SBram Moolenaar    res = true
8516d69bf60SBram Moolenaar  endif
8526d69bf60SBram Moolenaar  assert_equal(true, res)
8536d69bf60SBram Moolenaar
8546d69bf60SBram Moolenaar  res = false
8556d69bf60SBram Moolenaar  if true || g:bool_false
8566d69bf60SBram Moolenaar    res = true
8576d69bf60SBram Moolenaar  endif
8586d69bf60SBram Moolenaar  assert_equal(true, res)
8596d69bf60SBram Moolenaar
8606d69bf60SBram Moolenaar  res = false
8616d69bf60SBram Moolenaar  if false || false
8626d69bf60SBram Moolenaar    res = true
8636d69bf60SBram Moolenaar  endif
8646d69bf60SBram Moolenaar  assert_equal(false, res)
8656d69bf60SBram Moolenaar
8666d69bf60SBram Moolenaarenddef
8676d69bf60SBram Moolenaar
86863ce4849SBram Moolenaardef Test_delfunc()
86963ce4849SBram Moolenaar  let lines =<< trim END
87063ce4849SBram Moolenaar    vim9script
87163ce4849SBram Moolenaar    def GoneSoon()
87263ce4849SBram Moolenaar      echo 'hello'
87363ce4849SBram Moolenaar    enddef
87463ce4849SBram Moolenaar
87563ce4849SBram Moolenaar    def CallGoneSoon()
87663ce4849SBram Moolenaar      GoneSoon()
87763ce4849SBram Moolenaar    enddef
87863ce4849SBram Moolenaar
87963ce4849SBram Moolenaar    delfunc GoneSoon
88063ce4849SBram Moolenaar    CallGoneSoon()
88163ce4849SBram Moolenaar  END
88263ce4849SBram Moolenaar  writefile(lines, 'XToDelFunc')
88363ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
88463ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
88563ce4849SBram Moolenaar
88663ce4849SBram Moolenaar  delete('XToDelFunc')
88763ce4849SBram Moolenaarenddef
88863ce4849SBram Moolenaar
889ad39c094SBram Moolenaardef Test_execute_cmd()
890ad39c094SBram Moolenaar  new
891ad39c094SBram Moolenaar  setline(1, 'default')
892ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
893ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
894ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
895ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
896ad39c094SBram Moolenaar  execute cmd1 cmd2
897ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
898ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
899ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
900ad39c094SBram Moolenaar  let cmd_first = 'call '
901ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
902ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
903ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
904ad39c094SBram Moolenaar  bwipe!
905ad39c094SBram Moolenaarenddef
906ad39c094SBram Moolenaar
907ad39c094SBram Moolenaardef Test_echo_cmd()
908ad39c094SBram Moolenaar  echo 'something'
909ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
910ad39c094SBram Moolenaar
911ad39c094SBram Moolenaar  let str1 = 'some'
912ad39c094SBram Moolenaar  let str2 = 'more'
913ad39c094SBram Moolenaar  echo str1 str2
914ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
915ad39c094SBram Moolenaarenddef
916ad39c094SBram Moolenaar
91741fe0617SBram Moolenaardef Test_for_outside_of_function()
91841fe0617SBram Moolenaar  let lines =<< trim END
91941fe0617SBram Moolenaar    vim9script
92041fe0617SBram Moolenaar    new
92141fe0617SBram Moolenaar    for var in range(0, 3)
92241fe0617SBram Moolenaar      append(line('$'), var)
92341fe0617SBram Moolenaar    endfor
92441fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
92541fe0617SBram Moolenaar    bwipe!
92641fe0617SBram Moolenaar  END
92741fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
92841fe0617SBram Moolenaar  source Xvim9for.vim
92941fe0617SBram Moolenaar  delete('Xvim9for.vim')
93041fe0617SBram Moolenaarenddef
9318a7d6542SBram Moolenaar
932d0df1aacSBram Moolenaardef Test_while_loop()
933d0df1aacSBram Moolenaar  let result = ''
934d0df1aacSBram Moolenaar  let cnt = 0
935d0df1aacSBram Moolenaar  while cnt < 555
936d0df1aacSBram Moolenaar    if cnt == 3
937d0df1aacSBram Moolenaar      break
938d0df1aacSBram Moolenaar    endif
939d0df1aacSBram Moolenaar    cnt += 1
940d0df1aacSBram Moolenaar    if cnt == 2
941d0df1aacSBram Moolenaar      continue
942d0df1aacSBram Moolenaar    endif
943d0df1aacSBram Moolenaar    result ..= cnt .. '_'
944d0df1aacSBram Moolenaar  endwhile
945d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
946d0df1aacSBram Moolenaarenddef
947d0df1aacSBram Moolenaar
9489645e2d9SBram Moolenaardef Test_interrupt_loop()
94997acfc78SBram Moolenaar  let caught = false
9509645e2d9SBram Moolenaar  let x = 0
95197acfc78SBram Moolenaar  try
9529645e2d9SBram Moolenaar    while 1
9539645e2d9SBram Moolenaar      x += 1
9549645e2d9SBram Moolenaar      if x == 100
9559645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
9569645e2d9SBram Moolenaar      endif
9579645e2d9SBram Moolenaar    endwhile
95897acfc78SBram Moolenaar  catch
95997acfc78SBram Moolenaar    caught = true
96097acfc78SBram Moolenaar    assert_equal(100, x)
96197acfc78SBram Moolenaar  endtry
96297acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
9639645e2d9SBram Moolenaarenddef
96420431c9dSBram Moolenaar
965d0df1aacSBram Moolenaardef Test_substitute_cmd()
966d0df1aacSBram Moolenaar  new
967d0df1aacSBram Moolenaar  setline(1, 'something')
968d0df1aacSBram Moolenaar  :substitute(some(other(
969d0df1aacSBram Moolenaar  assert_equal('otherthing', getline(1))
970d0df1aacSBram Moolenaar  bwipe!
971d0df1aacSBram Moolenaar
972d0df1aacSBram Moolenaar  " also when the context is Vim9 script
973d0df1aacSBram Moolenaar  let lines =<< trim END
974d0df1aacSBram Moolenaar    vim9script
975d0df1aacSBram Moolenaar    new
976d0df1aacSBram Moolenaar    setline(1, 'something')
977d0df1aacSBram Moolenaar    :substitute(some(other(
978d0df1aacSBram Moolenaar    assert_equal('otherthing', getline(1))
979d0df1aacSBram Moolenaar    bwipe!
980d0df1aacSBram Moolenaar  END
981d0df1aacSBram Moolenaar  writefile(lines, 'Xvim9lines')
982d0df1aacSBram Moolenaar  source Xvim9lines
983d0df1aacSBram Moolenaar
984d0df1aacSBram Moolenaar  delete('Xvim9lines')
985d0df1aacSBram Moolenaarenddef
986d0df1aacSBram Moolenaar
98720431c9dSBram Moolenaardef Test_redef_failure()
98820431c9dSBram Moolenaar  call writefile(['def Func0(): string',  'return "Func0"', 'enddef'], 'Xdef')
98920431c9dSBram Moolenaar  so Xdef
99020431c9dSBram Moolenaar  call writefile(['def Func1(): string',  'return "Func1"', 'enddef'], 'Xdef')
99120431c9dSBram Moolenaar  so Xdef
99220431c9dSBram Moolenaar  call writefile(['def! Func0(): string', 'enddef'], 'Xdef')
99320431c9dSBram Moolenaar  call assert_fails('so Xdef', 'E1027:')
99420431c9dSBram Moolenaar  call writefile(['def Func2(): string',  'return "Func2"', 'enddef'], 'Xdef')
99520431c9dSBram Moolenaar  so Xdef
99620431c9dSBram Moolenaar  call delete('Xdef')
99720431c9dSBram Moolenaar
99820431c9dSBram Moolenaar  call assert_equal(0, Func0())
99920431c9dSBram Moolenaar  call assert_equal('Func1', Func1())
100020431c9dSBram Moolenaar  call assert_equal('Func2', Func2())
100120431c9dSBram Moolenaar
100220431c9dSBram Moolenaar  delfunc! Func0
100320431c9dSBram Moolenaar  delfunc! Func1
100420431c9dSBram Moolenaar  delfunc! Func2
100520431c9dSBram Moolenaarenddef
100620431c9dSBram Moolenaar
10078a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
1008