blob: a99da353c78a55d440c8103bbe2ce3f2287ce053 [file] [log] [blame]
Guido van Rossum6c612421997-09-06 18:42:57 +00001# Test packages (dotted-name import)
2
3import sys, os, string, tempfile, traceback
Guido van Rossum41360a41998-03-26 19:42:58 +00004from os import mkdir, rmdir # Can't test if these fail
Guido van Rossum6c612421997-09-06 18:42:57 +00005del mkdir, rmdir
Guido van Rossum5f4fb911998-05-19 15:09:42 +00006from test_support import verbose, TestFailed
Guido van Rossum6c612421997-09-06 18:42:57 +00007
8# Helpers to create and destroy hierarchies.
9
10def mkhier(root, descr):
11 mkdir(root)
12 for name, contents in descr:
Guido van Rossum41360a41998-03-26 19:42:58 +000013 comps = string.split(name)
14 fullname = root
15 for c in comps:
16 fullname = os.path.join(fullname, c)
17 if contents is None:
18 mkdir(fullname)
19 else:
20 if verbose: print "write", fullname
21 f = open(fullname, "w")
22 f.write(contents)
23 if contents and contents[-1] != '\n':
24 f.write('\n')
25 f.close()
Guido van Rossum6c612421997-09-06 18:42:57 +000026
27def mkdir(x):
28 if verbose: print "mkdir", x
29 os.mkdir(x)
30
31def cleanout(root):
32 names = os.listdir(root)
33 for name in names:
Guido van Rossum41360a41998-03-26 19:42:58 +000034 fullname = os.path.join(root, name)
35 if os.path.isdir(fullname) and not os.path.islink(fullname):
36 cleanout(fullname)
37 else:
38 os.remove(fullname)
Guido van Rossum6c612421997-09-06 18:42:57 +000039 rmdir(root)
40
41def rmdir(x):
42 if verbose: print "rmdir", x
43 os.rmdir(x)
44
45# Helper to run a test
46
47def runtest(hier, code):
48 root = tempfile.mktemp()
49 mkhier(root, hier)
50 savepath = sys.path[:]
51 codefile = tempfile.mktemp()
52 f = open(codefile, "w")
53 f.write(code)
54 f.close()
55 try:
Guido van Rossum41360a41998-03-26 19:42:58 +000056 sys.path.insert(0, root)
57 if verbose: print "sys.path =", sys.path
58 try:
59 execfile(codefile, globals(), {})
60 except:
61 traceback.print_exc(file=sys.stdout)
Guido van Rossum6c612421997-09-06 18:42:57 +000062 finally:
Guido van Rossum41360a41998-03-26 19:42:58 +000063 sys.path[:] = savepath
64 try:
65 cleanout(root)
66 except (os.error, IOError):
67 pass
68 os.remove(codefile)
Guido van Rossum6c612421997-09-06 18:42:57 +000069
70# Test descriptions
71
72tests = [
Guido van Rossume8d11391997-10-31 18:33:41 +000073 ("t1", [("t1", None), ("t1 __init__.py", "")], "import t1"),
Guido van Rossum6c612421997-09-06 18:42:57 +000074
75 ("t2", [
76 ("t2", None),
77 ("t2 __init__.py", "'doc for t2'; print __name__, 'loading'"),
78 ("t2 sub", None),
Guido van Rossume8d11391997-10-31 18:33:41 +000079 ("t2 sub __init__.py", ""),
Guido van Rossum6c612421997-09-06 18:42:57 +000080 ("t2 sub subsub", None),
81 ("t2 sub subsub __init__.py", "print __name__, 'loading'; spam = 1"),
82 ],
83"""
84import t2
85print t2.__doc__
86import t2.sub
87import t2.sub.subsub
88print t2.__name__, t2.sub.__name__, t2.sub.subsub.__name__
89import t2
90from t2 import *
91print dir()
92from t2 import sub
93from t2.sub import subsub
94from t2.sub.subsub import spam
95print sub.__name__, subsub.__name__
96print sub.subsub.__name__
97print dir()
98import t2.sub
99import t2.sub.subsub
100print t2.__name__, t2.sub.__name__, t2.sub.subsub.__name__
101from t2 import *
102print dir()
103"""),
104
105 ("t3", [
106 ("t3", None),
107 ("t3 __init__.py", "print __name__, 'loading'"),
108 ("t3 sub", None),
Guido van Rossume8d11391997-10-31 18:33:41 +0000109 ("t3 sub __init__.py", ""),
Guido van Rossum6c612421997-09-06 18:42:57 +0000110 ("t3 sub subsub", None),
111 ("t3 sub subsub __init__.py", "print __name__, 'loading'; spam = 1"),
112 ],
113"""
114import t3.sub.subsub
115print t3.__name__, t3.sub.__name__, t3.sub.subsub.__name__
Guido van Rossum81da02e1997-09-06 19:58:53 +0000116reload(t3)
117reload(t3.sub)
118reload(t3.sub.subsub)
Guido van Rossum6c612421997-09-06 18:42:57 +0000119"""),
120
121 ("t4", [
122 ("t4.py", "print 'THIS SHOULD NOT BE PRINTED (t4.py)'"),
123 ("t4", None),
124 ("t4 __init__.py", "print __name__, 'loading'"),
125 ("t4 sub.py", "print 'THIS SHOULD NOT BE PRINTED (sub.py)'"),
126 ("t4 sub", None),
Guido van Rossume8d11391997-10-31 18:33:41 +0000127 ("t4 sub __init__.py", ""),
Guido van Rossum6c612421997-09-06 18:42:57 +0000128 ("t4 sub subsub.py", "print 'THIS SHOULD NOT BE PRINTED (subsub.py)'"),
129 ("t4 sub subsub", None),
130 ("t4 sub subsub __init__.py", "print __name__, 'loading'; spam = 1"),
131 ],
132"""
133from t4.sub.subsub import *
134print "t4.sub.subsub.spam =", spam
135"""),
136
137 ("t5", [
138 ("t5", None),
139 ("t5 __init__.py", "import t5.foo"),
140 ("t5 string.py", "print __name__, 'loading'; spam = 1"),
141 ("t5 foo.py",
142 "print __name__, 'loading'; import string; print string.spam"),
143 ],
144"""
Guido van Rossum10887a31997-09-07 06:12:11 +0000145import t5
Guido van Rossum6c612421997-09-06 18:42:57 +0000146from t5 import *
147print dir()
148import t5
149print dir(t5)
150print dir(t5.foo)
151print dir(t5.string)
152"""),
153
Guido van Rossumc8bf8841997-09-08 16:06:20 +0000154 ("t6", [
155 ("t6", None),
156 ("t6 __init__.py", "__all__ = ['spam', 'ham', 'eggs']"),
157 ("t6 spam.py", "print __name__, 'loading'"),
158 ("t6 ham.py", "print __name__, 'loading'"),
159 ("t6 eggs.py", "print __name__, 'loading'"),
160 ],
161"""
162import t6
163print dir(t6)
164from t6 import *
165print dir(t6)
166print dir()
167"""),
Thomas Wouters52152252000-08-17 22:55:00 +0000168
169 ("t7", [
170 ("t7.py", "print 'Importing t7.py'"),
171 ("t7", None),
172 ("t7 __init__.py", "print __name__, 'loading'"),
173 ("t7 sub.py", "print 'THIS SHOULD NOT BE PRINTED (sub.py)'"),
174 ("t7 sub", None),
175 ("t7 sub __init__.py", ""),
176 ("t7 sub subsub.py", "print 'THIS SHOULD NOT BE PRINTED (subsub.py)'"),
177 ("t7 sub subsub", None),
178 ("t7 sub subsub __init__.py", "print __name__, 'loading'; spam = 1"),
179 ],
180"""
181t7, sub, subsub = None, None, None
182import t7 as tas
183print dir(tas)
184assert not t7
185from t7 import sub as subpar
186print dir(subpar)
187assert not t7 and not sub
188from t7.sub import subsub as subsubsub
189print dir(subsubsub)
190assert not t7 and not sub and not subsub
191from t7.sub.subsub import spam as ham
192print "t7.sub.subsub.spam =", ham
193assert not t7 and not sub and not subsub
194"""),
Guido van Rossumc8bf8841997-09-08 16:06:20 +0000195
Guido van Rossum6c612421997-09-06 18:42:57 +0000196]
197
198nontests = [
199 ("x5", [], ("import a" + ".a"*400)),
200 ("x6", [], ("import a" + ".a"*499)),
201 ("x7", [], ("import a" + ".a"*500)),
202 ("x8", [], ("import a" + ".a"*1100)),
203 ("x9", [], ("import " + "a"*400)),
204 ("x10", [], ("import " + "a"*500)),
205 ("x11", [], ("import " + "a"*998)),
206 ("x12", [], ("import " + "a"*999)),
207 ("x13", [], ("import " + "a"*999)),
208 ("x14", [], ("import " + "a"*2000)),
209]
210
211"""XXX Things to test
212
213import package without __init__
214import package with __init__
215__init__ importing submodule
216__init__ importing global module
217__init__ defining variables
218submodule importing other submodule
219submodule importing global module
220submodule import submodule via global name
221from package import submodule
222from package import subpackage
223from package import variable (defined in __init__)
224from package import * (defined in __init__)
225"""
226
227# Run the tests
228
Guido van Rossum10887a31997-09-07 06:12:11 +0000229args = []
230if __name__ == '__main__':
231 args = sys.argv[1:]
232 if args and args[0] == '-q':
Guido van Rossum41360a41998-03-26 19:42:58 +0000233 verbose = 0
234 del args[0]
Guido van Rossum10887a31997-09-07 06:12:11 +0000235
Guido van Rossum6c612421997-09-06 18:42:57 +0000236for name, hier, code in tests:
Guido van Rossum10887a31997-09-07 06:12:11 +0000237 if args and name not in args:
Guido van Rossum41360a41998-03-26 19:42:58 +0000238 print "skipping test", name
239 continue
Guido van Rossum6c612421997-09-06 18:42:57 +0000240 print "running test", name
241 runtest(hier, code)
Guido van Rossum5f4fb911998-05-19 15:09:42 +0000242
243# Test
244import sys
245import imp
246try:
247 import sys.imp
248except ImportError:
249 # This is what we expect
250 pass
251else:
252 raise TestFailed, "No ImportError exception on 'import sys.imp'"