blob: 28f994316eec17c2acfb519d3e4c41a067c4250a [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
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 Winter0f5e87a2007-08-24 19:13:58 +000022 os.rmdir(root)
Guido van Rossum6c612421997-09-06 18:42:57 +000023
Barry Warsaw3a9d0612000-09-01 06:53:52 +000024def fixdir(lst):
Collin Winter0f5e87a2007-08-24 19:13:58 +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 Winter0f5e87a2007-08-24 19:13:58 +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 Winter0f5e87a2007-08-24 19:13:58 +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 Winter0f5e87a2007-08-24 19:13:58 +000079 def test_1(self):
80 hier = [("t1", None), ("t1 __init__"+os.extsep+"py", "")]
81 self.mkhier(hier)
82 import t1
Guido van Rossum6c612421997-09-06 18:42:57 +000083
Collin Winter0f5e87a2007-08-24 19:13:58 +000084 def test_2(self):
85 hier = [
86 ("t2", None),
87 ("t2 __init__"+os.extsep+"py", "'doc for t2'"),
88 ("t2 sub", None),
89 ("t2 sub __init__"+os.extsep+"py", ""),
90 ("t2 sub subsub", None),
91 ("t2 sub subsub __init__"+os.extsep+"py", "spam = 1"),
92 ]
93 self.mkhier(hier)
Fred Drake004d5e62000-10-23 17:22:08 +000094
Collin Winter0f5e87a2007-08-24 19:13:58 +000095 import t2
96 self.assertEqual(t2.__doc__, "doc for t2")
Fred Drake004d5e62000-10-23 17:22:08 +000097
Collin Winter0f5e87a2007-08-24 19:13:58 +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 Winter0f5e87a2007-08-24 19:13:58 +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 Winter0f5e87a2007-08-24 19:13:58 +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 Winter0f5e87a2007-08-24 19:13:58 +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 Winter0f5e87a2007-08-24 19:13:58 +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 Winter0f5e87a2007-08-24 19:13:58 +0000134 def test_3(self):
135 hier = [
136 ("t3", None),
137 ("t3 __init__"+os.extsep+"py", ""),
138 ("t3 sub", None),
139 ("t3 sub __init__"+os.extsep+"py", ""),
140 ("t3 sub subsub", None),
141 ("t3 sub subsub __init__"+os.extsep+"py", "spam = 1"),
142 ]
143 self.mkhier(hier)
Guido van Rossum6c612421997-09-06 18:42:57 +0000144
Collin Winter0f5e87a2007-08-24 19:13:58 +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 Winter0f5e87a2007-08-24 19:13:58 +0000150 def test_4(self):
151 hier = [
152 ("t4.py", "raise RuntimeError('Shouldnt load t4.py')"),
153 ("t4", None),
154 ("t4 __init__"+os.extsep+"py", ""),
155 ("t4 sub.py", "raise RuntimeError('Shouldnt load sub.py')"),
156 ("t4 sub", None),
157 ("t4 sub __init__"+os.extsep+"py", ""),
158 ("t4 sub subsub"+os.extsep+"py",
159 "raise RuntimeError('Shouldnt load subsub.py')"),
160 ("t4 sub subsub", None),
161 ("t4 sub subsub __init__"+os.extsep+"py", "spam = 1"),
162 ]
163 self.mkhier(hier)
Guido van Rossum6c612421997-09-06 18:42:57 +0000164
Collin Winter0f5e87a2007-08-24 19:13:58 +0000165 s = """
166 from t4.sub.subsub import *
167 self.assertEqual(spam, 1)
168 """
169 self.run_code(s)
Guido van Rossum6c612421997-09-06 18:42:57 +0000170
Collin Winter0f5e87a2007-08-24 19:13:58 +0000171 def test_5(self):
172 hier = [
173 ("t5", None),
174 ("t5 __init__"+os.extsep+"py", "import t5.foo"),
175 ("t5 string"+os.extsep+"py", "spam = 1"),
176 ("t5 foo"+os.extsep+"py",
177 "from . import string; assert string.spam == 1"),
178 ]
179 self.mkhier(hier)
Guido van Rossum6c612421997-09-06 18:42:57 +0000180
Collin Winter0f5e87a2007-08-24 19:13:58 +0000181 import t5
182 s = """
183 from t5 import *
184 self.assertEqual(dir(), ['foo', 'self', 'string', 't5'])
185 """
186 self.run_code(s)
Guido van Rossum10887a31997-09-07 06:12:11 +0000187
Collin Winter0f5e87a2007-08-24 19:13:58 +0000188 import t5
189 self.assertEqual(fixdir(dir(t5)),
190 ['__doc__', '__file__', '__name__',
Nick Coghlanef01d822007-12-03 12:55:17 +0000191 '__package__', '__path__', 'foo', 'string', 't5'])
Collin Winter0f5e87a2007-08-24 19:13:58 +0000192 self.assertEqual(fixdir(dir(t5.foo)),
Nick Coghlanef01d822007-12-03 12:55:17 +0000193 ['__doc__', '__file__', '__name__', '__package__',
194 'string'])
Collin Winter0f5e87a2007-08-24 19:13:58 +0000195 self.assertEqual(fixdir(dir(t5.string)),
Nick Coghlanef01d822007-12-03 12:55:17 +0000196 ['__doc__', '__file__', '__name__','__package__',
197 'spam'])
Guido van Rossum5f4fb911998-05-19 15:09:42 +0000198
Collin Winter0f5e87a2007-08-24 19:13:58 +0000199 def test_6(self):
200 hier = [
201 ("t6", None),
202 ("t6 __init__"+os.extsep+"py",
203 "__all__ = ['spam', 'ham', 'eggs']"),
204 ("t6 spam"+os.extsep+"py", ""),
205 ("t6 ham"+os.extsep+"py", ""),
206 ("t6 eggs"+os.extsep+"py", ""),
207 ]
208 self.mkhier(hier)
209
210 import t6
211 self.assertEqual(fixdir(dir(t6)),
212 ['__all__', '__doc__', '__file__',
Nick Coghlanef01d822007-12-03 12:55:17 +0000213 '__name__', '__package__', '__path__'])
Collin Winter0f5e87a2007-08-24 19:13:58 +0000214 s = """
215 import t6
216 from t6 import *
217 self.assertEqual(fixdir(dir(t6)),
218 ['__all__', '__doc__', '__file__',
Nick Coghlanef01d822007-12-03 12:55:17 +0000219 '__name__', '__package__', '__path__',
220 'eggs', 'ham', 'spam'])
Collin Winter0f5e87a2007-08-24 19:13:58 +0000221 self.assertEqual(dir(), ['eggs', 'ham', 'self', 'spam', 't6'])
222 """
223 self.run_code(s)
224
225 def test_7(self):
226 hier = [
227 ("t7"+os.extsep+"py", ""),
228 ("t7", None),
229 ("t7 __init__"+os.extsep+"py", ""),
230 ("t7 sub"+os.extsep+"py",
231 "raise RuntimeError('Shouldnt load sub.py')"),
232 ("t7 sub", None),
233 ("t7 sub __init__"+os.extsep+"py", ""),
234 ("t7 sub "+os.extsep+"py",
235 "raise RuntimeError('Shouldnt load subsub.py')"),
236 ("t7 sub subsub", None),
237 ("t7 sub subsub __init__"+os.extsep+"py",
238 "spam = 1"),
239 ]
240 self.mkhier(hier)
241
242
243 t7, sub, subsub = None, None, None
244 import t7 as tas
245 self.assertEqual(fixdir(dir(tas)),
Nick Coghlanef01d822007-12-03 12:55:17 +0000246 ['__doc__', '__file__', '__name__',
247 '__package__', '__path__'])
Collin Winter0f5e87a2007-08-24 19:13:58 +0000248 self.failIf(t7)
249 from t7 import sub as subpar
250 self.assertEqual(fixdir(dir(subpar)),
Nick Coghlanef01d822007-12-03 12:55:17 +0000251 ['__doc__', '__file__', '__name__',
252 '__package__', '__path__'])
Collin Winter0f5e87a2007-08-24 19:13:58 +0000253 self.failIf(t7)
254 self.failIf(sub)
255 from t7.sub import subsub as subsubsub
256 self.assertEqual(fixdir(dir(subsubsub)),
Nick Coghlanef01d822007-12-03 12:55:17 +0000257 ['__doc__', '__file__', '__name__',
258 '__package__', '__path__', 'spam'])
Collin Winter0f5e87a2007-08-24 19:13:58 +0000259 self.failIf(t7)
260 self.failIf(sub)
261 self.failIf(subsub)
262 from t7.sub.subsub import spam as ham
263 self.assertEqual(ham, 1)
264 self.failIf(t7)
265 self.failIf(sub)
266 self.failIf(subsub)
267
268
269def test_main():
270 test_support.run_unittest(__name__)
271
272
273if __name__ == "__main__":
274 test_main()