blob: 45d0f4fdf6a8a9f19fae1e8d3445c6d8eaf038ca [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
46class Test(unittest.TestCase):
47
48 def setUp(self):
49 self.root = None
50 self.syspath = list(sys.path)
51
52 def tearDown(self):
53 sys.path[:] = self.syspath
54 cleanout(self.root)
55
56 def run_code(self, code):
57 exec(textwrap.dedent(code), globals(), {"self": self})
58
59 def mkhier(self, descr):
60 root = tempfile.mkdtemp()
Guido van Rossum41360a41998-03-26 19:42:58 +000061 sys.path.insert(0, root)
Collin Winter11e065b2007-08-24 19:15:12 +000062 if not os.path.isdir(root):
63 os.mkdir(root)
64 for name, contents in descr:
65 comps = name.split()
66 fullname = root
67 for c in comps:
68 fullname = os.path.join(fullname, c)
69 if contents is None:
70 os.mkdir(fullname)
71 else:
72 f = open(fullname, "w")
73 f.write(contents)
74 if contents and contents[-1] != '\n':
75 f.write('\n')
76 f.close()
77 self.root = root
Guido van Rossum6c612421997-09-06 18:42:57 +000078
Collin Winter11e065b2007-08-24 19:15:12 +000079 def test_1(self):
80 hier = [("t1", None), ("t1 __init__.py", "")]
81 self.mkhier(hier)
82 import t1
Guido van Rossum6c612421997-09-06 18:42:57 +000083
Collin Winter11e065b2007-08-24 19:15:12 +000084 def test_2(self):
85 hier = [
86 ("t2", None),
87 ("t2 __init__.py", "'doc for t2'"),
88 ("t2 sub", None),
89 ("t2 sub __init__.py", ""),
90 ("t2 sub subsub", None),
91 ("t2 sub subsub __init__.py", "spam = 1"),
92 ]
93 self.mkhier(hier)
Fred Drake004d5e62000-10-23 17:22:08 +000094
Collin Winter11e065b2007-08-24 19:15:12 +000095 import t2
96 self.assertEqual(t2.__doc__, "doc for t2")
Fred Drake004d5e62000-10-23 17:22:08 +000097
Collin Winter11e065b2007-08-24 19:15:12 +000098 import t2.sub
99 import t2.sub.subsub
100 self.assertEqual(t2.__name__, "t2")
101 self.assertEqual(t2.sub.__name__, "t2.sub")
102 self.assertEqual(t2.sub.subsub.__name__, "t2.sub.subsub")
Fred Drake004d5e62000-10-23 17:22:08 +0000103
Collin Winter11e065b2007-08-24 19:15:12 +0000104 # This exec crap is needed because Py3k forbids 'import *' outside
105 # of module-scope and __import__() is insufficient for what we need.
106 s = """
107 import t2
108 from t2 import *
109 self.assertEqual(dir(), ['self', 'sub', 't2'])
110 """
111 self.run_code(s)
Guido van Rossum6c612421997-09-06 18:42:57 +0000112
Collin Winter11e065b2007-08-24 19:15:12 +0000113 from t2 import sub
114 from t2.sub import subsub
115 from t2.sub.subsub import spam
116 self.assertEqual(sub.__name__, "t2.sub")
117 self.assertEqual(subsub.__name__, "t2.sub.subsub")
118 self.assertEqual(sub.subsub.__name__, "t2.sub.subsub")
119 for name in ['spam', 'sub', 'subsub', 't2']:
120 self.failUnless(locals()["name"], "Failed to import %s" % name)
Guido van Rossum6c612421997-09-06 18:42:57 +0000121
Collin Winter11e065b2007-08-24 19:15:12 +0000122 import t2.sub
123 import t2.sub.subsub
124 self.assertEqual(t2.__name__, "t2")
125 self.assertEqual(t2.sub.__name__, "t2.sub")
126 self.assertEqual(t2.sub.subsub.__name__, "t2.sub.subsub")
Fred Drake004d5e62000-10-23 17:22:08 +0000127
Collin Winter11e065b2007-08-24 19:15:12 +0000128 s = """
129 from t2 import *
130 self.failUnless(dir(), ['self', 'sub'])
131 """
132 self.run_code(s)
Guido van Rossumc8bf8841997-09-08 16:06:20 +0000133
Collin Winter11e065b2007-08-24 19:15:12 +0000134 def test_3(self):
135 hier = [
136 ("t3", None),
137 ("t3 __init__.py", ""),
138 ("t3 sub", None),
139 ("t3 sub __init__.py", ""),
140 ("t3 sub subsub", None),
141 ("t3 sub subsub __init__.py", "spam = 1"),
142 ]
143 self.mkhier(hier)
Guido van Rossum6c612421997-09-06 18:42:57 +0000144
Collin Winter11e065b2007-08-24 19:15:12 +0000145 import t3.sub.subsub
146 self.assertEqual(t3.__name__, "t3")
147 self.assertEqual(t3.sub.__name__, "t3.sub")
148 self.assertEqual(t3.sub.subsub.__name__, "t3.sub.subsub")
Guido van Rossum6c612421997-09-06 18:42:57 +0000149
Collin Winter11e065b2007-08-24 19:15:12 +0000150 def test_4(self):
151 hier = [
152 ("t4.py", "raise RuntimeError('Shouldnt load t4.py')"),
153 ("t4", None),
154 ("t4 __init__.py", ""),
155 ("t4 sub.py", "raise RuntimeError('Shouldnt load sub.py')"),
156 ("t4 sub", None),
157 ("t4 sub __init__.py", ""),
158 ("t4 sub subsub.py", "raise RuntimeError('Shouldnt load subsub.py')"),
159 ("t4 sub subsub", None),
160 ("t4 sub subsub __init__.py", "spam = 1"),
161 ]
162 self.mkhier(hier)
Guido van Rossum6c612421997-09-06 18:42:57 +0000163
Collin Winter11e065b2007-08-24 19:15:12 +0000164 s = """
165 from t4.sub.subsub import *
166 self.assertEqual(spam, 1)
167 """
168 self.run_code(s)
Guido van Rossum6c612421997-09-06 18:42:57 +0000169
Collin Winter11e065b2007-08-24 19:15:12 +0000170 def test_5(self):
171 hier = [
172 ("t5", None),
173 ("t5 __init__.py", "import t5.foo"),
174 ("t5 string.py", "spam = 1"),
175 ("t5 foo.py",
176 "from . import string; assert string.spam == 1"),
177 ]
178 self.mkhier(hier)
Guido van Rossum6c612421997-09-06 18:42:57 +0000179
Collin Winter11e065b2007-08-24 19:15:12 +0000180 import t5
181 s = """
182 from t5 import *
183 self.assertEqual(dir(), ['foo', 'self', 'string', 't5'])
184 """
185 self.run_code(s)
Guido van Rossum10887a31997-09-07 06:12:11 +0000186
Collin Winter11e065b2007-08-24 19:15:12 +0000187 import t5
188 self.assertEqual(fixdir(dir(t5)),
189 ['__doc__', '__file__', '__name__',
190 '__path__', 'foo', 'string', 't5'])
191 self.assertEqual(fixdir(dir(t5.foo)),
192 ['__doc__', '__file__', '__name__', 'string'])
193 self.assertEqual(fixdir(dir(t5.string)),
194 ['__doc__', '__file__', '__name__', 'spam'])
Guido van Rossum5f4fb911998-05-19 15:09:42 +0000195
Collin Winter11e065b2007-08-24 19:15:12 +0000196 def test_6(self):
197 hier = [
198 ("t6", None),
199 ("t6 __init__.py", "__all__ = ['spam', 'ham', 'eggs']"),
200 ("t6 spam.py", ""),
201 ("t6 ham.py", ""),
202 ("t6 eggs.py", ""),
203 ]
204 self.mkhier(hier)
205
206 import t6
207 self.assertEqual(fixdir(dir(t6)),
208 ['__all__', '__doc__', '__file__',
209 '__name__', '__path__'])
210 s = """
211 import t6
212 from t6 import *
213 self.assertEqual(fixdir(dir(t6)),
214 ['__all__', '__doc__', '__file__',
215 '__name__', '__path__', 'eggs',
216 'ham', 'spam'])
217 self.assertEqual(dir(), ['eggs', 'ham', 'self', 'spam', 't6'])
218 """
219 self.run_code(s)
220
221 def test_7(self):
222 hier = [
223 ("t7.py", ""),
224 ("t7", None),
225 ("t7 __init__.py", ""),
226 ("t7 sub.py", "raise RuntimeError('Shouldnt load sub.py')"),
227 ("t7 sub", None),
228 ("t7 sub __init__.py", ""),
229 ("t7 sub subsub.py",
230 "raise RuntimeError('Shouldnt load subsub.py')"),
231 ("t7 sub subsub", None),
232 ("t7 sub subsub __init__.py",
233 "spam = 1"),
234 ]
235 self.mkhier(hier)
236
237
238 t7, sub, subsub = None, None, None
239 import t7 as tas
240 self.assertEqual(fixdir(dir(tas)),
241 ['__doc__', '__file__', '__name__', '__path__'])
242 self.failIf(t7)
243 from t7 import sub as subpar
244 self.assertEqual(fixdir(dir(subpar)),
245 ['__doc__', '__file__', '__name__', '__path__'])
246 self.failIf(t7)
247 self.failIf(sub)
248 from t7.sub import subsub as subsubsub
249 self.assertEqual(fixdir(dir(subsubsub)),
250 ['__doc__', '__file__', '__name__', '__path__',
251 'spam'])
252 self.failIf(t7)
253 self.failIf(sub)
254 self.failIf(subsub)
255 from t7.sub.subsub import spam as ham
256 self.assertEqual(ham, 1)
257 self.failIf(t7)
258 self.failIf(sub)
259 self.failIf(subsub)
260
261
262def test_main():
263 test_support.run_unittest(__name__)
264
265
266if __name__ == "__main__":
267 test_main()