summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/test_utils_defining_class.py83
1 files changed, 83 insertions, 0 deletions
diff --git a/tests/test_utils_defining_class.py b/tests/test_utils_defining_class.py
new file mode 100644
index 00000000..0fbcf83b
--- /dev/null
+++ b/tests/test_utils_defining_class.py
@@ -0,0 +1,83 @@
+# coding=utf-8
+# flake8: noqa E302
+"""
+Unit testing for get_defining_class in cmd2/utils.py module.
+"""
+import functools
+
+import cmd2.utils as cu
+
+
+class ParentClass(object):
+ def func_with_overrides(self):
+ pass
+
+ def parent_only_func(self, param1, param2):
+ pass
+
+
+class ChildClass(ParentClass):
+ def func_with_overrides(self):
+ super(ChildClass, self).func_with_overrides()
+
+ def child_function(self):
+ pass
+
+ lambda1 = lambda: 1
+
+ lambda2 = (lambda: lambda: 2)()
+
+ @classmethod
+ def class_method(cls):
+ pass
+
+ @staticmethod
+ def static_meth():
+ pass
+
+
+def func_not_in_class():
+ pass
+
+
+def test_get_defining_class():
+ parent_instance = ParentClass()
+ child_instance = ChildClass()
+
+ # validate unbound class functions
+ assert cu.get_defining_class(ParentClass.func_with_overrides) is ParentClass
+ assert cu.get_defining_class(ParentClass.parent_only_func) is ParentClass
+ assert cu.get_defining_class(ChildClass.func_with_overrides) is ChildClass
+ assert cu.get_defining_class(ChildClass.parent_only_func) is ParentClass
+ assert cu.get_defining_class(ChildClass.child_function) is ChildClass
+ assert cu.get_defining_class(ChildClass.class_method) is ChildClass
+ assert cu.get_defining_class(ChildClass.static_meth) is ChildClass
+
+ # validate bound class methods
+ assert cu.get_defining_class(parent_instance.func_with_overrides) is ParentClass
+ assert cu.get_defining_class(parent_instance.parent_only_func) is ParentClass
+ assert cu.get_defining_class(child_instance.func_with_overrides) is ChildClass
+ assert cu.get_defining_class(child_instance.parent_only_func) is ParentClass
+ assert cu.get_defining_class(child_instance.child_function) is ChildClass
+ assert cu.get_defining_class(child_instance.class_method) is ChildClass
+ assert cu.get_defining_class(child_instance.static_meth) is ChildClass
+
+ # bare functions resolve to nothing
+ assert cu.get_defining_class(func_not_in_class) is None
+
+ # lambdas and nested lambdas
+ assert cu.get_defining_class(ChildClass.lambda1) is ChildClass
+ assert cu.get_defining_class(ChildClass.lambda2) is ChildClass
+ assert cu.get_defining_class(ChildClass().lambda1) is ChildClass
+ assert cu.get_defining_class(ChildClass().lambda2) is ChildClass
+
+ # partials
+ partial_unbound = functools.partial(ParentClass.parent_only_func, 1)
+ nested_partial_unbound = functools.partial(partial_unbound, 2)
+ assert cu.get_defining_class(partial_unbound) is ParentClass
+ assert cu.get_defining_class(nested_partial_unbound) is ParentClass
+
+ partial_bound = functools.partial(parent_instance.parent_only_func, 1)
+ nested_partial_bound = functools.partial(partial_bound, 2)
+ assert cu.get_defining_class(partial_bound) is ParentClass
+ assert cu.get_defining_class(nested_partial_bound) is ParentClass