xref: /vim-8.2.3635/src/testdir/test_partial.vim (revision 6d91bcb4)
11735bc98SBram Moolenaar" Test binding arguments to a Funcref.
21735bc98SBram Moolenaar
3*6d91bcb4SBram Moolenaarsource check.vim
4*6d91bcb4SBram Moolenaar
51735bc98SBram Moolenaarfunc MyFunc(arg1, arg2, arg3)
61735bc98SBram Moolenaar  return a:arg1 . '/' . a:arg2 . '/' . a:arg3
71735bc98SBram Moolenaarendfunc
81735bc98SBram Moolenaar
91735bc98SBram Moolenaarfunc MySort(up, one, two)
101735bc98SBram Moolenaar  if a:one == a:two
111735bc98SBram Moolenaar    return 0
121735bc98SBram Moolenaar  endif
131735bc98SBram Moolenaar  if a:up
14790500a8SBram Moolenaar    return a:one > a:two ? 1 : -1
151735bc98SBram Moolenaar  endif
16790500a8SBram Moolenaar  return a:one < a:two ? 1 : -1
171735bc98SBram Moolenaarendfunc
181735bc98SBram Moolenaar
19b33c7eb5SBram Moolenaarfunc MyMap(sub, index, val)
20b33c7eb5SBram Moolenaar  return a:val - a:sub
21b33c7eb5SBram Moolenaarendfunc
22b33c7eb5SBram Moolenaar
23b33c7eb5SBram Moolenaarfunc MyFilter(threshold, index, val)
24b33c7eb5SBram Moolenaar  return a:val > a:threshold
25b33c7eb5SBram Moolenaarendfunc
26b33c7eb5SBram Moolenaar
271735bc98SBram Moolenaarfunc Test_partial_args()
281735bc98SBram Moolenaar  let Cb = function('MyFunc', ["foo", "bar"])
2965639032SBram Moolenaar
3065639032SBram Moolenaar  call Cb("zzz")
311735bc98SBram Moolenaar  call assert_equal("foo/bar/xxx", Cb("xxx"))
321735bc98SBram Moolenaar  call assert_equal("foo/bar/yyy", call(Cb, ["yyy"]))
338a1bb046SBram Moolenaar  let Cb2 = function(Cb)
348a1bb046SBram Moolenaar  call assert_equal("foo/bar/zzz", Cb2("zzz"))
358a1bb046SBram Moolenaar  let Cb3 = function(Cb, ["www"])
368a1bb046SBram Moolenaar  call assert_equal("foo/bar/www", Cb3())
371735bc98SBram Moolenaar
38346418c6SBram Moolenaar  let Cb = function('MyFunc', [])
39346418c6SBram Moolenaar  call assert_equal("a/b/c", Cb("a", "b", "c"))
408a1bb046SBram Moolenaar  let Cb2 = function(Cb, [])
418a1bb046SBram Moolenaar  call assert_equal("a/b/d", Cb2("a", "b", "d"))
428a1bb046SBram Moolenaar  let Cb3 = function(Cb, ["a", "b"])
438a1bb046SBram Moolenaar  call assert_equal("a/b/e", Cb3("e"))
44346418c6SBram Moolenaar
451735bc98SBram Moolenaar  let Sort = function('MySort', [1])
461735bc98SBram Moolenaar  call assert_equal([1, 2, 3], sort([3, 1, 2], Sort))
471735bc98SBram Moolenaar  let Sort = function('MySort', [0])
481735bc98SBram Moolenaar  call assert_equal([3, 2, 1], sort([3, 1, 2], Sort))
49b33c7eb5SBram Moolenaar
50b33c7eb5SBram Moolenaar  let Map = function('MyMap', [2])
51b33c7eb5SBram Moolenaar  call assert_equal([-1, 0, 1], map([1, 2, 3], Map))
52b33c7eb5SBram Moolenaar  let Map = function('MyMap', [3])
53b33c7eb5SBram Moolenaar  call assert_equal([-2, -1, 0], map([1, 2, 3], Map))
54b33c7eb5SBram Moolenaar
55b33c7eb5SBram Moolenaar  let Filter = function('MyFilter', [1])
56b33c7eb5SBram Moolenaar  call assert_equal([2, 3], filter([1, 2, 3], Filter))
57b33c7eb5SBram Moolenaar  let Filter = function('MyFilter', [2])
58b33c7eb5SBram Moolenaar  call assert_equal([3], filter([1, 2, 3], Filter))
591735bc98SBram Moolenaarendfunc
601735bc98SBram Moolenaar
611735bc98SBram Moolenaarfunc MyDictFunc(arg1, arg2) dict
621735bc98SBram Moolenaar  return self.name . '/' . a:arg1 . '/' . a:arg2
631735bc98SBram Moolenaarendfunc
641735bc98SBram Moolenaar
651735bc98SBram Moolenaarfunc Test_partial_dict()
661735bc98SBram Moolenaar  let dict = {'name': 'hello'}
671735bc98SBram Moolenaar  let Cb = function('MyDictFunc', ["foo", "bar"], dict)
689d8d0b5cSBram Moolenaar  call test_garbagecollect_now()
691735bc98SBram Moolenaar  call assert_equal("hello/foo/bar", Cb())
701735bc98SBram Moolenaar  call assert_fails('Cb("xxx")', 'E492:')
71346418c6SBram Moolenaar
721735bc98SBram Moolenaar  let Cb = function('MyDictFunc', ["foo"], dict)
731735bc98SBram Moolenaar  call assert_equal("hello/foo/xxx", Cb("xxx"))
741735bc98SBram Moolenaar  call assert_fails('Cb()', 'E492:')
75346418c6SBram Moolenaar
76346418c6SBram Moolenaar  let Cb = function('MyDictFunc', [], dict)
77346418c6SBram Moolenaar  call assert_equal("hello/ttt/xxx", Cb("ttt", "xxx"))
78346418c6SBram Moolenaar  call assert_fails('Cb("yyy")', 'E492:')
79346418c6SBram Moolenaar
801735bc98SBram Moolenaar  let Cb = function('MyDictFunc', dict)
811735bc98SBram Moolenaar  call assert_equal("hello/xxx/yyy", Cb("xxx", "yyy"))
82346418c6SBram Moolenaar  call assert_fails('Cb("fff")', 'E492:')
8365639032SBram Moolenaar
84b33c7eb5SBram Moolenaar  let Cb = function('MyDictFunc', dict)
85b33c7eb5SBram Moolenaar  call assert_equal({"foo": "hello/foo/1", "bar": "hello/bar/2"}, map({"foo": 1, "bar": 2}, Cb))
86b33c7eb5SBram Moolenaar
8765639032SBram Moolenaar  let dict = {"tr": function('tr', ['hello', 'h', 'H'])}
8865639032SBram Moolenaar  call assert_equal("Hello", dict.tr())
890e05de46SBram Moolenaar
900e05de46SBram Moolenaar  call assert_fails("let F=function('setloclist', 10)", "E923:")
910e05de46SBram Moolenaar  call assert_fails("let F=function('setloclist', [], [])", "E922:")
921735bc98SBram Moolenaarendfunc
93ab1fa395SBram Moolenaar
94ab1fa395SBram Moolenaarfunc Test_partial_implicit()
95ab1fa395SBram Moolenaar  let dict = {'name': 'foo'}
96ab1fa395SBram Moolenaar  func dict.MyFunc(arg) dict
97ab1fa395SBram Moolenaar    return self.name . '/' . a:arg
98ab1fa395SBram Moolenaar  endfunc
99ab1fa395SBram Moolenaar
100ab1fa395SBram Moolenaar  call assert_equal('foo/bar',  dict.MyFunc('bar'))
101ab1fa395SBram Moolenaar
102ab1fa395SBram Moolenaar  call assert_fails('let func = dict.MyFunc', 'E704:')
103ab1fa395SBram Moolenaar  let Func = dict.MyFunc
104ab1fa395SBram Moolenaar  call assert_equal('foo/aaa', Func('aaa'))
105ab1fa395SBram Moolenaar
106ab1fa395SBram Moolenaar  let Func = function(dict.MyFunc, ['bbb'])
107ab1fa395SBram Moolenaar  call assert_equal('foo/bbb', Func())
108ab1fa395SBram Moolenaarendfunc
1097a5c46a9SBram Moolenaar
1107a5c46a9SBram Moolenaarfun InnerCall(funcref)
1117a5c46a9SBram Moolenaar  return a:funcref
1127a5c46a9SBram Moolenaarendfu
1137a5c46a9SBram Moolenaar
1147a5c46a9SBram Moolenaarfun OuterCall()
1155feabe00SBram Moolenaar  let opt = { 'func' : function('max') }
1167a5c46a9SBram Moolenaar  call InnerCall(opt.func)
1177a5c46a9SBram Moolenaarendfu
1187a5c46a9SBram Moolenaar
1197a5c46a9SBram Moolenaarfunc Test_function_in_dict()
1207a5c46a9SBram Moolenaar  call OuterCall()
1217a5c46a9SBram Moolenaarendfunc
1227a5c46a9SBram Moolenaar
1231e115360SBram Moolenaarfunc s:cache_clear() dict
1246f2e4b36SBram Moolenaar  return self.name
1251e115360SBram Moolenaarendfunc
1266f2e4b36SBram Moolenaar
1276f2e4b36SBram Moolenaarfunc Test_script_function_in_dict()
1286f2e4b36SBram Moolenaar  let s:obj = {'name': 'foo'}
1296f2e4b36SBram Moolenaar  let s:obj2 = {'name': 'bar'}
1306f2e4b36SBram Moolenaar
1316f2e4b36SBram Moolenaar  let s:obj['clear'] = function('s:cache_clear')
1326f2e4b36SBram Moolenaar
1336f2e4b36SBram Moolenaar  call assert_equal('foo', s:obj.clear())
1346f2e4b36SBram Moolenaar  let F = s:obj.clear
1356f2e4b36SBram Moolenaar  call assert_equal('foo', F())
1366f2e4b36SBram Moolenaar  call assert_equal('foo', call(s:obj.clear, [], s:obj))
1376f2e4b36SBram Moolenaar  call assert_equal('bar', call(s:obj.clear, [], s:obj2))
1386f2e4b36SBram Moolenaar
1396f2e4b36SBram Moolenaar  let s:obj2['clear'] = function('s:cache_clear')
1406f2e4b36SBram Moolenaar  call assert_equal('bar', s:obj2.clear())
1416f2e4b36SBram Moolenaar  let B = s:obj2.clear
1426f2e4b36SBram Moolenaar  call assert_equal('bar', B())
1436f2e4b36SBram Moolenaarendfunc
144d22a1892SBram Moolenaar
1451e115360SBram Moolenaarfunc s:cache_arg(arg) dict
1469e63f61cSBram Moolenaar  let s:result = self.name . '/' . a:arg
1479e63f61cSBram Moolenaar  return s:result
1481e115360SBram Moolenaarendfunc
1499e63f61cSBram Moolenaar
1509e63f61cSBram Moolenaarfunc Test_script_function_in_dict_arg()
1519e63f61cSBram Moolenaar  let s:obj = {'name': 'foo'}
1529e63f61cSBram Moolenaar  let s:obj['clear'] = function('s:cache_arg')
1539e63f61cSBram Moolenaar
1549e63f61cSBram Moolenaar  call assert_equal('foo/bar', s:obj.clear('bar'))
1559e63f61cSBram Moolenaar  let F = s:obj.clear
1569e63f61cSBram Moolenaar  let s:result = ''
1579e63f61cSBram Moolenaar  call assert_equal('foo/bar', F('bar'))
1589e63f61cSBram Moolenaar  call assert_equal('foo/bar', s:result)
1599e63f61cSBram Moolenaar
1609e63f61cSBram Moolenaar  let s:obj['clear'] = function('s:cache_arg', ['bar'])
1619e63f61cSBram Moolenaar  call assert_equal('foo/bar', s:obj.clear())
1629e63f61cSBram Moolenaar  let s:result = ''
1639e63f61cSBram Moolenaar  call s:obj.clear()
1649e63f61cSBram Moolenaar  call assert_equal('foo/bar', s:result)
1659e63f61cSBram Moolenaar
1669e63f61cSBram Moolenaar  let F = s:obj.clear
1679e63f61cSBram Moolenaar  call assert_equal('foo/bar', F())
1689e63f61cSBram Moolenaar  let s:result = ''
1699e63f61cSBram Moolenaar  call F()
1709e63f61cSBram Moolenaar  call assert_equal('foo/bar', s:result)
1719e63f61cSBram Moolenaar
1729e63f61cSBram Moolenaar  call assert_equal('foo/bar', call(s:obj.clear, [], s:obj))
1739e63f61cSBram Moolenaarendfunc
1749e63f61cSBram Moolenaar
175d22a1892SBram Moolenaarfunc Test_partial_exists()
176d22a1892SBram Moolenaar  let F = function('MyFunc')
177d22a1892SBram Moolenaar  call assert_true(exists('*F'))
178d22a1892SBram Moolenaar  let lF = [F]
179d22a1892SBram Moolenaar  call assert_true(exists('*lF[0]'))
180d22a1892SBram Moolenaar
181d22a1892SBram Moolenaar  let F = function('MyFunc', ['arg'])
182d22a1892SBram Moolenaar  call assert_true(exists('*F'))
183d22a1892SBram Moolenaar  let lF = [F]
184d22a1892SBram Moolenaar  call assert_true(exists('*lF[0]'))
185d22a1892SBram Moolenaarendfunc
1865c29154bSBram Moolenaar
1875c29154bSBram Moolenaarfunc Test_partial_string()
1885c29154bSBram Moolenaar  let F = function('MyFunc')
1895c29154bSBram Moolenaar  call assert_equal("function('MyFunc')", string(F))
1905c29154bSBram Moolenaar  let F = function('MyFunc', ['foo'])
1915c29154bSBram Moolenaar  call assert_equal("function('MyFunc', ['foo'])", string(F))
1925c29154bSBram Moolenaar  let F = function('MyFunc', ['foo', 'bar'])
1935c29154bSBram Moolenaar  call assert_equal("function('MyFunc', ['foo', 'bar'])", string(F))
1945c29154bSBram Moolenaar  let d = {'one': 1}
1955c29154bSBram Moolenaar  let F = function('MyFunc', d)
1965c29154bSBram Moolenaar  call assert_equal("function('MyFunc', {'one': 1})", string(F))
1975c29154bSBram Moolenaar  let F = function('MyFunc', ['foo'], d)
1985c29154bSBram Moolenaar  call assert_equal("function('MyFunc', ['foo'], {'one': 1})", string(F))
19992b83ccfSBram Moolenaar  call assert_equal("function('')", string(test_null_function()))
20092b83ccfSBram Moolenaar  call assert_equal("function('')", string(test_null_partial()))
2015c29154bSBram Moolenaarendfunc
202e4eb6ff0SBram Moolenaar
203e4eb6ff0SBram Moolenaarfunc Test_func_unref()
204e4eb6ff0SBram Moolenaar  let obj = {}
205e4eb6ff0SBram Moolenaar  function! obj.func() abort
206e4eb6ff0SBram Moolenaar  endfunction
207e4eb6ff0SBram Moolenaar  let funcnumber = matchstr(string(obj.func), '^function(''\zs.\{-}\ze''')
208e4eb6ff0SBram Moolenaar  call assert_true(exists('*{' . funcnumber . '}'))
209e4eb6ff0SBram Moolenaar  unlet obj
210e4eb6ff0SBram Moolenaar  call assert_false(exists('*{' . funcnumber . '}'))
211e4eb6ff0SBram Moolenaarendfunc
21224c77a1eSBram Moolenaar
21324c77a1eSBram Moolenaarfunc Test_tostring()
21424c77a1eSBram Moolenaar  let d = {}
21524c77a1eSBram Moolenaar  let d.d = d
21624c77a1eSBram Moolenaar  function d.test3()
21724c77a1eSBram Moolenaar    echo 42
21824c77a1eSBram Moolenaar  endfunction
21924c77a1eSBram Moolenaar  try
22024c77a1eSBram Moolenaar    call string(d.test3)
22124c77a1eSBram Moolenaar  catch
22224c77a1eSBram Moolenaar    call assert_true(v:false, v:exception)
22324c77a1eSBram Moolenaar  endtry
22424c77a1eSBram Moolenaarendfunc
225c5fbe8afSBram Moolenaar
226c5fbe8afSBram Moolenaarfunc Test_redefine_dict_func()
227c5fbe8afSBram Moolenaar  let d = {}
228c5fbe8afSBram Moolenaar  function d.test4()
229c5fbe8afSBram Moolenaar  endfunction
230c5fbe8afSBram Moolenaar  let d.test4 = d.test4
231c5fbe8afSBram Moolenaar  try
232c5fbe8afSBram Moolenaar    function! d.test4(name)
233c5fbe8afSBram Moolenaar    endfunction
234c5fbe8afSBram Moolenaar  catch
235c5fbe8afSBram Moolenaar    call assert_true(v:errmsg, v:exception)
236c5fbe8afSBram Moolenaar  endtry
237c5fbe8afSBram Moolenaarendfunc
2384c90861eSBram Moolenaar
2394c90861eSBram Moolenaarfunc Test_bind_in_python()
240*6d91bcb4SBram Moolenaar  CheckFeature python
2414c90861eSBram Moolenaar  let g:d = {}
2424c90861eSBram Moolenaar  function g:d.test2()
2434c90861eSBram Moolenaar  endfunction
2444c90861eSBram Moolenaar  python import vim
2454c90861eSBram Moolenaar  try
2464c90861eSBram Moolenaar    call assert_equal(pyeval('vim.bindeval("g:d.test2")'), g:d.test2)
2474c90861eSBram Moolenaar  catch
2484c90861eSBram Moolenaar    call assert_true(v:false, v:exception)
2494c90861eSBram Moolenaar  endtry
2504c90861eSBram Moolenaarendfunc
251ddecc259SBram Moolenaar
252107e1eefSBram Moolenaar" This caused double free on exit if EXITFREE is defined.
253ddecc259SBram Moolenaarfunc Test_cyclic_list_arg()
254ddecc259SBram Moolenaar  let l = []
255ddecc259SBram Moolenaar  let Pt = function('string', [l])
256ddecc259SBram Moolenaar  call add(l, Pt)
257ddecc259SBram Moolenaar  unlet l
258ddecc259SBram Moolenaar  unlet Pt
259ddecc259SBram Moolenaarendfunc
260ddecc259SBram Moolenaar
261107e1eefSBram Moolenaar" This caused double free on exit if EXITFREE is defined.
262ddecc259SBram Moolenaarfunc Test_cyclic_dict_arg()
263ddecc259SBram Moolenaar  let d = {}
264ddecc259SBram Moolenaar  let Pt = function('string', [d])
265ddecc259SBram Moolenaar  let d.Pt = Pt
266ddecc259SBram Moolenaar  unlet d
267ddecc259SBram Moolenaar  unlet Pt
268ddecc259SBram Moolenaarendfunc
269107e1eefSBram Moolenaar
2700e5d3a29SBram Moolenaarfunc Ignored3(job1, job2, status)
271107e1eefSBram Moolenaarendfunc
272107e1eefSBram Moolenaar
273107e1eefSBram Moolenaarfunc Test_cycle_partial_job()
274*6d91bcb4SBram Moolenaar  CheckFeature job
275107e1eefSBram Moolenaar  let job = job_start('echo')
2760e5d3a29SBram Moolenaar  call job_setoptions(job, {'exit_cb': function('Ignored3', [job])})
277107e1eefSBram Moolenaar  unlet job
278107e1eefSBram Moolenaarendfunc
279107e1eefSBram Moolenaar
2800e5d3a29SBram Moolenaarfunc Ignored2(job, status)
2810e5d3a29SBram Moolenaarendfunc
2820e5d3a29SBram Moolenaar
283107e1eefSBram Moolenaarfunc Test_ref_job_partial_dict()
284*6d91bcb4SBram Moolenaar  CheckFeature job
285107e1eefSBram Moolenaar  let g:ref_job = job_start('echo')
286107e1eefSBram Moolenaar  let d = {'a': 'b'}
2870e5d3a29SBram Moolenaar  call job_setoptions(g:ref_job, {'exit_cb': function('Ignored2', [], d)})
2889d8d0b5cSBram Moolenaar  call test_garbagecollect_now()
289107e1eefSBram Moolenaarendfunc
2901d429610SBram Moolenaar
2911d429610SBram Moolenaarfunc Test_auto_partial_rebind()
2921d429610SBram Moolenaar  let dict1 = {'name': 'dict1'}
2931d429610SBram Moolenaar  func! dict1.f1()
2941d429610SBram Moolenaar    return self.name
2951d429610SBram Moolenaar  endfunc
2961d429610SBram Moolenaar  let dict1.f2 = function(dict1.f1, dict1)
2971d429610SBram Moolenaar
2981d429610SBram Moolenaar  call assert_equal('dict1', dict1.f1())
2991d429610SBram Moolenaar  call assert_equal('dict1', dict1['f1']())
3001d429610SBram Moolenaar  call assert_equal('dict1', dict1.f2())
3011d429610SBram Moolenaar  call assert_equal('dict1', dict1['f2']())
3021d429610SBram Moolenaar
3031d429610SBram Moolenaar  let dict2 = {'name': 'dict2'}
3041d429610SBram Moolenaar  let dict2.f1 = dict1.f1
3051d429610SBram Moolenaar  let dict2.f2 = dict1.f2
3061d429610SBram Moolenaar
3071d429610SBram Moolenaar  call assert_equal('dict2', dict2.f1())
3081d429610SBram Moolenaar  call assert_equal('dict2', dict2['f1']())
3091d429610SBram Moolenaar  call assert_equal('dict1', dict2.f2())
3101d429610SBram Moolenaar  call assert_equal('dict1', dict2['f2']())
3111d429610SBram Moolenaarendfunc
3122bbf8effSBram Moolenaar
3132bbf8effSBram Moolenaarfunc Test_get_partial_items()
3142bbf8effSBram Moolenaar  let dict = {'name': 'hello'}
31503e19a04SBram Moolenaar  let args = ["foo", "bar"]
31603e19a04SBram Moolenaar  let Func = function('MyDictFunc')
31703e19a04SBram Moolenaar  let Cb = function('MyDictFunc', args, dict)
31803e19a04SBram Moolenaar
31903e19a04SBram Moolenaar  call assert_equal(Func, get(Cb, 'func'))
32003e19a04SBram Moolenaar  call assert_equal('MyDictFunc', get(Cb, 'name'))
32103e19a04SBram Moolenaar  call assert_equal(args, get(Cb, 'args'))
3222bbf8effSBram Moolenaar  call assert_equal(dict, get(Cb, 'dict'))
3232bbf8effSBram Moolenaar  call assert_fails('call get(Cb, "xxx")', 'E475:')
32403e19a04SBram Moolenaar
32503e19a04SBram Moolenaar  call assert_equal(Func, get(Func, 'func'))
32603e19a04SBram Moolenaar  call assert_equal('MyDictFunc', get(Func, 'name'))
32703e19a04SBram Moolenaar  call assert_equal([], get(Func, 'args'))
32803e19a04SBram Moolenaar  call assert_true(empty( get(Func, 'dict')))
329f91aac5eSBram Moolenaar
330f91aac5eSBram Moolenaar  let P = function('substitute', ['hello there', 'there'])
331f91aac5eSBram Moolenaar  let dict = {'partial has': 'no dict'}
332f91aac5eSBram Moolenaar  call assert_equal(dict, get(P, 'dict', dict))
333f91aac5eSBram Moolenaar  call assert_equal(0, get(l:P, 'dict'))
3342bbf8effSBram Moolenaarendfunc
3358e759ba8SBram Moolenaar
3368e759ba8SBram Moolenaarfunc Test_compare_partials()
3378e759ba8SBram Moolenaar  let d1 = {}
3388e759ba8SBram Moolenaar  let d2 = {}
3398e759ba8SBram Moolenaar
3408e759ba8SBram Moolenaar  function d1.f1() dict
3418e759ba8SBram Moolenaar  endfunction
3428e759ba8SBram Moolenaar
3438e759ba8SBram Moolenaar  function d1.f2() dict
3448e759ba8SBram Moolenaar  endfunction
3458e759ba8SBram Moolenaar
3468e759ba8SBram Moolenaar  let F1 = get(d1, 'f1')
3478e759ba8SBram Moolenaar  let F2 = get(d1, 'f2')
3488e759ba8SBram Moolenaar
3498e759ba8SBram Moolenaar  let F1d1 = function(F1, d1)
3508e759ba8SBram Moolenaar  let F2d1 = function(F2, d2)
3518e759ba8SBram Moolenaar  let F1d1a1 = function(F1d1, [1])
3528e759ba8SBram Moolenaar  let F1d1a12 = function(F1d1, [1, 2])
3538e759ba8SBram Moolenaar  let F1a1 = function(F1, [1])
3548e759ba8SBram Moolenaar  let F1a2 = function(F1, [2])
3558e759ba8SBram Moolenaar  let F1d2 = function(F1, d2)
3568e759ba8SBram Moolenaar  let d3 = {'f1': F1, 'f2': F2}
3578e759ba8SBram Moolenaar  let F1d3 = function(F1, d3)
3588e759ba8SBram Moolenaar  let F1ad1 = function(F1, [d1])
3598e759ba8SBram Moolenaar  let F1ad3 = function(F1, [d3])
3608e759ba8SBram Moolenaar
3618e759ba8SBram Moolenaar  call assert_match('^function(''\d\+'')$', string(F1))  " Not a partial
3628e759ba8SBram Moolenaar  call assert_match('^function(''\d\+'')$', string(F2))  " Not a partial
3638e759ba8SBram Moolenaar  call assert_match('^function(''\d\+'', {.*})$', string(F1d1))  " A partial
3648e759ba8SBram Moolenaar  call assert_match('^function(''\d\+'', {.*})$', string(F2d1))  " A partial
3658e759ba8SBram Moolenaar  call assert_match('^function(''\d\+'', \[.*\])$', string(F1a1))  " No dict
3668e759ba8SBram Moolenaar
3678e759ba8SBram Moolenaar  " !=
3688e759ba8SBram Moolenaar  let X = F1
3698e759ba8SBram Moolenaar  call assert_false(F1 != X)  " same function
3708e759ba8SBram Moolenaar  let X = F1d1
3718e759ba8SBram Moolenaar  call assert_false(F1d1 != X)  " same partial
3728e759ba8SBram Moolenaar  let X = F1d1a1
3738e759ba8SBram Moolenaar  call assert_false(F1d1a1 != X)  " same partial
3748e759ba8SBram Moolenaar  let X = F1a1
3758e759ba8SBram Moolenaar  call assert_false(F1a1 != X)  " same partial
3768e759ba8SBram Moolenaar
3778e759ba8SBram Moolenaar  call assert_true(F1 != F2)  " Different functions
3788e759ba8SBram Moolenaar  call assert_true(F1 != F1d1)  " Partial /= non-partial
3798e759ba8SBram Moolenaar  call assert_true(F1d1a1 != F1d1a12)  " Different number of arguments
3808e759ba8SBram Moolenaar  call assert_true(F1a1 != F1d1a12)  " One has no dict
3818e759ba8SBram Moolenaar  call assert_true(F1a1 != F1a2)  " Different arguments
3828e759ba8SBram Moolenaar  call assert_true(F1d2 != F1d1)  " Different dictionaries
3838e759ba8SBram Moolenaar  call assert_false(F1d1 != F1d3)  " Equal dictionaries, even though d1 isnot d3
3848e759ba8SBram Moolenaar
3858e759ba8SBram Moolenaar  " isnot, option 1
3868e759ba8SBram Moolenaar  call assert_true(F1 isnot# F2)  " Different functions
3878e759ba8SBram Moolenaar  call assert_true(F1 isnot# F1d1)  " Partial /= non-partial
3888e759ba8SBram Moolenaar  call assert_true(F1d1 isnot# F1d3)  " d1 isnot d3, even though d1 == d3
3898e759ba8SBram Moolenaar  call assert_true(F1a1 isnot# F1d1a12)  " One has no dict
3908e759ba8SBram Moolenaar  call assert_true(F1a1 isnot# F1a2)  " Different number of arguments
3918e759ba8SBram Moolenaar  call assert_true(F1ad1 isnot# F1ad3)  " In arguments d1 isnot d3
3928e759ba8SBram Moolenaar
3938e759ba8SBram Moolenaar  " isnot, option 2
3948e759ba8SBram Moolenaar  call assert_true(F1 isnot# F2)  " Different functions
3958e759ba8SBram Moolenaar  call assert_true(F1 isnot# F1d1)  " Partial /= non-partial
3968e759ba8SBram Moolenaar  call assert_true(d1.f1 isnot# d1.f1)  " handle_subscript creates new partial each time
3979d8d0b5cSBram Moolenaar
3989d8d0b5cSBram Moolenaar  " compare two null partials
3999d8d0b5cSBram Moolenaar  let N1 = test_null_partial()
4009d8d0b5cSBram Moolenaar  let N2 = N1
4019d8d0b5cSBram Moolenaar  call assert_true(N1 is N2)
4029d8d0b5cSBram Moolenaar  call assert_true(N1 == N2)
4039d8d0b5cSBram Moolenaar
4049d8d0b5cSBram Moolenaar  " compare a partial and a null partial
4059d8d0b5cSBram Moolenaar  call assert_false(N1 == F1)
4069d8d0b5cSBram Moolenaar  call assert_false(F1 is N1)
4078e759ba8SBram Moolenaarendfunc
4080e05de46SBram Moolenaar
4090e05de46SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
410