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
308a7d6542SBram Moolenaardef Test_assignment()
318a7d6542SBram Moolenaar  let bool1: bool = true
328a7d6542SBram Moolenaar  assert_equal(v:true, bool1)
338a7d6542SBram Moolenaar  let bool2: bool = false
348a7d6542SBram Moolenaar  assert_equal(v:false, bool2)
358a7d6542SBram Moolenaar
368a7d6542SBram Moolenaar  let list1: list<string> = ['sdf', 'asdf']
378a7d6542SBram Moolenaar  let list2: list<number> = [1, 2, 3]
388a7d6542SBram Moolenaar
398a7d6542SBram Moolenaar  " TODO: does not work yet
408a7d6542SBram Moolenaar  " let listS: list<string> = []
418a7d6542SBram Moolenaar  " let listN: list<number> = []
428a7d6542SBram Moolenaar
438a7d6542SBram Moolenaar  let dict1: dict<string> = #{key: 'value'}
448a7d6542SBram Moolenaar  let dict2: dict<number> = #{one: 1, two: 2}
45b283a8a6SBram Moolenaar
46b283a8a6SBram Moolenaar  v:char = 'abc'
47b283a8a6SBram Moolenaar  call assert_equal('abc', v:char)
48b283a8a6SBram Moolenaar
49b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
50b283a8a6SBram Moolenaar  call assert_equal('foobar', $ENVVAR)
51b283a8a6SBram Moolenaar  $ENVVAR = ''
528a7d6542SBram Moolenaarenddef
538a7d6542SBram Moolenaar
548a7d6542SBram Moolenaarfunc Test_assignment_failure()
558a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
568a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
578a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
588a7d6542SBram Moolenaar
598a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
608a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
618a7d6542SBram Moolenaar
628a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
638a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
648a7d6542SBram Moolenaar
658a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
668a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
678a7d6542SBram Moolenaar
688a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
698a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
708a7d6542SBram Moolenaarendfunc
718a7d6542SBram Moolenaar
728a7d6542SBram Moolenaarfunc Test_const()
738a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
748a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
758a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
768a7d6542SBram Moolenaarendfunc
778a7d6542SBram Moolenaar
788a7d6542SBram Moolenaardef Test_block()
798a7d6542SBram Moolenaar  let outer = 1
808a7d6542SBram Moolenaar  {
818a7d6542SBram Moolenaar    let inner = 2
828a7d6542SBram Moolenaar    assert_equal(1, outer)
838a7d6542SBram Moolenaar    assert_equal(2, inner)
848a7d6542SBram Moolenaar  }
858a7d6542SBram Moolenaar  assert_equal(1, outer)
868a7d6542SBram Moolenaarenddef
878a7d6542SBram Moolenaar
888a7d6542SBram Moolenaarfunc Test_block_failure()
898a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
908a7d6542SBram Moolenaarendfunc
918a7d6542SBram Moolenaar
928a7d6542SBram Moolenaardef ReturnString(): string
938a7d6542SBram Moolenaar  return 'string'
948a7d6542SBram Moolenaarenddef
958a7d6542SBram Moolenaar
968a7d6542SBram Moolenaardef ReturnNumber(): number
978a7d6542SBram Moolenaar  return 123
988a7d6542SBram Moolenaarenddef
998a7d6542SBram Moolenaar
1008a7d6542SBram Moolenaardef Test_return_string()
1018a7d6542SBram Moolenaar  assert_equal('string', ReturnString())
1028a7d6542SBram Moolenaar  assert_equal(123, ReturnNumber())
1038a7d6542SBram Moolenaarenddef
1048a7d6542SBram Moolenaar
1058a7d6542SBram Moolenaarfunc Increment()
1068a7d6542SBram Moolenaar  let g:counter += 1
1078a7d6542SBram Moolenaarendfunc
1088a7d6542SBram Moolenaar
1098a7d6542SBram Moolenaardef Test_call_ufunc_count()
1108a7d6542SBram Moolenaar  g:counter = 1
1118a7d6542SBram Moolenaar  Increment()
1128a7d6542SBram Moolenaar  Increment()
1138a7d6542SBram Moolenaar  Increment()
1148a7d6542SBram Moolenaar  " works with and without :call
1158a7d6542SBram Moolenaar  assert_equal(4, g:counter)
116b283a8a6SBram Moolenaar  call assert_equal(4, g:counter)
1178a7d6542SBram Moolenaar  unlet g:counter
1188a7d6542SBram Moolenaarenddef
1198a7d6542SBram Moolenaar
1208a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string
1218a7d6542SBram Moolenaar  let res = arg
1228a7d6542SBram Moolenaar  for s in rest
1238a7d6542SBram Moolenaar    res ..= ',' .. s
1248a7d6542SBram Moolenaar  endfor
1258a7d6542SBram Moolenaar  return res
1268a7d6542SBram Moolenaarenddef
1278a7d6542SBram Moolenaar
1288a7d6542SBram Moolenaardef Test_call_varargs()
1298a7d6542SBram Moolenaar  assert_equal('one', MyVarargs('one'))
1308a7d6542SBram Moolenaar  assert_equal('one,two', MyVarargs('one', 'two'))
1318a7d6542SBram Moolenaar  assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
1328a7d6542SBram Moolenaarenddef
1338a7d6542SBram Moolenaar
13426e117e9SBram Moolenaar"def Test_call_func_defined_later()
13526e117e9SBram Moolenaar"  call assert_equal('one', DefineLater('one'))
13626e117e9SBram Moolenaar"  call assert_fails('call NotDefined("one")', 'E99:')
13726e117e9SBram Moolenaar"enddef
13826e117e9SBram Moolenaar
13926e117e9SBram Moolenaarfunc DefineLater(arg)
14026e117e9SBram Moolenaar  return a:arg
14126e117e9SBram Moolenaarendfunc
14226e117e9SBram Moolenaar
14326e117e9SBram Moolenaardef MyDefaultArgs(name = 'string'): string
14426e117e9SBram Moolenaar  return name
14526e117e9SBram Moolenaarenddef
14626e117e9SBram Moolenaar
14726e117e9SBram Moolenaarfunc Test_call_default_args_from_func()
14826e117e9SBram Moolenaar  " TODO: implement using default value for optional argument
14926e117e9SBram Moolenaar  "call assert_equal('string', MyDefaultArgs())
15026e117e9SBram Moolenaar  call assert_fails('call MyDefaultArgs()', 'optional arguments not implemented yet')
15126e117e9SBram Moolenaar  call assert_equal('one', MyDefaultArgs('one'))
15226e117e9SBram Moolenaar  call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
15326e117e9SBram Moolenaarendfunc
15426e117e9SBram Moolenaar
15526e117e9SBram Moolenaardef Test_call_default_args()
15626e117e9SBram Moolenaar  " TODO: implement using default value for optional argument
15726e117e9SBram Moolenaar  "assert_equal('string', MyDefaultArgs())
15826e117e9SBram Moolenaar  assert_equal('one', MyDefaultArgs('one'))
15926e117e9SBram Moolenaar  assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
16026e117e9SBram Moolenaarenddef
16126e117e9SBram Moolenaar
1628a7d6542SBram Moolenaardef Test_return_type_wrong()
163978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
164978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
165978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
166978d170bSBram Moolenaar  CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
1678a7d6542SBram Moolenaarenddef
1688a7d6542SBram Moolenaar
169bfe12043SBram Moolenaardef Test_arg_type_wrong()
170bfe12043SBram Moolenaar  CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
171bfe12043SBram Moolenaarenddef
172bfe12043SBram Moolenaar
1738a7d6542SBram Moolenaardef Test_try_catch()
1748a7d6542SBram Moolenaar  let l = []
1758a7d6542SBram Moolenaar  try
1768a7d6542SBram Moolenaar    add(l, '1')
1778a7d6542SBram Moolenaar    throw 'wrong'
1788a7d6542SBram Moolenaar    add(l, '2')
1798a7d6542SBram Moolenaar  catch
1808a7d6542SBram Moolenaar    add(l, v:exception)
1818a7d6542SBram Moolenaar  finally
1828a7d6542SBram Moolenaar    add(l, '3')
1838a7d6542SBram Moolenaar  endtry
1848a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
1858a7d6542SBram Moolenaarenddef
1868a7d6542SBram Moolenaar
1878a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
1888a7d6542SBram Moolenaar  vim9script
1898a7d6542SBram Moolenaar  let name: string = 'bob'
1908a7d6542SBram Moolenaar  def Concat(arg: string): string
1918a7d6542SBram Moolenaar    return name .. arg
1928a7d6542SBram Moolenaar  enddef
1938a7d6542SBram Moolenaar  let g:result = Concat('bie')
1948a7d6542SBram Moolenaar  let g:localname = name
1958a7d6542SBram Moolenaar
1968a7d6542SBram Moolenaar  export const CONST = 1234
1978a7d6542SBram Moolenaar  export let exported = 9876
1988a7d6542SBram Moolenaar  export def Exported(): string
1998a7d6542SBram Moolenaar    return 'Exported'
2008a7d6542SBram Moolenaar  enddef
2018a7d6542SBram MoolenaarEND
2028a7d6542SBram Moolenaar
2038a7d6542SBram Moolenaardef Test_vim9script()
2048a7d6542SBram Moolenaar  let import_script_lines =<< trim END
2058a7d6542SBram Moolenaar    vim9script
2068a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
2078a7d6542SBram Moolenaar    g:imported = exported
2088a7d6542SBram Moolenaar    g:imported_func = Exported()
2098a7d6542SBram Moolenaar  END
2108a7d6542SBram Moolenaar
2118a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
2128a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
2138a7d6542SBram Moolenaar
2148a7d6542SBram Moolenaar  source Ximport.vim
2158a7d6542SBram Moolenaar
2168a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
2178a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
2188a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
2198a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
2208a7d6542SBram Moolenaar  assert_false(exists('g:name'))
2218a7d6542SBram Moolenaar
2228a7d6542SBram Moolenaar  unlet g:result
2238a7d6542SBram Moolenaar  unlet g:localname
2248a7d6542SBram Moolenaar  unlet g:imported
2258a7d6542SBram Moolenaar  unlet g:imported_func
2268a7d6542SBram Moolenaar  delete('Ximport.vim')
2278a7d6542SBram Moolenaar  delete('Xexport.vim')
2288a7d6542SBram Moolenaar
2298a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
2308a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
2318a7d6542SBram Moolenaarenddef
2328a7d6542SBram Moolenaar
2338a7d6542SBram Moolenaardef Test_vim9script_call()
2348a7d6542SBram Moolenaar  let lines =<< trim END
2358a7d6542SBram Moolenaar    vim9script
2368a7d6542SBram Moolenaar    let var = ''
2378a7d6542SBram Moolenaar    def MyFunc(arg: string)
2388a7d6542SBram Moolenaar       var = arg
2398a7d6542SBram Moolenaar    enddef
2408a7d6542SBram Moolenaar    MyFunc('foobar')
2418a7d6542SBram Moolenaar    assert_equal('foobar', var)
2428a7d6542SBram Moolenaar
2438a7d6542SBram Moolenaar    let str = 'barfoo'
2448a7d6542SBram Moolenaar    str->MyFunc()
2458a7d6542SBram Moolenaar    assert_equal('barfoo', var)
2468a7d6542SBram Moolenaar
2478a7d6542SBram Moolenaar    let g:value = 'value'
2488a7d6542SBram Moolenaar    g:value->MyFunc()
2498a7d6542SBram Moolenaar    assert_equal('value', var)
2508a7d6542SBram Moolenaar
2518a7d6542SBram Moolenaar    let listvar = []
2528a7d6542SBram Moolenaar    def ListFunc(arg: list<number>)
2538a7d6542SBram Moolenaar       listvar = arg
2548a7d6542SBram Moolenaar    enddef
2558a7d6542SBram Moolenaar    [1, 2, 3]->ListFunc()
2568a7d6542SBram Moolenaar    assert_equal([1, 2, 3], listvar)
2578a7d6542SBram Moolenaar
2588a7d6542SBram Moolenaar    let dictvar = {}
2598a7d6542SBram Moolenaar    def DictFunc(arg: dict<number>)
2608a7d6542SBram Moolenaar       dictvar = arg
2618a7d6542SBram Moolenaar    enddef
2628a7d6542SBram Moolenaar    {'a': 1, 'b': 2}->DictFunc()
2638a7d6542SBram Moolenaar    assert_equal(#{a: 1, b: 2}, dictvar)
2648a7d6542SBram Moolenaar    #{a: 3, b: 4}->DictFunc()
2658a7d6542SBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
2668a7d6542SBram Moolenaar  END
2678a7d6542SBram Moolenaar  writefile(lines, 'Xcall.vim')
2688a7d6542SBram Moolenaar  source Xcall.vim
2698a7d6542SBram Moolenaar  delete('Xcall.vim')
2708a7d6542SBram Moolenaarenddef
2718a7d6542SBram Moolenaar
2728a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl()
2738a7d6542SBram Moolenaar  let lines =<< trim END
2748a7d6542SBram Moolenaar    vim9script
2758a7d6542SBram Moolenaar    let var = ''
2768a7d6542SBram Moolenaar    def MyFunc(arg: string)
2778a7d6542SBram Moolenaar       let var = 123
2788a7d6542SBram Moolenaar    enddef
2798a7d6542SBram Moolenaar  END
2808a7d6542SBram Moolenaar  writefile(lines, 'Xcall_decl.vim')
2818a7d6542SBram Moolenaar  assert_fails('source Xcall_decl.vim', 'E1054:')
2828a7d6542SBram Moolenaar  delete('Xcall_decl.vim')
2838a7d6542SBram Moolenaarenddef
2848a7d6542SBram Moolenaar
2858a7d6542SBram Moolenaardef Test_vim9script_call_fail_const()
2868a7d6542SBram Moolenaar  let lines =<< trim END
2878a7d6542SBram Moolenaar    vim9script
2888a7d6542SBram Moolenaar    const var = ''
2898a7d6542SBram Moolenaar    def MyFunc(arg: string)
2908a7d6542SBram Moolenaar       var = 'asdf'
2918a7d6542SBram Moolenaar    enddef
2928a7d6542SBram Moolenaar  END
2938a7d6542SBram Moolenaar  writefile(lines, 'Xcall_const.vim')
2948a7d6542SBram Moolenaar  assert_fails('source Xcall_const.vim', 'E46:')
2958a7d6542SBram Moolenaar  delete('Xcall_const.vim')
2968a7d6542SBram Moolenaarenddef
2978a7d6542SBram Moolenaar
2988a7d6542SBram Moolenaardef Test_vim9script_reload()
2998a7d6542SBram Moolenaar  let lines =<< trim END
3008a7d6542SBram Moolenaar    vim9script
3018a7d6542SBram Moolenaar    const var = ''
3028a7d6542SBram Moolenaar    let valone = 1234
3038a7d6542SBram Moolenaar    def MyFunc(arg: string)
3048a7d6542SBram Moolenaar       valone = 5678
3058a7d6542SBram Moolenaar    enddef
3068a7d6542SBram Moolenaar  END
3078a7d6542SBram Moolenaar  let morelines =<< trim END
3088a7d6542SBram Moolenaar    let valtwo = 222
3098a7d6542SBram Moolenaar    export def GetValtwo(): number
3108a7d6542SBram Moolenaar      return valtwo
3118a7d6542SBram Moolenaar    enddef
3128a7d6542SBram Moolenaar  END
3138a7d6542SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
3148a7d6542SBram Moolenaar  source Xreload.vim
3158a7d6542SBram Moolenaar  source Xreload.vim
3168a7d6542SBram Moolenaar  source Xreload.vim
3178a7d6542SBram Moolenaar
3188a7d6542SBram Moolenaar  let testlines =<< trim END
3198a7d6542SBram Moolenaar    vim9script
3208a7d6542SBram Moolenaar    def TheFunc()
3218a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
3228a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
3238a7d6542SBram Moolenaar    enddef
3248a7d6542SBram Moolenaar    TheFunc()
3258a7d6542SBram Moolenaar  END
3268a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
3278a7d6542SBram Moolenaar  source Ximport.vim
3288a7d6542SBram Moolenaar
3298a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
3308a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
3318a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
3328a7d6542SBram Moolenaar  source Xreload.vim
3338a7d6542SBram Moolenaar  source Ximport.vim
3348a7d6542SBram Moolenaar
3358a7d6542SBram Moolenaar  " cannot declare a var twice
3368a7d6542SBram Moolenaar  lines =<< trim END
3378a7d6542SBram Moolenaar    vim9script
3388a7d6542SBram Moolenaar    let valone = 1234
3398a7d6542SBram Moolenaar    let valone = 5678
3408a7d6542SBram Moolenaar  END
3418a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
3428a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
3438a7d6542SBram Moolenaar
3448a7d6542SBram Moolenaar  delete('Xreload.vim')
3458a7d6542SBram Moolenaar  delete('Ximport.vim')
3468a7d6542SBram Moolenaarenddef
3478a7d6542SBram Moolenaar
3488a7d6542SBram Moolenaardef Test_import_absolute()
3498a7d6542SBram Moolenaar  let import_lines = [
3508a7d6542SBram Moolenaar        \ 'vim9script',
3518a7d6542SBram Moolenaar        \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
352b283a8a6SBram Moolenaar        \ 'def UseExported()',
3538a7d6542SBram Moolenaar        \ '  g:imported_abs = exported',
3544e12a5dfSBram Moolenaar        \ '  exported = 8888',
3554e12a5dfSBram Moolenaar        \ '  g:imported_after = exported',
356b283a8a6SBram Moolenaar        \ 'enddef',
357b283a8a6SBram Moolenaar        \ 'UseExported()',
3584e12a5dfSBram Moolenaar        \ 'g:import_disassembled = execute("disass UseExported")',
3598a7d6542SBram Moolenaar        \ ]
3608a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
3618a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
3628a7d6542SBram Moolenaar
3638a7d6542SBram Moolenaar  source Ximport_abs.vim
3648a7d6542SBram Moolenaar
3658a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
3664e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
367b283a8a6SBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*'
368b283a8a6SBram Moolenaar        \ .. 'g:imported_abs = exported.*'
369b283a8a6SBram Moolenaar        \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
3704e12a5dfSBram Moolenaar        \ .. '1 STOREG g:imported_abs.*'
3714e12a5dfSBram Moolenaar        \ .. 'exported = 8888.*'
3724e12a5dfSBram Moolenaar        \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
3734e12a5dfSBram Moolenaar        \ .. 'g:imported_after = exported.*'
3744e12a5dfSBram Moolenaar        \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
3754e12a5dfSBram Moolenaar        \ .. '5 STOREG g:imported_after.*'
3764e12a5dfSBram Moolenaar        \, g:import_disassembled)
3778a7d6542SBram Moolenaar  unlet g:imported_abs
3784e12a5dfSBram Moolenaar  unlet g:import_disassembled
3798a7d6542SBram Moolenaar
3808a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
3818a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
3828a7d6542SBram Moolenaarenddef
3838a7d6542SBram Moolenaar
3848a7d6542SBram Moolenaardef Test_import_rtp()
3858a7d6542SBram Moolenaar  let import_lines = [
3868a7d6542SBram Moolenaar        \ 'vim9script',
3878a7d6542SBram Moolenaar        \ 'import exported from "Xexport_rtp.vim"',
3888a7d6542SBram Moolenaar        \ 'g:imported_rtp = exported',
3898a7d6542SBram Moolenaar        \ ]
3908a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
3918a7d6542SBram Moolenaar  mkdir('import')
3928a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
3938a7d6542SBram Moolenaar
3948a7d6542SBram Moolenaar  let save_rtp = &rtp
3958a7d6542SBram Moolenaar  &rtp = getcwd()
3968a7d6542SBram Moolenaar  source Ximport_rtp.vim
3978a7d6542SBram Moolenaar  &rtp = save_rtp
3988a7d6542SBram Moolenaar
3998a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
4008a7d6542SBram Moolenaar  unlet g:imported_rtp
4018a7d6542SBram Moolenaar
4028a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
4038a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
4048a7d6542SBram Moolenaar  delete('import', 'd')
4058a7d6542SBram Moolenaarenddef
4068a7d6542SBram Moolenaar
4078a7d6542SBram Moolenaardef Test_fixed_size_list()
4088a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
4098a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
4108a7d6542SBram Moolenaar  l->remove(0)
4118a7d6542SBram Moolenaar  l->add(5)
4128a7d6542SBram Moolenaar  l->insert(99, 1)
4130f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
4148a7d6542SBram Moolenaarenddef
4158a7d6542SBram Moolenaar
416673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not
417673660abSBram Moolenaar" recognized.
418673660abSBram Moolenaarfunc Test_function_python()
419673660abSBram Moolenaar  CheckFeature python3
420673660abSBram Moolenaar  let py = 'python3'
421673660abSBram Moolenaar  execute py "<< EOF"
422673660abSBram Moolenaardef do_something():
423673660abSBram Moolenaar  return 1
424673660abSBram MoolenaarEOF
425673660abSBram Moolenaarendfunc
426673660abSBram Moolenaar
427a259d8d3SBram Moolenaardef HasEval()
428a259d8d3SBram Moolenaar  if has('eval')
429a259d8d3SBram Moolenaar    echo 'yes'
430a259d8d3SBram Moolenaar  else
431a259d8d3SBram Moolenaar    echo 'no'
432a259d8d3SBram Moolenaar  endif
433a259d8d3SBram Moolenaarenddef
434a259d8d3SBram Moolenaar
435a259d8d3SBram Moolenaardef HasNothing()
436a259d8d3SBram Moolenaar  if has('nothing')
437a259d8d3SBram Moolenaar    echo 'yes'
438a259d8d3SBram Moolenaar  else
439a259d8d3SBram Moolenaar    echo 'no'
440a259d8d3SBram Moolenaar  endif
441a259d8d3SBram Moolenaarenddef
442a259d8d3SBram Moolenaar
443a259d8d3SBram Moolenaardef Test_compile_const_expr()
444a259d8d3SBram Moolenaar  assert_equal("\nyes", execute('call HasEval()'))
445a259d8d3SBram Moolenaar  let instr = execute('disassemble HasEval')
4460f18b6d1SBram Moolenaar  assert_match('PUSHS "yes"', instr)
4470f18b6d1SBram Moolenaar  assert_notmatch('PUSHS "no"', instr)
4480f18b6d1SBram Moolenaar  assert_notmatch('JUMP', instr)
449a259d8d3SBram Moolenaar
450a259d8d3SBram Moolenaar  assert_equal("\nno", execute('call HasNothing()'))
451a259d8d3SBram Moolenaar  instr = execute('disassemble HasNothing')
4520f18b6d1SBram Moolenaar  assert_notmatch('PUSHS "yes"', instr)
4530f18b6d1SBram Moolenaar  assert_match('PUSHS "no"', instr)
4540f18b6d1SBram Moolenaar  assert_notmatch('JUMP', instr)
4550f18b6d1SBram Moolenaarenddef
4560f18b6d1SBram Moolenaar
4570f18b6d1SBram Moolenaarfunc NotCompiled()
4580f18b6d1SBram Moolenaar  echo "not"
4590f18b6d1SBram Moolenaarendfunc
4600f18b6d1SBram Moolenaar
4610f18b6d1SBram Moolenaarlet s:scriptvar = 4
4620f18b6d1SBram Moolenaarlet g:globalvar = 'g'
4630f18b6d1SBram Moolenaar
464b283a8a6SBram Moolenaardef s:ScriptFuncLoad(arg: string)
4650f18b6d1SBram Moolenaar  let local = 1
4660f18b6d1SBram Moolenaar  buffers
4670f18b6d1SBram Moolenaar  echo arg
4680f18b6d1SBram Moolenaar  echo local
4690f18b6d1SBram Moolenaar  echo v:version
4700f18b6d1SBram Moolenaar  echo s:scriptvar
4710f18b6d1SBram Moolenaar  echo g:globalvar
4720f18b6d1SBram Moolenaar  echo &tabstop
4730f18b6d1SBram Moolenaar  echo $ENVVAR
4740f18b6d1SBram Moolenaar  echo @z
4750f18b6d1SBram Moolenaarenddef
4760f18b6d1SBram Moolenaar
477*ff80cb68SBram Moolenaardef s:ScriptFuncPush()
478*ff80cb68SBram Moolenaar  let localbool = true
479*ff80cb68SBram Moolenaar  let localspec = v:none
480*ff80cb68SBram Moolenaar  let localblob = 0z1234
481*ff80cb68SBram Moolenaar  if has('float')
482*ff80cb68SBram Moolenaar    let localfloat = 1.234
483*ff80cb68SBram Moolenaar  endif
484*ff80cb68SBram Moolenaarenddef
485*ff80cb68SBram Moolenaar
486b283a8a6SBram Moolenaardef s:ScriptFuncStore()
487b283a8a6SBram Moolenaar  let localnr = 1
488b283a8a6SBram Moolenaar  localnr = 2
489b283a8a6SBram Moolenaar  let localstr = 'abc'
490b283a8a6SBram Moolenaar  localstr = 'xyz'
491b283a8a6SBram Moolenaar  v:char = 'abc'
492b283a8a6SBram Moolenaar  s:scriptvar = 'sv'
493b283a8a6SBram Moolenaar  g:globalvar = 'gv'
494b283a8a6SBram Moolenaar  &tabstop = 8
495b283a8a6SBram Moolenaar  $ENVVAR = 'ev'
496b283a8a6SBram Moolenaar  @z = 'rv'
497b283a8a6SBram Moolenaarenddef
498b283a8a6SBram Moolenaar
499*ff80cb68SBram Moolenaardef s:ScriptFuncTry()
500*ff80cb68SBram Moolenaar  try
501*ff80cb68SBram Moolenaar    echo 'yes'
502*ff80cb68SBram Moolenaar  catch /fail/
503*ff80cb68SBram Moolenaar    echo 'no'
504*ff80cb68SBram Moolenaar  finally
505*ff80cb68SBram Moolenaar    echo 'end'
506*ff80cb68SBram Moolenaar  endtry
507*ff80cb68SBram Moolenaarenddef
508*ff80cb68SBram Moolenaar
5090f18b6d1SBram Moolenaardef Test_disassemble()
5100f18b6d1SBram Moolenaar  assert_fails('disass NoFunc', 'E1061:')
5110f18b6d1SBram Moolenaar  assert_fails('disass NotCompiled', 'E1062:')
5120f18b6d1SBram Moolenaar
513b283a8a6SBram Moolenaar  let res = execute('disass s:ScriptFuncLoad')
514b283a8a6SBram Moolenaar  assert_match('<SNR>\d*_ScriptFuncLoad.*'
5150f18b6d1SBram Moolenaar        \ .. 'buffers.*'
5160f18b6d1SBram Moolenaar        \ .. ' EXEC \+buffers.*'
5170f18b6d1SBram Moolenaar        \ .. ' LOAD arg\[-1\].*'
5180f18b6d1SBram Moolenaar        \ .. ' LOAD $0.*'
5190f18b6d1SBram Moolenaar        \ .. ' LOADV v:version.*'
5200f18b6d1SBram Moolenaar        \ .. ' LOADS s:scriptvar from .*test_vim9_script.vim.*'
5210f18b6d1SBram Moolenaar        \ .. ' LOADG g:globalvar.*'
5220f18b6d1SBram Moolenaar        \ .. ' LOADENV $ENVVAR.*'
523b283a8a6SBram Moolenaar        \ .. ' LOADREG @z.*'
524b283a8a6SBram Moolenaar        \, res)
525b283a8a6SBram Moolenaar
526*ff80cb68SBram Moolenaar  res = execute('disass s:ScriptFuncPush')
527*ff80cb68SBram Moolenaar  assert_match('<SNR>\d*_ScriptFuncPush.*'
528*ff80cb68SBram Moolenaar        \ .. 'localbool = true.*'
529*ff80cb68SBram Moolenaar        \ .. ' PUSH v:true.*'
530*ff80cb68SBram Moolenaar        \ .. 'localspec = v:none.*'
531*ff80cb68SBram Moolenaar        \ .. ' PUSH v:none.*'
532*ff80cb68SBram Moolenaar        \ .. 'localblob = 0z1234.*'
533*ff80cb68SBram Moolenaar        \ .. ' PUSHBLOB 0z1234.*'
534*ff80cb68SBram Moolenaar        \, res)
535*ff80cb68SBram Moolenaar  if has('float')
536*ff80cb68SBram Moolenaar  assert_match('<SNR>\d*_ScriptFuncPush.*'
537*ff80cb68SBram Moolenaar        \ .. 'localfloat = 1.234.*'
538*ff80cb68SBram Moolenaar        \ .. ' PUSHF 1.234.*'
539*ff80cb68SBram Moolenaar        \, res)
540*ff80cb68SBram Moolenaar  endif
541*ff80cb68SBram Moolenaar
542b283a8a6SBram Moolenaar  res = execute('disass s:ScriptFuncStore')
543b283a8a6SBram Moolenaar  assert_match('<SNR>\d*_ScriptFuncStore.*'
544b283a8a6SBram Moolenaar        \ .. 'localnr = 2.*'
545b283a8a6SBram Moolenaar        \ .. ' STORE 2 in $0.*'
546b283a8a6SBram Moolenaar        \ .. 'localstr = ''xyz''.*'
547b283a8a6SBram Moolenaar        \ .. ' STORE $1.*'
548b283a8a6SBram Moolenaar        \ .. 'v:char = ''abc''.*'
549b283a8a6SBram Moolenaar        \ .. 'STOREV v:char.*'
550b283a8a6SBram Moolenaar        \ .. 's:scriptvar = ''sv''.*'
551b283a8a6SBram Moolenaar        \ .. ' STORES s:scriptvar in .*test_vim9_script.vim.*'
552b283a8a6SBram Moolenaar        \ .. 'g:globalvar = ''gv''.*'
553b283a8a6SBram Moolenaar        \ .. ' STOREG g:globalvar.*'
554b283a8a6SBram Moolenaar        \ .. '&tabstop = 8.*'
555b283a8a6SBram Moolenaar        \ .. ' STOREOPT &tabstop.*'
556b283a8a6SBram Moolenaar        \ .. '$ENVVAR = ''ev''.*'
557b283a8a6SBram Moolenaar        \ .. ' STOREENV $ENVVAR.*'
558b283a8a6SBram Moolenaar        \ .. '@z = ''rv''.*'
559b283a8a6SBram Moolenaar        \ .. ' STOREREG @z.*'
560b283a8a6SBram Moolenaar        \, res)
561*ff80cb68SBram Moolenaar
562*ff80cb68SBram Moolenaar  res = execute('disass s:ScriptFuncTry')
563*ff80cb68SBram Moolenaar  assert_match('<SNR>\d*_ScriptFuncTry.*'
564*ff80cb68SBram Moolenaar        \ .. 'try.*'
565*ff80cb68SBram Moolenaar        \ .. 'TRY catch -> \d\+, finally -> \d\+.*'
566*ff80cb68SBram Moolenaar        \ .. 'catch /fail/.*'
567*ff80cb68SBram Moolenaar        \ .. ' JUMP -> \d\+.*'
568*ff80cb68SBram Moolenaar        \ .. ' PUSH v:exception.*'
569*ff80cb68SBram Moolenaar        \ .. ' PUSHS "fail".*'
570*ff80cb68SBram Moolenaar        \ .. ' COMPARESTRING =\~.*'
571*ff80cb68SBram Moolenaar        \ .. ' JUMP_IF_FALSE -> \d\+.*'
572*ff80cb68SBram Moolenaar        \ .. ' CATCH.*'
573*ff80cb68SBram Moolenaar        \ .. 'finally.*'
574*ff80cb68SBram Moolenaar        \ .. ' PUSHS "end".*'
575*ff80cb68SBram Moolenaar        \ .. 'endtry.*'
576*ff80cb68SBram Moolenaar        \ .. ' ENDTRY.*'
577*ff80cb68SBram Moolenaar        \, res)
578a259d8d3SBram Moolenaarenddef
579a259d8d3SBram Moolenaar
5808a7d6542SBram Moolenaar
5818a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
582