xref: /vim-8.2.3635/src/testdir/test_partial.vim (revision 2bbf8eff)
11735bc98SBram Moolenaar" Test binding arguments to a Funcref.
21735bc98SBram Moolenaar
31735bc98SBram Moolenaarfunc MyFunc(arg1, arg2, arg3)
41735bc98SBram Moolenaar  return a:arg1 . '/' . a:arg2 . '/' . a:arg3
51735bc98SBram Moolenaarendfunc
61735bc98SBram Moolenaar
71735bc98SBram Moolenaarfunc MySort(up, one, two)
81735bc98SBram Moolenaar  if a:one == a:two
91735bc98SBram Moolenaar    return 0
101735bc98SBram Moolenaar  endif
111735bc98SBram Moolenaar  if a:up
12790500a8SBram Moolenaar    return a:one > a:two ? 1 : -1
131735bc98SBram Moolenaar  endif
14790500a8SBram Moolenaar  return a:one < a:two ? 1 : -1
151735bc98SBram Moolenaarendfunc
161735bc98SBram Moolenaar
171735bc98SBram Moolenaarfunc Test_partial_args()
181735bc98SBram Moolenaar  let Cb = function('MyFunc', ["foo", "bar"])
1965639032SBram Moolenaar
2065639032SBram Moolenaar  call Cb("zzz")
211735bc98SBram Moolenaar  call assert_equal("foo/bar/xxx", Cb("xxx"))
221735bc98SBram Moolenaar  call assert_equal("foo/bar/yyy", call(Cb, ["yyy"]))
238a1bb046SBram Moolenaar  let Cb2 = function(Cb)
248a1bb046SBram Moolenaar  call assert_equal("foo/bar/zzz", Cb2("zzz"))
258a1bb046SBram Moolenaar  let Cb3 = function(Cb, ["www"])
268a1bb046SBram Moolenaar  call assert_equal("foo/bar/www", Cb3())
271735bc98SBram Moolenaar
28346418c6SBram Moolenaar  let Cb = function('MyFunc', [])
29346418c6SBram Moolenaar  call assert_equal("a/b/c", Cb("a", "b", "c"))
308a1bb046SBram Moolenaar  let Cb2 = function(Cb, [])
318a1bb046SBram Moolenaar  call assert_equal("a/b/d", Cb2("a", "b", "d"))
328a1bb046SBram Moolenaar  let Cb3 = function(Cb, ["a", "b"])
338a1bb046SBram Moolenaar  call assert_equal("a/b/e", Cb3("e"))
34346418c6SBram Moolenaar
351735bc98SBram Moolenaar  let Sort = function('MySort', [1])
361735bc98SBram Moolenaar  call assert_equal([1, 2, 3], sort([3, 1, 2], Sort))
371735bc98SBram Moolenaar  let Sort = function('MySort', [0])
381735bc98SBram Moolenaar  call assert_equal([3, 2, 1], sort([3, 1, 2], Sort))
391735bc98SBram Moolenaarendfunc
401735bc98SBram Moolenaar
411735bc98SBram Moolenaarfunc MyDictFunc(arg1, arg2) dict
421735bc98SBram Moolenaar  return self.name . '/' . a:arg1 . '/' . a:arg2
431735bc98SBram Moolenaarendfunc
441735bc98SBram Moolenaar
451735bc98SBram Moolenaarfunc Test_partial_dict()
461735bc98SBram Moolenaar  let dict = {'name': 'hello'}
471735bc98SBram Moolenaar  let Cb = function('MyDictFunc', ["foo", "bar"], dict)
481735bc98SBram Moolenaar  call assert_equal("hello/foo/bar", Cb())
491735bc98SBram Moolenaar  call assert_fails('Cb("xxx")', 'E492:')
50346418c6SBram Moolenaar
511735bc98SBram Moolenaar  let Cb = function('MyDictFunc', ["foo"], dict)
521735bc98SBram Moolenaar  call assert_equal("hello/foo/xxx", Cb("xxx"))
531735bc98SBram Moolenaar  call assert_fails('Cb()', 'E492:')
54346418c6SBram Moolenaar
55346418c6SBram Moolenaar  let Cb = function('MyDictFunc', [], dict)
56346418c6SBram Moolenaar  call assert_equal("hello/ttt/xxx", Cb("ttt", "xxx"))
57346418c6SBram Moolenaar  call assert_fails('Cb("yyy")', 'E492:')
58346418c6SBram Moolenaar
591735bc98SBram Moolenaar  let Cb = function('MyDictFunc', dict)
601735bc98SBram Moolenaar  call assert_equal("hello/xxx/yyy", Cb("xxx", "yyy"))
61346418c6SBram Moolenaar  call assert_fails('Cb("fff")', 'E492:')
6265639032SBram Moolenaar
6365639032SBram Moolenaar  let dict = {"tr": function('tr', ['hello', 'h', 'H'])}
6465639032SBram Moolenaar  call assert_equal("Hello", dict.tr())
651735bc98SBram Moolenaarendfunc
66ab1fa395SBram Moolenaar
67ab1fa395SBram Moolenaarfunc Test_partial_implicit()
68ab1fa395SBram Moolenaar  let dict = {'name': 'foo'}
69ab1fa395SBram Moolenaar  func dict.MyFunc(arg) dict
70ab1fa395SBram Moolenaar    return self.name . '/' . a:arg
71ab1fa395SBram Moolenaar  endfunc
72ab1fa395SBram Moolenaar
73ab1fa395SBram Moolenaar  call assert_equal('foo/bar',  dict.MyFunc('bar'))
74ab1fa395SBram Moolenaar
75ab1fa395SBram Moolenaar  call assert_fails('let func = dict.MyFunc', 'E704:')
76ab1fa395SBram Moolenaar  let Func = dict.MyFunc
77ab1fa395SBram Moolenaar  call assert_equal('foo/aaa', Func('aaa'))
78ab1fa395SBram Moolenaar
79ab1fa395SBram Moolenaar  let Func = function(dict.MyFunc, ['bbb'])
80ab1fa395SBram Moolenaar  call assert_equal('foo/bbb', Func())
81ab1fa395SBram Moolenaarendfunc
827a5c46a9SBram Moolenaar
837a5c46a9SBram Moolenaarfun InnerCall(funcref)
847a5c46a9SBram Moolenaar  return a:funcref
857a5c46a9SBram Moolenaarendfu
867a5c46a9SBram Moolenaar
877a5c46a9SBram Moolenaarfun OuterCall()
887a5c46a9SBram Moolenaar  let opt = { 'func' : function('sin') }
897a5c46a9SBram Moolenaar  call InnerCall(opt.func)
907a5c46a9SBram Moolenaarendfu
917a5c46a9SBram Moolenaar
927a5c46a9SBram Moolenaarfunc Test_function_in_dict()
937a5c46a9SBram Moolenaar  call OuterCall()
947a5c46a9SBram Moolenaarendfunc
957a5c46a9SBram Moolenaar
966f2e4b36SBram Moolenaarfunction! s:cache_clear() dict
976f2e4b36SBram Moolenaar  return self.name
986f2e4b36SBram Moolenaarendfunction
996f2e4b36SBram Moolenaar
1006f2e4b36SBram Moolenaarfunc Test_script_function_in_dict()
1016f2e4b36SBram Moolenaar  let s:obj = {'name': 'foo'}
1026f2e4b36SBram Moolenaar  let s:obj2 = {'name': 'bar'}
1036f2e4b36SBram Moolenaar
1046f2e4b36SBram Moolenaar  let s:obj['clear'] = function('s:cache_clear')
1056f2e4b36SBram Moolenaar
1066f2e4b36SBram Moolenaar  call assert_equal('foo', s:obj.clear())
1076f2e4b36SBram Moolenaar  let F = s:obj.clear
1086f2e4b36SBram Moolenaar  call assert_equal('foo', F())
1096f2e4b36SBram Moolenaar  call assert_equal('foo', call(s:obj.clear, [], s:obj))
1106f2e4b36SBram Moolenaar  call assert_equal('bar', call(s:obj.clear, [], s:obj2))
1116f2e4b36SBram Moolenaar
1126f2e4b36SBram Moolenaar  let s:obj2['clear'] = function('s:cache_clear')
1136f2e4b36SBram Moolenaar  call assert_equal('bar', s:obj2.clear())
1146f2e4b36SBram Moolenaar  let B = s:obj2.clear
1156f2e4b36SBram Moolenaar  call assert_equal('bar', B())
1166f2e4b36SBram Moolenaarendfunc
117d22a1892SBram Moolenaar
1189e63f61cSBram Moolenaarfunction! s:cache_arg(arg) dict
1199e63f61cSBram Moolenaar  let s:result = self.name . '/' . a:arg
1209e63f61cSBram Moolenaar  return s:result
1219e63f61cSBram Moolenaarendfunction
1229e63f61cSBram Moolenaar
1239e63f61cSBram Moolenaarfunc Test_script_function_in_dict_arg()
1249e63f61cSBram Moolenaar  let s:obj = {'name': 'foo'}
1259e63f61cSBram Moolenaar  let s:obj['clear'] = function('s:cache_arg')
1269e63f61cSBram Moolenaar
1279e63f61cSBram Moolenaar  call assert_equal('foo/bar', s:obj.clear('bar'))
1289e63f61cSBram Moolenaar  let F = s:obj.clear
1299e63f61cSBram Moolenaar  let s:result = ''
1309e63f61cSBram Moolenaar  call assert_equal('foo/bar', F('bar'))
1319e63f61cSBram Moolenaar  call assert_equal('foo/bar', s:result)
1329e63f61cSBram Moolenaar
1339e63f61cSBram Moolenaar  let s:obj['clear'] = function('s:cache_arg', ['bar'])
1349e63f61cSBram Moolenaar  call assert_equal('foo/bar', s:obj.clear())
1359e63f61cSBram Moolenaar  let s:result = ''
1369e63f61cSBram Moolenaar  call s:obj.clear()
1379e63f61cSBram Moolenaar  call assert_equal('foo/bar', s:result)
1389e63f61cSBram Moolenaar
1399e63f61cSBram Moolenaar  let F = s:obj.clear
1409e63f61cSBram Moolenaar  call assert_equal('foo/bar', F())
1419e63f61cSBram Moolenaar  let s:result = ''
1429e63f61cSBram Moolenaar  call F()
1439e63f61cSBram Moolenaar  call assert_equal('foo/bar', s:result)
1449e63f61cSBram Moolenaar
1459e63f61cSBram Moolenaar  call assert_equal('foo/bar', call(s:obj.clear, [], s:obj))
1469e63f61cSBram Moolenaarendfunc
1479e63f61cSBram Moolenaar
148d22a1892SBram Moolenaarfunc Test_partial_exists()
149d22a1892SBram Moolenaar  let F = function('MyFunc')
150d22a1892SBram Moolenaar  call assert_true(exists('*F'))
151d22a1892SBram Moolenaar  let lF = [F]
152d22a1892SBram Moolenaar  call assert_true(exists('*lF[0]'))
153d22a1892SBram Moolenaar
154d22a1892SBram Moolenaar  let F = function('MyFunc', ['arg'])
155d22a1892SBram Moolenaar  call assert_true(exists('*F'))
156d22a1892SBram Moolenaar  let lF = [F]
157d22a1892SBram Moolenaar  call assert_true(exists('*lF[0]'))
158d22a1892SBram Moolenaarendfunc
1595c29154bSBram Moolenaar
1605c29154bSBram Moolenaarfunc Test_partial_string()
1615c29154bSBram Moolenaar  let F = function('MyFunc')
1625c29154bSBram Moolenaar  call assert_equal("function('MyFunc')", string(F))
1635c29154bSBram Moolenaar  let F = function('MyFunc', ['foo'])
1645c29154bSBram Moolenaar  call assert_equal("function('MyFunc', ['foo'])", string(F))
1655c29154bSBram Moolenaar  let F = function('MyFunc', ['foo', 'bar'])
1665c29154bSBram Moolenaar  call assert_equal("function('MyFunc', ['foo', 'bar'])", string(F))
1675c29154bSBram Moolenaar  let d = {'one': 1}
1685c29154bSBram Moolenaar  let F = function('MyFunc', d)
1695c29154bSBram Moolenaar  call assert_equal("function('MyFunc', {'one': 1})", string(F))
1705c29154bSBram Moolenaar  let F = function('MyFunc', ['foo'], d)
1715c29154bSBram Moolenaar  call assert_equal("function('MyFunc', ['foo'], {'one': 1})", string(F))
1725c29154bSBram Moolenaarendfunc
173e4eb6ff0SBram Moolenaar
174e4eb6ff0SBram Moolenaarfunc Test_func_unref()
175e4eb6ff0SBram Moolenaar  let obj = {}
176e4eb6ff0SBram Moolenaar  function! obj.func() abort
177e4eb6ff0SBram Moolenaar  endfunction
178e4eb6ff0SBram Moolenaar  let funcnumber = matchstr(string(obj.func), '^function(''\zs.\{-}\ze''')
179e4eb6ff0SBram Moolenaar  call assert_true(exists('*{' . funcnumber . '}'))
180e4eb6ff0SBram Moolenaar  unlet obj
181e4eb6ff0SBram Moolenaar  call assert_false(exists('*{' . funcnumber . '}'))
182e4eb6ff0SBram Moolenaarendfunc
18324c77a1eSBram Moolenaar
18424c77a1eSBram Moolenaarfunc Test_tostring()
18524c77a1eSBram Moolenaar  let d = {}
18624c77a1eSBram Moolenaar  let d.d = d
18724c77a1eSBram Moolenaar  function d.test3()
18824c77a1eSBram Moolenaar    echo 42
18924c77a1eSBram Moolenaar  endfunction
19024c77a1eSBram Moolenaar  try
19124c77a1eSBram Moolenaar    call string(d.test3)
19224c77a1eSBram Moolenaar  catch
19324c77a1eSBram Moolenaar    call assert_true(v:false, v:exception)
19424c77a1eSBram Moolenaar  endtry
19524c77a1eSBram Moolenaarendfunc
196c5fbe8afSBram Moolenaar
197c5fbe8afSBram Moolenaarfunc Test_redefine_dict_func()
198c5fbe8afSBram Moolenaar  let d = {}
199c5fbe8afSBram Moolenaar  function d.test4()
200c5fbe8afSBram Moolenaar  endfunction
201c5fbe8afSBram Moolenaar  let d.test4 = d.test4
202c5fbe8afSBram Moolenaar  try
203c5fbe8afSBram Moolenaar    function! d.test4(name)
204c5fbe8afSBram Moolenaar    endfunction
205c5fbe8afSBram Moolenaar  catch
206c5fbe8afSBram Moolenaar    call assert_true(v:errmsg, v:exception)
207c5fbe8afSBram Moolenaar  endtry
208c5fbe8afSBram Moolenaarendfunc
2094c90861eSBram Moolenaar
2104c90861eSBram Moolenaarfunc Test_bind_in_python()
2114c90861eSBram Moolenaar  if has('python')
2124c90861eSBram Moolenaar    let g:d = {}
2134c90861eSBram Moolenaar    function g:d.test2()
2144c90861eSBram Moolenaar    endfunction
2154c90861eSBram Moolenaar    python import vim
2164c90861eSBram Moolenaar    try
2174c90861eSBram Moolenaar      call assert_equal(pyeval('vim.bindeval("g:d.test2")'), g:d.test2)
2184c90861eSBram Moolenaar    catch
2194c90861eSBram Moolenaar      call assert_true(v:false, v:exception)
2204c90861eSBram Moolenaar    endtry
2214c90861eSBram Moolenaar  endif
2224c90861eSBram Moolenaarendfunc
223ddecc259SBram Moolenaar
224107e1eefSBram Moolenaar" This caused double free on exit if EXITFREE is defined.
225ddecc259SBram Moolenaarfunc Test_cyclic_list_arg()
226ddecc259SBram Moolenaar  let l = []
227ddecc259SBram Moolenaar  let Pt = function('string', [l])
228ddecc259SBram Moolenaar  call add(l, Pt)
229ddecc259SBram Moolenaar  unlet l
230ddecc259SBram Moolenaar  unlet Pt
231ddecc259SBram Moolenaarendfunc
232ddecc259SBram Moolenaar
233107e1eefSBram Moolenaar" This caused double free on exit if EXITFREE is defined.
234ddecc259SBram Moolenaarfunc Test_cyclic_dict_arg()
235ddecc259SBram Moolenaar  let d = {}
236ddecc259SBram Moolenaar  let Pt = function('string', [d])
237ddecc259SBram Moolenaar  let d.Pt = Pt
238ddecc259SBram Moolenaar  unlet d
239ddecc259SBram Moolenaar  unlet Pt
240ddecc259SBram Moolenaarendfunc
241107e1eefSBram Moolenaar
242107e1eefSBram Moolenaarfunc Ignored(job1, job2, status)
243107e1eefSBram Moolenaarendfunc
244107e1eefSBram Moolenaar
245107e1eefSBram Moolenaarfunc Test_cycle_partial_job()
2469e404375SBram Moolenaar  if has('job')
247107e1eefSBram Moolenaar    let job = job_start('echo')
248107e1eefSBram Moolenaar    call job_setoptions(job, {'exit_cb': function('Ignored', [job])})
249107e1eefSBram Moolenaar    unlet job
2509e404375SBram Moolenaar  endif
251107e1eefSBram Moolenaarendfunc
252107e1eefSBram Moolenaar
253107e1eefSBram Moolenaarfunc Test_ref_job_partial_dict()
2549e404375SBram Moolenaar  if has('job')
255107e1eefSBram Moolenaar    let g:ref_job = job_start('echo')
256107e1eefSBram Moolenaar    let d = {'a': 'b'}
257107e1eefSBram Moolenaar    call job_setoptions(g:ref_job, {'exit_cb': function('string', [], d)})
2589e404375SBram Moolenaar  endif
259107e1eefSBram Moolenaarendfunc
2601d429610SBram Moolenaar
2611d429610SBram Moolenaarfunc Test_auto_partial_rebind()
2621d429610SBram Moolenaar  let dict1 = {'name': 'dict1'}
2631d429610SBram Moolenaar  func! dict1.f1()
2641d429610SBram Moolenaar    return self.name
2651d429610SBram Moolenaar  endfunc
2661d429610SBram Moolenaar  let dict1.f2 = function(dict1.f1, dict1)
2671d429610SBram Moolenaar
2681d429610SBram Moolenaar  call assert_equal('dict1', dict1.f1())
2691d429610SBram Moolenaar  call assert_equal('dict1', dict1['f1']())
2701d429610SBram Moolenaar  call assert_equal('dict1', dict1.f2())
2711d429610SBram Moolenaar  call assert_equal('dict1', dict1['f2']())
2721d429610SBram Moolenaar
2731d429610SBram Moolenaar  let dict2 = {'name': 'dict2'}
2741d429610SBram Moolenaar  let dict2.f1 = dict1.f1
2751d429610SBram Moolenaar  let dict2.f2 = dict1.f2
2761d429610SBram Moolenaar
2771d429610SBram Moolenaar  call assert_equal('dict2', dict2.f1())
2781d429610SBram Moolenaar  call assert_equal('dict2', dict2['f1']())
2791d429610SBram Moolenaar  call assert_equal('dict1', dict2.f2())
2801d429610SBram Moolenaar  call assert_equal('dict1', dict2['f2']())
2811d429610SBram Moolenaarendfunc
282*2bbf8effSBram Moolenaar
283*2bbf8effSBram Moolenaarfunc Test_get_partial_items()
284*2bbf8effSBram Moolenaar  let dict = {'name': 'hello'}
285*2bbf8effSBram Moolenaar  let Cb = function('MyDictFunc', ["foo", "bar"], dict)
286*2bbf8effSBram Moolenaar  call assert_equal('MyDictFunc', get(Cb, 'func'))
287*2bbf8effSBram Moolenaar  call assert_equal(["foo", "bar"], get(Cb, 'args'))
288*2bbf8effSBram Moolenaar  call assert_equal(dict, get(Cb, 'dict'))
289*2bbf8effSBram Moolenaar  call assert_fails('call get(Cb, "xxx")', 'E475:')
290*2bbf8effSBram Moolenaarendfunc
291