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
58*fbdd08edSBram Moolenaar    let job1: job
5942a480bfSBram Moolenaar  endif
60*fbdd08edSBram Moolenaar  if has('float')
61*fbdd08edSBram Moolenaar    let float1: float = 3.4
62*fbdd08edSBram Moolenaar  endif
63*fbdd08edSBram Moolenaar  let party: partial = funcref('Test_syntax')
6442a480bfSBram Moolenaar
65401d9ffbSBram Moolenaar  g:newvar = 'new'
66401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
67401d9ffbSBram Moolenaar
68401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
69401d9ffbSBram Moolenaar  g:existing = 'no'
70401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
71401d9ffbSBram Moolenaar
72b283a8a6SBram Moolenaar  v:char = 'abc'
736e587dcbSBram Moolenaar  assert_equal('abc', v:char)
74b283a8a6SBram Moolenaar
75b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
766e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
77b283a8a6SBram Moolenaar  $ENVVAR = ''
786e587dcbSBram Moolenaar
79fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
80fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
81fd1823e0SBram Moolenaar  s:addToMe += 222
82fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
830bbf722aSBram Moolenaar  s:newVar = 'new'
840bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
858a7d6542SBram Moolenaarenddef
868a7d6542SBram Moolenaar
878a7d6542SBram Moolenaarfunc Test_assignment_failure()
888a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
898a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
908a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
918a7d6542SBram Moolenaar
928a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
938a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
948a7d6542SBram Moolenaar
958a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
968a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
978a7d6542SBram Moolenaar
988a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
998a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
1008a7d6542SBram Moolenaar
1018a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
1028a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
10342a480bfSBram Moolenaar
10442a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1007:')
10542a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
10642a480bfSBram Moolenaar
10742a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
10842a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
10942a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
11042a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
11142a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
11242a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
11342a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
11442a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
11542a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
11642a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
11742a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
1188a7d6542SBram Moolenaarendfunc
1198a7d6542SBram Moolenaar
1208a7d6542SBram Moolenaarfunc Test_const()
1218a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
1228a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
1238a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
1248a7d6542SBram Moolenaarendfunc
1258a7d6542SBram Moolenaar
1268a7d6542SBram Moolenaardef Test_block()
1278a7d6542SBram Moolenaar  let outer = 1
1288a7d6542SBram Moolenaar  {
1298a7d6542SBram Moolenaar    let inner = 2
1308a7d6542SBram Moolenaar    assert_equal(1, outer)
1318a7d6542SBram Moolenaar    assert_equal(2, inner)
1328a7d6542SBram Moolenaar  }
1338a7d6542SBram Moolenaar  assert_equal(1, outer)
1348a7d6542SBram Moolenaarenddef
1358a7d6542SBram Moolenaar
1368a7d6542SBram Moolenaarfunc Test_block_failure()
1378a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
1388a7d6542SBram Moolenaarendfunc
1398a7d6542SBram Moolenaar
1408a7d6542SBram Moolenaardef ReturnString(): string
1418a7d6542SBram Moolenaar  return 'string'
1428a7d6542SBram Moolenaarenddef
1438a7d6542SBram Moolenaar
1448a7d6542SBram Moolenaardef ReturnNumber(): number
1458a7d6542SBram Moolenaar  return 123
1468a7d6542SBram Moolenaarenddef
1478a7d6542SBram Moolenaar
14809f28f49SBram Moolenaarlet g:notNumber = 'string'
14909f28f49SBram Moolenaar
15009f28f49SBram Moolenaardef ReturnGlobal(): number
15109f28f49SBram Moolenaar  return g:notNumber
15209f28f49SBram Moolenaarenddef
15309f28f49SBram Moolenaar
1548a7d6542SBram Moolenaardef Test_return_string()
1558a7d6542SBram Moolenaar  assert_equal('string', ReturnString())
1568a7d6542SBram Moolenaar  assert_equal(123, ReturnNumber())
15709f28f49SBram Moolenaar  assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string')
1588a7d6542SBram Moolenaarenddef
1598a7d6542SBram Moolenaar
1608a7d6542SBram Moolenaarfunc Increment()
1618a7d6542SBram Moolenaar  let g:counter += 1
1628a7d6542SBram Moolenaarendfunc
1638a7d6542SBram Moolenaar
1648a7d6542SBram Moolenaardef Test_call_ufunc_count()
1658a7d6542SBram Moolenaar  g:counter = 1
1668a7d6542SBram Moolenaar  Increment()
1678a7d6542SBram Moolenaar  Increment()
1688a7d6542SBram Moolenaar  Increment()
1698a7d6542SBram Moolenaar  " works with and without :call
1708a7d6542SBram Moolenaar  assert_equal(4, g:counter)
171b283a8a6SBram Moolenaar  call assert_equal(4, g:counter)
1728a7d6542SBram Moolenaar  unlet g:counter
1738a7d6542SBram Moolenaarenddef
1748a7d6542SBram Moolenaar
1758a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string
1768a7d6542SBram Moolenaar  let res = arg
1778a7d6542SBram Moolenaar  for s in rest
1788a7d6542SBram Moolenaar    res ..= ',' .. s
1798a7d6542SBram Moolenaar  endfor
1808a7d6542SBram Moolenaar  return res
1818a7d6542SBram Moolenaarenddef
1828a7d6542SBram Moolenaar
1838a7d6542SBram Moolenaardef Test_call_varargs()
1848a7d6542SBram Moolenaar  assert_equal('one', MyVarargs('one'))
1858a7d6542SBram Moolenaar  assert_equal('one,two', MyVarargs('one', 'two'))
1868a7d6542SBram Moolenaar  assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
1878a7d6542SBram Moolenaarenddef
1888a7d6542SBram Moolenaar
189170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string
190170fcfcfSBram Moolenaar  return name
191170fcfcfSBram Moolenaarenddef
192170fcfcfSBram Moolenaar
193170fcfcfSBram Moolenaardef Test_call_default_args()
194170fcfcfSBram Moolenaar  assert_equal('string', MyDefaultArgs())
195170fcfcfSBram Moolenaar  assert_equal('one', MyDefaultArgs('one'))
196170fcfcfSBram Moolenaar  assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
197170fcfcfSBram Moolenaarenddef
198170fcfcfSBram Moolenaar
199170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func()
200170fcfcfSBram Moolenaar  call assert_equal('string', MyDefaultArgs())
201170fcfcfSBram Moolenaar  call assert_equal('one', MyDefaultArgs('one'))
202170fcfcfSBram Moolenaar  call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
203170fcfcfSBram Moolenaarendfunc
204170fcfcfSBram Moolenaar
205b35efa5eSBram Moolenaarfunc TakesOneArg(arg)
206b35efa5eSBram Moolenaar  echo a:arg
207b35efa5eSBram Moolenaarendfunc
208b35efa5eSBram Moolenaar
209b35efa5eSBram Moolenaardef Test_call_wrong_arg_count()
210b35efa5eSBram Moolenaar  call CheckDefFailure(['TakesOneArg()'], 'E119:')
211b35efa5eSBram Moolenaar  call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
212b35efa5eSBram Moolenaarenddef
213b35efa5eSBram Moolenaar
214170fcfcfSBram Moolenaar" Default arg and varargs
215170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
216170fcfcfSBram Moolenaar  let res = one .. ',' .. two
217170fcfcfSBram Moolenaar  for s in rest
218170fcfcfSBram Moolenaar    res ..= ',' .. s
219170fcfcfSBram Moolenaar  endfor
220170fcfcfSBram Moolenaar  return res
221170fcfcfSBram Moolenaarenddef
222170fcfcfSBram Moolenaar
223170fcfcfSBram Moolenaardef Test_call_def_varargs()
224170fcfcfSBram Moolenaar  call assert_fails('call MyDefVarargs()', 'E119:')
225170fcfcfSBram Moolenaar  assert_equal('one,foo', MyDefVarargs('one'))
226170fcfcfSBram Moolenaar  assert_equal('one,two', MyDefVarargs('one', 'two'))
227170fcfcfSBram Moolenaar  assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
228170fcfcfSBram Moolenaarenddef
229170fcfcfSBram Moolenaar
23042a480bfSBram Moolenaardef Test_using_var_as_arg()
23142a480bfSBram Moolenaar  call writefile(['def Func(x: number)',  'let x = 234', 'enddef'], 'Xdef')
23242a480bfSBram Moolenaar  call assert_fails('so Xdef', 'E1006:')
23342a480bfSBram Moolenaar  call delete('Xdef')
23442a480bfSBram Moolenaarenddef
23542a480bfSBram Moolenaar
236b35efa5eSBram Moolenaardef Test_call_func_defined_later()
237b35efa5eSBram Moolenaar  call assert_equal('one', DefinedLater('one'))
238b35efa5eSBram Moolenaar  call assert_fails('call NotDefined("one")', 'E117:')
239b35efa5eSBram Moolenaarenddef
240170fcfcfSBram Moolenaar
241b35efa5eSBram Moolenaarfunc DefinedLater(arg)
24226e117e9SBram Moolenaar  return a:arg
24326e117e9SBram Moolenaarendfunc
24426e117e9SBram Moolenaar
2457eeefd4aSBram Moolenaardef FuncWithForwardCall()
2467eeefd4aSBram Moolenaar  return DefinedEvenLater("yes")
2477eeefd4aSBram Moolenaarenddef
2487eeefd4aSBram Moolenaar
2497eeefd4aSBram Moolenaardef DefinedEvenLater(arg: string): string
2507eeefd4aSBram Moolenaar  return arg
2517eeefd4aSBram Moolenaarenddef
2527eeefd4aSBram Moolenaar
2537eeefd4aSBram Moolenaardef Test_error_in_nested_function()
2547eeefd4aSBram Moolenaar  " Error in called function requires unwinding the call stack.
2557eeefd4aSBram Moolenaar  assert_fails('call FuncWithForwardCall()', 'E1029')
2567eeefd4aSBram Moolenaarenddef
2577eeefd4aSBram Moolenaar
2588a7d6542SBram Moolenaardef Test_return_type_wrong()
259978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
260978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
261978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
262978d170bSBram Moolenaar  CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
2638a7d6542SBram Moolenaarenddef
2648a7d6542SBram Moolenaar
265bfe12043SBram Moolenaardef Test_arg_type_wrong()
266bfe12043SBram Moolenaar  CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
267bfe12043SBram Moolenaarenddef
268bfe12043SBram Moolenaar
2698a7d6542SBram Moolenaardef Test_try_catch()
2708a7d6542SBram Moolenaar  let l = []
2718a7d6542SBram Moolenaar  try
2728a7d6542SBram Moolenaar    add(l, '1')
2738a7d6542SBram Moolenaar    throw 'wrong'
2748a7d6542SBram Moolenaar    add(l, '2')
2758a7d6542SBram Moolenaar  catch
2768a7d6542SBram Moolenaar    add(l, v:exception)
2778a7d6542SBram Moolenaar  finally
2788a7d6542SBram Moolenaar    add(l, '3')
2798a7d6542SBram Moolenaar  endtry
2808a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
2818a7d6542SBram Moolenaarenddef
2828a7d6542SBram Moolenaar
283257cc5eeSBram Moolenaardef ThrowFromDef()
284257cc5eeSBram Moolenaar  throw 'getout'
285257cc5eeSBram Moolenaarenddef
286257cc5eeSBram Moolenaar
287257cc5eeSBram Moolenaarfunc CatchInFunc()
288257cc5eeSBram Moolenaar  try
289257cc5eeSBram Moolenaar    call ThrowFromDef()
290257cc5eeSBram Moolenaar  catch
291257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
292257cc5eeSBram Moolenaar  endtry
293257cc5eeSBram Moolenaarendfunc
294257cc5eeSBram Moolenaar
295257cc5eeSBram Moolenaardef CatchInDef()
296257cc5eeSBram Moolenaar  try
297257cc5eeSBram Moolenaar    ThrowFromDef()
298257cc5eeSBram Moolenaar  catch
299257cc5eeSBram Moolenaar    g:thrown_def = v:exception
300257cc5eeSBram Moolenaar  endtry
301257cc5eeSBram Moolenaarenddef
302257cc5eeSBram Moolenaar
303f575adffSBram Moolenaardef ReturnFinally(): string
304f575adffSBram Moolenaar  try
305f575adffSBram Moolenaar    return 'intry'
306f575adffSBram Moolenaar  finally
307f575adffSBram Moolenaar    g:in_finally = 'finally'
308f575adffSBram Moolenaar  endtry
309f575adffSBram Moolenaar  return 'end'
310f575adffSBram Moolenaarenddef
311f575adffSBram Moolenaar
312257cc5eeSBram Moolenaardef Test_try_catch_nested()
313257cc5eeSBram Moolenaar  CatchInFunc()
314257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
315257cc5eeSBram Moolenaar
316257cc5eeSBram Moolenaar  CatchInDef()
317257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
318f575adffSBram Moolenaar
319f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
320f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
321f575adffSBram Moolenaarenddef
322f575adffSBram Moolenaar
323f575adffSBram Moolenaardef Test_try_catch_match()
324f575adffSBram Moolenaar  let seq = 'a'
325f575adffSBram Moolenaar  try
326f575adffSBram Moolenaar    throw 'something'
327f575adffSBram Moolenaar  catch /nothing/
328f575adffSBram Moolenaar    seq ..= 'x'
329f575adffSBram Moolenaar  catch /some/
330f575adffSBram Moolenaar    seq ..= 'b'
331f575adffSBram Moolenaar  catch /asdf/
332f575adffSBram Moolenaar    seq ..= 'x'
333f575adffSBram Moolenaar  finally
334f575adffSBram Moolenaar    seq ..= 'c'
335f575adffSBram Moolenaar  endtry
336f575adffSBram Moolenaar  assert_equal('abc', seq)
337257cc5eeSBram Moolenaarenddef
338257cc5eeSBram Moolenaar
3398a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
3408a7d6542SBram Moolenaar  vim9script
3418a7d6542SBram Moolenaar  let name: string = 'bob'
3428a7d6542SBram Moolenaar  def Concat(arg: string): string
3438a7d6542SBram Moolenaar    return name .. arg
3448a7d6542SBram Moolenaar  enddef
3458a7d6542SBram Moolenaar  let g:result = Concat('bie')
3468a7d6542SBram Moolenaar  let g:localname = name
3478a7d6542SBram Moolenaar
3488a7d6542SBram Moolenaar  export const CONST = 1234
3498a7d6542SBram Moolenaar  export let exported = 9876
3506e587dcbSBram Moolenaar  export let exp_name = 'John'
3518a7d6542SBram Moolenaar  export def Exported(): string
3528a7d6542SBram Moolenaar    return 'Exported'
3538a7d6542SBram Moolenaar  enddef
3548a7d6542SBram MoolenaarEND
3558a7d6542SBram Moolenaar
3568a7d6542SBram Moolenaardef Test_vim9script()
3578a7d6542SBram Moolenaar  let import_script_lines =<< trim END
3588a7d6542SBram Moolenaar    vim9script
3598a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
3608a7d6542SBram Moolenaar    g:imported = exported
3616e587dcbSBram Moolenaar    exported += 3
3626e587dcbSBram Moolenaar    g:imported_added = exported
3638a7d6542SBram Moolenaar    g:imported_func = Exported()
3646e587dcbSBram Moolenaar
3656e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
3666e587dcbSBram Moolenaar    g:imported_name = exp_name
3676e587dcbSBram Moolenaar    exp_name ..= ' Doe'
3686e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
3698a7d6542SBram Moolenaar  END
3708a7d6542SBram Moolenaar
3718a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
3728a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
3738a7d6542SBram Moolenaar
3748a7d6542SBram Moolenaar  source Ximport.vim
3758a7d6542SBram Moolenaar
3768a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
3778a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
3788a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
3796e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
3808a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
3816e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
3826e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
3838a7d6542SBram Moolenaar  assert_false(exists('g:name'))
3848a7d6542SBram Moolenaar
3858a7d6542SBram Moolenaar  unlet g:result
3868a7d6542SBram Moolenaar  unlet g:localname
3878a7d6542SBram Moolenaar  unlet g:imported
3886e587dcbSBram Moolenaar  unlet g:imported_added
3898a7d6542SBram Moolenaar  unlet g:imported_func
3906e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
3918a7d6542SBram Moolenaar  delete('Ximport.vim')
392f2d5c240SBram Moolenaar
393f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
394f2d5c240SBram Moolenaar    vim9script
395f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
396f2d5c240SBram Moolenaar    def UseExport()
397f2d5c240SBram Moolenaar      g:imported = Export.exported
398f2d5c240SBram Moolenaar    enddef
399f2d5c240SBram Moolenaar    UseExport()
400f2d5c240SBram Moolenaar  END
401f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
402f2d5c240SBram Moolenaar  source Ximport.vim
403f2d5c240SBram Moolenaar  assert_equal(9876, g:imported)
404f2d5c240SBram Moolenaar
405f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
406f2d5c240SBram Moolenaar    vim9script
407f2d5c240SBram Moolenaar    import * from './Xexport.vim'
408f2d5c240SBram Moolenaar    g:imported = exported
409f2d5c240SBram Moolenaar  END
410f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
411f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
412f2d5c240SBram Moolenaar
413fa29c8abSBram Moolenaar  " try to import something that exists but is not exported
414fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
415fa29c8abSBram Moolenaar    vim9script
416fa29c8abSBram Moolenaar    import name from './Xexport.vim'
417fa29c8abSBram Moolenaar  END
418fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
419fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
420fa29c8abSBram Moolenaar
421fa29c8abSBram Moolenaar  " import a very long name, requires making a copy
422fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
423fa29c8abSBram Moolenaar    vim9script
424fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
425fa29c8abSBram Moolenaar  END
426fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
427fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
428fa29c8abSBram Moolenaar
429fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
430fa29c8abSBram Moolenaar    vim9script
431fa29c8abSBram Moolenaar    import name './Xexport.vim'
432fa29c8abSBram Moolenaar  END
433fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
434fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
435fa29c8abSBram Moolenaar
436fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
437fa29c8abSBram Moolenaar    vim9script
438fa29c8abSBram Moolenaar    import name from Xexport.vim
439fa29c8abSBram Moolenaar  END
440fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
441fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
442fa29c8abSBram Moolenaar
443fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
444fa29c8abSBram Moolenaar    vim9script
445fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
446fa29c8abSBram Moolenaar  END
447fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
448fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
449fa29c8abSBram Moolenaar
450fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
451fa29c8abSBram Moolenaar    vim9script
452fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
453fa29c8abSBram Moolenaar  END
454fa29c8abSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport.vim')
455fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1046:')
456fa29c8abSBram Moolenaar
457f2d5c240SBram Moolenaar  delete('Ximport.vim')
4588a7d6542SBram Moolenaar  delete('Xexport.vim')
4598a7d6542SBram Moolenaar
460750802b5SBram Moolenaar  " Check that in a Vim9 script 'cpo' is set to the Vim default.
461750802b5SBram Moolenaar  set cpo&vi
462750802b5SBram Moolenaar  let cpo_before = &cpo
463750802b5SBram Moolenaar  let lines =<< trim END
464750802b5SBram Moolenaar    vim9script
465750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
466750802b5SBram Moolenaar  END
467750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
468750802b5SBram Moolenaar  source Xvim9_script
469750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
470750802b5SBram Moolenaar  set cpo&vim
471750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
472750802b5SBram Moolenaar  delete('Xvim9_script')
473750802b5SBram Moolenaarenddef
474750802b5SBram Moolenaar
475750802b5SBram Moolenaardef Test_vim9script_fails()
4768a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
4778a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
478750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
479f2d5c240SBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
480750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
481750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
482750802b5SBram Moolenaar
483750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
484750802b5SBram Moolenaar  assert_fails('export something', 'E1042')
4858a7d6542SBram Moolenaarenddef
4868a7d6542SBram Moolenaar
4878a7d6542SBram Moolenaardef Test_vim9script_call()
4888a7d6542SBram Moolenaar  let lines =<< trim END
4898a7d6542SBram Moolenaar    vim9script
4908a7d6542SBram Moolenaar    let var = ''
4918a7d6542SBram Moolenaar    def MyFunc(arg: string)
4928a7d6542SBram Moolenaar       var = arg
4938a7d6542SBram Moolenaar    enddef
4948a7d6542SBram Moolenaar    MyFunc('foobar')
4958a7d6542SBram Moolenaar    assert_equal('foobar', var)
4968a7d6542SBram Moolenaar
4978a7d6542SBram Moolenaar    let str = 'barfoo'
4988a7d6542SBram Moolenaar    str->MyFunc()
4998a7d6542SBram Moolenaar    assert_equal('barfoo', var)
5008a7d6542SBram Moolenaar
5018a7d6542SBram Moolenaar    let g:value = 'value'
5028a7d6542SBram Moolenaar    g:value->MyFunc()
5038a7d6542SBram Moolenaar    assert_equal('value', var)
5048a7d6542SBram Moolenaar
5058a7d6542SBram Moolenaar    let listvar = []
5068a7d6542SBram Moolenaar    def ListFunc(arg: list<number>)
5078a7d6542SBram Moolenaar       listvar = arg
5088a7d6542SBram Moolenaar    enddef
5098a7d6542SBram Moolenaar    [1, 2, 3]->ListFunc()
5108a7d6542SBram Moolenaar    assert_equal([1, 2, 3], listvar)
5118a7d6542SBram Moolenaar
5128a7d6542SBram Moolenaar    let dictvar = {}
5138a7d6542SBram Moolenaar    def DictFunc(arg: dict<number>)
5148a7d6542SBram Moolenaar       dictvar = arg
5158a7d6542SBram Moolenaar    enddef
5168a7d6542SBram Moolenaar    {'a': 1, 'b': 2}->DictFunc()
5178a7d6542SBram Moolenaar    assert_equal(#{a: 1, b: 2}, dictvar)
5188a7d6542SBram Moolenaar    #{a: 3, b: 4}->DictFunc()
5198a7d6542SBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
5200c6ceaf9SBram Moolenaar
5210c6ceaf9SBram Moolenaar    ('text')->MyFunc()
5220c6ceaf9SBram Moolenaar    assert_equal('text', var)
5230c6ceaf9SBram Moolenaar    ("some")->MyFunc()
5240c6ceaf9SBram Moolenaar    assert_equal('some', var)
5258a7d6542SBram Moolenaar  END
5268a7d6542SBram Moolenaar  writefile(lines, 'Xcall.vim')
5278a7d6542SBram Moolenaar  source Xcall.vim
5288a7d6542SBram Moolenaar  delete('Xcall.vim')
5298a7d6542SBram Moolenaarenddef
5308a7d6542SBram Moolenaar
5318a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl()
5328a7d6542SBram Moolenaar  let lines =<< trim END
5338a7d6542SBram Moolenaar    vim9script
5348a7d6542SBram Moolenaar    let var = ''
5358a7d6542SBram Moolenaar    def MyFunc(arg: string)
5368a7d6542SBram Moolenaar       let var = 123
5378a7d6542SBram Moolenaar    enddef
5388a7d6542SBram Moolenaar  END
5398a7d6542SBram Moolenaar  writefile(lines, 'Xcall_decl.vim')
5408a7d6542SBram Moolenaar  assert_fails('source Xcall_decl.vim', 'E1054:')
5418a7d6542SBram Moolenaar  delete('Xcall_decl.vim')
5428a7d6542SBram Moolenaarenddef
5438a7d6542SBram Moolenaar
5448a7d6542SBram Moolenaardef Test_vim9script_call_fail_const()
5458a7d6542SBram Moolenaar  let lines =<< trim END
5468a7d6542SBram Moolenaar    vim9script
5478a7d6542SBram Moolenaar    const var = ''
5488a7d6542SBram Moolenaar    def MyFunc(arg: string)
5498a7d6542SBram Moolenaar       var = 'asdf'
5508a7d6542SBram Moolenaar    enddef
5518a7d6542SBram Moolenaar  END
5528a7d6542SBram Moolenaar  writefile(lines, 'Xcall_const.vim')
5538a7d6542SBram Moolenaar  assert_fails('source Xcall_const.vim', 'E46:')
5548a7d6542SBram Moolenaar  delete('Xcall_const.vim')
5558a7d6542SBram Moolenaarenddef
5568a7d6542SBram Moolenaar
5578a7d6542SBram Moolenaardef Test_vim9script_reload()
5588a7d6542SBram Moolenaar  let lines =<< trim END
5598a7d6542SBram Moolenaar    vim9script
5608a7d6542SBram Moolenaar    const var = ''
5618a7d6542SBram Moolenaar    let valone = 1234
5628a7d6542SBram Moolenaar    def MyFunc(arg: string)
5638a7d6542SBram Moolenaar       valone = 5678
5648a7d6542SBram Moolenaar    enddef
5658a7d6542SBram Moolenaar  END
5668a7d6542SBram Moolenaar  let morelines =<< trim END
5678a7d6542SBram Moolenaar    let valtwo = 222
5688a7d6542SBram Moolenaar    export def GetValtwo(): number
5698a7d6542SBram Moolenaar      return valtwo
5708a7d6542SBram Moolenaar    enddef
5718a7d6542SBram Moolenaar  END
5728a7d6542SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
5738a7d6542SBram Moolenaar  source Xreload.vim
5748a7d6542SBram Moolenaar  source Xreload.vim
5758a7d6542SBram Moolenaar  source Xreload.vim
5768a7d6542SBram Moolenaar
5778a7d6542SBram Moolenaar  let testlines =<< trim END
5788a7d6542SBram Moolenaar    vim9script
5798a7d6542SBram Moolenaar    def TheFunc()
5808a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
5818a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
5828a7d6542SBram Moolenaar    enddef
5838a7d6542SBram Moolenaar    TheFunc()
5848a7d6542SBram Moolenaar  END
5858a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
5868a7d6542SBram Moolenaar  source Ximport.vim
5878a7d6542SBram Moolenaar
5888a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
5898a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
5908a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
5918a7d6542SBram Moolenaar  source Xreload.vim
5928a7d6542SBram Moolenaar  source Ximport.vim
5938a7d6542SBram Moolenaar
5948a7d6542SBram Moolenaar  " cannot declare a var twice
5958a7d6542SBram Moolenaar  lines =<< trim END
5968a7d6542SBram Moolenaar    vim9script
5978a7d6542SBram Moolenaar    let valone = 1234
5988a7d6542SBram Moolenaar    let valone = 5678
5998a7d6542SBram Moolenaar  END
6008a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
6018a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
6028a7d6542SBram Moolenaar
6038a7d6542SBram Moolenaar  delete('Xreload.vim')
6048a7d6542SBram Moolenaar  delete('Ximport.vim')
6058a7d6542SBram Moolenaarenddef
6068a7d6542SBram Moolenaar
6078a7d6542SBram Moolenaardef Test_import_absolute()
6088a7d6542SBram Moolenaar  let import_lines = [
6098a7d6542SBram Moolenaar        \ 'vim9script',
6108a7d6542SBram Moolenaar        \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
611b283a8a6SBram Moolenaar        \ 'def UseExported()',
6128a7d6542SBram Moolenaar        \ '  g:imported_abs = exported',
6134e12a5dfSBram Moolenaar        \ '  exported = 8888',
6144e12a5dfSBram Moolenaar        \ '  g:imported_after = exported',
615b283a8a6SBram Moolenaar        \ 'enddef',
616b283a8a6SBram Moolenaar        \ 'UseExported()',
6174e12a5dfSBram Moolenaar        \ 'g:import_disassembled = execute("disass UseExported")',
6188a7d6542SBram Moolenaar        \ ]
6198a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
6208a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
6218a7d6542SBram Moolenaar
6228a7d6542SBram Moolenaar  source Ximport_abs.vim
6238a7d6542SBram Moolenaar
6248a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
6254e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
626b283a8a6SBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*'
627b283a8a6SBram Moolenaar        \ .. 'g:imported_abs = exported.*'
628b283a8a6SBram Moolenaar        \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
6294e12a5dfSBram Moolenaar        \ .. '1 STOREG g:imported_abs.*'
6304e12a5dfSBram Moolenaar        \ .. 'exported = 8888.*'
6314e12a5dfSBram Moolenaar        \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
6324e12a5dfSBram Moolenaar        \ .. 'g:imported_after = exported.*'
6334e12a5dfSBram Moolenaar        \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
6344e12a5dfSBram Moolenaar        \ .. '5 STOREG g:imported_after.*'
6354e12a5dfSBram Moolenaar        \, g:import_disassembled)
6368a7d6542SBram Moolenaar  unlet g:imported_abs
6374e12a5dfSBram Moolenaar  unlet g:import_disassembled
6388a7d6542SBram Moolenaar
6398a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
6408a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
6418a7d6542SBram Moolenaarenddef
6428a7d6542SBram Moolenaar
6438a7d6542SBram Moolenaardef Test_import_rtp()
6448a7d6542SBram Moolenaar  let import_lines = [
6458a7d6542SBram Moolenaar        \ 'vim9script',
6468a7d6542SBram Moolenaar        \ 'import exported from "Xexport_rtp.vim"',
6478a7d6542SBram Moolenaar        \ 'g:imported_rtp = exported',
6488a7d6542SBram Moolenaar        \ ]
6498a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
6508a7d6542SBram Moolenaar  mkdir('import')
6518a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
6528a7d6542SBram Moolenaar
6538a7d6542SBram Moolenaar  let save_rtp = &rtp
6548a7d6542SBram Moolenaar  &rtp = getcwd()
6558a7d6542SBram Moolenaar  source Ximport_rtp.vim
6568a7d6542SBram Moolenaar  &rtp = save_rtp
6578a7d6542SBram Moolenaar
6588a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
6598a7d6542SBram Moolenaar  unlet g:imported_rtp
6608a7d6542SBram Moolenaar
6618a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
6628a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
6638a7d6542SBram Moolenaar  delete('import', 'd')
6648a7d6542SBram Moolenaarenddef
6658a7d6542SBram Moolenaar
6668a7d6542SBram Moolenaardef Test_fixed_size_list()
6678a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
6688a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
6698a7d6542SBram Moolenaar  l->remove(0)
6708a7d6542SBram Moolenaar  l->add(5)
6718a7d6542SBram Moolenaar  l->insert(99, 1)
6720f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
6738a7d6542SBram Moolenaarenddef
6748a7d6542SBram Moolenaar
675673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not
676673660abSBram Moolenaar" recognized.
677673660abSBram Moolenaarfunc Test_function_python()
678673660abSBram Moolenaar  CheckFeature python3
679673660abSBram Moolenaar  let py = 'python3'
680673660abSBram Moolenaar  execute py "<< EOF"
681673660abSBram Moolenaardef do_something():
682673660abSBram Moolenaar  return 1
683673660abSBram MoolenaarEOF
684673660abSBram Moolenaarendfunc
685673660abSBram Moolenaar
686158906cfSBram Moolenaardef IfElse(what: number): string
687158906cfSBram Moolenaar  let res = ''
688158906cfSBram Moolenaar  if what == 1
689158906cfSBram Moolenaar    res = "one"
690158906cfSBram Moolenaar  elseif what == 2
691158906cfSBram Moolenaar    res = "two"
692a259d8d3SBram Moolenaar  else
693158906cfSBram Moolenaar    res = "three"
694a259d8d3SBram Moolenaar  endif
695158906cfSBram Moolenaar  return res
696a259d8d3SBram Moolenaarenddef
697a259d8d3SBram Moolenaar
698158906cfSBram Moolenaardef Test_if_elseif_else()
699158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
700158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
701158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
7020f18b6d1SBram Moolenaarenddef
7030f18b6d1SBram Moolenaar
70463ce4849SBram Moolenaardef Test_delfunc()
70563ce4849SBram Moolenaar  let lines =<< trim END
70663ce4849SBram Moolenaar    vim9script
70763ce4849SBram Moolenaar    def GoneSoon()
70863ce4849SBram Moolenaar      echo 'hello'
70963ce4849SBram Moolenaar    enddef
71063ce4849SBram Moolenaar
71163ce4849SBram Moolenaar    def CallGoneSoon()
71263ce4849SBram Moolenaar      GoneSoon()
71363ce4849SBram Moolenaar    enddef
71463ce4849SBram Moolenaar
71563ce4849SBram Moolenaar    delfunc GoneSoon
71663ce4849SBram Moolenaar    CallGoneSoon()
71763ce4849SBram Moolenaar  END
71863ce4849SBram Moolenaar  writefile(lines, 'XToDelFunc')
71963ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
72063ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
72163ce4849SBram Moolenaar
72263ce4849SBram Moolenaar  delete('XToDelFunc')
72363ce4849SBram Moolenaarenddef
72463ce4849SBram Moolenaar
7255b1c8fe3SBram Moolenaardef Test_substitute_cmd()
7265b1c8fe3SBram Moolenaar  new
7275b1c8fe3SBram Moolenaar  setline(1, 'something')
7285b1c8fe3SBram Moolenaar  :substitute(some(other(
7295b1c8fe3SBram Moolenaar  assert_equal('otherthing', getline(1))
73083f37b91SBram Moolenaar  bwipe!
73183f37b91SBram Moolenaar
73283f37b91SBram Moolenaar  " also when the context is Vim9 script
73383f37b91SBram Moolenaar  let lines =<< trim END
73483f37b91SBram Moolenaar    vim9script
73583f37b91SBram Moolenaar    new
73683f37b91SBram Moolenaar    setline(1, 'something')
73783f37b91SBram Moolenaar    :substitute(some(other(
73883f37b91SBram Moolenaar    assert_equal('otherthing', getline(1))
73983f37b91SBram Moolenaar    bwipe!
74083f37b91SBram Moolenaar  END
74183f37b91SBram Moolenaar  writefile(lines, 'Xvim9lines')
74283f37b91SBram Moolenaar  source Xvim9lines
74383f37b91SBram Moolenaar
74483f37b91SBram Moolenaar  delete('Xvim9lines')
7455b1c8fe3SBram Moolenaarenddef
7465b1c8fe3SBram Moolenaar
747ad39c094SBram Moolenaardef Test_execute_cmd()
748ad39c094SBram Moolenaar  new
749ad39c094SBram Moolenaar  setline(1, 'default')
750ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
751ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
752ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
753ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
754ad39c094SBram Moolenaar  execute cmd1 cmd2
755ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
756ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
757ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
758ad39c094SBram Moolenaar  let cmd_first = 'call '
759ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
760ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
761ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
762ad39c094SBram Moolenaar  bwipe!
763ad39c094SBram Moolenaarenddef
764ad39c094SBram Moolenaar
765ad39c094SBram Moolenaardef Test_echo_cmd()
766ad39c094SBram Moolenaar  echo 'something'
767ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
768ad39c094SBram Moolenaar
769ad39c094SBram Moolenaar  let str1 = 'some'
770ad39c094SBram Moolenaar  let str2 = 'more'
771ad39c094SBram Moolenaar  echo str1 str2
772ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
773ad39c094SBram Moolenaarenddef
774ad39c094SBram Moolenaar
7758a7d6542SBram Moolenaar
7768a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
777