blob: 630956df0ed3212157c92fafb53ae50d437a879e [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
7import traceback
8import unittest
9from test import test_support
10
Guido van Rossum6c612421997-09-06 18:42:57 +000011
12# Helpers to create and destroy hierarchies.
13
Guido van Rossum6c612421997-09-06 18:42:57 +000014def cleanout(root):
15 names = os.listdir(root)
16 for name in names:
Guido van Rossum41360a41998-03-26 19:42:58 +000017 fullname = os.path.join(root, name)
18 if os.path.isdir(fullname) and not os.path.islink(fullname):
19 cleanout(fullname)
20 else:
21 os.remove(fullname)
Collin Winter11e065b2007-08-24 19:15:12 +000022 os.rmdir(root)
Guido van Rossum6c612421997-09-06 18:42:57 +000023
Barry Warsaw3a9d0612000-09-01 06:53:52 +000024def fixdir(lst):
Collin Winter11e065b2007-08-24 19:15:12 +000025 if "__builtins__" in lst:
26 lst.remove("__builtins__")
Barry Warsaw3a9d0612000-09-01 06:53:52 +000027 return lst
28
Guido van Rossum6c612421997-09-06 18:42:57 +000029
Collin Winter11e065b2007-08-24 19:15:12 +000030# XXX Things to test
31#
32# import package without __init__
33# import package with __init__
34# __init__ importing submodule
35# __init__ importing global module
36# __init__ defining variables
37# submodule importing other submodule
38# submodule importing global module
39# submodule import submodule via global name
40# from package import submodule
41# from package import subpackage
42# from package import variable (defined in __init__)
43# from package import * (defined in __init__)
44
45
Christian Heimesdb4a2ef2007-11-12 19:53:03 +000046class TestPkg(unittest.TestCase):
Collin Winter11e065b2007-08-24 19:15:12 +000047
48 def setUp(self):
49 self.root = None
50 self.syspath = list(sys.path)
Christian Heimesdb4a2ef2007-11-12 19:53:03 +000051 self.sysmodules = sys.modules.copy()
Collin Winter11e065b2007-08-24 19:15:12 +000052
53 def tearDown(self):
54 sys.path[:] = self.syspath
Christian Heimesdb4a2ef2007-11-12 19:53:03 +000055 sys.modules.clear()
56 sys.modules.update(self.sysmodules)
57 del self.sysmodules
Collin Winter11e065b2007-08-24 19:15:12 +000058 cleanout(self.root)
59
60 def run_code(self, code):
61 exec(textwrap.dedent(code), globals(), {"self": self})
62
63 def mkhier(self, descr):
64 root = tempfile.mkdtemp()
Guido van Rossum41360a41998-03-26 19:42:58 +000065 sys.path.insert(0, root)
Collin Winter11e065b2007-08-24 19:15:12 +000066 if not os.path.isdir(root):
67 os.mkdir(root)
68 for name, contents in descr:
69 comps = name.split()
70 fullname = root
71 for c in comps:
72 fullname = os.path.join(fullname, c)
73 if contents is None:
74 os.mkdir(fullname)
75 else:
76 f = open(fullname, "w")
77 f.write(contents)
78 if contents and contents[-1] != '\n':
79 f.write('\n')
80 f.close()
81 self.root = root
Guido van Rossum6c612421997-09-06 18:42:57 +000082
Collin Winter11e065b2007-08-24 19:15:12 +000083 def test_1(self):
84 hier = [("t1", None), ("t1 __init__.py", "")]
85 self.mkhier(hier)
86 import t1
Guido van Rossum6c612421997-09-06 18:42:57 +000087
Collin Winter11e065b2007-08-24 19:15:12 +000088 def test_2(self):
89 hier = [
90 ("t2", None),
91 ("t2 __init__.py", "'doc for t2'"),
92 ("t2 sub", None),
93 ("t2 sub __init__.py", ""),
94 ("t2 sub subsub", None),
95 ("t2 sub subsub __init__.py", "spam = 1"),
96 ]
97 self.mkhier(hier)
Fred Drake004d5e62000-10-23 17:22:08 +000098
Collin Winter11e065b2007-08-24 19:15:12 +000099 import t2
100 self.assertEqual(t2.__doc__, "doc for t2")
Fred Drake004d5e62000-10-23 17:22:08 +0000101
Collin Winter11e065b2007-08-24 19:15:12 +0000102 import t2.sub
103 import t2.sub.subsub
104 self.assertEqual(t2.__name__, "t2")
105 self.assertEqual(t2.sub.__name__, "t2.sub")
106 self.assertEqual(t2.sub.subsub.__name__, "t2.sub.subsub")
Fred Drake004d5e62000-10-23 17:22:08 +0000107
Collin Winter11e065b2007-08-24 19:15:12 +0000108 # This exec crap is needed because Py3k forbids 'import *' outside
109 # of module-scope and __import__() is insufficient for what we need.
110 s = """
111 import t2
112 from t2 import *
113 self.assertEqual(dir(), ['self', 'sub', 't2'])
114 """
115 self.run_code(s)
Guido van Rossum6c612421997-09-06 18:42:57 +0000116
Collin Winter11e065b2007-08-24 19:15:12 +0000117 from t2 import sub
118 from t2.sub import subsub
119 from t2.sub.subsub import spam
120 self.assertEqual(sub.__name__, "t2.sub")
121 self.assertEqual(subsub.__name__, "t2.sub.subsub")
122 self.assertEqual(sub.subsub.__name__, "t2.sub.subsub")
123 for name in ['spam', 'sub', 'subsub', 't2']:
124 self.failUnless(locals()["name"], "Failed to import %s" % name)
Guido van Rossum6c612421997-09-06 18:42:57 +0000125
Collin Winter11e065b2007-08-24 19:15:12 +0000126 import t2.sub
127 import t2.sub.subsub
128 self.assertEqual(t2.__name__, "t2")
129 self.assertEqual(t2.sub.__name__, "t2.sub")
130 self.assertEqual(t2.sub.subsub.__name__, "t2.sub.subsub")
Fred Drake004d5e62000-10-23 17:22:08 +0000131
Collin Winter11e065b2007-08-24 19:15:12 +0000132 s = """
133 from t2 import *
134 self.failUnless(dir(), ['self', 'sub'])
135 """
136 self.run_code(s)
Guido van Rossumc8bf8841997-09-08 16:06:20 +0000137
Collin Winter11e065b2007-08-24 19:15:12 +0000138 def test_3(self):
139 hier = [
140 ("t3", None),
141 ("t3 __init__.py", ""),
142 ("t3 sub", None),
143 ("t3 sub __init__.py", ""),
144 ("t3 sub subsub", None),
145 ("t3 sub subsub __init__.py", "spam = 1"),
146 ]
147 self.mkhier(hier)
Guido van Rossum6c612421997-09-06 18:42:57 +0000148
Collin Winter11e065b2007-08-24 19:15:12 +0000149 import t3.sub.subsub
150 self.assertEqual(t3.__name__, "t3")
151 self.assertEqual(t3.sub.__name__, "t3.sub")
152 self.assertEqual(t3.sub.subsub.__name__, "t3.sub.subsub")
Guido van Rossum6c612421997-09-06 18:42:57 +0000153
Collin Winter11e065b2007-08-24 19:15:12 +0000154 def test_4(self):
155 hier = [
156 ("t4.py", "raise RuntimeError('Shouldnt load t4.py')"),
157 ("t4", None),
158 ("t4 __init__.py", ""),
159 ("t4 sub.py", "raise RuntimeError('Shouldnt load sub.py')"),
160 ("t4 sub", None),
161 ("t4 sub __init__.py", ""),
Thomas Woutersed03b412007-08-28 21:37:11 +0000162 ("t4 sub subsub.py",
163 "raise RuntimeError('Shouldnt load subsub.py')"),
Collin Winter11e065b2007-08-24 19:15:12 +0000164 ("t4 sub subsub", None),
165 ("t4 sub subsub __init__.py", "spam = 1"),
166 ]
167 self.mkhier(hier)
Guido van Rossum6c612421997-09-06 18:42:57 +0000168
Collin Winter11e065b2007-08-24 19:15:12 +0000169 s = """
170 from t4.sub.subsub import *
171 self.assertEqual(spam, 1)
172 """
173 self.run_code(s)
Guido van Rossum6c612421997-09-06 18:42:57 +0000174
Collin Winter11e065b2007-08-24 19:15:12 +0000175 def test_5(self):
176 hier = [
177 ("t5", None),
178 ("t5 __init__.py", "import t5.foo"),
179 ("t5 string.py", "spam = 1"),
180 ("t5 foo.py",
181 "from . import string; assert string.spam == 1"),
182 ]
183 self.mkhier(hier)
Guido van Rossum6c612421997-09-06 18:42:57 +0000184
Collin Winter11e065b2007-08-24 19:15:12 +0000185 import t5
186 s = """
187 from t5 import *
188 self.assertEqual(dir(), ['foo', 'self', 'string', 't5'])
189 """
190 self.run_code(s)
Guido van Rossum10887a31997-09-07 06:12:11 +0000191
Collin Winter11e065b2007-08-24 19:15:12 +0000192 import t5
193 self.assertEqual(fixdir(dir(t5)),
194 ['__doc__', '__file__', '__name__',
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000195 '__package__', '__path__', 'foo', 'string', 't5'])
Collin Winter11e065b2007-08-24 19:15:12 +0000196 self.assertEqual(fixdir(dir(t5.foo)),
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000197 ['__doc__', '__file__', '__name__', '__package__',
198 'string'])
Collin Winter11e065b2007-08-24 19:15:12 +0000199 self.assertEqual(fixdir(dir(t5.string)),
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000200 ['__doc__', '__file__', '__name__','__package__',
201 'spam'])
Guido van Rossum5f4fb911998-05-19 15:09:42 +0000202
Collin Winter11e065b2007-08-24 19:15:12 +0000203 def test_6(self):
204 hier = [
205 ("t6", None),
Thomas Woutersed03b412007-08-28 21:37:11 +0000206 ("t6 __init__.py",
207 "__all__ = ['spam', 'ham', 'eggs']"),
Collin Winter11e065b2007-08-24 19:15:12 +0000208 ("t6 spam.py", ""),
209 ("t6 ham.py", ""),
210 ("t6 eggs.py", ""),
211 ]
212 self.mkhier(hier)
213
214 import t6
215 self.assertEqual(fixdir(dir(t6)),
216 ['__all__', '__doc__', '__file__',
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000217 '__name__', '__package__', '__path__'])
Collin Winter11e065b2007-08-24 19:15:12 +0000218 s = """
219 import t6
220 from t6 import *
221 self.assertEqual(fixdir(dir(t6)),
222 ['__all__', '__doc__', '__file__',
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000223 '__name__', '__package__', '__path__',
224 'eggs', 'ham', 'spam'])
Collin Winter11e065b2007-08-24 19:15:12 +0000225 self.assertEqual(dir(), ['eggs', 'ham', 'self', 'spam', 't6'])
226 """
227 self.run_code(s)
228
229 def test_7(self):
230 hier = [
231 ("t7.py", ""),
232 ("t7", None),
233 ("t7 __init__.py", ""),
Thomas Woutersed03b412007-08-28 21:37:11 +0000234 ("t7 sub.py",
235 "raise RuntimeError('Shouldnt load sub.py')"),
Collin Winter11e065b2007-08-24 19:15:12 +0000236 ("t7 sub", None),
237 ("t7 sub __init__.py", ""),
Thomas Woutersed03b412007-08-28 21:37:11 +0000238 ("t7 sub .py",
Collin Winter11e065b2007-08-24 19:15:12 +0000239 "raise RuntimeError('Shouldnt load subsub.py')"),
240 ("t7 sub subsub", None),
241 ("t7 sub subsub __init__.py",
242 "spam = 1"),
243 ]
244 self.mkhier(hier)
245
246
247 t7, sub, subsub = None, None, None
248 import t7 as tas
249 self.assertEqual(fixdir(dir(tas)),
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000250 ['__doc__', '__file__', '__name__',
251 '__package__', '__path__'])
Collin Winter11e065b2007-08-24 19:15:12 +0000252 self.failIf(t7)
253 from t7 import sub as subpar
254 self.assertEqual(fixdir(dir(subpar)),
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000255 ['__doc__', '__file__', '__name__',
256 '__package__', '__path__'])
Collin Winter11e065b2007-08-24 19:15:12 +0000257 self.failIf(t7)
258 self.failIf(sub)
259 from t7.sub import subsub as subsubsub
260 self.assertEqual(fixdir(dir(subsubsub)),
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000261 ['__doc__', '__file__', '__name__',
262 '__package__', '__path__', 'spam'])
Collin Winter11e065b2007-08-24 19:15:12 +0000263 self.failIf(t7)
264 self.failIf(sub)
265 self.failIf(subsub)
266 from t7.sub.subsub import spam as ham
267 self.assertEqual(ham, 1)
268 self.failIf(t7)
269 self.failIf(sub)
270 self.failIf(subsub)
271
272
273def test_main():
274 test_support.run_unittest(__name__)
275
276
277if __name__ == "__main__":
278 test_main()