Changeset 391 for python/trunk/Lib/test/test_with.py
- Timestamp:
- Mar 19, 2014, 11:31:01 PM (11 years ago)
- Location:
- python/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
python/trunk
-
Property svn:mergeinfo
set to
/python/vendor/Python-2.7.6 merged eligible /python/vendor/current merged eligible
-
Property svn:mergeinfo
set to
-
python/trunk/Lib/test/test_with.py
r2 r391 214 214 raise self.TEST_EXCEPTION 215 215 216 def assertAfterWithManagerInvariantsWithError(self, mock_manager): 216 def assertAfterWithManagerInvariantsWithError(self, mock_manager, 217 exc_type=None): 217 218 self.assertTrue(mock_manager.enter_called) 218 219 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) 221 227 222 228 def assertAfterWithGeneratorInvariantsWithError(self, mock_generator): … … 284 290 pass 285 291 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 295 292 def testSingleArgBoundToNonTuple(self): 296 293 m = mock_contextmanager_generator() … … 365 362 self.assertAfterWithGeneratorInvariantsWithError(self.resource) 366 363 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 367 374 def testNestedSingleStatements(self): 368 375 mock_a = mock_contextmanager_generator() … … 530 537 531 538 def failAsBool(): 532 with cm(lambda: 1 //0):539 with cm(lambda: 1 // 0): 533 540 self.fail("Should NOT see this") 534 541 self.assertRaises(ZeroDivisionError, failAsBool) … … 638 645 try: 639 646 with AfricanSwallow(): 640 1 /0647 1 // 0 641 648 except ZeroDivisionError: 642 649 self.fail("ZeroDivisionError should have been swallowed") … … 648 655 try: 649 656 with EuropeanSwallow(): 650 1 /0657 1 // 0 651 658 except ZeroDivisionError: 652 659 pass … … 654 661 self.fail("ZeroDivisionError should have been raised") 655 662 663 664 class 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) 656 739 657 740 def test_main(): … … 660 743 NonLocalFlowControlTestCase, 661 744 AssignmentTargetTestCase, 662 ExitSwallowsExceptionTestCase) 745 ExitSwallowsExceptionTestCase, 746 NestedWith) 663 747 664 748
Note:
See TracChangeset
for help on using the changeset viewer.