blob: 4fa367f56001d222b1cd2affead7836b6d66ee11 [file] [log] [blame]
Guido van Rossum6c612421997-09-06 18:42:57 +00001# Test packages (dotted-name import)
2
Collin Winter0f5e87a2007-08-24 19:13:58 +00003import sys
4import os
5import tempfile
6import textwrap
Collin Winter0f5e87a2007-08-24 19:13:58 +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 Winter0f5e87a2007-08-24 19:13:58 +000021 os.rmdir(root)
Guido van Rossum6c612421997-09-06 18:42:57 +000022
Barry Warsaw3a9d0612000-09-01 06:53:52 +000023def fixdir(lst):
Collin Winter0f5e87a2007-08-24 19:13:58 +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 Winter0f5e87a2007-08-24 19:13:58 +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
45class Test(unittest.TestCase):
46
47 def setUp(self):
48 self.root = None
49 self.syspath = list(sys.path)
50
51 def tearDown(self):
52 sys.path[:] = self.syspath
53 cleanout(self.root)
54
55 def run_code(self, code):
56 exec(textwrap.dedent(code), globals(), {"self": self})
57
58 def mkhier(self, descr):
59 root = tempfile.mkdtemp()
Guido van Rossum41360a41998-03-26 19:42:58 +000060 sys.path.insert(0, root)
Collin Winter0f5e87a2007-08-24 19:13:58 +000061 if not os.path.isdir(root):
62 os.mkdir(root)
63 for name, contents in descr:
64 comps = name.split()
65 fullname = root
66 for c in comps:
67 fullname = os.path.join(fullname, c)
68 if contents is None:
69 os.mkdir(fullname)
70 else:
71 f = open(fullname, "w")
72 f.write(contents)
73 if contents and contents[-1] != '\n':
74 f.write('\n')
75 f.close()
76 self.root = root
Guido van Rossum6c612421997-09-06 18:42:57 +000077
Collin Winter0f5e87a2007-08-24 19:13:58 +000078 def test_1(self):
79 hier = [("t1", None), ("t1 __init__"+os.extsep+"py", "")]
80 self.mkhier(hier)
81 import t1
Guido van Rossum6c612421997-09-06 18:42:57 +000082
Collin Winter0f5e87a2007-08-24 19:13:58 +000083 def test_2(self):
84 hier = [
85 ("t2", None),
86 ("t2 __init__"+os.extsep+"py", "'doc for t2'"),
87 ("t2 sub", None),
88 ("t2 sub __init__"+os.extsep+"py", ""),
89 ("t2 sub subsub", None),
90 ("t2 sub subsub __init__"+os.extsep+"py", "spam = 1"),
91 ]
92 self.mkhier(hier)
Fred Drake004d5e62000-10-23 17:22:08 +000093
Collin Winter0f5e87a2007-08-24 19:13:58 +000094 import t2
95 self.assertEqual(t2.__doc__, "doc for t2")
Fred Drake004d5e62000-10-23 17:22:08 +000096
Collin Winter0f5e87a2007-08-24 19:13:58 +000097 import t2.sub
98 import t2.sub.subsub
99 self.assertEqual(t2.__name__, "t2")
100 self.assertEqual(t2.sub.__name__, "t2.sub")
101 self.assertEqual(t2.sub.subsub.__name__, "t2.sub.subsub")
Fred Drake004d5e62000-10-23 17:22:08 +0000102
Collin Winter0f5e87a2007-08-24 19:13:58 +0000103 # This exec crap is needed because Py3k forbids 'import *' outside
104 # of module-scope and __import__() is insufficient for what we need.
105 s = """
106 import t2
107 from t2 import *
108 self.assertEqual(dir(), ['self', 'sub', 't2'])
109 """
110 self.run_code(s)
Guido van Rossum6c612421997-09-06 18:42:57 +0000111
Collin Winter0f5e87a2007-08-24 19:13:58 +0000112 from t2 import sub
113 from t2.sub import subsub
114 from t2.sub.subsub import spam
115 self.assertEqual(sub.__name__, "t2.sub")
116 self.assertEqual(subsub.__name__, "t2.sub.subsub")
117 self.assertEqual(sub.subsub.__name__, "t2.sub.subsub")
118 for name in ['spam', 'sub', 'subsub', 't2']:
119 self.failUnless(locals()["name"], "Failed to import %s" % name)
Guido van Rossum6c612421997-09-06 18:42:57 +0000120
Collin Winter0f5e87a2007-08-24 19:13:58 +0000121 import t2.sub
122 import t2.sub.subsub
123 self.assertEqual(t2.__name__, "t2")
124 self.assertEqual(t2.sub.__name__, "t2.sub")
125 self.assertEqual(t2.sub.subsub.__name__, "t2.sub.subsub")
Fred Drake004d5e62000-10-23 17:22:08 +0000126
Collin Winter0f5e87a2007-08-24 19:13:58 +0000127 s = """
128 from t2 import *
129 self.failUnless(dir(), ['self', 'sub'])
130 """
131 self.run_code(s)
Guido van Rossumc8bf8841997-09-08 16:06:20 +0000132
Collin Winter0f5e87a2007-08-24 19:13:58 +0000133 def test_3(self):
134 hier = [
135 ("t3", None),
136 ("t3 __init__"+os.extsep+"py", ""),
137 ("t3 sub", None),
138 ("t3 sub __init__"+os.extsep+"py", ""),
139 ("t3 sub subsub", None),
140 ("t3 sub subsub __init__"+os.extsep+"py", "spam = 1"),
141 ]
142 self.mkhier(hier)
Guido van Rossum6c612421997-09-06 18:42:57 +0000143
Collin Winter0f5e87a2007-08-24 19:13:58 +0000144 import t3.sub.subsub
145 self.assertEqual(t3.__name__, "t3")
146 self.assertEqual(t3.sub.__name__, "t3.sub")
147 self.assertEqual(t3.sub.subsub.__name__, "t3.sub.subsub")
Guido van Rossum6c612421997-09-06 18:42:57 +0000148
Collin Winter0f5e87a2007-08-24 19:13:58 +0000149 def test_4(self):
150 hier = [
151 ("t4.py", "raise RuntimeError('Shouldnt load t4.py')"),
152 ("t4", None),
153 ("t4 __init__"+os.extsep+"py", ""),
154 ("t4 sub.py", "raise RuntimeError('Shouldnt load sub.py')"),
155 ("t4 sub", None),
156 ("t4 sub __init__"+os.extsep+"py", ""),
157 ("t4 sub subsub"+os.extsep+"py",
158 "raise RuntimeError('Shouldnt load subsub.py')"),
159 ("t4 sub subsub", None),
160 ("t4 sub subsub __init__"+os.extsep+"py", "spam = 1"),
161 ]
162 self.mkhier(hier)
Guido van Rossum6c612421997-09-06 18:42:57 +0000163
Collin Winter0f5e87a2007-08-24 19:13:58 +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 Winter0f5e87a2007-08-24 19:13:58 +0000170 def test_5(self):
171 hier = [
172 ("t5", None),
173 ("t5 __init__"+os.extsep+"py", "import t5.foo"),
174 ("t5 string"+os.extsep+"py", "spam = 1"),
175 ("t5 foo"+os.extsep+"py",
176 "from . import string; assert string.spam == 1"),
177 ]
178 self.mkhier(hier)
Guido van Rossum6c612421997-09-06 18:42:57 +0000179
Collin Winter0f5e87a2007-08-24 19:13:58 +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 Winter0f5e87a2007-08-24 19:13:58 +0000187 import t5
188 self.assertEqual(fixdir(dir(t5)),
189 ['__doc__', '__file__', '__name__',
Nick Coghlanef01d822007-12-03 12:55:17 +0000190 '__package__', '__path__', 'foo', 'string', 't5'])
Collin Winter0f5e87a2007-08-24 19:13:58 +0000191 self.assertEqual(fixdir(dir(t5.foo)),
Nick Coghlanef01d822007-12-03 12:55:17 +0000192 ['__doc__', '__file__', '__name__', '__package__',
193 'string'])
Collin Winter0f5e87a2007-08-24 19:13:58 +0000194 self.assertEqual(fixdir(dir(t5.string)),
Nick Coghlanef01d822007-12-03 12:55:17 +0000195 ['__doc__', '__file__', '__name__','__package__',
196 'spam'])
Guido van Rossum5f4fb911998-05-19 15:09:42 +0000197
Collin Winter0f5e87a2007-08-24 19:13:58 +0000198 def test_6(self):
199 hier = [
200 ("t6", None),
201 ("t6 __init__"+os.extsep+"py",
202 "__all__ = ['spam', 'ham', 'eggs']"),
203 ("t6 spam"+os.extsep+"py", ""),
204 ("t6 ham"+os.extsep+"py", ""),
205 ("t6 eggs"+os.extsep+"py", ""),
206 ]
207 self.mkhier(hier)
208
209 import t6
210 self.assertEqual(fixdir(dir(t6)),
211 ['__all__', '__doc__', '__file__',
Nick Coghlanef01d822007-12-03 12:55:17 +0000212 '__name__', '__package__', '__path__'])
Collin Winter0f5e87a2007-08-24 19:13:58 +0000213 s = """
214 import t6
215 from t6 import *
216 self.assertEqual(fixdir(dir(t6)),
217 ['__all__', '__doc__', '__file__',
Nick Coghlanef01d822007-12-03 12:55:17 +0000218 '__name__', '__package__', '__path__',
219 'eggs', 'ham', 'spam'])
Collin Winter0f5e87a2007-08-24 19:13:58 +0000220 self.assertEqual(dir(), ['eggs', 'ham', 'self', 'spam', 't6'])
221 """
222 self.run_code(s)
223
224 def test_7(self):
225 hier = [
226 ("t7"+os.extsep+"py", ""),
227 ("t7", None),
228 ("t7 __init__"+os.extsep+"py", ""),
229 ("t7 sub"+os.extsep+"py",
230 "raise RuntimeError('Shouldnt load sub.py')"),
231 ("t7 sub", None),
232 ("t7 sub __init__"+os.extsep+"py", ""),
233 ("t7 sub "+os.extsep+"py",
234 "raise RuntimeError('Shouldnt load subsub.py')"),
235 ("t7 sub subsub", None),
236 ("t7 sub subsub __init__"+os.extsep+"py",
237 "spam = 1"),
238 ]
239 self.mkhier(hier)
240
241
242 t7, sub, subsub = None, None, None
243 import t7 as tas
244 self.assertEqual(fixdir(dir(tas)),
Nick Coghlanef01d822007-12-03 12:55:17 +0000245 ['__doc__', '__file__', '__name__',
246 '__package__', '__path__'])
Collin Winter0f5e87a2007-08-24 19:13:58 +0000247 self.failIf(t7)
248 from t7 import sub as subpar
249 self.assertEqual(fixdir(dir(subpar)),
Nick Coghlanef01d822007-12-03 12:55:17 +0000250 ['__doc__', '__file__', '__name__',
251 '__package__', '__path__'])
Collin Winter0f5e87a2007-08-24 19:13:58 +0000252 self.failIf(t7)
253 self.failIf(sub)
254 from t7.sub import subsub as subsubsub
255 self.assertEqual(fixdir(dir(subsubsub)),
Nick Coghlanef01d822007-12-03 12:55:17 +0000256 ['__doc__', '__file__', '__name__',
257 '__package__', '__path__', 'spam'])
Collin Winter0f5e87a2007-08-24 19:13:58 +0000258 self.failIf(t7)
259 self.failIf(sub)
260 self.failIf(subsub)
261 from t7.sub.subsub import spam as ham
262 self.assertEqual(ham, 1)
263 self.failIf(t7)
264 self.failIf(sub)
265 self.failIf(subsub)
266
267
268def test_main():
269 test_support.run_unittest(__name__)
270
271
272if __name__ == "__main__":
273 test_main()