File size: 4,136 Bytes
d61b9c7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import unittest
import sys
from lime.utils.generic_utils import has_arg


class TestGenericUtils(unittest.TestCase):

    def test_has_arg(self):
        # fn is callable / is not callable

        class FooNotCallable:

            def __init__(self, word):
                self.message = word

        class FooCallable:

            def __init__(self, word):
                self.message = word

            def __call__(self, message):
                return message

            def positional_argument_call(self, arg1):
                return self.message

            def multiple_positional_arguments_call(self, *args):
                res = []
                for a in args:
                    res.append(a)
                return res

            def keyword_argument_call(self, filter_=True):
                res = self.message
                if filter_:
                    res = 'KO'
                return res

            def multiple_keyword_arguments_call(self, arg1='1', arg2='2'):
                return self.message + arg1 + arg2

            def undefined_keyword_arguments_call(self, **kwargs):
                res = self.message
                for a in kwargs:
                    res = res + a
                return a

        foo_callable = FooCallable('OK')
        self.assertTrue(has_arg(foo_callable, 'message'))

        if sys.version_info < (3,):
            foo_not_callable = FooNotCallable('KO')
            self.assertFalse(has_arg(foo_not_callable, 'message'))
        elif sys.version_info < (3, 6):
            with self.assertRaises(TypeError):
                foo_not_callable = FooNotCallable('KO')
                has_arg(foo_not_callable, 'message')

        # Python 2, argument in / not in valid arguments / keyword arguments
        if sys.version_info < (3,):
            self.assertFalse(has_arg(foo_callable, 'invalid_arg'))
            self.assertTrue(has_arg(foo_callable.positional_argument_call, 'arg1'))
            self.assertFalse(has_arg(foo_callable.multiple_positional_arguments_call, 'argX'))
            self.assertFalse(has_arg(foo_callable.keyword_argument_call, 'argX'))
            self.assertTrue(has_arg(foo_callable.keyword_argument_call, 'filter_'))
            self.assertTrue(has_arg(foo_callable.multiple_keyword_arguments_call, 'arg2'))
            self.assertFalse(has_arg(foo_callable.multiple_keyword_arguments_call, 'arg3'))
            self.assertFalse(has_arg(foo_callable.undefined_keyword_arguments_call, 'argX'))
        # Python 3, argument in / not in valid arguments / keyword arguments
        elif sys.version_info < (3, 6):
            self.assertFalse(has_arg(foo_callable, 'invalid_arg'))
            self.assertTrue(has_arg(foo_callable.positional_argument_call, 'arg1'))
            self.assertFalse(has_arg(foo_callable.multiple_positional_arguments_call, 'argX'))
            self.assertFalse(has_arg(foo_callable.keyword_argument_call, 'argX'))
            self.assertTrue(has_arg(foo_callable.keyword_argument_call, 'filter_'))
            self.assertTrue(has_arg(foo_callable.multiple_keyword_arguments_call, 'arg2'))
            self.assertFalse(has_arg(foo_callable.multiple_keyword_arguments_call, 'arg3'))
            self.assertFalse(has_arg(foo_callable.undefined_keyword_arguments_call, 'argX'))
        else:
            self.assertFalse(has_arg(foo_callable, 'invalid_arg'))
            self.assertTrue(has_arg(foo_callable.positional_argument_call, 'arg1'))
            self.assertFalse(has_arg(foo_callable.multiple_positional_arguments_call, 'argX'))
            self.assertFalse(has_arg(foo_callable.keyword_argument_call, 'argX'))
            self.assertTrue(has_arg(foo_callable.keyword_argument_call, 'filter_'))
            self.assertTrue(has_arg(foo_callable.multiple_keyword_arguments_call, 'arg2'))
            self.assertFalse(has_arg(foo_callable.multiple_keyword_arguments_call, 'arg3'))
            self.assertFalse(has_arg(foo_callable.undefined_keyword_arguments_call, 'argX'))
        # argname is None
        self.assertFalse(has_arg(foo_callable, None))


if __name__ == '__main__':
    unittest.main()