Files for 2.1b1 distribution.
[python/dscho.git] / Lib / test / test_pkg.py
blobf699af40d5191bd4ca7b5e2b52181aaaa570786e
1 # Test packages (dotted-name import)
3 import sys, os, tempfile, traceback
4 from os import mkdir, rmdir # Can't test if these fail
5 del mkdir, rmdir
6 from test_support import verify, verbose, TestFailed
8 # Helpers to create and destroy hierarchies.
10 def mkhier(root, descr):
11 mkdir(root)
12 for name, contents in descr:
13 comps = name.split()
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()
27 def mkdir(x):
28 if verbose: print "mkdir", x
29 os.mkdir(x)
31 def 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)
41 def rmdir(x):
42 if verbose: print "rmdir", x
43 os.rmdir(x)
45 def fixdir(lst):
46 try:
47 lst.remove('__builtins__')
48 except ValueError:
49 pass
50 return lst
52 # Helper to run a test
54 def 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:
63 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)
69 finally:
70 sys.path[:] = savepath
71 try:
72 cleanout(root)
73 except (os.error, IOError):
74 pass
75 os.remove(codefile)
77 # Test descriptions
79 tests = [
80 ("t1", [("t1", None), ("t1 __init__.py", "")], "import t1"),
82 ("t2", [
83 ("t2", None),
84 ("t2 __init__.py", "'doc for t2'; print __name__, 'loading'"),
85 ("t2 sub", None),
86 ("t2 sub __init__.py", ""),
87 ("t2 sub subsub", None),
88 ("t2 sub subsub __init__.py", "print __name__, 'loading'; spam = 1"),
90 """
91 import t2
92 print t2.__doc__
93 import t2.sub
94 import t2.sub.subsub
95 print t2.__name__, t2.sub.__name__, t2.sub.subsub.__name__
96 import t2
97 from t2 import *
98 print dir()
99 from t2 import sub
100 from t2.sub import subsub
101 from t2.sub.subsub import spam
102 print sub.__name__, subsub.__name__
103 print sub.subsub.__name__
104 print dir()
105 import t2.sub
106 import t2.sub.subsub
107 print t2.__name__, t2.sub.__name__, t2.sub.subsub.__name__
108 from t2 import *
109 print dir()
110 """),
112 ("t3", [
113 ("t3", None),
114 ("t3 __init__.py", "print __name__, 'loading'"),
115 ("t3 sub", None),
116 ("t3 sub __init__.py", ""),
117 ("t3 sub subsub", None),
118 ("t3 sub subsub __init__.py", "print __name__, 'loading'; spam = 1"),
121 import t3.sub.subsub
122 print t3.__name__, t3.sub.__name__, t3.sub.subsub.__name__
123 reload(t3)
124 reload(t3.sub)
125 reload(t3.sub.subsub)
126 """),
128 ("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),
134 ("t4 sub __init__.py", ""),
135 ("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"),
140 from t4.sub.subsub import *
141 print "t4.sub.subsub.spam =", spam
142 """),
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"),
152 import t5
153 from t5 import *
154 print dir()
155 import t5
156 print fixdir(dir(t5))
157 print fixdir(dir(t5.foo))
158 print fixdir(dir(t5.string))
159 """),
161 ("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'"),
169 import t6
170 print fixdir(dir(t6))
171 from t6 import *
172 print fixdir(dir(t6))
173 print dir()
174 """),
176 ("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"),
188 t7, sub, subsub = None, None, None
189 import t7 as tas
190 print fixdir(dir(tas))
191 verify(not t7)
192 from t7 import sub as subpar
193 print fixdir(dir(subpar))
194 verify(not t7 and not sub)
195 from t7.sub import subsub as subsubsub
196 print fixdir(dir(subsubsub))
197 verify(not t7 and not sub and not subsub)
198 from t7.sub.subsub import spam as ham
199 print "t7.sub.subsub.spam =", ham
200 verify(not t7 and not sub and not subsub)
201 """),
205 nontests = [
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)),
218 """XXX Things to test
220 import package without __init__
221 import package with __init__
222 __init__ importing submodule
223 __init__ importing global module
224 __init__ defining variables
225 submodule importing other submodule
226 submodule importing global module
227 submodule import submodule via global name
228 from package import submodule
229 from package import subpackage
230 from package import variable (defined in __init__)
231 from package import * (defined in __init__)
234 # Run the tests
236 args = []
237 if __name__ == '__main__':
238 args = sys.argv[1:]
239 if args and args[0] == '-q':
240 verbose = 0
241 del args[0]
243 for name, hier, code in tests:
244 if args and name not in args:
245 print "skipping test", name
246 continue
247 print "running test", name
248 runtest(hier, code)
250 # Test
251 import sys
252 import imp
253 try:
254 import sys.imp
255 except ImportError:
256 # This is what we expect
257 pass
258 else:
259 raise TestFailed, "No ImportError exception on 'import sys.imp'"