Index: Lib/test/test_with.py =================================================================== --- Lib/test/test_with.py (revision 72182) +++ Lib/test/test_with.py (working copy) @@ -654,12 +654,70 @@ self.fail("ZeroDivisionError should have been raised") +class NestedWith(unittest.TestCase): + + class Dummy(object): + def __init__(self, value=None): + if value is None: + value = self + self.value = value + self.enter_called = False + self.exit_called = False + + def __enter__(self): + self.enter_called = True + return self.value + + def __exit__(self, *exc_info): + self.exit_called = True + + class CtorThrows(object): + def __init__(self): raise RuntimeError() + + class EnterThrows(object): + def __enter__(self): raise RuntimeError() + def __exit__(self, *exc_info): pass + + def testNoExceptions(self): + with self.Dummy() as a, self.Dummy() as b: + self.assertTrue(a.enter_called) + self.assertTrue(b.enter_called) + self.assertTrue(a.exit_called) + self.assertTrue(b.exit_called) + + def testExceptionInExprList(self): + try: + with self.Dummy() as a, self.CtorThrows(): + pass + except: + pass + self.assertTrue(a.enter_called) + self.assertTrue(a.exit_called) + + def testExceptionInEnter(self): + try: + with self.Dummy() as a, self.EnterThrows(): + pass + except: + pass + self.assertTrue(a.enter_called) + self.assertTrue(a.exit_called) + + def testEnterReturnsTuple(self): + with self.Dummy(value=(1,2)) as (a1, a2), \ + self.Dummy(value=(10, 20)) as (b1, b2): + self.assertEquals(1, a1) + self.assertEquals(2, a2) + self.assertEquals(10, b1) + self.assertEquals(20, b2) + def test_main(): run_unittest(FailureTestCase, NonexceptionalTestCase, NestedNonexceptionalTestCase, ExceptionalTestCase, NonLocalFlowControlTestCase, AssignmentTargetTestCase, - ExitSwallowsExceptionTestCase) + ExitSwallowsExceptionTestCase, + NestedWith) if __name__ == '__main__':