blob: f699af40d5191bd4ca7b5e2b52181aaaa570786e [file] [log] [blame]
Guido van Rossum6c612421997-09-06 18:42:57 +00001# Test packages (dotted-name import)
2
Eric S. Raymondfc170b12001-02-09 11:51:27 +00003import sys, os, 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
Marc-André Lemburg36619082001-01-17 19:11:13 +00006from test_support import verify, 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:
Eric S. Raymondfc170b12001-02-09 11:51:27 +000013 comps = name.split()
Guido van Rossum41360a41998-03-26 19:42:58 +000014 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
Barry Warsaw3a9d0612000-09-01 06:53:52 +000045def fixdir(lst):
46 try:
47 lst.remove('__builtins__')
48 except ValueError:
49 pass
50 return lst
51
Guido van Rossum6c612421997-09-06 18:42:57 +000052# Helper to run a test
53
54def runtest(hier, code):
55 root = tempfile.mktemp()
56 mkhier(root, hier)
57 savepath = sys.path[:]
58 codefile = tempfile.mktemp()
59 f = open(codefile, "w")
60 f.write(code)
61 f.close()
62 try:
Guido van Rossum41360a41998-03-26 19:42:58 +000063 sys.path.insert(0, root)
64 if verbose: print "sys.path =", sys.path
65 try:
66 execfile(codefile, globals(), {})
67 except:
68 traceback.print_exc(file=sys.stdout)
Guido van Rossum6c612421997-09-06 18:42:57 +000069 finally:
Guido van Rossum41360a41998-03-26 19:42:58 +000070 sys.path[:] = savepath
71 try:
72 cleanout(root)
73 except (os.error, IOError):
74 pass
75 os.remove(codefile)
Guido van Rossum6c612421997-09-06 18:42:57 +000076
77# Test descriptions
78
79tests = [
Guido van Rossume8d11391997-10-31 18:33:41 +000080 ("t1", [("t1", None), ("t1 __init__.py", "")], "import t1"),
Fred Drake004d5e62000-10-23 17:22:08 +000081
Guido van Rossum6c612421997-09-06 18:42:57 +000082 ("t2", [
83 ("t2", None),
84 ("t2 __init__.py", "'doc for t2'; print __name__, 'loading'"),
85 ("t2 sub", None),
Guido van Rossume8d11391997-10-31 18:33:41 +000086 ("t2 sub __init__.py", ""),
Guido van Rossum6c612421997-09-06 18:42:57 +000087 ("t2 sub subsub", None),
88 ("t2 sub subsub __init__.py", "print __name__, 'loading'; spam = 1"),
89 ],
90"""
91import t2
92print t2.__doc__
93import t2.sub
94import t2.sub.subsub
95print t2.__name__, t2.sub.__name__, t2.sub.subsub.__name__
96import t2
97from t2 import *
98print dir()
99from t2 import sub
100from t2.sub import subsub
101from t2.sub.subsub import spam
102print sub.__name__, subsub.__name__
103print sub.subsub.__name__
104print dir()
105import t2.sub
106import t2.sub.subsub
107print t2.__name__, t2.sub.__name__, t2.sub.subsub.__name__
108from t2 import *
109print dir()
110"""),
Fred Drake004d5e62000-10-23 17:22:08 +0000111
Guido van Rossum6c612421997-09-06 18:42:57 +0000112 ("t3", [
113 ("t3", None),
114 ("t3 __init__.py", "print __name__, 'loading'"),
115 ("t3 sub", None),
Guido van Rossume8d11391997-10-31 18:33:41 +0000116 ("t3 sub __init__.py", ""),
Guido van Rossum6c612421997-09-06 18:42:57 +0000117 ("t3 sub subsub", None),
118 ("t3 sub subsub __init__.py", "print __name__, 'loading'; spam = 1"),
119 ],
120"""
121import t3.sub.subsub
122print t3.__name__, t3.sub.__name__, t3.sub.subsub.__name__
Guido van Rossum81da02e1997-09-06 19:58:53 +0000123reload(t3)
124reload(t3.sub)
125reload(t3.sub.subsub)
Guido van Rossum6c612421997-09-06 18:42:57 +0000126"""),
Fred Drake004d5e62000-10-23 17:22:08 +0000127
Guido van Rossum6c612421997-09-06 18:42:57 +0000128 ("t4", [
129 ("t4.py", "print 'THIS SHOULD NOT BE PRINTED (t4.py)'"),
130 ("t4", None),
131 ("t4 __init__.py", "print __name__, 'loading'"),
132 ("t4 sub.py", "print 'THIS SHOULD NOT BE PRINTED (sub.py)'"),
133 ("t4 sub", None),
Guido van Rossume8d11391997-10-31 18:33:41 +0000134 ("t4 sub __init__.py", ""),
Guido van Rossum6c612421997-09-06 18:42:57 +0000135 ("t4 sub subsub.py", "print 'THIS SHOULD NOT BE PRINTED (subsub.py)'"),
136 ("t4 sub subsub", None),
137 ("t4 sub subsub __init__.py", "print __name__, 'loading'; spam = 1"),
138 ],
139"""
140from t4.sub.subsub import *
141print "t4.sub.subsub.spam =", spam
142"""),
143
144 ("t5", [
145 ("t5", None),
146 ("t5 __init__.py", "import t5.foo"),
147 ("t5 string.py", "print __name__, 'loading'; spam = 1"),
148 ("t5 foo.py",
149 "print __name__, 'loading'; import string; print string.spam"),
150 ],
151"""
Guido van Rossum10887a31997-09-07 06:12:11 +0000152import t5
Guido van Rossum6c612421997-09-06 18:42:57 +0000153from t5 import *
154print dir()
155import t5
Barry Warsaw3a9d0612000-09-01 06:53:52 +0000156print fixdir(dir(t5))
157print fixdir(dir(t5.foo))
158print fixdir(dir(t5.string))
Guido van Rossum6c612421997-09-06 18:42:57 +0000159"""),
160
Guido van Rossumc8bf8841997-09-08 16:06:20 +0000161 ("t6", [
162 ("t6", None),
163 ("t6 __init__.py", "__all__ = ['spam', 'ham', 'eggs']"),
164 ("t6 spam.py", "print __name__, 'loading'"),
165 ("t6 ham.py", "print __name__, 'loading'"),
166 ("t6 eggs.py", "print __name__, 'loading'"),
167 ],
168"""
169import t6
Barry Warsaw3a9d0612000-09-01 06:53:52 +0000170print fixdir(dir(t6))
Guido van Rossumc8bf8841997-09-08 16:06:20 +0000171from t6 import *
Barry Warsaw3a9d0612000-09-01 06:53:52 +0000172print fixdir(dir(t6))
Guido van Rossumc8bf8841997-09-08 16:06:20 +0000173print dir()
174"""),
Fred Drake004d5e62000-10-23 17:22:08 +0000175
Thomas Wouters52152252000-08-17 22:55:00 +0000176 ("t7", [
177 ("t7.py", "print 'Importing t7.py'"),
178 ("t7", None),
179 ("t7 __init__.py", "print __name__, 'loading'"),
180 ("t7 sub.py", "print 'THIS SHOULD NOT BE PRINTED (sub.py)'"),
181 ("t7 sub", None),
182 ("t7 sub __init__.py", ""),
183 ("t7 sub subsub.py", "print 'THIS SHOULD NOT BE PRINTED (subsub.py)'"),
184 ("t7 sub subsub", None),
185 ("t7 sub subsub __init__.py", "print __name__, 'loading'; spam = 1"),
186 ],
187"""
188t7, sub, subsub = None, None, None
189import t7 as tas
Tim Petersd304f442001-01-21 19:51:53 +0000190print fixdir(dir(tas))
Marc-André Lemburg36619082001-01-17 19:11:13 +0000191verify(not t7)
Thomas Wouters52152252000-08-17 22:55:00 +0000192from t7 import sub as subpar
Tim Petersd304f442001-01-21 19:51:53 +0000193print fixdir(dir(subpar))
Marc-André Lemburg36619082001-01-17 19:11:13 +0000194verify(not t7 and not sub)
Thomas Wouters52152252000-08-17 22:55:00 +0000195from t7.sub import subsub as subsubsub
Tim Petersd304f442001-01-21 19:51:53 +0000196print fixdir(dir(subsubsub))
Marc-André Lemburg36619082001-01-17 19:11:13 +0000197verify(not t7 and not sub and not subsub)
Thomas Wouters52152252000-08-17 22:55:00 +0000198from t7.sub.subsub import spam as ham
199print "t7.sub.subsub.spam =", ham
Marc-André Lemburg36619082001-01-17 19:11:13 +0000200verify(not t7 and not sub and not subsub)
Thomas Wouters52152252000-08-17 22:55:00 +0000201"""),
Guido van Rossumc8bf8841997-09-08 16:06:20 +0000202
Guido van Rossum6c612421997-09-06 18:42:57 +0000203]
204
205nontests = [
206 ("x5", [], ("import a" + ".a"*400)),
207 ("x6", [], ("import a" + ".a"*499)),
208 ("x7", [], ("import a" + ".a"*500)),
209 ("x8", [], ("import a" + ".a"*1100)),
210 ("x9", [], ("import " + "a"*400)),
211 ("x10", [], ("import " + "a"*500)),
212 ("x11", [], ("import " + "a"*998)),
213 ("x12", [], ("import " + "a"*999)),
214 ("x13", [], ("import " + "a"*999)),
215 ("x14", [], ("import " + "a"*2000)),
216]
217
218"""XXX Things to test
219
220import package without __init__
221import package with __init__
222__init__ importing submodule
223__init__ importing global module
224__init__ defining variables
225submodule importing other submodule
226submodule importing global module
227submodule import submodule via global name
228from package import submodule
229from package import subpackage
230from package import variable (defined in __init__)
231from package import * (defined in __init__)
232"""
233
234# Run the tests
235
Guido van Rossum10887a31997-09-07 06:12:11 +0000236args = []
237if __name__ == '__main__':
238 args = sys.argv[1:]
239 if args and args[0] == '-q':
Guido van Rossum41360a41998-03-26 19:42:58 +0000240 verbose = 0
241 del args[0]
Guido van Rossum10887a31997-09-07 06:12:11 +0000242
Guido van Rossum6c612421997-09-06 18:42:57 +0000243for name, hier, code in tests:
Guido van Rossum10887a31997-09-07 06:12:11 +0000244 if args and name not in args:
Guido van Rossum41360a41998-03-26 19:42:58 +0000245 print "skipping test", name
246 continue
Guido van Rossum6c612421997-09-06 18:42:57 +0000247 print "running test", name
248 runtest(hier, code)
Guido van Rossum5f4fb911998-05-19 15:09:42 +0000249
250# Test
251import sys
252import imp
253try:
254 import sys.imp
255except ImportError:
256 # This is what we expect
257 pass
258else:
259 raise TestFailed, "No ImportError exception on 'import sys.imp'"