blob: fe451cd8bed49dabf3927a5363b73668b0cfa046 [file] [log] [blame]
Bram Moolenaar1735bc92016-03-14 23:05:14 +01001" Test binding arguments to a Funcref.
2
3func MyFunc(arg1, arg2, arg3)
4 return a:arg1 . '/' . a:arg2 . '/' . a:arg3
5endfunc
6
7func MySort(up, one, two)
8 if a:one == a:two
9 return 0
10 endif
11 if a:up
Bram Moolenaar790500a2016-03-15 11:05:45 +010012 return a:one > a:two ? 1 : -1
Bram Moolenaar1735bc92016-03-14 23:05:14 +010013 endif
Bram Moolenaar790500a2016-03-15 11:05:45 +010014 return a:one < a:two ? 1 : -1
Bram Moolenaar1735bc92016-03-14 23:05:14 +010015endfunc
16
17func Test_partial_args()
18 let Cb = function('MyFunc', ["foo", "bar"])
Bram Moolenaar65639032016-03-16 21:40:30 +010019
20 call Cb("zzz")
Bram Moolenaar1735bc92016-03-14 23:05:14 +010021 call assert_equal("foo/bar/xxx", Cb("xxx"))
22 call assert_equal("foo/bar/yyy", call(Cb, ["yyy"]))
23
Bram Moolenaar346418c2016-03-15 12:36:08 +010024 let Cb = function('MyFunc', [])
25 call assert_equal("a/b/c", Cb("a", "b", "c"))
26
Bram Moolenaar1735bc92016-03-14 23:05:14 +010027 let Sort = function('MySort', [1])
28 call assert_equal([1, 2, 3], sort([3, 1, 2], Sort))
29 let Sort = function('MySort', [0])
30 call assert_equal([3, 2, 1], sort([3, 1, 2], Sort))
31endfunc
32
33func MyDictFunc(arg1, arg2) dict
34 return self.name . '/' . a:arg1 . '/' . a:arg2
35endfunc
36
37func Test_partial_dict()
38 let dict = {'name': 'hello'}
39 let Cb = function('MyDictFunc', ["foo", "bar"], dict)
40 call assert_equal("hello/foo/bar", Cb())
41 call assert_fails('Cb("xxx")', 'E492:')
Bram Moolenaar346418c2016-03-15 12:36:08 +010042
Bram Moolenaar1735bc92016-03-14 23:05:14 +010043 let Cb = function('MyDictFunc', ["foo"], dict)
44 call assert_equal("hello/foo/xxx", Cb("xxx"))
45 call assert_fails('Cb()', 'E492:')
Bram Moolenaar346418c2016-03-15 12:36:08 +010046
47 let Cb = function('MyDictFunc', [], dict)
48 call assert_equal("hello/ttt/xxx", Cb("ttt", "xxx"))
49 call assert_fails('Cb("yyy")', 'E492:')
50
Bram Moolenaar1735bc92016-03-14 23:05:14 +010051 let Cb = function('MyDictFunc', dict)
52 call assert_equal("hello/xxx/yyy", Cb("xxx", "yyy"))
Bram Moolenaar346418c2016-03-15 12:36:08 +010053 call assert_fails('Cb("fff")', 'E492:')
Bram Moolenaar65639032016-03-16 21:40:30 +010054
55 let dict = {"tr": function('tr', ['hello', 'h', 'H'])}
56 call assert_equal("Hello", dict.tr())
Bram Moolenaar1735bc92016-03-14 23:05:14 +010057endfunc
Bram Moolenaarab1fa392016-03-15 19:33:34 +010058
59func Test_partial_implicit()
60 let dict = {'name': 'foo'}
61 func dict.MyFunc(arg) dict
62 return self.name . '/' . a:arg
63 endfunc
64
65 call assert_equal('foo/bar', dict.MyFunc('bar'))
66
67 call assert_fails('let func = dict.MyFunc', 'E704:')
68 let Func = dict.MyFunc
69 call assert_equal('foo/aaa', Func('aaa'))
70
71 let Func = function(dict.MyFunc, ['bbb'])
72 call assert_equal('foo/bbb', Func())
Bram Moolenaarab1fa392016-03-15 19:33:34 +010073endfunc
Bram Moolenaar7a5c46a2016-03-16 20:41:21 +010074
75fun InnerCall(funcref)
76 return a:funcref
77endfu
78
79fun OuterCall()
80 let opt = { 'func' : function('sin') }
81 call InnerCall(opt.func)
82endfu
83
84func Test_function_in_dict()
85 call OuterCall()
86endfunc
87
Bram Moolenaar6f2e4b32016-03-16 22:52:12 +010088function! s:cache_clear() dict
89 return self.name
90endfunction
91
92func Test_script_function_in_dict()
93 let s:obj = {'name': 'foo'}
94 let s:obj2 = {'name': 'bar'}
95
96 let s:obj['clear'] = function('s:cache_clear')
97
98 call assert_equal('foo', s:obj.clear())
99 let F = s:obj.clear
100 call assert_equal('foo', F())
101 call assert_equal('foo', call(s:obj.clear, [], s:obj))
102 call assert_equal('bar', call(s:obj.clear, [], s:obj2))
103
104 let s:obj2['clear'] = function('s:cache_clear')
105 call assert_equal('bar', s:obj2.clear())
106 let B = s:obj2.clear
107 call assert_equal('bar', B())
108endfunc