15deeb3f1SBram Moolenaar" Test various aspects of the Vim9 script language.
25deeb3f1SBram Moolenaar
35deeb3f1SBram Moolenaarsource check.vim
45deeb3f1SBram Moolenaarsource view_util.vim
55deeb3f1SBram Moolenaar
65deeb3f1SBram Moolenaar" Check that "lines" inside ":def" results in an "error" message.
75deeb3f1SBram Moolenaarfunc CheckDefFailure(lines, error)
85deeb3f1SBram Moolenaar  call writefile(['def Func()'] + a:lines + ['enddef'], 'Xdef')
95deeb3f1SBram Moolenaar  call assert_fails('so Xdef', a:error, a:lines)
105deeb3f1SBram Moolenaar  call delete('Xdef')
115deeb3f1SBram Moolenaarendfunc
125deeb3f1SBram Moolenaar
135deeb3f1SBram Moolenaarfunc CheckScriptFailure(lines, error)
145deeb3f1SBram Moolenaar  call writefile(a:lines, 'Xdef')
155deeb3f1SBram Moolenaar  call assert_fails('so Xdef', a:error, a:lines)
165deeb3f1SBram Moolenaar  call delete('Xdef')
175deeb3f1SBram Moolenaarendfunc
185deeb3f1SBram Moolenaar
195deeb3f1SBram Moolenaarfunc Test_def_basic()
205deeb3f1SBram Moolenaar  def SomeFunc(): string
215deeb3f1SBram Moolenaar    return 'yes'
225deeb3f1SBram Moolenaar  enddef
235deeb3f1SBram Moolenaar  call assert_equal('yes', SomeFunc())
245deeb3f1SBram Moolenaarendfunc
255deeb3f1SBram Moolenaar
265deeb3f1SBram Moolenaardef ReturnString(): string
275deeb3f1SBram Moolenaar  return 'string'
285deeb3f1SBram Moolenaarenddef
295deeb3f1SBram Moolenaar
305deeb3f1SBram Moolenaardef ReturnNumber(): number
315deeb3f1SBram Moolenaar  return 123
325deeb3f1SBram Moolenaarenddef
335deeb3f1SBram Moolenaar
345deeb3f1SBram Moolenaarlet g:notNumber = 'string'
355deeb3f1SBram Moolenaar
365deeb3f1SBram Moolenaardef ReturnGlobal(): number
375deeb3f1SBram Moolenaar  return g:notNumber
385deeb3f1SBram Moolenaarenddef
395deeb3f1SBram Moolenaar
405deeb3f1SBram Moolenaardef Test_return_something()
415deeb3f1SBram Moolenaar  assert_equal('string', ReturnString())
425deeb3f1SBram Moolenaar  assert_equal(123, ReturnNumber())
435deeb3f1SBram Moolenaar  assert_fails('call ReturnGlobal()', 'E1029: Expected number but got string')
445deeb3f1SBram Moolenaarenddef
455deeb3f1SBram Moolenaar
465deeb3f1SBram Moolenaarlet s:nothing = 0
475deeb3f1SBram Moolenaardef ReturnNothing()
485deeb3f1SBram Moolenaar  s:nothing = 1
495deeb3f1SBram Moolenaar  if true
505deeb3f1SBram Moolenaar    return
515deeb3f1SBram Moolenaar  endif
525deeb3f1SBram Moolenaar  s:nothing = 2
535deeb3f1SBram Moolenaarenddef
545deeb3f1SBram Moolenaar
555deeb3f1SBram Moolenaardef Test_return_nothing()
565deeb3f1SBram Moolenaar  ReturnNothing()
575deeb3f1SBram Moolenaar  assert_equal(1, s:nothing)
585deeb3f1SBram Moolenaarenddef
595deeb3f1SBram Moolenaar
605deeb3f1SBram Moolenaarfunc Increment()
615deeb3f1SBram Moolenaar  let g:counter += 1
625deeb3f1SBram Moolenaarendfunc
635deeb3f1SBram Moolenaar
645deeb3f1SBram Moolenaardef Test_call_ufunc_count()
655deeb3f1SBram Moolenaar  g:counter = 1
665deeb3f1SBram Moolenaar  Increment()
675deeb3f1SBram Moolenaar  Increment()
685deeb3f1SBram Moolenaar  Increment()
695deeb3f1SBram Moolenaar  " works with and without :call
705deeb3f1SBram Moolenaar  assert_equal(4, g:counter)
715deeb3f1SBram Moolenaar  call assert_equal(4, g:counter)
725deeb3f1SBram Moolenaar  unlet g:counter
735deeb3f1SBram Moolenaarenddef
745deeb3f1SBram Moolenaar
755deeb3f1SBram Moolenaardef MyVarargs(arg: string, ...rest: list<string>): string
765deeb3f1SBram Moolenaar  let res = arg
775deeb3f1SBram Moolenaar  for s in rest
785deeb3f1SBram Moolenaar    res ..= ',' .. s
795deeb3f1SBram Moolenaar  endfor
805deeb3f1SBram Moolenaar  return res
815deeb3f1SBram Moolenaarenddef
825deeb3f1SBram Moolenaar
835deeb3f1SBram Moolenaardef Test_call_varargs()
845deeb3f1SBram Moolenaar  assert_equal('one', MyVarargs('one'))
855deeb3f1SBram Moolenaar  assert_equal('one,two', MyVarargs('one', 'two'))
865deeb3f1SBram Moolenaar  assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
875deeb3f1SBram Moolenaarenddef
885deeb3f1SBram Moolenaar
895deeb3f1SBram Moolenaardef MyDefaultArgs(name = 'string'): string
905deeb3f1SBram Moolenaar  return name
915deeb3f1SBram Moolenaarenddef
925deeb3f1SBram Moolenaar
935deeb3f1SBram Moolenaardef Test_call_default_args()
945deeb3f1SBram Moolenaar  assert_equal('string', MyDefaultArgs())
955deeb3f1SBram Moolenaar  assert_equal('one', MyDefaultArgs('one'))
965deeb3f1SBram Moolenaar  assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
975deeb3f1SBram Moolenaar
985deeb3f1SBram Moolenaar  call CheckScriptFailure(['def Func(arg: number = asdf)', 'enddef'], 'E1001:')
995deeb3f1SBram Moolenaarenddef
1005deeb3f1SBram Moolenaar
1015deeb3f1SBram Moolenaarfunc Test_call_default_args_from_func()
1025deeb3f1SBram Moolenaar  call assert_equal('string', MyDefaultArgs())
1035deeb3f1SBram Moolenaar  call assert_equal('one', MyDefaultArgs('one'))
1045deeb3f1SBram Moolenaar  call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
1055deeb3f1SBram Moolenaarendfunc
1065deeb3f1SBram Moolenaar
1075deeb3f1SBram Moolenaarfunc TakesOneArg(arg)
1085deeb3f1SBram Moolenaar  echo a:arg
1095deeb3f1SBram Moolenaarendfunc
1105deeb3f1SBram Moolenaar
1115deeb3f1SBram Moolenaardef Test_call_wrong_args()
1125deeb3f1SBram Moolenaar  call CheckDefFailure(['TakesOneArg()'], 'E119:')
1135deeb3f1SBram Moolenaar  call CheckDefFailure(['TakesOneArg(11, 22)'], 'E118:')
1145deeb3f1SBram Moolenaar  call CheckDefFailure(['bufnr(xxx)'], 'E1001:')
1155deeb3f1SBram Moolenaarenddef
1165deeb3f1SBram Moolenaar
1175deeb3f1SBram Moolenaar" Default arg and varargs
1185deeb3f1SBram Moolenaardef MyDefVarargs(one: string, two = 'foo', ...rest: list<string>): string
1195deeb3f1SBram Moolenaar  let res = one .. ',' .. two
1205deeb3f1SBram Moolenaar  for s in rest
1215deeb3f1SBram Moolenaar    res ..= ',' .. s
1225deeb3f1SBram Moolenaar  endfor
1235deeb3f1SBram Moolenaar  return res
1245deeb3f1SBram Moolenaarenddef
1255deeb3f1SBram Moolenaar
1265deeb3f1SBram Moolenaardef Test_call_def_varargs()
1275deeb3f1SBram Moolenaar  call assert_fails('call MyDefVarargs()', 'E119:')
1285deeb3f1SBram Moolenaar  assert_equal('one,foo', MyDefVarargs('one'))
1295deeb3f1SBram Moolenaar  assert_equal('one,two', MyDefVarargs('one', 'two'))
1305deeb3f1SBram Moolenaar  assert_equal('one,two,three', MyDefVarargs('one', 'two', 'three'))
131*49cf7cc8SBram Moolenaar  call CheckDefFailure(['MyDefVarargs("one", 22)'], 'E1013: argument 2: type mismatch, expected string but got number')
1325deeb3f1SBram Moolenaarenddef
1335deeb3f1SBram Moolenaar
1340b76b42dSBram Moolenaar" Only varargs
1350b76b42dSBram Moolenaardef MyVarargsOnly(...args: list<string>): string
1360b76b42dSBram Moolenaar  return join(args, ',')
1370b76b42dSBram Moolenaarenddef
1380b76b42dSBram Moolenaar
1390b76b42dSBram Moolenaardef Test_call_varargs_only()
1400b76b42dSBram Moolenaar  assert_equal('', MyVarargsOnly())
1410b76b42dSBram Moolenaar  assert_equal('one', MyVarargsOnly('one'))
1420b76b42dSBram Moolenaar  assert_equal('one,two', MyVarargsOnly('one', 'two'))
1430b76b42dSBram Moolenaar  call CheckDefFailure(['MyVarargsOnly(1)'], 'E1013: argument 1: type mismatch, expected string but got number')
1440b76b42dSBram Moolenaar  call CheckDefFailure(['MyVarargsOnly("one", 2)'], 'E1013: argument 2: type mismatch, expected string but got number')
1450b76b42dSBram Moolenaarenddef
1460b76b42dSBram Moolenaar
1475deeb3f1SBram Moolenaardef Test_using_var_as_arg()
1485deeb3f1SBram Moolenaar  call writefile(['def Func(x: number)',  'let x = 234', 'enddef'], 'Xdef')
1495deeb3f1SBram Moolenaar  call assert_fails('so Xdef', 'E1006:')
1505deeb3f1SBram Moolenaar  call delete('Xdef')
1515deeb3f1SBram Moolenaarenddef
1525deeb3f1SBram Moolenaar
1535deeb3f1SBram Moolenaardef Test_call_func_defined_later()
1545deeb3f1SBram Moolenaar  call assert_equal('one', DefinedLater('one'))
1555deeb3f1SBram Moolenaar  call assert_fails('call NotDefined("one")', 'E117:')
1565deeb3f1SBram Moolenaarenddef
1575deeb3f1SBram Moolenaar
1585deeb3f1SBram Moolenaarfunc DefinedLater(arg)
1595deeb3f1SBram Moolenaar  return a:arg
1605deeb3f1SBram Moolenaarendfunc
1615deeb3f1SBram Moolenaar
1625deeb3f1SBram Moolenaardef FuncWithForwardCall()
1635deeb3f1SBram Moolenaar  return DefinedEvenLater("yes")
1645deeb3f1SBram Moolenaarenddef
1655deeb3f1SBram Moolenaar
1665deeb3f1SBram Moolenaardef DefinedEvenLater(arg: string): string
1675deeb3f1SBram Moolenaar  return arg
1685deeb3f1SBram Moolenaarenddef
1695deeb3f1SBram Moolenaar
1705deeb3f1SBram Moolenaardef Test_error_in_nested_function()
1715deeb3f1SBram Moolenaar  " Error in called function requires unwinding the call stack.
1725deeb3f1SBram Moolenaar  assert_fails('call FuncWithForwardCall()', 'E1029')
1735deeb3f1SBram Moolenaarenddef
1745deeb3f1SBram Moolenaar
1755deeb3f1SBram Moolenaardef Test_return_type_wrong()
1765deeb3f1SBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
1775deeb3f1SBram Moolenaar  CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
1785deeb3f1SBram Moolenaar  CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
1795deeb3f1SBram Moolenaar  CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
1805deeb3f1SBram Moolenaar
1815deeb3f1SBram Moolenaar  CheckScriptFailure(['def Func(): number', 'return', 'enddef'], 'E1003:')
1825deeb3f1SBram Moolenaar
1835deeb3f1SBram Moolenaar  CheckScriptFailure(['def Func(): list', 'return []', 'enddef'], 'E1008:')
1845deeb3f1SBram Moolenaar  CheckScriptFailure(['def Func(): dict', 'return {}', 'enddef'], 'E1008:')
185ee4e0c1eSBram Moolenaar  CheckScriptFailure(['def Func()', 'return 1'], 'E1057:')
1865deeb3f1SBram Moolenaarenddef
1875deeb3f1SBram Moolenaar
1885deeb3f1SBram Moolenaardef Test_arg_type_wrong()
1895deeb3f1SBram Moolenaar  CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
190ee4e0c1eSBram Moolenaar  CheckScriptFailure(['def Func4(...)', 'echo "a"', 'enddef'], 'E1055: Missing name after ...')
1915deeb3f1SBram Moolenaarenddef
1925deeb3f1SBram Moolenaar
1935deeb3f1SBram Moolenaardef Test_vim9script_call()
1945deeb3f1SBram Moolenaar  let lines =<< trim END
1955deeb3f1SBram Moolenaar    vim9script
1965deeb3f1SBram Moolenaar    let var = ''
1975deeb3f1SBram Moolenaar    def MyFunc(arg: string)
1985deeb3f1SBram Moolenaar       var = arg
1995deeb3f1SBram Moolenaar    enddef
2005deeb3f1SBram Moolenaar    MyFunc('foobar')
2015deeb3f1SBram Moolenaar    assert_equal('foobar', var)
2025deeb3f1SBram Moolenaar
2035deeb3f1SBram Moolenaar    let str = 'barfoo'
2045deeb3f1SBram Moolenaar    str->MyFunc()
2055deeb3f1SBram Moolenaar    assert_equal('barfoo', var)
2065deeb3f1SBram Moolenaar
2075deeb3f1SBram Moolenaar    let g:value = 'value'
2085deeb3f1SBram Moolenaar    g:value->MyFunc()
2095deeb3f1SBram Moolenaar    assert_equal('value', var)
2105deeb3f1SBram Moolenaar
2115deeb3f1SBram Moolenaar    let listvar = []
2125deeb3f1SBram Moolenaar    def ListFunc(arg: list<number>)
2135deeb3f1SBram Moolenaar       listvar = arg
2145deeb3f1SBram Moolenaar    enddef
2155deeb3f1SBram Moolenaar    [1, 2, 3]->ListFunc()
2165deeb3f1SBram Moolenaar    assert_equal([1, 2, 3], listvar)
2175deeb3f1SBram Moolenaar
2185deeb3f1SBram Moolenaar    let dictvar = {}
2195deeb3f1SBram Moolenaar    def DictFunc(arg: dict<number>)
2205deeb3f1SBram Moolenaar       dictvar = arg
2215deeb3f1SBram Moolenaar    enddef
2225deeb3f1SBram Moolenaar    {'a': 1, 'b': 2}->DictFunc()
2235deeb3f1SBram Moolenaar    assert_equal(#{a: 1, b: 2}, dictvar)
2245deeb3f1SBram Moolenaar    def CompiledDict()
2255deeb3f1SBram Moolenaar      {'a': 3, 'b': 4}->DictFunc()
2265deeb3f1SBram Moolenaar    enddef
2275deeb3f1SBram Moolenaar    CompiledDict()
2285deeb3f1SBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
2295deeb3f1SBram Moolenaar
2305deeb3f1SBram Moolenaar    #{a: 3, b: 4}->DictFunc()
2315deeb3f1SBram Moolenaar    assert_equal(#{a: 3, b: 4}, dictvar)
2325deeb3f1SBram Moolenaar
2335deeb3f1SBram Moolenaar    ('text')->MyFunc()
2345deeb3f1SBram Moolenaar    assert_equal('text', var)
2355deeb3f1SBram Moolenaar    ("some")->MyFunc()
2365deeb3f1SBram Moolenaar    assert_equal('some', var)
2375deeb3f1SBram Moolenaar  END
2385deeb3f1SBram Moolenaar  writefile(lines, 'Xcall.vim')
2395deeb3f1SBram Moolenaar  source Xcall.vim
2405deeb3f1SBram Moolenaar  delete('Xcall.vim')
2415deeb3f1SBram Moolenaarenddef
2425deeb3f1SBram Moolenaar
2435deeb3f1SBram Moolenaardef Test_vim9script_call_fail_decl()
2445deeb3f1SBram Moolenaar  let lines =<< trim END
2455deeb3f1SBram Moolenaar    vim9script
2465deeb3f1SBram Moolenaar    let var = ''
2475deeb3f1SBram Moolenaar    def MyFunc(arg: string)
2485deeb3f1SBram Moolenaar       let var = 123
2495deeb3f1SBram Moolenaar    enddef
2505deeb3f1SBram Moolenaar  END
2515deeb3f1SBram Moolenaar  writefile(lines, 'Xcall_decl.vim')
2525deeb3f1SBram Moolenaar  assert_fails('source Xcall_decl.vim', 'E1054:')
2535deeb3f1SBram Moolenaar  delete('Xcall_decl.vim')
2545deeb3f1SBram Moolenaarenddef
2555deeb3f1SBram Moolenaar
2565deeb3f1SBram Moolenaardef Test_vim9script_call_fail_const()
2575deeb3f1SBram Moolenaar  let lines =<< trim END
2585deeb3f1SBram Moolenaar    vim9script
2595deeb3f1SBram Moolenaar    const var = ''
2605deeb3f1SBram Moolenaar    def MyFunc(arg: string)
2615deeb3f1SBram Moolenaar       var = 'asdf'
2625deeb3f1SBram Moolenaar    enddef
2635deeb3f1SBram Moolenaar  END
2645deeb3f1SBram Moolenaar  writefile(lines, 'Xcall_const.vim')
2655deeb3f1SBram Moolenaar  assert_fails('source Xcall_const.vim', 'E46:')
2665deeb3f1SBram Moolenaar  delete('Xcall_const.vim')
2675deeb3f1SBram Moolenaarenddef
2685deeb3f1SBram Moolenaar
2695deeb3f1SBram Moolenaar" Test that inside :function a Python function can be defined, :def is not
2705deeb3f1SBram Moolenaar" recognized.
2715deeb3f1SBram Moolenaarfunc Test_function_python()
2725deeb3f1SBram Moolenaar  CheckFeature python3
2735deeb3f1SBram Moolenaar  let py = 'python3'
2745deeb3f1SBram Moolenaar  execute py "<< EOF"
2755deeb3f1SBram Moolenaardef do_something():
2765deeb3f1SBram Moolenaar  return 1
2775deeb3f1SBram MoolenaarEOF
2785deeb3f1SBram Moolenaarendfunc
2795deeb3f1SBram Moolenaar
2805deeb3f1SBram Moolenaardef Test_delfunc()
2815deeb3f1SBram Moolenaar  let lines =<< trim END
2825deeb3f1SBram Moolenaar    vim9script
2835deeb3f1SBram Moolenaar    def GoneSoon()
2845deeb3f1SBram Moolenaar      echo 'hello'
2855deeb3f1SBram Moolenaar    enddef
2865deeb3f1SBram Moolenaar
2875deeb3f1SBram Moolenaar    def CallGoneSoon()
2885deeb3f1SBram Moolenaar      GoneSoon()
2895deeb3f1SBram Moolenaar    enddef
2905deeb3f1SBram Moolenaar
2915deeb3f1SBram Moolenaar    delfunc GoneSoon
2925deeb3f1SBram Moolenaar    CallGoneSoon()
2935deeb3f1SBram Moolenaar  END
2945deeb3f1SBram Moolenaar  writefile(lines, 'XToDelFunc')
2955deeb3f1SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
2965deeb3f1SBram Moolenaar  assert_fails('so XToDelFunc', 'E933')
2975deeb3f1SBram Moolenaar
2985deeb3f1SBram Moolenaar  delete('XToDelFunc')
2995deeb3f1SBram Moolenaarenddef
3005deeb3f1SBram Moolenaar
3015deeb3f1SBram Moolenaardef Test_redef_failure()
3025deeb3f1SBram Moolenaar  call writefile(['def Func0(): string',  'return "Func0"', 'enddef'], 'Xdef')
3035deeb3f1SBram Moolenaar  so Xdef
3045deeb3f1SBram Moolenaar  call writefile(['def Func1(): string',  'return "Func1"', 'enddef'], 'Xdef')
3055deeb3f1SBram Moolenaar  so Xdef
3065deeb3f1SBram Moolenaar  call writefile(['def! Func0(): string', 'enddef'], 'Xdef')
3075deeb3f1SBram Moolenaar  call assert_fails('so Xdef', 'E1027:')
3085deeb3f1SBram Moolenaar  call writefile(['def Func2(): string',  'return "Func2"', 'enddef'], 'Xdef')
3095deeb3f1SBram Moolenaar  so Xdef
3105deeb3f1SBram Moolenaar  call delete('Xdef')
3115deeb3f1SBram Moolenaar
3125deeb3f1SBram Moolenaar  call assert_equal(0, Func0())
3135deeb3f1SBram Moolenaar  call assert_equal('Func1', Func1())
3145deeb3f1SBram Moolenaar  call assert_equal('Func2', Func2())
3155deeb3f1SBram Moolenaar
3165deeb3f1SBram Moolenaar  delfunc! Func0
3175deeb3f1SBram Moolenaar  delfunc! Func1
3185deeb3f1SBram Moolenaar  delfunc! Func2
3195deeb3f1SBram Moolenaarenddef
3205deeb3f1SBram Moolenaar
3215deeb3f1SBram Moolenaar" Test for internal functions returning different types
3225deeb3f1SBram Moolenaarfunc Test_InternalFuncRetType()
3235deeb3f1SBram Moolenaar  let lines =<< trim END
3245deeb3f1SBram Moolenaar    def RetFloat(): float
3255deeb3f1SBram Moolenaar      return ceil(1.456)
3265deeb3f1SBram Moolenaar    enddef
3275deeb3f1SBram Moolenaar
3285deeb3f1SBram Moolenaar    def RetListAny(): list<any>
3295deeb3f1SBram Moolenaar      return items({'k' : 'v'})
3305deeb3f1SBram Moolenaar    enddef
3315deeb3f1SBram Moolenaar
3325deeb3f1SBram Moolenaar    def RetListString(): list<string>
3335deeb3f1SBram Moolenaar      return split('a:b:c', ':')
3345deeb3f1SBram Moolenaar    enddef
3355deeb3f1SBram Moolenaar
3365deeb3f1SBram Moolenaar    def RetListDictAny(): list<dict<any>>
3375deeb3f1SBram Moolenaar      return getbufinfo()
3385deeb3f1SBram Moolenaar    enddef
3395deeb3f1SBram Moolenaar
3405deeb3f1SBram Moolenaar    def RetDictNumber(): dict<number>
3415deeb3f1SBram Moolenaar      return wordcount()
3425deeb3f1SBram Moolenaar    enddef
3435deeb3f1SBram Moolenaar
3445deeb3f1SBram Moolenaar    def RetDictString(): dict<string>
3455deeb3f1SBram Moolenaar      return environ()
3465deeb3f1SBram Moolenaar    enddef
3475deeb3f1SBram Moolenaar  END
3485deeb3f1SBram Moolenaar  call writefile(lines, 'Xscript')
3495deeb3f1SBram Moolenaar  source Xscript
3505deeb3f1SBram Moolenaar
3515deeb3f1SBram Moolenaar  call assert_equal(2.0, RetFloat())
3525deeb3f1SBram Moolenaar  call assert_equal([['k', 'v']], RetListAny())
3535deeb3f1SBram Moolenaar  call assert_equal(['a', 'b', 'c'], RetListString())
3545deeb3f1SBram Moolenaar  call assert_notequal([], RetListDictAny())
3555deeb3f1SBram Moolenaar  call assert_notequal({}, RetDictNumber())
3565deeb3f1SBram Moolenaar  call assert_notequal({}, RetDictString())
3575deeb3f1SBram Moolenaar  call delete('Xscript')
3585deeb3f1SBram Moolenaarendfunc
3595deeb3f1SBram Moolenaar
3605deeb3f1SBram Moolenaar" Test for passing too many or too few arguments to internal functions
3615deeb3f1SBram Moolenaarfunc Test_internalfunc_arg_error()
3625deeb3f1SBram Moolenaar  let l =<< trim END
3635deeb3f1SBram Moolenaar    def! FArgErr(): float
3645deeb3f1SBram Moolenaar      return ceil(1.1, 2)
3655deeb3f1SBram Moolenaar    enddef
3665deeb3f1SBram Moolenaar  END
3675deeb3f1SBram Moolenaar  call writefile(l, 'Xinvalidarg')
3685deeb3f1SBram Moolenaar  call assert_fails('so Xinvalidarg', 'E118:')
3695deeb3f1SBram Moolenaar  let l =<< trim END
3705deeb3f1SBram Moolenaar    def! FArgErr(): float
3715deeb3f1SBram Moolenaar      return ceil()
3725deeb3f1SBram Moolenaar    enddef
3735deeb3f1SBram Moolenaar  END
3745deeb3f1SBram Moolenaar  call writefile(l, 'Xinvalidarg')
3755deeb3f1SBram Moolenaar  call assert_fails('so Xinvalidarg', 'E119:')
3765deeb3f1SBram Moolenaar  call delete('Xinvalidarg')
3775deeb3f1SBram Moolenaarendfunc
3785deeb3f1SBram Moolenaar
3795deeb3f1SBram Moolenaarlet s:funcResult = 0
3805deeb3f1SBram Moolenaar
3815deeb3f1SBram Moolenaardef FuncNoArgNoRet()
3825deeb3f1SBram Moolenaar  funcResult = 11
3835deeb3f1SBram Moolenaarenddef
3845deeb3f1SBram Moolenaar
3855deeb3f1SBram Moolenaardef FuncNoArgRetNumber(): number
3865deeb3f1SBram Moolenaar  funcResult = 22
3875deeb3f1SBram Moolenaar  return 1234
3885deeb3f1SBram Moolenaarenddef
3895deeb3f1SBram Moolenaar
390ec5929d0SBram Moolenaardef FuncNoArgRetString(): string
391ec5929d0SBram Moolenaar  funcResult = 45
392ec5929d0SBram Moolenaar  return 'text'
393ec5929d0SBram Moolenaarenddef
394ec5929d0SBram Moolenaar
3955deeb3f1SBram Moolenaardef FuncOneArgNoRet(arg: number)
3965deeb3f1SBram Moolenaar  funcResult = arg
3975deeb3f1SBram Moolenaarenddef
3985deeb3f1SBram Moolenaar
3995deeb3f1SBram Moolenaardef FuncOneArgRetNumber(arg: number): number
4005deeb3f1SBram Moolenaar  funcResult = arg
4015deeb3f1SBram Moolenaar  return arg
4025deeb3f1SBram Moolenaarenddef
4035deeb3f1SBram Moolenaar
404ec5929d0SBram Moolenaardef FuncOneArgRetString(arg: string): string
405ec5929d0SBram Moolenaar  return arg
406ec5929d0SBram Moolenaarenddef
407ec5929d0SBram Moolenaar
4088922860aSBram Moolenaardef FuncOneArgRetAny(arg: any): any
4098922860aSBram Moolenaar  return arg
4108922860aSBram Moolenaarenddef
4118922860aSBram Moolenaar
4125deeb3f1SBram Moolenaardef Test_func_type()
4135deeb3f1SBram Moolenaar  let Ref1: func()
4145deeb3f1SBram Moolenaar  funcResult = 0
4155deeb3f1SBram Moolenaar  Ref1 = FuncNoArgNoRet
4165deeb3f1SBram Moolenaar  Ref1()
4175deeb3f1SBram Moolenaar  assert_equal(11, funcResult)
4184c683750SBram Moolenaar
4194c683750SBram Moolenaar  let Ref2: func
4204c683750SBram Moolenaar  funcResult = 0
4214c683750SBram Moolenaar  Ref2 = FuncNoArgNoRet
4224c683750SBram Moolenaar  Ref2()
4234c683750SBram Moolenaar  assert_equal(11, funcResult)
4244c683750SBram Moolenaar
4254c683750SBram Moolenaar  funcResult = 0
4264c683750SBram Moolenaar  Ref2 = FuncOneArgNoRet
4274c683750SBram Moolenaar  Ref2(12)
4284c683750SBram Moolenaar  assert_equal(12, funcResult)
4294c683750SBram Moolenaar
4304c683750SBram Moolenaar  funcResult = 0
4314c683750SBram Moolenaar  Ref2 = FuncNoArgRetNumber
4324c683750SBram Moolenaar  assert_equal(1234, Ref2())
4334c683750SBram Moolenaar  assert_equal(22, funcResult)
4344c683750SBram Moolenaar
4354c683750SBram Moolenaar  funcResult = 0
4364c683750SBram Moolenaar  Ref2 = FuncOneArgRetNumber
4374c683750SBram Moolenaar  assert_equal(13, Ref2(13))
4384c683750SBram Moolenaar  assert_equal(13, funcResult)
4395deeb3f1SBram Moolenaarenddef
4405deeb3f1SBram Moolenaar
441ec5929d0SBram Moolenaardef Test_func_type_part()
442ec5929d0SBram Moolenaar  let RefVoid: func: void
443ec5929d0SBram Moolenaar  RefVoid = FuncNoArgNoRet
444ec5929d0SBram Moolenaar  RefVoid = FuncOneArgNoRet
445ec5929d0SBram Moolenaar  CheckDefFailure(['let RefVoid: func: void', 'RefVoid = FuncNoArgRetNumber'], 'E1013: type mismatch, expected func() but got func(): number')
446ec5929d0SBram Moolenaar  CheckDefFailure(['let RefVoid: func: void', 'RefVoid = FuncNoArgRetString'], 'E1013: type mismatch, expected func() but got func(): string')
447ec5929d0SBram Moolenaar
448ec5929d0SBram Moolenaar  let RefAny: func(): any
449ec5929d0SBram Moolenaar  RefAny = FuncNoArgRetNumber
450ec5929d0SBram Moolenaar  RefAny = FuncNoArgRetString
451ec5929d0SBram Moolenaar  CheckDefFailure(['let RefAny: func(): any', 'RefAny = FuncNoArgNoRet'], 'E1013: type mismatch, expected func(): any but got func()')
452ec5929d0SBram Moolenaar  CheckDefFailure(['let RefAny: func(): any', 'RefAny = FuncOneArgNoRet'], 'E1013: type mismatch, expected func(): any but got func(number)')
453ec5929d0SBram Moolenaar
454ec5929d0SBram Moolenaar  let RefNr: func: number
455ec5929d0SBram Moolenaar  RefNr = FuncNoArgRetNumber
456ec5929d0SBram Moolenaar  RefNr = FuncOneArgRetNumber
457ec5929d0SBram Moolenaar  CheckDefFailure(['let RefNr: func: number', 'RefNr = FuncNoArgNoRet'], 'E1013: type mismatch, expected func(): number but got func()')
458ec5929d0SBram Moolenaar  CheckDefFailure(['let RefNr: func: number', 'RefNr = FuncNoArgRetString'], 'E1013: type mismatch, expected func(): number but got func(): string')
459ec5929d0SBram Moolenaar
460ec5929d0SBram Moolenaar  let RefStr: func: string
461ec5929d0SBram Moolenaar  RefStr = FuncNoArgRetString
462ec5929d0SBram Moolenaar  RefStr = FuncOneArgRetString
463ec5929d0SBram Moolenaar  CheckDefFailure(['let RefStr: func: string', 'RefStr = FuncNoArgNoRet'], 'E1013: type mismatch, expected func(): string but got func()')
464ec5929d0SBram Moolenaar  CheckDefFailure(['let RefStr: func: string', 'RefStr = FuncNoArgRetNumber'], 'E1013: type mismatch, expected func(): string but got func(): number')
465ec5929d0SBram Moolenaarenddef
466ec5929d0SBram Moolenaar
4675deeb3f1SBram Moolenaardef Test_func_type_fails()
4685deeb3f1SBram Moolenaar  CheckDefFailure(['let ref1: func()'], 'E704:')
4695deeb3f1SBram Moolenaar
4705deeb3f1SBram Moolenaar  CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncNoArgRetNumber'], 'E1013: type mismatch, expected func() but got func(): number')
4715deeb3f1SBram Moolenaar  CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncOneArgNoRet'], 'E1013: type mismatch, expected func() but got func(number)')
4725deeb3f1SBram Moolenaar  CheckDefFailure(['let Ref1: func()', 'Ref1 = FuncOneArgRetNumber'], 'E1013: type mismatch, expected func() but got func(number): number')
4735deeb3f1SBram Moolenaarenddef
4745deeb3f1SBram Moolenaar
4758922860aSBram Moolenaardef Test_func_return_type()
4768922860aSBram Moolenaar  let nr: number
4778922860aSBram Moolenaar  nr = FuncNoArgRetNumber()
4788922860aSBram Moolenaar  assert_equal(1234, nr)
4798922860aSBram Moolenaar
4808922860aSBram Moolenaar  nr = FuncOneArgRetAny(122)
4818922860aSBram Moolenaar  assert_equal(122, nr)
4828922860aSBram Moolenaar
4838922860aSBram Moolenaar  let str: string
4848922860aSBram Moolenaar  str = FuncOneArgRetAny('yes')
4858922860aSBram Moolenaar  assert_equal('yes', str)
4868922860aSBram Moolenaar
4878922860aSBram Moolenaar  CheckDefFailure(['let str: string', 'str = FuncNoArgRetNumber()'], 'E1013: type mismatch, expected string but got number')
4888922860aSBram Moolenaarenddef
4898922860aSBram Moolenaar
490ee4e0c1eSBram Moolenaar" When using CheckScriptFailure() for the below test, E1010 is generated instead
491ee4e0c1eSBram Moolenaar" of E1056.
492ee4e0c1eSBram Moolenaarfunc Test_E1056_1059()
493ee4e0c1eSBram Moolenaar  let caught_1056 = 0
494ee4e0c1eSBram Moolenaar  try
495ee4e0c1eSBram Moolenaar    def F():
496ee4e0c1eSBram Moolenaar      return 1
497ee4e0c1eSBram Moolenaar    enddef
498ee4e0c1eSBram Moolenaar  catch /E1056:/
499ee4e0c1eSBram Moolenaar    let caught_1056 = 1
500ee4e0c1eSBram Moolenaar  endtry
501ee4e0c1eSBram Moolenaar  call assert_equal(1, caught_1056)
502ee4e0c1eSBram Moolenaar
503ee4e0c1eSBram Moolenaar  let caught_1059 = 0
504ee4e0c1eSBram Moolenaar  try
505ee4e0c1eSBram Moolenaar    def F5(items : list)
506ee4e0c1eSBram Moolenaar      echo 'a'
507ee4e0c1eSBram Moolenaar    enddef
508ee4e0c1eSBram Moolenaar  catch /E1059:/
509ee4e0c1eSBram Moolenaar    let caught_1059 = 1
510ee4e0c1eSBram Moolenaar  endtry
511ee4e0c1eSBram Moolenaar  call assert_equal(1, caught_1059)
512ee4e0c1eSBram Moolenaarendfunc
5135deeb3f1SBram Moolenaar
5145deeb3f1SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
515