Ignore:
Timestamp:
Mar 19, 2014, 11:31:01 PM (11 years ago)
Author:
dmik
Message:

python: Merge vendor 2.7.6 to trunk.

Location:
python/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • python/trunk

  • python/trunk/Lib/test/test_with.py

    r2 r391  
    214214        raise self.TEST_EXCEPTION
    215215
    216     def assertAfterWithManagerInvariantsWithError(self, mock_manager):
     216    def assertAfterWithManagerInvariantsWithError(self, mock_manager,
     217                                                  exc_type=None):
    217218        self.assertTrue(mock_manager.enter_called)
    218219        self.assertTrue(mock_manager.exit_called)
    219         self.assertEqual(mock_manager.exit_args[0], RuntimeError)
    220         self.assertEqual(mock_manager.exit_args[1], self.TEST_EXCEPTION)
     220        if exc_type is None:
     221            self.assertEqual(mock_manager.exit_args[1], self.TEST_EXCEPTION)
     222            exc_type = type(self.TEST_EXCEPTION)
     223        self.assertEqual(mock_manager.exit_args[0], exc_type)
     224        # Test the __exit__ arguments. Issue #7853
     225        self.assertIsInstance(mock_manager.exit_args[1], exc_type)
     226        self.assertIsNot(mock_manager.exit_args[2], None)
    221227
    222228    def assertAfterWithGeneratorInvariantsWithError(self, mock_generator):
     
    284290            pass
    285291
    286     def testSingleArgUnbound(self):
    287         mock_contextmanager = mock_contextmanager_generator()
    288         mock_nested = MockNested(mock_contextmanager)
    289         with mock_nested:
    290             self.assertInWithManagerInvariants(mock_contextmanager)
    291             self.assertInWithManagerInvariants(mock_nested)
    292         self.assertAfterWithManagerInvariantsNoError(mock_contextmanager)
    293         self.assertAfterWithManagerInvariantsNoError(mock_nested)
    294 
    295292    def testSingleArgBoundToNonTuple(self):
    296293        m = mock_contextmanager_generator()
     
    365362        self.assertAfterWithGeneratorInvariantsWithError(self.resource)
    366363
     364    def testExceptionNormalized(self):
     365        cm = mock_contextmanager_generator()
     366        def shouldThrow():
     367            with cm as self.resource:
     368                # Note this relies on the fact that 1 // 0 produces an exception
     369                # that is not normalized immediately.
     370                1 // 0
     371        self.assertRaises(ZeroDivisionError, shouldThrow)
     372        self.assertAfterWithManagerInvariantsWithError(cm, ZeroDivisionError)
     373
    367374    def testNestedSingleStatements(self):
    368375        mock_a = mock_contextmanager_generator()
     
    530537
    531538        def failAsBool():
    532             with cm(lambda: 1//0):
     539            with cm(lambda: 1 // 0):
    533540                self.fail("Should NOT see this")
    534541        self.assertRaises(ZeroDivisionError, failAsBool)
     
    638645        try:
    639646            with AfricanSwallow():
    640                 1/0
     647                1 // 0
    641648        except ZeroDivisionError:
    642649            self.fail("ZeroDivisionError should have been swallowed")
     
    648655        try:
    649656            with EuropeanSwallow():
    650                 1/0
     657                1 // 0
    651658        except ZeroDivisionError:
    652659            pass
     
    654661            self.fail("ZeroDivisionError should have been raised")
    655662
     663
     664class NestedWith(unittest.TestCase):
     665
     666    class Dummy(object):
     667        def __init__(self, value=None, gobble=False):
     668            if value is None:
     669                value = self
     670            self.value = value
     671            self.gobble = gobble
     672            self.enter_called = False
     673            self.exit_called = False
     674
     675        def __enter__(self):
     676            self.enter_called = True
     677            return self.value
     678
     679        def __exit__(self, *exc_info):
     680            self.exit_called = True
     681            self.exc_info = exc_info
     682            if self.gobble:
     683                return True
     684
     685    class InitRaises(object):
     686        def __init__(self): raise RuntimeError()
     687
     688    class EnterRaises(object):
     689        def __enter__(self): raise RuntimeError()
     690        def __exit__(self, *exc_info): pass
     691
     692    class ExitRaises(object):
     693        def __enter__(self): pass
     694        def __exit__(self, *exc_info): raise RuntimeError()
     695
     696    def testNoExceptions(self):
     697        with self.Dummy() as a, self.Dummy() as b:
     698            self.assertTrue(a.enter_called)
     699            self.assertTrue(b.enter_called)
     700        self.assertTrue(a.exit_called)
     701        self.assertTrue(b.exit_called)
     702
     703    def testExceptionInExprList(self):
     704        try:
     705            with self.Dummy() as a, self.InitRaises():
     706                pass
     707        except:
     708            pass
     709        self.assertTrue(a.enter_called)
     710        self.assertTrue(a.exit_called)
     711
     712    def testExceptionInEnter(self):
     713        try:
     714            with self.Dummy() as a, self.EnterRaises():
     715                self.fail('body of bad with executed')
     716        except RuntimeError:
     717            pass
     718        else:
     719            self.fail('RuntimeError not reraised')
     720        self.assertTrue(a.enter_called)
     721        self.assertTrue(a.exit_called)
     722
     723    def testExceptionInExit(self):
     724        body_executed = False
     725        with self.Dummy(gobble=True) as a, self.ExitRaises():
     726            body_executed = True
     727        self.assertTrue(a.enter_called)
     728        self.assertTrue(a.exit_called)
     729        self.assertTrue(body_executed)
     730        self.assertNotEqual(a.exc_info[0], None)
     731
     732    def testEnterReturnsTuple(self):
     733        with self.Dummy(value=(1,2)) as (a1, a2), \
     734             self.Dummy(value=(10, 20)) as (b1, b2):
     735            self.assertEqual(1, a1)
     736            self.assertEqual(2, a2)
     737            self.assertEqual(10, b1)
     738            self.assertEqual(20, b2)
    656739
    657740def test_main():
     
    660743                 NonLocalFlowControlTestCase,
    661744                 AssignmentTargetTestCase,
    662                  ExitSwallowsExceptionTestCase)
     745                 ExitSwallowsExceptionTestCase,
     746                 NestedWith)
    663747
    664748
Note: See TracChangeset for help on using the changeset viewer.