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
142*170fcfcfSBram Moolenaardef MyDefaultArgs(name = 'string'): string
143*170fcfcfSBram Moolenaar  return name
144*170fcfcfSBram Moolenaarenddef
145*170fcfcfSBram Moolenaar
146*170fcfcfSBram Moolenaardef Test_call_default_args()
147*170fcfcfSBram Moolenaar  assert_equal('string', MyDefaultArgs())
148*170fcfcfSBram Moolenaar  assert_equal('one', MyDefaultArgs('one'))
149*170fcfcfSBram Moolenaar  assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
150*170fcfcfSBram Moolenaarenddef
151*170fcfcfSBram Moolenaar
152*170fcfcfSBram Moolenaarfunc Test_call_default_args_from_func()
153*170fcfcfSBram Moolenaar  call assert_equal('string', MyDefaultArgs())
154*170fcfcfSBram Moolenaar  call assert_equal('one', MyDefaultArgs('one'))
155*170fcfcfSBram Moolenaar  call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
156*170fcfcfSBram Moolenaarendfunc
157*170fcfcfSBram Moolenaar
158*170fcfcfSBram Moolenaar" Default arg and varargs
159*170fcfcfSBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
160*170fcfcfSBram Moolenaar  let res = one .. ',' .. two
161*170fcfcfSBram Moolenaar  for s in rest
162*170fcfcfSBram Moolenaar    res ..= ',' .. s
163*170fcfcfSBram Moolenaar  endfor
164*170fcfcfSBram Moolenaar  return res
165*170fcfcfSBram Moolenaarenddef
166*170fcfcfSBram Moolenaar
167*170fcfcfSBram Moolenaardef Test_call_def_varargs()
168*170fcfcfSBram Moolenaar  call assert_fails('call MyDefVarargs()', 'E119:')
169*170fcfcfSBram Moolenaar  assert_equal('one,foo', MyDefVarargs('one'))
170*170fcfcfSBram Moolenaar  assert_equal('one,two', MyDefVarargs('one', 'two'))
171*170fcfcfSBram Moolenaar  assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
172*170fcfcfSBram Moolenaarenddef
173*170fcfcfSBram Moolenaar
174*170fcfcfSBram 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
462a259d8d3SBram Moolenaardef HasEval()
463a259d8d3SBram Moolenaar  if has('eval')
464a259d8d3SBram Moolenaar    echo 'yes'
465a259d8d3SBram Moolenaar  else
466a259d8d3SBram Moolenaar    echo 'no'
467a259d8d3SBram Moolenaar  endif
468a259d8d3SBram Moolenaarenddef
469a259d8d3SBram Moolenaar
470a259d8d3SBram Moolenaardef HasNothing()
471a259d8d3SBram Moolenaar  if has('nothing')
472a259d8d3SBram Moolenaar    echo 'yes'
473a259d8d3SBram Moolenaar  else
474a259d8d3SBram Moolenaar    echo 'no'
475a259d8d3SBram Moolenaar  endif
476a259d8d3SBram Moolenaarenddef
477a259d8d3SBram Moolenaar
478a259d8d3SBram Moolenaardef Test_compile_const_expr()
479a259d8d3SBram Moolenaar  assert_equal("\nyes", execute('call HasEval()'))
480a259d8d3SBram Moolenaar  let instr = execute('disassemble HasEval')
4810f18b6d1SBram Moolenaar  assert_match('PUSHS "yes"', instr)
4820f18b6d1SBram Moolenaar  assert_notmatch('PUSHS "no"', instr)
4830f18b6d1SBram Moolenaar  assert_notmatch('JUMP', instr)
484a259d8d3SBram Moolenaar
485a259d8d3SBram Moolenaar  assert_equal("\nno", execute('call HasNothing()'))
486a259d8d3SBram Moolenaar  instr = execute('disassemble HasNothing')
4870f18b6d1SBram Moolenaar  assert_notmatch('PUSHS "yes"', instr)
4880f18b6d1SBram Moolenaar  assert_match('PUSHS "no"', instr)
4890f18b6d1SBram Moolenaar  assert_notmatch('JUMP', instr)
4900f18b6d1SBram Moolenaarenddef
4910f18b6d1SBram Moolenaar
4920f18b6d1SBram Moolenaarfunc NotCompiled()
4930f18b6d1SBram Moolenaar  echo "not"
4940f18b6d1SBram Moolenaarendfunc
4950f18b6d1SBram Moolenaar
4960f18b6d1SBram Moolenaarlet s:scriptvar = 4
4970f18b6d1SBram Moolenaarlet g:globalvar = 'g'
4980f18b6d1SBram Moolenaar
499b283a8a6SBram Moolenaardef s:ScriptFuncLoad(arg: string)
5000f18b6d1SBram Moolenaar  let local = 1
5010f18b6d1SBram Moolenaar  buffers
5020f18b6d1SBram Moolenaar  echo arg
5030f18b6d1SBram Moolenaar  echo local
5040f18b6d1SBram Moolenaar  echo v:version
5050f18b6d1SBram Moolenaar  echo s:scriptvar
5060f18b6d1SBram Moolenaar  echo g:globalvar
5070f18b6d1SBram Moolenaar  echo &tabstop
5080f18b6d1SBram Moolenaar  echo $ENVVAR
5090f18b6d1SBram Moolenaar  echo @z
5100f18b6d1SBram Moolenaarenddef
5110f18b6d1SBram Moolenaar
5120de50864SBram Moolenaardef Test_disassembleLoad()
5130de50864SBram Moolenaar  assert_fails('disass NoFunc', 'E1061:')
5140de50864SBram Moolenaar  assert_fails('disass NotCompiled', 'E1062:')
5150de50864SBram Moolenaar
5160de50864SBram Moolenaar  let res = execute('disass s:ScriptFuncLoad')
5170de50864SBram Moolenaar  assert_match('<SNR>\d*_ScriptFuncLoad.*'
5180de50864SBram Moolenaar        \ .. 'buffers.*'
5190de50864SBram Moolenaar        \ .. ' EXEC \+buffers.*'
5200de50864SBram Moolenaar        \ .. ' LOAD arg\[-1\].*'
5210de50864SBram Moolenaar        \ .. ' LOAD $0.*'
5220de50864SBram Moolenaar        \ .. ' LOADV v:version.*'
5230de50864SBram Moolenaar        \ .. ' LOADS s:scriptvar from .*test_vim9_script.vim.*'
5240de50864SBram Moolenaar        \ .. ' LOADG g:globalvar.*'
5250de50864SBram Moolenaar        \ .. ' LOADENV $ENVVAR.*'
5260de50864SBram Moolenaar        \ .. ' LOADREG @z.*'
5270de50864SBram Moolenaar        \, res)
5280de50864SBram Moolenaarenddef
5290de50864SBram Moolenaar
530ff80cb68SBram Moolenaardef s:ScriptFuncPush()
531ff80cb68SBram Moolenaar  let localbool = true
532ff80cb68SBram Moolenaar  let localspec = v:none
533ff80cb68SBram Moolenaar  let localblob = 0z1234
534ff80cb68SBram Moolenaar  if has('float')
535ff80cb68SBram Moolenaar    let localfloat = 1.234
536ff80cb68SBram Moolenaar  endif
537ff80cb68SBram Moolenaarenddef
538ff80cb68SBram Moolenaar
5390de50864SBram Moolenaardef Test_disassemblePush()
5400de50864SBram Moolenaar  let res = execute('disass s:ScriptFuncPush')
5410de50864SBram Moolenaar  assert_match('<SNR>\d*_ScriptFuncPush.*'
5420de50864SBram Moolenaar        \ .. 'localbool = true.*'
5430de50864SBram Moolenaar        \ .. ' PUSH v:true.*'
5440de50864SBram Moolenaar        \ .. 'localspec = v:none.*'
5450de50864SBram Moolenaar        \ .. ' PUSH v:none.*'
5460de50864SBram Moolenaar        \ .. 'localblob = 0z1234.*'
5470de50864SBram Moolenaar        \ .. ' PUSHBLOB 0z1234.*'
5480de50864SBram Moolenaar        \, res)
5490de50864SBram Moolenaar  if has('float')
5500de50864SBram Moolenaar  assert_match('<SNR>\d*_ScriptFuncPush.*'
5510de50864SBram Moolenaar        \ .. 'localfloat = 1.234.*'
5520de50864SBram Moolenaar        \ .. ' PUSHF 1.234.*'
5530de50864SBram Moolenaar        \, res)
5540de50864SBram Moolenaar  endif
5550de50864SBram Moolenaarenddef
5560de50864SBram Moolenaar
557b283a8a6SBram Moolenaardef s:ScriptFuncStore()
558b283a8a6SBram Moolenaar  let localnr = 1
559b283a8a6SBram Moolenaar  localnr = 2
560b283a8a6SBram Moolenaar  let localstr = 'abc'
561b283a8a6SBram Moolenaar  localstr = 'xyz'
562b283a8a6SBram Moolenaar  v:char = 'abc'
563b283a8a6SBram Moolenaar  s:scriptvar = 'sv'
564b283a8a6SBram Moolenaar  g:globalvar = 'gv'
565b283a8a6SBram Moolenaar  &tabstop = 8
566b283a8a6SBram Moolenaar  $ENVVAR = 'ev'
567b283a8a6SBram Moolenaar  @z = 'rv'
568b283a8a6SBram Moolenaarenddef
569b283a8a6SBram Moolenaar
5700de50864SBram Moolenaardef Test_disassembleStore()
5710de50864SBram Moolenaar  let res = execute('disass s:ScriptFuncStore')
572b283a8a6SBram Moolenaar  assert_match('<SNR>\d*_ScriptFuncStore.*'
573b283a8a6SBram Moolenaar        \ .. 'localnr = 2.*'
574b283a8a6SBram Moolenaar        \ .. ' STORE 2 in $0.*'
575b283a8a6SBram Moolenaar        \ .. 'localstr = ''xyz''.*'
576b283a8a6SBram Moolenaar        \ .. ' STORE $1.*'
577b283a8a6SBram Moolenaar        \ .. 'v:char = ''abc''.*'
578b283a8a6SBram Moolenaar        \ .. 'STOREV v:char.*'
579b283a8a6SBram Moolenaar        \ .. 's:scriptvar = ''sv''.*'
580b283a8a6SBram Moolenaar        \ .. ' STORES s:scriptvar in .*test_vim9_script.vim.*'
581b283a8a6SBram Moolenaar        \ .. 'g:globalvar = ''gv''.*'
582b283a8a6SBram Moolenaar        \ .. ' STOREG g:globalvar.*'
583b283a8a6SBram Moolenaar        \ .. '&tabstop = 8.*'
584b283a8a6SBram Moolenaar        \ .. ' STOREOPT &tabstop.*'
585b283a8a6SBram Moolenaar        \ .. '$ENVVAR = ''ev''.*'
586b283a8a6SBram Moolenaar        \ .. ' STOREENV $ENVVAR.*'
587b283a8a6SBram Moolenaar        \ .. '@z = ''rv''.*'
588b283a8a6SBram Moolenaar        \ .. ' STOREREG @z.*'
589b283a8a6SBram Moolenaar        \, res)
5900de50864SBram Moolenaarenddef
591ff80cb68SBram Moolenaar
5920de50864SBram Moolenaardef s:ScriptFuncTry()
5930de50864SBram Moolenaar  try
5940de50864SBram Moolenaar    echo 'yes'
5950de50864SBram Moolenaar  catch /fail/
5960de50864SBram Moolenaar    echo 'no'
5970de50864SBram Moolenaar  finally
5980de50864SBram Moolenaar    echo 'end'
5990de50864SBram Moolenaar  endtry
6000de50864SBram Moolenaarenddef
6010de50864SBram Moolenaar
6020de50864SBram Moolenaardef Test_disassembleTry()
6030de50864SBram Moolenaar  let res = execute('disass s:ScriptFuncTry')
604ff80cb68SBram Moolenaar  assert_match('<SNR>\d*_ScriptFuncTry.*'
605ff80cb68SBram Moolenaar        \ .. 'try.*'
606ff80cb68SBram Moolenaar        \ .. 'TRY catch -> \d\+, finally -> \d\+.*'
607ff80cb68SBram Moolenaar        \ .. 'catch /fail/.*'
608ff80cb68SBram Moolenaar        \ .. ' JUMP -> \d\+.*'
609ff80cb68SBram Moolenaar        \ .. ' PUSH v:exception.*'
610ff80cb68SBram Moolenaar        \ .. ' PUSHS "fail".*'
611ff80cb68SBram Moolenaar        \ .. ' COMPARESTRING =\~.*'
612ff80cb68SBram Moolenaar        \ .. ' JUMP_IF_FALSE -> \d\+.*'
613ff80cb68SBram Moolenaar        \ .. ' CATCH.*'
614ff80cb68SBram Moolenaar        \ .. 'finally.*'
615ff80cb68SBram Moolenaar        \ .. ' PUSHS "end".*'
616ff80cb68SBram Moolenaar        \ .. 'endtry.*'
617ff80cb68SBram Moolenaar        \ .. ' ENDTRY.*'
618ff80cb68SBram Moolenaar        \, res)
619a259d8d3SBram Moolenaarenddef
620a259d8d3SBram Moolenaar
6210de50864SBram Moolenaardef s:ScriptFuncNew()
6220de50864SBram Moolenaar  let ll = [1, "two", 333]
6230de50864SBram Moolenaar  let dd = #{one: 1, two: "val"}
6240de50864SBram Moolenaarenddef
6250de50864SBram Moolenaar
6260de50864SBram Moolenaardef Test_disassembleNew()
6270de50864SBram Moolenaar  let res = execute('disass s:ScriptFuncNew')
6280de50864SBram Moolenaar  assert_match('<SNR>\d*_ScriptFuncNew.*'
6290de50864SBram Moolenaar        \ .. 'let ll = \[1, "two", 333].*'
6300de50864SBram Moolenaar        \ .. 'PUSHNR 1.*'
6310de50864SBram Moolenaar        \ .. 'PUSHS "two".*'
6320de50864SBram Moolenaar        \ .. 'PUSHNR 333.*'
6330de50864SBram Moolenaar        \ .. 'NEWLIST size 3.*'
6340de50864SBram Moolenaar        \ .. 'let dd = #{one: 1, two: "val"}.*'
6350de50864SBram Moolenaar        \ .. 'PUSHS "one".*'
6360de50864SBram Moolenaar        \ .. 'PUSHNR 1.*'
6370de50864SBram Moolenaar        \ .. 'PUSHS "two".*'
6380de50864SBram Moolenaar        \ .. 'PUSHS "val".*'
6390de50864SBram Moolenaar        \ .. 'NEWDICT size 2.*'
6400de50864SBram Moolenaar        \, res)
6410de50864SBram Moolenaarenddef
6420de50864SBram Moolenaar
6430de50864SBram Moolenaardef FuncWithArg(arg)
6440de50864SBram Moolenaar  echo arg
6450de50864SBram Moolenaarenddef
6460de50864SBram Moolenaar
6470de50864SBram Moolenaarfunc UserFunc()
6480de50864SBram Moolenaar  echo 'nothing'
6490de50864SBram Moolenaarendfunc
6500de50864SBram Moolenaar
6510de50864SBram Moolenaarfunc UserFuncWithArg(arg)
6520de50864SBram Moolenaar  echo a:arg
6530de50864SBram Moolenaarendfunc
6540de50864SBram Moolenaar
6550de50864SBram Moolenaardef s:ScriptFuncCall(): string
6560de50864SBram Moolenaar  changenr()
6570de50864SBram Moolenaar  char2nr("abc")
6580de50864SBram Moolenaar  Test_disassembleNew()
6590de50864SBram Moolenaar  FuncWithArg(343)
6600de50864SBram Moolenaar  UserFunc()
6610de50864SBram Moolenaar  UserFuncWithArg("foo")
6620de50864SBram Moolenaar  let FuncRef = function("UserFunc")
6630de50864SBram Moolenaar  FuncRef()
6640de50864SBram Moolenaar  let FuncRefWithArg = function("UserFuncWithArg")
6650de50864SBram Moolenaar  FuncRefWithArg("bar")
6660de50864SBram Moolenaar  return "yes"
6670de50864SBram Moolenaarenddef
6680de50864SBram Moolenaar
6690de50864SBram Moolenaardef Test_disassembleCall()
6700de50864SBram Moolenaar  let res = execute('disass s:ScriptFuncCall')
6710de50864SBram Moolenaar  assert_match('<SNR>\d*_ScriptFuncCall.*'
6720de50864SBram Moolenaar        \ .. 'changenr().*'
6730de50864SBram Moolenaar        \ .. ' BCALL changenr(argc 0).*'
6740de50864SBram Moolenaar        \ .. 'char2nr("abc").*'
6750de50864SBram Moolenaar        \ .. ' PUSHS "abc".*'
6760de50864SBram Moolenaar        \ .. ' BCALL char2nr(argc 1).*'
6770de50864SBram Moolenaar        \ .. 'Test_disassembleNew().*'
6780de50864SBram Moolenaar        \ .. ' DCALL Test_disassembleNew(argc 0).*'
6790de50864SBram Moolenaar        \ .. 'FuncWithArg(343).*'
6800de50864SBram Moolenaar        \ .. ' PUSHNR 343.*'
6810de50864SBram Moolenaar        \ .. ' DCALL FuncWithArg(argc 1).*'
6820de50864SBram Moolenaar        \ .. 'UserFunc().*'
6830de50864SBram Moolenaar        \ .. ' UCALL UserFunc(argc 0).*'
6840de50864SBram Moolenaar        \ .. 'UserFuncWithArg("foo").*'
6850de50864SBram Moolenaar        \ .. ' PUSHS "foo".*'
6860de50864SBram Moolenaar        \ .. ' UCALL UserFuncWithArg(argc 1).*'
6870de50864SBram Moolenaar        \ .. 'let FuncRef = function("UserFunc").*'
6880de50864SBram Moolenaar        \ .. 'FuncRef().*'
6890de50864SBram Moolenaar        \ .. ' LOAD $\d.*'
6900de50864SBram Moolenaar        \ .. ' PCALL (argc 0).*'
6910de50864SBram Moolenaar        \ .. 'let FuncRefWithArg = function("UserFuncWithArg").*'
6920de50864SBram Moolenaar        \ .. 'FuncRefWithArg("bar").*'
6930de50864SBram Moolenaar        \ .. ' PUSHS "bar".*'
6940de50864SBram Moolenaar        \ .. ' LOAD $\d.*'
6950de50864SBram Moolenaar        \ .. ' PCALL (argc 1).*'
6960de50864SBram Moolenaar        \ .. 'return "yes".*'
6970de50864SBram Moolenaar        \ .. ' PUSHS "yes".*'
6980de50864SBram Moolenaar        \ .. ' RETURN.*'
6990de50864SBram Moolenaar        \, res)
7000de50864SBram Moolenaarenddef
7010de50864SBram Moolenaar
7028a7d6542SBram Moolenaar
7038a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
704