diff options
author | csabella <cheryl.sabella@gmail.com> | 2017-07-04 01:31:25 (GMT) |
---|---|---|
committer | terryjreedy <tjreedy@udel.edu> | 2017-07-04 01:31:25 (GMT) |
commit | 246ff3bd00f97658e567a7087645a6b76e056491 (patch) | |
tree | 08110a51b6b57a925494b76c25547251cf6f5dac /Lib/test/test_pyclbr.py | |
parent | 6969eaf4682beb01bc95eeb14f5ce6c01312e297 (diff) | |
download | cpython-246ff3bd00f97658e567a7087645a6b76e056491.zip cpython-246ff3bd00f97658e567a7087645a6b76e056491.tar.gz cpython-246ff3bd00f97658e567a7087645a6b76e056491.tar.bz2 |
bpo-6691: Pyclbr now reports nested classes and functions. (#2503)
Original patch by Guilherme Polo. Revisions by Cheryl Sabella.
Diffstat (limited to 'Lib/test/test_pyclbr.py')
-rw-r--r-- | Lib/test/test_pyclbr.py | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/Lib/test/test_pyclbr.py b/Lib/test/test_pyclbr.py index 9c216d3..238eb71 100644 --- a/Lib/test/test_pyclbr.py +++ b/Lib/test/test_pyclbr.py @@ -2,10 +2,15 @@ Test cases for pyclbr.py Nick Mathewson ''' + +import os import sys +from textwrap import dedent from types import FunctionType, MethodType, BuiltinFunctionType import pyclbr from unittest import TestCase, main as unittest_main +from test import support +from functools import partial StaticMethodType = type(staticmethod(lambda: None)) ClassMethodType = type(classmethod(lambda c: None)) @@ -150,6 +155,67 @@ class PyclbrTest(TestCase): # self.checkModule('test.pyclbr_input', ignore=['om']) + def test_nested(self): + mb = pyclbr + # Set arguments for descriptor creation and _creat_tree call. + m, p, f, t, i = 'test', '', 'test.py', {}, None + source = dedent("""\ + def f0: + def f1(a,b,c): + def f2(a=1, b=2, c=3): pass + return f1(a,b,d) + class c1: pass + class C0: + "Test class." + def F1(): + "Method." + return 'return' + class C1(): + class C2: + "Class nested within nested class." + def F3(): return 1+1 + + """) + actual = mb._create_tree(m, p, f, source, t, i) + + # Create descriptors, linked together, and expected dict. + f0 = mb.Function(m, 'f0', f, 1) + f1 = mb._nest_function(f0, 'f1', 2) + f2 = mb._nest_function(f1, 'f2', 3) + c1 = mb._nest_class(f0, 'c1', 5) + C0 = mb.Class(m, 'C0', None, f, 6) + F1 = mb._nest_function(C0, 'F1', 8) + C1 = mb._nest_class(C0, 'C1', 11) + C2 = mb._nest_class(C1, 'C2', 12) + F3 = mb._nest_function(C2, 'F3', 14) + expected = {'f0':f0, 'C0':C0} + + def compare(parent1, children1, parent2, children2): + """Return equality of tree pairs. + + Each parent,children pair define a tree. The parents are + assumed equal. Comparing the children dictionaries as such + does not work due to comparison by identity and double + linkage. We separate comparing string and number attributes + from comparing the children of input children. + """ + self.assertEqual(children1.keys(), children2.keys()) + for ob in children1.values(): + self.assertIs(ob.parent, parent1) + for ob in children2.values(): + self.assertIs(ob.parent, parent2) + for key in children1.keys(): + o1, o2 = children1[key], children2[key] + t1 = type(o1), o1.name, o1.file, o1.module, o1.lineno + t2 = type(o2), o2.name, o2.file, o2.module, o2.lineno + self.assertEqual(t1, t2) + if type(o1) is mb.Class: + self.assertEqual(o1.methods, o2.methods) + # Skip superclasses for now as not part of example + compare(o1, o1.children, o2, o2.children) + + compare(None, actual, None, expected) + def test_others(self): cm = self.checkModule |