summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/pyclbr_input.py68
-rw-r--r--Lib/test/test_pyclbr.py24
2 files changed, 75 insertions, 17 deletions
diff --git a/Lib/test/pyclbr_input.py b/Lib/test/pyclbr_input.py
index 19ccd62..5535edb 100644
--- a/Lib/test/pyclbr_input.py
+++ b/Lib/test/pyclbr_input.py
@@ -12,17 +12,19 @@ class B (object):
def bm(self): pass
class C (B):
- foo = Other().foo
- om = Other.om
-
d = 10
- # XXX: This causes test_pyclbr.py to fail, but only because the
- # introspection-based is_method() code in the test can't
- # distinguish between this and a genuine method function like m().
- # The pyclbr.py module gets this right as it parses the text.
+ # This one is correctly considered by both test_pyclbr.py and pyclbr.py
+ # as a non-method of C.
+ foo = Other().foo
+
+ # This causes test_pyclbr.py to fail, but only because the
+ # introspection-based is_method() code in the test can't
+ # distinguish between this and a genuine method function like m().
#
- #f = f
+ # The pyclbr.py module gets this right as it parses the text.
+ om = Other.om
+ f = f
def m(self): pass
@@ -31,3 +33,53 @@ class C (B):
@classmethod
def cm(self): pass
+
+# Check that mangling is correctly handled
+
+class a:
+ def a(self): pass
+ def _(self): pass
+ def _a(self): pass
+ def __(self): pass
+ def ___(self): pass
+ def __a(self): pass
+
+class _:
+ def a(self): pass
+ def _(self): pass
+ def _a(self): pass
+ def __(self): pass
+ def ___(self): pass
+ def __a(self): pass
+
+class __:
+ def a(self): pass
+ def _(self): pass
+ def _a(self): pass
+ def __(self): pass
+ def ___(self): pass
+ def __a(self): pass
+
+class ___:
+ def a(self): pass
+ def _(self): pass
+ def _a(self): pass
+ def __(self): pass
+ def ___(self): pass
+ def __a(self): pass
+
+class _a:
+ def a(self): pass
+ def _(self): pass
+ def _a(self): pass
+ def __(self): pass
+ def ___(self): pass
+ def __a(self): pass
+
+class __a:
+ def a(self): pass
+ def _(self): pass
+ def _a(self): pass
+ def __(self): pass
+ def ___(self): pass
+ def __a(self): pass
diff --git a/Lib/test/test_pyclbr.py b/Lib/test/test_pyclbr.py
index 46206ac..d409a2d 100644
--- a/Lib/test/test_pyclbr.py
+++ b/Lib/test/test_pyclbr.py
@@ -78,7 +78,8 @@ class PyclbrTest(TestCase):
objname = obj.__name__
if objname.startswith("__") and not objname.endswith("__"):
- objname = "_%s%s" % (oclass.__name__, objname)
+ if stripped_typename := oclass.__name__.lstrip('_'):
+ objname = f"_{stripped_typename}{objname}"
return objname == name
# Make sure the toplevel functions and classes are the same.
@@ -111,12 +112,16 @@ class PyclbrTest(TestCase):
for m in py_item.__dict__.keys():
if ismethod(py_item, getattr(py_item, m), m):
actualMethods.append(m)
- foundMethods = []
- for m in value.methods.keys():
- if m[:2] == '__' and m[-2:] != '__':
- foundMethods.append('_'+name+m)
- else:
- foundMethods.append(m)
+
+ if stripped_typename := name.lstrip('_'):
+ foundMethods = []
+ for m in value.methods.keys():
+ if m.startswith('__') and not m.endswith('__'):
+ foundMethods.append(f"_{stripped_typename}{m}")
+ else:
+ foundMethods.append(m)
+ else:
+ foundMethods = list(value.methods.keys())
try:
self.assertListEq(foundMethods, actualMethods, ignore)
@@ -150,8 +155,9 @@ class PyclbrTest(TestCase):
"DocTestCase", '_DocTestSuite'))
self.checkModule('difflib', ignore=("Match",))
- def test_decorators(self):
- self.checkModule('test.pyclbr_input', ignore=['om'])
+ def test_cases(self):
+ # see test.pyclbr_input for the rationale behind the ignored symbols
+ self.checkModule('test.pyclbr_input', ignore=['om', 'f'])
def test_nested(self):
mb = pyclbr