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
1348a7d6542SBram Moolenaardef Test_return_type_wrong()
1358a7d6542SBram Moolenaar  " TODO: why is ! needed for Mac and FreeBSD?
136978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
137978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
138978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
139978d170bSBram Moolenaar  CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
1408a7d6542SBram Moolenaarenddef
1418a7d6542SBram Moolenaar
1428a7d6542SBram Moolenaardef Test_try_catch()
1438a7d6542SBram Moolenaar  let l = []
1448a7d6542SBram Moolenaar  try
1458a7d6542SBram Moolenaar    add(l, '1')
1468a7d6542SBram Moolenaar    throw 'wrong'
1478a7d6542SBram Moolenaar    add(l, '2')
1488a7d6542SBram Moolenaar  catch
1498a7d6542SBram Moolenaar    add(l, v:exception)
1508a7d6542SBram Moolenaar  finally
1518a7d6542SBram Moolenaar    add(l, '3')
1528a7d6542SBram Moolenaar  endtry
1538a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
1548a7d6542SBram Moolenaarenddef
1558a7d6542SBram Moolenaar
1568a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
1578a7d6542SBram Moolenaar  vim9script
1588a7d6542SBram Moolenaar  let name: string = 'bob'
1598a7d6542SBram Moolenaar  def Concat(arg: string): string
1608a7d6542SBram Moolenaar    return name .. arg
1618a7d6542SBram Moolenaar  enddef
1628a7d6542SBram Moolenaar  let g:result = Concat('bie')
1638a7d6542SBram Moolenaar  let g:localname = name
1648a7d6542SBram Moolenaar
1658a7d6542SBram Moolenaar  export const CONST = 1234
1668a7d6542SBram Moolenaar  export let exported = 9876
1678a7d6542SBram Moolenaar  export def Exported(): string
1688a7d6542SBram Moolenaar    return 'Exported'
1698a7d6542SBram Moolenaar  enddef
1708a7d6542SBram MoolenaarEND
1718a7d6542SBram Moolenaar
1728a7d6542SBram Moolenaardef Test_vim9script()
1738a7d6542SBram Moolenaar  let import_script_lines =<< trim END
1748a7d6542SBram Moolenaar    vim9script
1758a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
1768a7d6542SBram Moolenaar    g:imported = exported
1778a7d6542SBram Moolenaar    g:imported_func = Exported()
1788a7d6542SBram Moolenaar  END
1798a7d6542SBram Moolenaar
1808a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
1818a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
1828a7d6542SBram Moolenaar
1838a7d6542SBram Moolenaar  source Ximport.vim
1848a7d6542SBram Moolenaar
1858a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
1868a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
1878a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
1888a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
1898a7d6542SBram Moolenaar  assert_false(exists('g:name'))
1908a7d6542SBram Moolenaar
1918a7d6542SBram Moolenaar  unlet g:result
1928a7d6542SBram Moolenaar  unlet g:localname
1938a7d6542SBram Moolenaar  unlet g:imported
1948a7d6542SBram Moolenaar  unlet g:imported_func
1958a7d6542SBram Moolenaar  delete('Ximport.vim')
1968a7d6542SBram Moolenaar  delete('Xexport.vim')
1978a7d6542SBram Moolenaar
1988a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
1998a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
2008a7d6542SBram Moolenaarenddef
2018a7d6542SBram Moolenaar
2028a7d6542SBram Moolenaardef Test_vim9script_call()
2038a7d6542SBram Moolenaar  let lines =<< trim END
2048a7d6542SBram Moolenaar    vim9script
2058a7d6542SBram Moolenaar    let var = ''
2068a7d6542SBram Moolenaar    def MyFunc(arg: string)
2078a7d6542SBram Moolenaar       var = arg
2088a7d6542SBram Moolenaar    enddef
2098a7d6542SBram Moolenaar    MyFunc('foobar')
2108a7d6542SBram Moolenaar    assert_equal('foobar', var)
2118a7d6542SBram Moolenaar
2128a7d6542SBram Moolenaar    let str = 'barfoo'
2138a7d6542SBram Moolenaar    str->MyFunc()
2148a7d6542SBram Moolenaar    assert_equal('barfoo', var)
2158a7d6542SBram Moolenaar
2168a7d6542SBram Moolenaar    let g:value = 'value'
2178a7d6542SBram Moolenaar    g:value->MyFunc()
2188a7d6542SBram Moolenaar    assert_equal('value', var)
2198a7d6542SBram Moolenaar
2208a7d6542SBram Moolenaar    let listvar = []
2218a7d6542SBram Moolenaar    def ListFunc(arg: list<number>)
2228a7d6542SBram Moolenaar       listvar = arg
2238a7d6542SBram Moolenaar    enddef
2248a7d6542SBram Moolenaar    [1, 2, 3]->ListFunc()
2258a7d6542SBram Moolenaar    assert_equal([1, 2, 3], listvar)
2268a7d6542SBram Moolenaar
2278a7d6542SBram Moolenaar    let dictvar = {}
2288a7d6542SBram Moolenaar    def DictFunc(arg: dict<number>)
2298a7d6542SBram Moolenaar       dictvar = arg
2308a7d6542SBram Moolenaar    enddef
2318a7d6542SBram Moolenaar    {'a': 1, 'b': 2}->DictFunc()
2328a7d6542SBram Moolenaar    assert_equal(#{a: 1, b: 2}, dictvar)
2338a7d6542SBram Moolenaar    #{a: 3, b: 4}->DictFunc()
2348a7d6542SBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
2358a7d6542SBram Moolenaar  END
2368a7d6542SBram Moolenaar  writefile(lines, 'Xcall.vim')
2378a7d6542SBram Moolenaar  source Xcall.vim
2388a7d6542SBram Moolenaar  delete('Xcall.vim')
2398a7d6542SBram Moolenaarenddef
2408a7d6542SBram Moolenaar
2418a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl()
2428a7d6542SBram Moolenaar  let lines =<< trim END
2438a7d6542SBram Moolenaar    vim9script
2448a7d6542SBram Moolenaar    let var = ''
2458a7d6542SBram Moolenaar    def MyFunc(arg: string)
2468a7d6542SBram Moolenaar       let var = 123
2478a7d6542SBram Moolenaar    enddef
2488a7d6542SBram Moolenaar  END
2498a7d6542SBram Moolenaar  writefile(lines, 'Xcall_decl.vim')
2508a7d6542SBram Moolenaar  assert_fails('source Xcall_decl.vim', 'E1054:')
2518a7d6542SBram Moolenaar  delete('Xcall_decl.vim')
2528a7d6542SBram Moolenaarenddef
2538a7d6542SBram Moolenaar
2548a7d6542SBram Moolenaardef Test_vim9script_call_fail_const()
2558a7d6542SBram Moolenaar  let lines =<< trim END
2568a7d6542SBram Moolenaar    vim9script
2578a7d6542SBram Moolenaar    const var = ''
2588a7d6542SBram Moolenaar    def MyFunc(arg: string)
2598a7d6542SBram Moolenaar       var = 'asdf'
2608a7d6542SBram Moolenaar    enddef
2618a7d6542SBram Moolenaar  END
2628a7d6542SBram Moolenaar  writefile(lines, 'Xcall_const.vim')
2638a7d6542SBram Moolenaar  assert_fails('source Xcall_const.vim', 'E46:')
2648a7d6542SBram Moolenaar  delete('Xcall_const.vim')
2658a7d6542SBram Moolenaarenddef
2668a7d6542SBram Moolenaar
2678a7d6542SBram Moolenaardef Test_vim9script_reload()
2688a7d6542SBram Moolenaar  let lines =<< trim END
2698a7d6542SBram Moolenaar    vim9script
2708a7d6542SBram Moolenaar    const var = ''
2718a7d6542SBram Moolenaar    let valone = 1234
2728a7d6542SBram Moolenaar    def MyFunc(arg: string)
2738a7d6542SBram Moolenaar       valone = 5678
2748a7d6542SBram Moolenaar    enddef
2758a7d6542SBram Moolenaar  END
2768a7d6542SBram Moolenaar  let morelines =<< trim END
2778a7d6542SBram Moolenaar    let valtwo = 222
2788a7d6542SBram Moolenaar    export def GetValtwo(): number
2798a7d6542SBram Moolenaar      return valtwo
2808a7d6542SBram Moolenaar    enddef
2818a7d6542SBram Moolenaar  END
2828a7d6542SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
2838a7d6542SBram Moolenaar  source Xreload.vim
2848a7d6542SBram Moolenaar  source Xreload.vim
2858a7d6542SBram Moolenaar  source Xreload.vim
2868a7d6542SBram Moolenaar
2878a7d6542SBram Moolenaar  let testlines =<< trim END
2888a7d6542SBram Moolenaar    vim9script
2898a7d6542SBram Moolenaar    def TheFunc()
2908a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
2918a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
2928a7d6542SBram Moolenaar    enddef
2938a7d6542SBram Moolenaar    TheFunc()
2948a7d6542SBram Moolenaar  END
2958a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
2968a7d6542SBram Moolenaar  source Ximport.vim
2978a7d6542SBram Moolenaar
2988a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
2998a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
3008a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
3018a7d6542SBram Moolenaar  source Xreload.vim
3028a7d6542SBram Moolenaar  source Ximport.vim
3038a7d6542SBram Moolenaar
3048a7d6542SBram Moolenaar  " cannot declare a var twice
3058a7d6542SBram Moolenaar  lines =<< trim END
3068a7d6542SBram Moolenaar    vim9script
3078a7d6542SBram Moolenaar    let valone = 1234
3088a7d6542SBram Moolenaar    let valone = 5678
3098a7d6542SBram Moolenaar  END
3108a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
3118a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
3128a7d6542SBram Moolenaar
3138a7d6542SBram Moolenaar  delete('Xreload.vim')
3148a7d6542SBram Moolenaar  delete('Ximport.vim')
3158a7d6542SBram Moolenaarenddef
3168a7d6542SBram Moolenaar
3178a7d6542SBram Moolenaardef Test_import_absolute()
3188a7d6542SBram Moolenaar  let import_lines = [
3198a7d6542SBram Moolenaar        \ 'vim9script',
3208a7d6542SBram Moolenaar        \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
321b283a8a6SBram Moolenaar        \ 'def UseExported()',
3228a7d6542SBram Moolenaar        \ '  g:imported_abs = exported',
323*4e12a5dfSBram Moolenaar        \ '  exported = 8888',
324*4e12a5dfSBram Moolenaar        \ '  g:imported_after = exported',
325b283a8a6SBram Moolenaar        \ 'enddef',
326b283a8a6SBram Moolenaar        \ 'UseExported()',
327*4e12a5dfSBram Moolenaar        \ 'g:import_disassembled = execute("disass UseExported")',
3288a7d6542SBram Moolenaar        \ ]
3298a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
3308a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
3318a7d6542SBram Moolenaar
3328a7d6542SBram Moolenaar  source Ximport_abs.vim
3338a7d6542SBram Moolenaar
3348a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
335*4e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
336b283a8a6SBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*'
337b283a8a6SBram Moolenaar        \ .. 'g:imported_abs = exported.*'
338b283a8a6SBram Moolenaar        \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
339*4e12a5dfSBram Moolenaar        \ .. '1 STOREG g:imported_abs.*'
340*4e12a5dfSBram Moolenaar        \ .. 'exported = 8888.*'
341*4e12a5dfSBram Moolenaar        \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
342*4e12a5dfSBram Moolenaar        \ .. 'g:imported_after = exported.*'
343*4e12a5dfSBram Moolenaar        \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
344*4e12a5dfSBram Moolenaar        \ .. '5 STOREG g:imported_after.*'
345*4e12a5dfSBram Moolenaar        \, g:import_disassembled)
3468a7d6542SBram Moolenaar  unlet g:imported_abs
347*4e12a5dfSBram Moolenaar  unlet g:import_disassembled
3488a7d6542SBram Moolenaar
3498a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
3508a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
3518a7d6542SBram Moolenaarenddef
3528a7d6542SBram Moolenaar
3538a7d6542SBram Moolenaardef Test_import_rtp()
3548a7d6542SBram Moolenaar  let import_lines = [
3558a7d6542SBram Moolenaar        \ 'vim9script',
3568a7d6542SBram Moolenaar        \ 'import exported from "Xexport_rtp.vim"',
3578a7d6542SBram Moolenaar        \ 'g:imported_rtp = exported',
3588a7d6542SBram Moolenaar        \ ]
3598a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
3608a7d6542SBram Moolenaar  mkdir('import')
3618a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
3628a7d6542SBram Moolenaar
3638a7d6542SBram Moolenaar  let save_rtp = &rtp
3648a7d6542SBram Moolenaar  &rtp = getcwd()
3658a7d6542SBram Moolenaar  source Ximport_rtp.vim
3668a7d6542SBram Moolenaar  &rtp = save_rtp
3678a7d6542SBram Moolenaar
3688a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
3698a7d6542SBram Moolenaar  unlet g:imported_rtp
3708a7d6542SBram Moolenaar
3718a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
3728a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
3738a7d6542SBram Moolenaar  delete('import', 'd')
3748a7d6542SBram Moolenaarenddef
3758a7d6542SBram Moolenaar
3768a7d6542SBram Moolenaardef Test_fixed_size_list()
3778a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
3788a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
3798a7d6542SBram Moolenaar  l->remove(0)
3808a7d6542SBram Moolenaar  l->add(5)
3818a7d6542SBram Moolenaar  l->insert(99, 1)
3820f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
3838a7d6542SBram Moolenaarenddef
3848a7d6542SBram Moolenaar
385673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not
386673660abSBram Moolenaar" recognized.
387673660abSBram Moolenaarfunc Test_function_python()
388673660abSBram Moolenaar  CheckFeature python3
389673660abSBram Moolenaar  let py = 'python3'
390673660abSBram Moolenaar  execute py "<< EOF"
391673660abSBram Moolenaardef do_something():
392673660abSBram Moolenaar  return 1
393673660abSBram MoolenaarEOF
394673660abSBram Moolenaarendfunc
395673660abSBram Moolenaar
396a259d8d3SBram Moolenaardef HasEval()
397a259d8d3SBram Moolenaar  if has('eval')
398a259d8d3SBram Moolenaar    echo 'yes'
399a259d8d3SBram Moolenaar  else
400a259d8d3SBram Moolenaar    echo 'no'
401a259d8d3SBram Moolenaar  endif
402a259d8d3SBram Moolenaarenddef
403a259d8d3SBram Moolenaar
404a259d8d3SBram Moolenaardef HasNothing()
405a259d8d3SBram Moolenaar  if has('nothing')
406a259d8d3SBram Moolenaar    echo 'yes'
407a259d8d3SBram Moolenaar  else
408a259d8d3SBram Moolenaar    echo 'no'
409a259d8d3SBram Moolenaar  endif
410a259d8d3SBram Moolenaarenddef
411a259d8d3SBram Moolenaar
412a259d8d3SBram Moolenaardef Test_compile_const_expr()
413a259d8d3SBram Moolenaar  assert_equal("\nyes", execute('call HasEval()'))
414a259d8d3SBram Moolenaar  let instr = execute('disassemble HasEval')
4150f18b6d1SBram Moolenaar  assert_match('PUSHS "yes"', instr)
4160f18b6d1SBram Moolenaar  assert_notmatch('PUSHS "no"', instr)
4170f18b6d1SBram Moolenaar  assert_notmatch('JUMP', instr)
418a259d8d3SBram Moolenaar
419a259d8d3SBram Moolenaar  assert_equal("\nno", execute('call HasNothing()'))
420a259d8d3SBram Moolenaar  instr = execute('disassemble HasNothing')
4210f18b6d1SBram Moolenaar  assert_notmatch('PUSHS "yes"', instr)
4220f18b6d1SBram Moolenaar  assert_match('PUSHS "no"', instr)
4230f18b6d1SBram Moolenaar  assert_notmatch('JUMP', instr)
4240f18b6d1SBram Moolenaarenddef
4250f18b6d1SBram Moolenaar
4260f18b6d1SBram Moolenaarfunc NotCompiled()
4270f18b6d1SBram Moolenaar  echo "not"
4280f18b6d1SBram Moolenaarendfunc
4290f18b6d1SBram Moolenaar
4300f18b6d1SBram Moolenaarlet s:scriptvar = 4
4310f18b6d1SBram Moolenaarlet g:globalvar = 'g'
4320f18b6d1SBram Moolenaar
433b283a8a6SBram Moolenaardef s:ScriptFuncLoad(arg: string)
4340f18b6d1SBram Moolenaar  let local = 1
4350f18b6d1SBram Moolenaar  buffers
4360f18b6d1SBram Moolenaar  echo arg
4370f18b6d1SBram Moolenaar  echo local
4380f18b6d1SBram Moolenaar  echo v:version
4390f18b6d1SBram Moolenaar  echo s:scriptvar
4400f18b6d1SBram Moolenaar  echo g:globalvar
4410f18b6d1SBram Moolenaar  echo &tabstop
4420f18b6d1SBram Moolenaar  echo $ENVVAR
4430f18b6d1SBram Moolenaar  echo @z
4440f18b6d1SBram Moolenaarenddef
4450f18b6d1SBram Moolenaar
446b283a8a6SBram Moolenaardef s:ScriptFuncStore()
447b283a8a6SBram Moolenaar  let localnr = 1
448b283a8a6SBram Moolenaar  localnr = 2
449b283a8a6SBram Moolenaar  let localstr = 'abc'
450b283a8a6SBram Moolenaar  localstr = 'xyz'
451b283a8a6SBram Moolenaar  v:char = 'abc'
452b283a8a6SBram Moolenaar  s:scriptvar = 'sv'
453b283a8a6SBram Moolenaar  g:globalvar = 'gv'
454b283a8a6SBram Moolenaar  &tabstop = 8
455b283a8a6SBram Moolenaar  $ENVVAR = 'ev'
456b283a8a6SBram Moolenaar  @z = 'rv'
457b283a8a6SBram Moolenaarenddef
458b283a8a6SBram Moolenaar
4590f18b6d1SBram Moolenaardef Test_disassemble()
4600f18b6d1SBram Moolenaar  assert_fails('disass NoFunc', 'E1061:')
4610f18b6d1SBram Moolenaar  assert_fails('disass NotCompiled', 'E1062:')
4620f18b6d1SBram Moolenaar
463b283a8a6SBram Moolenaar  let res = execute('disass s:ScriptFuncLoad')
464b283a8a6SBram Moolenaar  assert_match('<SNR>\d*_ScriptFuncLoad.*'
4650f18b6d1SBram Moolenaar        \ .. 'buffers.*'
4660f18b6d1SBram Moolenaar        \ .. ' EXEC \+buffers.*'
4670f18b6d1SBram Moolenaar        \ .. ' LOAD arg\[-1\].*'
4680f18b6d1SBram Moolenaar        \ .. ' LOAD $0.*'
4690f18b6d1SBram Moolenaar        \ .. ' LOADV v:version.*'
4700f18b6d1SBram Moolenaar        \ .. ' LOADS s:scriptvar from .*test_vim9_script.vim.*'
4710f18b6d1SBram Moolenaar        \ .. ' LOADG g:globalvar.*'
4720f18b6d1SBram Moolenaar        \ .. ' LOADENV $ENVVAR.*'
473b283a8a6SBram Moolenaar        \ .. ' LOADREG @z.*'
474b283a8a6SBram Moolenaar        \, res)
475b283a8a6SBram Moolenaar
476b283a8a6SBram Moolenaar  " TODO:
477b283a8a6SBram Moolenaar  " v:char =
478b283a8a6SBram Moolenaar  " s:scriptvar =
479b283a8a6SBram Moolenaar  res = execute('disass s:ScriptFuncStore')
480b283a8a6SBram Moolenaar  assert_match('<SNR>\d*_ScriptFuncStore.*'
481b283a8a6SBram Moolenaar        \ .. 'localnr = 2.*'
482b283a8a6SBram Moolenaar        \ .. ' STORE 2 in $0.*'
483b283a8a6SBram Moolenaar        \ .. 'localstr = ''xyz''.*'
484b283a8a6SBram Moolenaar        \ .. ' STORE $1.*'
485b283a8a6SBram Moolenaar        \ .. 'v:char = ''abc''.*'
486b283a8a6SBram Moolenaar        \ .. 'STOREV v:char.*'
487b283a8a6SBram Moolenaar        \ .. 's:scriptvar = ''sv''.*'
488b283a8a6SBram Moolenaar        \ .. ' STORES s:scriptvar in .*test_vim9_script.vim.*'
489b283a8a6SBram Moolenaar        \ .. 'g:globalvar = ''gv''.*'
490b283a8a6SBram Moolenaar        \ .. ' STOREG g:globalvar.*'
491b283a8a6SBram Moolenaar        \ .. '&tabstop = 8.*'
492b283a8a6SBram Moolenaar        \ .. ' STOREOPT &tabstop.*'
493b283a8a6SBram Moolenaar        \ .. '$ENVVAR = ''ev''.*'
494b283a8a6SBram Moolenaar        \ .. ' STOREENV $ENVVAR.*'
495b283a8a6SBram Moolenaar        \ .. '@z = ''rv''.*'
496b283a8a6SBram Moolenaar        \ .. ' STOREREG @z.*'
497b283a8a6SBram Moolenaar        \, res)
498a259d8d3SBram Moolenaarenddef
499a259d8d3SBram Moolenaar
5008a7d6542SBram Moolenaar
5018a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
502