blob: 4d0eee8d0147803da95305cc2cf993194e75a9ec [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__")
Barry Warsaw3a9d0612000-09-01 06:53:52 +000026 return lst
27
Guido van Rossum6c612421997-09-06 18:42:57 +000028
Collin Winter11e065b2007-08-24 19:15:12 +000029# XXX Things to test
30#
31# import package without __init__
32# import package with __init__
33# __init__ importing submodule
34# __init__ importing global module
35# __init__ defining variables
36# submodule importing other submodule
37# submodule importing global module
38# submodule import submodule via global name
39# from package import submodule
40# from package import subpackage
41# from package import variable (defined in __init__)
42# from package import * (defined in __init__)
43
44
Christian Heimesdb4a2ef2007-11-12 19:53:03 +000045class TestPkg(unittest.TestCase):
Collin Winter11e065b2007-08-24 19:15:12 +000046
47 def setUp(self):
48 self.root = None
Christian Heimesdae2a892008-04-19 00:55:37 +000049 self.pkgname = None
Collin Winter11e065b2007-08-24 19:15:12 +000050 self.syspath = list(sys.path)
Antoine Pitrou060cee22009-11-13 16:29:04 +000051 self.modules_before = support.modules_setup()
Collin Winter11e065b2007-08-24 19:15:12 +000052
53 def tearDown(self):
54 sys.path[:] = self.syspath
Antoine Pitrou060cee22009-11-13 16:29:04 +000055 support.modules_cleanup(*self.modules_before)
R. David Murray378c0cf2010-02-24 01:46:21 +000056 if self.root: # Only clean if the test was actually run
57 cleanout(self.root)
Collin Winter11e065b2007-08-24 19:15:12 +000058
Ezio Melotti13925002011-03-16 11:05:33 +020059 # delete all modules concerning the tested hierarchy
Christian Heimesdae2a892008-04-19 00:55:37 +000060 if self.pkgname:
61 modules = [name for name in sys.modules
62 if self.pkgname in name.split('.')]
63 for name in modules:
64 del sys.modules[name]
65
Collin Winter11e065b2007-08-24 19:15:12 +000066 def run_code(self, code):
67 exec(textwrap.dedent(code), globals(), {"self": self})
68
69 def mkhier(self, descr):
70 root = tempfile.mkdtemp()
Guido van Rossum41360a41998-03-26 19:42:58 +000071 sys.path.insert(0, root)
Collin Winter11e065b2007-08-24 19:15:12 +000072 if not os.path.isdir(root):
73 os.mkdir(root)
74 for name, contents in descr:
75 comps = name.split()
76 fullname = root
77 for c in comps:
78 fullname = os.path.join(fullname, c)
79 if contents is None:
80 os.mkdir(fullname)
81 else:
82 f = open(fullname, "w")
83 f.write(contents)
84 if contents and contents[-1] != '\n':
85 f.write('\n')
86 f.close()
87 self.root = root
Christian Heimesdae2a892008-04-19 00:55:37 +000088 # package name is the name of the first item
89 self.pkgname = descr[0][0]
Guido van Rossum6c612421997-09-06 18:42:57 +000090
Collin Winter11e065b2007-08-24 19:15:12 +000091 def test_1(self):
92 hier = [("t1", None), ("t1 __init__.py", "")]
93 self.mkhier(hier)
94 import t1
Guido van Rossum6c612421997-09-06 18:42:57 +000095
Collin Winter11e065b2007-08-24 19:15:12 +000096 def test_2(self):
97 hier = [
98 ("t2", None),
99 ("t2 __init__.py", "'doc for t2'"),
100 ("t2 sub", None),
101 ("t2 sub __init__.py", ""),
102 ("t2 sub subsub", None),
103 ("t2 sub subsub __init__.py", "spam = 1"),
104 ]
105 self.mkhier(hier)
Fred Drake004d5e62000-10-23 17:22:08 +0000106
Collin Winter11e065b2007-08-24 19:15:12 +0000107 import t2.sub
108 import t2.sub.subsub
109 self.assertEqual(t2.__name__, "t2")
110 self.assertEqual(t2.sub.__name__, "t2.sub")
111 self.assertEqual(t2.sub.subsub.__name__, "t2.sub.subsub")
Fred Drake004d5e62000-10-23 17:22:08 +0000112
Collin Winter11e065b2007-08-24 19:15:12 +0000113 # This exec crap is needed because Py3k forbids 'import *' outside
114 # of module-scope and __import__() is insufficient for what we need.
115 s = """
116 import t2
117 from t2 import *
118 self.assertEqual(dir(), ['self', 'sub', 't2'])
119 """
120 self.run_code(s)
Guido van Rossum6c612421997-09-06 18:42:57 +0000121
Collin Winter11e065b2007-08-24 19:15:12 +0000122 from t2 import sub
123 from t2.sub import subsub
124 from t2.sub.subsub import spam
125 self.assertEqual(sub.__name__, "t2.sub")
126 self.assertEqual(subsub.__name__, "t2.sub.subsub")
127 self.assertEqual(sub.subsub.__name__, "t2.sub.subsub")
128 for name in ['spam', 'sub', 'subsub', 't2']:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000129 self.assertTrue(locals()["name"], "Failed to import %s" % name)
Guido van Rossum6c612421997-09-06 18:42:57 +0000130
Collin Winter11e065b2007-08-24 19:15:12 +0000131 import t2.sub
132 import t2.sub.subsub
133 self.assertEqual(t2.__name__, "t2")
134 self.assertEqual(t2.sub.__name__, "t2.sub")
135 self.assertEqual(t2.sub.subsub.__name__, "t2.sub.subsub")
Fred Drake004d5e62000-10-23 17:22:08 +0000136
Collin Winter11e065b2007-08-24 19:15:12 +0000137 s = """
138 from t2 import *
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000139 self.assertTrue(dir(), ['self', 'sub'])
Collin Winter11e065b2007-08-24 19:15:12 +0000140 """
141 self.run_code(s)
Guido van Rossumc8bf8841997-09-08 16:06:20 +0000142
Collin Winter11e065b2007-08-24 19:15:12 +0000143 def test_3(self):
144 hier = [
145 ("t3", None),
146 ("t3 __init__.py", ""),
147 ("t3 sub", None),
148 ("t3 sub __init__.py", ""),
149 ("t3 sub subsub", None),
150 ("t3 sub subsub __init__.py", "spam = 1"),
151 ]
152 self.mkhier(hier)
Guido van Rossum6c612421997-09-06 18:42:57 +0000153
Collin Winter11e065b2007-08-24 19:15:12 +0000154 import t3.sub.subsub
155 self.assertEqual(t3.__name__, "t3")
156 self.assertEqual(t3.sub.__name__, "t3.sub")
157 self.assertEqual(t3.sub.subsub.__name__, "t3.sub.subsub")
Guido van Rossum6c612421997-09-06 18:42:57 +0000158
Collin Winter11e065b2007-08-24 19:15:12 +0000159 def test_4(self):
160 hier = [
161 ("t4.py", "raise RuntimeError('Shouldnt load t4.py')"),
162 ("t4", None),
163 ("t4 __init__.py", ""),
164 ("t4 sub.py", "raise RuntimeError('Shouldnt load sub.py')"),
165 ("t4 sub", None),
166 ("t4 sub __init__.py", ""),
Thomas Woutersed03b412007-08-28 21:37:11 +0000167 ("t4 sub subsub.py",
168 "raise RuntimeError('Shouldnt load subsub.py')"),
Collin Winter11e065b2007-08-24 19:15:12 +0000169 ("t4 sub subsub", None),
170 ("t4 sub subsub __init__.py", "spam = 1"),
171 ]
172 self.mkhier(hier)
Guido van Rossum6c612421997-09-06 18:42:57 +0000173
Collin Winter11e065b2007-08-24 19:15:12 +0000174 s = """
175 from t4.sub.subsub import *
176 self.assertEqual(spam, 1)
177 """
178 self.run_code(s)
Guido van Rossum6c612421997-09-06 18:42:57 +0000179
Collin Winter11e065b2007-08-24 19:15:12 +0000180 def test_5(self):
181 hier = [
182 ("t5", None),
183 ("t5 __init__.py", "import t5.foo"),
184 ("t5 string.py", "spam = 1"),
185 ("t5 foo.py",
186 "from . import string; assert string.spam == 1"),
187 ]
188 self.mkhier(hier)
Guido van Rossum6c612421997-09-06 18:42:57 +0000189
Collin Winter11e065b2007-08-24 19:15:12 +0000190 import t5
191 s = """
192 from t5 import *
193 self.assertEqual(dir(), ['foo', 'self', 'string', 't5'])
194 """
195 self.run_code(s)
Guido van Rossum10887a31997-09-07 06:12:11 +0000196
Collin Winter11e065b2007-08-24 19:15:12 +0000197 import t5
198 self.assertEqual(fixdir(dir(t5)),
Brett Cannonfd074152012-04-14 14:10:13 -0400199 ['__cached__', '__doc__', '__file__', '__loader__',
200 '__name__', '__package__', '__path__', 'foo',
201 'string', 't5'])
Collin Winter11e065b2007-08-24 19:15:12 +0000202 self.assertEqual(fixdir(dir(t5.foo)),
Brett Cannonfd074152012-04-14 14:10:13 -0400203 ['__cached__', '__doc__', '__file__', '__loader__',
204 '__name__', '__package__', 'string'])
Collin Winter11e065b2007-08-24 19:15:12 +0000205 self.assertEqual(fixdir(dir(t5.string)),
Brett Cannonfd074152012-04-14 14:10:13 -0400206 ['__cached__', '__doc__', '__file__', '__loader__',
207 '__name__', '__package__', 'spam'])
Guido van Rossum5f4fb911998-05-19 15:09:42 +0000208
Collin Winter11e065b2007-08-24 19:15:12 +0000209 def test_6(self):
210 hier = [
211 ("t6", None),
Thomas Woutersed03b412007-08-28 21:37:11 +0000212 ("t6 __init__.py",
213 "__all__ = ['spam', 'ham', 'eggs']"),
Collin Winter11e065b2007-08-24 19:15:12 +0000214 ("t6 spam.py", ""),
215 ("t6 ham.py", ""),
216 ("t6 eggs.py", ""),
217 ]
218 self.mkhier(hier)
219
220 import t6
221 self.assertEqual(fixdir(dir(t6)),
Barry Warsaw28a691b2010-04-17 00:19:56 +0000222 ['__all__', '__cached__', '__doc__', '__file__',
Brett Cannonfd074152012-04-14 14:10:13 -0400223 '__loader__', '__name__', '__package__', '__path__'])
Collin Winter11e065b2007-08-24 19:15:12 +0000224 s = """
225 import t6
226 from t6 import *
227 self.assertEqual(fixdir(dir(t6)),
Barry Warsaw28a691b2010-04-17 00:19:56 +0000228 ['__all__', '__cached__', '__doc__', '__file__',
Brett Cannonfd074152012-04-14 14:10:13 -0400229 '__loader__', '__name__', '__package__',
230 '__path__', 'eggs', 'ham', 'spam'])
Collin Winter11e065b2007-08-24 19:15:12 +0000231 self.assertEqual(dir(), ['eggs', 'ham', 'self', 'spam', 't6'])
232 """
233 self.run_code(s)
234
235 def test_7(self):
236 hier = [
237 ("t7.py", ""),
238 ("t7", None),
239 ("t7 __init__.py", ""),
Thomas Woutersed03b412007-08-28 21:37:11 +0000240 ("t7 sub.py",
241 "raise RuntimeError('Shouldnt load sub.py')"),
Collin Winter11e065b2007-08-24 19:15:12 +0000242 ("t7 sub", None),
243 ("t7 sub __init__.py", ""),
Thomas Woutersed03b412007-08-28 21:37:11 +0000244 ("t7 sub .py",
Collin Winter11e065b2007-08-24 19:15:12 +0000245 "raise RuntimeError('Shouldnt load subsub.py')"),
246 ("t7 sub subsub", None),
247 ("t7 sub subsub __init__.py",
248 "spam = 1"),
249 ]
250 self.mkhier(hier)
251
252
253 t7, sub, subsub = None, None, None
254 import t7 as tas
255 self.assertEqual(fixdir(dir(tas)),
Brett Cannonfd074152012-04-14 14:10:13 -0400256 ['__cached__', '__doc__', '__file__', '__loader__',
257 '__name__', '__package__', '__path__'])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000258 self.assertFalse(t7)
Collin Winter11e065b2007-08-24 19:15:12 +0000259 from t7 import sub as subpar
260 self.assertEqual(fixdir(dir(subpar)),
Brett Cannonfd074152012-04-14 14:10:13 -0400261 ['__cached__', '__doc__', '__file__', '__loader__',
262 '__name__', '__package__', '__path__'])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000263 self.assertFalse(t7)
264 self.assertFalse(sub)
Collin Winter11e065b2007-08-24 19:15:12 +0000265 from t7.sub import subsub as subsubsub
266 self.assertEqual(fixdir(dir(subsubsub)),
Brett Cannonfd074152012-04-14 14:10:13 -0400267 ['__cached__', '__doc__', '__file__', '__loader__',
268 '__name__', '__package__', '__path__', 'spam'])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000269 self.assertFalse(t7)
270 self.assertFalse(sub)
271 self.assertFalse(subsub)
Collin Winter11e065b2007-08-24 19:15:12 +0000272 from t7.sub.subsub import spam as ham
273 self.assertEqual(ham, 1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000274 self.assertFalse(t7)
275 self.assertFalse(sub)
276 self.assertFalse(subsub)
Collin Winter11e065b2007-08-24 19:15:12 +0000277
R. David Murray378c0cf2010-02-24 01:46:21 +0000278 @unittest.skipIf(sys.flags.optimize >= 2,
279 "Docstrings are omitted with -O2 and above")
280 def test_8(self):
281 hier = [
282 ("t8", None),
283 ("t8 __init__"+os.extsep+"py", "'doc for t8'"),
284 ]
285 self.mkhier(hier)
286
287 import t8
288 self.assertEqual(t8.__doc__, "doc for t8")
Collin Winter11e065b2007-08-24 19:15:12 +0000289
290def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000291 support.run_unittest(__name__)
Collin Winter11e065b2007-08-24 19:15:12 +0000292
293
294if __name__ == "__main__":
295 test_main()