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
326e587dcbSBram Moolenaar
338a7d6542SBram Moolenaardef Test_assignment()
348a7d6542SBram Moolenaar  let bool1: bool = true
358a7d6542SBram Moolenaar  assert_equal(v:true, bool1)
368a7d6542SBram Moolenaar  let bool2: bool = false
378a7d6542SBram Moolenaar  assert_equal(v:false, bool2)
388a7d6542SBram Moolenaar
398a7d6542SBram Moolenaar  let list1: list<string> = ['sdf', 'asdf']
408a7d6542SBram Moolenaar  let list2: list<number> = [1, 2, 3]
418a7d6542SBram Moolenaar
428a7d6542SBram Moolenaar  " TODO: does not work yet
438a7d6542SBram Moolenaar  " let listS: list<string> = []
448a7d6542SBram Moolenaar  " let listN: list<number> = []
458a7d6542SBram Moolenaar
468a7d6542SBram Moolenaar  let dict1: dict<string> = #{key: 'value'}
478a7d6542SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
48b283a8a6SBram Moolenaar
49b283a8a6SBram Moolenaar  v:char = 'abc'
506e587dcbSBram Moolenaar  assert_equal('abc', v:char)
51b283a8a6SBram Moolenaar
52b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
536e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
54b283a8a6SBram Moolenaar  $ENVVAR = ''
556e587dcbSBram Moolenaar
566e587dcbSBram Moolenaar  appendToMe ..= 'yyy'
576e587dcbSBram Moolenaar  assert_equal('xxxyyy', appendToMe)
586e587dcbSBram Moolenaar  addToMe += 222
596e587dcbSBram Moolenaar  assert_equal(333, addToMe)
608a7d6542SBram Moolenaarenddef
618a7d6542SBram Moolenaar
628a7d6542SBram Moolenaarfunc Test_assignment_failure()
638a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
648a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
658a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
668a7d6542SBram Moolenaar
678a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
688a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
698a7d6542SBram Moolenaar
708a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
718a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
728a7d6542SBram Moolenaar
738a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
748a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
758a7d6542SBram Moolenaar
768a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
778a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
788a7d6542SBram Moolenaarendfunc
798a7d6542SBram Moolenaar
808a7d6542SBram Moolenaarfunc Test_const()
818a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
828a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
838a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
848a7d6542SBram Moolenaarendfunc
858a7d6542SBram Moolenaar
868a7d6542SBram Moolenaardef Test_block()
878a7d6542SBram Moolenaar  let outer = 1
888a7d6542SBram Moolenaar  {
898a7d6542SBram Moolenaar    let inner = 2
908a7d6542SBram Moolenaar    assert_equal(1, outer)
918a7d6542SBram Moolenaar    assert_equal(2, inner)
928a7d6542SBram Moolenaar  }
938a7d6542SBram Moolenaar  assert_equal(1, outer)
948a7d6542SBram Moolenaarenddef
958a7d6542SBram Moolenaar
968a7d6542SBram Moolenaarfunc Test_block_failure()
978a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
988a7d6542SBram Moolenaarendfunc
998a7d6542SBram Moolenaar
1008a7d6542SBram Moolenaardef ReturnString(): string
1018a7d6542SBram Moolenaar  return 'string'
1028a7d6542SBram Moolenaarenddef
1038a7d6542SBram Moolenaar
1048a7d6542SBram Moolenaardef ReturnNumber(): number
1058a7d6542SBram Moolenaar  return 123
1068a7d6542SBram Moolenaarenddef
1078a7d6542SBram Moolenaar
1088a7d6542SBram Moolenaardef Test_return_string()
1098a7d6542SBram Moolenaar  assert_equal('string', ReturnString())
1108a7d6542SBram Moolenaar  assert_equal(123, ReturnNumber())
1118a7d6542SBram Moolenaarenddef
1128a7d6542SBram Moolenaar
1138a7d6542SBram Moolenaarfunc Increment()
1148a7d6542SBram Moolenaar  let g:counter += 1
1158a7d6542SBram Moolenaarendfunc
1168a7d6542SBram Moolenaar
1178a7d6542SBram Moolenaardef Test_call_ufunc_count()
1188a7d6542SBram Moolenaar  g:counter = 1
1198a7d6542SBram Moolenaar  Increment()
1208a7d6542SBram Moolenaar  Increment()
1218a7d6542SBram Moolenaar  Increment()
1228a7d6542SBram Moolenaar  " works with and without :call
1238a7d6542SBram Moolenaar  assert_equal(4, g:counter)
124b283a8a6SBram Moolenaar  call assert_equal(4, g:counter)
1258a7d6542SBram Moolenaar  unlet g:counter
1268a7d6542SBram Moolenaarenddef
1278a7d6542SBram Moolenaar
1288a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string
1298a7d6542SBram Moolenaar  let res = arg
1308a7d6542SBram Moolenaar  for s in rest
1318a7d6542SBram Moolenaar    res ..= ',' .. s
1328a7d6542SBram Moolenaar  endfor
1338a7d6542SBram Moolenaar  return res
1348a7d6542SBram Moolenaarenddef
1358a7d6542SBram Moolenaar
1368a7d6542SBram Moolenaardef Test_call_varargs()
1378a7d6542SBram Moolenaar  assert_equal('one', MyVarargs('one'))
1388a7d6542SBram Moolenaar  assert_equal('one,two', MyVarargs('one', 'two'))
1398a7d6542SBram Moolenaar  assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
1408a7d6542SBram Moolenaarenddef
1418a7d6542SBram Moolenaar
142170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string
143170fcfcfSBram Moolenaar  return name
144170fcfcfSBram Moolenaarenddef
145170fcfcfSBram Moolenaar
146170fcfcfSBram Moolenaardef Test_call_default_args()
147170fcfcfSBram Moolenaar  assert_equal('string', MyDefaultArgs())
148170fcfcfSBram Moolenaar  assert_equal('one', MyDefaultArgs('one'))
149170fcfcfSBram Moolenaar  assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
150170fcfcfSBram Moolenaarenddef
151170fcfcfSBram Moolenaar
152170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func()
153170fcfcfSBram Moolenaar  call assert_equal('string', MyDefaultArgs())
154170fcfcfSBram Moolenaar  call assert_equal('one', MyDefaultArgs('one'))
155170fcfcfSBram Moolenaar  call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
156170fcfcfSBram Moolenaarendfunc
157170fcfcfSBram Moolenaar
158170fcfcfSBram Moolenaar" Default arg and varargs
159170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
160170fcfcfSBram Moolenaar  let res = one .. ',' .. two
161170fcfcfSBram Moolenaar  for s in rest
162170fcfcfSBram Moolenaar    res ..= ',' .. s
163170fcfcfSBram Moolenaar  endfor
164170fcfcfSBram Moolenaar  return res
165170fcfcfSBram Moolenaarenddef
166170fcfcfSBram Moolenaar
167170fcfcfSBram Moolenaardef Test_call_def_varargs()
168170fcfcfSBram Moolenaar  call assert_fails('call MyDefVarargs()', 'E119:')
169170fcfcfSBram Moolenaar  assert_equal('one,foo', MyDefVarargs('one'))
170170fcfcfSBram Moolenaar  assert_equal('one,two', MyDefVarargs('one', 'two'))
171170fcfcfSBram Moolenaar  assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
172170fcfcfSBram Moolenaarenddef
173170fcfcfSBram Moolenaar
174170fcfcfSBram Moolenaar
17526e117e9SBram Moolenaar"def Test_call_func_defined_later()
17626e117e9SBram Moolenaar"  call assert_equal('one', DefineLater('one'))
17726e117e9SBram Moolenaar"  call assert_fails('call NotDefined("one")', 'E99:')
17826e117e9SBram Moolenaar"enddef
17926e117e9SBram Moolenaar
18026e117e9SBram Moolenaarfunc DefineLater(arg)
18126e117e9SBram Moolenaar  return a:arg
18226e117e9SBram Moolenaarendfunc
18326e117e9SBram Moolenaar
1848a7d6542SBram Moolenaardef Test_return_type_wrong()
185978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
186978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
187978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
188978d170bSBram Moolenaar  CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
1898a7d6542SBram Moolenaarenddef
1908a7d6542SBram Moolenaar
191bfe12043SBram Moolenaardef Test_arg_type_wrong()
192bfe12043SBram Moolenaar  CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
193bfe12043SBram Moolenaarenddef
194bfe12043SBram Moolenaar
1958a7d6542SBram Moolenaardef Test_try_catch()
1968a7d6542SBram Moolenaar  let l = []
1978a7d6542SBram Moolenaar  try
1988a7d6542SBram Moolenaar    add(l, '1')
1998a7d6542SBram Moolenaar    throw 'wrong'
2008a7d6542SBram Moolenaar    add(l, '2')
2018a7d6542SBram Moolenaar  catch
2028a7d6542SBram Moolenaar    add(l, v:exception)
2038a7d6542SBram Moolenaar  finally
2048a7d6542SBram Moolenaar    add(l, '3')
2058a7d6542SBram Moolenaar  endtry
2068a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
2078a7d6542SBram Moolenaarenddef
2088a7d6542SBram Moolenaar
209*257cc5eeSBram Moolenaardef ThrowFromDef()
210*257cc5eeSBram Moolenaar  throw 'getout'
211*257cc5eeSBram Moolenaarenddef
212*257cc5eeSBram Moolenaar
213*257cc5eeSBram Moolenaarfunc CatchInFunc()
214*257cc5eeSBram Moolenaar  try
215*257cc5eeSBram Moolenaar    call ThrowFromDef()
216*257cc5eeSBram Moolenaar  catch
217*257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
218*257cc5eeSBram Moolenaar  endtry
219*257cc5eeSBram Moolenaarendfunc
220*257cc5eeSBram Moolenaar
221*257cc5eeSBram Moolenaardef CatchInDef()
222*257cc5eeSBram Moolenaar  try
223*257cc5eeSBram Moolenaar    ThrowFromDef()
224*257cc5eeSBram Moolenaar  catch
225*257cc5eeSBram Moolenaar    g:thrown_def = v:exception
226*257cc5eeSBram Moolenaar  endtry
227*257cc5eeSBram Moolenaarenddef
228*257cc5eeSBram Moolenaar
229*257cc5eeSBram Moolenaardef Test_try_catch_nested()
230*257cc5eeSBram Moolenaar  CatchInFunc()
231*257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
232*257cc5eeSBram Moolenaar
233*257cc5eeSBram Moolenaar  CatchInDef()
234*257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
235*257cc5eeSBram Moolenaarenddef
236*257cc5eeSBram Moolenaar
2378a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
2388a7d6542SBram Moolenaar  vim9script
2398a7d6542SBram Moolenaar  let name: string = 'bob'
2408a7d6542SBram Moolenaar  def Concat(arg: string): string
2418a7d6542SBram Moolenaar    return name .. arg
2428a7d6542SBram Moolenaar  enddef
2438a7d6542SBram Moolenaar  let g:result = Concat('bie')
2448a7d6542SBram Moolenaar  let g:localname = name
2458a7d6542SBram Moolenaar
2468a7d6542SBram Moolenaar  export const CONST = 1234
2478a7d6542SBram Moolenaar  export let exported = 9876
2486e587dcbSBram Moolenaar  export let exp_name = 'John'
2498a7d6542SBram Moolenaar  export def Exported(): string
2508a7d6542SBram Moolenaar    return 'Exported'
2518a7d6542SBram Moolenaar  enddef
2528a7d6542SBram MoolenaarEND
2538a7d6542SBram Moolenaar
2548a7d6542SBram Moolenaardef Test_vim9script()
2558a7d6542SBram Moolenaar  let import_script_lines =<< trim END
2568a7d6542SBram Moolenaar    vim9script
2578a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
2588a7d6542SBram Moolenaar    g:imported = exported
2596e587dcbSBram Moolenaar    exported += 3
2606e587dcbSBram Moolenaar    g:imported_added = exported
2618a7d6542SBram Moolenaar    g:imported_func = Exported()
2626e587dcbSBram Moolenaar
2636e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
2646e587dcbSBram Moolenaar    g:imported_name = exp_name
2656e587dcbSBram Moolenaar    exp_name ..= ' Doe'
2666e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
2678a7d6542SBram Moolenaar  END
2688a7d6542SBram Moolenaar
2698a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
2708a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
2718a7d6542SBram Moolenaar
2728a7d6542SBram Moolenaar  source Ximport.vim
2738a7d6542SBram Moolenaar
2748a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
2758a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
2768a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
2776e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
2788a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
2796e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
2806e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
2818a7d6542SBram Moolenaar  assert_false(exists('g:name'))
2828a7d6542SBram Moolenaar
2838a7d6542SBram Moolenaar  unlet g:result
2848a7d6542SBram Moolenaar  unlet g:localname
2858a7d6542SBram Moolenaar  unlet g:imported
2866e587dcbSBram Moolenaar  unlet g:imported_added
2878a7d6542SBram Moolenaar  unlet g:imported_func
2886e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
2898a7d6542SBram Moolenaar  delete('Ximport.vim')
2908a7d6542SBram Moolenaar  delete('Xexport.vim')
2918a7d6542SBram Moolenaar
2928a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
2938a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
2948a7d6542SBram Moolenaarenddef
2958a7d6542SBram Moolenaar
2968a7d6542SBram Moolenaardef Test_vim9script_call()
2978a7d6542SBram Moolenaar  let lines =<< trim END
2988a7d6542SBram Moolenaar    vim9script
2998a7d6542SBram Moolenaar    let var = ''
3008a7d6542SBram Moolenaar    def MyFunc(arg: string)
3018a7d6542SBram Moolenaar       var = arg
3028a7d6542SBram Moolenaar    enddef
3038a7d6542SBram Moolenaar    MyFunc('foobar')
3048a7d6542SBram Moolenaar    assert_equal('foobar', var)
3058a7d6542SBram Moolenaar
3068a7d6542SBram Moolenaar    let str = 'barfoo'
3078a7d6542SBram Moolenaar    str->MyFunc()
3088a7d6542SBram Moolenaar    assert_equal('barfoo', var)
3098a7d6542SBram Moolenaar
3108a7d6542SBram Moolenaar    let g:value = 'value'
3118a7d6542SBram Moolenaar    g:value->MyFunc()
3128a7d6542SBram Moolenaar    assert_equal('value', var)
3138a7d6542SBram Moolenaar
3148a7d6542SBram Moolenaar    let listvar = []
3158a7d6542SBram Moolenaar    def ListFunc(arg: list<number>)
3168a7d6542SBram Moolenaar       listvar = arg
3178a7d6542SBram Moolenaar    enddef
3188a7d6542SBram Moolenaar    [1, 2, 3]->ListFunc()
3198a7d6542SBram Moolenaar    assert_equal([1, 2, 3], listvar)
3208a7d6542SBram Moolenaar
3218a7d6542SBram Moolenaar    let dictvar = {}
3228a7d6542SBram Moolenaar    def DictFunc(arg: dict<number>)
3238a7d6542SBram Moolenaar       dictvar = arg
3248a7d6542SBram Moolenaar    enddef
3258a7d6542SBram Moolenaar    {'a': 1, 'b': 2}->DictFunc()
3268a7d6542SBram Moolenaar    assert_equal(#{a: 1, b: 2}, dictvar)
3278a7d6542SBram Moolenaar    #{a: 3, b: 4}->DictFunc()
3288a7d6542SBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
3298a7d6542SBram Moolenaar  END
3308a7d6542SBram Moolenaar  writefile(lines, 'Xcall.vim')
3318a7d6542SBram Moolenaar  source Xcall.vim
3328a7d6542SBram Moolenaar  delete('Xcall.vim')
3338a7d6542SBram Moolenaarenddef
3348a7d6542SBram Moolenaar
3358a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl()
3368a7d6542SBram Moolenaar  let lines =<< trim END
3378a7d6542SBram Moolenaar    vim9script
3388a7d6542SBram Moolenaar    let var = ''
3398a7d6542SBram Moolenaar    def MyFunc(arg: string)
3408a7d6542SBram Moolenaar       let var = 123
3418a7d6542SBram Moolenaar    enddef
3428a7d6542SBram Moolenaar  END
3438a7d6542SBram Moolenaar  writefile(lines, 'Xcall_decl.vim')
3448a7d6542SBram Moolenaar  assert_fails('source Xcall_decl.vim', 'E1054:')
3458a7d6542SBram Moolenaar  delete('Xcall_decl.vim')
3468a7d6542SBram Moolenaarenddef
3478a7d6542SBram Moolenaar
3488a7d6542SBram Moolenaardef Test_vim9script_call_fail_const()
3498a7d6542SBram Moolenaar  let lines =<< trim END
3508a7d6542SBram Moolenaar    vim9script
3518a7d6542SBram Moolenaar    const var = ''
3528a7d6542SBram Moolenaar    def MyFunc(arg: string)
3538a7d6542SBram Moolenaar       var = 'asdf'
3548a7d6542SBram Moolenaar    enddef
3558a7d6542SBram Moolenaar  END
3568a7d6542SBram Moolenaar  writefile(lines, 'Xcall_const.vim')
3578a7d6542SBram Moolenaar  assert_fails('source Xcall_const.vim', 'E46:')
3588a7d6542SBram Moolenaar  delete('Xcall_const.vim')
3598a7d6542SBram Moolenaarenddef
3608a7d6542SBram Moolenaar
3618a7d6542SBram Moolenaardef Test_vim9script_reload()
3628a7d6542SBram Moolenaar  let lines =<< trim END
3638a7d6542SBram Moolenaar    vim9script
3648a7d6542SBram Moolenaar    const var = ''
3658a7d6542SBram Moolenaar    let valone = 1234
3668a7d6542SBram Moolenaar    def MyFunc(arg: string)
3678a7d6542SBram Moolenaar       valone = 5678
3688a7d6542SBram Moolenaar    enddef
3698a7d6542SBram Moolenaar  END
3708a7d6542SBram Moolenaar  let morelines =<< trim END
3718a7d6542SBram Moolenaar    let valtwo = 222
3728a7d6542SBram Moolenaar    export def GetValtwo(): number
3738a7d6542SBram Moolenaar      return valtwo
3748a7d6542SBram Moolenaar    enddef
3758a7d6542SBram Moolenaar  END
3768a7d6542SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
3778a7d6542SBram Moolenaar  source Xreload.vim
3788a7d6542SBram Moolenaar  source Xreload.vim
3798a7d6542SBram Moolenaar  source Xreload.vim
3808a7d6542SBram Moolenaar
3818a7d6542SBram Moolenaar  let testlines =<< trim END
3828a7d6542SBram Moolenaar    vim9script
3838a7d6542SBram Moolenaar    def TheFunc()
3848a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
3858a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
3868a7d6542SBram Moolenaar    enddef
3878a7d6542SBram Moolenaar    TheFunc()
3888a7d6542SBram Moolenaar  END
3898a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
3908a7d6542SBram Moolenaar  source Ximport.vim
3918a7d6542SBram Moolenaar
3928a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
3938a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
3948a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
3958a7d6542SBram Moolenaar  source Xreload.vim
3968a7d6542SBram Moolenaar  source Ximport.vim
3978a7d6542SBram Moolenaar
3988a7d6542SBram Moolenaar  " cannot declare a var twice
3998a7d6542SBram Moolenaar  lines =<< trim END
4008a7d6542SBram Moolenaar    vim9script
4018a7d6542SBram Moolenaar    let valone = 1234
4028a7d6542SBram Moolenaar    let valone = 5678
4038a7d6542SBram Moolenaar  END
4048a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
4058a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
4068a7d6542SBram Moolenaar
4078a7d6542SBram Moolenaar  delete('Xreload.vim')
4088a7d6542SBram Moolenaar  delete('Ximport.vim')
4098a7d6542SBram Moolenaarenddef
4108a7d6542SBram Moolenaar
4118a7d6542SBram Moolenaardef Test_import_absolute()
4128a7d6542SBram Moolenaar  let import_lines = [
4138a7d6542SBram Moolenaar        \ 'vim9script',
4148a7d6542SBram Moolenaar        \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
415b283a8a6SBram Moolenaar        \ 'def UseExported()',
4168a7d6542SBram Moolenaar        \ '  g:imported_abs = exported',
4174e12a5dfSBram Moolenaar        \ '  exported = 8888',
4184e12a5dfSBram Moolenaar        \ '  g:imported_after = exported',
419b283a8a6SBram Moolenaar        \ 'enddef',
420b283a8a6SBram Moolenaar        \ 'UseExported()',
4214e12a5dfSBram Moolenaar        \ 'g:import_disassembled = execute("disass UseExported")',
4228a7d6542SBram Moolenaar        \ ]
4238a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
4248a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
4258a7d6542SBram Moolenaar
4268a7d6542SBram Moolenaar  source Ximport_abs.vim
4278a7d6542SBram Moolenaar
4288a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
4294e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
430b283a8a6SBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*'
431b283a8a6SBram Moolenaar        \ .. 'g:imported_abs = exported.*'
432b283a8a6SBram Moolenaar        \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
4334e12a5dfSBram Moolenaar        \ .. '1 STOREG g:imported_abs.*'
4344e12a5dfSBram Moolenaar        \ .. 'exported = 8888.*'
4354e12a5dfSBram Moolenaar        \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
4364e12a5dfSBram Moolenaar        \ .. 'g:imported_after = exported.*'
4374e12a5dfSBram Moolenaar        \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
4384e12a5dfSBram Moolenaar        \ .. '5 STOREG g:imported_after.*'
4394e12a5dfSBram Moolenaar        \, g:import_disassembled)
4408a7d6542SBram Moolenaar  unlet g:imported_abs
4414e12a5dfSBram Moolenaar  unlet g:import_disassembled
4428a7d6542SBram Moolenaar
4438a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
4448a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
4458a7d6542SBram Moolenaarenddef
4468a7d6542SBram Moolenaar
4478a7d6542SBram Moolenaardef Test_import_rtp()
4488a7d6542SBram Moolenaar  let import_lines = [
4498a7d6542SBram Moolenaar        \ 'vim9script',
4508a7d6542SBram Moolenaar        \ 'import exported from "Xexport_rtp.vim"',
4518a7d6542SBram Moolenaar        \ 'g:imported_rtp = exported',
4528a7d6542SBram Moolenaar        \ ]
4538a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
4548a7d6542SBram Moolenaar  mkdir('import')
4558a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
4568a7d6542SBram Moolenaar
4578a7d6542SBram Moolenaar  let save_rtp = &rtp
4588a7d6542SBram Moolenaar  &rtp = getcwd()
4598a7d6542SBram Moolenaar  source Ximport_rtp.vim
4608a7d6542SBram Moolenaar  &rtp = save_rtp
4618a7d6542SBram Moolenaar
4628a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
4638a7d6542SBram Moolenaar  unlet g:imported_rtp
4648a7d6542SBram Moolenaar
4658a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
4668a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
4678a7d6542SBram Moolenaar  delete('import', 'd')
4688a7d6542SBram Moolenaarenddef
4698a7d6542SBram Moolenaar
4708a7d6542SBram Moolenaardef Test_fixed_size_list()
4718a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
4728a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
4738a7d6542SBram Moolenaar  l->remove(0)
4748a7d6542SBram Moolenaar  l->add(5)
4758a7d6542SBram Moolenaar  l->insert(99, 1)
4760f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
4778a7d6542SBram Moolenaarenddef
4788a7d6542SBram Moolenaar
479673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not
480673660abSBram Moolenaar" recognized.
481673660abSBram Moolenaarfunc Test_function_python()
482673660abSBram Moolenaar  CheckFeature python3
483673660abSBram Moolenaar  let py = 'python3'
484673660abSBram Moolenaar  execute py "<< EOF"
485673660abSBram Moolenaardef do_something():
486673660abSBram Moolenaar  return 1
487673660abSBram MoolenaarEOF
488673660abSBram Moolenaarendfunc
489673660abSBram Moolenaar
490158906cfSBram Moolenaardef IfElse(what: number): string
491158906cfSBram Moolenaar  let res = ''
492158906cfSBram Moolenaar  if what == 1
493158906cfSBram Moolenaar    res = "one"
494158906cfSBram Moolenaar  elseif what == 2
495158906cfSBram Moolenaar    res = "two"
496a259d8d3SBram Moolenaar  else
497158906cfSBram Moolenaar    res = "three"
498a259d8d3SBram Moolenaar  endif
499158906cfSBram Moolenaar  return res
500a259d8d3SBram Moolenaarenddef
501a259d8d3SBram Moolenaar
502158906cfSBram Moolenaardef Test_if_elseif_else()
503158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
504158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
505158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
5060f18b6d1SBram Moolenaarenddef
5070f18b6d1SBram Moolenaar
50863ce4849SBram Moolenaardef Test_delfunc()
50963ce4849SBram Moolenaar  let lines =<< trim END
51063ce4849SBram Moolenaar    vim9script
51163ce4849SBram Moolenaar    def GoneSoon()
51263ce4849SBram Moolenaar      echo 'hello'
51363ce4849SBram Moolenaar    enddef
51463ce4849SBram Moolenaar
51563ce4849SBram Moolenaar    def CallGoneSoon()
51663ce4849SBram Moolenaar      GoneSoon()
51763ce4849SBram Moolenaar    enddef
51863ce4849SBram Moolenaar
51963ce4849SBram Moolenaar    delfunc GoneSoon
52063ce4849SBram Moolenaar    CallGoneSoon()
52163ce4849SBram Moolenaar  END
52263ce4849SBram Moolenaar  writefile(lines, 'XToDelFunc')
52363ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
52463ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
52563ce4849SBram Moolenaar
52663ce4849SBram Moolenaar  delete('XToDelFunc')
52763ce4849SBram Moolenaarenddef
52863ce4849SBram Moolenaar
5298a7d6542SBram Moolenaar
5308a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
531