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}
45*b283a8a6SBram Moolenaar
46*b283a8a6SBram Moolenaar  v:char = 'abc'
47*b283a8a6SBram Moolenaar  call assert_equal('abc', v:char)
48*b283a8a6SBram Moolenaar
49*b283a8a6SBram Moolenaar  $ENVVAR = 'foobar'
50*b283a8a6SBram Moolenaar  call assert_equal('foobar', $ENVVAR)
51*b283a8a6SBram 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)
116*b283a8a6SBram 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"',
321*b283a8a6SBram Moolenaar        \ 'def UseExported()',
3228a7d6542SBram Moolenaar        \ '  g:imported_abs = exported',
323*b283a8a6SBram Moolenaar        \ 'enddef',
324*b283a8a6SBram Moolenaar        \ 'UseExported()',
325*b283a8a6SBram Moolenaar        \ 'g:import_disassabled = execute("disass UseExported")',
3268a7d6542SBram Moolenaar        \ ]
3278a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
3288a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
3298a7d6542SBram Moolenaar
3308a7d6542SBram Moolenaar  source Ximport_abs.vim
3318a7d6542SBram Moolenaar
3328a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
333*b283a8a6SBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*'
334*b283a8a6SBram Moolenaar        \ .. 'g:imported_abs = exported.*'
335*b283a8a6SBram Moolenaar        \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
336*b283a8a6SBram Moolenaar        \ .. '1 STOREG g:imported_abs', g:import_disassabled)
3378a7d6542SBram Moolenaar  unlet g:imported_abs
338*b283a8a6SBram Moolenaar  unlet g:import_disassabled
3398a7d6542SBram Moolenaar
3408a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
3418a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
3428a7d6542SBram Moolenaarenddef
3438a7d6542SBram Moolenaar
3448a7d6542SBram Moolenaardef Test_import_rtp()
3458a7d6542SBram Moolenaar  let import_lines = [
3468a7d6542SBram Moolenaar        \ 'vim9script',
3478a7d6542SBram Moolenaar        \ 'import exported from "Xexport_rtp.vim"',
3488a7d6542SBram Moolenaar        \ 'g:imported_rtp = exported',
3498a7d6542SBram Moolenaar        \ ]
3508a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
3518a7d6542SBram Moolenaar  mkdir('import')
3528a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
3538a7d6542SBram Moolenaar
3548a7d6542SBram Moolenaar  let save_rtp = &rtp
3558a7d6542SBram Moolenaar  &rtp = getcwd()
3568a7d6542SBram Moolenaar  source Ximport_rtp.vim
3578a7d6542SBram Moolenaar  &rtp = save_rtp
3588a7d6542SBram Moolenaar
3598a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
3608a7d6542SBram Moolenaar  unlet g:imported_rtp
3618a7d6542SBram Moolenaar
3628a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
3638a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
3648a7d6542SBram Moolenaar  delete('import', 'd')
3658a7d6542SBram Moolenaarenddef
3668a7d6542SBram Moolenaar
3678a7d6542SBram Moolenaardef Test_fixed_size_list()
3688a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
3698a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
3708a7d6542SBram Moolenaar  l->remove(0)
3718a7d6542SBram Moolenaar  l->add(5)
3728a7d6542SBram Moolenaar  l->insert(99, 1)
3730f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
3748a7d6542SBram Moolenaarenddef
3758a7d6542SBram Moolenaar
376673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not
377673660abSBram Moolenaar" recognized.
378673660abSBram Moolenaarfunc Test_function_python()
379673660abSBram Moolenaar  CheckFeature python3
380673660abSBram Moolenaar  let py = 'python3'
381673660abSBram Moolenaar  execute py "<< EOF"
382673660abSBram Moolenaardef do_something():
383673660abSBram Moolenaar  return 1
384673660abSBram MoolenaarEOF
385673660abSBram Moolenaarendfunc
386673660abSBram Moolenaar
387a259d8d3SBram Moolenaardef HasEval()
388a259d8d3SBram Moolenaar  if has('eval')
389a259d8d3SBram Moolenaar    echo 'yes'
390a259d8d3SBram Moolenaar  else
391a259d8d3SBram Moolenaar    echo 'no'
392a259d8d3SBram Moolenaar  endif
393a259d8d3SBram Moolenaarenddef
394a259d8d3SBram Moolenaar
395a259d8d3SBram Moolenaardef HasNothing()
396a259d8d3SBram Moolenaar  if has('nothing')
397a259d8d3SBram Moolenaar    echo 'yes'
398a259d8d3SBram Moolenaar  else
399a259d8d3SBram Moolenaar    echo 'no'
400a259d8d3SBram Moolenaar  endif
401a259d8d3SBram Moolenaarenddef
402a259d8d3SBram Moolenaar
403a259d8d3SBram Moolenaardef Test_compile_const_expr()
404a259d8d3SBram Moolenaar  assert_equal("\nyes", execute('call HasEval()'))
405a259d8d3SBram Moolenaar  let instr = execute('disassemble HasEval')
4060f18b6d1SBram Moolenaar  assert_match('PUSHS "yes"', instr)
4070f18b6d1SBram Moolenaar  assert_notmatch('PUSHS "no"', instr)
4080f18b6d1SBram Moolenaar  assert_notmatch('JUMP', instr)
409a259d8d3SBram Moolenaar
410a259d8d3SBram Moolenaar  assert_equal("\nno", execute('call HasNothing()'))
411a259d8d3SBram Moolenaar  instr = execute('disassemble HasNothing')
4120f18b6d1SBram Moolenaar  assert_notmatch('PUSHS "yes"', instr)
4130f18b6d1SBram Moolenaar  assert_match('PUSHS "no"', instr)
4140f18b6d1SBram Moolenaar  assert_notmatch('JUMP', instr)
4150f18b6d1SBram Moolenaarenddef
4160f18b6d1SBram Moolenaar
4170f18b6d1SBram Moolenaarfunc NotCompiled()
4180f18b6d1SBram Moolenaar  echo "not"
4190f18b6d1SBram Moolenaarendfunc
4200f18b6d1SBram Moolenaar
4210f18b6d1SBram Moolenaarlet s:scriptvar = 4
4220f18b6d1SBram Moolenaarlet g:globalvar = 'g'
4230f18b6d1SBram Moolenaar
424*b283a8a6SBram Moolenaardef s:ScriptFuncLoad(arg: string)
4250f18b6d1SBram Moolenaar  let local = 1
4260f18b6d1SBram Moolenaar  buffers
4270f18b6d1SBram Moolenaar  echo arg
4280f18b6d1SBram Moolenaar  echo local
4290f18b6d1SBram Moolenaar  echo v:version
4300f18b6d1SBram Moolenaar  echo s:scriptvar
4310f18b6d1SBram Moolenaar  echo g:globalvar
4320f18b6d1SBram Moolenaar  echo &tabstop
4330f18b6d1SBram Moolenaar  echo $ENVVAR
4340f18b6d1SBram Moolenaar  echo @z
4350f18b6d1SBram Moolenaarenddef
4360f18b6d1SBram Moolenaar
437*b283a8a6SBram Moolenaardef s:ScriptFuncStore()
438*b283a8a6SBram Moolenaar  let localnr = 1
439*b283a8a6SBram Moolenaar  localnr = 2
440*b283a8a6SBram Moolenaar  let localstr = 'abc'
441*b283a8a6SBram Moolenaar  localstr = 'xyz'
442*b283a8a6SBram Moolenaar  v:char = 'abc'
443*b283a8a6SBram Moolenaar  s:scriptvar = 'sv'
444*b283a8a6SBram Moolenaar  g:globalvar = 'gv'
445*b283a8a6SBram Moolenaar  &tabstop = 8
446*b283a8a6SBram Moolenaar  $ENVVAR = 'ev'
447*b283a8a6SBram Moolenaar  @z = 'rv'
448*b283a8a6SBram Moolenaarenddef
449*b283a8a6SBram Moolenaar
4500f18b6d1SBram Moolenaardef Test_disassemble()
4510f18b6d1SBram Moolenaar  assert_fails('disass NoFunc', 'E1061:')
4520f18b6d1SBram Moolenaar  assert_fails('disass NotCompiled', 'E1062:')
4530f18b6d1SBram Moolenaar
454*b283a8a6SBram Moolenaar  let res = execute('disass s:ScriptFuncLoad')
455*b283a8a6SBram Moolenaar  assert_match('<SNR>\d*_ScriptFuncLoad.*'
4560f18b6d1SBram Moolenaar        \ .. 'buffers.*'
4570f18b6d1SBram Moolenaar        \ .. ' EXEC \+buffers.*'
4580f18b6d1SBram Moolenaar        \ .. ' LOAD arg\[-1\].*'
4590f18b6d1SBram Moolenaar        \ .. ' LOAD $0.*'
4600f18b6d1SBram Moolenaar        \ .. ' LOADV v:version.*'
4610f18b6d1SBram Moolenaar        \ .. ' LOADS s:scriptvar from .*test_vim9_script.vim.*'
4620f18b6d1SBram Moolenaar        \ .. ' LOADG g:globalvar.*'
4630f18b6d1SBram Moolenaar        \ .. ' LOADENV $ENVVAR.*'
464*b283a8a6SBram Moolenaar        \ .. ' LOADREG @z.*'
465*b283a8a6SBram Moolenaar        \, res)
466*b283a8a6SBram Moolenaar
467*b283a8a6SBram Moolenaar  " TODO:
468*b283a8a6SBram Moolenaar  " v:char =
469*b283a8a6SBram Moolenaar  " s:scriptvar =
470*b283a8a6SBram Moolenaar  res = execute('disass s:ScriptFuncStore')
471*b283a8a6SBram Moolenaar  assert_match('<SNR>\d*_ScriptFuncStore.*'
472*b283a8a6SBram Moolenaar        \ .. 'localnr = 2.*'
473*b283a8a6SBram Moolenaar        \ .. ' STORE 2 in $0.*'
474*b283a8a6SBram Moolenaar        \ .. 'localstr = ''xyz''.*'
475*b283a8a6SBram Moolenaar        \ .. ' STORE $1.*'
476*b283a8a6SBram Moolenaar        \ .. 'v:char = ''abc''.*'
477*b283a8a6SBram Moolenaar        \ .. 'STOREV v:char.*'
478*b283a8a6SBram Moolenaar        \ .. 's:scriptvar = ''sv''.*'
479*b283a8a6SBram Moolenaar        \ .. ' STORES s:scriptvar in .*test_vim9_script.vim.*'
480*b283a8a6SBram Moolenaar        \ .. 'g:globalvar = ''gv''.*'
481*b283a8a6SBram Moolenaar        \ .. ' STOREG g:globalvar.*'
482*b283a8a6SBram Moolenaar        \ .. '&tabstop = 8.*'
483*b283a8a6SBram Moolenaar        \ .. ' STOREOPT &tabstop.*'
484*b283a8a6SBram Moolenaar        \ .. '$ENVVAR = ''ev''.*'
485*b283a8a6SBram Moolenaar        \ .. ' STOREENV $ENVVAR.*'
486*b283a8a6SBram Moolenaar        \ .. '@z = ''rv''.*'
487*b283a8a6SBram Moolenaar        \ .. ' STOREREG @z.*'
488*b283a8a6SBram Moolenaar        \, res)
489a259d8d3SBram Moolenaarenddef
490a259d8d3SBram Moolenaar
4918a7d6542SBram Moolenaar
4928a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
493