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
2098a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
2108a7d6542SBram Moolenaar  vim9script
2118a7d6542SBram Moolenaar  let name: string = 'bob'
2128a7d6542SBram Moolenaar  def Concat(arg: string): string
2138a7d6542SBram Moolenaar    return name .. arg
2148a7d6542SBram Moolenaar  enddef
2158a7d6542SBram Moolenaar  let g:result = Concat('bie')
2168a7d6542SBram Moolenaar  let g:localname = name
2178a7d6542SBram Moolenaar
2188a7d6542SBram Moolenaar  export const CONST = 1234
2198a7d6542SBram Moolenaar  export let exported = 9876
2206e587dcbSBram Moolenaar  export let exp_name = 'John'
2218a7d6542SBram Moolenaar  export def Exported(): string
2228a7d6542SBram Moolenaar    return 'Exported'
2238a7d6542SBram Moolenaar  enddef
2248a7d6542SBram MoolenaarEND
2258a7d6542SBram Moolenaar
2268a7d6542SBram Moolenaardef Test_vim9script()
2278a7d6542SBram Moolenaar  let import_script_lines =<< trim END
2288a7d6542SBram Moolenaar    vim9script
2298a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
2308a7d6542SBram Moolenaar    g:imported = exported
2316e587dcbSBram Moolenaar    exported += 3
2326e587dcbSBram Moolenaar    g:imported_added = exported
2338a7d6542SBram Moolenaar    g:imported_func = Exported()
2346e587dcbSBram Moolenaar
2356e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
2366e587dcbSBram Moolenaar    g:imported_name = exp_name
2376e587dcbSBram Moolenaar    exp_name ..= ' Doe'
2386e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
2398a7d6542SBram Moolenaar  END
2408a7d6542SBram Moolenaar
2418a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
2428a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
2438a7d6542SBram Moolenaar
2448a7d6542SBram Moolenaar  source Ximport.vim
2458a7d6542SBram Moolenaar
2468a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
2478a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
2488a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
2496e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
2508a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
2516e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
2526e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
2538a7d6542SBram Moolenaar  assert_false(exists('g:name'))
2548a7d6542SBram Moolenaar
2558a7d6542SBram Moolenaar  unlet g:result
2568a7d6542SBram Moolenaar  unlet g:localname
2578a7d6542SBram Moolenaar  unlet g:imported
2586e587dcbSBram Moolenaar  unlet g:imported_added
2598a7d6542SBram Moolenaar  unlet g:imported_func
2606e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
2618a7d6542SBram Moolenaar  delete('Ximport.vim')
2628a7d6542SBram Moolenaar  delete('Xexport.vim')
2638a7d6542SBram Moolenaar
2648a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
2658a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
2668a7d6542SBram Moolenaarenddef
2678a7d6542SBram Moolenaar
2688a7d6542SBram Moolenaardef Test_vim9script_call()
2698a7d6542SBram Moolenaar  let lines =<< trim END
2708a7d6542SBram Moolenaar    vim9script
2718a7d6542SBram Moolenaar    let var = ''
2728a7d6542SBram Moolenaar    def MyFunc(arg: string)
2738a7d6542SBram Moolenaar       var = arg
2748a7d6542SBram Moolenaar    enddef
2758a7d6542SBram Moolenaar    MyFunc('foobar')
2768a7d6542SBram Moolenaar    assert_equal('foobar', var)
2778a7d6542SBram Moolenaar
2788a7d6542SBram Moolenaar    let str = 'barfoo'
2798a7d6542SBram Moolenaar    str->MyFunc()
2808a7d6542SBram Moolenaar    assert_equal('barfoo', var)
2818a7d6542SBram Moolenaar
2828a7d6542SBram Moolenaar    let g:value = 'value'
2838a7d6542SBram Moolenaar    g:value->MyFunc()
2848a7d6542SBram Moolenaar    assert_equal('value', var)
2858a7d6542SBram Moolenaar
2868a7d6542SBram Moolenaar    let listvar = []
2878a7d6542SBram Moolenaar    def ListFunc(arg: list<number>)
2888a7d6542SBram Moolenaar       listvar = arg
2898a7d6542SBram Moolenaar    enddef
2908a7d6542SBram Moolenaar    [1, 2, 3]->ListFunc()
2918a7d6542SBram Moolenaar    assert_equal([1, 2, 3], listvar)
2928a7d6542SBram Moolenaar
2938a7d6542SBram Moolenaar    let dictvar = {}
2948a7d6542SBram Moolenaar    def DictFunc(arg: dict<number>)
2958a7d6542SBram Moolenaar       dictvar = arg
2968a7d6542SBram Moolenaar    enddef
2978a7d6542SBram Moolenaar    {'a': 1, 'b': 2}->DictFunc()
2988a7d6542SBram Moolenaar    assert_equal(#{a: 1, b: 2}, dictvar)
2998a7d6542SBram Moolenaar    #{a: 3, b: 4}->DictFunc()
3008a7d6542SBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
3018a7d6542SBram Moolenaar  END
3028a7d6542SBram Moolenaar  writefile(lines, 'Xcall.vim')
3038a7d6542SBram Moolenaar  source Xcall.vim
3048a7d6542SBram Moolenaar  delete('Xcall.vim')
3058a7d6542SBram Moolenaarenddef
3068a7d6542SBram Moolenaar
3078a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl()
3088a7d6542SBram Moolenaar  let lines =<< trim END
3098a7d6542SBram Moolenaar    vim9script
3108a7d6542SBram Moolenaar    let var = ''
3118a7d6542SBram Moolenaar    def MyFunc(arg: string)
3128a7d6542SBram Moolenaar       let var = 123
3138a7d6542SBram Moolenaar    enddef
3148a7d6542SBram Moolenaar  END
3158a7d6542SBram Moolenaar  writefile(lines, 'Xcall_decl.vim')
3168a7d6542SBram Moolenaar  assert_fails('source Xcall_decl.vim', 'E1054:')
3178a7d6542SBram Moolenaar  delete('Xcall_decl.vim')
3188a7d6542SBram Moolenaarenddef
3198a7d6542SBram Moolenaar
3208a7d6542SBram Moolenaardef Test_vim9script_call_fail_const()
3218a7d6542SBram Moolenaar  let lines =<< trim END
3228a7d6542SBram Moolenaar    vim9script
3238a7d6542SBram Moolenaar    const var = ''
3248a7d6542SBram Moolenaar    def MyFunc(arg: string)
3258a7d6542SBram Moolenaar       var = 'asdf'
3268a7d6542SBram Moolenaar    enddef
3278a7d6542SBram Moolenaar  END
3288a7d6542SBram Moolenaar  writefile(lines, 'Xcall_const.vim')
3298a7d6542SBram Moolenaar  assert_fails('source Xcall_const.vim', 'E46:')
3308a7d6542SBram Moolenaar  delete('Xcall_const.vim')
3318a7d6542SBram Moolenaarenddef
3328a7d6542SBram Moolenaar
3338a7d6542SBram Moolenaardef Test_vim9script_reload()
3348a7d6542SBram Moolenaar  let lines =<< trim END
3358a7d6542SBram Moolenaar    vim9script
3368a7d6542SBram Moolenaar    const var = ''
3378a7d6542SBram Moolenaar    let valone = 1234
3388a7d6542SBram Moolenaar    def MyFunc(arg: string)
3398a7d6542SBram Moolenaar       valone = 5678
3408a7d6542SBram Moolenaar    enddef
3418a7d6542SBram Moolenaar  END
3428a7d6542SBram Moolenaar  let morelines =<< trim END
3438a7d6542SBram Moolenaar    let valtwo = 222
3448a7d6542SBram Moolenaar    export def GetValtwo(): number
3458a7d6542SBram Moolenaar      return valtwo
3468a7d6542SBram Moolenaar    enddef
3478a7d6542SBram Moolenaar  END
3488a7d6542SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
3498a7d6542SBram Moolenaar  source Xreload.vim
3508a7d6542SBram Moolenaar  source Xreload.vim
3518a7d6542SBram Moolenaar  source Xreload.vim
3528a7d6542SBram Moolenaar
3538a7d6542SBram Moolenaar  let testlines =<< trim END
3548a7d6542SBram Moolenaar    vim9script
3558a7d6542SBram Moolenaar    def TheFunc()
3568a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
3578a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
3588a7d6542SBram Moolenaar    enddef
3598a7d6542SBram Moolenaar    TheFunc()
3608a7d6542SBram Moolenaar  END
3618a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
3628a7d6542SBram Moolenaar  source Ximport.vim
3638a7d6542SBram Moolenaar
3648a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
3658a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
3668a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
3678a7d6542SBram Moolenaar  source Xreload.vim
3688a7d6542SBram Moolenaar  source Ximport.vim
3698a7d6542SBram Moolenaar
3708a7d6542SBram Moolenaar  " cannot declare a var twice
3718a7d6542SBram Moolenaar  lines =<< trim END
3728a7d6542SBram Moolenaar    vim9script
3738a7d6542SBram Moolenaar    let valone = 1234
3748a7d6542SBram Moolenaar    let valone = 5678
3758a7d6542SBram Moolenaar  END
3768a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
3778a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
3788a7d6542SBram Moolenaar
3798a7d6542SBram Moolenaar  delete('Xreload.vim')
3808a7d6542SBram Moolenaar  delete('Ximport.vim')
3818a7d6542SBram Moolenaarenddef
3828a7d6542SBram Moolenaar
3838a7d6542SBram Moolenaardef Test_import_absolute()
3848a7d6542SBram Moolenaar  let import_lines = [
3858a7d6542SBram Moolenaar        \ 'vim9script',
3868a7d6542SBram Moolenaar        \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
387b283a8a6SBram Moolenaar        \ 'def UseExported()',
3888a7d6542SBram Moolenaar        \ '  g:imported_abs = exported',
3894e12a5dfSBram Moolenaar        \ '  exported = 8888',
3904e12a5dfSBram Moolenaar        \ '  g:imported_after = exported',
391b283a8a6SBram Moolenaar        \ 'enddef',
392b283a8a6SBram Moolenaar        \ 'UseExported()',
3934e12a5dfSBram Moolenaar        \ 'g:import_disassembled = execute("disass UseExported")',
3948a7d6542SBram Moolenaar        \ ]
3958a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
3968a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
3978a7d6542SBram Moolenaar
3988a7d6542SBram Moolenaar  source Ximport_abs.vim
3998a7d6542SBram Moolenaar
4008a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
4014e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
402b283a8a6SBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*'
403b283a8a6SBram Moolenaar        \ .. 'g:imported_abs = exported.*'
404b283a8a6SBram Moolenaar        \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
4054e12a5dfSBram Moolenaar        \ .. '1 STOREG g:imported_abs.*'
4064e12a5dfSBram Moolenaar        \ .. 'exported = 8888.*'
4074e12a5dfSBram Moolenaar        \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
4084e12a5dfSBram Moolenaar        \ .. 'g:imported_after = exported.*'
4094e12a5dfSBram Moolenaar        \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
4104e12a5dfSBram Moolenaar        \ .. '5 STOREG g:imported_after.*'
4114e12a5dfSBram Moolenaar        \, g:import_disassembled)
4128a7d6542SBram Moolenaar  unlet g:imported_abs
4134e12a5dfSBram Moolenaar  unlet g:import_disassembled
4148a7d6542SBram Moolenaar
4158a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
4168a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
4178a7d6542SBram Moolenaarenddef
4188a7d6542SBram Moolenaar
4198a7d6542SBram Moolenaardef Test_import_rtp()
4208a7d6542SBram Moolenaar  let import_lines = [
4218a7d6542SBram Moolenaar        \ 'vim9script',
4228a7d6542SBram Moolenaar        \ 'import exported from "Xexport_rtp.vim"',
4238a7d6542SBram Moolenaar        \ 'g:imported_rtp = exported',
4248a7d6542SBram Moolenaar        \ ]
4258a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
4268a7d6542SBram Moolenaar  mkdir('import')
4278a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
4288a7d6542SBram Moolenaar
4298a7d6542SBram Moolenaar  let save_rtp = &rtp
4308a7d6542SBram Moolenaar  &rtp = getcwd()
4318a7d6542SBram Moolenaar  source Ximport_rtp.vim
4328a7d6542SBram Moolenaar  &rtp = save_rtp
4338a7d6542SBram Moolenaar
4348a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
4358a7d6542SBram Moolenaar  unlet g:imported_rtp
4368a7d6542SBram Moolenaar
4378a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
4388a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
4398a7d6542SBram Moolenaar  delete('import', 'd')
4408a7d6542SBram Moolenaarenddef
4418a7d6542SBram Moolenaar
4428a7d6542SBram Moolenaardef Test_fixed_size_list()
4438a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
4448a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
4458a7d6542SBram Moolenaar  l->remove(0)
4468a7d6542SBram Moolenaar  l->add(5)
4478a7d6542SBram Moolenaar  l->insert(99, 1)
4480f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
4498a7d6542SBram Moolenaarenddef
4508a7d6542SBram Moolenaar
451673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not
452673660abSBram Moolenaar" recognized.
453673660abSBram Moolenaarfunc Test_function_python()
454673660abSBram Moolenaar  CheckFeature python3
455673660abSBram Moolenaar  let py = 'python3'
456673660abSBram Moolenaar  execute py "<< EOF"
457673660abSBram Moolenaardef do_something():
458673660abSBram Moolenaar  return 1
459673660abSBram MoolenaarEOF
460673660abSBram Moolenaarendfunc
461673660abSBram Moolenaar
462158906cfSBram Moolenaardef IfElse(what: number): string
463158906cfSBram Moolenaar  let res = ''
464158906cfSBram Moolenaar  if what == 1
465158906cfSBram Moolenaar    res = "one"
466158906cfSBram Moolenaar  elseif what == 2
467158906cfSBram Moolenaar    res = "two"
468a259d8d3SBram Moolenaar  else
469158906cfSBram Moolenaar    res = "three"
470a259d8d3SBram Moolenaar  endif
471158906cfSBram Moolenaar  return res
472a259d8d3SBram Moolenaarenddef
473a259d8d3SBram Moolenaar
474158906cfSBram Moolenaardef Test_if_elseif_else()
475158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
476158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
477158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
4780f18b6d1SBram Moolenaarenddef
4790f18b6d1SBram Moolenaar
480*63ce4849SBram Moolenaardef Test_delfunc()
481*63ce4849SBram Moolenaar  let lines =<< trim END
482*63ce4849SBram Moolenaar    vim9script
483*63ce4849SBram Moolenaar    def GoneSoon()
484*63ce4849SBram Moolenaar      echo 'hello'
485*63ce4849SBram Moolenaar    enddef
486*63ce4849SBram Moolenaar
487*63ce4849SBram Moolenaar    def CallGoneSoon()
488*63ce4849SBram Moolenaar      GoneSoon()
489*63ce4849SBram Moolenaar    enddef
490*63ce4849SBram Moolenaar
491*63ce4849SBram Moolenaar    delfunc GoneSoon
492*63ce4849SBram Moolenaar    CallGoneSoon()
493*63ce4849SBram Moolenaar  END
494*63ce4849SBram Moolenaar  writefile(lines, 'XToDelFunc')
495*63ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
496*63ce4849SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
497*63ce4849SBram Moolenaar
498*63ce4849SBram Moolenaar  delete('XToDelFunc')
499*63ce4849SBram Moolenaarenddef
500*63ce4849SBram Moolenaar
5018a7d6542SBram Moolenaar
5028a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
503