blob: 5f0070e25d0cbd718aa32d32aad0cf3681e4a5dd [file] [log] [blame]
Collin Winter828f04a2007-08-31 00:04:24 +00001# Copyright 2007 Google, Inc. All Rights Reserved.
2# Licensed to PSF under a Contributor Agreement.
3
4"""Tests for the raise statement."""
5
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006from test import support
Collin Winter828f04a2007-08-31 00:04:24 +00007import sys
8import types
9import unittest
10
11
12def get_tb():
13 try:
14 raise OSError()
15 except:
16 return sys.exc_info()[2]
17
18
Benjamin Petersoneec3d712008-06-11 15:59:43 +000019class Context:
20 def __enter__(self):
21 return self
22 def __exit__(self, exc_type, exc_value, exc_tb):
23 return True
24
25
Collin Winter828f04a2007-08-31 00:04:24 +000026class TestRaise(unittest.TestCase):
27 def test_invalid_reraise(self):
28 try:
29 raise
30 except RuntimeError as e:
31 self.failUnless("No active exception" in str(e))
32 else:
33 self.fail("No exception raised")
34
35 def test_reraise(self):
36 try:
37 try:
38 raise IndexError()
39 except IndexError as e:
40 exc1 = e
41 raise
42 except IndexError as exc2:
43 self.failUnless(exc1 is exc2)
44 else:
45 self.fail("No exception raised")
46
Benjamin Petersoneec3d712008-06-11 15:59:43 +000047 def test_except_reraise(self):
48 def reraise():
49 try:
50 raise TypeError("foo")
51 except:
52 try:
53 raise KeyError("caught")
54 except KeyError:
55 pass
56 raise
57 self.assertRaises(TypeError, reraise)
58
59 def test_finally_reraise(self):
60 def reraise():
61 try:
62 raise TypeError("foo")
63 except:
64 try:
65 raise KeyError("caught")
66 finally:
67 raise
68 self.assertRaises(KeyError, reraise)
69
70 def test_nested_reraise(self):
71 def nested_reraise():
72 raise
73 def reraise():
74 try:
75 raise TypeError("foo")
76 except:
77 nested_reraise()
78 self.assertRaises(TypeError, reraise)
79
80 def test_with_reraise1(self):
81 def reraise():
82 try:
83 raise TypeError("foo")
84 except:
85 with Context():
86 pass
87 raise
88 self.assertRaises(TypeError, reraise)
89
90 def test_with_reraise2(self):
91 def reraise():
92 try:
93 raise TypeError("foo")
94 except:
95 with Context():
96 raise KeyError("caught")
97 raise
98 self.assertRaises(TypeError, reraise)
99
100 def test_yield_reraise(self):
101 def reraise():
102 try:
103 raise TypeError("foo")
104 except:
105 yield 1
106 raise
107 g = reraise()
108 next(g)
109 self.assertRaises(TypeError, lambda: next(g))
110 self.assertRaises(StopIteration, lambda: next(g))
111
Collin Winter1966f1c2007-09-01 20:26:44 +0000112 def test_erroneous_exception(self):
113 class MyException(Exception):
114 def __init__(self):
115 raise RuntimeError()
116
117 try:
118 raise MyException
119 except RuntimeError:
120 pass
121 else:
122 self.fail("No exception raised")
123
Collin Winter828f04a2007-08-31 00:04:24 +0000124
125class TestCause(unittest.TestCase):
126 def test_invalid_cause(self):
127 try:
128 raise IndexError from 5
129 except TypeError as e:
130 self.failUnless("exception cause" in str(e))
131 else:
132 self.fail("No exception raised")
133
134 def test_class_cause(self):
135 try:
136 raise IndexError from KeyError
137 except IndexError as e:
138 self.failUnless(isinstance(e.__cause__, KeyError))
139 else:
140 self.fail("No exception raised")
141
142 def test_instance_cause(self):
143 cause = KeyError()
144 try:
145 raise IndexError from cause
146 except IndexError as e:
147 self.failUnless(e.__cause__ is cause)
148 else:
149 self.fail("No exception raised")
150
Collin Winter1966f1c2007-09-01 20:26:44 +0000151 def test_erroneous_cause(self):
152 class MyException(Exception):
153 def __init__(self):
154 raise RuntimeError()
155
156 try:
157 raise IndexError from MyException
158 except RuntimeError:
159 pass
160 else:
161 self.fail("No exception raised")
162
Collin Winter828f04a2007-08-31 00:04:24 +0000163
164class TestTraceback(unittest.TestCase):
165 def test_sets_traceback(self):
166 try:
167 raise IndexError()
168 except IndexError as e:
169 self.failUnless(isinstance(e.__traceback__, types.TracebackType))
170 else:
171 self.fail("No exception raised")
172
173 def test_accepts_traceback(self):
174 tb = get_tb()
175 try:
176 raise IndexError().with_traceback(tb)
177 except IndexError as e:
178 self.assertNotEqual(e.__traceback__, tb)
179 self.assertEqual(e.__traceback__.tb_next, tb)
180 else:
181 self.fail("No exception raised")
182
183
184# Disabled until context is implemented
185# class TestContext(object):
186# def test_instance_context_bare_raise(self):
187# context = IndexError()
188# try:
189# try:
190# raise context
191# except:
192# raise OSError()
193# except OSError as e:
194# self.assertEqual(e.__context__, context)
195# else:
196# self.fail("No exception raised")
197#
198# def test_class_context_bare_raise(self):
199# context = IndexError
200# try:
201# try:
202# raise context
203# except:
204# raise OSError()
205# except OSError as e:
206# self.assertNotEqual(e.__context__, context)
207# self.failUnless(isinstance(e.__context__, context))
208# else:
209# self.fail("No exception raised")
210
211
212class TestRemovedFunctionality(unittest.TestCase):
213 def test_tuples(self):
214 try:
215 raise (IndexError, KeyError) # This should be a tuple!
216 except TypeError:
217 pass
218 else:
219 self.fail("No exception raised")
220
221 def test_strings(self):
222 try:
223 raise "foo"
224 except TypeError:
225 pass
226 else:
227 self.fail("No exception raised")
228
229
230def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000231 support.run_unittest(__name__)
Collin Winter828f04a2007-08-31 00:04:24 +0000232
Collin Winter828f04a2007-08-31 00:04:24 +0000233if __name__ == "__main__":
234 unittest.main()