18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language.
28a7d6542SBram Moolenaar
3673660abSBram Moolenaarsource check.vim
4673660abSBram Moolenaar
58a7d6542SBram Moolenaar" Check that "lines" inside ":def" results in an "error" message.
68a7d6542SBram Moolenaarfunc CheckDefFailure(lines, error)
7978d170bSBram Moolenaar  call writefile(['def Func()'] + a:lines + ['enddef'], 'Xdef')
88a7d6542SBram Moolenaar  call assert_fails('so Xdef', a:error, a:lines)
98a7d6542SBram Moolenaar  call delete('Xdef')
108a7d6542SBram Moolenaarendfunc
118a7d6542SBram Moolenaar
128a7d6542SBram Moolenaarfunc CheckScriptFailure(lines, error)
138a7d6542SBram Moolenaar  call writefile(a:lines, 'Xdef')
148a7d6542SBram Moolenaar  call assert_fails('so Xdef', a:error, a:lines)
158a7d6542SBram Moolenaar  call delete('Xdef')
168a7d6542SBram Moolenaarendfunc
178a7d6542SBram Moolenaar
188a7d6542SBram Moolenaardef Test_syntax()
198a7d6542SBram Moolenaar  let var = 234
208a7d6542SBram Moolenaar  let other: list<string> = ['asdf']
218a7d6542SBram Moolenaarenddef
228a7d6542SBram Moolenaar
238a7d6542SBram Moolenaarfunc Test_def_basic()
248a7d6542SBram Moolenaar  def SomeFunc(): string
258a7d6542SBram Moolenaar    return 'yes'
268a7d6542SBram Moolenaar  enddef
278a7d6542SBram Moolenaar  call assert_equal('yes', SomeFunc())
288a7d6542SBram Moolenaarendfunc
298a7d6542SBram Moolenaar
306e587dcbSBram Moolenaarlet s:appendToMe = 'xxx'
316e587dcbSBram Moolenaarlet s:addToMe = 111
32401d9ffbSBram Moolenaarlet g:existing = 'yes'
336e587dcbSBram Moolenaar
348a7d6542SBram Moolenaardef Test_assignment()
358a7d6542SBram Moolenaar  let bool1: bool = true
368a7d6542SBram Moolenaar  assert_equal(v:true, bool1)
378a7d6542SBram Moolenaar  let bool2: bool = false
388a7d6542SBram Moolenaar  assert_equal(v:false, bool2)
398a7d6542SBram Moolenaar
408a7d6542SBram Moolenaar  let list1: list<string> = ['sdf', 'asdf']
418a7d6542SBram Moolenaar  let list2: list<number> = [1, 2, 3]
428a7d6542SBram Moolenaar
438a7d6542SBram Moolenaar  " TODO: does not work yet
448a7d6542SBram Moolenaar  " let listS: list<string> = []
458a7d6542SBram Moolenaar  " let listN: list<number> = []
468a7d6542SBram Moolenaar
478a7d6542SBram Moolenaar  let dict1: dict<string> = #{key: 'value'}
488a7d6542SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
49b283a8a6SBram Moolenaar
50401d9ffbSBram Moolenaar  g:newvar = 'new'
51401d9ffbSBram Moolenaar  assert_equal('new', g:newvar)
52401d9ffbSBram Moolenaar
53401d9ffbSBram Moolenaar  assert_equal('yes', g:existing)
54401d9ffbSBram Moolenaar  g:existing = 'no'
55401d9ffbSBram Moolenaar  assert_equal('no', g:existing)
56401d9ffbSBram Moolenaar
57b283a8a6SBram Moolenaar  v:char = 'abc'
586e587dcbSBram Moolenaar  assert_equal('abc', v:char)
59b283a8a6SBram Moolenaar
60b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
616e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
62b283a8a6SBram Moolenaar  $ENVVAR = ''
636e587dcbSBram Moolenaar
64fd1823e0SBram Moolenaar  s:appendToMe ..= 'yyy'
65fd1823e0SBram Moolenaar  assert_equal('xxxyyy', s:appendToMe)
66fd1823e0SBram Moolenaar  s:addToMe += 222
67fd1823e0SBram Moolenaar  assert_equal(333, s:addToMe)
680bbf722aSBram Moolenaar  s:newVar = 'new'
690bbf722aSBram Moolenaar  assert_equal('new', s:newVar)
708a7d6542SBram Moolenaarenddef
718a7d6542SBram Moolenaar
728a7d6542SBram Moolenaarfunc Test_assignment_failure()
738a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
748a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
758a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
768a7d6542SBram Moolenaar
778a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
788a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
798a7d6542SBram Moolenaar
808a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
818a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
828a7d6542SBram Moolenaar
838a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
848a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
858a7d6542SBram Moolenaar
868a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
878a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
888a7d6542SBram Moolenaarendfunc
898a7d6542SBram Moolenaar
908a7d6542SBram Moolenaarfunc Test_const()
918a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
928a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
938a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
948a7d6542SBram Moolenaarendfunc
958a7d6542SBram Moolenaar
968a7d6542SBram Moolenaardef Test_block()
978a7d6542SBram Moolenaar  let outer = 1
988a7d6542SBram Moolenaar  {
998a7d6542SBram Moolenaar    let inner = 2
1008a7d6542SBram Moolenaar    assert_equal(1, outer)
1018a7d6542SBram Moolenaar    assert_equal(2, inner)
1028a7d6542SBram Moolenaar  }
1038a7d6542SBram Moolenaar  assert_equal(1, outer)
1048a7d6542SBram Moolenaarenddef
1058a7d6542SBram Moolenaar
1068a7d6542SBram Moolenaarfunc Test_block_failure()
1078a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
1088a7d6542SBram Moolenaarendfunc
1098a7d6542SBram Moolenaar
1108a7d6542SBram Moolenaardef ReturnString(): string
1118a7d6542SBram Moolenaar  return 'string'
1128a7d6542SBram Moolenaarenddef
1138a7d6542SBram Moolenaar
1148a7d6542SBram Moolenaardef ReturnNumber(): number
1158a7d6542SBram Moolenaar  return 123
1168a7d6542SBram Moolenaarenddef
1178a7d6542SBram Moolenaar
1188a7d6542SBram Moolenaardef Test_return_string()
1198a7d6542SBram Moolenaar  assert_equal('string', ReturnString())
1208a7d6542SBram Moolenaar  assert_equal(123, ReturnNumber())
1218a7d6542SBram Moolenaarenddef
1228a7d6542SBram Moolenaar
1238a7d6542SBram Moolenaarfunc Increment()
1248a7d6542SBram Moolenaar  let g:counter += 1
1258a7d6542SBram Moolenaarendfunc
1268a7d6542SBram Moolenaar
1278a7d6542SBram Moolenaardef Test_call_ufunc_count()
1288a7d6542SBram Moolenaar  g:counter = 1
1298a7d6542SBram Moolenaar  Increment()
1308a7d6542SBram Moolenaar  Increment()
1318a7d6542SBram Moolenaar  Increment()
1328a7d6542SBram Moolenaar  " works with and without :call
1338a7d6542SBram Moolenaar  assert_equal(4, g:counter)
134b283a8a6SBram Moolenaar  call assert_equal(4, g:counter)
1358a7d6542SBram Moolenaar  unlet g:counter
1368a7d6542SBram Moolenaarenddef
1378a7d6542SBram Moolenaar
1388a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string
1398a7d6542SBram Moolenaar  let res = arg
1408a7d6542SBram Moolenaar  for s in rest
1418a7d6542SBram Moolenaar    res ..= ',' .. s
1428a7d6542SBram Moolenaar  endfor
1438a7d6542SBram Moolenaar  return res
1448a7d6542SBram Moolenaarenddef
1458a7d6542SBram Moolenaar
1468a7d6542SBram Moolenaardef Test_call_varargs()
1478a7d6542SBram Moolenaar  assert_equal('one', MyVarargs('one'))
1488a7d6542SBram Moolenaar  assert_equal('one,two', MyVarargs('one', 'two'))
1498a7d6542SBram Moolenaar  assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
1508a7d6542SBram Moolenaarenddef
1518a7d6542SBram Moolenaar
152170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string
153170fcfcfSBram Moolenaar  return name
154170fcfcfSBram Moolenaarenddef
155170fcfcfSBram Moolenaar
156170fcfcfSBram Moolenaardef Test_call_default_args()
157170fcfcfSBram Moolenaar  assert_equal('string', MyDefaultArgs())
158170fcfcfSBram Moolenaar  assert_equal('one', MyDefaultArgs('one'))
159170fcfcfSBram Moolenaar  assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
160170fcfcfSBram Moolenaarenddef
161170fcfcfSBram Moolenaar
162170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func()
163170fcfcfSBram Moolenaar  call assert_equal('string', MyDefaultArgs())
164170fcfcfSBram Moolenaar  call assert_equal('one', MyDefaultArgs('one'))
165170fcfcfSBram Moolenaar  call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
166170fcfcfSBram Moolenaarendfunc
167170fcfcfSBram Moolenaar
168170fcfcfSBram Moolenaar" Default arg and varargs
169170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
170170fcfcfSBram Moolenaar  let res = one .. ',' .. two
171170fcfcfSBram Moolenaar  for s in rest
172170fcfcfSBram Moolenaar    res ..= ',' .. s
173170fcfcfSBram Moolenaar  endfor
174170fcfcfSBram Moolenaar  return res
175170fcfcfSBram Moolenaarenddef
176170fcfcfSBram Moolenaar
177170fcfcfSBram Moolenaardef Test_call_def_varargs()
178170fcfcfSBram Moolenaar  call assert_fails('call MyDefVarargs()', 'E119:')
179170fcfcfSBram Moolenaar  assert_equal('one,foo', MyDefVarargs('one'))
180170fcfcfSBram Moolenaar  assert_equal('one,two', MyDefVarargs('one', 'two'))
181170fcfcfSBram Moolenaar  assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
182170fcfcfSBram Moolenaarenddef
183170fcfcfSBram Moolenaar
184170fcfcfSBram Moolenaar
18526e117e9SBram Moolenaar"def Test_call_func_defined_later()
18626e117e9SBram Moolenaar"  call assert_equal('one', DefineLater('one'))
18726e117e9SBram Moolenaar"  call assert_fails('call NotDefined("one")', 'E99:')
18826e117e9SBram Moolenaar"enddef
18926e117e9SBram Moolenaar
19026e117e9SBram Moolenaarfunc DefineLater(arg)
19126e117e9SBram Moolenaar  return a:arg
19226e117e9SBram Moolenaarendfunc
19326e117e9SBram Moolenaar
1948a7d6542SBram Moolenaardef Test_return_type_wrong()
195978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
196978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
197978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
198978d170bSBram Moolenaar  CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
1998a7d6542SBram Moolenaarenddef
2008a7d6542SBram Moolenaar
201bfe12043SBram Moolenaardef Test_arg_type_wrong()
202bfe12043SBram Moolenaar  CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
203bfe12043SBram Moolenaarenddef
204bfe12043SBram Moolenaar
2058a7d6542SBram Moolenaardef Test_try_catch()
2068a7d6542SBram Moolenaar  let l = []
2078a7d6542SBram Moolenaar  try
2088a7d6542SBram Moolenaar    add(l, '1')
2098a7d6542SBram Moolenaar    throw 'wrong'
2108a7d6542SBram Moolenaar    add(l, '2')
2118a7d6542SBram Moolenaar  catch
2128a7d6542SBram Moolenaar    add(l, v:exception)
2138a7d6542SBram Moolenaar  finally
2148a7d6542SBram Moolenaar    add(l, '3')
2158a7d6542SBram Moolenaar  endtry
2168a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
2178a7d6542SBram Moolenaarenddef
2188a7d6542SBram Moolenaar
219257cc5eeSBram Moolenaardef ThrowFromDef()
220257cc5eeSBram Moolenaar  throw 'getout'
221257cc5eeSBram Moolenaarenddef
222257cc5eeSBram Moolenaar
223257cc5eeSBram Moolenaarfunc CatchInFunc()
224257cc5eeSBram Moolenaar  try
225257cc5eeSBram Moolenaar    call ThrowFromDef()
226257cc5eeSBram Moolenaar  catch
227257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
228257cc5eeSBram Moolenaar  endtry
229257cc5eeSBram Moolenaarendfunc
230257cc5eeSBram Moolenaar
231257cc5eeSBram Moolenaardef CatchInDef()
232257cc5eeSBram Moolenaar  try
233257cc5eeSBram Moolenaar    ThrowFromDef()
234257cc5eeSBram Moolenaar  catch
235257cc5eeSBram Moolenaar    g:thrown_def = v:exception
236257cc5eeSBram Moolenaar  endtry
237257cc5eeSBram Moolenaarenddef
238257cc5eeSBram Moolenaar
239*f575adffSBram Moolenaardef ReturnFinally(): string
240*f575adffSBram Moolenaar  try
241*f575adffSBram Moolenaar    return 'intry'
242*f575adffSBram Moolenaar  finally
243*f575adffSBram Moolenaar    g:in_finally = 'finally'
244*f575adffSBram Moolenaar  endtry
245*f575adffSBram Moolenaar  return 'end'
246*f575adffSBram Moolenaarenddef
247*f575adffSBram Moolenaar
248257cc5eeSBram Moolenaardef Test_try_catch_nested()
249257cc5eeSBram Moolenaar  CatchInFunc()
250257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
251257cc5eeSBram Moolenaar
252257cc5eeSBram Moolenaar  CatchInDef()
253257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
254*f575adffSBram Moolenaar
255*f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
256*f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
257*f575adffSBram Moolenaarenddef
258*f575adffSBram Moolenaar
259*f575adffSBram Moolenaardef Test_try_catch_match()
260*f575adffSBram Moolenaar  let seq = 'a'
261*f575adffSBram Moolenaar  try
262*f575adffSBram Moolenaar    throw 'something'
263*f575adffSBram Moolenaar  catch /nothing/
264*f575adffSBram Moolenaar    seq ..= 'x'
265*f575adffSBram Moolenaar  catch /some/
266*f575adffSBram Moolenaar    seq ..= 'b'
267*f575adffSBram Moolenaar  catch /asdf/
268*f575adffSBram Moolenaar    seq ..= 'x'
269*f575adffSBram Moolenaar  finally
270*f575adffSBram Moolenaar    seq ..= 'c'
271*f575adffSBram Moolenaar  endtry
272*f575adffSBram Moolenaar  assert_equal('abc', seq)
273257cc5eeSBram Moolenaarenddef
274257cc5eeSBram Moolenaar
2758a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
2768a7d6542SBram Moolenaar  vim9script
2778a7d6542SBram Moolenaar  let name: string = 'bob'
2788a7d6542SBram Moolenaar  def Concat(arg: string): string
2798a7d6542SBram Moolenaar    return name .. arg
2808a7d6542SBram Moolenaar  enddef
2818a7d6542SBram Moolenaar  let g:result = Concat('bie')
2828a7d6542SBram Moolenaar  let g:localname = name
2838a7d6542SBram Moolenaar
2848a7d6542SBram Moolenaar  export const CONST = 1234
2858a7d6542SBram Moolenaar  export let exported = 9876
2866e587dcbSBram Moolenaar  export let exp_name = 'John'
2878a7d6542SBram Moolenaar  export def Exported(): string
2888a7d6542SBram Moolenaar    return 'Exported'
2898a7d6542SBram Moolenaar  enddef
2908a7d6542SBram MoolenaarEND
2918a7d6542SBram Moolenaar
2928a7d6542SBram Moolenaardef Test_vim9script()
2938a7d6542SBram Moolenaar  let import_script_lines =<< trim END
2948a7d6542SBram Moolenaar    vim9script
2958a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
2968a7d6542SBram Moolenaar    g:imported = exported
2976e587dcbSBram Moolenaar    exported += 3
2986e587dcbSBram Moolenaar    g:imported_added = exported
2998a7d6542SBram Moolenaar    g:imported_func = Exported()
3006e587dcbSBram Moolenaar
3016e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
3026e587dcbSBram Moolenaar    g:imported_name = exp_name
3036e587dcbSBram Moolenaar    exp_name ..= ' Doe'
3046e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
3058a7d6542SBram Moolenaar  END
3068a7d6542SBram Moolenaar
3078a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
3088a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
3098a7d6542SBram Moolenaar
3108a7d6542SBram Moolenaar  source Ximport.vim
3118a7d6542SBram Moolenaar
3128a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
3138a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
3148a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
3156e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
3168a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
3176e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
3186e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
3198a7d6542SBram Moolenaar  assert_false(exists('g:name'))
3208a7d6542SBram Moolenaar
3218a7d6542SBram Moolenaar  unlet g:result
3228a7d6542SBram Moolenaar  unlet g:localname
3238a7d6542SBram Moolenaar  unlet g:imported
3246e587dcbSBram Moolenaar  unlet g:imported_added
3258a7d6542SBram Moolenaar  unlet g:imported_func
3266e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
3278a7d6542SBram Moolenaar  delete('Ximport.vim')
3288a7d6542SBram Moolenaar  delete('Xexport.vim')
3298a7d6542SBram Moolenaar
3308a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
3318a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
3328a7d6542SBram Moolenaarenddef
3338a7d6542SBram Moolenaar
3348a7d6542SBram Moolenaardef Test_vim9script_call()
3358a7d6542SBram Moolenaar  let lines =<< trim END
3368a7d6542SBram Moolenaar    vim9script
3378a7d6542SBram Moolenaar    let var = ''
3388a7d6542SBram Moolenaar    def MyFunc(arg: string)
3398a7d6542SBram Moolenaar       var = arg
3408a7d6542SBram Moolenaar    enddef
3418a7d6542SBram Moolenaar    MyFunc('foobar')
3428a7d6542SBram Moolenaar    assert_equal('foobar', var)
3438a7d6542SBram Moolenaar
3448a7d6542SBram Moolenaar    let str = 'barfoo'
3458a7d6542SBram Moolenaar    str->MyFunc()
3468a7d6542SBram Moolenaar    assert_equal('barfoo', var)
3478a7d6542SBram Moolenaar
3488a7d6542SBram Moolenaar    let g:value = 'value'
3498a7d6542SBram Moolenaar    g:value->MyFunc()
3508a7d6542SBram Moolenaar    assert_equal('value', var)
3518a7d6542SBram Moolenaar
3528a7d6542SBram Moolenaar    let listvar = []
3538a7d6542SBram Moolenaar    def ListFunc(arg: list<number>)
3548a7d6542SBram Moolenaar       listvar = arg
3558a7d6542SBram Moolenaar    enddef
3568a7d6542SBram Moolenaar    [1, 2, 3]->ListFunc()
3578a7d6542SBram Moolenaar    assert_equal([1, 2, 3], listvar)
3588a7d6542SBram Moolenaar
3598a7d6542SBram Moolenaar    let dictvar = {}
3608a7d6542SBram Moolenaar    def DictFunc(arg: dict<number>)
3618a7d6542SBram Moolenaar       dictvar = arg
3628a7d6542SBram Moolenaar    enddef
3638a7d6542SBram Moolenaar    {'a': 1, 'b': 2}->DictFunc()
3648a7d6542SBram Moolenaar    assert_equal(#{a: 1, b: 2}, dictvar)
3658a7d6542SBram Moolenaar    #{a: 3, b: 4}->DictFunc()
3668a7d6542SBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
3678a7d6542SBram Moolenaar  END
3688a7d6542SBram Moolenaar  writefile(lines, 'Xcall.vim')
3698a7d6542SBram Moolenaar  source Xcall.vim
3708a7d6542SBram Moolenaar  delete('Xcall.vim')
3718a7d6542SBram Moolenaarenddef
3728a7d6542SBram Moolenaar
3738a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl()
3748a7d6542SBram Moolenaar  let lines =<< trim END
3758a7d6542SBram Moolenaar    vim9script
3768a7d6542SBram Moolenaar    let var = ''
3778a7d6542SBram Moolenaar    def MyFunc(arg: string)
3788a7d6542SBram Moolenaar       let var = 123
3798a7d6542SBram Moolenaar    enddef
3808a7d6542SBram Moolenaar  END
3818a7d6542SBram Moolenaar  writefile(lines, 'Xcall_decl.vim')
3828a7d6542SBram Moolenaar  assert_fails('source Xcall_decl.vim', 'E1054:')
3838a7d6542SBram Moolenaar  delete('Xcall_decl.vim')
3848a7d6542SBram Moolenaarenddef
3858a7d6542SBram Moolenaar
3868a7d6542SBram Moolenaardef Test_vim9script_call_fail_const()
3878a7d6542SBram Moolenaar  let lines =<< trim END
3888a7d6542SBram Moolenaar    vim9script
3898a7d6542SBram Moolenaar    const var = ''
3908a7d6542SBram Moolenaar    def MyFunc(arg: string)
3918a7d6542SBram Moolenaar       var = 'asdf'
3928a7d6542SBram Moolenaar    enddef
3938a7d6542SBram Moolenaar  END
3948a7d6542SBram Moolenaar  writefile(lines, 'Xcall_const.vim')
3958a7d6542SBram Moolenaar  assert_fails('source Xcall_const.vim', 'E46:')
3968a7d6542SBram Moolenaar  delete('Xcall_const.vim')
3978a7d6542SBram Moolenaarenddef
3988a7d6542SBram Moolenaar
3998a7d6542SBram Moolenaardef Test_vim9script_reload()
4008a7d6542SBram Moolenaar  let lines =<< trim END
4018a7d6542SBram Moolenaar    vim9script
4028a7d6542SBram Moolenaar    const var = ''
4038a7d6542SBram Moolenaar    let valone = 1234
4048a7d6542SBram Moolenaar    def MyFunc(arg: string)
4058a7d6542SBram Moolenaar       valone = 5678
4068a7d6542SBram Moolenaar    enddef
4078a7d6542SBram Moolenaar  END
4088a7d6542SBram Moolenaar  let morelines =<< trim END
4098a7d6542SBram Moolenaar    let valtwo = 222
4108a7d6542SBram Moolenaar    export def GetValtwo(): number
4118a7d6542SBram Moolenaar      return valtwo
4128a7d6542SBram Moolenaar    enddef
4138a7d6542SBram Moolenaar  END
4148a7d6542SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
4158a7d6542SBram Moolenaar  source Xreload.vim
4168a7d6542SBram Moolenaar  source Xreload.vim
4178a7d6542SBram Moolenaar  source Xreload.vim
4188a7d6542SBram Moolenaar
4198a7d6542SBram Moolenaar  let testlines =<< trim END
4208a7d6542SBram Moolenaar    vim9script
4218a7d6542SBram Moolenaar    def TheFunc()
4228a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
4238a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
4248a7d6542SBram Moolenaar    enddef
4258a7d6542SBram Moolenaar    TheFunc()
4268a7d6542SBram Moolenaar  END
4278a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
4288a7d6542SBram Moolenaar  source Ximport.vim
4298a7d6542SBram Moolenaar
4308a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
4318a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
4328a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
4338a7d6542SBram Moolenaar  source Xreload.vim
4348a7d6542SBram Moolenaar  source Ximport.vim
4358a7d6542SBram Moolenaar
4368a7d6542SBram Moolenaar  " cannot declare a var twice
4378a7d6542SBram Moolenaar  lines =<< trim END
4388a7d6542SBram Moolenaar    vim9script
4398a7d6542SBram Moolenaar    let valone = 1234
4408a7d6542SBram Moolenaar    let valone = 5678
4418a7d6542SBram Moolenaar  END
4428a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
4438a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
4448a7d6542SBram Moolenaar
4458a7d6542SBram Moolenaar  delete('Xreload.vim')
4468a7d6542SBram Moolenaar  delete('Ximport.vim')
4478a7d6542SBram Moolenaarenddef
4488a7d6542SBram Moolenaar
4498a7d6542SBram Moolenaardef Test_import_absolute()
4508a7d6542SBram Moolenaar  let import_lines = [
4518a7d6542SBram Moolenaar        \ 'vim9script',
4528a7d6542SBram Moolenaar        \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
453b283a8a6SBram Moolenaar        \ 'def UseExported()',
4548a7d6542SBram Moolenaar        \ '  g:imported_abs = exported',
4554e12a5dfSBram Moolenaar        \ '  exported = 8888',
4564e12a5dfSBram Moolenaar        \ '  g:imported_after = exported',
457b283a8a6SBram Moolenaar        \ 'enddef',
458b283a8a6SBram Moolenaar        \ 'UseExported()',
4594e12a5dfSBram Moolenaar        \ 'g:import_disassembled = execute("disass UseExported")',
4608a7d6542SBram Moolenaar        \ ]
4618a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
4628a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
4638a7d6542SBram Moolenaar
4648a7d6542SBram Moolenaar  source Ximport_abs.vim
4658a7d6542SBram Moolenaar
4668a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
4674e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
468b283a8a6SBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*'
469b283a8a6SBram Moolenaar        \ .. 'g:imported_abs = exported.*'
470b283a8a6SBram Moolenaar        \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
4714e12a5dfSBram Moolenaar        \ .. '1 STOREG g:imported_abs.*'
4724e12a5dfSBram Moolenaar        \ .. 'exported = 8888.*'
4734e12a5dfSBram Moolenaar        \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
4744e12a5dfSBram Moolenaar        \ .. 'g:imported_after = exported.*'
4754e12a5dfSBram Moolenaar        \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
4764e12a5dfSBram Moolenaar        \ .. '5 STOREG g:imported_after.*'
4774e12a5dfSBram Moolenaar        \, g:import_disassembled)
4788a7d6542SBram Moolenaar  unlet g:imported_abs
4794e12a5dfSBram Moolenaar  unlet g:import_disassembled
4808a7d6542SBram Moolenaar
4818a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
4828a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
4838a7d6542SBram Moolenaarenddef
4848a7d6542SBram Moolenaar
4858a7d6542SBram Moolenaardef Test_import_rtp()
4868a7d6542SBram Moolenaar  let import_lines = [
4878a7d6542SBram Moolenaar        \ 'vim9script',
4888a7d6542SBram Moolenaar        \ 'import exported from "Xexport_rtp.vim"',
4898a7d6542SBram Moolenaar        \ 'g:imported_rtp = exported',
4908a7d6542SBram Moolenaar        \ ]
4918a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
4928a7d6542SBram Moolenaar  mkdir('import')
4938a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
4948a7d6542SBram Moolenaar
4958a7d6542SBram Moolenaar  let save_rtp = &rtp
4968a7d6542SBram Moolenaar  &rtp = getcwd()
4978a7d6542SBram Moolenaar  source Ximport_rtp.vim
4988a7d6542SBram Moolenaar  &rtp = save_rtp
4998a7d6542SBram Moolenaar
5008a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
5018a7d6542SBram Moolenaar  unlet g:imported_rtp
5028a7d6542SBram Moolenaar
5038a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
5048a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
5058a7d6542SBram Moolenaar  delete('import', 'd')
5068a7d6542SBram Moolenaarenddef
5078a7d6542SBram Moolenaar
5088a7d6542SBram Moolenaardef Test_fixed_size_list()
5098a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
5108a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
5118a7d6542SBram Moolenaar  l->remove(0)
5128a7d6542SBram Moolenaar  l->add(5)
5138a7d6542SBram Moolenaar  l->insert(99, 1)
5140f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
5158a7d6542SBram Moolenaarenddef
5168a7d6542SBram Moolenaar
517673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not
518673660abSBram Moolenaar" recognized.
519673660abSBram Moolenaarfunc Test_function_python()
520673660abSBram Moolenaar  CheckFeature python3
521673660abSBram Moolenaar  let py = 'python3'
522673660abSBram Moolenaar  execute py "<< EOF"
523673660abSBram Moolenaardef do_something():
524673660abSBram Moolenaar  return 1
525673660abSBram MoolenaarEOF
526673660abSBram Moolenaarendfunc
527673660abSBram Moolenaar
528158906cfSBram Moolenaardef IfElse(what: number): string
529158906cfSBram Moolenaar  let res = ''
530158906cfSBram Moolenaar  if what == 1
531158906cfSBram Moolenaar    res = "one"
532158906cfSBram Moolenaar  elseif what == 2
533158906cfSBram Moolenaar    res = "two"
534a259d8d3SBram Moolenaar  else
535158906cfSBram Moolenaar    res = "three"
536a259d8d3SBram Moolenaar  endif
537158906cfSBram Moolenaar  return res
538a259d8d3SBram Moolenaarenddef
539a259d8d3SBram Moolenaar
540158906cfSBram Moolenaardef Test_if_elseif_else()
541158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
542158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
543158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
5440f18b6d1SBram Moolenaarenddef
5450f18b6d1SBram Moolenaar
54663ce4849SBram Moolenaardef Test_delfunc()
54763ce4849SBram Moolenaar  let lines =<< trim END
54863ce4849SBram Moolenaar    vim9script
54963ce4849SBram Moolenaar    def GoneSoon()
55063ce4849SBram Moolenaar      echo 'hello'
55163ce4849SBram Moolenaar    enddef
55263ce4849SBram Moolenaar
55363ce4849SBram Moolenaar    def CallGoneSoon()
55463ce4849SBram Moolenaar      GoneSoon()
55563ce4849SBram Moolenaar    enddef
55663ce4849SBram Moolenaar
55763ce4849SBram Moolenaar    delfunc GoneSoon
55863ce4849SBram Moolenaar    CallGoneSoon()
55963ce4849SBram Moolenaar  END
56063ce4849SBram Moolenaar  writefile(lines, 'XToDelFunc')
56163ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
56263ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
56363ce4849SBram Moolenaar
56463ce4849SBram Moolenaar  delete('XToDelFunc')
56563ce4849SBram Moolenaarenddef
56663ce4849SBram Moolenaar
5678a7d6542SBram Moolenaar
5688a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
569