test_module.py 2.7 KB

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