18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4ad39c094SBram Moolenaarsource view_util.vim
5673660abSBram Moolenaar
68a7d6542SBram Moolenaar" Check that "lines" inside ":def" results in an "error" message.
78a7d6542SBram Moolenaarfunc CheckDefFailure(lines, error)
8978d170bSBram Moolenaar  call writefile(['def Func()'] + a:lines + ['enddef'], 'Xdef')
98a7d6542SBram Moolenaar  call assert_fails('so Xdef', a:error, a:lines)
108a7d6542SBram Moolenaar  call delete('Xdef')
118a7d6542SBram Moolenaarendfunc
128a7d6542SBram Moolenaar
138a7d6542SBram Moolenaarfunc CheckScriptFailure(lines, error)
148a7d6542SBram Moolenaar  call writefile(a:lines, 'Xdef')
158a7d6542SBram Moolenaar  call assert_fails('so Xdef', a:error, a:lines)
168a7d6542SBram Moolenaar  call delete('Xdef')
178a7d6542SBram Moolenaarendfunc
188a7d6542SBram Moolenaar
198a7d6542SBram Moolenaardef Test_syntax()
208a7d6542SBram Moolenaar  let var = 234
218a7d6542SBram Moolenaar  let other: list<string> = ['asdf']
228a7d6542SBram Moolenaarenddef
238a7d6542SBram Moolenaar
248a7d6542SBram Moolenaarfunc Test_def_basic()
258a7d6542SBram Moolenaar  def SomeFunc(): string
268a7d6542SBram Moolenaar    return 'yes'
278a7d6542SBram Moolenaar  enddef
288a7d6542SBram Moolenaar  call assert_equal('yes', SomeFunc())
298a7d6542SBram Moolenaarendfunc
308a7d6542SBram Moolenaar
316e587dcbSBram Moolenaarlet s:appendToMe = 'xxx'
326e587dcbSBram Moolenaarlet s:addToMe = 111
33401d9ffbSBram Moolenaarlet g:existing = 'yes'
346e587dcbSBram Moolenaar
358a7d6542SBram Moolenaardef Test_assignment()
368a7d6542SBram Moolenaar  let bool1: bool = true
378a7d6542SBram Moolenaar  assert_equal(v:true, bool1)
388a7d6542SBram Moolenaar  let bool2: bool = false
398a7d6542SBram Moolenaar  assert_equal(v:false, bool2)
408a7d6542SBram Moolenaar
410c2ca58eSBram Moolenaar  let list1: list<bool> = [false, true, false]
428a7d6542SBram Moolenaar  let list2: list<number> = [1, 2, 3]
430c2ca58eSBram Moolenaar  let list3: list<string> = ['sdf', 'asdf']
440c2ca58eSBram Moolenaar  let list4: list<any> = ['yes', true, 1234]
450c2ca58eSBram Moolenaar  let list5: list<blob> = [0z01, 0z02]
468a7d6542SBram Moolenaar
47436472f5SBram Moolenaar  let listS: list<string> = []
48436472f5SBram Moolenaar  let listN: list<number> = []
498a7d6542SBram Moolenaar
500c2ca58eSBram Moolenaar  let dict1: dict<bool> = #{one: false, two: true}
518a7d6542SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
520c2ca58eSBram Moolenaar  let dict3: dict<string> = #{key: 'value'}
530c2ca58eSBram Moolenaar  let dict4: dict<any> = #{one: 1, two: '2'}
540c2ca58eSBram Moolenaar  let dict5: dict<blob> = #{one: 0z01, tw: 0z02}
55b283a8a6SBram Moolenaar
5642a480bfSBram Moolenaar  if has('channel')
5742a480bfSBram Moolenaar    let chan1: channel
58fbdd08edSBram Moolenaar    let job1: job
59f51cb4e0SBram Moolenaar    let job2: job = job_start('willfail')
6042a480bfSBram Moolenaar  endif
61fbdd08edSBram Moolenaar  if has('float')
62fbdd08edSBram Moolenaar    let float1: float = 3.4
63fbdd08edSBram Moolenaar  endif
64087d2e15SBram Moolenaar  let funky1: func
65087d2e15SBram Moolenaar  let funky2: func = function('len')
66087d2e15SBram Moolenaar  let party1: partial
67087d2e15SBram Moolenaar  let party2: partial = funcref('Test_syntax')
6842a480bfSBram Moolenaar
6961a6d4e4SBram Moolenaar  " type becomes list<any>
7061a6d4e4SBram Moolenaar  let somelist = rand() > 0 ? [1, 2, 3] : ['a', 'b', 'c']
715381c7a1SBram Moolenaar  " type becomes dict<any>
725381c7a1SBram Moolenaar  let somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'}
7361a6d4e4SBram Moolenaar
74401d9ffbSBram Moolenaar  g:newvar = 'new'
75401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
76401d9ffbSBram Moolenaar
77401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
78401d9ffbSBram Moolenaar  g:existing = 'no'
79401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
80401d9ffbSBram Moolenaar
81b283a8a6SBram Moolenaar  v:char = 'abc'
826e587dcbSBram Moolenaar  assert_equal('abc', v:char)
83b283a8a6SBram Moolenaar
84b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
856e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
86b283a8a6SBram Moolenaar  $ENVVAR = ''
876e587dcbSBram Moolenaar
88fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
89fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
90fd1823e0SBram Moolenaar  s:addToMe += 222
91fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
920bbf722aSBram Moolenaar  s:newVar = 'new'
930bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
948a7d6542SBram Moolenaarenddef
958a7d6542SBram Moolenaar
968a7d6542SBram Moolenaarfunc Test_assignment_failure()
978a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
988a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
998a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
1008a7d6542SBram Moolenaar
1018a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
1028a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
1038a7d6542SBram Moolenaar
1048a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
1058a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
1068a7d6542SBram Moolenaar
1078a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
1088a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
1098a7d6542SBram Moolenaar
1108a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
1118a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
11242a480bfSBram Moolenaar
11342a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1007:')
11442a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
11542a480bfSBram Moolenaar
11642a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
11742a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
11842a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
11942a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
12042a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
12142a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
12242a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
12342a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
12442a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
12542a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
12642a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
1278a7d6542SBram Moolenaarendfunc
1288a7d6542SBram Moolenaar
1298a7d6542SBram Moolenaarfunc Test_const()
1308a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
1318a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
1328a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
1338a7d6542SBram Moolenaarendfunc
1348a7d6542SBram Moolenaar
1358a7d6542SBram Moolenaardef Test_block()
1368a7d6542SBram Moolenaar  let outer = 1
1378a7d6542SBram Moolenaar  {
1388a7d6542SBram Moolenaar    let inner = 2
1398a7d6542SBram Moolenaar    assert_equal(1, outer)
1408a7d6542SBram Moolenaar    assert_equal(2, inner)
1418a7d6542SBram Moolenaar  }
1428a7d6542SBram Moolenaar  assert_equal(1, outer)
1438a7d6542SBram Moolenaarenddef
1448a7d6542SBram Moolenaar
1458a7d6542SBram Moolenaarfunc Test_block_failure()
1468a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
1478a7d6542SBram Moolenaarendfunc
1488a7d6542SBram Moolenaar
1498a7d6542SBram Moolenaardef ReturnString(): string
1508a7d6542SBram Moolenaar  return 'string'
1518a7d6542SBram Moolenaarenddef
1528a7d6542SBram Moolenaar
1538a7d6542SBram Moolenaardef ReturnNumber(): number
1548a7d6542SBram Moolenaar  return 123
1558a7d6542SBram Moolenaarenddef
1568a7d6542SBram Moolenaar
15709f28f49SBram Moolenaarlet g:notNumber = 'string'
15809f28f49SBram Moolenaar
15909f28f49SBram Moolenaardef ReturnGlobal(): number
16009f28f49SBram Moolenaar  return g:notNumber
16109f28f49SBram Moolenaarenddef
16209f28f49SBram Moolenaar
1638a7d6542SBram Moolenaardef Test_return_string()
1648a7d6542SBram Moolenaar  assert_equal('string', ReturnString())
1658a7d6542SBram Moolenaar  assert_equal(123, ReturnNumber())
16609f28f49SBram Moolenaar  assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string')
1678a7d6542SBram Moolenaarenddef
1688a7d6542SBram Moolenaar
1698a7d6542SBram Moolenaarfunc Increment()
1708a7d6542SBram Moolenaar  let g:counter += 1
1718a7d6542SBram Moolenaarendfunc
1728a7d6542SBram Moolenaar
1738a7d6542SBram Moolenaardef Test_call_ufunc_count()
1748a7d6542SBram Moolenaar  g:counter = 1
1758a7d6542SBram Moolenaar  Increment()
1768a7d6542SBram Moolenaar  Increment()
1778a7d6542SBram Moolenaar  Increment()
1788a7d6542SBram Moolenaar  " works with and without :call
1798a7d6542SBram Moolenaar  assert_equal(4, g:counter)
180b283a8a6SBram Moolenaar  call assert_equal(4, g:counter)
1818a7d6542SBram Moolenaar  unlet g:counter
1828a7d6542SBram Moolenaarenddef
1838a7d6542SBram Moolenaar
1848a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string
1858a7d6542SBram Moolenaar  let res = arg
1868a7d6542SBram Moolenaar  for s in rest
1878a7d6542SBram Moolenaar    res ..= ',' .. s
1888a7d6542SBram Moolenaar  endfor
1898a7d6542SBram Moolenaar  return res
1908a7d6542SBram Moolenaarenddef
1918a7d6542SBram Moolenaar
1928a7d6542SBram Moolenaardef Test_call_varargs()
1938a7d6542SBram Moolenaar  assert_equal('one', MyVarargs('one'))
1948a7d6542SBram Moolenaar  assert_equal('one,two', MyVarargs('one', 'two'))
1958a7d6542SBram Moolenaar  assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
1968a7d6542SBram Moolenaarenddef
1978a7d6542SBram Moolenaar
198170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string
199170fcfcfSBram Moolenaar  return name
200170fcfcfSBram Moolenaarenddef
201170fcfcfSBram Moolenaar
202170fcfcfSBram Moolenaardef Test_call_default_args()
203170fcfcfSBram Moolenaar  assert_equal('string', MyDefaultArgs())
204170fcfcfSBram Moolenaar  assert_equal('one', MyDefaultArgs('one'))
205170fcfcfSBram Moolenaar  assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
206170fcfcfSBram Moolenaarenddef
207170fcfcfSBram Moolenaar
208170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func()
209170fcfcfSBram Moolenaar  call assert_equal('string', MyDefaultArgs())
210170fcfcfSBram Moolenaar  call assert_equal('one', MyDefaultArgs('one'))
211170fcfcfSBram Moolenaar  call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
212170fcfcfSBram Moolenaarendfunc
213170fcfcfSBram Moolenaar
214b35efa5eSBram Moolenaarfunc TakesOneArg(arg)
215b35efa5eSBram Moolenaar  echo a:arg
216b35efa5eSBram Moolenaarendfunc
217b35efa5eSBram Moolenaar
218b35efa5eSBram Moolenaardef Test_call_wrong_arg_count()
219b35efa5eSBram Moolenaar  call CheckDefFailure(['TakesOneArg()'], 'E119:')
220b35efa5eSBram Moolenaar  call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
221b35efa5eSBram Moolenaarenddef
222b35efa5eSBram Moolenaar
223170fcfcfSBram Moolenaar" Default arg and varargs
224170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
225170fcfcfSBram Moolenaar  let res = one .. ',' .. two
226170fcfcfSBram Moolenaar  for s in rest
227170fcfcfSBram Moolenaar    res ..= ',' .. s
228170fcfcfSBram Moolenaar  endfor
229170fcfcfSBram Moolenaar  return res
230170fcfcfSBram Moolenaarenddef
231170fcfcfSBram Moolenaar
232170fcfcfSBram Moolenaardef Test_call_def_varargs()
233170fcfcfSBram Moolenaar  call assert_fails('call MyDefVarargs()', 'E119:')
234170fcfcfSBram Moolenaar  assert_equal('one,foo', MyDefVarargs('one'))
235170fcfcfSBram Moolenaar  assert_equal('one,two', MyDefVarargs('one', 'two'))
236170fcfcfSBram Moolenaar  assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
237170fcfcfSBram Moolenaarenddef
238170fcfcfSBram Moolenaar
23942a480bfSBram Moolenaardef Test_using_var_as_arg()
24042a480bfSBram Moolenaar  call writefile(['def Func(x: number)',  'let x = 234', 'enddef'], 'Xdef')
24142a480bfSBram Moolenaar  call assert_fails('so Xdef', 'E1006:')
24242a480bfSBram Moolenaar  call delete('Xdef')
24342a480bfSBram Moolenaarenddef
24442a480bfSBram Moolenaar
245b35efa5eSBram Moolenaardef Test_call_func_defined_later()
246b35efa5eSBram Moolenaar  call assert_equal('one', DefinedLater('one'))
247b35efa5eSBram Moolenaar  call assert_fails('call NotDefined("one")', 'E117:')
248b35efa5eSBram Moolenaarenddef
249170fcfcfSBram Moolenaar
250b35efa5eSBram Moolenaarfunc DefinedLater(arg)
25126e117e9SBram Moolenaar  return a:arg
25226e117e9SBram Moolenaarendfunc
25326e117e9SBram Moolenaar
2547eeefd4aSBram Moolenaardef FuncWithForwardCall()
2557eeefd4aSBram Moolenaar  return DefinedEvenLater("yes")
2567eeefd4aSBram Moolenaarenddef
2577eeefd4aSBram Moolenaar
2587eeefd4aSBram Moolenaardef DefinedEvenLater(arg: string): string
2597eeefd4aSBram Moolenaar  return arg
2607eeefd4aSBram Moolenaarenddef
2617eeefd4aSBram Moolenaar
2627eeefd4aSBram Moolenaardef Test_error_in_nested_function()
2637eeefd4aSBram Moolenaar  " Error in called function requires unwinding the call stack.
2647eeefd4aSBram Moolenaar  assert_fails('call FuncWithForwardCall()', 'E1029')
2657eeefd4aSBram Moolenaarenddef
2667eeefd4aSBram Moolenaar
2678a7d6542SBram Moolenaardef Test_return_type_wrong()
268978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
269978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
270978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
271978d170bSBram Moolenaar  CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
2728a7d6542SBram Moolenaarenddef
2738a7d6542SBram Moolenaar
274bfe12043SBram Moolenaardef Test_arg_type_wrong()
275bfe12043SBram Moolenaar  CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
276bfe12043SBram Moolenaarenddef
277bfe12043SBram Moolenaar
2788a7d6542SBram Moolenaardef Test_try_catch()
2798a7d6542SBram Moolenaar  let l = []
2808a7d6542SBram Moolenaar  try
2818a7d6542SBram Moolenaar    add(l, '1')
2828a7d6542SBram Moolenaar    throw 'wrong'
2838a7d6542SBram Moolenaar    add(l, '2')
2848a7d6542SBram Moolenaar  catch
2858a7d6542SBram Moolenaar    add(l, v:exception)
2868a7d6542SBram Moolenaar  finally
2878a7d6542SBram Moolenaar    add(l, '3')
2888a7d6542SBram Moolenaar  endtry
2898a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
2908a7d6542SBram Moolenaarenddef
2918a7d6542SBram Moolenaar
292257cc5eeSBram Moolenaardef ThrowFromDef()
293257cc5eeSBram Moolenaar  throw 'getout'
294257cc5eeSBram Moolenaarenddef
295257cc5eeSBram Moolenaar
296257cc5eeSBram Moolenaarfunc CatchInFunc()
297257cc5eeSBram Moolenaar  try
298257cc5eeSBram Moolenaar    call ThrowFromDef()
299257cc5eeSBram Moolenaar  catch
300257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
301257cc5eeSBram Moolenaar  endtry
302257cc5eeSBram Moolenaarendfunc
303257cc5eeSBram Moolenaar
304257cc5eeSBram Moolenaardef CatchInDef()
305257cc5eeSBram Moolenaar  try
306257cc5eeSBram Moolenaar    ThrowFromDef()
307257cc5eeSBram Moolenaar  catch
308257cc5eeSBram Moolenaar    g:thrown_def = v:exception
309257cc5eeSBram Moolenaar  endtry
310257cc5eeSBram Moolenaarenddef
311257cc5eeSBram Moolenaar
312f575adffSBram Moolenaardef ReturnFinally(): string
313f575adffSBram Moolenaar  try
314f575adffSBram Moolenaar    return 'intry'
315f575adffSBram Moolenaar  finally
316f575adffSBram Moolenaar    g:in_finally = 'finally'
317f575adffSBram Moolenaar  endtry
318f575adffSBram Moolenaar  return 'end'
319f575adffSBram Moolenaarenddef
320f575adffSBram Moolenaar
321257cc5eeSBram Moolenaardef Test_try_catch_nested()
322257cc5eeSBram Moolenaar  CatchInFunc()
323257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
324257cc5eeSBram Moolenaar
325257cc5eeSBram Moolenaar  CatchInDef()
326257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
327f575adffSBram Moolenaar
328f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
329f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
330f575adffSBram Moolenaarenddef
331f575adffSBram Moolenaar
332f575adffSBram Moolenaardef Test_try_catch_match()
333f575adffSBram Moolenaar  let seq = 'a'
334f575adffSBram Moolenaar  try
335f575adffSBram Moolenaar    throw 'something'
336f575adffSBram Moolenaar  catch /nothing/
337f575adffSBram Moolenaar    seq ..= 'x'
338f575adffSBram Moolenaar  catch /some/
339f575adffSBram Moolenaar    seq ..= 'b'
340f575adffSBram Moolenaar  catch /asdf/
341f575adffSBram Moolenaar    seq ..= 'x'
342f575adffSBram Moolenaar  finally
343f575adffSBram Moolenaar    seq ..= 'c'
344f575adffSBram Moolenaar  endtry
345f575adffSBram Moolenaar  assert_equal('abc', seq)
346257cc5eeSBram Moolenaarenddef
347257cc5eeSBram Moolenaar
3488a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
3498a7d6542SBram Moolenaar  vim9script
3508a7d6542SBram Moolenaar  let name: string = 'bob'
3518a7d6542SBram Moolenaar  def Concat(arg: string): string
3528a7d6542SBram Moolenaar    return name .. arg
3538a7d6542SBram Moolenaar  enddef
3548a7d6542SBram Moolenaar  let g:result = Concat('bie')
3558a7d6542SBram Moolenaar  let g:localname = name
3568a7d6542SBram Moolenaar
3578a7d6542SBram Moolenaar  export const CONST = 1234
3588a7d6542SBram Moolenaar  export let exported = 9876
3596e587dcbSBram Moolenaar  export let exp_name = 'John'
3608a7d6542SBram Moolenaar  export def Exported(): string
3618a7d6542SBram Moolenaar    return 'Exported'
3628a7d6542SBram Moolenaar  enddef
3638a7d6542SBram MoolenaarEND
3648a7d6542SBram Moolenaar
3658a7d6542SBram Moolenaardef Test_vim9script()
3668a7d6542SBram Moolenaar  let import_script_lines =<< trim END
3678a7d6542SBram Moolenaar    vim9script
3688a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
3698a7d6542SBram Moolenaar    g:imported = exported
3706e587dcbSBram Moolenaar    exported += 3
3716e587dcbSBram Moolenaar    g:imported_added = exported
3728a7d6542SBram Moolenaar    g:imported_func = Exported()
3736e587dcbSBram Moolenaar
3746e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
3756e587dcbSBram Moolenaar    g:imported_name = exp_name
3766e587dcbSBram Moolenaar    exp_name ..= ' Doe'
3776e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
3785381c7a1SBram Moolenaar    g:imported_later = exported
3798a7d6542SBram Moolenaar  END
3808a7d6542SBram Moolenaar
3818a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
3828a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
3838a7d6542SBram Moolenaar
3848a7d6542SBram Moolenaar  source Ximport.vim
3858a7d6542SBram Moolenaar
3868a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
3878a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
3888a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
3896e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
3905381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
3918a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
3926e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
3936e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
3948a7d6542SBram Moolenaar  assert_false(exists('g:name'))
3958a7d6542SBram Moolenaar
3968a7d6542SBram Moolenaar  unlet g:result
3978a7d6542SBram Moolenaar  unlet g:localname
3988a7d6542SBram Moolenaar  unlet g:imported
3996e587dcbSBram Moolenaar  unlet g:imported_added
4005381c7a1SBram Moolenaar  unlet g:imported_later
4018a7d6542SBram Moolenaar  unlet g:imported_func
4026e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
4038a7d6542SBram Moolenaar  delete('Ximport.vim')
404f2d5c240SBram Moolenaar
4055381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
4065381c7a1SBram Moolenaar    vim9script
4075381c7a1SBram Moolenaar    def ImportInDef()
4085381c7a1SBram Moolenaar      import exported from './Xexport.vim'
4095381c7a1SBram Moolenaar      g:imported = exported
4105381c7a1SBram Moolenaar      exported += 7
4115381c7a1SBram Moolenaar      g:imported_added = exported
4125381c7a1SBram Moolenaar    enddef
4135381c7a1SBram Moolenaar    ImportInDef()
4145381c7a1SBram Moolenaar  END
4155381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
4165381c7a1SBram Moolenaar  source Ximport2.vim
4175381c7a1SBram Moolenaar  " TODO: this should be 9879
4185381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
4195381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
4205381c7a1SBram Moolenaar  unlet g:imported
4215381c7a1SBram Moolenaar  unlet g:imported_added
4225381c7a1SBram Moolenaar  delete('Ximport2.vim')
4235381c7a1SBram Moolenaar
424f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
425f2d5c240SBram Moolenaar    vim9script
426f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
427f2d5c240SBram Moolenaar    def UseExport()
428f2d5c240SBram Moolenaar      g:imported = Export.exported
429f2d5c240SBram Moolenaar    enddef
430f2d5c240SBram Moolenaar    UseExport()
431f2d5c240SBram Moolenaar  END
432f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
433f2d5c240SBram Moolenaar  source Ximport.vim
4345381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
435f2d5c240SBram Moolenaar
436f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
437f2d5c240SBram Moolenaar    vim9script
438f2d5c240SBram Moolenaar    import * from './Xexport.vim'
439f2d5c240SBram Moolenaar    g:imported = exported
440f2d5c240SBram Moolenaar  END
441f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
442f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
443f2d5c240SBram Moolenaar
444fa29c8abSBram Moolenaar  " try to import something that exists but is not exported
445fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
446fa29c8abSBram Moolenaar    vim9script
447fa29c8abSBram Moolenaar    import name from './Xexport.vim'
448fa29c8abSBram Moolenaar  END
449fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
450fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
451fa29c8abSBram Moolenaar
452fa29c8abSBram Moolenaar  " import a very long name, requires making a copy
453fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
454fa29c8abSBram Moolenaar    vim9script
455fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
456fa29c8abSBram Moolenaar  END
457fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
458fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
459fa29c8abSBram Moolenaar
460fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
461fa29c8abSBram Moolenaar    vim9script
462fa29c8abSBram Moolenaar    import name './Xexport.vim'
463fa29c8abSBram Moolenaar  END
464fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
465fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
466fa29c8abSBram Moolenaar
467fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
468fa29c8abSBram Moolenaar    vim9script
469fa29c8abSBram Moolenaar    import name from Xexport.vim
470fa29c8abSBram Moolenaar  END
471fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
472fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
473fa29c8abSBram Moolenaar
474fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
475fa29c8abSBram Moolenaar    vim9script
476fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
477fa29c8abSBram Moolenaar  END
478fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
479fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
480fa29c8abSBram Moolenaar
481fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
482fa29c8abSBram Moolenaar    vim9script
483fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
484fa29c8abSBram Moolenaar  END
485fa29c8abSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport.vim')
486fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1046:')
487fa29c8abSBram Moolenaar
488f2d5c240SBram Moolenaar  delete('Ximport.vim')
4898a7d6542SBram Moolenaar  delete('Xexport.vim')
4908a7d6542SBram Moolenaar
491750802b5SBram Moolenaar  " Check that in a Vim9 script 'cpo' is set to the Vim default.
492750802b5SBram Moolenaar  set cpo&vi
493750802b5SBram Moolenaar  let cpo_before = &cpo
494750802b5SBram Moolenaar  let lines =<< trim END
495750802b5SBram Moolenaar    vim9script
496750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
497750802b5SBram Moolenaar  END
498750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
499750802b5SBram Moolenaar  source Xvim9_script
500750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
501750802b5SBram Moolenaar  set cpo&vim
502750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
503750802b5SBram Moolenaar  delete('Xvim9_script')
504750802b5SBram Moolenaarenddef
505750802b5SBram Moolenaar
506750802b5SBram Moolenaardef Test_vim9script_fails()
5078a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
5088a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
509750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
510f2d5c240SBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1042:')
511750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1044:')
512750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
513750802b5SBram Moolenaar
514750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
515750802b5SBram Moolenaar  assert_fails('export something', 'E1042')
5168a7d6542SBram Moolenaarenddef
5178a7d6542SBram Moolenaar
5188a7d6542SBram Moolenaardef Test_vim9script_call()
5198a7d6542SBram Moolenaar  let lines =<< trim END
5208a7d6542SBram Moolenaar    vim9script
5218a7d6542SBram Moolenaar    let var = ''
5228a7d6542SBram Moolenaar    def MyFunc(arg: string)
5238a7d6542SBram Moolenaar       var = arg
5248a7d6542SBram Moolenaar    enddef
5258a7d6542SBram Moolenaar    MyFunc('foobar')
5268a7d6542SBram Moolenaar    assert_equal('foobar', var)
5278a7d6542SBram Moolenaar
5288a7d6542SBram Moolenaar    let str = 'barfoo'
5298a7d6542SBram Moolenaar    str->MyFunc()
5308a7d6542SBram Moolenaar    assert_equal('barfoo', var)
5318a7d6542SBram Moolenaar
5328a7d6542SBram Moolenaar    let g:value = 'value'
5338a7d6542SBram Moolenaar    g:value->MyFunc()
5348a7d6542SBram Moolenaar    assert_equal('value', var)
5358a7d6542SBram Moolenaar
5368a7d6542SBram Moolenaar    let listvar = []
5378a7d6542SBram Moolenaar    def ListFunc(arg: list<number>)
5388a7d6542SBram Moolenaar       listvar = arg
5398a7d6542SBram Moolenaar    enddef
5408a7d6542SBram Moolenaar    [1, 2, 3]->ListFunc()
5418a7d6542SBram Moolenaar    assert_equal([1, 2, 3], listvar)
5428a7d6542SBram Moolenaar
5438a7d6542SBram Moolenaar    let dictvar = {}
5448a7d6542SBram Moolenaar    def DictFunc(arg: dict<number>)
5458a7d6542SBram Moolenaar       dictvar = arg
5468a7d6542SBram Moolenaar    enddef
5478a7d6542SBram Moolenaar    {'a': 1, 'b': 2}->DictFunc()
5488a7d6542SBram Moolenaar    assert_equal(#{a: 1, b: 2}, dictvar)
5498a7d6542SBram Moolenaar    #{a: 3, b: 4}->DictFunc()
5508a7d6542SBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
5510c6ceaf9SBram Moolenaar
5520c6ceaf9SBram Moolenaar    ('text')->MyFunc()
5530c6ceaf9SBram Moolenaar    assert_equal('text', var)
5540c6ceaf9SBram Moolenaar    ("some")->MyFunc()
5550c6ceaf9SBram Moolenaar    assert_equal('some', var)
5568a7d6542SBram Moolenaar  END
5578a7d6542SBram Moolenaar  writefile(lines, 'Xcall.vim')
5588a7d6542SBram Moolenaar  source Xcall.vim
5598a7d6542SBram Moolenaar  delete('Xcall.vim')
5608a7d6542SBram Moolenaarenddef
5618a7d6542SBram Moolenaar
5628a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl()
5638a7d6542SBram Moolenaar  let lines =<< trim END
5648a7d6542SBram Moolenaar    vim9script
5658a7d6542SBram Moolenaar    let var = ''
5668a7d6542SBram Moolenaar    def MyFunc(arg: string)
5678a7d6542SBram Moolenaar       let var = 123
5688a7d6542SBram Moolenaar    enddef
5698a7d6542SBram Moolenaar  END
5708a7d6542SBram Moolenaar  writefile(lines, 'Xcall_decl.vim')
5718a7d6542SBram Moolenaar  assert_fails('source Xcall_decl.vim', 'E1054:')
5728a7d6542SBram Moolenaar  delete('Xcall_decl.vim')
5738a7d6542SBram Moolenaarenddef
5748a7d6542SBram Moolenaar
5758a7d6542SBram Moolenaardef Test_vim9script_call_fail_const()
5768a7d6542SBram Moolenaar  let lines =<< trim END
5778a7d6542SBram Moolenaar    vim9script
5788a7d6542SBram Moolenaar    const var = ''
5798a7d6542SBram Moolenaar    def MyFunc(arg: string)
5808a7d6542SBram Moolenaar       var = 'asdf'
5818a7d6542SBram Moolenaar    enddef
5828a7d6542SBram Moolenaar  END
5838a7d6542SBram Moolenaar  writefile(lines, 'Xcall_const.vim')
5848a7d6542SBram Moolenaar  assert_fails('source Xcall_const.vim', 'E46:')
5858a7d6542SBram Moolenaar  delete('Xcall_const.vim')
5868a7d6542SBram Moolenaarenddef
5878a7d6542SBram Moolenaar
5888a7d6542SBram Moolenaardef Test_vim9script_reload()
5898a7d6542SBram Moolenaar  let lines =<< trim END
5908a7d6542SBram Moolenaar    vim9script
5918a7d6542SBram Moolenaar    const var = ''
5928a7d6542SBram Moolenaar    let valone = 1234
5938a7d6542SBram Moolenaar    def MyFunc(arg: string)
5948a7d6542SBram Moolenaar       valone = 5678
5958a7d6542SBram Moolenaar    enddef
5968a7d6542SBram Moolenaar  END
5978a7d6542SBram Moolenaar  let morelines =<< trim END
5988a7d6542SBram Moolenaar    let valtwo = 222
5998a7d6542SBram Moolenaar    export def GetValtwo(): number
6008a7d6542SBram Moolenaar      return valtwo
6018a7d6542SBram Moolenaar    enddef
6028a7d6542SBram Moolenaar  END
6038a7d6542SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
6048a7d6542SBram Moolenaar  source Xreload.vim
6058a7d6542SBram Moolenaar  source Xreload.vim
6068a7d6542SBram Moolenaar  source Xreload.vim
6078a7d6542SBram Moolenaar
6088a7d6542SBram Moolenaar  let testlines =<< trim END
6098a7d6542SBram Moolenaar    vim9script
6108a7d6542SBram Moolenaar    def TheFunc()
6118a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
6128a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
6138a7d6542SBram Moolenaar    enddef
6148a7d6542SBram Moolenaar    TheFunc()
6158a7d6542SBram Moolenaar  END
6168a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
6178a7d6542SBram Moolenaar  source Ximport.vim
6188a7d6542SBram Moolenaar
6198a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
6208a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
6218a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
6228a7d6542SBram Moolenaar  source Xreload.vim
6238a7d6542SBram Moolenaar  source Ximport.vim
6248a7d6542SBram Moolenaar
6258a7d6542SBram Moolenaar  " cannot declare a var twice
6268a7d6542SBram Moolenaar  lines =<< trim END
6278a7d6542SBram Moolenaar    vim9script
6288a7d6542SBram Moolenaar    let valone = 1234
6298a7d6542SBram Moolenaar    let valone = 5678
6308a7d6542SBram Moolenaar  END
6318a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
6328a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
6338a7d6542SBram Moolenaar
6348a7d6542SBram Moolenaar  delete('Xreload.vim')
6358a7d6542SBram Moolenaar  delete('Ximport.vim')
6368a7d6542SBram Moolenaarenddef
6378a7d6542SBram Moolenaar
6388a7d6542SBram Moolenaardef Test_import_absolute()
6398a7d6542SBram Moolenaar  let import_lines = [
6408a7d6542SBram Moolenaar        \ 'vim9script',
6418a7d6542SBram Moolenaar        \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
642b283a8a6SBram Moolenaar        \ 'def UseExported()',
6438a7d6542SBram Moolenaar        \ '  g:imported_abs = exported',
6444e12a5dfSBram Moolenaar        \ '  exported = 8888',
6454e12a5dfSBram Moolenaar        \ '  g:imported_after = exported',
646b283a8a6SBram Moolenaar        \ 'enddef',
647b283a8a6SBram Moolenaar        \ 'UseExported()',
6484e12a5dfSBram Moolenaar        \ 'g:import_disassembled = execute("disass UseExported")',
6498a7d6542SBram Moolenaar        \ ]
6508a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
6518a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
6528a7d6542SBram Moolenaar
6538a7d6542SBram Moolenaar  source Ximport_abs.vim
6548a7d6542SBram Moolenaar
6558a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
6564e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
657b283a8a6SBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*'
658b283a8a6SBram Moolenaar        \ .. 'g:imported_abs = exported.*'
659b283a8a6SBram Moolenaar        \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
6604e12a5dfSBram Moolenaar        \ .. '1 STOREG g:imported_abs.*'
6614e12a5dfSBram Moolenaar        \ .. 'exported = 8888.*'
6624e12a5dfSBram Moolenaar        \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
6634e12a5dfSBram Moolenaar        \ .. 'g:imported_after = exported.*'
6644e12a5dfSBram Moolenaar        \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
6654e12a5dfSBram Moolenaar        \ .. '5 STOREG g:imported_after.*'
6664e12a5dfSBram Moolenaar        \, g:import_disassembled)
6678a7d6542SBram Moolenaar  unlet g:imported_abs
6684e12a5dfSBram Moolenaar  unlet g:import_disassembled
6698a7d6542SBram Moolenaar
6708a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
6718a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
6728a7d6542SBram Moolenaarenddef
6738a7d6542SBram Moolenaar
6748a7d6542SBram Moolenaardef Test_import_rtp()
6758a7d6542SBram Moolenaar  let import_lines = [
6768a7d6542SBram Moolenaar        \ 'vim9script',
6778a7d6542SBram Moolenaar        \ 'import exported from "Xexport_rtp.vim"',
6788a7d6542SBram Moolenaar        \ 'g:imported_rtp = exported',
6798a7d6542SBram Moolenaar        \ ]
6808a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
6818a7d6542SBram Moolenaar  mkdir('import')
6828a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
6838a7d6542SBram Moolenaar
6848a7d6542SBram Moolenaar  let save_rtp = &rtp
6858a7d6542SBram Moolenaar  &rtp = getcwd()
6868a7d6542SBram Moolenaar  source Ximport_rtp.vim
6878a7d6542SBram Moolenaar  &rtp = save_rtp
6888a7d6542SBram Moolenaar
6898a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
6908a7d6542SBram Moolenaar  unlet g:imported_rtp
6918a7d6542SBram Moolenaar
6928a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
6938a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
6948a7d6542SBram Moolenaar  delete('import', 'd')
6958a7d6542SBram Moolenaarenddef
6968a7d6542SBram Moolenaar
6978a7d6542SBram Moolenaardef Test_fixed_size_list()
6988a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
6998a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
7008a7d6542SBram Moolenaar  l->remove(0)
7018a7d6542SBram Moolenaar  l->add(5)
7028a7d6542SBram Moolenaar  l->insert(99, 1)
7030f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
7048a7d6542SBram Moolenaarenddef
7058a7d6542SBram Moolenaar
706673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not
707673660abSBram Moolenaar" recognized.
708673660abSBram Moolenaarfunc Test_function_python()
709673660abSBram Moolenaar  CheckFeature python3
710673660abSBram Moolenaar  let py = 'python3'
711673660abSBram Moolenaar  execute py "<< EOF"
712673660abSBram Moolenaardef do_something():
713673660abSBram Moolenaar  return 1
714673660abSBram MoolenaarEOF
715673660abSBram Moolenaarendfunc
716673660abSBram Moolenaar
717158906cfSBram Moolenaardef IfElse(what: number): string
718158906cfSBram Moolenaar  let res = ''
719158906cfSBram Moolenaar  if what == 1
720158906cfSBram Moolenaar    res = "one"
721158906cfSBram Moolenaar  elseif what == 2
722158906cfSBram Moolenaar    res = "two"
723a259d8d3SBram Moolenaar  else
724158906cfSBram Moolenaar    res = "three"
725a259d8d3SBram Moolenaar  endif
726158906cfSBram Moolenaar  return res
727a259d8d3SBram Moolenaarenddef
728a259d8d3SBram Moolenaar
729158906cfSBram Moolenaardef Test_if_elseif_else()
730158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
731158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
732158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
7330f18b6d1SBram Moolenaarenddef
7340f18b6d1SBram Moolenaar
735*6d69bf60SBram Moolenaarlet g:bool_true = v:true
736*6d69bf60SBram Moolenaarlet g:bool_false = v:false
737*6d69bf60SBram Moolenaar
738*6d69bf60SBram Moolenaardef Test_if_const_expr()
739*6d69bf60SBram Moolenaar  let res = false
740*6d69bf60SBram Moolenaar  if true ? true : false
741*6d69bf60SBram Moolenaar    res = true
742*6d69bf60SBram Moolenaar  endif
743*6d69bf60SBram Moolenaar  assert_equal(true, res)
744*6d69bf60SBram Moolenaar
745*6d69bf60SBram Moolenaar  res = false
746*6d69bf60SBram Moolenaar  if g:bool_true ? true : false
747*6d69bf60SBram Moolenaar    res = true
748*6d69bf60SBram Moolenaar  endif
749*6d69bf60SBram Moolenaar  assert_equal(true, res)
750*6d69bf60SBram Moolenaar
751*6d69bf60SBram Moolenaar  res = false
752*6d69bf60SBram Moolenaar  if true ? g:bool_true : false
753*6d69bf60SBram Moolenaar    res = true
754*6d69bf60SBram Moolenaar  endif
755*6d69bf60SBram Moolenaar  assert_equal(true, res)
756*6d69bf60SBram Moolenaar
757*6d69bf60SBram Moolenaar  res = false
758*6d69bf60SBram Moolenaar  if true ? true : g:bool_false
759*6d69bf60SBram Moolenaar    res = true
760*6d69bf60SBram Moolenaar  endif
761*6d69bf60SBram Moolenaar  assert_equal(true, res)
762*6d69bf60SBram Moolenaar
763*6d69bf60SBram Moolenaar  res = false
764*6d69bf60SBram Moolenaar  if true ? false : true
765*6d69bf60SBram Moolenaar    res = true
766*6d69bf60SBram Moolenaar  endif
767*6d69bf60SBram Moolenaar  assert_equal(false, res)
768*6d69bf60SBram Moolenaar
769*6d69bf60SBram Moolenaar  res = false
770*6d69bf60SBram Moolenaar  if false ? false : true
771*6d69bf60SBram Moolenaar    res = true
772*6d69bf60SBram Moolenaar  endif
773*6d69bf60SBram Moolenaar  assert_equal(true, res)
774*6d69bf60SBram Moolenaar
775*6d69bf60SBram Moolenaar  res = false
776*6d69bf60SBram Moolenaar  if false ? true : false
777*6d69bf60SBram Moolenaar    res = true
778*6d69bf60SBram Moolenaar  endif
779*6d69bf60SBram Moolenaar  assert_equal(false, res)
780*6d69bf60SBram Moolenaar
781*6d69bf60SBram Moolenaar  res = false
782*6d69bf60SBram Moolenaar  if true && true
783*6d69bf60SBram Moolenaar    res = true
784*6d69bf60SBram Moolenaar  endif
785*6d69bf60SBram Moolenaar  assert_equal(true, res)
786*6d69bf60SBram Moolenaar
787*6d69bf60SBram Moolenaar  res = false
788*6d69bf60SBram Moolenaar  if true && false
789*6d69bf60SBram Moolenaar    res = true
790*6d69bf60SBram Moolenaar  endif
791*6d69bf60SBram Moolenaar  assert_equal(false, res)
792*6d69bf60SBram Moolenaar
793*6d69bf60SBram Moolenaar  res = false
794*6d69bf60SBram Moolenaar  if g:bool_true && false
795*6d69bf60SBram Moolenaar    res = true
796*6d69bf60SBram Moolenaar  endif
797*6d69bf60SBram Moolenaar  assert_equal(false, res)
798*6d69bf60SBram Moolenaar
799*6d69bf60SBram Moolenaar  res = false
800*6d69bf60SBram Moolenaar  if true && g:bool_false
801*6d69bf60SBram Moolenaar    res = true
802*6d69bf60SBram Moolenaar  endif
803*6d69bf60SBram Moolenaar  assert_equal(false, res)
804*6d69bf60SBram Moolenaar
805*6d69bf60SBram Moolenaar  res = false
806*6d69bf60SBram Moolenaar  if false && false
807*6d69bf60SBram Moolenaar    res = true
808*6d69bf60SBram Moolenaar  endif
809*6d69bf60SBram Moolenaar  assert_equal(false, res)
810*6d69bf60SBram Moolenaar
811*6d69bf60SBram Moolenaar  res = false
812*6d69bf60SBram Moolenaar  if true || false
813*6d69bf60SBram Moolenaar    res = true
814*6d69bf60SBram Moolenaar  endif
815*6d69bf60SBram Moolenaar  assert_equal(true, res)
816*6d69bf60SBram Moolenaar
817*6d69bf60SBram Moolenaar  res = false
818*6d69bf60SBram Moolenaar  if g:bool_true || false
819*6d69bf60SBram Moolenaar    res = true
820*6d69bf60SBram Moolenaar  endif
821*6d69bf60SBram Moolenaar  assert_equal(true, res)
822*6d69bf60SBram Moolenaar
823*6d69bf60SBram Moolenaar  res = false
824*6d69bf60SBram Moolenaar  if true || g:bool_false
825*6d69bf60SBram Moolenaar    res = true
826*6d69bf60SBram Moolenaar  endif
827*6d69bf60SBram Moolenaar  assert_equal(true, res)
828*6d69bf60SBram Moolenaar
829*6d69bf60SBram Moolenaar  res = false
830*6d69bf60SBram Moolenaar  if false || false
831*6d69bf60SBram Moolenaar    res = true
832*6d69bf60SBram Moolenaar  endif
833*6d69bf60SBram Moolenaar  assert_equal(false, res)
834*6d69bf60SBram Moolenaar
835*6d69bf60SBram Moolenaarenddef
836*6d69bf60SBram Moolenaar
83763ce4849SBram Moolenaardef Test_delfunc()
83863ce4849SBram Moolenaar  let lines =<< trim END
83963ce4849SBram Moolenaar    vim9script
84063ce4849SBram Moolenaar    def GoneSoon()
84163ce4849SBram Moolenaar      echo 'hello'
84263ce4849SBram Moolenaar    enddef
84363ce4849SBram Moolenaar
84463ce4849SBram Moolenaar    def CallGoneSoon()
84563ce4849SBram Moolenaar      GoneSoon()
84663ce4849SBram Moolenaar    enddef
84763ce4849SBram Moolenaar
84863ce4849SBram Moolenaar    delfunc GoneSoon
84963ce4849SBram Moolenaar    CallGoneSoon()
85063ce4849SBram Moolenaar  END
85163ce4849SBram Moolenaar  writefile(lines, 'XToDelFunc')
85263ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
85363ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
85463ce4849SBram Moolenaar
85563ce4849SBram Moolenaar  delete('XToDelFunc')
85663ce4849SBram Moolenaarenddef
85763ce4849SBram Moolenaar
8585b1c8fe3SBram Moolenaardef Test_substitute_cmd()
8595b1c8fe3SBram Moolenaar  new
8605b1c8fe3SBram Moolenaar  setline(1, 'something')
8615b1c8fe3SBram Moolenaar  :substitute(some(other(
8625b1c8fe3SBram Moolenaar  assert_equal('otherthing', getline(1))
86383f37b91SBram Moolenaar  bwipe!
86483f37b91SBram Moolenaar
86583f37b91SBram Moolenaar  " also when the context is Vim9 script
86683f37b91SBram Moolenaar  let lines =<< trim END
86783f37b91SBram Moolenaar    vim9script
86883f37b91SBram Moolenaar    new
86983f37b91SBram Moolenaar    setline(1, 'something')
87083f37b91SBram Moolenaar    :substitute(some(other(
87183f37b91SBram Moolenaar    assert_equal('otherthing', getline(1))
87283f37b91SBram Moolenaar    bwipe!
87383f37b91SBram Moolenaar  END
87483f37b91SBram Moolenaar  writefile(lines, 'Xvim9lines')
87583f37b91SBram Moolenaar  source Xvim9lines
87683f37b91SBram Moolenaar
87783f37b91SBram Moolenaar  delete('Xvim9lines')
8785b1c8fe3SBram Moolenaarenddef
8795b1c8fe3SBram Moolenaar
880ad39c094SBram Moolenaardef Test_execute_cmd()
881ad39c094SBram Moolenaar  new
882ad39c094SBram Moolenaar  setline(1, 'default')
883ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
884ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
885ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
886ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
887ad39c094SBram Moolenaar  execute cmd1 cmd2
888ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
889ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
890ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
891ad39c094SBram Moolenaar  let cmd_first = 'call '
892ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
893ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
894ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
895ad39c094SBram Moolenaar  bwipe!
896ad39c094SBram Moolenaarenddef
897ad39c094SBram Moolenaar
898ad39c094SBram Moolenaardef Test_echo_cmd()
899ad39c094SBram Moolenaar  echo 'something'
900ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
901ad39c094SBram Moolenaar
902ad39c094SBram Moolenaar  let str1 = 'some'
903ad39c094SBram Moolenaar  let str2 = 'more'
904ad39c094SBram Moolenaar  echo str1 str2
905ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
906ad39c094SBram Moolenaarenddef
907ad39c094SBram Moolenaar
90841fe0617SBram Moolenaardef Test_for_outside_of_function()
90941fe0617SBram Moolenaar  let lines =<< trim END
91041fe0617SBram Moolenaar    vim9script
91141fe0617SBram Moolenaar    new
91241fe0617SBram Moolenaar    for var in range(0, 3)
91341fe0617SBram Moolenaar      append(line('$'), var)
91441fe0617SBram Moolenaar    endfor
91541fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
91641fe0617SBram Moolenaar    bwipe!
91741fe0617SBram Moolenaar  END
91841fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
91941fe0617SBram Moolenaar  source Xvim9for.vim
92041fe0617SBram Moolenaar  delete('Xvim9for.vim')
92141fe0617SBram Moolenaarenddef
9228a7d6542SBram Moolenaar
9238a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
924