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()