blob: acba887cbf5c7468b120d7b32dfba133aae7a3ad [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"])
19 call assert_equal("foo/bar/xxx", Cb("xxx"))
20 call assert_equal("foo/bar/yyy", call(Cb, ["yyy"]))
21
Bram Moolenaar346418c2016-03-15 12:36:08 +010022 let Cb = function('MyFunc', [])
23 call assert_equal("a/b/c", Cb("a", "b", "c"))
24
Bram Moolenaar1735bc92016-03-14 23:05:14 +010025 let Sort = function('MySort', [1])
26 call assert_equal([1, 2, 3], sort([3, 1, 2], Sort))
27 let Sort = function('MySort', [0])
28 call assert_equal([3, 2, 1], sort([3, 1, 2], Sort))
29endfunc
30
31func MyDictFunc(arg1, arg2) dict
32 return self.name . '/' . a:arg1 . '/' . a:arg2
33endfunc
34
35func Test_partial_dict()
36 let dict = {'name': 'hello'}
37 let Cb = function('MyDictFunc', ["foo", "bar"], dict)
38 call assert_equal("hello/foo/bar", Cb())
39 call assert_fails('Cb("xxx")', 'E492:')
Bram Moolenaar346418c2016-03-15 12:36:08 +010040
Bram Moolenaar1735bc92016-03-14 23:05:14 +010041 let Cb = function('MyDictFunc', ["foo"], dict)
42 call assert_equal("hello/foo/xxx", Cb("xxx"))
43 call assert_fails('Cb()', 'E492:')
Bram Moolenaar346418c2016-03-15 12:36:08 +010044
45 let Cb = function('MyDictFunc', [], dict)
46 call assert_equal("hello/ttt/xxx", Cb("ttt", "xxx"))
47 call assert_fails('Cb("yyy")', 'E492:')
48
Bram Moolenaar1735bc92016-03-14 23:05:14 +010049 let Cb = function('MyDictFunc', dict)
50 call assert_equal("hello/xxx/yyy", Cb("xxx", "yyy"))
Bram Moolenaar346418c2016-03-15 12:36:08 +010051 call assert_fails('Cb("fff")', 'E492:')
Bram Moolenaar1735bc92016-03-14 23:05:14 +010052endfunc
Bram Moolenaarab1fa392016-03-15 19:33:34 +010053
54func Test_partial_implicit()
55 let dict = {'name': 'foo'}
56 func dict.MyFunc(arg) dict
57 return self.name . '/' . a:arg
58 endfunc
59
60 call assert_equal('foo/bar', dict.MyFunc('bar'))
61
62 call assert_fails('let func = dict.MyFunc', 'E704:')
63 let Func = dict.MyFunc
64 call assert_equal('foo/aaa', Func('aaa'))
65
66 let Func = function(dict.MyFunc, ['bbb'])
67 call assert_equal('foo/bbb', Func())
68
69 call assert_fails('call function(dict.MyFunc, ["bbb"], dict)', 'E924:')
70endfunc
Bram Moolenaar7a5c46a2016-03-16 20:41:21 +010071
72fun InnerCall(funcref)
73 return a:funcref
74endfu
75
76fun OuterCall()
77 let opt = { 'func' : function('sin') }
78 call InnerCall(opt.func)
79endfu
80
81func Test_function_in_dict()
82 call OuterCall()
83endfunc
84