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
69*61a6d4e4SBram Moolenaar  " type becomes list<any>
70*61a6d4e4SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
71*61a6d4e4SBram Moolenaar
72401d9ffbSBram Moolenaar  g:newvar = 'new'
73401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
74401d9ffbSBram Moolenaar
75401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
76401d9ffbSBram Moolenaar  g:existing = 'no'
77401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
78401d9ffbSBram Moolenaar
79b283a8a6SBram Moolenaar  v:char = 'abc'
806e587dcbSBram Moolenaar  assert_equal('abc', v:char)
81b283a8a6SBram Moolenaar
82b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
836e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
84b283a8a6SBram Moolenaar  $ENVVAR = ''
856e587dcbSBram Moolenaar
86fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
87fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
88fd1823e0SBram Moolenaar  s:addToMe += 222
89fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
900bbf722aSBram Moolenaar  s:newVar = 'new'
910bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
928a7d6542SBram Moolenaarenddef
938a7d6542SBram Moolenaar
948a7d6542SBram Moolenaarfunc Test_assignment_failure()
958a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
968a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
978a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
988a7d6542SBram Moolenaar
998a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
1008a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
1018a7d6542SBram Moolenaar
1028a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
1038a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
1048a7d6542SBram Moolenaar
1058a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
1068a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
1078a7d6542SBram Moolenaar
1088a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
1098a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
11042a480bfSBram Moolenaar
11142a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1007:')
11242a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
11342a480bfSBram Moolenaar
11442a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
11542a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
11642a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
11742a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
11842a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
11942a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
12042a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
12142a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
12242a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
12342a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
12442a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
1258a7d6542SBram Moolenaarendfunc
1268a7d6542SBram Moolenaar
1278a7d6542SBram Moolenaarfunc Test_const()
1288a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
1298a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
1308a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
1318a7d6542SBram Moolenaarendfunc
1328a7d6542SBram Moolenaar
1338a7d6542SBram Moolenaardef Test_block()
1348a7d6542SBram Moolenaar  let outer = 1
1358a7d6542SBram Moolenaar  {
1368a7d6542SBram Moolenaar    let inner = 2
1378a7d6542SBram Moolenaar    assert_equal(1, outer)
1388a7d6542SBram Moolenaar    assert_equal(2, inner)
1398a7d6542SBram Moolenaar  }
1408a7d6542SBram Moolenaar  assert_equal(1, outer)
1418a7d6542SBram Moolenaarenddef
1428a7d6542SBram Moolenaar
1438a7d6542SBram Moolenaarfunc Test_block_failure()
1448a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
1458a7d6542SBram Moolenaarendfunc
1468a7d6542SBram Moolenaar
1478a7d6542SBram Moolenaardef ReturnString(): string
1488a7d6542SBram Moolenaar  return 'string'
1498a7d6542SBram Moolenaarenddef
1508a7d6542SBram Moolenaar
1518a7d6542SBram Moolenaardef ReturnNumber(): number
1528a7d6542SBram Moolenaar  return 123
1538a7d6542SBram Moolenaarenddef
1548a7d6542SBram Moolenaar
15509f28f49SBram Moolenaarlet g:notNumber = 'string'
15609f28f49SBram Moolenaar
15709f28f49SBram Moolenaardef ReturnGlobal(): number
15809f28f49SBram Moolenaar  return g:notNumber
15909f28f49SBram Moolenaarenddef
16009f28f49SBram Moolenaar
1618a7d6542SBram Moolenaardef Test_return_string()
1628a7d6542SBram Moolenaar  assert_equal('string', ReturnString())
1638a7d6542SBram Moolenaar  assert_equal(123, ReturnNumber())
16409f28f49SBram Moolenaar  assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string')
1658a7d6542SBram Moolenaarenddef
1668a7d6542SBram Moolenaar
1678a7d6542SBram Moolenaarfunc Increment()
1688a7d6542SBram Moolenaar  let g:counter += 1
1698a7d6542SBram Moolenaarendfunc
1708a7d6542SBram Moolenaar
1718a7d6542SBram Moolenaardef Test_call_ufunc_count()
1728a7d6542SBram Moolenaar  g:counter = 1
1738a7d6542SBram Moolenaar  Increment()
1748a7d6542SBram Moolenaar  Increment()
1758a7d6542SBram Moolenaar  Increment()
1768a7d6542SBram Moolenaar  " works with and without :call
1778a7d6542SBram Moolenaar  assert_equal(4, g:counter)
178b283a8a6SBram Moolenaar  call assert_equal(4, g:counter)
1798a7d6542SBram Moolenaar  unlet g:counter
1808a7d6542SBram Moolenaarenddef
1818a7d6542SBram Moolenaar
1828a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string
1838a7d6542SBram Moolenaar  let res = arg
1848a7d6542SBram Moolenaar  for s in rest
1858a7d6542SBram Moolenaar    res ..= ',' .. s
1868a7d6542SBram Moolenaar  endfor
1878a7d6542SBram Moolenaar  return res
1888a7d6542SBram Moolenaarenddef
1898a7d6542SBram Moolenaar
1908a7d6542SBram Moolenaardef Test_call_varargs()
1918a7d6542SBram Moolenaar  assert_equal('one', MyVarargs('one'))
1928a7d6542SBram Moolenaar  assert_equal('one,two', MyVarargs('one', 'two'))
1938a7d6542SBram Moolenaar  assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
1948a7d6542SBram Moolenaarenddef
1958a7d6542SBram Moolenaar
196170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string
197170fcfcfSBram Moolenaar  return name
198170fcfcfSBram Moolenaarenddef
199170fcfcfSBram Moolenaar
200170fcfcfSBram Moolenaardef Test_call_default_args()
201170fcfcfSBram Moolenaar  assert_equal('string', MyDefaultArgs())
202170fcfcfSBram Moolenaar  assert_equal('one', MyDefaultArgs('one'))
203170fcfcfSBram Moolenaar  assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
204170fcfcfSBram Moolenaarenddef
205170fcfcfSBram Moolenaar
206170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func()
207170fcfcfSBram Moolenaar  call assert_equal('string', MyDefaultArgs())
208170fcfcfSBram Moolenaar  call assert_equal('one', MyDefaultArgs('one'))
209170fcfcfSBram Moolenaar  call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
210170fcfcfSBram Moolenaarendfunc
211170fcfcfSBram Moolenaar
212b35efa5eSBram Moolenaarfunc TakesOneArg(arg)
213b35efa5eSBram Moolenaar  echo a:arg
214b35efa5eSBram Moolenaarendfunc
215b35efa5eSBram Moolenaar
216b35efa5eSBram Moolenaardef Test_call_wrong_arg_count()
217b35efa5eSBram Moolenaar  call CheckDefFailure(['TakesOneArg()'], 'E119:')
218b35efa5eSBram Moolenaar  call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
219b35efa5eSBram Moolenaarenddef
220b35efa5eSBram Moolenaar
221170fcfcfSBram Moolenaar" Default arg and varargs
222170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
223170fcfcfSBram Moolenaar  let res = one .. ',' .. two
224170fcfcfSBram Moolenaar  for s in rest
225170fcfcfSBram Moolenaar    res ..= ',' .. s
226170fcfcfSBram Moolenaar  endfor
227170fcfcfSBram Moolenaar  return res
228170fcfcfSBram Moolenaarenddef
229170fcfcfSBram Moolenaar
230170fcfcfSBram Moolenaardef Test_call_def_varargs()
231170fcfcfSBram Moolenaar  call assert_fails('call MyDefVarargs()', 'E119:')
232170fcfcfSBram Moolenaar  assert_equal('one,foo', MyDefVarargs('one'))
233170fcfcfSBram Moolenaar  assert_equal('one,two', MyDefVarargs('one', 'two'))
234170fcfcfSBram Moolenaar  assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
235170fcfcfSBram Moolenaarenddef
236170fcfcfSBram Moolenaar
23742a480bfSBram Moolenaardef Test_using_var_as_arg()
23842a480bfSBram Moolenaar  call writefile(['def Func(x: number)',  'let x = 234', 'enddef'], 'Xdef')
23942a480bfSBram Moolenaar  call assert_fails('so Xdef', 'E1006:')
24042a480bfSBram Moolenaar  call delete('Xdef')
24142a480bfSBram Moolenaarenddef
24242a480bfSBram Moolenaar
243b35efa5eSBram Moolenaardef Test_call_func_defined_later()
244b35efa5eSBram Moolenaar  call assert_equal('one', DefinedLater('one'))
245b35efa5eSBram Moolenaar  call assert_fails('call NotDefined("one")', 'E117:')
246b35efa5eSBram Moolenaarenddef
247170fcfcfSBram Moolenaar
248b35efa5eSBram Moolenaarfunc DefinedLater(arg)
24926e117e9SBram Moolenaar  return a:arg
25026e117e9SBram Moolenaarendfunc
25126e117e9SBram Moolenaar
2527eeefd4aSBram Moolenaardef FuncWithForwardCall()
2537eeefd4aSBram Moolenaar  return DefinedEvenLater("yes")
2547eeefd4aSBram Moolenaarenddef
2557eeefd4aSBram Moolenaar
2567eeefd4aSBram Moolenaardef DefinedEvenLater(arg: string): string
2577eeefd4aSBram Moolenaar  return arg
2587eeefd4aSBram Moolenaarenddef
2597eeefd4aSBram Moolenaar
2607eeefd4aSBram Moolenaardef Test_error_in_nested_function()
2617eeefd4aSBram Moolenaar  " Error in called function requires unwinding the call stack.
2627eeefd4aSBram Moolenaar  assert_fails('call FuncWithForwardCall()', 'E1029')
2637eeefd4aSBram Moolenaarenddef
2647eeefd4aSBram Moolenaar
2658a7d6542SBram Moolenaardef Test_return_type_wrong()
266978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
267978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
268978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
269978d170bSBram Moolenaar  CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
2708a7d6542SBram Moolenaarenddef
2718a7d6542SBram Moolenaar
272bfe12043SBram Moolenaardef Test_arg_type_wrong()
273bfe12043SBram Moolenaar  CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
274bfe12043SBram Moolenaarenddef
275bfe12043SBram Moolenaar
2768a7d6542SBram Moolenaardef Test_try_catch()
2778a7d6542SBram Moolenaar  let l = []
2788a7d6542SBram Moolenaar  try
2798a7d6542SBram Moolenaar    add(l, '1')
2808a7d6542SBram Moolenaar    throw 'wrong'
2818a7d6542SBram Moolenaar    add(l, '2')
2828a7d6542SBram Moolenaar  catch
2838a7d6542SBram Moolenaar    add(l, v:exception)
2848a7d6542SBram Moolenaar  finally
2858a7d6542SBram Moolenaar    add(l, '3')
2868a7d6542SBram Moolenaar  endtry
2878a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
2888a7d6542SBram Moolenaarenddef
2898a7d6542SBram Moolenaar
290257cc5eeSBram Moolenaardef ThrowFromDef()
291257cc5eeSBram Moolenaar  throw 'getout'
292257cc5eeSBram Moolenaarenddef
293257cc5eeSBram Moolenaar
294257cc5eeSBram Moolenaarfunc CatchInFunc()
295257cc5eeSBram Moolenaar  try
296257cc5eeSBram Moolenaar    call ThrowFromDef()
297257cc5eeSBram Moolenaar  catch
298257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
299257cc5eeSBram Moolenaar  endtry
300257cc5eeSBram Moolenaarendfunc
301257cc5eeSBram Moolenaar
302257cc5eeSBram Moolenaardef CatchInDef()
303257cc5eeSBram Moolenaar  try
304257cc5eeSBram Moolenaar    ThrowFromDef()
305257cc5eeSBram Moolenaar  catch
306257cc5eeSBram Moolenaar    g:thrown_def = v:exception
307257cc5eeSBram Moolenaar  endtry
308257cc5eeSBram Moolenaarenddef
309257cc5eeSBram Moolenaar
310f575adffSBram Moolenaardef ReturnFinally(): string
311f575adffSBram Moolenaar  try
312f575adffSBram Moolenaar    return 'intry'
313f575adffSBram Moolenaar  finally
314f575adffSBram Moolenaar    g:in_finally = 'finally'
315f575adffSBram Moolenaar  endtry
316f575adffSBram Moolenaar  return 'end'
317f575adffSBram Moolenaarenddef
318f575adffSBram Moolenaar
319257cc5eeSBram Moolenaardef Test_try_catch_nested()
320257cc5eeSBram Moolenaar  CatchInFunc()
321257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
322257cc5eeSBram Moolenaar
323257cc5eeSBram Moolenaar  CatchInDef()
324257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
325f575adffSBram Moolenaar
326f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
327f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
328f575adffSBram Moolenaarenddef
329f575adffSBram Moolenaar
330f575adffSBram Moolenaardef Test_try_catch_match()
331f575adffSBram Moolenaar  let seq = 'a'
332f575adffSBram Moolenaar  try
333f575adffSBram Moolenaar    throw 'something'
334f575adffSBram Moolenaar  catch /nothing/
335f575adffSBram Moolenaar    seq ..= 'x'
336f575adffSBram Moolenaar  catch /some/
337f575adffSBram Moolenaar    seq ..= 'b'
338f575adffSBram Moolenaar  catch /asdf/
339f575adffSBram Moolenaar    seq ..= 'x'
340f575adffSBram Moolenaar  finally
341f575adffSBram Moolenaar    seq ..= 'c'
342f575adffSBram Moolenaar  endtry
343f575adffSBram Moolenaar  assert_equal('abc', seq)
344257cc5eeSBram Moolenaarenddef
345257cc5eeSBram Moolenaar
3468a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
3478a7d6542SBram Moolenaar  vim9script
3488a7d6542SBram Moolenaar  let name: string = 'bob'
3498a7d6542SBram Moolenaar  def Concat(arg: string): string
3508a7d6542SBram Moolenaar    return name .. arg
3518a7d6542SBram Moolenaar  enddef
3528a7d6542SBram Moolenaar  let g:result = Concat('bie')
3538a7d6542SBram Moolenaar  let g:localname = name
3548a7d6542SBram Moolenaar
3558a7d6542SBram Moolenaar  export const CONST = 1234
3568a7d6542SBram Moolenaar  export let exported = 9876
3576e587dcbSBram Moolenaar  export let exp_name = 'John'
3588a7d6542SBram Moolenaar  export def Exported(): string
3598a7d6542SBram Moolenaar    return 'Exported'
3608a7d6542SBram Moolenaar  enddef
3618a7d6542SBram MoolenaarEND
3628a7d6542SBram Moolenaar
3638a7d6542SBram Moolenaardef Test_vim9script()
3648a7d6542SBram Moolenaar  let import_script_lines =<< trim END
3658a7d6542SBram Moolenaar    vim9script
3668a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
3678a7d6542SBram Moolenaar    g:imported = exported
3686e587dcbSBram Moolenaar    exported += 3
3696e587dcbSBram Moolenaar    g:imported_added = exported
3708a7d6542SBram Moolenaar    g:imported_func = Exported()
3716e587dcbSBram Moolenaar
3726e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
3736e587dcbSBram Moolenaar    g:imported_name = exp_name
3746e587dcbSBram Moolenaar    exp_name ..= ' Doe'
3756e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
3768a7d6542SBram Moolenaar  END
3778a7d6542SBram Moolenaar
3788a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
3798a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
3808a7d6542SBram Moolenaar
3818a7d6542SBram Moolenaar  source Ximport.vim
3828a7d6542SBram Moolenaar
3838a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
3848a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
3858a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
3866e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
3878a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
3886e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
3896e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
3908a7d6542SBram Moolenaar  assert_false(exists('g:name'))
3918a7d6542SBram Moolenaar
3928a7d6542SBram Moolenaar  unlet g:result
3938a7d6542SBram Moolenaar  unlet g:localname
3948a7d6542SBram Moolenaar  unlet g:imported
3956e587dcbSBram Moolenaar  unlet g:imported_added
3968a7d6542SBram Moolenaar  unlet g:imported_func
3976e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
3988a7d6542SBram Moolenaar  delete('Ximport.vim')
399f2d5c240SBram Moolenaar
400f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
401f2d5c240SBram Moolenaar    vim9script
402f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
403f2d5c240SBram Moolenaar    def UseExport()
404f2d5c240SBram Moolenaar      g:imported = Export.exported
405f2d5c240SBram Moolenaar    enddef
406f2d5c240SBram Moolenaar    UseExport()
407f2d5c240SBram Moolenaar  END
408f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
409f2d5c240SBram Moolenaar  source Ximport.vim
410f2d5c240SBram Moolenaar  assert_equal(9876, g:imported)
411f2d5c240SBram Moolenaar
412f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
413f2d5c240SBram Moolenaar    vim9script
414f2d5c240SBram Moolenaar    import * from './Xexport.vim'
415f2d5c240SBram Moolenaar    g:imported = exported
416f2d5c240SBram Moolenaar  END
417f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
418f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
419f2d5c240SBram Moolenaar
420fa29c8abSBram Moolenaar  " try to import something that exists but is not exported
421fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
422fa29c8abSBram Moolenaar    vim9script
423fa29c8abSBram Moolenaar    import name from './Xexport.vim'
424fa29c8abSBram Moolenaar  END
425fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
426fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
427fa29c8abSBram Moolenaar
428fa29c8abSBram Moolenaar  " import a very long name, requires making a copy
429fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
430fa29c8abSBram Moolenaar    vim9script
431fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
432fa29c8abSBram Moolenaar  END
433fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
434fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
435fa29c8abSBram Moolenaar
436fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
437fa29c8abSBram Moolenaar    vim9script
438fa29c8abSBram Moolenaar    import name './Xexport.vim'
439fa29c8abSBram Moolenaar  END
440fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
441fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
442fa29c8abSBram Moolenaar
443fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
444fa29c8abSBram Moolenaar    vim9script
445fa29c8abSBram Moolenaar    import name from Xexport.vim
446fa29c8abSBram Moolenaar  END
447fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
448fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
449fa29c8abSBram Moolenaar
450fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
451fa29c8abSBram Moolenaar    vim9script
452fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
453fa29c8abSBram Moolenaar  END
454fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
455fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
456fa29c8abSBram Moolenaar
457fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
458fa29c8abSBram Moolenaar    vim9script
459fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
460fa29c8abSBram Moolenaar  END
461fa29c8abSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport.vim')
462fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1046:')
463fa29c8abSBram Moolenaar
464f2d5c240SBram Moolenaar  delete('Ximport.vim')
4658a7d6542SBram Moolenaar  delete('Xexport.vim')
4668a7d6542SBram Moolenaar
467750802b5SBram Moolenaar  " Check that in a Vim9 script 'cpo' is set to the Vim default.
468750802b5SBram Moolenaar  set cpo&vi
469750802b5SBram Moolenaar  let cpo_before = &cpo
470750802b5SBram Moolenaar  let lines =<< trim END
471750802b5SBram Moolenaar    vim9script
472750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
473750802b5SBram Moolenaar  END
474750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
475750802b5SBram Moolenaar  source Xvim9_script
476750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
477750802b5SBram Moolenaar  set cpo&vim
478750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
479750802b5SBram Moolenaar  delete('Xvim9_script')
480750802b5SBram Moolenaarenddef
481750802b5SBram Moolenaar
482750802b5SBram Moolenaardef Test_vim9script_fails()
4838a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
4848a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
485750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
486f2d5c240SBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
487750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
488750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
489750802b5SBram Moolenaar
490750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
491750802b5SBram Moolenaar  assert_fails('export something', 'E1042')
4928a7d6542SBram Moolenaarenddef
4938a7d6542SBram Moolenaar
4948a7d6542SBram Moolenaardef Test_vim9script_call()
4958a7d6542SBram Moolenaar  let lines =<< trim END
4968a7d6542SBram Moolenaar    vim9script
4978a7d6542SBram Moolenaar    let var = ''
4988a7d6542SBram Moolenaar    def MyFunc(arg: string)
4998a7d6542SBram Moolenaar       var = arg
5008a7d6542SBram Moolenaar    enddef
5018a7d6542SBram Moolenaar    MyFunc('foobar')
5028a7d6542SBram Moolenaar    assert_equal('foobar', var)
5038a7d6542SBram Moolenaar
5048a7d6542SBram Moolenaar    let str = 'barfoo'
5058a7d6542SBram Moolenaar    str->MyFunc()
5068a7d6542SBram Moolenaar    assert_equal('barfoo', var)
5078a7d6542SBram Moolenaar
5088a7d6542SBram Moolenaar    let g:value = 'value'
5098a7d6542SBram Moolenaar    g:value->MyFunc()
5108a7d6542SBram Moolenaar    assert_equal('value', var)
5118a7d6542SBram Moolenaar
5128a7d6542SBram Moolenaar    let listvar = []
5138a7d6542SBram Moolenaar    def ListFunc(arg: list<number>)
5148a7d6542SBram Moolenaar       listvar = arg
5158a7d6542SBram Moolenaar    enddef
5168a7d6542SBram Moolenaar    [1, 2, 3]->ListFunc()
5178a7d6542SBram Moolenaar    assert_equal([1, 2, 3], listvar)
5188a7d6542SBram Moolenaar
5198a7d6542SBram Moolenaar    let dictvar = {}
5208a7d6542SBram Moolenaar    def DictFunc(arg: dict<number>)
5218a7d6542SBram Moolenaar       dictvar = arg
5228a7d6542SBram Moolenaar    enddef
5238a7d6542SBram Moolenaar    {'a': 1, 'b': 2}->DictFunc()
5248a7d6542SBram Moolenaar    assert_equal(#{a: 1, b: 2}, dictvar)
5258a7d6542SBram Moolenaar    #{a: 3, b: 4}->DictFunc()
5268a7d6542SBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
5270c6ceaf9SBram Moolenaar
5280c6ceaf9SBram Moolenaar    ('text')->MyFunc()
5290c6ceaf9SBram Moolenaar    assert_equal('text', var)
5300c6ceaf9SBram Moolenaar    ("some")->MyFunc()
5310c6ceaf9SBram Moolenaar    assert_equal('some', var)
5328a7d6542SBram Moolenaar  END
5338a7d6542SBram Moolenaar  writefile(lines, 'Xcall.vim')
5348a7d6542SBram Moolenaar  source Xcall.vim
5358a7d6542SBram Moolenaar  delete('Xcall.vim')
5368a7d6542SBram Moolenaarenddef
5378a7d6542SBram Moolenaar
5388a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl()
5398a7d6542SBram Moolenaar  let lines =<< trim END
5408a7d6542SBram Moolenaar    vim9script
5418a7d6542SBram Moolenaar    let var = ''
5428a7d6542SBram Moolenaar    def MyFunc(arg: string)
5438a7d6542SBram Moolenaar       let var = 123
5448a7d6542SBram Moolenaar    enddef
5458a7d6542SBram Moolenaar  END
5468a7d6542SBram Moolenaar  writefile(lines, 'Xcall_decl.vim')
5478a7d6542SBram Moolenaar  assert_fails('source Xcall_decl.vim', 'E1054:')
5488a7d6542SBram Moolenaar  delete('Xcall_decl.vim')
5498a7d6542SBram Moolenaarenddef
5508a7d6542SBram Moolenaar
5518a7d6542SBram Moolenaardef Test_vim9script_call_fail_const()
5528a7d6542SBram Moolenaar  let lines =<< trim END
5538a7d6542SBram Moolenaar    vim9script
5548a7d6542SBram Moolenaar    const var = ''
5558a7d6542SBram Moolenaar    def MyFunc(arg: string)
5568a7d6542SBram Moolenaar       var = 'asdf'
5578a7d6542SBram Moolenaar    enddef
5588a7d6542SBram Moolenaar  END
5598a7d6542SBram Moolenaar  writefile(lines, 'Xcall_const.vim')
5608a7d6542SBram Moolenaar  assert_fails('source Xcall_const.vim', 'E46:')
5618a7d6542SBram Moolenaar  delete('Xcall_const.vim')
5628a7d6542SBram Moolenaarenddef
5638a7d6542SBram Moolenaar
5648a7d6542SBram Moolenaardef Test_vim9script_reload()
5658a7d6542SBram Moolenaar  let lines =<< trim END
5668a7d6542SBram Moolenaar    vim9script
5678a7d6542SBram Moolenaar    const var = ''
5688a7d6542SBram Moolenaar    let valone = 1234
5698a7d6542SBram Moolenaar    def MyFunc(arg: string)
5708a7d6542SBram Moolenaar       valone = 5678
5718a7d6542SBram Moolenaar    enddef
5728a7d6542SBram Moolenaar  END
5738a7d6542SBram Moolenaar  let morelines =<< trim END
5748a7d6542SBram Moolenaar    let valtwo = 222
5758a7d6542SBram Moolenaar    export def GetValtwo(): number
5768a7d6542SBram Moolenaar      return valtwo
5778a7d6542SBram Moolenaar    enddef
5788a7d6542SBram Moolenaar  END
5798a7d6542SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
5808a7d6542SBram Moolenaar  source Xreload.vim
5818a7d6542SBram Moolenaar  source Xreload.vim
5828a7d6542SBram Moolenaar  source Xreload.vim
5838a7d6542SBram Moolenaar
5848a7d6542SBram Moolenaar  let testlines =<< trim END
5858a7d6542SBram Moolenaar    vim9script
5868a7d6542SBram Moolenaar    def TheFunc()
5878a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
5888a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
5898a7d6542SBram Moolenaar    enddef
5908a7d6542SBram Moolenaar    TheFunc()
5918a7d6542SBram Moolenaar  END
5928a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
5938a7d6542SBram Moolenaar  source Ximport.vim
5948a7d6542SBram Moolenaar
5958a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
5968a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
5978a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
5988a7d6542SBram Moolenaar  source Xreload.vim
5998a7d6542SBram Moolenaar  source Ximport.vim
6008a7d6542SBram Moolenaar
6018a7d6542SBram Moolenaar  " cannot declare a var twice
6028a7d6542SBram Moolenaar  lines =<< trim END
6038a7d6542SBram Moolenaar    vim9script
6048a7d6542SBram Moolenaar    let valone = 1234
6058a7d6542SBram Moolenaar    let valone = 5678
6068a7d6542SBram Moolenaar  END
6078a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
6088a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
6098a7d6542SBram Moolenaar
6108a7d6542SBram Moolenaar  delete('Xreload.vim')
6118a7d6542SBram Moolenaar  delete('Ximport.vim')
6128a7d6542SBram Moolenaarenddef
6138a7d6542SBram Moolenaar
6148a7d6542SBram Moolenaardef Test_import_absolute()
6158a7d6542SBram Moolenaar  let import_lines = [
6168a7d6542SBram Moolenaar        \ 'vim9script',
6178a7d6542SBram Moolenaar        \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
618b283a8a6SBram Moolenaar        \ 'def UseExported()',
6198a7d6542SBram Moolenaar        \ '  g:imported_abs = exported',
6204e12a5dfSBram Moolenaar        \ '  exported = 8888',
6214e12a5dfSBram Moolenaar        \ '  g:imported_after = exported',
622b283a8a6SBram Moolenaar        \ 'enddef',
623b283a8a6SBram Moolenaar        \ 'UseExported()',
6244e12a5dfSBram Moolenaar        \ 'g:import_disassembled = execute("disass UseExported")',
6258a7d6542SBram Moolenaar        \ ]
6268a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
6278a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
6288a7d6542SBram Moolenaar
6298a7d6542SBram Moolenaar  source Ximport_abs.vim
6308a7d6542SBram Moolenaar
6318a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
6324e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
633b283a8a6SBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*'
634b283a8a6SBram Moolenaar        \ .. 'g:imported_abs = exported.*'
635b283a8a6SBram Moolenaar        \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
6364e12a5dfSBram Moolenaar        \ .. '1 STOREG g:imported_abs.*'
6374e12a5dfSBram Moolenaar        \ .. 'exported = 8888.*'
6384e12a5dfSBram Moolenaar        \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
6394e12a5dfSBram Moolenaar        \ .. 'g:imported_after = exported.*'
6404e12a5dfSBram Moolenaar        \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
6414e12a5dfSBram Moolenaar        \ .. '5 STOREG g:imported_after.*'
6424e12a5dfSBram Moolenaar        \, g:import_disassembled)
6438a7d6542SBram Moolenaar  unlet g:imported_abs
6444e12a5dfSBram Moolenaar  unlet g:import_disassembled
6458a7d6542SBram Moolenaar
6468a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
6478a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
6488a7d6542SBram Moolenaarenddef
6498a7d6542SBram Moolenaar
6508a7d6542SBram Moolenaardef Test_import_rtp()
6518a7d6542SBram Moolenaar  let import_lines = [
6528a7d6542SBram Moolenaar        \ 'vim9script',
6538a7d6542SBram Moolenaar        \ 'import exported from "Xexport_rtp.vim"',
6548a7d6542SBram Moolenaar        \ 'g:imported_rtp = exported',
6558a7d6542SBram Moolenaar        \ ]
6568a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
6578a7d6542SBram Moolenaar  mkdir('import')
6588a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
6598a7d6542SBram Moolenaar
6608a7d6542SBram Moolenaar  let save_rtp = &rtp
6618a7d6542SBram Moolenaar  &rtp = getcwd()
6628a7d6542SBram Moolenaar  source Ximport_rtp.vim
6638a7d6542SBram Moolenaar  &rtp = save_rtp
6648a7d6542SBram Moolenaar
6658a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
6668a7d6542SBram Moolenaar  unlet g:imported_rtp
6678a7d6542SBram Moolenaar
6688a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
6698a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
6708a7d6542SBram Moolenaar  delete('import', 'd')
6718a7d6542SBram Moolenaarenddef
6728a7d6542SBram Moolenaar
6738a7d6542SBram Moolenaardef Test_fixed_size_list()
6748a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
6758a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
6768a7d6542SBram Moolenaar  l->remove(0)
6778a7d6542SBram Moolenaar  l->add(5)
6788a7d6542SBram Moolenaar  l->insert(99, 1)
6790f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
6808a7d6542SBram Moolenaarenddef
6818a7d6542SBram Moolenaar
682673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not
683673660abSBram Moolenaar" recognized.
684673660abSBram Moolenaarfunc Test_function_python()
685673660abSBram Moolenaar  CheckFeature python3
686673660abSBram Moolenaar  let py = 'python3'
687673660abSBram Moolenaar  execute py "<< EOF"
688673660abSBram Moolenaardef do_something():
689673660abSBram Moolenaar  return 1
690673660abSBram MoolenaarEOF
691673660abSBram Moolenaarendfunc
692673660abSBram Moolenaar
693158906cfSBram Moolenaardef IfElse(what: number): string
694158906cfSBram Moolenaar  let res = ''
695158906cfSBram Moolenaar  if what == 1
696158906cfSBram Moolenaar    res = "one"
697158906cfSBram Moolenaar  elseif what == 2
698158906cfSBram Moolenaar    res = "two"
699a259d8d3SBram Moolenaar  else
700158906cfSBram Moolenaar    res = "three"
701a259d8d3SBram Moolenaar  endif
702158906cfSBram Moolenaar  return res
703a259d8d3SBram Moolenaarenddef
704a259d8d3SBram Moolenaar
705158906cfSBram Moolenaardef Test_if_elseif_else()
706158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
707158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
708158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
7090f18b6d1SBram Moolenaarenddef
7100f18b6d1SBram Moolenaar
71163ce4849SBram Moolenaardef Test_delfunc()
71263ce4849SBram Moolenaar  let lines =<< trim END
71363ce4849SBram Moolenaar    vim9script
71463ce4849SBram Moolenaar    def GoneSoon()
71563ce4849SBram Moolenaar      echo 'hello'
71663ce4849SBram Moolenaar    enddef
71763ce4849SBram Moolenaar
71863ce4849SBram Moolenaar    def CallGoneSoon()
71963ce4849SBram Moolenaar      GoneSoon()
72063ce4849SBram Moolenaar    enddef
72163ce4849SBram Moolenaar
72263ce4849SBram Moolenaar    delfunc GoneSoon
72363ce4849SBram Moolenaar    CallGoneSoon()
72463ce4849SBram Moolenaar  END
72563ce4849SBram Moolenaar  writefile(lines, 'XToDelFunc')
72663ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
72763ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
72863ce4849SBram Moolenaar
72963ce4849SBram Moolenaar  delete('XToDelFunc')
73063ce4849SBram Moolenaarenddef
73163ce4849SBram Moolenaar
7325b1c8fe3SBram Moolenaardef Test_substitute_cmd()
7335b1c8fe3SBram Moolenaar  new
7345b1c8fe3SBram Moolenaar  setline(1, 'something')
7355b1c8fe3SBram Moolenaar  :substitute(some(other(
7365b1c8fe3SBram Moolenaar  assert_equal('otherthing', getline(1))
73783f37b91SBram Moolenaar  bwipe!
73883f37b91SBram Moolenaar
73983f37b91SBram Moolenaar  " also when the context is Vim9 script
74083f37b91SBram Moolenaar  let lines =<< trim END
74183f37b91SBram Moolenaar    vim9script
74283f37b91SBram Moolenaar    new
74383f37b91SBram Moolenaar    setline(1, 'something')
74483f37b91SBram Moolenaar    :substitute(some(other(
74583f37b91SBram Moolenaar    assert_equal('otherthing', getline(1))
74683f37b91SBram Moolenaar    bwipe!
74783f37b91SBram Moolenaar  END
74883f37b91SBram Moolenaar  writefile(lines, 'Xvim9lines')
74983f37b91SBram Moolenaar  source Xvim9lines
75083f37b91SBram Moolenaar
75183f37b91SBram Moolenaar  delete('Xvim9lines')
7525b1c8fe3SBram Moolenaarenddef
7535b1c8fe3SBram Moolenaar
754ad39c094SBram Moolenaardef Test_execute_cmd()
755ad39c094SBram Moolenaar  new
756ad39c094SBram Moolenaar  setline(1, 'default')
757ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
758ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
759ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
760ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
761ad39c094SBram Moolenaar  execute cmd1 cmd2
762ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
763ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
764ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
765ad39c094SBram Moolenaar  let cmd_first = 'call '
766ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
767ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
768ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
769ad39c094SBram Moolenaar  bwipe!
770ad39c094SBram Moolenaarenddef
771ad39c094SBram Moolenaar
772ad39c094SBram Moolenaardef Test_echo_cmd()
773ad39c094SBram Moolenaar  echo 'something'
774ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
775ad39c094SBram Moolenaar
776ad39c094SBram Moolenaar  let str1 = 'some'
777ad39c094SBram Moolenaar  let str2 = 'more'
778ad39c094SBram Moolenaar  echo str1 str2
779ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
780ad39c094SBram Moolenaarenddef
781ad39c094SBram Moolenaar
78241fe0617SBram Moolenaardef Test_for_outside_of_function()
78341fe0617SBram Moolenaar  let lines =<< trim END
78441fe0617SBram Moolenaar    vim9script
78541fe0617SBram Moolenaar    new
78641fe0617SBram Moolenaar    for var in range(0, 3)
78741fe0617SBram Moolenaar      append(line('$'), var)
78841fe0617SBram Moolenaar    endfor
78941fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
79041fe0617SBram Moolenaar    bwipe!
79141fe0617SBram Moolenaar  END
79241fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
79341fe0617SBram Moolenaar  source Xvim9for.vim
79441fe0617SBram Moolenaar  delete('Xvim9for.vim')
79541fe0617SBram Moolenaarenddef
7968a7d6542SBram Moolenaar
7978a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
798