blob: dc5b567cd29dafdfdd9c91904832001bf31e6cdd [file] [log] [blame]
Guido van Rossum6c612421997-09-06 18:42:57 +00001# Test packages (dotted-name import)
2
3import sys, os, string, tempfile, traceback
4from os import mkdir, rmdir # Can't test if these fail
5del mkdir, rmdir
6from test_support import verbose
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:
13 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()
26
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:
34 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)
39 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:
56 sys.path.insert(0, root)
57 if verbose: print "sys.path =", sys.path
58 try:
59 execfile(codefile, globals(), {})
60 except:
Guido van Rossum10887a31997-09-07 06:12:11 +000061 traceback.print_exc(file=sys.stdout)
Guido van Rossum6c612421997-09-06 18:42:57 +000062 finally:
63 sys.path[:] = savepath
64 try:
65 cleanout(root)
66 except (os.error, IOError):
67 pass
68 os.remove(codefile)
69
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"""),
168
Guido van Rossum6c612421997-09-06 18:42:57 +0000169]
170
171nontests = [
172 ("x5", [], ("import a" + ".a"*400)),
173 ("x6", [], ("import a" + ".a"*499)),
174 ("x7", [], ("import a" + ".a"*500)),
175 ("x8", [], ("import a" + ".a"*1100)),
176 ("x9", [], ("import " + "a"*400)),
177 ("x10", [], ("import " + "a"*500)),
178 ("x11", [], ("import " + "a"*998)),
179 ("x12", [], ("import " + "a"*999)),
180 ("x13", [], ("import " + "a"*999)),
181 ("x14", [], ("import " + "a"*2000)),
182]
183
184"""XXX Things to test
185
186import package without __init__
187import package with __init__
188__init__ importing submodule
189__init__ importing global module
190__init__ defining variables
191submodule importing other submodule
192submodule importing global module
193submodule import submodule via global name
194from package import submodule
195from package import subpackage
196from package import variable (defined in __init__)
197from package import * (defined in __init__)
198"""
199
200# Run the tests
201
Guido van Rossum10887a31997-09-07 06:12:11 +0000202args = []
203if __name__ == '__main__':
204 args = sys.argv[1:]
205 if args and args[0] == '-q':
206 verbose = 0
207 del args[0]
208
Guido van Rossum6c612421997-09-06 18:42:57 +0000209for name, hier, code in tests:
Guido van Rossum10887a31997-09-07 06:12:11 +0000210 if args and name not in args:
211 print "skipping test", name
212 continue
Guido van Rossum6c612421997-09-06 18:42:57 +0000213 print "running test", name
214 runtest(hier, code)