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
59*f51cb4e0SBram 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
69401d9ffbSBram Moolenaar  g:newvar = 'new'
70401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
71401d9ffbSBram Moolenaar
72401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
73401d9ffbSBram Moolenaar  g:existing = 'no'
74401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
75401d9ffbSBram Moolenaar
76b283a8a6SBram Moolenaar  v:char = 'abc'
776e587dcbSBram Moolenaar  assert_equal('abc', v:char)
78b283a8a6SBram Moolenaar
79b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
806e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
81b283a8a6SBram Moolenaar  $ENVVAR = ''
826e587dcbSBram Moolenaar
83fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
84fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
85fd1823e0SBram Moolenaar  s:addToMe += 222
86fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
870bbf722aSBram Moolenaar  s:newVar = 'new'
880bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
898a7d6542SBram Moolenaarenddef
908a7d6542SBram Moolenaar
918a7d6542SBram Moolenaarfunc Test_assignment_failure()
928a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
938a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
948a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
958a7d6542SBram Moolenaar
968a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
978a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
988a7d6542SBram Moolenaar
998a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
1008a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
1018a7d6542SBram Moolenaar
1028a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
1038a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
1048a7d6542SBram Moolenaar
1058a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
1068a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
10742a480bfSBram Moolenaar
10842a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1007:')
10942a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
11042a480bfSBram Moolenaar
11142a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
11242a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
11342a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
11442a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
11542a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
11642a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
11742a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
11842a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
11942a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
12042a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
12142a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
1228a7d6542SBram Moolenaarendfunc
1238a7d6542SBram Moolenaar
1248a7d6542SBram Moolenaarfunc Test_const()
1258a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
1268a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
1278a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
1288a7d6542SBram Moolenaarendfunc
1298a7d6542SBram Moolenaar
1308a7d6542SBram Moolenaardef Test_block()
1318a7d6542SBram Moolenaar  let outer = 1
1328a7d6542SBram Moolenaar  {
1338a7d6542SBram Moolenaar    let inner = 2
1348a7d6542SBram Moolenaar    assert_equal(1, outer)
1358a7d6542SBram Moolenaar    assert_equal(2, inner)
1368a7d6542SBram Moolenaar  }
1378a7d6542SBram Moolenaar  assert_equal(1, outer)
1388a7d6542SBram Moolenaarenddef
1398a7d6542SBram Moolenaar
1408a7d6542SBram Moolenaarfunc Test_block_failure()
1418a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
1428a7d6542SBram Moolenaarendfunc
1438a7d6542SBram Moolenaar
1448a7d6542SBram Moolenaardef ReturnString(): string
1458a7d6542SBram Moolenaar  return 'string'
1468a7d6542SBram Moolenaarenddef
1478a7d6542SBram Moolenaar
1488a7d6542SBram Moolenaardef ReturnNumber(): number
1498a7d6542SBram Moolenaar  return 123
1508a7d6542SBram Moolenaarenddef
1518a7d6542SBram Moolenaar
15209f28f49SBram Moolenaarlet g:notNumber = 'string'
15309f28f49SBram Moolenaar
15409f28f49SBram Moolenaardef ReturnGlobal(): number
15509f28f49SBram Moolenaar  return g:notNumber
15609f28f49SBram Moolenaarenddef
15709f28f49SBram Moolenaar
1588a7d6542SBram Moolenaardef Test_return_string()
1598a7d6542SBram Moolenaar  assert_equal('string', ReturnString())
1608a7d6542SBram Moolenaar  assert_equal(123, ReturnNumber())
16109f28f49SBram Moolenaar  assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string')
1628a7d6542SBram Moolenaarenddef
1638a7d6542SBram Moolenaar
1648a7d6542SBram Moolenaarfunc Increment()
1658a7d6542SBram Moolenaar  let g:counter += 1
1668a7d6542SBram Moolenaarendfunc
1678a7d6542SBram Moolenaar
1688a7d6542SBram Moolenaardef Test_call_ufunc_count()
1698a7d6542SBram Moolenaar  g:counter = 1
1708a7d6542SBram Moolenaar  Increment()
1718a7d6542SBram Moolenaar  Increment()
1728a7d6542SBram Moolenaar  Increment()
1738a7d6542SBram Moolenaar  " works with and without :call
1748a7d6542SBram Moolenaar  assert_equal(4, g:counter)
175b283a8a6SBram Moolenaar  call assert_equal(4, g:counter)
1768a7d6542SBram Moolenaar  unlet g:counter
1778a7d6542SBram Moolenaarenddef
1788a7d6542SBram Moolenaar
1798a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string
1808a7d6542SBram Moolenaar  let res = arg
1818a7d6542SBram Moolenaar  for s in rest
1828a7d6542SBram Moolenaar    res ..= ',' .. s
1838a7d6542SBram Moolenaar  endfor
1848a7d6542SBram Moolenaar  return res
1858a7d6542SBram Moolenaarenddef
1868a7d6542SBram Moolenaar
1878a7d6542SBram Moolenaardef Test_call_varargs()
1888a7d6542SBram Moolenaar  assert_equal('one', MyVarargs('one'))
1898a7d6542SBram Moolenaar  assert_equal('one,two', MyVarargs('one', 'two'))
1908a7d6542SBram Moolenaar  assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
1918a7d6542SBram Moolenaarenddef
1928a7d6542SBram Moolenaar
193170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string
194170fcfcfSBram Moolenaar  return name
195170fcfcfSBram Moolenaarenddef
196170fcfcfSBram Moolenaar
197170fcfcfSBram Moolenaardef Test_call_default_args()
198170fcfcfSBram Moolenaar  assert_equal('string', MyDefaultArgs())
199170fcfcfSBram Moolenaar  assert_equal('one', MyDefaultArgs('one'))
200170fcfcfSBram Moolenaar  assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
201170fcfcfSBram Moolenaarenddef
202170fcfcfSBram Moolenaar
203170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func()
204170fcfcfSBram Moolenaar  call assert_equal('string', MyDefaultArgs())
205170fcfcfSBram Moolenaar  call assert_equal('one', MyDefaultArgs('one'))
206170fcfcfSBram Moolenaar  call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
207170fcfcfSBram Moolenaarendfunc
208170fcfcfSBram Moolenaar
209b35efa5eSBram Moolenaarfunc TakesOneArg(arg)
210b35efa5eSBram Moolenaar  echo a:arg
211b35efa5eSBram Moolenaarendfunc
212b35efa5eSBram Moolenaar
213b35efa5eSBram Moolenaardef Test_call_wrong_arg_count()
214b35efa5eSBram Moolenaar  call CheckDefFailure(['TakesOneArg()'], 'E119:')
215b35efa5eSBram Moolenaar  call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
216b35efa5eSBram Moolenaarenddef
217b35efa5eSBram Moolenaar
218170fcfcfSBram Moolenaar" Default arg and varargs
219170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
220170fcfcfSBram Moolenaar  let res = one .. ',' .. two
221170fcfcfSBram Moolenaar  for s in rest
222170fcfcfSBram Moolenaar    res ..= ',' .. s
223170fcfcfSBram Moolenaar  endfor
224170fcfcfSBram Moolenaar  return res
225170fcfcfSBram Moolenaarenddef
226170fcfcfSBram Moolenaar
227170fcfcfSBram Moolenaardef Test_call_def_varargs()
228170fcfcfSBram Moolenaar  call assert_fails('call MyDefVarargs()', 'E119:')
229170fcfcfSBram Moolenaar  assert_equal('one,foo', MyDefVarargs('one'))
230170fcfcfSBram Moolenaar  assert_equal('one,two', MyDefVarargs('one', 'two'))
231170fcfcfSBram Moolenaar  assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
232170fcfcfSBram Moolenaarenddef
233170fcfcfSBram Moolenaar
23442a480bfSBram Moolenaardef Test_using_var_as_arg()
23542a480bfSBram Moolenaar  call writefile(['def Func(x: number)',  'let x = 234', 'enddef'], 'Xdef')
23642a480bfSBram Moolenaar  call assert_fails('so Xdef', 'E1006:')
23742a480bfSBram Moolenaar  call delete('Xdef')
23842a480bfSBram Moolenaarenddef
23942a480bfSBram Moolenaar
240b35efa5eSBram Moolenaardef Test_call_func_defined_later()
241b35efa5eSBram Moolenaar  call assert_equal('one', DefinedLater('one'))
242b35efa5eSBram Moolenaar  call assert_fails('call NotDefined("one")', 'E117:')
243b35efa5eSBram Moolenaarenddef
244170fcfcfSBram Moolenaar
245b35efa5eSBram Moolenaarfunc DefinedLater(arg)
24626e117e9SBram Moolenaar  return a:arg
24726e117e9SBram Moolenaarendfunc
24826e117e9SBram Moolenaar
2497eeefd4aSBram Moolenaardef FuncWithForwardCall()
2507eeefd4aSBram Moolenaar  return DefinedEvenLater("yes")
2517eeefd4aSBram Moolenaarenddef
2527eeefd4aSBram Moolenaar
2537eeefd4aSBram Moolenaardef DefinedEvenLater(arg: string): string
2547eeefd4aSBram Moolenaar  return arg
2557eeefd4aSBram Moolenaarenddef
2567eeefd4aSBram Moolenaar
2577eeefd4aSBram Moolenaardef Test_error_in_nested_function()
2587eeefd4aSBram Moolenaar  " Error in called function requires unwinding the call stack.
2597eeefd4aSBram Moolenaar  assert_fails('call FuncWithForwardCall()', 'E1029')
2607eeefd4aSBram Moolenaarenddef
2617eeefd4aSBram Moolenaar
2628a7d6542SBram Moolenaardef Test_return_type_wrong()
263978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
264978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
265978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
266978d170bSBram Moolenaar  CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
2678a7d6542SBram Moolenaarenddef
2688a7d6542SBram Moolenaar
269bfe12043SBram Moolenaardef Test_arg_type_wrong()
270bfe12043SBram Moolenaar  CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
271bfe12043SBram Moolenaarenddef
272bfe12043SBram Moolenaar
2738a7d6542SBram Moolenaardef Test_try_catch()
2748a7d6542SBram Moolenaar  let l = []
2758a7d6542SBram Moolenaar  try
2768a7d6542SBram Moolenaar    add(l, '1')
2778a7d6542SBram Moolenaar    throw 'wrong'
2788a7d6542SBram Moolenaar    add(l, '2')
2798a7d6542SBram Moolenaar  catch
2808a7d6542SBram Moolenaar    add(l, v:exception)
2818a7d6542SBram Moolenaar  finally
2828a7d6542SBram Moolenaar    add(l, '3')
2838a7d6542SBram Moolenaar  endtry
2848a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
2858a7d6542SBram Moolenaarenddef
2868a7d6542SBram Moolenaar
287257cc5eeSBram Moolenaardef ThrowFromDef()
288257cc5eeSBram Moolenaar  throw 'getout'
289257cc5eeSBram Moolenaarenddef
290257cc5eeSBram Moolenaar
291257cc5eeSBram Moolenaarfunc CatchInFunc()
292257cc5eeSBram Moolenaar  try
293257cc5eeSBram Moolenaar    call ThrowFromDef()
294257cc5eeSBram Moolenaar  catch
295257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
296257cc5eeSBram Moolenaar  endtry
297257cc5eeSBram Moolenaarendfunc
298257cc5eeSBram Moolenaar
299257cc5eeSBram Moolenaardef CatchInDef()
300257cc5eeSBram Moolenaar  try
301257cc5eeSBram Moolenaar    ThrowFromDef()
302257cc5eeSBram Moolenaar  catch
303257cc5eeSBram Moolenaar    g:thrown_def = v:exception
304257cc5eeSBram Moolenaar  endtry
305257cc5eeSBram Moolenaarenddef
306257cc5eeSBram Moolenaar
307f575adffSBram Moolenaardef ReturnFinally(): string
308f575adffSBram Moolenaar  try
309f575adffSBram Moolenaar    return 'intry'
310f575adffSBram Moolenaar  finally
311f575adffSBram Moolenaar    g:in_finally = 'finally'
312f575adffSBram Moolenaar  endtry
313f575adffSBram Moolenaar  return 'end'
314f575adffSBram Moolenaarenddef
315f575adffSBram Moolenaar
316257cc5eeSBram Moolenaardef Test_try_catch_nested()
317257cc5eeSBram Moolenaar  CatchInFunc()
318257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
319257cc5eeSBram Moolenaar
320257cc5eeSBram Moolenaar  CatchInDef()
321257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
322f575adffSBram Moolenaar
323f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
324f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
325f575adffSBram Moolenaarenddef
326f575adffSBram Moolenaar
327f575adffSBram Moolenaardef Test_try_catch_match()
328f575adffSBram Moolenaar  let seq = 'a'
329f575adffSBram Moolenaar  try
330f575adffSBram Moolenaar    throw 'something'
331f575adffSBram Moolenaar  catch /nothing/
332f575adffSBram Moolenaar    seq ..= 'x'
333f575adffSBram Moolenaar  catch /some/
334f575adffSBram Moolenaar    seq ..= 'b'
335f575adffSBram Moolenaar  catch /asdf/
336f575adffSBram Moolenaar    seq ..= 'x'
337f575adffSBram Moolenaar  finally
338f575adffSBram Moolenaar    seq ..= 'c'
339f575adffSBram Moolenaar  endtry
340f575adffSBram Moolenaar  assert_equal('abc', seq)
341257cc5eeSBram Moolenaarenddef
342257cc5eeSBram Moolenaar
3438a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
3448a7d6542SBram Moolenaar  vim9script
3458a7d6542SBram Moolenaar  let name: string = 'bob'
3468a7d6542SBram Moolenaar  def Concat(arg: string): string
3478a7d6542SBram Moolenaar    return name .. arg
3488a7d6542SBram Moolenaar  enddef
3498a7d6542SBram Moolenaar  let g:result = Concat('bie')
3508a7d6542SBram Moolenaar  let g:localname = name
3518a7d6542SBram Moolenaar
3528a7d6542SBram Moolenaar  export const CONST = 1234
3538a7d6542SBram Moolenaar  export let exported = 9876
3546e587dcbSBram Moolenaar  export let exp_name = 'John'
3558a7d6542SBram Moolenaar  export def Exported(): string
3568a7d6542SBram Moolenaar    return 'Exported'
3578a7d6542SBram Moolenaar  enddef
3588a7d6542SBram MoolenaarEND
3598a7d6542SBram Moolenaar
3608a7d6542SBram Moolenaardef Test_vim9script()
3618a7d6542SBram Moolenaar  let import_script_lines =<< trim END
3628a7d6542SBram Moolenaar    vim9script
3638a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
3648a7d6542SBram Moolenaar    g:imported = exported
3656e587dcbSBram Moolenaar    exported += 3
3666e587dcbSBram Moolenaar    g:imported_added = exported
3678a7d6542SBram Moolenaar    g:imported_func = Exported()
3686e587dcbSBram Moolenaar
3696e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
3706e587dcbSBram Moolenaar    g:imported_name = exp_name
3716e587dcbSBram Moolenaar    exp_name ..= ' Doe'
3726e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
3738a7d6542SBram Moolenaar  END
3748a7d6542SBram Moolenaar
3758a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
3768a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
3778a7d6542SBram Moolenaar
3788a7d6542SBram Moolenaar  source Ximport.vim
3798a7d6542SBram Moolenaar
3808a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
3818a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
3828a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
3836e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
3848a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
3856e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
3866e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
3878a7d6542SBram Moolenaar  assert_false(exists('g:name'))
3888a7d6542SBram Moolenaar
3898a7d6542SBram Moolenaar  unlet g:result
3908a7d6542SBram Moolenaar  unlet g:localname
3918a7d6542SBram Moolenaar  unlet g:imported
3926e587dcbSBram Moolenaar  unlet g:imported_added
3938a7d6542SBram Moolenaar  unlet g:imported_func
3946e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
3958a7d6542SBram Moolenaar  delete('Ximport.vim')
396f2d5c240SBram Moolenaar
397f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
398f2d5c240SBram Moolenaar    vim9script
399f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
400f2d5c240SBram Moolenaar    def UseExport()
401f2d5c240SBram Moolenaar      g:imported = Export.exported
402f2d5c240SBram Moolenaar    enddef
403f2d5c240SBram Moolenaar    UseExport()
404f2d5c240SBram Moolenaar  END
405f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
406f2d5c240SBram Moolenaar  source Ximport.vim
407f2d5c240SBram Moolenaar  assert_equal(9876, g:imported)
408f2d5c240SBram Moolenaar
409f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
410f2d5c240SBram Moolenaar    vim9script
411f2d5c240SBram Moolenaar    import * from './Xexport.vim'
412f2d5c240SBram Moolenaar    g:imported = exported
413f2d5c240SBram Moolenaar  END
414f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
415f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
416f2d5c240SBram Moolenaar
417fa29c8abSBram Moolenaar  " try to import something that exists but is not exported
418fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
419fa29c8abSBram Moolenaar    vim9script
420fa29c8abSBram Moolenaar    import name from './Xexport.vim'
421fa29c8abSBram Moolenaar  END
422fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
423fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
424fa29c8abSBram Moolenaar
425fa29c8abSBram Moolenaar  " import a very long name, requires making a copy
426fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
427fa29c8abSBram Moolenaar    vim9script
428fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
429fa29c8abSBram Moolenaar  END
430fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
431fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
432fa29c8abSBram Moolenaar
433fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
434fa29c8abSBram Moolenaar    vim9script
435fa29c8abSBram Moolenaar    import name './Xexport.vim'
436fa29c8abSBram Moolenaar  END
437fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
438fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
439fa29c8abSBram Moolenaar
440fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
441fa29c8abSBram Moolenaar    vim9script
442fa29c8abSBram Moolenaar    import name from Xexport.vim
443fa29c8abSBram Moolenaar  END
444fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
445fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
446fa29c8abSBram Moolenaar
447fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
448fa29c8abSBram Moolenaar    vim9script
449fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
450fa29c8abSBram Moolenaar  END
451fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
452fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
453fa29c8abSBram Moolenaar
454fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
455fa29c8abSBram Moolenaar    vim9script
456fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
457fa29c8abSBram Moolenaar  END
458fa29c8abSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport.vim')
459fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1046:')
460fa29c8abSBram Moolenaar
461f2d5c240SBram Moolenaar  delete('Ximport.vim')
4628a7d6542SBram Moolenaar  delete('Xexport.vim')
4638a7d6542SBram Moolenaar
464750802b5SBram Moolenaar  " Check that in a Vim9 script 'cpo' is set to the Vim default.
465750802b5SBram Moolenaar  set cpo&vi
466750802b5SBram Moolenaar  let cpo_before = &cpo
467750802b5SBram Moolenaar  let lines =<< trim END
468750802b5SBram Moolenaar    vim9script
469750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
470750802b5SBram Moolenaar  END
471750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
472750802b5SBram Moolenaar  source Xvim9_script
473750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
474750802b5SBram Moolenaar  set cpo&vim
475750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
476750802b5SBram Moolenaar  delete('Xvim9_script')
477750802b5SBram Moolenaarenddef
478750802b5SBram Moolenaar
479750802b5SBram Moolenaardef Test_vim9script_fails()
4808a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
4818a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
482750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
483f2d5c240SBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
484750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
485750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
486750802b5SBram Moolenaar
487750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
488750802b5SBram Moolenaar  assert_fails('export something', 'E1042')
4898a7d6542SBram Moolenaarenddef
4908a7d6542SBram Moolenaar
4918a7d6542SBram Moolenaardef Test_vim9script_call()
4928a7d6542SBram Moolenaar  let lines =<< trim END
4938a7d6542SBram Moolenaar    vim9script
4948a7d6542SBram Moolenaar    let var = ''
4958a7d6542SBram Moolenaar    def MyFunc(arg: string)
4968a7d6542SBram Moolenaar       var = arg
4978a7d6542SBram Moolenaar    enddef
4988a7d6542SBram Moolenaar    MyFunc('foobar')
4998a7d6542SBram Moolenaar    assert_equal('foobar', var)
5008a7d6542SBram Moolenaar
5018a7d6542SBram Moolenaar    let str = 'barfoo'
5028a7d6542SBram Moolenaar    str->MyFunc()
5038a7d6542SBram Moolenaar    assert_equal('barfoo', var)
5048a7d6542SBram Moolenaar
5058a7d6542SBram Moolenaar    let g:value = 'value'
5068a7d6542SBram Moolenaar    g:value->MyFunc()
5078a7d6542SBram Moolenaar    assert_equal('value', var)
5088a7d6542SBram Moolenaar
5098a7d6542SBram Moolenaar    let listvar = []
5108a7d6542SBram Moolenaar    def ListFunc(arg: list<number>)
5118a7d6542SBram Moolenaar       listvar = arg
5128a7d6542SBram Moolenaar    enddef
5138a7d6542SBram Moolenaar    [1, 2, 3]->ListFunc()
5148a7d6542SBram Moolenaar    assert_equal([1, 2, 3], listvar)
5158a7d6542SBram Moolenaar
5168a7d6542SBram Moolenaar    let dictvar = {}
5178a7d6542SBram Moolenaar    def DictFunc(arg: dict<number>)
5188a7d6542SBram Moolenaar       dictvar = arg
5198a7d6542SBram Moolenaar    enddef
5208a7d6542SBram Moolenaar    {'a': 1, 'b': 2}->DictFunc()
5218a7d6542SBram Moolenaar    assert_equal(#{a: 1, b: 2}, dictvar)
5228a7d6542SBram Moolenaar    #{a: 3, b: 4}->DictFunc()
5238a7d6542SBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
5240c6ceaf9SBram Moolenaar
5250c6ceaf9SBram Moolenaar    ('text')->MyFunc()
5260c6ceaf9SBram Moolenaar    assert_equal('text', var)
5270c6ceaf9SBram Moolenaar    ("some")->MyFunc()
5280c6ceaf9SBram Moolenaar    assert_equal('some', var)
5298a7d6542SBram Moolenaar  END
5308a7d6542SBram Moolenaar  writefile(lines, 'Xcall.vim')
5318a7d6542SBram Moolenaar  source Xcall.vim
5328a7d6542SBram Moolenaar  delete('Xcall.vim')
5338a7d6542SBram Moolenaarenddef
5348a7d6542SBram Moolenaar
5358a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl()
5368a7d6542SBram Moolenaar  let lines =<< trim END
5378a7d6542SBram Moolenaar    vim9script
5388a7d6542SBram Moolenaar    let var = ''
5398a7d6542SBram Moolenaar    def MyFunc(arg: string)
5408a7d6542SBram Moolenaar       let var = 123
5418a7d6542SBram Moolenaar    enddef
5428a7d6542SBram Moolenaar  END
5438a7d6542SBram Moolenaar  writefile(lines, 'Xcall_decl.vim')
5448a7d6542SBram Moolenaar  assert_fails('source Xcall_decl.vim', 'E1054:')
5458a7d6542SBram Moolenaar  delete('Xcall_decl.vim')
5468a7d6542SBram Moolenaarenddef
5478a7d6542SBram Moolenaar
5488a7d6542SBram Moolenaardef Test_vim9script_call_fail_const()
5498a7d6542SBram Moolenaar  let lines =<< trim END
5508a7d6542SBram Moolenaar    vim9script
5518a7d6542SBram Moolenaar    const var = ''
5528a7d6542SBram Moolenaar    def MyFunc(arg: string)
5538a7d6542SBram Moolenaar       var = 'asdf'
5548a7d6542SBram Moolenaar    enddef
5558a7d6542SBram Moolenaar  END
5568a7d6542SBram Moolenaar  writefile(lines, 'Xcall_const.vim')
5578a7d6542SBram Moolenaar  assert_fails('source Xcall_const.vim', 'E46:')
5588a7d6542SBram Moolenaar  delete('Xcall_const.vim')
5598a7d6542SBram Moolenaarenddef
5608a7d6542SBram Moolenaar
5618a7d6542SBram Moolenaardef Test_vim9script_reload()
5628a7d6542SBram Moolenaar  let lines =<< trim END
5638a7d6542SBram Moolenaar    vim9script
5648a7d6542SBram Moolenaar    const var = ''
5658a7d6542SBram Moolenaar    let valone = 1234
5668a7d6542SBram Moolenaar    def MyFunc(arg: string)
5678a7d6542SBram Moolenaar       valone = 5678
5688a7d6542SBram Moolenaar    enddef
5698a7d6542SBram Moolenaar  END
5708a7d6542SBram Moolenaar  let morelines =<< trim END
5718a7d6542SBram Moolenaar    let valtwo = 222
5728a7d6542SBram Moolenaar    export def GetValtwo(): number
5738a7d6542SBram Moolenaar      return valtwo
5748a7d6542SBram Moolenaar    enddef
5758a7d6542SBram Moolenaar  END
5768a7d6542SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
5778a7d6542SBram Moolenaar  source Xreload.vim
5788a7d6542SBram Moolenaar  source Xreload.vim
5798a7d6542SBram Moolenaar  source Xreload.vim
5808a7d6542SBram Moolenaar
5818a7d6542SBram Moolenaar  let testlines =<< trim END
5828a7d6542SBram Moolenaar    vim9script
5838a7d6542SBram Moolenaar    def TheFunc()
5848a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
5858a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
5868a7d6542SBram Moolenaar    enddef
5878a7d6542SBram Moolenaar    TheFunc()
5888a7d6542SBram Moolenaar  END
5898a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
5908a7d6542SBram Moolenaar  source Ximport.vim
5918a7d6542SBram Moolenaar
5928a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
5938a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
5948a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
5958a7d6542SBram Moolenaar  source Xreload.vim
5968a7d6542SBram Moolenaar  source Ximport.vim
5978a7d6542SBram Moolenaar
5988a7d6542SBram Moolenaar  " cannot declare a var twice
5998a7d6542SBram Moolenaar  lines =<< trim END
6008a7d6542SBram Moolenaar    vim9script
6018a7d6542SBram Moolenaar    let valone = 1234
6028a7d6542SBram Moolenaar    let valone = 5678
6038a7d6542SBram Moolenaar  END
6048a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
6058a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
6068a7d6542SBram Moolenaar
6078a7d6542SBram Moolenaar  delete('Xreload.vim')
6088a7d6542SBram Moolenaar  delete('Ximport.vim')
6098a7d6542SBram Moolenaarenddef
6108a7d6542SBram Moolenaar
6118a7d6542SBram Moolenaardef Test_import_absolute()
6128a7d6542SBram Moolenaar  let import_lines = [
6138a7d6542SBram Moolenaar        \ 'vim9script',
6148a7d6542SBram Moolenaar        \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
615b283a8a6SBram Moolenaar        \ 'def UseExported()',
6168a7d6542SBram Moolenaar        \ '  g:imported_abs = exported',
6174e12a5dfSBram Moolenaar        \ '  exported = 8888',
6184e12a5dfSBram Moolenaar        \ '  g:imported_after = exported',
619b283a8a6SBram Moolenaar        \ 'enddef',
620b283a8a6SBram Moolenaar        \ 'UseExported()',
6214e12a5dfSBram Moolenaar        \ 'g:import_disassembled = execute("disass UseExported")',
6228a7d6542SBram Moolenaar        \ ]
6238a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
6248a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
6258a7d6542SBram Moolenaar
6268a7d6542SBram Moolenaar  source Ximport_abs.vim
6278a7d6542SBram Moolenaar
6288a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
6294e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
630b283a8a6SBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*'
631b283a8a6SBram Moolenaar        \ .. 'g:imported_abs = exported.*'
632b283a8a6SBram Moolenaar        \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
6334e12a5dfSBram Moolenaar        \ .. '1 STOREG g:imported_abs.*'
6344e12a5dfSBram Moolenaar        \ .. 'exported = 8888.*'
6354e12a5dfSBram Moolenaar        \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
6364e12a5dfSBram Moolenaar        \ .. 'g:imported_after = exported.*'
6374e12a5dfSBram Moolenaar        \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
6384e12a5dfSBram Moolenaar        \ .. '5 STOREG g:imported_after.*'
6394e12a5dfSBram Moolenaar        \, g:import_disassembled)
6408a7d6542SBram Moolenaar  unlet g:imported_abs
6414e12a5dfSBram Moolenaar  unlet g:import_disassembled
6428a7d6542SBram Moolenaar
6438a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
6448a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
6458a7d6542SBram Moolenaarenddef
6468a7d6542SBram Moolenaar
6478a7d6542SBram Moolenaardef Test_import_rtp()
6488a7d6542SBram Moolenaar  let import_lines = [
6498a7d6542SBram Moolenaar        \ 'vim9script',
6508a7d6542SBram Moolenaar        \ 'import exported from "Xexport_rtp.vim"',
6518a7d6542SBram Moolenaar        \ 'g:imported_rtp = exported',
6528a7d6542SBram Moolenaar        \ ]
6538a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
6548a7d6542SBram Moolenaar  mkdir('import')
6558a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
6568a7d6542SBram Moolenaar
6578a7d6542SBram Moolenaar  let save_rtp = &rtp
6588a7d6542SBram Moolenaar  &rtp = getcwd()
6598a7d6542SBram Moolenaar  source Ximport_rtp.vim
6608a7d6542SBram Moolenaar  &rtp = save_rtp
6618a7d6542SBram Moolenaar
6628a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
6638a7d6542SBram Moolenaar  unlet g:imported_rtp
6648a7d6542SBram Moolenaar
6658a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
6668a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
6678a7d6542SBram Moolenaar  delete('import', 'd')
6688a7d6542SBram Moolenaarenddef
6698a7d6542SBram Moolenaar
6708a7d6542SBram Moolenaardef Test_fixed_size_list()
6718a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
6728a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
6738a7d6542SBram Moolenaar  l->remove(0)
6748a7d6542SBram Moolenaar  l->add(5)
6758a7d6542SBram Moolenaar  l->insert(99, 1)
6760f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
6778a7d6542SBram Moolenaarenddef
6788a7d6542SBram Moolenaar
679673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not
680673660abSBram Moolenaar" recognized.
681673660abSBram Moolenaarfunc Test_function_python()
682673660abSBram Moolenaar  CheckFeature python3
683673660abSBram Moolenaar  let py = 'python3'
684673660abSBram Moolenaar  execute py "<< EOF"
685673660abSBram Moolenaardef do_something():
686673660abSBram Moolenaar  return 1
687673660abSBram MoolenaarEOF
688673660abSBram Moolenaarendfunc
689673660abSBram Moolenaar
690158906cfSBram Moolenaardef IfElse(what: number): string
691158906cfSBram Moolenaar  let res = ''
692158906cfSBram Moolenaar  if what == 1
693158906cfSBram Moolenaar    res = "one"
694158906cfSBram Moolenaar  elseif what == 2
695158906cfSBram Moolenaar    res = "two"
696a259d8d3SBram Moolenaar  else
697158906cfSBram Moolenaar    res = "three"
698a259d8d3SBram Moolenaar  endif
699158906cfSBram Moolenaar  return res
700a259d8d3SBram Moolenaarenddef
701a259d8d3SBram Moolenaar
702158906cfSBram Moolenaardef Test_if_elseif_else()
703158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
704158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
705158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
7060f18b6d1SBram Moolenaarenddef
7070f18b6d1SBram Moolenaar
70863ce4849SBram Moolenaardef Test_delfunc()
70963ce4849SBram Moolenaar  let lines =<< trim END
71063ce4849SBram Moolenaar    vim9script
71163ce4849SBram Moolenaar    def GoneSoon()
71263ce4849SBram Moolenaar      echo 'hello'
71363ce4849SBram Moolenaar    enddef
71463ce4849SBram Moolenaar
71563ce4849SBram Moolenaar    def CallGoneSoon()
71663ce4849SBram Moolenaar      GoneSoon()
71763ce4849SBram Moolenaar    enddef
71863ce4849SBram Moolenaar
71963ce4849SBram Moolenaar    delfunc GoneSoon
72063ce4849SBram Moolenaar    CallGoneSoon()
72163ce4849SBram Moolenaar  END
72263ce4849SBram Moolenaar  writefile(lines, 'XToDelFunc')
72363ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
72463ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
72563ce4849SBram Moolenaar
72663ce4849SBram Moolenaar  delete('XToDelFunc')
72763ce4849SBram Moolenaarenddef
72863ce4849SBram Moolenaar
7295b1c8fe3SBram Moolenaardef Test_substitute_cmd()
7305b1c8fe3SBram Moolenaar  new
7315b1c8fe3SBram Moolenaar  setline(1, 'something')
7325b1c8fe3SBram Moolenaar  :substitute(some(other(
7335b1c8fe3SBram Moolenaar  assert_equal('otherthing', getline(1))
73483f37b91SBram Moolenaar  bwipe!
73583f37b91SBram Moolenaar
73683f37b91SBram Moolenaar  " also when the context is Vim9 script
73783f37b91SBram Moolenaar  let lines =<< trim END
73883f37b91SBram Moolenaar    vim9script
73983f37b91SBram Moolenaar    new
74083f37b91SBram Moolenaar    setline(1, 'something')
74183f37b91SBram Moolenaar    :substitute(some(other(
74283f37b91SBram Moolenaar    assert_equal('otherthing', getline(1))
74383f37b91SBram Moolenaar    bwipe!
74483f37b91SBram Moolenaar  END
74583f37b91SBram Moolenaar  writefile(lines, 'Xvim9lines')
74683f37b91SBram Moolenaar  source Xvim9lines
74783f37b91SBram Moolenaar
74883f37b91SBram Moolenaar  delete('Xvim9lines')
7495b1c8fe3SBram Moolenaarenddef
7505b1c8fe3SBram Moolenaar
751ad39c094SBram Moolenaardef Test_execute_cmd()
752ad39c094SBram Moolenaar  new
753ad39c094SBram Moolenaar  setline(1, 'default')
754ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
755ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
756ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
757ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
758ad39c094SBram Moolenaar  execute cmd1 cmd2
759ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
760ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
761ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
762ad39c094SBram Moolenaar  let cmd_first = 'call '
763ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
764ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
765ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
766ad39c094SBram Moolenaar  bwipe!
767ad39c094SBram Moolenaarenddef
768ad39c094SBram Moolenaar
769ad39c094SBram Moolenaardef Test_echo_cmd()
770ad39c094SBram Moolenaar  echo 'something'
771ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
772ad39c094SBram Moolenaar
773ad39c094SBram Moolenaar  let str1 = 'some'
774ad39c094SBram Moolenaar  let str2 = 'more'
775ad39c094SBram Moolenaar  echo str1 str2
776ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
777ad39c094SBram Moolenaarenddef
778ad39c094SBram Moolenaar
77941fe0617SBram Moolenaardef Test_for_outside_of_function()
78041fe0617SBram Moolenaar  let lines =<< trim END
78141fe0617SBram Moolenaar    vim9script
78241fe0617SBram Moolenaar    new
78341fe0617SBram Moolenaar    for var in range(0, 3)
78441fe0617SBram Moolenaar      append(line('$'), var)
78541fe0617SBram Moolenaar    endfor
78641fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
78741fe0617SBram Moolenaar    bwipe!
78841fe0617SBram Moolenaar  END
78941fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
79041fe0617SBram Moolenaar  source Xvim9for.vim
79141fe0617SBram Moolenaar  delete('Xvim9for.vim')
79241fe0617SBram Moolenaarenddef
7938a7d6542SBram Moolenaar
7948a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
795