blob: 9883000945030018aa5b9215de475d154ab5b84a [file] [log] [blame]
Guido van Rossum6c612421997-09-06 18:42:57 +00001# Test packages (dotted-name import)
2
Collin Winter11e065b2007-08-24 19:15:12 +00003import sys
4import os
5import tempfile
6import textwrap
Collin Winter11e065b2007-08-24 19:15:12 +00007import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00008from test import support
Collin Winter11e065b2007-08-24 19:15:12 +00009
Guido van Rossum6c612421997-09-06 18:42:57 +000010
11# Helpers to create and destroy hierarchies.
12
Guido van Rossum6c612421997-09-06 18:42:57 +000013def cleanout(root):
14 names = os.listdir(root)
15 for name in names:
Guido van Rossum41360a41998-03-26 19:42:58 +000016 fullname = os.path.join(root, name)
17 if os.path.isdir(fullname) and not os.path.islink(fullname):
18 cleanout(fullname)
19 else:
20 os.remove(fullname)
Collin Winter11e065b2007-08-24 19:15:12 +000021 os.rmdir(root)
Guido van Rossum6c612421997-09-06 18:42:57 +000022
Barry Warsaw3a9d0612000-09-01 06:53:52 +000023def fixdir(lst):
Collin Winter11e065b2007-08-24 19:15:12 +000024 if "__builtins__" in lst:
25 lst.remove("__builtins__")
Antoine Pitrouea3eb882012-05-17 18:55:59 +020026 if "__initializing__" in lst:
27 lst.remove("__initializing__")
Barry Warsaw3a9d0612000-09-01 06:53:52 +000028 return lst
29
Guido van Rossum6c612421997-09-06 18:42:57 +000030
Collin Winter11e065b2007-08-24 19:15:12 +000031# XXX Things to test
32#
33# import package without __init__
34# import package with __init__
35# __init__ importing submodule
36# __init__ importing global module
37# __init__ defining variables
38# submodule importing other submodule
39# submodule importing global module
40# submodule import submodule via global name
41# from package import submodule
42# from package import subpackage
43# from package import variable (defined in __init__)
44# from package import * (defined in __init__)
45
46
Christian Heimesdb4a2ef2007-11-12 19:53:03 +000047class TestPkg(unittest.TestCase):
Collin Winter11e065b2007-08-24 19:15:12 +000048
49 def setUp(self):
50 self.root = None
Christian Heimesdae2a892008-04-19 00:55:37 +000051 self.pkgname = None
Collin Winter11e065b2007-08-24 19:15:12 +000052 self.syspath = list(sys.path)
Antoine Pitrou060cee22009-11-13 16:29:04 +000053 self.modules_before = support.modules_setup()
Collin Winter11e065b2007-08-24 19:15:12 +000054
55 def tearDown(self):
56 sys.path[:] = self.syspath
Antoine Pitrou060cee22009-11-13 16:29:04 +000057 support.modules_cleanup(*self.modules_before)
R. David Murray378c0cf2010-02-24 01:46:21 +000058 if self.root: # Only clean if the test was actually run
59 cleanout(self.root)
Collin Winter11e065b2007-08-24 19:15:12 +000060
Ezio Melotti13925002011-03-16 11:05:33 +020061 # delete all modules concerning the tested hierarchy
Christian Heimesdae2a892008-04-19 00:55:37 +000062 if self.pkgname:
63 modules = [name for name in sys.modules
64 if self.pkgname in name.split('.')]
65 for name in modules:
66 del sys.modules[name]
67
Collin Winter11e065b2007-08-24 19:15:12 +000068 def run_code(self, code):
69 exec(textwrap.dedent(code), globals(), {"self": self})
70
71 def mkhier(self, descr):
72 root = tempfile.mkdtemp()
Guido van Rossum41360a41998-03-26 19:42:58 +000073 sys.path.insert(0, root)
Collin Winter11e065b2007-08-24 19:15:12 +000074 if not os.path.isdir(root):
75 os.mkdir(root)
76 for name, contents in descr:
77 comps = name.split()
78 fullname = root
79 for c in comps:
80 fullname = os.path.join(fullname, c)
81 if contents is None:
82 os.mkdir(fullname)
83 else:
84 f = open(fullname, "w")
85 f.write(contents)
86 if contents and contents[-1] != '\n':
87 f.write('\n')
88 f.close()
89 self.root = root
Christian Heimesdae2a892008-04-19 00:55:37 +000090 # package name is the name of the first item
91 self.pkgname = descr[0][0]
Guido van Rossum6c612421997-09-06 18:42:57 +000092
Collin Winter11e065b2007-08-24 19:15:12 +000093 def test_1(self):
94 hier = [("t1", None), ("t1 __init__.py", "")]
95 self.mkhier(hier)
96 import t1
Guido van Rossum6c612421997-09-06 18:42:57 +000097
Collin Winter11e065b2007-08-24 19:15:12 +000098 def test_2(self):
99 hier = [
100 ("t2", None),
101 ("t2 __init__.py", "'doc for t2'"),
102 ("t2 sub", None),
103 ("t2 sub __init__.py", ""),
104 ("t2 sub subsub", None),
105 ("t2 sub subsub __init__.py", "spam = 1"),
106 ]
107 self.mkhier(hier)
Fred Drake004d5e62000-10-23 17:22:08 +0000108
Collin Winter11e065b2007-08-24 19:15:12 +0000109 import t2.sub
110 import t2.sub.subsub
111 self.assertEqual(t2.__name__, "t2")
112 self.assertEqual(t2.sub.__name__, "t2.sub")
113 self.assertEqual(t2.sub.subsub.__name__, "t2.sub.subsub")
Fred Drake004d5e62000-10-23 17:22:08 +0000114
Collin Winter11e065b2007-08-24 19:15:12 +0000115 # This exec crap is needed because Py3k forbids 'import *' outside
116 # of module-scope and __import__() is insufficient for what we need.
117 s = """
118 import t2
119 from t2 import *
120 self.assertEqual(dir(), ['self', 'sub', 't2'])
121 """
122 self.run_code(s)
Guido van Rossum6c612421997-09-06 18:42:57 +0000123
Collin Winter11e065b2007-08-24 19:15:12 +0000124 from t2 import sub
125 from t2.sub import subsub
126 from t2.sub.subsub import spam
127 self.assertEqual(sub.__name__, "t2.sub")
128 self.assertEqual(subsub.__name__, "t2.sub.subsub")
129 self.assertEqual(sub.subsub.__name__, "t2.sub.subsub")
130 for name in ['spam', 'sub', 'subsub', 't2']:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000131 self.assertTrue(locals()["name"], "Failed to import %s" % name)
Guido van Rossum6c612421997-09-06 18:42:57 +0000132
Collin Winter11e065b2007-08-24 19:15:12 +0000133 import t2.sub
134 import t2.sub.subsub
135 self.assertEqual(t2.__name__, "t2")
136 self.assertEqual(t2.sub.__name__, "t2.sub")
137 self.assertEqual(t2.sub.subsub.__name__, "t2.sub.subsub")
Fred Drake004d5e62000-10-23 17:22:08 +0000138
Collin Winter11e065b2007-08-24 19:15:12 +0000139 s = """
140 from t2 import *
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000141 self.assertTrue(dir(), ['self', 'sub'])
Collin Winter11e065b2007-08-24 19:15:12 +0000142 """
143 self.run_code(s)
Guido van Rossumc8bf8841997-09-08 16:06:20 +0000144
Collin Winter11e065b2007-08-24 19:15:12 +0000145 def test_3(self):
146 hier = [
147 ("t3", None),
148 ("t3 __init__.py", ""),
149 ("t3 sub", None),
150 ("t3 sub __init__.py", ""),
151 ("t3 sub subsub", None),
152 ("t3 sub subsub __init__.py", "spam = 1"),
153 ]
154 self.mkhier(hier)
Guido van Rossum6c612421997-09-06 18:42:57 +0000155
Collin Winter11e065b2007-08-24 19:15:12 +0000156 import t3.sub.subsub
157 self.assertEqual(t3.__name__, "t3")
158 self.assertEqual(t3.sub.__name__, "t3.sub")
159 self.assertEqual(t3.sub.subsub.__name__, "t3.sub.subsub")
Guido van Rossum6c612421997-09-06 18:42:57 +0000160
Collin Winter11e065b2007-08-24 19:15:12 +0000161 def test_4(self):
162 hier = [
163 ("t4.py", "raise RuntimeError('Shouldnt load t4.py')"),
164 ("t4", None),
165 ("t4 __init__.py", ""),
166 ("t4 sub.py", "raise RuntimeError('Shouldnt load sub.py')"),
167 ("t4 sub", None),
168 ("t4 sub __init__.py", ""),
Thomas Woutersed03b412007-08-28 21:37:11 +0000169 ("t4 sub subsub.py",
170 "raise RuntimeError('Shouldnt load subsub.py')"),
Collin Winter11e065b2007-08-24 19:15:12 +0000171 ("t4 sub subsub", None),
172 ("t4 sub subsub __init__.py", "spam = 1"),
173 ]
174 self.mkhier(hier)
Guido van Rossum6c612421997-09-06 18:42:57 +0000175
Collin Winter11e065b2007-08-24 19:15:12 +0000176 s = """
177 from t4.sub.subsub import *
178 self.assertEqual(spam, 1)
179 """
180 self.run_code(s)
Guido van Rossum6c612421997-09-06 18:42:57 +0000181
Collin Winter11e065b2007-08-24 19:15:12 +0000182 def test_5(self):
183 hier = [
184 ("t5", None),
185 ("t5 __init__.py", "import t5.foo"),
186 ("t5 string.py", "spam = 1"),
187 ("t5 foo.py",
188 "from . import string; assert string.spam == 1"),
189 ]
190 self.mkhier(hier)
Guido van Rossum6c612421997-09-06 18:42:57 +0000191
Collin Winter11e065b2007-08-24 19:15:12 +0000192 import t5
193 s = """
194 from t5 import *
195 self.assertEqual(dir(), ['foo', 'self', 'string', 't5'])
196 """
197 self.run_code(s)
Guido van Rossum10887a31997-09-07 06:12:11 +0000198
Collin Winter11e065b2007-08-24 19:15:12 +0000199 import t5
200 self.assertEqual(fixdir(dir(t5)),
Brett Cannonfd074152012-04-14 14:10:13 -0400201 ['__cached__', '__doc__', '__file__', '__loader__',
Eric Snowb523f842013-11-22 09:05:39 -0700202 '__name__', '__package__', '__path__', '__spec__',
203 'foo', 'string', 't5'])
Collin Winter11e065b2007-08-24 19:15:12 +0000204 self.assertEqual(fixdir(dir(t5.foo)),
Brett Cannonfd074152012-04-14 14:10:13 -0400205 ['__cached__', '__doc__', '__file__', '__loader__',
Eric Snowb523f842013-11-22 09:05:39 -0700206 '__name__', '__package__', '__spec__', 'string'])
Collin Winter11e065b2007-08-24 19:15:12 +0000207 self.assertEqual(fixdir(dir(t5.string)),
Brett Cannonfd074152012-04-14 14:10:13 -0400208 ['__cached__', '__doc__', '__file__', '__loader__',
Eric Snowb523f842013-11-22 09:05:39 -0700209 '__name__', '__package__', '__spec__', 'spam'])
Guido van Rossum5f4fb911998-05-19 15:09:42 +0000210
Collin Winter11e065b2007-08-24 19:15:12 +0000211 def test_6(self):
212 hier = [
213 ("t6", None),
Thomas Woutersed03b412007-08-28 21:37:11 +0000214 ("t6 __init__.py",
215 "__all__ = ['spam', 'ham', 'eggs']"),
Collin Winter11e065b2007-08-24 19:15:12 +0000216 ("t6 spam.py", ""),
217 ("t6 ham.py", ""),
218 ("t6 eggs.py", ""),
219 ]
220 self.mkhier(hier)
221
222 import t6
223 self.assertEqual(fixdir(dir(t6)),
Barry Warsaw28a691b2010-04-17 00:19:56 +0000224 ['__all__', '__cached__', '__doc__', '__file__',
Eric Snowb523f842013-11-22 09:05:39 -0700225 '__loader__', '__name__', '__package__', '__path__',
226 '__spec__'])
Collin Winter11e065b2007-08-24 19:15:12 +0000227 s = """
228 import t6
229 from t6 import *
230 self.assertEqual(fixdir(dir(t6)),
Barry Warsaw28a691b2010-04-17 00:19:56 +0000231 ['__all__', '__cached__', '__doc__', '__file__',
Brett Cannonfd074152012-04-14 14:10:13 -0400232 '__loader__', '__name__', '__package__',
Eric Snowb523f842013-11-22 09:05:39 -0700233 '__path__', '__spec__', 'eggs', 'ham', 'spam'])
Collin Winter11e065b2007-08-24 19:15:12 +0000234 self.assertEqual(dir(), ['eggs', 'ham', 'self', 'spam', 't6'])
235 """
236 self.run_code(s)
237
238 def test_7(self):
239 hier = [
240 ("t7.py", ""),
241 ("t7", None),
242 ("t7 __init__.py", ""),
Thomas Woutersed03b412007-08-28 21:37:11 +0000243 ("t7 sub.py",
244 "raise RuntimeError('Shouldnt load sub.py')"),
Collin Winter11e065b2007-08-24 19:15:12 +0000245 ("t7 sub", None),
246 ("t7 sub __init__.py", ""),
Thomas Woutersed03b412007-08-28 21:37:11 +0000247 ("t7 sub .py",
Collin Winter11e065b2007-08-24 19:15:12 +0000248 "raise RuntimeError('Shouldnt load subsub.py')"),
249 ("t7 sub subsub", None),
250 ("t7 sub subsub __init__.py",
251 "spam = 1"),
252 ]
253 self.mkhier(hier)
254
255
256 t7, sub, subsub = None, None, None
257 import t7 as tas
258 self.assertEqual(fixdir(dir(tas)),
Brett Cannonfd074152012-04-14 14:10:13 -0400259 ['__cached__', '__doc__', '__file__', '__loader__',
Eric Snowb523f842013-11-22 09:05:39 -0700260 '__name__', '__package__', '__path__', '__spec__'])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000261 self.assertFalse(t7)
Collin Winter11e065b2007-08-24 19:15:12 +0000262 from t7 import sub as subpar
263 self.assertEqual(fixdir(dir(subpar)),
Brett Cannonfd074152012-04-14 14:10:13 -0400264 ['__cached__', '__doc__', '__file__', '__loader__',
Eric Snowb523f842013-11-22 09:05:39 -0700265 '__name__', '__package__', '__path__', '__spec__'])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000266 self.assertFalse(t7)
267 self.assertFalse(sub)
Collin Winter11e065b2007-08-24 19:15:12 +0000268 from t7.sub import subsub as subsubsub
269 self.assertEqual(fixdir(dir(subsubsub)),
Brett Cannonfd074152012-04-14 14:10:13 -0400270 ['__cached__', '__doc__', '__file__', '__loader__',
Eric Snowb523f842013-11-22 09:05:39 -0700271 '__name__', '__package__', '__path__', '__spec__',
272 'spam'])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000273 self.assertFalse(t7)
274 self.assertFalse(sub)
275 self.assertFalse(subsub)
Collin Winter11e065b2007-08-24 19:15:12 +0000276 from t7.sub.subsub import spam as ham
277 self.assertEqual(ham, 1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000278 self.assertFalse(t7)
279 self.assertFalse(sub)
280 self.assertFalse(subsub)
Collin Winter11e065b2007-08-24 19:15:12 +0000281
R. David Murray378c0cf2010-02-24 01:46:21 +0000282 @unittest.skipIf(sys.flags.optimize >= 2,
283 "Docstrings are omitted with -O2 and above")
284 def test_8(self):
285 hier = [
286 ("t8", None),
287 ("t8 __init__"+os.extsep+"py", "'doc for t8'"),
288 ]
289 self.mkhier(hier)
290
291 import t8
292 self.assertEqual(t8.__doc__, "doc for t8")
Collin Winter11e065b2007-08-24 19:15:12 +0000293
294def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000295 support.run_unittest(__name__)
Collin Winter11e065b2007-08-24 19:15:12 +0000296
297
298if __name__ == "__main__":
299 test_main()