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
134*26e117e9SBram Moolenaar"def Test_call_func_defined_later()
135*26e117e9SBram Moolenaar"  call assert_equal('one', DefineLater('one'))
136*26e117e9SBram Moolenaar"  call assert_fails('call NotDefined("one")', 'E99:')
137*26e117e9SBram Moolenaar"enddef
138*26e117e9SBram Moolenaar
139*26e117e9SBram Moolenaarfunc DefineLater(arg)
140*26e117e9SBram Moolenaar  return a:arg
141*26e117e9SBram Moolenaarendfunc
142*26e117e9SBram Moolenaar
143*26e117e9SBram Moolenaardef MyDefaultArgs(name = 'string'): string
144*26e117e9SBram Moolenaar  return name
145*26e117e9SBram Moolenaarenddef
146*26e117e9SBram Moolenaar
147*26e117e9SBram Moolenaarfunc Test_call_default_args_from_func()
148*26e117e9SBram Moolenaar  " TODO: implement using default value for optional argument
149*26e117e9SBram Moolenaar  "call assert_equal('string', MyDefaultArgs())
150*26e117e9SBram Moolenaar  call assert_fails('call MyDefaultArgs()', 'optional arguments not implemented yet')
151*26e117e9SBram Moolenaar  call assert_equal('one', MyDefaultArgs('one'))
152*26e117e9SBram Moolenaar  call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
153*26e117e9SBram Moolenaarendfunc
154*26e117e9SBram Moolenaar
155*26e117e9SBram Moolenaardef Test_call_default_args()
156*26e117e9SBram Moolenaar  " TODO: implement using default value for optional argument
157*26e117e9SBram Moolenaar  "assert_equal('string', MyDefaultArgs())
158*26e117e9SBram Moolenaar  assert_equal('one', MyDefaultArgs('one'))
159*26e117e9SBram Moolenaar  assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
160*26e117e9SBram Moolenaarenddef
161*26e117e9SBram Moolenaar
1628a7d6542SBram Moolenaardef Test_return_type_wrong()
1638a7d6542SBram Moolenaar  " TODO: why is ! needed for Mac and FreeBSD?
164978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
165978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
166978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
167978d170bSBram Moolenaar  CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
1688a7d6542SBram Moolenaarenddef
1698a7d6542SBram Moolenaar
1708a7d6542SBram Moolenaardef Test_try_catch()
1718a7d6542SBram Moolenaar  let l = []
1728a7d6542SBram Moolenaar  try
1738a7d6542SBram Moolenaar    add(l, '1')
1748a7d6542SBram Moolenaar    throw 'wrong'
1758a7d6542SBram Moolenaar    add(l, '2')
1768a7d6542SBram Moolenaar  catch
1778a7d6542SBram Moolenaar    add(l, v:exception)
1788a7d6542SBram Moolenaar  finally
1798a7d6542SBram Moolenaar    add(l, '3')
1808a7d6542SBram Moolenaar  endtry
1818a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
1828a7d6542SBram Moolenaarenddef
1838a7d6542SBram Moolenaar
1848a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
1858a7d6542SBram Moolenaar  vim9script
1868a7d6542SBram Moolenaar  let name: string = 'bob'
1878a7d6542SBram Moolenaar  def Concat(arg: string): string
1888a7d6542SBram Moolenaar    return name .. arg
1898a7d6542SBram Moolenaar  enddef
1908a7d6542SBram Moolenaar  let g:result = Concat('bie')
1918a7d6542SBram Moolenaar  let g:localname = name
1928a7d6542SBram Moolenaar
1938a7d6542SBram Moolenaar  export const CONST = 1234
1948a7d6542SBram Moolenaar  export let exported = 9876
1958a7d6542SBram Moolenaar  export def Exported(): string
1968a7d6542SBram Moolenaar    return 'Exported'
1978a7d6542SBram Moolenaar  enddef
1988a7d6542SBram MoolenaarEND
1998a7d6542SBram Moolenaar
2008a7d6542SBram Moolenaardef Test_vim9script()
2018a7d6542SBram Moolenaar  let import_script_lines =<< trim END
2028a7d6542SBram Moolenaar    vim9script
2038a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
2048a7d6542SBram Moolenaar    g:imported = exported
2058a7d6542SBram Moolenaar    g:imported_func = Exported()
2068a7d6542SBram Moolenaar  END
2078a7d6542SBram Moolenaar
2088a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
2098a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
2108a7d6542SBram Moolenaar
2118a7d6542SBram Moolenaar  source Ximport.vim
2128a7d6542SBram Moolenaar
2138a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
2148a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
2158a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
2168a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
2178a7d6542SBram Moolenaar  assert_false(exists('g:name'))
2188a7d6542SBram Moolenaar
2198a7d6542SBram Moolenaar  unlet g:result
2208a7d6542SBram Moolenaar  unlet g:localname
2218a7d6542SBram Moolenaar  unlet g:imported
2228a7d6542SBram Moolenaar  unlet g:imported_func
2238a7d6542SBram Moolenaar  delete('Ximport.vim')
2248a7d6542SBram Moolenaar  delete('Xexport.vim')
2258a7d6542SBram Moolenaar
2268a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
2278a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
2288a7d6542SBram Moolenaarenddef
2298a7d6542SBram Moolenaar
2308a7d6542SBram Moolenaardef Test_vim9script_call()
2318a7d6542SBram Moolenaar  let lines =<< trim END
2328a7d6542SBram Moolenaar    vim9script
2338a7d6542SBram Moolenaar    let var = ''
2348a7d6542SBram Moolenaar    def MyFunc(arg: string)
2358a7d6542SBram Moolenaar       var = arg
2368a7d6542SBram Moolenaar    enddef
2378a7d6542SBram Moolenaar    MyFunc('foobar')
2388a7d6542SBram Moolenaar    assert_equal('foobar', var)
2398a7d6542SBram Moolenaar
2408a7d6542SBram Moolenaar    let str = 'barfoo'
2418a7d6542SBram Moolenaar    str->MyFunc()
2428a7d6542SBram Moolenaar    assert_equal('barfoo', var)
2438a7d6542SBram Moolenaar
2448a7d6542SBram Moolenaar    let g:value = 'value'
2458a7d6542SBram Moolenaar    g:value->MyFunc()
2468a7d6542SBram Moolenaar    assert_equal('value', var)
2478a7d6542SBram Moolenaar
2488a7d6542SBram Moolenaar    let listvar = []
2498a7d6542SBram Moolenaar    def ListFunc(arg: list<number>)
2508a7d6542SBram Moolenaar       listvar = arg
2518a7d6542SBram Moolenaar    enddef
2528a7d6542SBram Moolenaar    [1, 2, 3]->ListFunc()
2538a7d6542SBram Moolenaar    assert_equal([1, 2, 3], listvar)
2548a7d6542SBram Moolenaar
2558a7d6542SBram Moolenaar    let dictvar = {}
2568a7d6542SBram Moolenaar    def DictFunc(arg: dict<number>)
2578a7d6542SBram Moolenaar       dictvar = arg
2588a7d6542SBram Moolenaar    enddef
2598a7d6542SBram Moolenaar    {'a': 1, 'b': 2}->DictFunc()
2608a7d6542SBram Moolenaar    assert_equal(#{a: 1, b: 2}, dictvar)
2618a7d6542SBram Moolenaar    #{a: 3, b: 4}->DictFunc()
2628a7d6542SBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
2638a7d6542SBram Moolenaar  END
2648a7d6542SBram Moolenaar  writefile(lines, 'Xcall.vim')
2658a7d6542SBram Moolenaar  source Xcall.vim
2668a7d6542SBram Moolenaar  delete('Xcall.vim')
2678a7d6542SBram Moolenaarenddef
2688a7d6542SBram Moolenaar
2698a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl()
2708a7d6542SBram Moolenaar  let lines =<< trim END
2718a7d6542SBram Moolenaar    vim9script
2728a7d6542SBram Moolenaar    let var = ''
2738a7d6542SBram Moolenaar    def MyFunc(arg: string)
2748a7d6542SBram Moolenaar       let var = 123
2758a7d6542SBram Moolenaar    enddef
2768a7d6542SBram Moolenaar  END
2778a7d6542SBram Moolenaar  writefile(lines, 'Xcall_decl.vim')
2788a7d6542SBram Moolenaar  assert_fails('source Xcall_decl.vim', 'E1054:')
2798a7d6542SBram Moolenaar  delete('Xcall_decl.vim')
2808a7d6542SBram Moolenaarenddef
2818a7d6542SBram Moolenaar
2828a7d6542SBram Moolenaardef Test_vim9script_call_fail_const()
2838a7d6542SBram Moolenaar  let lines =<< trim END
2848a7d6542SBram Moolenaar    vim9script
2858a7d6542SBram Moolenaar    const var = ''
2868a7d6542SBram Moolenaar    def MyFunc(arg: string)
2878a7d6542SBram Moolenaar       var = 'asdf'
2888a7d6542SBram Moolenaar    enddef
2898a7d6542SBram Moolenaar  END
2908a7d6542SBram Moolenaar  writefile(lines, 'Xcall_const.vim')
2918a7d6542SBram Moolenaar  assert_fails('source Xcall_const.vim', 'E46:')
2928a7d6542SBram Moolenaar  delete('Xcall_const.vim')
2938a7d6542SBram Moolenaarenddef
2948a7d6542SBram Moolenaar
2958a7d6542SBram Moolenaardef Test_vim9script_reload()
2968a7d6542SBram Moolenaar  let lines =<< trim END
2978a7d6542SBram Moolenaar    vim9script
2988a7d6542SBram Moolenaar    const var = ''
2998a7d6542SBram Moolenaar    let valone = 1234
3008a7d6542SBram Moolenaar    def MyFunc(arg: string)
3018a7d6542SBram Moolenaar       valone = 5678
3028a7d6542SBram Moolenaar    enddef
3038a7d6542SBram Moolenaar  END
3048a7d6542SBram Moolenaar  let morelines =<< trim END
3058a7d6542SBram Moolenaar    let valtwo = 222
3068a7d6542SBram Moolenaar    export def GetValtwo(): number
3078a7d6542SBram Moolenaar      return valtwo
3088a7d6542SBram Moolenaar    enddef
3098a7d6542SBram Moolenaar  END
3108a7d6542SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
3118a7d6542SBram Moolenaar  source Xreload.vim
3128a7d6542SBram Moolenaar  source Xreload.vim
3138a7d6542SBram Moolenaar  source Xreload.vim
3148a7d6542SBram Moolenaar
3158a7d6542SBram Moolenaar  let testlines =<< trim END
3168a7d6542SBram Moolenaar    vim9script
3178a7d6542SBram Moolenaar    def TheFunc()
3188a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
3198a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
3208a7d6542SBram Moolenaar    enddef
3218a7d6542SBram Moolenaar    TheFunc()
3228a7d6542SBram Moolenaar  END
3238a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
3248a7d6542SBram Moolenaar  source Ximport.vim
3258a7d6542SBram Moolenaar
3268a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
3278a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
3288a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
3298a7d6542SBram Moolenaar  source Xreload.vim
3308a7d6542SBram Moolenaar  source Ximport.vim
3318a7d6542SBram Moolenaar
3328a7d6542SBram Moolenaar  " cannot declare a var twice
3338a7d6542SBram Moolenaar  lines =<< trim END
3348a7d6542SBram Moolenaar    vim9script
3358a7d6542SBram Moolenaar    let valone = 1234
3368a7d6542SBram Moolenaar    let valone = 5678
3378a7d6542SBram Moolenaar  END
3388a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
3398a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
3408a7d6542SBram Moolenaar
3418a7d6542SBram Moolenaar  delete('Xreload.vim')
3428a7d6542SBram Moolenaar  delete('Ximport.vim')
3438a7d6542SBram Moolenaarenddef
3448a7d6542SBram Moolenaar
3458a7d6542SBram Moolenaardef Test_import_absolute()
3468a7d6542SBram Moolenaar  let import_lines = [
3478a7d6542SBram Moolenaar        \ 'vim9script',
3488a7d6542SBram Moolenaar        \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
349b283a8a6SBram Moolenaar        \ 'def UseExported()',
3508a7d6542SBram Moolenaar        \ '  g:imported_abs = exported',
3514e12a5dfSBram Moolenaar        \ '  exported = 8888',
3524e12a5dfSBram Moolenaar        \ '  g:imported_after = exported',
353b283a8a6SBram Moolenaar        \ 'enddef',
354b283a8a6SBram Moolenaar        \ 'UseExported()',
3554e12a5dfSBram Moolenaar        \ 'g:import_disassembled = execute("disass UseExported")',
3568a7d6542SBram Moolenaar        \ ]
3578a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
3588a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
3598a7d6542SBram Moolenaar
3608a7d6542SBram Moolenaar  source Ximport_abs.vim
3618a7d6542SBram Moolenaar
3628a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
3634e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
364b283a8a6SBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*'
365b283a8a6SBram Moolenaar        \ .. 'g:imported_abs = exported.*'
366b283a8a6SBram Moolenaar        \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
3674e12a5dfSBram Moolenaar        \ .. '1 STOREG g:imported_abs.*'
3684e12a5dfSBram Moolenaar        \ .. 'exported = 8888.*'
3694e12a5dfSBram Moolenaar        \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
3704e12a5dfSBram Moolenaar        \ .. 'g:imported_after = exported.*'
3714e12a5dfSBram Moolenaar        \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
3724e12a5dfSBram Moolenaar        \ .. '5 STOREG g:imported_after.*'
3734e12a5dfSBram Moolenaar        \, g:import_disassembled)
3748a7d6542SBram Moolenaar  unlet g:imported_abs
3754e12a5dfSBram Moolenaar  unlet g:import_disassembled
3768a7d6542SBram Moolenaar
3778a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
3788a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
3798a7d6542SBram Moolenaarenddef
3808a7d6542SBram Moolenaar
3818a7d6542SBram Moolenaardef Test_import_rtp()
3828a7d6542SBram Moolenaar  let import_lines = [
3838a7d6542SBram Moolenaar        \ 'vim9script',
3848a7d6542SBram Moolenaar        \ 'import exported from "Xexport_rtp.vim"',
3858a7d6542SBram Moolenaar        \ 'g:imported_rtp = exported',
3868a7d6542SBram Moolenaar        \ ]
3878a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
3888a7d6542SBram Moolenaar  mkdir('import')
3898a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
3908a7d6542SBram Moolenaar
3918a7d6542SBram Moolenaar  let save_rtp = &rtp
3928a7d6542SBram Moolenaar  &rtp = getcwd()
3938a7d6542SBram Moolenaar  source Ximport_rtp.vim
3948a7d6542SBram Moolenaar  &rtp = save_rtp
3958a7d6542SBram Moolenaar
3968a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
3978a7d6542SBram Moolenaar  unlet g:imported_rtp
3988a7d6542SBram Moolenaar
3998a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
4008a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
4018a7d6542SBram Moolenaar  delete('import', 'd')
4028a7d6542SBram Moolenaarenddef
4038a7d6542SBram Moolenaar
4048a7d6542SBram Moolenaardef Test_fixed_size_list()
4058a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
4068a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
4078a7d6542SBram Moolenaar  l->remove(0)
4088a7d6542SBram Moolenaar  l->add(5)
4098a7d6542SBram Moolenaar  l->insert(99, 1)
4100f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
4118a7d6542SBram Moolenaarenddef
4128a7d6542SBram Moolenaar
413673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not
414673660abSBram Moolenaar" recognized.
415673660abSBram Moolenaarfunc Test_function_python()
416673660abSBram Moolenaar  CheckFeature python3
417673660abSBram Moolenaar  let py = 'python3'
418673660abSBram Moolenaar  execute py "<< EOF"
419673660abSBram Moolenaardef do_something():
420673660abSBram Moolenaar  return 1
421673660abSBram MoolenaarEOF
422673660abSBram Moolenaarendfunc
423673660abSBram Moolenaar
424a259d8d3SBram Moolenaardef HasEval()
425a259d8d3SBram Moolenaar  if has('eval')
426a259d8d3SBram Moolenaar    echo 'yes'
427a259d8d3SBram Moolenaar  else
428a259d8d3SBram Moolenaar    echo 'no'
429a259d8d3SBram Moolenaar  endif
430a259d8d3SBram Moolenaarenddef
431a259d8d3SBram Moolenaar
432a259d8d3SBram Moolenaardef HasNothing()
433a259d8d3SBram Moolenaar  if has('nothing')
434a259d8d3SBram Moolenaar    echo 'yes'
435a259d8d3SBram Moolenaar  else
436a259d8d3SBram Moolenaar    echo 'no'
437a259d8d3SBram Moolenaar  endif
438a259d8d3SBram Moolenaarenddef
439a259d8d3SBram Moolenaar
440a259d8d3SBram Moolenaardef Test_compile_const_expr()
441a259d8d3SBram Moolenaar  assert_equal("\nyes", execute('call HasEval()'))
442a259d8d3SBram Moolenaar  let instr = execute('disassemble HasEval')
4430f18b6d1SBram Moolenaar  assert_match('PUSHS "yes"', instr)
4440f18b6d1SBram Moolenaar  assert_notmatch('PUSHS "no"', instr)
4450f18b6d1SBram Moolenaar  assert_notmatch('JUMP', instr)
446a259d8d3SBram Moolenaar
447a259d8d3SBram Moolenaar  assert_equal("\nno", execute('call HasNothing()'))
448a259d8d3SBram Moolenaar  instr = execute('disassemble HasNothing')
4490f18b6d1SBram Moolenaar  assert_notmatch('PUSHS "yes"', instr)
4500f18b6d1SBram Moolenaar  assert_match('PUSHS "no"', instr)
4510f18b6d1SBram Moolenaar  assert_notmatch('JUMP', instr)
4520f18b6d1SBram Moolenaarenddef
4530f18b6d1SBram Moolenaar
4540f18b6d1SBram Moolenaarfunc NotCompiled()
4550f18b6d1SBram Moolenaar  echo "not"
4560f18b6d1SBram Moolenaarendfunc
4570f18b6d1SBram Moolenaar
4580f18b6d1SBram Moolenaarlet s:scriptvar = 4
4590f18b6d1SBram Moolenaarlet g:globalvar = 'g'
4600f18b6d1SBram Moolenaar
461b283a8a6SBram Moolenaardef s:ScriptFuncLoad(arg: string)
4620f18b6d1SBram Moolenaar  let local = 1
4630f18b6d1SBram Moolenaar  buffers
4640f18b6d1SBram Moolenaar  echo arg
4650f18b6d1SBram Moolenaar  echo local
4660f18b6d1SBram Moolenaar  echo v:version
4670f18b6d1SBram Moolenaar  echo s:scriptvar
4680f18b6d1SBram Moolenaar  echo g:globalvar
4690f18b6d1SBram Moolenaar  echo &tabstop
4700f18b6d1SBram Moolenaar  echo $ENVVAR
4710f18b6d1SBram Moolenaar  echo @z
4720f18b6d1SBram Moolenaarenddef
4730f18b6d1SBram Moolenaar
474b283a8a6SBram Moolenaardef s:ScriptFuncStore()
475b283a8a6SBram Moolenaar  let localnr = 1
476b283a8a6SBram Moolenaar  localnr = 2
477b283a8a6SBram Moolenaar  let localstr = 'abc'
478b283a8a6SBram Moolenaar  localstr = 'xyz'
479b283a8a6SBram Moolenaar  v:char = 'abc'
480b283a8a6SBram Moolenaar  s:scriptvar = 'sv'
481b283a8a6SBram Moolenaar  g:globalvar = 'gv'
482b283a8a6SBram Moolenaar  &tabstop = 8
483b283a8a6SBram Moolenaar  $ENVVAR = 'ev'
484b283a8a6SBram Moolenaar  @z = 'rv'
485b283a8a6SBram Moolenaarenddef
486b283a8a6SBram Moolenaar
4870f18b6d1SBram Moolenaardef Test_disassemble()
4880f18b6d1SBram Moolenaar  assert_fails('disass NoFunc', 'E1061:')
4890f18b6d1SBram Moolenaar  assert_fails('disass NotCompiled', 'E1062:')
4900f18b6d1SBram Moolenaar
491b283a8a6SBram Moolenaar  let res = execute('disass s:ScriptFuncLoad')
492b283a8a6SBram Moolenaar  assert_match('<SNR>\d*_ScriptFuncLoad.*'
4930f18b6d1SBram Moolenaar        \ .. 'buffers.*'
4940f18b6d1SBram Moolenaar        \ .. ' EXEC \+buffers.*'
4950f18b6d1SBram Moolenaar        \ .. ' LOAD arg\[-1\].*'
4960f18b6d1SBram Moolenaar        \ .. ' LOAD $0.*'
4970f18b6d1SBram Moolenaar        \ .. ' LOADV v:version.*'
4980f18b6d1SBram Moolenaar        \ .. ' LOADS s:scriptvar from .*test_vim9_script.vim.*'
4990f18b6d1SBram Moolenaar        \ .. ' LOADG g:globalvar.*'
5000f18b6d1SBram Moolenaar        \ .. ' LOADENV $ENVVAR.*'
501b283a8a6SBram Moolenaar        \ .. ' LOADREG @z.*'
502b283a8a6SBram Moolenaar        \, res)
503b283a8a6SBram Moolenaar
504b283a8a6SBram Moolenaar  " TODO:
505b283a8a6SBram Moolenaar  " v:char =
506b283a8a6SBram Moolenaar  " s:scriptvar =
507b283a8a6SBram Moolenaar  res = execute('disass s:ScriptFuncStore')
508b283a8a6SBram Moolenaar  assert_match('<SNR>\d*_ScriptFuncStore.*'
509b283a8a6SBram Moolenaar        \ .. 'localnr = 2.*'
510b283a8a6SBram Moolenaar        \ .. ' STORE 2 in $0.*'
511b283a8a6SBram Moolenaar        \ .. 'localstr = ''xyz''.*'
512b283a8a6SBram Moolenaar        \ .. ' STORE $1.*'
513b283a8a6SBram Moolenaar        \ .. 'v:char = ''abc''.*'
514b283a8a6SBram Moolenaar        \ .. 'STOREV v:char.*'
515b283a8a6SBram Moolenaar        \ .. 's:scriptvar = ''sv''.*'
516b283a8a6SBram Moolenaar        \ .. ' STORES s:scriptvar in .*test_vim9_script.vim.*'
517b283a8a6SBram Moolenaar        \ .. 'g:globalvar = ''gv''.*'
518b283a8a6SBram Moolenaar        \ .. ' STOREG g:globalvar.*'
519b283a8a6SBram Moolenaar        \ .. '&tabstop = 8.*'
520b283a8a6SBram Moolenaar        \ .. ' STOREOPT &tabstop.*'
521b283a8a6SBram Moolenaar        \ .. '$ENVVAR = ''ev''.*'
522b283a8a6SBram Moolenaar        \ .. ' STOREENV $ENVVAR.*'
523b283a8a6SBram Moolenaar        \ .. '@z = ''rv''.*'
524b283a8a6SBram Moolenaar        \ .. ' STOREREG @z.*'
525b283a8a6SBram Moolenaar        \, res)
526a259d8d3SBram Moolenaarenddef
527a259d8d3SBram Moolenaar
5288a7d6542SBram Moolenaar
5298a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
530