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