3
from __future__ import with_statement
6
name = type(t).__name__
7
return u"<type '%s'>" % name
9
class MyException(Exception):
12
class ContextManager(object):
13
def __init__(self, value, exit_ret = None):
15
self.exit_ret = exit_ret
17
def __exit__(self, a, b, tb):
18
print u"exit", typename(a), typename(b), typename(tb)
30
exit <type 'NoneType'> <type 'NoneType'> <type 'NoneType'>
32
with ContextManager(u"value"):
40
exit <type 'NoneType'> <type 'NoneType'> <type 'NoneType'>
42
with ContextManager(u"value") as x:
49
exit <type 'NoneType'> <type 'NoneType'> <type 'NoneType'>
51
with ContextManager(u"value") as x:
54
def with_exception(exit_ret):
56
>>> with_exception(None)
59
exit <type 'type'> <type 'MyException'> <type 'traceback'>
61
>>> with_exception(True)
64
exit <type 'type'> <type 'MyException'> <type 'traceback'>
67
with ContextManager(u"value", exit_ret=exit_ret) as value:
78
exit <type 'NoneType'> <type 'NoneType'> <type 'NoneType'>
80
with ContextManager((1, 2, (3, (4, 5)))) as (a, b, (c, (d, e))):
88
exit <type 'NoneType'> <type 'NoneType'> <type 'NoneType'>
90
with ContextManager((1, 2, (3, (4, 5)))) as t:
98
exit <type 'NoneType'> <type 'NoneType'> <type 'NoneType'>
101
c = ContextManager(255)
119
exit <type 'NoneType'> <type 'NoneType'> <type 'NoneType'>
120
exit <type 'NoneType'> <type 'NoneType'> <type 'NoneType'>
121
exit <type 'NoneType'> <type 'NoneType'> <type 'NoneType'>
122
exit <type 'NoneType'> <type 'NoneType'> <type 'NoneType'>
123
exit <type 'NoneType'> <type 'NoneType'> <type 'NoneType'>
124
exit <type 'NoneType'> <type 'NoneType'> <type 'NoneType'>
126
with ContextManager(1), ContextManager(2) as x, ContextManager(u'value') as y,\
127
ContextManager(3), ContextManager((1, 2, (3, (4, 5)))) as (a, b, (c, (d, e))):
128
with ContextManager(u'nested') as nested:
134
# Tests borrowed from pyregr test_with.py,
135
# modified to follow the constraints of Cython.
139
def __init__(self, value=None, gobble=False):
144
self.enter_called = False
145
self.exit_called = False
148
self.enter_called = True
151
def __exit__(self, *exc_info):
152
self.exit_called = True
153
self.exc_info = exc_info
157
class InitRaises(object):
158
def __init__(self): raise RuntimeError()
160
class EnterRaises(object):
161
def __enter__(self): raise RuntimeError()
162
def __exit__(self, *exc_info): pass
164
class ExitRaises(object):
165
def __enter__(self): pass
166
def __exit__(self, *exc_info): raise RuntimeError()
168
class NestedWith(unittest.TestCase):
170
>>> NestedWith().runTest()
174
self.testNoExceptions()
175
self.testExceptionInExprList()
176
self.testExceptionInEnter()
177
self.testExceptionInExit()
178
self.testEnterReturnsTuple()
180
def testNoExceptions(self):
181
with Dummy() as a, Dummy() as b:
182
self.assertTrue(a.enter_called)
183
self.assertTrue(b.enter_called)
184
self.assertTrue(a.exit_called)
185
self.assertTrue(b.exit_called)
187
def testExceptionInExprList(self):
189
with Dummy() as a, InitRaises():
193
self.assertTrue(a.enter_called)
194
self.assertTrue(a.exit_called)
196
def testExceptionInEnter(self):
198
with Dummy() as a, EnterRaises():
199
self.fail('body of bad with executed')
203
self.fail('RuntimeError not reraised')
204
self.assertTrue(a.enter_called)
205
self.assertTrue(a.exit_called)
207
def testExceptionInExit(self):
208
body_executed = False
209
with Dummy(gobble=True) as a, ExitRaises():
211
self.assertTrue(a.enter_called)
212
self.assertTrue(a.exit_called)
213
self.assertTrue(body_executed)
214
self.assertNotEqual(a.exc_info[0], None)
216
def testEnterReturnsTuple(self):
217
with Dummy(value=(1,2)) as (a1, a2), \
218
Dummy(value=(10, 20)) as (b1, b2):
219
self.assertEqual(1, a1)
220
self.assertEqual(2, a2)
221
self.assertEqual(10, b1)
222
self.assertEqual(20, b2)