blob: dcc7433176f410e87c24e4705d547a0cd6a87d27 [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
8from test import test_support
9
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
49 self.syspath = list(sys.path)
Christian Heimesdb4a2ef2007-11-12 19:53:03 +000050 self.sysmodules = sys.modules.copy()
Collin Winter11e065b2007-08-24 19:15:12 +000051
52 def tearDown(self):
53 sys.path[:] = self.syspath
Christian Heimesdb4a2ef2007-11-12 19:53:03 +000054 sys.modules.clear()
55 sys.modules.update(self.sysmodules)
56 del self.sysmodules
Collin Winter11e065b2007-08-24 19:15:12 +000057 cleanout(self.root)
58
59 def run_code(self, code):
60 exec(textwrap.dedent(code), globals(), {"self": self})
61
62 def mkhier(self, descr):
63 root = tempfile.mkdtemp()
Guido van Rossum41360a41998-03-26 19:42:58 +000064 sys.path.insert(0, root)
Collin Winter11e065b2007-08-24 19:15:12 +000065 if not os.path.isdir(root):
66 os.mkdir(root)
67 for name, contents in descr:
68 comps = name.split()
69 fullname = root
70 for c in comps:
71 fullname = os.path.join(fullname, c)
72 if contents is None:
73 os.mkdir(fullname)
74 else:
75 f = open(fullname, "w")
76 f.write(contents)
77 if contents and contents[-1] != '\n':
78 f.write('\n')
79 f.close()
80 self.root = root
Guido van Rossum6c612421997-09-06 18:42:57 +000081
Collin Winter11e065b2007-08-24 19:15:12 +000082 def test_1(self):
83 hier = [("t1", None), ("t1 __init__.py", "")]
84 self.mkhier(hier)
85 import t1
Guido van Rossum6c612421997-09-06 18:42:57 +000086
Collin Winter11e065b2007-08-24 19:15:12 +000087 def test_2(self):
88 hier = [
89 ("t2", None),
90 ("t2 __init__.py", "'doc for t2'"),
91 ("t2 sub", None),
92 ("t2 sub __init__.py", ""),
93 ("t2 sub subsub", None),
94 ("t2 sub subsub __init__.py", "spam = 1"),
95 ]
96 self.mkhier(hier)
Fred Drake004d5e62000-10-23 17:22:08 +000097
Collin Winter11e065b2007-08-24 19:15:12 +000098 import t2
99 self.assertEqual(t2.__doc__, "doc for t2")
Fred Drake004d5e62000-10-23 17:22:08 +0000100
Collin Winter11e065b2007-08-24 19:15:12 +0000101 import t2.sub
102 import t2.sub.subsub
103 self.assertEqual(t2.__name__, "t2")
104 self.assertEqual(t2.sub.__name__, "t2.sub")
105 self.assertEqual(t2.sub.subsub.__name__, "t2.sub.subsub")
Fred Drake004d5e62000-10-23 17:22:08 +0000106
Collin Winter11e065b2007-08-24 19:15:12 +0000107 # This exec crap is needed because Py3k forbids 'import *' outside
108 # of module-scope and __import__() is insufficient for what we need.
109 s = """
110 import t2
111 from t2 import *
112 self.assertEqual(dir(), ['self', 'sub', 't2'])
113 """
114 self.run_code(s)
Guido van Rossum6c612421997-09-06 18:42:57 +0000115
Collin Winter11e065b2007-08-24 19:15:12 +0000116 from t2 import sub
117 from t2.sub import subsub
118 from t2.sub.subsub import spam
119 self.assertEqual(sub.__name__, "t2.sub")
120 self.assertEqual(subsub.__name__, "t2.sub.subsub")
121 self.assertEqual(sub.subsub.__name__, "t2.sub.subsub")
122 for name in ['spam', 'sub', 'subsub', 't2']:
123 self.failUnless(locals()["name"], "Failed to import %s" % name)
Guido van Rossum6c612421997-09-06 18:42:57 +0000124
Collin Winter11e065b2007-08-24 19:15:12 +0000125 import t2.sub
126 import t2.sub.subsub
127 self.assertEqual(t2.__name__, "t2")
128 self.assertEqual(t2.sub.__name__, "t2.sub")
129 self.assertEqual(t2.sub.subsub.__name__, "t2.sub.subsub")
Fred Drake004d5e62000-10-23 17:22:08 +0000130
Collin Winter11e065b2007-08-24 19:15:12 +0000131 s = """
132 from t2 import *
133 self.failUnless(dir(), ['self', 'sub'])
134 """
135 self.run_code(s)
Guido van Rossumc8bf8841997-09-08 16:06:20 +0000136
Collin Winter11e065b2007-08-24 19:15:12 +0000137 def test_3(self):
138 hier = [
139 ("t3", None),
140 ("t3 __init__.py", ""),
141 ("t3 sub", None),
142 ("t3 sub __init__.py", ""),
143 ("t3 sub subsub", None),
144 ("t3 sub subsub __init__.py", "spam = 1"),
145 ]
146 self.mkhier(hier)
Guido van Rossum6c612421997-09-06 18:42:57 +0000147
Collin Winter11e065b2007-08-24 19:15:12 +0000148 import t3.sub.subsub
149 self.assertEqual(t3.__name__, "t3")
150 self.assertEqual(t3.sub.__name__, "t3.sub")
151 self.assertEqual(t3.sub.subsub.__name__, "t3.sub.subsub")
Guido van Rossum6c612421997-09-06 18:42:57 +0000152
Collin Winter11e065b2007-08-24 19:15:12 +0000153 def test_4(self):
154 hier = [
155 ("t4.py", "raise RuntimeError('Shouldnt load t4.py')"),
156 ("t4", None),
157 ("t4 __init__.py", ""),
158 ("t4 sub.py", "raise RuntimeError('Shouldnt load sub.py')"),
159 ("t4 sub", None),
160 ("t4 sub __init__.py", ""),
Thomas Woutersed03b412007-08-28 21:37:11 +0000161 ("t4 sub subsub.py",
162 "raise RuntimeError('Shouldnt load subsub.py')"),
Collin Winter11e065b2007-08-24 19:15:12 +0000163 ("t4 sub subsub", None),
164 ("t4 sub subsub __init__.py", "spam = 1"),
165 ]
166 self.mkhier(hier)
Guido van Rossum6c612421997-09-06 18:42:57 +0000167
Collin Winter11e065b2007-08-24 19:15:12 +0000168 s = """
169 from t4.sub.subsub import *
170 self.assertEqual(spam, 1)
171 """
172 self.run_code(s)
Guido van Rossum6c612421997-09-06 18:42:57 +0000173
Collin Winter11e065b2007-08-24 19:15:12 +0000174 def test_5(self):
175 hier = [
176 ("t5", None),
177 ("t5 __init__.py", "import t5.foo"),
178 ("t5 string.py", "spam = 1"),
179 ("t5 foo.py",
180 "from . import string; assert string.spam == 1"),
181 ]
182 self.mkhier(hier)
Guido van Rossum6c612421997-09-06 18:42:57 +0000183
Collin Winter11e065b2007-08-24 19:15:12 +0000184 import t5
185 s = """
186 from t5 import *
187 self.assertEqual(dir(), ['foo', 'self', 'string', 't5'])
188 """
189 self.run_code(s)
Guido van Rossum10887a31997-09-07 06:12:11 +0000190
Collin Winter11e065b2007-08-24 19:15:12 +0000191 import t5
192 self.assertEqual(fixdir(dir(t5)),
193 ['__doc__', '__file__', '__name__',
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000194 '__package__', '__path__', 'foo', 'string', 't5'])
Collin Winter11e065b2007-08-24 19:15:12 +0000195 self.assertEqual(fixdir(dir(t5.foo)),
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000196 ['__doc__', '__file__', '__name__', '__package__',
197 'string'])
Collin Winter11e065b2007-08-24 19:15:12 +0000198 self.assertEqual(fixdir(dir(t5.string)),
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000199 ['__doc__', '__file__', '__name__','__package__',
200 'spam'])
Guido van Rossum5f4fb911998-05-19 15:09:42 +0000201
Collin Winter11e065b2007-08-24 19:15:12 +0000202 def test_6(self):
203 hier = [
204 ("t6", None),
Thomas Woutersed03b412007-08-28 21:37:11 +0000205 ("t6 __init__.py",
206 "__all__ = ['spam', 'ham', 'eggs']"),
Collin Winter11e065b2007-08-24 19:15:12 +0000207 ("t6 spam.py", ""),
208 ("t6 ham.py", ""),
209 ("t6 eggs.py", ""),
210 ]
211 self.mkhier(hier)
212
213 import t6
214 self.assertEqual(fixdir(dir(t6)),
215 ['__all__', '__doc__', '__file__',
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000216 '__name__', '__package__', '__path__'])
Collin Winter11e065b2007-08-24 19:15:12 +0000217 s = """
218 import t6
219 from t6 import *
220 self.assertEqual(fixdir(dir(t6)),
221 ['__all__', '__doc__', '__file__',
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000222 '__name__', '__package__', '__path__',
223 'eggs', 'ham', 'spam'])
Collin Winter11e065b2007-08-24 19:15:12 +0000224 self.assertEqual(dir(), ['eggs', 'ham', 'self', 'spam', 't6'])
225 """
226 self.run_code(s)
227
228 def test_7(self):
229 hier = [
230 ("t7.py", ""),
231 ("t7", None),
232 ("t7 __init__.py", ""),
Thomas Woutersed03b412007-08-28 21:37:11 +0000233 ("t7 sub.py",
234 "raise RuntimeError('Shouldnt load sub.py')"),
Collin Winter11e065b2007-08-24 19:15:12 +0000235 ("t7 sub", None),
236 ("t7 sub __init__.py", ""),
Thomas Woutersed03b412007-08-28 21:37:11 +0000237 ("t7 sub .py",
Collin Winter11e065b2007-08-24 19:15:12 +0000238 "raise RuntimeError('Shouldnt load subsub.py')"),
239 ("t7 sub subsub", None),
240 ("t7 sub subsub __init__.py",
241 "spam = 1"),
242 ]
243 self.mkhier(hier)
244
245
246 t7, sub, subsub = None, None, None
247 import t7 as tas
248 self.assertEqual(fixdir(dir(tas)),
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000249 ['__doc__', '__file__', '__name__',
250 '__package__', '__path__'])
Collin Winter11e065b2007-08-24 19:15:12 +0000251 self.failIf(t7)
252 from t7 import sub as subpar
253 self.assertEqual(fixdir(dir(subpar)),
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000254 ['__doc__', '__file__', '__name__',
255 '__package__', '__path__'])
Collin Winter11e065b2007-08-24 19:15:12 +0000256 self.failIf(t7)
257 self.failIf(sub)
258 from t7.sub import subsub as subsubsub
259 self.assertEqual(fixdir(dir(subsubsub)),
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000260 ['__doc__', '__file__', '__name__',
261 '__package__', '__path__', 'spam'])
Collin Winter11e065b2007-08-24 19:15:12 +0000262 self.failIf(t7)
263 self.failIf(sub)
264 self.failIf(subsub)
265 from t7.sub.subsub import spam as ham
266 self.assertEqual(ham, 1)
267 self.failIf(t7)
268 self.failIf(sub)
269 self.failIf(subsub)
270
271
272def test_main():
273 test_support.run_unittest(__name__)
274
275
276if __name__ == "__main__":
277 test_main()