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)
7*978d170bSBram 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}
458a7d6542SBram Moolenaarenddef
468a7d6542SBram Moolenaar
478a7d6542SBram Moolenaarfunc Test_assignment_failure()
488a7d6542SBram Moolenaar  call CheckDefFailure(['let var=234'], 'E1004:')
498a7d6542SBram Moolenaar  call CheckDefFailure(['let var =234'], 'E1004:')
508a7d6542SBram Moolenaar  call CheckDefFailure(['let var= 234'], 'E1004:')
518a7d6542SBram Moolenaar
528a7d6542SBram Moolenaar  call CheckDefFailure(['let true = 1'], 'E1034:')
538a7d6542SBram Moolenaar  call CheckDefFailure(['let false = 1'], 'E1034:')
548a7d6542SBram Moolenaar
558a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
568a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
578a7d6542SBram Moolenaar
588a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
598a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
608a7d6542SBram Moolenaar
618a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
628a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
638a7d6542SBram Moolenaarendfunc
648a7d6542SBram Moolenaar
658a7d6542SBram Moolenaarfunc Test_const()
668a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
678a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
688a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
698a7d6542SBram Moolenaarendfunc
708a7d6542SBram Moolenaar
718a7d6542SBram Moolenaardef Test_block()
728a7d6542SBram Moolenaar  let outer = 1
738a7d6542SBram Moolenaar  {
748a7d6542SBram Moolenaar    let inner = 2
758a7d6542SBram Moolenaar    assert_equal(1, outer)
768a7d6542SBram Moolenaar    assert_equal(2, inner)
778a7d6542SBram Moolenaar  }
788a7d6542SBram Moolenaar  assert_equal(1, outer)
798a7d6542SBram Moolenaarenddef
808a7d6542SBram Moolenaar
818a7d6542SBram Moolenaarfunc Test_block_failure()
828a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
838a7d6542SBram Moolenaarendfunc
848a7d6542SBram Moolenaar
858a7d6542SBram Moolenaardef ReturnString(): string
868a7d6542SBram Moolenaar  return 'string'
878a7d6542SBram Moolenaarenddef
888a7d6542SBram Moolenaar
898a7d6542SBram Moolenaardef ReturnNumber(): number
908a7d6542SBram Moolenaar  return 123
918a7d6542SBram Moolenaarenddef
928a7d6542SBram Moolenaar
938a7d6542SBram Moolenaardef Test_return_string()
948a7d6542SBram Moolenaar  assert_equal('string', ReturnString())
958a7d6542SBram Moolenaar  assert_equal(123, ReturnNumber())
968a7d6542SBram Moolenaarenddef
978a7d6542SBram Moolenaar
988a7d6542SBram Moolenaarfunc Increment()
998a7d6542SBram Moolenaar  let g:counter += 1
1008a7d6542SBram Moolenaarendfunc
1018a7d6542SBram Moolenaar
1028a7d6542SBram Moolenaardef Test_call_ufunc_count()
1038a7d6542SBram Moolenaar  g:counter = 1
1048a7d6542SBram Moolenaar  Increment()
1058a7d6542SBram Moolenaar  Increment()
1068a7d6542SBram Moolenaar  Increment()
1078a7d6542SBram Moolenaar  " works with and without :call
1088a7d6542SBram Moolenaar  assert_equal(4, g:counter)
1098a7d6542SBram Moolenaar  call assert_equal(4, g:counter)
1108a7d6542SBram Moolenaar  unlet g:counter
1118a7d6542SBram Moolenaarenddef
1128a7d6542SBram Moolenaar
1138a7d6542SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string
1148a7d6542SBram Moolenaar  let res = arg
1158a7d6542SBram Moolenaar  for s in rest
1168a7d6542SBram Moolenaar    res ..= ',' .. s
1178a7d6542SBram Moolenaar  endfor
1188a7d6542SBram Moolenaar  return res
1198a7d6542SBram Moolenaarenddef
1208a7d6542SBram Moolenaar
1218a7d6542SBram Moolenaardef Test_call_varargs()
1228a7d6542SBram Moolenaar  assert_equal('one', MyVarargs('one'))
1238a7d6542SBram Moolenaar  assert_equal('one,two', MyVarargs('one', 'two'))
1248a7d6542SBram Moolenaar  assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
1258a7d6542SBram Moolenaarenddef
1268a7d6542SBram Moolenaar
1278a7d6542SBram Moolenaardef Test_return_type_wrong()
1288a7d6542SBram Moolenaar  " TODO: why is ! needed for Mac and FreeBSD?
129*978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
130*978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
131*978d170bSBram Moolenaar  CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
132*978d170bSBram Moolenaar  CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
1338a7d6542SBram Moolenaarenddef
1348a7d6542SBram Moolenaar
1358a7d6542SBram Moolenaardef Test_try_catch()
1368a7d6542SBram Moolenaar  let l = []
1378a7d6542SBram Moolenaar  try
1388a7d6542SBram Moolenaar    add(l, '1')
1398a7d6542SBram Moolenaar    throw 'wrong'
1408a7d6542SBram Moolenaar    add(l, '2')
1418a7d6542SBram Moolenaar  catch
1428a7d6542SBram Moolenaar    add(l, v:exception)
1438a7d6542SBram Moolenaar  finally
1448a7d6542SBram Moolenaar    add(l, '3')
1458a7d6542SBram Moolenaar  endtry
1468a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
1478a7d6542SBram Moolenaarenddef
1488a7d6542SBram Moolenaar
1498a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
1508a7d6542SBram Moolenaar  vim9script
1518a7d6542SBram Moolenaar  let name: string = 'bob'
1528a7d6542SBram Moolenaar  def Concat(arg: string): string
1538a7d6542SBram Moolenaar    return name .. arg
1548a7d6542SBram Moolenaar  enddef
1558a7d6542SBram Moolenaar  let g:result = Concat('bie')
1568a7d6542SBram Moolenaar  let g:localname = name
1578a7d6542SBram Moolenaar
1588a7d6542SBram Moolenaar  export const CONST = 1234
1598a7d6542SBram Moolenaar  export let exported = 9876
1608a7d6542SBram Moolenaar  export def Exported(): string
1618a7d6542SBram Moolenaar    return 'Exported'
1628a7d6542SBram Moolenaar  enddef
1638a7d6542SBram MoolenaarEND
1648a7d6542SBram Moolenaar
1658a7d6542SBram Moolenaardef Test_vim9script()
1668a7d6542SBram Moolenaar  let import_script_lines =<< trim END
1678a7d6542SBram Moolenaar    vim9script
1688a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
1698a7d6542SBram Moolenaar    g:imported = exported
1708a7d6542SBram Moolenaar    g:imported_func = Exported()
1718a7d6542SBram Moolenaar  END
1728a7d6542SBram Moolenaar
1738a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
1748a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
1758a7d6542SBram Moolenaar
1768a7d6542SBram Moolenaar  source Ximport.vim
1778a7d6542SBram Moolenaar
1788a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
1798a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
1808a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
1818a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
1828a7d6542SBram Moolenaar  assert_false(exists('g:name'))
1838a7d6542SBram Moolenaar
1848a7d6542SBram Moolenaar  unlet g:result
1858a7d6542SBram Moolenaar  unlet g:localname
1868a7d6542SBram Moolenaar  unlet g:imported
1878a7d6542SBram Moolenaar  unlet g:imported_func
1888a7d6542SBram Moolenaar  delete('Ximport.vim')
1898a7d6542SBram Moolenaar  delete('Xexport.vim')
1908a7d6542SBram Moolenaar
1918a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
1928a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1938a7d6542SBram Moolenaarenddef
1948a7d6542SBram Moolenaar
1958a7d6542SBram Moolenaardef Test_vim9script_call()
1968a7d6542SBram Moolenaar  let lines =<< trim END
1978a7d6542SBram Moolenaar    vim9script
1988a7d6542SBram Moolenaar    let var = ''
1998a7d6542SBram Moolenaar    def MyFunc(arg: string)
2008a7d6542SBram Moolenaar       var = arg
2018a7d6542SBram Moolenaar    enddef
2028a7d6542SBram Moolenaar    MyFunc('foobar')
2038a7d6542SBram Moolenaar    assert_equal('foobar', var)
2048a7d6542SBram Moolenaar
2058a7d6542SBram Moolenaar    let str = 'barfoo'
2068a7d6542SBram Moolenaar    str->MyFunc()
2078a7d6542SBram Moolenaar    assert_equal('barfoo', var)
2088a7d6542SBram Moolenaar
2098a7d6542SBram Moolenaar    let g:value = 'value'
2108a7d6542SBram Moolenaar    g:value->MyFunc()
2118a7d6542SBram Moolenaar    assert_equal('value', var)
2128a7d6542SBram Moolenaar
2138a7d6542SBram Moolenaar    let listvar = []
2148a7d6542SBram Moolenaar    def ListFunc(arg: list<number>)
2158a7d6542SBram Moolenaar       listvar = arg
2168a7d6542SBram Moolenaar    enddef
2178a7d6542SBram Moolenaar    [1, 2, 3]->ListFunc()
2188a7d6542SBram Moolenaar    assert_equal([1, 2, 3], listvar)
2198a7d6542SBram Moolenaar
2208a7d6542SBram Moolenaar    let dictvar = {}
2218a7d6542SBram Moolenaar    def DictFunc(arg: dict<number>)
2228a7d6542SBram Moolenaar       dictvar = arg
2238a7d6542SBram Moolenaar    enddef
2248a7d6542SBram Moolenaar    {'a': 1, 'b': 2}->DictFunc()
2258a7d6542SBram Moolenaar    assert_equal(#{a: 1, b: 2}, dictvar)
2268a7d6542SBram Moolenaar    #{a: 3, b: 4}->DictFunc()
2278a7d6542SBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
2288a7d6542SBram Moolenaar  END
2298a7d6542SBram Moolenaar  writefile(lines, 'Xcall.vim')
2308a7d6542SBram Moolenaar  source Xcall.vim
2318a7d6542SBram Moolenaar  delete('Xcall.vim')
2328a7d6542SBram Moolenaarenddef
2338a7d6542SBram Moolenaar
2348a7d6542SBram Moolenaardef Test_vim9script_call_fail_decl()
2358a7d6542SBram Moolenaar  let lines =<< trim END
2368a7d6542SBram Moolenaar    vim9script
2378a7d6542SBram Moolenaar    let var = ''
2388a7d6542SBram Moolenaar    def MyFunc(arg: string)
2398a7d6542SBram Moolenaar       let var = 123
2408a7d6542SBram Moolenaar    enddef
2418a7d6542SBram Moolenaar  END
2428a7d6542SBram Moolenaar  writefile(lines, 'Xcall_decl.vim')
2438a7d6542SBram Moolenaar  assert_fails('source Xcall_decl.vim', 'E1054:')
2448a7d6542SBram Moolenaar  delete('Xcall_decl.vim')
2458a7d6542SBram Moolenaarenddef
2468a7d6542SBram Moolenaar
2478a7d6542SBram Moolenaardef Test_vim9script_call_fail_const()
2488a7d6542SBram Moolenaar  let lines =<< trim END
2498a7d6542SBram Moolenaar    vim9script
2508a7d6542SBram Moolenaar    const var = ''
2518a7d6542SBram Moolenaar    def MyFunc(arg: string)
2528a7d6542SBram Moolenaar       var = 'asdf'
2538a7d6542SBram Moolenaar    enddef
2548a7d6542SBram Moolenaar  END
2558a7d6542SBram Moolenaar  writefile(lines, 'Xcall_const.vim')
2568a7d6542SBram Moolenaar  assert_fails('source Xcall_const.vim', 'E46:')
2578a7d6542SBram Moolenaar  delete('Xcall_const.vim')
2588a7d6542SBram Moolenaarenddef
2598a7d6542SBram Moolenaar
2608a7d6542SBram Moolenaardef Test_vim9script_reload()
2618a7d6542SBram Moolenaar  let lines =<< trim END
2628a7d6542SBram Moolenaar    vim9script
2638a7d6542SBram Moolenaar    const var = ''
2648a7d6542SBram Moolenaar    let valone = 1234
2658a7d6542SBram Moolenaar    def MyFunc(arg: string)
2668a7d6542SBram Moolenaar       valone = 5678
2678a7d6542SBram Moolenaar    enddef
2688a7d6542SBram Moolenaar  END
2698a7d6542SBram Moolenaar  let morelines =<< trim END
2708a7d6542SBram Moolenaar    let valtwo = 222
2718a7d6542SBram Moolenaar    export def GetValtwo(): number
2728a7d6542SBram Moolenaar      return valtwo
2738a7d6542SBram Moolenaar    enddef
2748a7d6542SBram Moolenaar  END
2758a7d6542SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
2768a7d6542SBram Moolenaar  source Xreload.vim
2778a7d6542SBram Moolenaar  source Xreload.vim
2788a7d6542SBram Moolenaar  source Xreload.vim
2798a7d6542SBram Moolenaar
2808a7d6542SBram Moolenaar  let testlines =<< trim END
2818a7d6542SBram Moolenaar    vim9script
2828a7d6542SBram Moolenaar    def TheFunc()
2838a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
2848a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
2858a7d6542SBram Moolenaar    enddef
2868a7d6542SBram Moolenaar    TheFunc()
2878a7d6542SBram Moolenaar  END
2888a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
2898a7d6542SBram Moolenaar  source Ximport.vim
2908a7d6542SBram Moolenaar
2918a7d6542SBram Moolenaar  " test that when not using "morelines" valtwo is still defined
2928a7d6542SBram Moolenaar  " need to source Xreload.vim again, import doesn't reload a script
2938a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
2948a7d6542SBram Moolenaar  source Xreload.vim
2958a7d6542SBram Moolenaar  source Ximport.vim
2968a7d6542SBram Moolenaar
2978a7d6542SBram Moolenaar  " cannot declare a var twice
2988a7d6542SBram Moolenaar  lines =<< trim END
2998a7d6542SBram Moolenaar    vim9script
3008a7d6542SBram Moolenaar    let valone = 1234
3018a7d6542SBram Moolenaar    let valone = 5678
3028a7d6542SBram Moolenaar  END
3038a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
3048a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
3058a7d6542SBram Moolenaar
3068a7d6542SBram Moolenaar  delete('Xreload.vim')
3078a7d6542SBram Moolenaar  delete('Ximport.vim')
3088a7d6542SBram Moolenaarenddef
3098a7d6542SBram Moolenaar
3108a7d6542SBram Moolenaardef Test_import_absolute()
3118a7d6542SBram Moolenaar  let import_lines = [
3128a7d6542SBram Moolenaar        \ 'vim9script',
3138a7d6542SBram Moolenaar        \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
3148a7d6542SBram Moolenaar        \ 'g:imported_abs = exported',
3158a7d6542SBram Moolenaar        \ ]
3168a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
3178a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
3188a7d6542SBram Moolenaar
3198a7d6542SBram Moolenaar  source Ximport_abs.vim
3208a7d6542SBram Moolenaar
3218a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
3228a7d6542SBram Moolenaar  unlet g:imported_abs
3238a7d6542SBram Moolenaar
3248a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
3258a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
3268a7d6542SBram Moolenaarenddef
3278a7d6542SBram Moolenaar
3288a7d6542SBram Moolenaardef Test_import_rtp()
3298a7d6542SBram Moolenaar  let import_lines = [
3308a7d6542SBram Moolenaar        \ 'vim9script',
3318a7d6542SBram Moolenaar        \ 'import exported from "Xexport_rtp.vim"',
3328a7d6542SBram Moolenaar        \ 'g:imported_rtp = exported',
3338a7d6542SBram Moolenaar        \ ]
3348a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
3358a7d6542SBram Moolenaar  mkdir('import')
3368a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
3378a7d6542SBram Moolenaar
3388a7d6542SBram Moolenaar  let save_rtp = &rtp
3398a7d6542SBram Moolenaar  &rtp = getcwd()
3408a7d6542SBram Moolenaar  source Ximport_rtp.vim
3418a7d6542SBram Moolenaar  &rtp = save_rtp
3428a7d6542SBram Moolenaar
3438a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
3448a7d6542SBram Moolenaar  unlet g:imported_rtp
3458a7d6542SBram Moolenaar
3468a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
3478a7d6542SBram Moolenaar  delete('import/Xexport_rtp.vim')
3488a7d6542SBram Moolenaar  delete('import', 'd')
3498a7d6542SBram Moolenaarenddef
3508a7d6542SBram Moolenaar
3518a7d6542SBram Moolenaardef Test_fixed_size_list()
3528a7d6542SBram Moolenaar  " will be allocated as one piece of memory, check that changes work
3538a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
3548a7d6542SBram Moolenaar  l->remove(0)
3558a7d6542SBram Moolenaar  l->add(5)
3568a7d6542SBram Moolenaar  l->insert(99, 1)
3578a7d6542SBram Moolenaar  call assert_equal([2, 99, 3, 4, 5], l)
3588a7d6542SBram Moolenaarenddef
3598a7d6542SBram Moolenaar
360673660abSBram Moolenaar" Test that inside :function a Python function can be defined, :def is not
361673660abSBram Moolenaar" recognized.
362673660abSBram Moolenaarfunc Test_function_python()
363673660abSBram Moolenaar  CheckFeature python3
364673660abSBram Moolenaar  let py = 'python3'
365673660abSBram Moolenaar  execute py "<< EOF"
366673660abSBram Moolenaardef do_something():
367673660abSBram Moolenaar  return 1
368673660abSBram MoolenaarEOF
369673660abSBram Moolenaarendfunc
370673660abSBram Moolenaar
3718a7d6542SBram Moolenaar
3728a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
373