Left: | ||
Right: |
LEFT | RIGHT |
---|---|
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 | 2 |
3 """Unit tests for the with statement specified in PEP 343.""" | 3 """Unit tests for the with statement specified in PEP 343.""" |
4 | 4 |
5 | 5 |
6 __author__ = "Mike Bland" | 6 __author__ = "Mike Bland" |
7 __email__ = "mbland at acm dot org" | 7 __email__ = "mbland at acm dot org" |
8 | 8 |
9 import sys | 9 import sys |
10 import unittest | 10 import unittest |
(...skipping 636 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
647 def __exit__(self, t, v, tb): return False | 647 def __exit__(self, t, v, tb): return False |
648 try: | 648 try: |
649 with EuropeanSwallow(): | 649 with EuropeanSwallow(): |
650 1/0 | 650 1/0 |
651 except ZeroDivisionError: | 651 except ZeroDivisionError: |
652 pass | 652 pass |
653 else: | 653 else: |
654 self.fail("ZeroDivisionError should have been raised") | 654 self.fail("ZeroDivisionError should have been raised") |
655 | 655 |
656 | 656 |
657 class NestedWith(unittest.TestCase): | 657 class NestedWith(unittest.TestCase): |
Benjamin
2009/05/02 18:22:06
You should test that the second's __exit__ is call
Georg
2009/05/02 18:48:00
Done.
| |
658 | 658 |
659 class Dummy(object): | 659 class Dummy(object): |
660 def __init__(self, value=None): | 660 def __init__(self, value=None, gobble=False): |
661 if value is None: | 661 if value is None: |
662 value = self | 662 value = self |
663 self.value = value | 663 self.value = value |
664 self.gobble = gobble | |
664 self.enter_called = False | 665 self.enter_called = False |
665 self.exit_called = False | 666 self.exit_called = False |
666 | 667 |
667 def __enter__(self): | 668 def __enter__(self): |
668 self.enter_called = True | 669 self.enter_called = True |
669 return self.value | 670 return self.value |
670 | 671 |
671 def __exit__(self, *exc_info): | 672 def __exit__(self, *exc_info): |
672 self.exit_called = True | 673 self.exit_called = True |
673 | 674 self.exc_info = exc_info |
674 class CtorThrows(object): | 675 if self.gobble: |
676 return True | |
677 | |
678 class CtorRaises(object): | |
675 def __init__(self): raise RuntimeError() | 679 def __init__(self): raise RuntimeError() |
676 | 680 |
677 class EnterThrows(object): | 681 class EnterRaises(object): |
678 def __enter__(self): raise RuntimeError() | 682 def __enter__(self): raise RuntimeError() |
679 def __exit__(self, *exc_info): pass | 683 def __exit__(self, *exc_info): pass |
684 | |
685 class ExitRaises(object): | |
686 def __enter__(self): pass | |
687 def __exit__(self, *exc_info): raise RuntimeError() | |
680 | 688 |
681 def testNoExceptions(self): | 689 def testNoExceptions(self): |
682 with self.Dummy() as a, self.Dummy() as b: | 690 with self.Dummy() as a, self.Dummy() as b: |
683 self.assertTrue(a.enter_called) | 691 self.assertTrue(a.enter_called) |
684 self.assertTrue(b.enter_called) | 692 self.assertTrue(b.enter_called) |
685 self.assertTrue(a.exit_called) | 693 self.assertTrue(a.exit_called) |
686 self.assertTrue(b.exit_called) | 694 self.assertTrue(b.exit_called) |
687 | 695 |
688 def testExceptionInExprList(self): | 696 def testExceptionInExprList(self): |
689 try: | 697 try: |
690 with self.Dummy() as a, self.CtorThrows(): | 698 with self.Dummy() as a, self.CtorRaises(): |
691 pass | 699 pass |
692 except: | 700 except: |
693 pass | 701 pass |
694 self.assertTrue(a.enter_called) | 702 self.assertTrue(a.enter_called) |
695 self.assertTrue(a.exit_called) | 703 self.assertTrue(a.exit_called) |
696 | 704 |
697 def testExceptionInEnter(self): | 705 def testExceptionInEnter(self): |
698 try: | 706 try: |
699 with self.Dummy() as a, self.EnterThrows(): | 707 with self.Dummy() as a, self.EnterRaises(): |
700 pass | 708 self.fail('body of bad with executed') |
701 except: | 709 except RuntimeError: |
702 pass | 710 pass |
711 else: | |
712 self.fail('RuntimeError not reraised') | |
703 self.assertTrue(a.enter_called) | 713 self.assertTrue(a.enter_called) |
704 self.assertTrue(a.exit_called) | 714 self.assertTrue(a.exit_called) |
705 ········ | 715 |
716 def testExceptionInExit(self): | |
717 body_executed = False | |
718 with self.Dummy(gobble=True) as a, self.ExitRaises(): | |
719 body_executed = True | |
720 self.assertTrue(a.enter_called) | |
721 self.assertTrue(a.exit_called) | |
722 self.assertNotEqual(a.exc_info[0], None) | |
723 | |
706 def testEnterReturnsTuple(self): | 724 def testEnterReturnsTuple(self): |
707 with self.Dummy(value=(1,2)) as (a1, a2), \ | 725 with self.Dummy(value=(1,2)) as (a1, a2), \ |
708 self.Dummy(value=(10, 20)) as (b1, b2): | 726 self.Dummy(value=(10, 20)) as (b1, b2): |
709 self.assertEquals(1, a1) | 727 self.assertEquals(1, a1) |
710 self.assertEquals(2, a2) | 728 self.assertEquals(2, a2) |
711 self.assertEquals(10, b1) | 729 self.assertEquals(10, b1) |
712 self.assertEquals(20, b2) | 730 self.assertEquals(20, b2) |
713 | 731 |
714 def test_main(): | 732 def test_main(): |
715 run_unittest(FailureTestCase, NonexceptionalTestCase, | 733 run_unittest(FailureTestCase, NonexceptionalTestCase, |
716 NestedNonexceptionalTestCase, ExceptionalTestCase, | 734 NestedNonexceptionalTestCase, ExceptionalTestCase, |
717 NonLocalFlowControlTestCase, | 735 NonLocalFlowControlTestCase, |
718 AssignmentTargetTestCase, | 736 AssignmentTargetTestCase, |
719 ExitSwallowsExceptionTestCase, | 737 ExitSwallowsExceptionTestCase, |
720 NestedWith) | 738 NestedWith) |
721 | 739 |
722 | 740 |
723 if __name__ == '__main__': | 741 if __name__ == '__main__': |
724 test_main() | 742 test_main() |
LEFT | RIGHT |