blob: b34b30f91a6b2cd0f9629212b120d81f3fca2892 [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
Benjamin Peterson5c4bfc42010-10-12 22:57:59 +00003from test.support import run_unittest, gc_collect
Guido van Rossumc3a787e2002-06-04 05:52:47 +00004
5import sys
Guido van Rossumd8faa362007-04-27 19:54:29 +00006ModuleType = type(sys)
Guido van Rossumc3a787e2002-06-04 05:52:47 +00007
Eric V. Smith984b11f2012-05-24 20:21:04 -04008class FullLoader:
9 @classmethod
10 def module_repr(cls, m):
11 return "<module '{}' (crafted)>".format(m.__name__)
12
13class BareLoader:
14 pass
15
16
Guido van Rossumd8faa362007-04-27 19:54:29 +000017class ModuleTests(unittest.TestCase):
18 def test_uninitialized(self):
19 # An uninitialized module has no __dict__ or __name__,
20 # and __doc__ is None
21 foo = ModuleType.__new__(ModuleType)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000022 self.assertTrue(foo.__dict__ is None)
Benjamin Peterson14327712009-08-15 13:23:05 +000023 self.assertRaises(SystemError, dir, foo)
Guido van Rossumd8faa362007-04-27 19:54:29 +000024 try:
25 s = foo.__name__
26 self.fail("__name__ = %s" % repr(s))
27 except AttributeError:
28 pass
29 self.assertEqual(foo.__doc__, ModuleType.__doc__)
Guido van Rossumc3a787e2002-06-04 05:52:47 +000030
Guido van Rossumd8faa362007-04-27 19:54:29 +000031 def test_no_docstring(self):
32 # Regularly initialized module, no docstring
33 foo = ModuleType("foo")
34 self.assertEqual(foo.__name__, "foo")
35 self.assertEqual(foo.__doc__, None)
Brett Cannon4c14b5d2013-05-04 13:56:58 -040036 self.assertIs(foo.__loader__, None)
37 self.assertIs(foo.__package__, None)
38 self.assertEqual(foo.__dict__, {"__name__": "foo", "__doc__": None,
39 "__loader__": None, "__package__": None})
Guido van Rossumc3a787e2002-06-04 05:52:47 +000040
Guido van Rossumd8faa362007-04-27 19:54:29 +000041 def test_ascii_docstring(self):
42 # ASCII docstring
43 foo = ModuleType("foo", "foodoc")
44 self.assertEqual(foo.__name__, "foo")
45 self.assertEqual(foo.__doc__, "foodoc")
46 self.assertEqual(foo.__dict__,
Brett Cannon4c14b5d2013-05-04 13:56:58 -040047 {"__name__": "foo", "__doc__": "foodoc",
48 "__loader__": None, "__package__": None})
Guido van Rossumc3a787e2002-06-04 05:52:47 +000049
Guido van Rossumd8faa362007-04-27 19:54:29 +000050 def test_unicode_docstring(self):
51 # Unicode docstring
Guido van Rossumef87d6e2007-05-02 19:09:54 +000052 foo = ModuleType("foo", "foodoc\u1234")
Guido van Rossumd8faa362007-04-27 19:54:29 +000053 self.assertEqual(foo.__name__, "foo")
Guido van Rossumef87d6e2007-05-02 19:09:54 +000054 self.assertEqual(foo.__doc__, "foodoc\u1234")
Guido van Rossumd8faa362007-04-27 19:54:29 +000055 self.assertEqual(foo.__dict__,
Brett Cannon4c14b5d2013-05-04 13:56:58 -040056 {"__name__": "foo", "__doc__": "foodoc\u1234",
57 "__loader__": None, "__package__": None})
Guido van Rossumc3a787e2002-06-04 05:52:47 +000058
Guido van Rossumd8faa362007-04-27 19:54:29 +000059 def test_reinit(self):
60 # Reinitialization should not replace the __dict__
Guido van Rossumef87d6e2007-05-02 19:09:54 +000061 foo = ModuleType("foo", "foodoc\u1234")
Guido van Rossumd8faa362007-04-27 19:54:29 +000062 foo.bar = 42
63 d = foo.__dict__
64 foo.__init__("foo", "foodoc")
65 self.assertEqual(foo.__name__, "foo")
66 self.assertEqual(foo.__doc__, "foodoc")
67 self.assertEqual(foo.bar, 42)
68 self.assertEqual(foo.__dict__,
Brett Cannon4c14b5d2013-05-04 13:56:58 -040069 {"__name__": "foo", "__doc__": "foodoc", "bar": 42,
70 "__loader__": None, "__package__": None})
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000071 self.assertTrue(foo.__dict__ is d)
Guido van Rossumc3a787e2002-06-04 05:52:47 +000072
Benjamin Peterson5c4bfc42010-10-12 22:57:59 +000073 @unittest.expectedFailure
Benjamin Petersona0dfa822009-11-13 02:25:08 +000074 def test_dont_clear_dict(self):
75 # See issue 7140.
76 def f():
77 foo = ModuleType("foo")
78 foo.bar = 4
79 return foo
Benjamin Peterson5c4bfc42010-10-12 22:57:59 +000080 gc_collect()
Benjamin Petersona0dfa822009-11-13 02:25:08 +000081 self.assertEqual(f().__dict__["bar"], 4)
82
Benjamin Peterson5c4bfc42010-10-12 22:57:59 +000083 def test_clear_dict_in_ref_cycle(self):
84 destroyed = []
85 m = ModuleType("foo")
86 m.destroyed = destroyed
87 s = """class A:
Benjamin Petersonca81bf72011-12-15 15:57:15 -050088 def __init__(self, l):
89 self.l = l
Benjamin Peterson5c4bfc42010-10-12 22:57:59 +000090 def __del__(self):
Benjamin Petersonca81bf72011-12-15 15:57:15 -050091 self.l.append(1)
92a = A(destroyed)"""
Benjamin Peterson5c4bfc42010-10-12 22:57:59 +000093 exec(s, m.__dict__)
94 del m
95 gc_collect()
96 self.assertEqual(destroyed, [1])
97
Eric V. Smith984b11f2012-05-24 20:21:04 -040098 def test_module_repr_minimal(self):
99 # reprs when modules have no __file__, __name__, or __loader__
100 m = ModuleType('foo')
101 del m.__name__
102 self.assertEqual(repr(m), "<module '?'>")
103
104 def test_module_repr_with_name(self):
105 m = ModuleType('foo')
106 self.assertEqual(repr(m), "<module 'foo'>")
107
108 def test_module_repr_with_name_and_filename(self):
109 m = ModuleType('foo')
110 m.__file__ = '/tmp/foo.py'
111 self.assertEqual(repr(m), "<module 'foo' from '/tmp/foo.py'>")
112
113 def test_module_repr_with_filename_only(self):
114 m = ModuleType('foo')
115 del m.__name__
116 m.__file__ = '/tmp/foo.py'
117 self.assertEqual(repr(m), "<module '?' from '/tmp/foo.py'>")
118
Brett Cannon4c14b5d2013-05-04 13:56:58 -0400119 def test_module_repr_with_loader_as_None(self):
120 m = ModuleType('foo')
121 assert m.__loader__ is None
122 self.assertEqual(repr(m), "<module 'foo'>")
123
Eric V. Smith984b11f2012-05-24 20:21:04 -0400124 def test_module_repr_with_bare_loader_but_no_name(self):
125 m = ModuleType('foo')
126 del m.__name__
127 # Yes, a class not an instance.
128 m.__loader__ = BareLoader
Brett Cannon4c14b5d2013-05-04 13:56:58 -0400129 loader_repr = repr(BareLoader)
Eric V. Smith984b11f2012-05-24 20:21:04 -0400130 self.assertEqual(
Brett Cannon4c14b5d2013-05-04 13:56:58 -0400131 repr(m), "<module '?' ({})>".format(loader_repr))
Eric V. Smith984b11f2012-05-24 20:21:04 -0400132
133 def test_module_repr_with_full_loader_but_no_name(self):
134 # m.__loader__.module_repr() will fail because the module has no
135 # m.__name__. This exception will get suppressed and instead the
136 # loader's repr will be used.
137 m = ModuleType('foo')
138 del m.__name__
139 # Yes, a class not an instance.
140 m.__loader__ = FullLoader
Brett Cannon4c14b5d2013-05-04 13:56:58 -0400141 loader_repr = repr(FullLoader)
Eric V. Smith984b11f2012-05-24 20:21:04 -0400142 self.assertEqual(
Brett Cannon4c14b5d2013-05-04 13:56:58 -0400143 repr(m), "<module '?' ({})>".format(loader_repr))
Eric V. Smith984b11f2012-05-24 20:21:04 -0400144
145 def test_module_repr_with_bare_loader(self):
146 m = ModuleType('foo')
147 # Yes, a class not an instance.
148 m.__loader__ = BareLoader
Brett Cannon4c14b5d2013-05-04 13:56:58 -0400149 module_repr = repr(BareLoader)
Eric V. Smith984b11f2012-05-24 20:21:04 -0400150 self.assertEqual(
Brett Cannon4c14b5d2013-05-04 13:56:58 -0400151 repr(m), "<module 'foo' ({})>".format(module_repr))
Eric V. Smith984b11f2012-05-24 20:21:04 -0400152
153 def test_module_repr_with_full_loader(self):
154 m = ModuleType('foo')
155 # Yes, a class not an instance.
156 m.__loader__ = FullLoader
157 self.assertEqual(
158 repr(m), "<module 'foo' (crafted)>")
159
160 def test_module_repr_with_bare_loader_and_filename(self):
161 # Because the loader has no module_repr(), use the file name.
162 m = ModuleType('foo')
163 # Yes, a class not an instance.
164 m.__loader__ = BareLoader
165 m.__file__ = '/tmp/foo.py'
166 self.assertEqual(repr(m), "<module 'foo' from '/tmp/foo.py'>")
167
168 def test_module_repr_with_full_loader_and_filename(self):
169 # Even though the module has an __file__, use __loader__.module_repr()
170 m = ModuleType('foo')
171 # Yes, a class not an instance.
172 m.__loader__ = FullLoader
173 m.__file__ = '/tmp/foo.py'
174 self.assertEqual(repr(m), "<module 'foo' (crafted)>")
175
176 def test_module_repr_builtin(self):
177 self.assertEqual(repr(sys), "<module 'sys' (built-in)>")
178
179 def test_module_repr_source(self):
180 r = repr(unittest)
181 self.assertEqual(r[:25], "<module 'unittest' from '")
182 self.assertEqual(r[-13:], "__init__.py'>")
183
184 # frozen and namespace module reprs are tested in importlib.
185
186
Guido van Rossumd8faa362007-04-27 19:54:29 +0000187def test_main():
188 run_unittest(ModuleTests)
189
Eric V. Smith984b11f2012-05-24 20:21:04 -0400190
Guido van Rossumd8faa362007-04-27 19:54:29 +0000191if __name__ == '__main__':
192 test_main()