Refactor a couple inspect module tests to remove duplicate code
The test_classify_oldstyle and test_classify_newstyle methods of
test.test_inspect.TestClassesAndFunctions were previously almost
identical (aside from irrelevant whitespace and one semantic
difference). They now share a single helper.
Fixes issue #8363.
diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py
index 23e1289..aaa15f8 100644
--- a/Lib/test/test_inspect.py
+++ b/Lib/test/test_inspect.py
@@ -435,130 +435,94 @@
exec 'def fakeSublistOfOne((foo)): return 1'
self.assertArgSpecEquals(fakeSublistOfOne, ['foo'])
+
+ def _classify_test(self, newstyle):
+ """Helper for testing that classify_class_attrs finds a bunch of
+ different kinds of attributes on a given class.
+ """
+ if newstyle:
+ base = object
+ else:
+ class base:
+ pass
+
+ class A(base):
+ def s(): pass
+ s = staticmethod(s)
+
+ def c(cls): pass
+ c = classmethod(c)
+
+ def getp(self): pass
+ p = property(getp)
+
+ def m(self): pass
+
+ def m1(self): pass
+
+ datablob = '1'
+
+ attrs = attrs_wo_objs(A)
+ self.assertIn(('s', 'static method', A), attrs, 'missing static method')
+ self.assertIn(('c', 'class method', A), attrs, 'missing class method')
+ self.assertIn(('p', 'property', A), attrs, 'missing property')
+ self.assertIn(('m', 'method', A), attrs, 'missing plain method')
+ self.assertIn(('m1', 'method', A), attrs, 'missing plain method')
+ self.assertIn(('datablob', 'data', A), attrs, 'missing data')
+
+ class B(A):
+ def m(self): pass
+
+ attrs = attrs_wo_objs(B)
+ self.assertIn(('s', 'static method', A), attrs, 'missing static method')
+ self.assertIn(('c', 'class method', A), attrs, 'missing class method')
+ self.assertIn(('p', 'property', A), attrs, 'missing property')
+ self.assertIn(('m', 'method', B), attrs, 'missing plain method')
+ self.assertIn(('m1', 'method', A), attrs, 'missing plain method')
+ self.assertIn(('datablob', 'data', A), attrs, 'missing data')
+
+
+ class C(A):
+ def m(self): pass
+ def c(self): pass
+
+ attrs = attrs_wo_objs(C)
+ self.assertIn(('s', 'static method', A), attrs, 'missing static method')
+ self.assertIn(('c', 'method', C), attrs, 'missing plain method')
+ self.assertIn(('p', 'property', A), attrs, 'missing property')
+ self.assertIn(('m', 'method', C), attrs, 'missing plain method')
+ self.assertIn(('m1', 'method', A), attrs, 'missing plain method')
+ self.assertIn(('datablob', 'data', A), attrs, 'missing data')
+
+ class D(B, C):
+ def m1(self): pass
+
+ attrs = attrs_wo_objs(D)
+ self.assertIn(('s', 'static method', A), attrs, 'missing static method')
+ if newstyle:
+ self.assertIn(('c', 'method', C), attrs, 'missing plain method')
+ else:
+ self.assertIn(('c', 'class method', A), attrs, 'missing class method')
+ self.assertIn(('p', 'property', A), attrs, 'missing property')
+ self.assertIn(('m', 'method', B), attrs, 'missing plain method')
+ self.assertIn(('m1', 'method', D), attrs, 'missing plain method')
+ self.assertIn(('datablob', 'data', A), attrs, 'missing data')
+
+
def test_classify_oldstyle(self):
- class A:
- def s(): pass
- s = staticmethod(s)
-
- def c(cls): pass
- c = classmethod(c)
-
- def getp(self): pass
- p = property(getp)
-
- def m(self): pass
-
- def m1(self): pass
-
- datablob = '1'
-
- attrs = attrs_wo_objs(A)
- self.assertIn(('s', 'static method', A), attrs, 'missing static method')
- self.assertIn(('c', 'class method', A), attrs, 'missing class method')
- self.assertIn(('p', 'property', A), attrs, 'missing property')
- self.assertIn(('m', 'method', A), attrs, 'missing plain method')
- self.assertIn(('m1', 'method', A), attrs, 'missing plain method')
- self.assertIn(('datablob', 'data', A), attrs, 'missing data')
-
- class B(A):
- def m(self): pass
-
- attrs = attrs_wo_objs(B)
- self.assertIn(('s', 'static method', A), attrs, 'missing static method')
- self.assertIn(('c', 'class method', A), attrs, 'missing class method')
- self.assertIn(('p', 'property', A), attrs, 'missing property')
- self.assertIn(('m', 'method', B), attrs, 'missing plain method')
- self.assertIn(('m1', 'method', A), attrs, 'missing plain method')
- self.assertIn(('datablob', 'data', A), attrs, 'missing data')
+ """classify_class_attrs finds static methods, class methods,
+ properties, normal methods, and data attributes on an old-style
+ class.
+ """
+ self._classify_test(False)
- class C(A):
- def m(self): pass
- def c(self): pass
-
- attrs = attrs_wo_objs(C)
- self.assertIn(('s', 'static method', A), attrs, 'missing static method')
- self.assertIn(('c', 'method', C), attrs, 'missing plain method')
- self.assertIn(('p', 'property', A), attrs, 'missing property')
- self.assertIn(('m', 'method', C), attrs, 'missing plain method')
- self.assertIn(('m1', 'method', A), attrs, 'missing plain method')
- self.assertIn(('datablob', 'data', A), attrs, 'missing data')
-
- class D(B, C):
- def m1(self): pass
-
- attrs = attrs_wo_objs(D)
- self.assertIn(('s', 'static method', A), attrs, 'missing static method')
- self.assertIn(('c', 'class method', A), attrs, 'missing class method')
- self.assertIn(('p', 'property', A), attrs, 'missing property')
- self.assertIn(('m', 'method', B), attrs, 'missing plain method')
- self.assertIn(('m1', 'method', D), attrs, 'missing plain method')
- self.assertIn(('datablob', 'data', A), attrs, 'missing data')
-
- # Repeat all that, but w/ new-style classes.
def test_classify_newstyle(self):
- class A(object):
-
- def s(): pass
- s = staticmethod(s)
-
- def c(cls): pass
- c = classmethod(c)
-
- def getp(self): pass
- p = property(getp)
-
- def m(self): pass
-
- def m1(self): pass
-
- datablob = '1'
-
- attrs = attrs_wo_objs(A)
- self.assertIn(('s', 'static method', A), attrs, 'missing static method')
- self.assertIn(('c', 'class method', A), attrs, 'missing class method')
- self.assertIn(('p', 'property', A), attrs, 'missing property')
- self.assertIn(('m', 'method', A), attrs, 'missing plain method')
- self.assertIn(('m1', 'method', A), attrs, 'missing plain method')
- self.assertIn(('datablob', 'data', A), attrs, 'missing data')
-
- class B(A):
-
- def m(self): pass
-
- attrs = attrs_wo_objs(B)
- self.assertIn(('s', 'static method', A), attrs, 'missing static method')
- self.assertIn(('c', 'class method', A), attrs, 'missing class method')
- self.assertIn(('p', 'property', A), attrs, 'missing property')
- self.assertIn(('m', 'method', B), attrs, 'missing plain method')
- self.assertIn(('m1', 'method', A), attrs, 'missing plain method')
- self.assertIn(('datablob', 'data', A), attrs, 'missing data')
+ """Just like test_classify_oldstyle, but for a new-style class.
+ """
+ self._classify_test(True)
- class C(A):
-
- def m(self): pass
- def c(self): pass
-
- attrs = attrs_wo_objs(C)
- self.assertIn(('s', 'static method', A), attrs, 'missing static method')
- self.assertIn(('c', 'method', C), attrs, 'missing plain method')
- self.assertIn(('p', 'property', A), attrs, 'missing property')
- self.assertIn(('m', 'method', C), attrs, 'missing plain method')
- self.assertIn(('m1', 'method', A), attrs, 'missing plain method')
- self.assertIn(('datablob', 'data', A), attrs, 'missing data')
-
- class D(B, C):
-
- def m1(self): pass
-
- attrs = attrs_wo_objs(D)
- self.assertIn(('s', 'static method', A), attrs, 'missing static method')
- self.assertIn(('c', 'method', C), attrs, 'missing plain method')
- self.assertIn(('p', 'property', A), attrs, 'missing property')
- self.assertIn(('m', 'method', B), attrs, 'missing plain method')
- self.assertIn(('m1', 'method', D), attrs, 'missing plain method')
- self.assertIn(('datablob', 'data', A), attrs, 'missing data')
class TestGetcallargsFunctions(unittest.TestCase):