Commit | Line | Data |
---|---|---|
920dae64 AT |
1 | # -*- coding: iso-8859-1 -*- |
2 | import unittest, test.test_support | |
3 | import sys, cStringIO | |
4 | ||
5 | class SysModuleTest(unittest.TestCase): | |
6 | ||
7 | def test_original_displayhook(self): | |
8 | import __builtin__ | |
9 | savestdout = sys.stdout | |
10 | out = cStringIO.StringIO() | |
11 | sys.stdout = out | |
12 | ||
13 | dh = sys.__displayhook__ | |
14 | ||
15 | self.assertRaises(TypeError, dh) | |
16 | if hasattr(__builtin__, "_"): | |
17 | del __builtin__._ | |
18 | ||
19 | dh(None) | |
20 | self.assertEqual(out.getvalue(), "") | |
21 | self.assert_(not hasattr(__builtin__, "_")) | |
22 | dh(42) | |
23 | self.assertEqual(out.getvalue(), "42\n") | |
24 | self.assertEqual(__builtin__._, 42) | |
25 | ||
26 | del sys.stdout | |
27 | self.assertRaises(RuntimeError, dh, 42) | |
28 | ||
29 | sys.stdout = savestdout | |
30 | ||
31 | def test_lost_displayhook(self): | |
32 | olddisplayhook = sys.displayhook | |
33 | del sys.displayhook | |
34 | code = compile("42", "<string>", "single") | |
35 | self.assertRaises(RuntimeError, eval, code) | |
36 | sys.displayhook = olddisplayhook | |
37 | ||
38 | def test_custom_displayhook(self): | |
39 | olddisplayhook = sys.displayhook | |
40 | def baddisplayhook(obj): | |
41 | raise ValueError | |
42 | sys.displayhook = baddisplayhook | |
43 | code = compile("42", "<string>", "single") | |
44 | self.assertRaises(ValueError, eval, code) | |
45 | sys.displayhook = olddisplayhook | |
46 | ||
47 | def test_original_excepthook(self): | |
48 | savestderr = sys.stderr | |
49 | err = cStringIO.StringIO() | |
50 | sys.stderr = err | |
51 | ||
52 | eh = sys.__excepthook__ | |
53 | ||
54 | self.assertRaises(TypeError, eh) | |
55 | try: | |
56 | raise ValueError(42) | |
57 | except ValueError, exc: | |
58 | eh(*sys.exc_info()) | |
59 | ||
60 | sys.stderr = savestderr | |
61 | self.assert_(err.getvalue().endswith("ValueError: 42\n")) | |
62 | ||
63 | # FIXME: testing the code for a lost or replaced excepthook in | |
64 | # Python/pythonrun.c::PyErr_PrintEx() is tricky. | |
65 | ||
66 | def test_exc_clear(self): | |
67 | self.assertRaises(TypeError, sys.exc_clear, 42) | |
68 | ||
69 | # Verify that exc_info is present and matches exc, then clear it, and | |
70 | # check that it worked. | |
71 | def clear_check(exc): | |
72 | typ, value, traceback = sys.exc_info() | |
73 | self.assert_(typ is not None) | |
74 | self.assert_(value is exc) | |
75 | self.assert_(traceback is not None) | |
76 | ||
77 | sys.exc_clear() | |
78 | ||
79 | typ, value, traceback = sys.exc_info() | |
80 | self.assert_(typ is None) | |
81 | self.assert_(value is None) | |
82 | self.assert_(traceback is None) | |
83 | ||
84 | def clear(): | |
85 | try: | |
86 | raise ValueError, 42 | |
87 | except ValueError, exc: | |
88 | clear_check(exc) | |
89 | ||
90 | # Raise an exception and check that it can be cleared | |
91 | clear() | |
92 | ||
93 | # Verify that a frame currently handling an exception is | |
94 | # unaffected by calling exc_clear in a nested frame. | |
95 | try: | |
96 | raise ValueError, 13 | |
97 | except ValueError, exc: | |
98 | typ1, value1, traceback1 = sys.exc_info() | |
99 | clear() | |
100 | typ2, value2, traceback2 = sys.exc_info() | |
101 | ||
102 | self.assert_(typ1 is typ2) | |
103 | self.assert_(value1 is exc) | |
104 | self.assert_(value1 is value2) | |
105 | self.assert_(traceback1 is traceback2) | |
106 | ||
107 | # Check that an exception can be cleared outside of an except block | |
108 | clear_check(exc) | |
109 | ||
110 | def test_exit(self): | |
111 | self.assertRaises(TypeError, sys.exit, 42, 42) | |
112 | ||
113 | # call without argument | |
114 | try: | |
115 | sys.exit(0) | |
116 | except SystemExit, exc: | |
117 | self.assertEquals(exc.code, 0) | |
118 | except: | |
119 | self.fail("wrong exception") | |
120 | else: | |
121 | self.fail("no exception") | |
122 | ||
123 | # call with tuple argument with one entry | |
124 | # entry will be unpacked | |
125 | try: | |
126 | sys.exit(42) | |
127 | except SystemExit, exc: | |
128 | self.assertEquals(exc.code, 42) | |
129 | except: | |
130 | self.fail("wrong exception") | |
131 | else: | |
132 | self.fail("no exception") | |
133 | ||
134 | # call with integer argument | |
135 | try: | |
136 | sys.exit((42,)) | |
137 | except SystemExit, exc: | |
138 | self.assertEquals(exc.code, 42) | |
139 | except: | |
140 | self.fail("wrong exception") | |
141 | else: | |
142 | self.fail("no exception") | |
143 | ||
144 | # call with string argument | |
145 | try: | |
146 | sys.exit("exit") | |
147 | except SystemExit, exc: | |
148 | self.assertEquals(exc.code, "exit") | |
149 | except: | |
150 | self.fail("wrong exception") | |
151 | else: | |
152 | self.fail("no exception") | |
153 | ||
154 | # call with tuple argument with two entries | |
155 | try: | |
156 | sys.exit((17, 23)) | |
157 | except SystemExit, exc: | |
158 | self.assertEquals(exc.code, (17, 23)) | |
159 | except: | |
160 | self.fail("wrong exception") | |
161 | else: | |
162 | self.fail("no exception") | |
163 | ||
164 | def test_getdefaultencoding(self): | |
165 | if test.test_support.have_unicode: | |
166 | self.assertRaises(TypeError, sys.getdefaultencoding, 42) | |
167 | # can't check more than the type, as the user might have changed it | |
168 | self.assert_(isinstance(sys.getdefaultencoding(), str)) | |
169 | ||
170 | # testing sys.settrace() is done in test_trace.py | |
171 | # testing sys.setprofile() is done in test_profile.py | |
172 | ||
173 | def test_setcheckinterval(self): | |
174 | self.assertRaises(TypeError, sys.setcheckinterval) | |
175 | orig = sys.getcheckinterval() | |
176 | for n in 0, 100, 120, orig: # orig last to restore starting state | |
177 | sys.setcheckinterval(n) | |
178 | self.assertEquals(sys.getcheckinterval(), n) | |
179 | ||
180 | def test_recursionlimit(self): | |
181 | self.assertRaises(TypeError, sys.getrecursionlimit, 42) | |
182 | oldlimit = sys.getrecursionlimit() | |
183 | self.assertRaises(TypeError, sys.setrecursionlimit) | |
184 | self.assertRaises(ValueError, sys.setrecursionlimit, -42) | |
185 | sys.setrecursionlimit(10000) | |
186 | self.assertEqual(sys.getrecursionlimit(), 10000) | |
187 | sys.setrecursionlimit(oldlimit) | |
188 | ||
189 | def test_getwindowsversion(self): | |
190 | if hasattr(sys, "getwindowsversion"): | |
191 | v = sys.getwindowsversion() | |
192 | self.assert_(isinstance(v, tuple)) | |
193 | self.assertEqual(len(v), 5) | |
194 | self.assert_(isinstance(v[0], int)) | |
195 | self.assert_(isinstance(v[1], int)) | |
196 | self.assert_(isinstance(v[2], int)) | |
197 | self.assert_(isinstance(v[3], int)) | |
198 | self.assert_(isinstance(v[4], str)) | |
199 | ||
200 | def test_dlopenflags(self): | |
201 | if hasattr(sys, "setdlopenflags"): | |
202 | self.assert_(hasattr(sys, "getdlopenflags")) | |
203 | self.assertRaises(TypeError, sys.getdlopenflags, 42) | |
204 | oldflags = sys.getdlopenflags() | |
205 | self.assertRaises(TypeError, sys.setdlopenflags) | |
206 | sys.setdlopenflags(oldflags+1) | |
207 | self.assertEqual(sys.getdlopenflags(), oldflags+1) | |
208 | sys.setdlopenflags(oldflags) | |
209 | ||
210 | def test_refcount(self): | |
211 | self.assertRaises(TypeError, sys.getrefcount) | |
212 | c = sys.getrefcount(None) | |
213 | n = None | |
214 | self.assertEqual(sys.getrefcount(None), c+1) | |
215 | del n | |
216 | self.assertEqual(sys.getrefcount(None), c) | |
217 | if hasattr(sys, "gettotalrefcount"): | |
218 | self.assert_(isinstance(sys.gettotalrefcount(), int)) | |
219 | ||
220 | def test_getframe(self): | |
221 | self.assertRaises(TypeError, sys._getframe, 42, 42) | |
222 | self.assertRaises(ValueError, sys._getframe, 2000000000) | |
223 | self.assert_( | |
224 | SysModuleTest.test_getframe.im_func.func_code \ | |
225 | is sys._getframe().f_code | |
226 | ) | |
227 | ||
228 | def test_attributes(self): | |
229 | self.assert_(isinstance(sys.api_version, int)) | |
230 | self.assert_(isinstance(sys.argv, list)) | |
231 | self.assert_(sys.byteorder in ("little", "big")) | |
232 | self.assert_(isinstance(sys.builtin_module_names, tuple)) | |
233 | self.assert_(isinstance(sys.copyright, basestring)) | |
234 | self.assert_(isinstance(sys.exec_prefix, basestring)) | |
235 | self.assert_(isinstance(sys.executable, basestring)) | |
236 | self.assert_(isinstance(sys.hexversion, int)) | |
237 | self.assert_(isinstance(sys.maxint, int)) | |
238 | self.assert_(isinstance(sys.maxunicode, int)) | |
239 | self.assert_(isinstance(sys.platform, basestring)) | |
240 | self.assert_(isinstance(sys.prefix, basestring)) | |
241 | self.assert_(isinstance(sys.version, basestring)) | |
242 | vi = sys.version_info | |
243 | self.assert_(isinstance(vi, tuple)) | |
244 | self.assertEqual(len(vi), 5) | |
245 | self.assert_(isinstance(vi[0], int)) | |
246 | self.assert_(isinstance(vi[1], int)) | |
247 | self.assert_(isinstance(vi[2], int)) | |
248 | self.assert_(vi[3] in ("alpha", "beta", "candidate", "final")) | |
249 | self.assert_(isinstance(vi[4], int)) | |
250 | ||
251 | def test_main(): | |
252 | test.test_support.run_unittest(SysModuleTest) | |
253 | ||
254 | if __name__ == "__main__": | |
255 | test_main() |