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
30*6e587dcbSBram Moolenaarlet s:appendToMe = 'xxx'
31*6e587dcbSBram Moolenaarlet s:addToMe = 111
32*6e587dcbSBram 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'
50*6e587dcbSBram Moolenaar  assert_equal('abc', v:char)
51b283a8a6SBram Moolenaar
52b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
53*6e587dcbSBram Moolenaar  assert_equal('foobar', $ENVVAR)
54b283a8a6SBram Moolenaar  $ENVVAR = ''
55*6e587dcbSBram Moolenaar
56*6e587dcbSBram Moolenaar  appendToMe ..= 'yyy'
57*6e587dcbSBram Moolenaar  assert_equal('xxxyyy', appendToMe)
58*6e587dcbSBram Moolenaar  addToMe += 222
59*6e587dcbSBram 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
14226e117e9SBram Moolenaar"def Test_call_func_defined_later()
14326e117e9SBram Moolenaar"  call assert_equal('one', DefineLater('one'))
14426e117e9SBram Moolenaar"  call assert_fails('call NotDefined("one")', 'E99:')
14526e117e9SBram Moolenaar"enddef
14626e117e9SBram Moolenaar
14726e117e9SBram Moolenaarfunc DefineLater(arg)
14826e117e9SBram Moolenaar  return a:arg
14926e117e9SBram Moolenaarendfunc
15026e117e9SBram Moolenaar
15126e117e9SBram Moolenaardef MyDefaultArgs(name = 'string'): string
15226e117e9SBram Moolenaar  return name
15326e117e9SBram Moolenaarenddef
15426e117e9SBram Moolenaar
15526e117e9SBram Moolenaarfunc Test_call_default_args_from_func()
15626e117e9SBram Moolenaar  " TODO: implement using default value for optional argument
15726e117e9SBram Moolenaar  "call assert_equal('string', MyDefaultArgs())
15826e117e9SBram Moolenaar  call assert_fails('call MyDefaultArgs()', 'optional arguments not implemented yet')
15926e117e9SBram Moolenaar  call assert_equal('one', MyDefaultArgs('one'))
16026e117e9SBram Moolenaar  call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
16126e117e9SBram Moolenaarendfunc
16226e117e9SBram Moolenaar
16326e117e9SBram Moolenaardef Test_call_default_args()
16426e117e9SBram Moolenaar  " TODO: implement using default value for optional argument
16526e117e9SBram Moolenaar  "assert_equal('string', MyDefaultArgs())
16626e117e9SBram Moolenaar  assert_equal('one', MyDefaultArgs('one'))
16726e117e9SBram Moolenaar  assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
16826e117e9SBram Moolenaarenddef
16926e117e9SBram Moolenaar
1708a7d6542SBram Moolenaardef Test_return_type_wrong()
171978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
172978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
173978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
174978d170bSBram Moolenaar  CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
1758a7d6542SBram Moolenaarenddef
1768a7d6542SBram Moolenaar
177bfe12043SBram Moolenaardef Test_arg_type_wrong()
178bfe12043SBram Moolenaar  CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
179bfe12043SBram Moolenaarenddef
180bfe12043SBram Moolenaar
1818a7d6542SBram Moolenaardef Test_try_catch()
1828a7d6542SBram Moolenaar  let l = []
1838a7d6542SBram Moolenaar  try
1848a7d6542SBram Moolenaar    add(l, '1')
1858a7d6542SBram Moolenaar    throw 'wrong'
1868a7d6542SBram Moolenaar    add(l, '2')
1878a7d6542SBram Moolenaar  catch
1888a7d6542SBram Moolenaar    add(l, v:exception)
1898a7d6542SBram Moolenaar  finally
1908a7d6542SBram Moolenaar    add(l, '3')
1918a7d6542SBram Moolenaar  endtry
1928a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
1938a7d6542SBram Moolenaarenddef
1948a7d6542SBram Moolenaar
1958a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
1968a7d6542SBram Moolenaar  vim9script
1978a7d6542SBram Moolenaar  let name: string = 'bob'
1988a7d6542SBram Moolenaar  def Concat(arg: string): string
1998a7d6542SBram Moolenaar    return name .. arg
2008a7d6542SBram Moolenaar  enddef
2018a7d6542SBram Moolenaar  let g:result = Concat('bie')
2028a7d6542SBram Moolenaar  let g:localname = name
2038a7d6542SBram Moolenaar
2048a7d6542SBram Moolenaar  export const CONST = 1234
2058a7d6542SBram Moolenaar  export let exported = 9876
206*6e587dcbSBram Moolenaar  export let exp_name = 'John'
2078a7d6542SBram Moolenaar  export def Exported(): string
2088a7d6542SBram Moolenaar    return 'Exported'
2098a7d6542SBram Moolenaar  enddef
2108a7d6542SBram MoolenaarEND
2118a7d6542SBram Moolenaar
2128a7d6542SBram Moolenaardef Test_vim9script()
2138a7d6542SBram Moolenaar  let import_script_lines =<< trim END
2148a7d6542SBram Moolenaar    vim9script
2158a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
2168a7d6542SBram Moolenaar    g:imported = exported
217*6e587dcbSBram Moolenaar    exported += 3
218*6e587dcbSBram Moolenaar    g:imported_added = exported
2198a7d6542SBram Moolenaar    g:imported_func = Exported()
220*6e587dcbSBram Moolenaar
221*6e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
222*6e587dcbSBram Moolenaar    g:imported_name = exp_name
223*6e587dcbSBram Moolenaar    exp_name ..= ' Doe'
224*6e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
2258a7d6542SBram Moolenaar  END
2268a7d6542SBram Moolenaar
2278a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
2288a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
2298a7d6542SBram Moolenaar
2308a7d6542SBram Moolenaar  source Ximport.vim
2318a7d6542SBram Moolenaar
2328a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
2338a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
2348a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
235*6e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
2368a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
237*6e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
238*6e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
2398a7d6542SBram Moolenaar  assert_false(exists('g:name'))
2408a7d6542SBram Moolenaar
2418a7d6542SBram Moolenaar  unlet g:result
2428a7d6542SBram Moolenaar  unlet g:localname
2438a7d6542SBram Moolenaar  unlet g:imported
244*6e587dcbSBram Moolenaar  unlet g:imported_added
2458a7d6542SBram Moolenaar  unlet g:imported_func
246*6e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
2478a7d6542SBram Moolenaar  delete('Ximport.vim')
2488a7d6542SBram Moolenaar  delete('Xexport.vim')
2498a7d6542SBram Moolenaar
2508a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
2518a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
2528a7d6542SBram Moolenaarenddef
2538a7d6542SBram Moolenaar
2548a7d6542SBram Moolenaardef Test_vim9script_call()
2558a7d6542SBram Moolenaar  let lines =<< trim END
2568a7d6542SBram Moolenaar    vim9script
2578a7d6542SBram Moolenaar    let var = ''
2588a7d6542SBram Moolenaar    def MyFunc(arg: string)
2598a7d6542SBram Moolenaar       var = arg
2608a7d6542SBram Moolenaar    enddef
2618a7d6542SBram Moolenaar    MyFunc('foobar')
2628a7d6542SBram Moolenaar    assert_equal('foobar', var)
2638a7d6542SBram Moolenaar
2648a7d6542SBram Moolenaar    let str = 'barfoo'
2658a7d6542SBram Moolenaar    str->MyFunc()
2668a7d6542SBram Moolenaar    assert_equal('barfoo', var)
2678a7d6542SBram Moolenaar
2688a7d6542SBram Moolenaar    let g:value = 'value'
2698a7d6542SBram Moolenaar    g:value->MyFunc()
2708a7d6542SBram Moolenaar    assert_equal('value', var)
2718a7d6542SBram Moolenaar
2728a7d6542SBram Moolenaar    let listvar = []
2738a7d6542SBram Moolenaar    def ListFunc(arg: list<number>)
2748a7d6542SBram Moolenaar       listvar = arg
2758a7d6542SBram Moolenaar    enddef
2768a7d6542SBram Moolenaar    [1, 2, 3]->ListFunc()
2778a7d6542SBram Moolenaar    assert_equal([1, 2, 3], listvar)
2788a7d6542SBram Moolenaar
2798a7d6542SBram Moolenaar    let dictvar = {}
2808a7d6542SBram Moolenaar    def DictFunc(arg: dict<number>)
2818a7d6542SBram Moolenaar       dictvar = arg
2828a7d6542SBram Moolenaar    enddef
2838a7d6542SBram Moolenaar    {'a': 1, 'b': 2}->DictFunc()
2848a7d6542SBram Moolenaar    assert_equal(#{a: 1, b: 2}, dictvar)
2858a7d6542SBram Moolenaar    #{a: 3, b: 4}->DictFunc()
2868a7d6542SBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
2878a7d6542SBram Moolenaar  END
2888a7d6542SBram Moolenaar  writefile(lines, 'Xcall.vim')
2898a7d6542SBram Moolenaar  source Xcall.vim
2908a7d6542SBram Moolenaar  delete('Xcall.vim')
2918a7d6542SBram Moolenaarenddef
2928a7d6542SBram Moolenaar
2938a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl()
2948a7d6542SBram Moolenaar  let lines =<< trim END
2958a7d6542SBram Moolenaar    vim9script
2968a7d6542SBram Moolenaar    let var = ''
2978a7d6542SBram Moolenaar    def MyFunc(arg: string)
2988a7d6542SBram Moolenaar       let var = 123
2998a7d6542SBram Moolenaar    enddef
3008a7d6542SBram Moolenaar  END
3018a7d6542SBram Moolenaar  writefile(lines, 'Xcall_decl.vim')
3028a7d6542SBram Moolenaar  assert_fails('source Xcall_decl.vim', 'E1054:')
3038a7d6542SBram Moolenaar  delete('Xcall_decl.vim')
3048a7d6542SBram Moolenaarenddef
3058a7d6542SBram Moolenaar
3068a7d6542SBram Moolenaardef Test_vim9script_call_fail_const()
3078a7d6542SBram Moolenaar  let lines =<< trim END
3088a7d6542SBram Moolenaar    vim9script
3098a7d6542SBram Moolenaar    const var = ''
3108a7d6542SBram Moolenaar    def MyFunc(arg: string)
3118a7d6542SBram Moolenaar       var = 'asdf'
3128a7d6542SBram Moolenaar    enddef
3138a7d6542SBram Moolenaar  END
3148a7d6542SBram Moolenaar  writefile(lines, 'Xcall_const.vim')
3158a7d6542SBram Moolenaar  assert_fails('source Xcall_const.vim', 'E46:')
3168a7d6542SBram Moolenaar  delete('Xcall_const.vim')
3178a7d6542SBram Moolenaarenddef
3188a7d6542SBram Moolenaar
3198a7d6542SBram Moolenaardef Test_vim9script_reload()
3208a7d6542SBram Moolenaar  let lines =<< trim END
3218a7d6542SBram Moolenaar    vim9script
3228a7d6542SBram Moolenaar    const var = ''
3238a7d6542SBram Moolenaar    let valone = 1234
3248a7d6542SBram Moolenaar    def MyFunc(arg: string)
3258a7d6542SBram Moolenaar       valone = 5678
3268a7d6542SBram Moolenaar    enddef
3278a7d6542SBram Moolenaar  END
3288a7d6542SBram Moolenaar  let morelines =<< trim END
3298a7d6542SBram Moolenaar    let valtwo = 222
3308a7d6542SBram Moolenaar    export def GetValtwo(): number
3318a7d6542SBram Moolenaar      return valtwo
3328a7d6542SBram Moolenaar    enddef
3338a7d6542SBram Moolenaar  END
3348a7d6542SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
3358a7d6542SBram Moolenaar  source Xreload.vim
3368a7d6542SBram Moolenaar  source Xreload.vim
3378a7d6542SBram Moolenaar  source Xreload.vim
3388a7d6542SBram Moolenaar
3398a7d6542SBram Moolenaar  let testlines =<< trim END
3408a7d6542SBram Moolenaar    vim9script
3418a7d6542SBram Moolenaar    def TheFunc()
3428a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
3438a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
3448a7d6542SBram Moolenaar    enddef
3458a7d6542SBram Moolenaar    TheFunc()
3468a7d6542SBram Moolenaar  END
3478a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
3488a7d6542SBram Moolenaar  source Ximport.vim
3498a7d6542SBram Moolenaar
3508a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
3518a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
3528a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
3538a7d6542SBram Moolenaar  source Xreload.vim
3548a7d6542SBram Moolenaar  source Ximport.vim
3558a7d6542SBram Moolenaar
3568a7d6542SBram Moolenaar  " cannot declare a var twice
3578a7d6542SBram Moolenaar  lines =<< trim END
3588a7d6542SBram Moolenaar    vim9script
3598a7d6542SBram Moolenaar    let valone = 1234
3608a7d6542SBram Moolenaar    let valone = 5678
3618a7d6542SBram Moolenaar  END
3628a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
3638a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
3648a7d6542SBram Moolenaar
3658a7d6542SBram Moolenaar  delete('Xreload.vim')
3668a7d6542SBram Moolenaar  delete('Ximport.vim')
3678a7d6542SBram Moolenaarenddef
3688a7d6542SBram Moolenaar
3698a7d6542SBram Moolenaardef Test_import_absolute()
3708a7d6542SBram Moolenaar  let import_lines = [
3718a7d6542SBram Moolenaar        \ 'vim9script',
3728a7d6542SBram Moolenaar        \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
373b283a8a6SBram Moolenaar        \ 'def UseExported()',
3748a7d6542SBram Moolenaar        \ '  g:imported_abs = exported',
3754e12a5dfSBram Moolenaar        \ '  exported = 8888',
3764e12a5dfSBram Moolenaar        \ '  g:imported_after = exported',
377b283a8a6SBram Moolenaar        \ 'enddef',
378b283a8a6SBram Moolenaar        \ 'UseExported()',
3794e12a5dfSBram Moolenaar        \ 'g:import_disassembled = execute("disass UseExported")',
3808a7d6542SBram Moolenaar        \ ]
3818a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
3828a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
3838a7d6542SBram Moolenaar
3848a7d6542SBram Moolenaar  source Ximport_abs.vim
3858a7d6542SBram Moolenaar
3868a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
3874e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
388b283a8a6SBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*'
389b283a8a6SBram Moolenaar        \ .. 'g:imported_abs = exported.*'
390b283a8a6SBram Moolenaar        \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
3914e12a5dfSBram Moolenaar        \ .. '1 STOREG g:imported_abs.*'
3924e12a5dfSBram Moolenaar        \ .. 'exported = 8888.*'
3934e12a5dfSBram Moolenaar        \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
3944e12a5dfSBram Moolenaar        \ .. 'g:imported_after = exported.*'
3954e12a5dfSBram Moolenaar        \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
3964e12a5dfSBram Moolenaar        \ .. '5 STOREG g:imported_after.*'
3974e12a5dfSBram Moolenaar        \, g:import_disassembled)
3988a7d6542SBram Moolenaar  unlet g:imported_abs
3994e12a5dfSBram Moolenaar  unlet g:import_disassembled
4008a7d6542SBram Moolenaar
4018a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
4028a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
4038a7d6542SBram Moolenaarenddef
4048a7d6542SBram Moolenaar
4058a7d6542SBram Moolenaardef Test_import_rtp()
4068a7d6542SBram Moolenaar  let import_lines = [
4078a7d6542SBram Moolenaar        \ 'vim9script',
4088a7d6542SBram Moolenaar        \ 'import exported from "Xexport_rtp.vim"',
4098a7d6542SBram Moolenaar        \ 'g:imported_rtp = exported',
4108a7d6542SBram Moolenaar        \ ]
4118a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
4128a7d6542SBram Moolenaar  mkdir('import')
4138a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
4148a7d6542SBram Moolenaar
4158a7d6542SBram Moolenaar  let save_rtp = &rtp
4168a7d6542SBram Moolenaar  &rtp = getcwd()
4178a7d6542SBram Moolenaar  source Ximport_rtp.vim
4188a7d6542SBram Moolenaar  &rtp = save_rtp
4198a7d6542SBram Moolenaar
4208a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
4218a7d6542SBram Moolenaar  unlet g:imported_rtp
4228a7d6542SBram Moolenaar
4238a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
4248a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
4258a7d6542SBram Moolenaar  delete('import', 'd')
4268a7d6542SBram Moolenaarenddef
4278a7d6542SBram Moolenaar
4288a7d6542SBram Moolenaardef Test_fixed_size_list()
4298a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
4308a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
4318a7d6542SBram Moolenaar  l->remove(0)
4328a7d6542SBram Moolenaar  l->add(5)
4338a7d6542SBram Moolenaar  l->insert(99, 1)
4340f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
4358a7d6542SBram Moolenaarenddef
4368a7d6542SBram Moolenaar
437673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not
438673660abSBram Moolenaar" recognized.
439673660abSBram Moolenaarfunc Test_function_python()
440673660abSBram Moolenaar  CheckFeature python3
441673660abSBram Moolenaar  let py = 'python3'
442673660abSBram Moolenaar  execute py "<< EOF"
443673660abSBram Moolenaardef do_something():
444673660abSBram Moolenaar  return 1
445673660abSBram MoolenaarEOF
446673660abSBram Moolenaarendfunc
447673660abSBram Moolenaar
448a259d8d3SBram Moolenaardef HasEval()
449a259d8d3SBram Moolenaar  if has('eval')
450a259d8d3SBram Moolenaar    echo 'yes'
451a259d8d3SBram Moolenaar  else
452a259d8d3SBram Moolenaar    echo 'no'
453a259d8d3SBram Moolenaar  endif
454a259d8d3SBram Moolenaarenddef
455a259d8d3SBram Moolenaar
456a259d8d3SBram Moolenaardef HasNothing()
457a259d8d3SBram Moolenaar  if has('nothing')
458a259d8d3SBram Moolenaar    echo 'yes'
459a259d8d3SBram Moolenaar  else
460a259d8d3SBram Moolenaar    echo 'no'
461a259d8d3SBram Moolenaar  endif
462a259d8d3SBram Moolenaarenddef
463a259d8d3SBram Moolenaar
464a259d8d3SBram Moolenaardef Test_compile_const_expr()
465a259d8d3SBram Moolenaar  assert_equal("\nyes", execute('call HasEval()'))
466a259d8d3SBram Moolenaar  let instr = execute('disassemble HasEval')
4670f18b6d1SBram Moolenaar  assert_match('PUSHS "yes"', instr)
4680f18b6d1SBram Moolenaar  assert_notmatch('PUSHS "no"', instr)
4690f18b6d1SBram Moolenaar  assert_notmatch('JUMP', instr)
470a259d8d3SBram Moolenaar
471a259d8d3SBram Moolenaar  assert_equal("\nno", execute('call HasNothing()'))
472a259d8d3SBram Moolenaar  instr = execute('disassemble HasNothing')
4730f18b6d1SBram Moolenaar  assert_notmatch('PUSHS "yes"', instr)
4740f18b6d1SBram Moolenaar  assert_match('PUSHS "no"', instr)
4750f18b6d1SBram Moolenaar  assert_notmatch('JUMP', instr)
4760f18b6d1SBram Moolenaarenddef
4770f18b6d1SBram Moolenaar
4780f18b6d1SBram Moolenaarfunc NotCompiled()
4790f18b6d1SBram Moolenaar  echo "not"
4800f18b6d1SBram Moolenaarendfunc
4810f18b6d1SBram Moolenaar
4820f18b6d1SBram Moolenaarlet s:scriptvar = 4
4830f18b6d1SBram Moolenaarlet g:globalvar = 'g'
4840f18b6d1SBram Moolenaar
485b283a8a6SBram Moolenaardef s:ScriptFuncLoad(arg: string)
4860f18b6d1SBram Moolenaar  let local = 1
4870f18b6d1SBram Moolenaar  buffers
4880f18b6d1SBram Moolenaar  echo arg
4890f18b6d1SBram Moolenaar  echo local
4900f18b6d1SBram Moolenaar  echo v:version
4910f18b6d1SBram Moolenaar  echo s:scriptvar
4920f18b6d1SBram Moolenaar  echo g:globalvar
4930f18b6d1SBram Moolenaar  echo &tabstop
4940f18b6d1SBram Moolenaar  echo $ENVVAR
4950f18b6d1SBram Moolenaar  echo @z
4960f18b6d1SBram Moolenaarenddef
4970f18b6d1SBram Moolenaar
4980de50864SBram Moolenaardef Test_disassembleLoad()
4990de50864SBram Moolenaar  assert_fails('disass NoFunc', 'E1061:')
5000de50864SBram Moolenaar  assert_fails('disass NotCompiled', 'E1062:')
5010de50864SBram Moolenaar
5020de50864SBram Moolenaar  let res = execute('disass s:ScriptFuncLoad')
5030de50864SBram Moolenaar  assert_match('<SNR>\d*_ScriptFuncLoad.*'
5040de50864SBram Moolenaar        \ .. 'buffers.*'
5050de50864SBram Moolenaar        \ .. ' EXEC \+buffers.*'
5060de50864SBram Moolenaar        \ .. ' LOAD arg\[-1\].*'
5070de50864SBram Moolenaar        \ .. ' LOAD $0.*'
5080de50864SBram Moolenaar        \ .. ' LOADV v:version.*'
5090de50864SBram Moolenaar        \ .. ' LOADS s:scriptvar from .*test_vim9_script.vim.*'
5100de50864SBram Moolenaar        \ .. ' LOADG g:globalvar.*'
5110de50864SBram Moolenaar        \ .. ' LOADENV $ENVVAR.*'
5120de50864SBram Moolenaar        \ .. ' LOADREG @z.*'
5130de50864SBram Moolenaar        \, res)
5140de50864SBram Moolenaarenddef
5150de50864SBram Moolenaar
516ff80cb68SBram Moolenaardef s:ScriptFuncPush()
517ff80cb68SBram Moolenaar  let localbool = true
518ff80cb68SBram Moolenaar  let localspec = v:none
519ff80cb68SBram Moolenaar  let localblob = 0z1234
520ff80cb68SBram Moolenaar  if has('float')
521ff80cb68SBram Moolenaar    let localfloat = 1.234
522ff80cb68SBram Moolenaar  endif
523ff80cb68SBram Moolenaarenddef
524ff80cb68SBram Moolenaar
5250de50864SBram Moolenaardef Test_disassemblePush()
5260de50864SBram Moolenaar  let res = execute('disass s:ScriptFuncPush')
5270de50864SBram Moolenaar  assert_match('<SNR>\d*_ScriptFuncPush.*'
5280de50864SBram Moolenaar        \ .. 'localbool = true.*'
5290de50864SBram Moolenaar        \ .. ' PUSH v:true.*'
5300de50864SBram Moolenaar        \ .. 'localspec = v:none.*'
5310de50864SBram Moolenaar        \ .. ' PUSH v:none.*'
5320de50864SBram Moolenaar        \ .. 'localblob = 0z1234.*'
5330de50864SBram Moolenaar        \ .. ' PUSHBLOB 0z1234.*'
5340de50864SBram Moolenaar        \, res)
5350de50864SBram Moolenaar  if has('float')
5360de50864SBram Moolenaar  assert_match('<SNR>\d*_ScriptFuncPush.*'
5370de50864SBram Moolenaar        \ .. 'localfloat = 1.234.*'
5380de50864SBram Moolenaar        \ .. ' PUSHF 1.234.*'
5390de50864SBram Moolenaar        \, res)
5400de50864SBram Moolenaar  endif
5410de50864SBram Moolenaarenddef
5420de50864SBram Moolenaar
543b283a8a6SBram Moolenaardef s:ScriptFuncStore()
544b283a8a6SBram Moolenaar  let localnr = 1
545b283a8a6SBram Moolenaar  localnr = 2
546b283a8a6SBram Moolenaar  let localstr = 'abc'
547b283a8a6SBram Moolenaar  localstr = 'xyz'
548b283a8a6SBram Moolenaar  v:char = 'abc'
549b283a8a6SBram Moolenaar  s:scriptvar = 'sv'
550b283a8a6SBram Moolenaar  g:globalvar = 'gv'
551b283a8a6SBram Moolenaar  &tabstop = 8
552b283a8a6SBram Moolenaar  $ENVVAR = 'ev'
553b283a8a6SBram Moolenaar  @z = 'rv'
554b283a8a6SBram Moolenaarenddef
555b283a8a6SBram Moolenaar
5560de50864SBram Moolenaardef Test_disassembleStore()
5570de50864SBram Moolenaar  let res = execute('disass s:ScriptFuncStore')
558b283a8a6SBram Moolenaar  assert_match('<SNR>\d*_ScriptFuncStore.*'
559b283a8a6SBram Moolenaar        \ .. 'localnr = 2.*'
560b283a8a6SBram Moolenaar        \ .. ' STORE 2 in $0.*'
561b283a8a6SBram Moolenaar        \ .. 'localstr = ''xyz''.*'
562b283a8a6SBram Moolenaar        \ .. ' STORE $1.*'
563b283a8a6SBram Moolenaar        \ .. 'v:char = ''abc''.*'
564b283a8a6SBram Moolenaar        \ .. 'STOREV v:char.*'
565b283a8a6SBram Moolenaar        \ .. 's:scriptvar = ''sv''.*'
566b283a8a6SBram Moolenaar        \ .. ' STORES s:scriptvar in .*test_vim9_script.vim.*'
567b283a8a6SBram Moolenaar        \ .. 'g:globalvar = ''gv''.*'
568b283a8a6SBram Moolenaar        \ .. ' STOREG g:globalvar.*'
569b283a8a6SBram Moolenaar        \ .. '&tabstop = 8.*'
570b283a8a6SBram Moolenaar        \ .. ' STOREOPT &tabstop.*'
571b283a8a6SBram Moolenaar        \ .. '$ENVVAR = ''ev''.*'
572b283a8a6SBram Moolenaar        \ .. ' STOREENV $ENVVAR.*'
573b283a8a6SBram Moolenaar        \ .. '@z = ''rv''.*'
574b283a8a6SBram Moolenaar        \ .. ' STOREREG @z.*'
575b283a8a6SBram Moolenaar        \, res)
5760de50864SBram Moolenaarenddef
577ff80cb68SBram Moolenaar
5780de50864SBram Moolenaardef s:ScriptFuncTry()
5790de50864SBram Moolenaar  try
5800de50864SBram Moolenaar    echo 'yes'
5810de50864SBram Moolenaar  catch /fail/
5820de50864SBram Moolenaar    echo 'no'
5830de50864SBram Moolenaar  finally
5840de50864SBram Moolenaar    echo 'end'
5850de50864SBram Moolenaar  endtry
5860de50864SBram Moolenaarenddef
5870de50864SBram Moolenaar
5880de50864SBram Moolenaardef Test_disassembleTry()
5890de50864SBram Moolenaar  let res = execute('disass s:ScriptFuncTry')
590ff80cb68SBram Moolenaar  assert_match('<SNR>\d*_ScriptFuncTry.*'
591ff80cb68SBram Moolenaar        \ .. 'try.*'
592ff80cb68SBram Moolenaar        \ .. 'TRY catch -> \d\+, finally -> \d\+.*'
593ff80cb68SBram Moolenaar        \ .. 'catch /fail/.*'
594ff80cb68SBram Moolenaar        \ .. ' JUMP -> \d\+.*'
595ff80cb68SBram Moolenaar        \ .. ' PUSH v:exception.*'
596ff80cb68SBram Moolenaar        \ .. ' PUSHS "fail".*'
597ff80cb68SBram Moolenaar        \ .. ' COMPARESTRING =\~.*'
598ff80cb68SBram Moolenaar        \ .. ' JUMP_IF_FALSE -> \d\+.*'
599ff80cb68SBram Moolenaar        \ .. ' CATCH.*'
600ff80cb68SBram Moolenaar        \ .. 'finally.*'
601ff80cb68SBram Moolenaar        \ .. ' PUSHS "end".*'
602ff80cb68SBram Moolenaar        \ .. 'endtry.*'
603ff80cb68SBram Moolenaar        \ .. ' ENDTRY.*'
604ff80cb68SBram Moolenaar        \, res)
605a259d8d3SBram Moolenaarenddef
606a259d8d3SBram Moolenaar
6070de50864SBram Moolenaardef s:ScriptFuncNew()
6080de50864SBram Moolenaar  let ll = [1, "two", 333]
6090de50864SBram Moolenaar  let dd = #{one: 1, two: "val"}
6100de50864SBram Moolenaarenddef
6110de50864SBram Moolenaar
6120de50864SBram Moolenaardef Test_disassembleNew()
6130de50864SBram Moolenaar  let res = execute('disass s:ScriptFuncNew')
6140de50864SBram Moolenaar  assert_match('<SNR>\d*_ScriptFuncNew.*'
6150de50864SBram Moolenaar        \ .. 'let ll = \[1, "two", 333].*'
6160de50864SBram Moolenaar        \ .. 'PUSHNR 1.*'
6170de50864SBram Moolenaar        \ .. 'PUSHS "two".*'
6180de50864SBram Moolenaar        \ .. 'PUSHNR 333.*'
6190de50864SBram Moolenaar        \ .. 'NEWLIST size 3.*'
6200de50864SBram Moolenaar        \ .. 'let dd = #{one: 1, two: "val"}.*'
6210de50864SBram Moolenaar        \ .. 'PUSHS "one".*'
6220de50864SBram Moolenaar        \ .. 'PUSHNR 1.*'
6230de50864SBram Moolenaar        \ .. 'PUSHS "two".*'
6240de50864SBram Moolenaar        \ .. 'PUSHS "val".*'
6250de50864SBram Moolenaar        \ .. 'NEWDICT size 2.*'
6260de50864SBram Moolenaar        \, res)
6270de50864SBram Moolenaarenddef
6280de50864SBram Moolenaar
6290de50864SBram Moolenaardef FuncWithArg(arg)
6300de50864SBram Moolenaar  echo arg
6310de50864SBram Moolenaarenddef
6320de50864SBram Moolenaar
6330de50864SBram Moolenaarfunc UserFunc()
6340de50864SBram Moolenaar  echo 'nothing'
6350de50864SBram Moolenaarendfunc
6360de50864SBram Moolenaar
6370de50864SBram Moolenaarfunc UserFuncWithArg(arg)
6380de50864SBram Moolenaar  echo a:arg
6390de50864SBram Moolenaarendfunc
6400de50864SBram Moolenaar
6410de50864SBram Moolenaardef s:ScriptFuncCall(): string
6420de50864SBram Moolenaar  changenr()
6430de50864SBram Moolenaar  char2nr("abc")
6440de50864SBram Moolenaar  Test_disassembleNew()
6450de50864SBram Moolenaar  FuncWithArg(343)
6460de50864SBram Moolenaar  UserFunc()
6470de50864SBram Moolenaar  UserFuncWithArg("foo")
6480de50864SBram Moolenaar  let FuncRef = function("UserFunc")
6490de50864SBram Moolenaar  FuncRef()
6500de50864SBram Moolenaar  let FuncRefWithArg = function("UserFuncWithArg")
6510de50864SBram Moolenaar  FuncRefWithArg("bar")
6520de50864SBram Moolenaar  return "yes"
6530de50864SBram Moolenaarenddef
6540de50864SBram Moolenaar
6550de50864SBram Moolenaardef Test_disassembleCall()
6560de50864SBram Moolenaar  let res = execute('disass s:ScriptFuncCall')
6570de50864SBram Moolenaar  assert_match('<SNR>\d*_ScriptFuncCall.*'
6580de50864SBram Moolenaar        \ .. 'changenr().*'
6590de50864SBram Moolenaar        \ .. ' BCALL changenr(argc 0).*'
6600de50864SBram Moolenaar        \ .. 'char2nr("abc").*'
6610de50864SBram Moolenaar        \ .. ' PUSHS "abc".*'
6620de50864SBram Moolenaar        \ .. ' BCALL char2nr(argc 1).*'
6630de50864SBram Moolenaar        \ .. 'Test_disassembleNew().*'
6640de50864SBram Moolenaar        \ .. ' DCALL Test_disassembleNew(argc 0).*'
6650de50864SBram Moolenaar        \ .. 'FuncWithArg(343).*'
6660de50864SBram Moolenaar        \ .. ' PUSHNR 343.*'
6670de50864SBram Moolenaar        \ .. ' DCALL FuncWithArg(argc 1).*'
6680de50864SBram Moolenaar        \ .. 'UserFunc().*'
6690de50864SBram Moolenaar        \ .. ' UCALL UserFunc(argc 0).*'
6700de50864SBram Moolenaar        \ .. 'UserFuncWithArg("foo").*'
6710de50864SBram Moolenaar        \ .. ' PUSHS "foo".*'
6720de50864SBram Moolenaar        \ .. ' UCALL UserFuncWithArg(argc 1).*'
6730de50864SBram Moolenaar        \ .. 'let FuncRef = function("UserFunc").*'
6740de50864SBram Moolenaar        \ .. 'FuncRef().*'
6750de50864SBram Moolenaar        \ .. ' LOAD $\d.*'
6760de50864SBram Moolenaar        \ .. ' PCALL (argc 0).*'
6770de50864SBram Moolenaar        \ .. 'let FuncRefWithArg = function("UserFuncWithArg").*'
6780de50864SBram Moolenaar        \ .. 'FuncRefWithArg("bar").*'
6790de50864SBram Moolenaar        \ .. ' PUSHS "bar".*'
6800de50864SBram Moolenaar        \ .. ' LOAD $\d.*'
6810de50864SBram Moolenaar        \ .. ' PCALL (argc 1).*'
6820de50864SBram Moolenaar        \ .. 'return "yes".*'
6830de50864SBram Moolenaar        \ .. ' PUSHS "yes".*'
6840de50864SBram Moolenaar        \ .. ' RETURN.*'
6850de50864SBram Moolenaar        \, res)
6860de50864SBram Moolenaarenddef
6870de50864SBram Moolenaar
6888a7d6542SBram Moolenaar
6898a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
690