blob: 1230293670087b7964e592ff3b7971237c50bfba [file] [log] [blame]
Guido van Rossumc3a787e2002-06-04 05:52:47 +00001# Test the module type
Guido van Rossumd8faa362007-04-27 19:54:29 +00002import unittest
Antoine Pitrou4ed328c2013-08-01 19:20:31 +02003import weakref
Benjamin Peterson5c4bfc42010-10-12 22:57:59 +00004from test.support import run_unittest, gc_collect
Antoine Pitroudcedaf62013-07-31 23:14:08 +02005from test.script_helper import assert_python_ok
Guido van Rossumc3a787e2002-06-04 05:52:47 +00006
7import sys
Guido van Rossumd8faa362007-04-27 19:54:29 +00008ModuleType = type(sys)
Guido van Rossumc3a787e2002-06-04 05:52:47 +00009
Eric V. Smith984b11f2012-05-24 20:21:04 -040010class FullLoader:
11 @classmethod
12 def module_repr(cls, m):
13 return "<module '{}' (crafted)>".format(m.__name__)
14
15class BareLoader:
16 pass
17
18
Guido van Rossumd8faa362007-04-27 19:54:29 +000019class ModuleTests(unittest.TestCase):
20 def test_uninitialized(self):
21 # An uninitialized module has no __dict__ or __name__,
22 # and __doc__ is None
23 foo = ModuleType.__new__(ModuleType)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000024 self.assertTrue(foo.__dict__ is None)
Benjamin Peterson14327712009-08-15 13:23:05 +000025 self.assertRaises(SystemError, dir, foo)
Guido van Rossumd8faa362007-04-27 19:54:29 +000026 try:
27 s = foo.__name__
28 self.fail("__name__ = %s" % repr(s))
29 except AttributeError:
30 pass
31 self.assertEqual(foo.__doc__, ModuleType.__doc__)
Guido van Rossumc3a787e2002-06-04 05:52:47 +000032
Guido van Rossumd8faa362007-04-27 19:54:29 +000033 def test_no_docstring(self):
34 # Regularly initialized module, no docstring
35 foo = ModuleType("foo")
36 self.assertEqual(foo.__name__, "foo")
37 self.assertEqual(foo.__doc__, None)
Brett Cannon4c14b5d2013-05-04 13:56:58 -040038 self.assertIs(foo.__loader__, None)
39 self.assertIs(foo.__package__, None)
Eric Snowb523f842013-11-22 09:05:39 -070040 self.assertIs(foo.__spec__, None)
Brett Cannon4c14b5d2013-05-04 13:56:58 -040041 self.assertEqual(foo.__dict__, {"__name__": "foo", "__doc__": None,
Eric Snowb523f842013-11-22 09:05:39 -070042 "__loader__": None, "__package__": None,
43 "__spec__": None})
Guido van Rossumc3a787e2002-06-04 05:52:47 +000044
Guido van Rossumd8faa362007-04-27 19:54:29 +000045 def test_ascii_docstring(self):
46 # ASCII docstring
47 foo = ModuleType("foo", "foodoc")
48 self.assertEqual(foo.__name__, "foo")
49 self.assertEqual(foo.__doc__, "foodoc")
50 self.assertEqual(foo.__dict__,
Brett Cannon4c14b5d2013-05-04 13:56:58 -040051 {"__name__": "foo", "__doc__": "foodoc",
Eric Snowb523f842013-11-22 09:05:39 -070052 "__loader__": None, "__package__": None,
53 "__spec__": None})
Guido van Rossumc3a787e2002-06-04 05:52:47 +000054
Guido van Rossumd8faa362007-04-27 19:54:29 +000055 def test_unicode_docstring(self):
56 # Unicode docstring
Guido van Rossumef87d6e2007-05-02 19:09:54 +000057 foo = ModuleType("foo", "foodoc\u1234")
Guido van Rossumd8faa362007-04-27 19:54:29 +000058 self.assertEqual(foo.__name__, "foo")
Guido van Rossumef87d6e2007-05-02 19:09:54 +000059 self.assertEqual(foo.__doc__, "foodoc\u1234")
Guido van Rossumd8faa362007-04-27 19:54:29 +000060 self.assertEqual(foo.__dict__,
Brett Cannon4c14b5d2013-05-04 13:56:58 -040061 {"__name__": "foo", "__doc__": "foodoc\u1234",
Eric Snowb523f842013-11-22 09:05:39 -070062 "__loader__": None, "__package__": None,
63 "__spec__": None})
Guido van Rossumc3a787e2002-06-04 05:52:47 +000064
Guido van Rossumd8faa362007-04-27 19:54:29 +000065 def test_reinit(self):
66 # Reinitialization should not replace the __dict__
Guido van Rossumef87d6e2007-05-02 19:09:54 +000067 foo = ModuleType("foo", "foodoc\u1234")
Guido van Rossumd8faa362007-04-27 19:54:29 +000068 foo.bar = 42
69 d = foo.__dict__
70 foo.__init__("foo", "foodoc")
71 self.assertEqual(foo.__name__, "foo")
72 self.assertEqual(foo.__doc__, "foodoc")
73 self.assertEqual(foo.bar, 42)
74 self.assertEqual(foo.__dict__,
Brett Cannon4c14b5d2013-05-04 13:56:58 -040075 {"__name__": "foo", "__doc__": "foodoc", "bar": 42,
Eric Snowb523f842013-11-22 09:05:39 -070076 "__loader__": None, "__package__": None, "__spec__": None})
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000077 self.assertTrue(foo.__dict__ is d)
Guido van Rossumc3a787e2002-06-04 05:52:47 +000078
Benjamin Petersona0dfa822009-11-13 02:25:08 +000079 def test_dont_clear_dict(self):
80 # See issue 7140.
81 def f():
82 foo = ModuleType("foo")
83 foo.bar = 4
84 return foo
Benjamin Peterson5c4bfc42010-10-12 22:57:59 +000085 gc_collect()
Benjamin Petersona0dfa822009-11-13 02:25:08 +000086 self.assertEqual(f().__dict__["bar"], 4)
87
Benjamin Peterson5c4bfc42010-10-12 22:57:59 +000088 def test_clear_dict_in_ref_cycle(self):
89 destroyed = []
90 m = ModuleType("foo")
91 m.destroyed = destroyed
92 s = """class A:
Benjamin Petersonca81bf72011-12-15 15:57:15 -050093 def __init__(self, l):
94 self.l = l
Benjamin Peterson5c4bfc42010-10-12 22:57:59 +000095 def __del__(self):
Benjamin Petersonca81bf72011-12-15 15:57:15 -050096 self.l.append(1)
97a = A(destroyed)"""
Benjamin Peterson5c4bfc42010-10-12 22:57:59 +000098 exec(s, m.__dict__)
99 del m
100 gc_collect()
101 self.assertEqual(destroyed, [1])
102
Antoine Pitrou4ed328c2013-08-01 19:20:31 +0200103 def test_weakref(self):
104 m = ModuleType("foo")
105 wr = weakref.ref(m)
106 self.assertIs(wr(), m)
107 del m
108 gc_collect()
109 self.assertIs(wr(), None)
110
Eric V. Smith984b11f2012-05-24 20:21:04 -0400111 def test_module_repr_minimal(self):
112 # reprs when modules have no __file__, __name__, or __loader__
113 m = ModuleType('foo')
114 del m.__name__
115 self.assertEqual(repr(m), "<module '?'>")
116
117 def test_module_repr_with_name(self):
118 m = ModuleType('foo')
119 self.assertEqual(repr(m), "<module 'foo'>")
120
121 def test_module_repr_with_name_and_filename(self):
122 m = ModuleType('foo')
123 m.__file__ = '/tmp/foo.py'
124 self.assertEqual(repr(m), "<module 'foo' from '/tmp/foo.py'>")
125
126 def test_module_repr_with_filename_only(self):
127 m = ModuleType('foo')
128 del m.__name__
129 m.__file__ = '/tmp/foo.py'
130 self.assertEqual(repr(m), "<module '?' from '/tmp/foo.py'>")
131
Brett Cannon4c14b5d2013-05-04 13:56:58 -0400132 def test_module_repr_with_loader_as_None(self):
133 m = ModuleType('foo')
134 assert m.__loader__ is None
135 self.assertEqual(repr(m), "<module 'foo'>")
136
Eric V. Smith984b11f2012-05-24 20:21:04 -0400137 def test_module_repr_with_bare_loader_but_no_name(self):
138 m = ModuleType('foo')
139 del m.__name__
140 # Yes, a class not an instance.
141 m.__loader__ = BareLoader
Brett Cannon4c14b5d2013-05-04 13:56:58 -0400142 loader_repr = repr(BareLoader)
Eric V. Smith984b11f2012-05-24 20:21:04 -0400143 self.assertEqual(
Brett Cannon4c14b5d2013-05-04 13:56:58 -0400144 repr(m), "<module '?' ({})>".format(loader_repr))
Eric V. Smith984b11f2012-05-24 20:21:04 -0400145
146 def test_module_repr_with_full_loader_but_no_name(self):
147 # m.__loader__.module_repr() will fail because the module has no
148 # m.__name__. This exception will get suppressed and instead the
149 # loader's repr will be used.
150 m = ModuleType('foo')
151 del m.__name__
152 # Yes, a class not an instance.
153 m.__loader__ = FullLoader
Brett Cannon4c14b5d2013-05-04 13:56:58 -0400154 loader_repr = repr(FullLoader)
Eric V. Smith984b11f2012-05-24 20:21:04 -0400155 self.assertEqual(
Brett Cannon4c14b5d2013-05-04 13:56:58 -0400156 repr(m), "<module '?' ({})>".format(loader_repr))
Eric V. Smith984b11f2012-05-24 20:21:04 -0400157
158 def test_module_repr_with_bare_loader(self):
159 m = ModuleType('foo')
160 # Yes, a class not an instance.
161 m.__loader__ = BareLoader
Brett Cannon4c14b5d2013-05-04 13:56:58 -0400162 module_repr = repr(BareLoader)
Eric V. Smith984b11f2012-05-24 20:21:04 -0400163 self.assertEqual(
Brett Cannon4c14b5d2013-05-04 13:56:58 -0400164 repr(m), "<module 'foo' ({})>".format(module_repr))
Eric V. Smith984b11f2012-05-24 20:21:04 -0400165
166 def test_module_repr_with_full_loader(self):
167 m = ModuleType('foo')
168 # Yes, a class not an instance.
169 m.__loader__ = FullLoader
170 self.assertEqual(
171 repr(m), "<module 'foo' (crafted)>")
172
173 def test_module_repr_with_bare_loader_and_filename(self):
174 # Because the loader has no module_repr(), use the file name.
175 m = ModuleType('foo')
176 # Yes, a class not an instance.
177 m.__loader__ = BareLoader
178 m.__file__ = '/tmp/foo.py'
179 self.assertEqual(repr(m), "<module 'foo' from '/tmp/foo.py'>")
180
181 def test_module_repr_with_full_loader_and_filename(self):
182 # Even though the module has an __file__, use __loader__.module_repr()
183 m = ModuleType('foo')
184 # Yes, a class not an instance.
185 m.__loader__ = FullLoader
186 m.__file__ = '/tmp/foo.py'
187 self.assertEqual(repr(m), "<module 'foo' (crafted)>")
188
189 def test_module_repr_builtin(self):
190 self.assertEqual(repr(sys), "<module 'sys' (built-in)>")
191
192 def test_module_repr_source(self):
193 r = repr(unittest)
Brett Cannona24348c2013-11-22 13:22:22 -0500194 starts_with = "<module 'unittest' from '"
195 ends_with = "__init__.py'>"
196 self.assertEqual(r[:len(starts_with)], starts_with,
197 '{!r} does not start with {!r}'.format(r, starts_with))
198 self.assertEqual(r[-len(ends_with):], ends_with,
199 '{!r} does not end with {!r}'.format(r, ends_with))
Eric V. Smith984b11f2012-05-24 20:21:04 -0400200
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200201 def test_module_finalization_at_shutdown(self):
202 # Module globals and builtins should still be available during shutdown
203 rc, out, err = assert_python_ok("-c", "from test import final_a")
204 self.assertFalse(err)
205 lines = out.splitlines()
206 self.assertEqual(set(lines), {
207 b"x = a",
208 b"x = b",
209 b"final_a.x = a",
210 b"final_b.x = b",
211 b"len = len",
212 b"shutil.rmtree = rmtree"})
213
Eric V. Smith984b11f2012-05-24 20:21:04 -0400214 # frozen and namespace module reprs are tested in importlib.
215
216
Guido van Rossumd8faa362007-04-27 19:54:29 +0000217def test_main():
218 run_unittest(ModuleTests)
219
Eric V. Smith984b11f2012-05-24 20:21:04 -0400220
Guido van Rossumd8faa362007-04-27 19:54:29 +0000221if __name__ == '__main__':
222 test_main()