1# Test the module type 2import unittest 3from test.test_support import run_unittest, gc_collect 4 5import sys 6ModuleType = type(sys) 7 8class ModuleTests(unittest.TestCase): 9 def test_uninitialized(self): 10 # An uninitialized module has no __dict__ or __name__, 11 # and __doc__ is None 12 foo = ModuleType.__new__(ModuleType) 13 self.assertTrue(foo.__dict__ is None) 14 self.assertRaises(SystemError, dir, foo) 15 try: 16 s = foo.__name__ 17 self.fail("__name__ = %s" % repr(s)) 18 except AttributeError: 19 pass 20 self.assertEqual(foo.__doc__, ModuleType.__doc__) 21 22 def test_no_docstring(self): 23 # Regularly initialized module, no docstring 24 foo = ModuleType("foo") 25 self.assertEqual(foo.__name__, "foo") 26 self.assertEqual(foo.__doc__, None) 27 self.assertEqual(foo.__dict__, {"__name__": "foo", "__doc__": None}) 28 29 def test_ascii_docstring(self): 30 # ASCII docstring 31 foo = ModuleType("foo", "foodoc") 32 self.assertEqual(foo.__name__, "foo") 33 self.assertEqual(foo.__doc__, "foodoc") 34 self.assertEqual(foo.__dict__, 35 {"__name__": "foo", "__doc__": "foodoc"}) 36 37 def test_unicode_docstring(self): 38 # Unicode docstring 39 foo = ModuleType("foo", u"foodoc\u1234") 40 self.assertEqual(foo.__name__, "foo") 41 self.assertEqual(foo.__doc__, u"foodoc\u1234") 42 self.assertEqual(foo.__dict__, 43 {"__name__": "foo", "__doc__": u"foodoc\u1234"}) 44 45 def test_reinit(self): 46 # Reinitialization should not replace the __dict__ 47 foo = ModuleType("foo", u"foodoc\u1234") 48 foo.bar = 42 49 d = foo.__dict__ 50 foo.__init__("foo", "foodoc") 51 self.assertEqual(foo.__name__, "foo") 52 self.assertEqual(foo.__doc__, "foodoc") 53 self.assertEqual(foo.bar, 42) 54 self.assertEqual(foo.__dict__, 55 {"__name__": "foo", "__doc__": "foodoc", "bar": 42}) 56 self.assertTrue(foo.__dict__ is d) 57 58 @unittest.expectedFailure 59 def test_dont_clear_dict(self): 60 # See issue 7140. 61 def f(): 62 foo = ModuleType("foo") 63 foo.bar = 4 64 return foo 65 gc_collect() 66 self.assertEqual(f().__dict__["bar"], 4) 67 68 def test_clear_dict_in_ref_cycle(self): 69 destroyed = [] 70 m = ModuleType("foo") 71 m.destroyed = destroyed 72 s = """class A: 73 def __del__(self, destroyed=destroyed): 74 destroyed.append(1) 75a = A()""" 76 exec(s, m.__dict__) 77 del m 78 gc_collect() 79 self.assertEqual(destroyed, [1]) 80 81def test_main(): 82 run_unittest(ModuleTests) 83 84if __name__ == '__main__': 85 test_main() 86