2 Test cases for pyclbr.py
5 from test
.test_support
import run_unittest
7 from types
import ClassType
, FunctionType
, MethodType
9 from unittest
import TestCase
11 # This next line triggers an error on old versions of pyclbr.
13 from commands
import getstatus
15 # Here we test the python class browser code.
17 # The main function in this suite, 'testModule', compares the output
18 # of pyclbr with the introspected members of a module. Because pyclbr
19 # is imperfect (as designed), testModule is called with a set of
22 class PyclbrTest(TestCase
):
24 def assertListEq(self
, l1
, l2
, ignore
):
25 ''' succeed iff {l1} - {ignore} == {l2} - {ignore} '''
29 for p1
, p2
in (l1
, l2
), (l2
, l1
):
31 ok
= (item
in p2
) or (item
in ignore
)
33 self
.fail("%r missing" % item
)
35 print >>sys
.stderr
, "l1=%r\nl2=%r\nignore=%r" % (l1
, l2
, ignore
)
38 def assertHasattr(self
, obj
, attr
, ignore
):
39 ''' succeed iff hasattr(obj,attr) or attr in ignore. '''
40 if attr
in ignore
: return
41 if not hasattr(obj
, attr
): print "???", attr
42 self
.failUnless(hasattr(obj
, attr
),
43 'expected hasattr(%r, %r)' % (obj
, attr
))
46 def assertHaskey(self
, obj
, key
, ignore
):
47 ''' succeed iff obj.has_key(key) or key in ignore. '''
48 if key
in ignore
: return
49 if not obj
.has_key(key
):
50 print >>sys
.stderr
, "***",key
51 self
.failUnless(obj
.has_key(key
))
53 def assertEquals(self
, a
, b
, ignore
=None):
54 ''' succeed iff a == b or a in ignore or b in ignore '''
55 if (ignore
== None) or (a
in ignore
) or (b
in ignore
): return
57 unittest
.TestCase
.assertEquals(self
, a
, b
)
59 def checkModule(self
, moduleName
, module
=None, ignore
=()):
60 ''' succeed iff pyclbr.readmodule_ex(modulename) corresponds
61 to the actual module object, module. Any identifiers in
62 ignore are ignored. If no module is provided, the appropriate
63 module is loaded with __import__.'''
67 # ('<silly>' is to work around an API silliness in __import__)
68 module
= __import__(moduleName
, globals(), {}, ['<silly>'])
70 dict = pyclbr
.readmodule_ex(moduleName
)
72 def ismethod(obj
, name
):
73 if not isinstance(obj
, MethodType
):
75 if obj
.im_self
is not None:
77 objname
= obj
.__name
__
78 if objname
.startswith("__") and not objname
.endswith("__"):
79 objname
= "_%s%s" % (obj
.im_class
.__name
__, objname
)
80 return objname
== name
82 # Make sure the toplevel functions and classes are the same.
83 for name
, value
in dict.items():
86 self
.assertHasattr(module
, name
, ignore
)
87 py_item
= getattr(module
, name
)
88 if isinstance(value
, pyclbr
.Function
):
89 self
.assertEquals(type(py_item
), FunctionType
)
91 self
.assertEquals(type(py_item
), ClassType
)
92 real_bases
= [base
.__name
__ for base
in py_item
.__bases
__]
93 pyclbr_bases
= [ getattr(base
, 'name', base
)
94 for base
in value
.super ]
97 self
.assertListEq(real_bases
, pyclbr_bases
, ignore
)
99 print >>sys
.stderr
, "class=%s" % py_item
103 for m
in py_item
.__dict
__.keys():
104 if ismethod(getattr(py_item
, m
), m
):
105 actualMethods
.append(m
)
107 for m
in value
.methods
.keys():
108 if m
[:2] == '__' and m
[-2:] != '__':
109 foundMethods
.append('_'+name
+m
)
111 foundMethods
.append(m
)
114 self
.assertListEq(foundMethods
, actualMethods
, ignore
)
115 self
.assertEquals(py_item
.__module
__, value
.module
)
117 self
.assertEquals(py_item
.__name
__, value
.name
, ignore
)
118 # can't check file or lineno
120 print >>sys
.stderr
, "class=%s" % py_item
123 # Now check for missing stuff.
124 def defined_in(item
, module
):
125 if isinstance(item
, ClassType
):
126 return item
.__module
__ == module
.__name
__
127 if isinstance(item
, FunctionType
):
128 return item
.func_globals
is module
.__dict
__
130 for name
in dir(module
):
131 item
= getattr(module
, name
)
132 if isinstance(item
, (ClassType
, FunctionType
)):
133 if defined_in(item
, module
):
134 self
.assertHaskey(dict, name
, ignore
)
137 self
.checkModule('pyclbr')
138 self
.checkModule('doctest')
139 self
.checkModule('rfc822')
140 self
.checkModule('difflib')
142 def test_others(self
):
143 cm
= self
.checkModule
145 # These were once about the 10 longest modules
146 cm('random', ignore
=('Random',)) # from _random import Random as CoreGenerator
147 cm('cgi', ignore
=('log',)) # set with = in module
149 cm('urllib', ignore
=('getproxies_registry',
150 'open_https')) # not on all platforms
151 cm('pickle', ignore
=('g',)) # from types import *
152 cm('aifc', ignore
=('openfp',)) # set with = in module
154 cm('sre_parse', ignore
=('dump',)) # from sre_constants import *
158 # Tests for modules inside packages
160 cm('test.test_pyclbr')
164 run_unittest(PyclbrTest
)
167 if __name__
== "__main__":