# Test the module type | |
import unittest | |
from test.test_support import run_unittest, gc_collect | |
import sys | |
ModuleType = type(sys) | |
class ModuleTests(unittest.TestCase): | |
def test_uninitialized(self): | |
# An uninitialized module has no __dict__ or __name__, | |
# and __doc__ is None | |
foo = ModuleType.__new__(ModuleType) | |
self.assertTrue(foo.__dict__ is None) | |
self.assertRaises(SystemError, dir, foo) | |
try: | |
s = foo.__name__ | |
self.fail("__name__ = %s" % repr(s)) | |
except AttributeError: | |
pass | |
self.assertEqual(foo.__doc__, ModuleType.__doc__) | |
def test_no_docstring(self): | |
# Regularly initialized module, no docstring | |
foo = ModuleType("foo") | |
self.assertEqual(foo.__name__, "foo") | |
self.assertEqual(foo.__doc__, None) | |
self.assertEqual(foo.__dict__, {"__name__": "foo", "__doc__": None}) | |
def test_ascii_docstring(self): | |
# ASCII docstring | |
foo = ModuleType("foo", "foodoc") | |
self.assertEqual(foo.__name__, "foo") | |
self.assertEqual(foo.__doc__, "foodoc") | |
self.assertEqual(foo.__dict__, | |
{"__name__": "foo", "__doc__": "foodoc"}) | |
def test_unicode_docstring(self): | |
# Unicode docstring | |
foo = ModuleType("foo", u"foodoc\u1234") | |
self.assertEqual(foo.__name__, "foo") | |
self.assertEqual(foo.__doc__, u"foodoc\u1234") | |
self.assertEqual(foo.__dict__, | |
{"__name__": "foo", "__doc__": u"foodoc\u1234"}) | |
def test_reinit(self): | |
# Reinitialization should not replace the __dict__ | |
foo = ModuleType("foo", u"foodoc\u1234") | |
foo.bar = 42 | |
d = foo.__dict__ | |
foo.__init__("foo", "foodoc") | |
self.assertEqual(foo.__name__, "foo") | |
self.assertEqual(foo.__doc__, "foodoc") | |
self.assertEqual(foo.bar, 42) | |
self.assertEqual(foo.__dict__, | |
{"__name__": "foo", "__doc__": "foodoc", "bar": 42}) | |
self.assertTrue(foo.__dict__ is d) | |
@unittest.expectedFailure | |
def test_dont_clear_dict(self): | |
# See issue 7140. | |
def f(): | |
foo = ModuleType("foo") | |
foo.bar = 4 | |
return foo | |
gc_collect() | |
self.assertEqual(f().__dict__["bar"], 4) | |
def test_clear_dict_in_ref_cycle(self): | |
destroyed = [] | |
m = ModuleType("foo") | |
m.destroyed = destroyed | |
s = """class A: | |
def __del__(self): | |
destroyed.append(1) | |
a = A()""" | |
exec(s, m.__dict__) | |
del m | |
gc_collect() | |
self.assertEqual(destroyed, [1]) | |
def test_main(): | |
run_unittest(ModuleTests) | |
if __name__ == '__main__': | |
test_main() |