14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#!/usr/bin/env python
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""Unit tests for the with statement specified in PEP 343."""
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao__author__ = "Mike Bland"
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao__email__ = "mbland at acm dot org"
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport sys
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport unittest
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom collections import deque
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom contextlib import GeneratorContextManager, contextmanager
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom test.test_support import run_unittest
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass MockContextManager(GeneratorContextManager):
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, gen):
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        GeneratorContextManager.__init__(self, gen)
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.enter_called = False
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.exit_called = False
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.exit_args = None
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __enter__(self):
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.enter_called = True
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return GeneratorContextManager.__enter__(self)
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __exit__(self, type, value, traceback):
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.exit_called = True
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.exit_args = (type, value, traceback)
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return GeneratorContextManager.__exit__(self, type,
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                                value, traceback)
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef mock_contextmanager(func):
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def helper(*args, **kwds):
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return MockContextManager(func(*args, **kwds))
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return helper
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass MockResource(object):
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self):
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.yielded = False
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.stopped = False
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao@mock_contextmanager
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef mock_contextmanager_generator():
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    mock = MockResource()
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    try:
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mock.yielded = True
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        yield mock
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    finally:
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mock.stopped = True
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass Nested(object):
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, *managers):
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.managers = managers
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.entered = None
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __enter__(self):
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.entered is not None:
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise RuntimeError("Context is not reentrant")
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.entered = deque()
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        vars = []
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for mgr in self.managers:
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                vars.append(mgr.__enter__())
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.entered.appendleft(mgr)
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except:
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if not self.__exit__(*sys.exc_info()):
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return vars
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __exit__(self, *exc_info):
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Behave like nested with statements
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # first in, last out
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # New exceptions override old ones
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ex = exc_info
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for mgr in self.entered:
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if mgr.__exit__(*ex):
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    ex = (None, None, None)
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except:
864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                ex = sys.exc_info()
874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.entered = None
884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if ex is not exc_info:
894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ex[0], ex[1], ex[2]
904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass MockNested(Nested):
934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, *managers):
944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Nested.__init__(self, *managers)
954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.enter_called = False
964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.exit_called = False
974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.exit_args = None
984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __enter__(self):
1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.enter_called = True
1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return Nested.__enter__(self)
1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __exit__(self, *exc_info):
1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.exit_called = True
1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.exit_args = exc_info
1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return Nested.__exit__(self, *exc_info)
1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass FailureTestCase(unittest.TestCase):
1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testNameError(self):
1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def fooNotDeclared():
1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with foo: pass
1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(NameError, fooNotDeclared)
1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testEnterAttributeError(self):
1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class LacksEnter(object):
1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __exit__(self, type, value, traceback):
1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                pass
1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def fooLacksEnter():
1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            foo = LacksEnter()
1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with foo: pass
1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(AttributeError, fooLacksEnter)
1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testExitAttributeError(self):
1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class LacksExit(object):
1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __enter__(self):
1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                pass
1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def fooLacksExit():
1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            foo = LacksExit()
1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with foo: pass
1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(AttributeError, fooLacksExit)
1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def assertRaisesSyntaxError(self, codestr):
1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def shouldRaiseSyntaxError(s):
1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            compile(s, '', 'single')
1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(SyntaxError, shouldRaiseSyntaxError, codestr)
1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testAssignmentToNoneError(self):
1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaisesSyntaxError('with mock as None:\n  pass')
1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaisesSyntaxError(
1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'with mock as (None):\n'
1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            '  pass')
1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testAssignmentToEmptyTupleError(self):
1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaisesSyntaxError(
1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'with mock as ():\n'
1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            '  pass')
1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testAssignmentToTupleOnlyContainingNoneError(self):
1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaisesSyntaxError('with mock as None,:\n  pass')
1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaisesSyntaxError(
1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'with mock as (None,):\n'
1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            '  pass')
1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testAssignmentToTupleContainingNoneError(self):
1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaisesSyntaxError(
1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'with mock as (foo, None, bar):\n'
1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            '  pass')
1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testEnterThrows(self):
1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class EnterThrows(object):
1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __enter__(self):
1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise RuntimeError("Enter threw")
1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __exit__(self, *args):
1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                pass
1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def shouldThrow():
1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ct = EnterThrows()
1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.foo = None
1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with ct as self.foo:
1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                pass
1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(RuntimeError, shouldThrow)
1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.foo, None)
1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testExitThrows(self):
1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class ExitThrows(object):
1794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __enter__(self):
1804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return
1814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __exit__(self, *args):
1824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise RuntimeError(42)
1834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def shouldThrow():
1844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with ExitThrows():
1854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                pass
1864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(RuntimeError, shouldThrow)
1874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass ContextmanagerAssertionMixin(object):
1894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    TEST_EXCEPTION = RuntimeError("test exception")
1904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def assertInWithManagerInvariants(self, mock_manager):
1924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(mock_manager.enter_called)
1934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(mock_manager.exit_called)
1944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(mock_manager.exit_args, None)
1954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def assertAfterWithManagerInvariants(self, mock_manager, exit_args):
1974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(mock_manager.enter_called)
1984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(mock_manager.exit_called)
1994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(mock_manager.exit_args, exit_args)
2004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def assertAfterWithManagerInvariantsNoError(self, mock_manager):
2024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithManagerInvariants(mock_manager,
2034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            (None, None, None))
2044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def assertInWithGeneratorInvariants(self, mock_generator):
2064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(mock_generator.yielded)
2074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(mock_generator.stopped)
2084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def assertAfterWithGeneratorInvariantsNoError(self, mock_generator):
2104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(mock_generator.yielded)
2114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(mock_generator.stopped)
2124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def raiseTestException(self):
2144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raise self.TEST_EXCEPTION
2154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def assertAfterWithManagerInvariantsWithError(self, mock_manager,
2174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                                  exc_type=None):
2184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(mock_manager.enter_called)
2194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(mock_manager.exit_called)
2204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if exc_type is None:
2214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(mock_manager.exit_args[1], self.TEST_EXCEPTION)
2224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            exc_type = type(self.TEST_EXCEPTION)
2234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(mock_manager.exit_args[0], exc_type)
2244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test the __exit__ arguments. Issue #7853
2254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIsInstance(mock_manager.exit_args[1], exc_type)
2264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIsNot(mock_manager.exit_args[2], None)
2274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def assertAfterWithGeneratorInvariantsWithError(self, mock_generator):
2294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(mock_generator.yielded)
2304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(mock_generator.stopped)
2314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass NonexceptionalTestCase(unittest.TestCase, ContextmanagerAssertionMixin):
2344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testInlineGeneratorSyntax(self):
2354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with mock_contextmanager_generator():
2364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
2374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testUnboundGenerator(self):
2394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mock = mock_contextmanager_generator()
2404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with mock:
2414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
2424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithManagerInvariantsNoError(mock)
2434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testInlineGeneratorBoundSyntax(self):
2454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with mock_contextmanager_generator() as foo:
2464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertInWithGeneratorInvariants(foo)
2474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # FIXME: In the future, we'll try to keep the bound names from leaking
2484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithGeneratorInvariantsNoError(foo)
2494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testInlineGeneratorBoundToExistingVariable(self):
2514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        foo = None
2524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with mock_contextmanager_generator() as foo:
2534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertInWithGeneratorInvariants(foo)
2544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithGeneratorInvariantsNoError(foo)
2554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testInlineGeneratorBoundToDottedVariable(self):
2574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with mock_contextmanager_generator() as self.foo:
2584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertInWithGeneratorInvariants(self.foo)
2594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithGeneratorInvariantsNoError(self.foo)
2604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testBoundGenerator(self):
2624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mock = mock_contextmanager_generator()
2634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with mock as foo:
2644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertInWithGeneratorInvariants(foo)
2654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertInWithManagerInvariants(mock)
2664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithGeneratorInvariantsNoError(foo)
2674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithManagerInvariantsNoError(mock)
2684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testNestedSingleStatements(self):
2704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mock_a = mock_contextmanager_generator()
2714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with mock_a as foo:
2724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            mock_b = mock_contextmanager_generator()
2734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with mock_b as bar:
2744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertInWithManagerInvariants(mock_a)
2754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertInWithManagerInvariants(mock_b)
2764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertInWithGeneratorInvariants(foo)
2774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertInWithGeneratorInvariants(bar)
2784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertAfterWithManagerInvariantsNoError(mock_b)
2794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertAfterWithGeneratorInvariantsNoError(bar)
2804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertInWithManagerInvariants(mock_a)
2814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertInWithGeneratorInvariants(foo)
2824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithManagerInvariantsNoError(mock_a)
2834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithGeneratorInvariantsNoError(foo)
2844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass NestedNonexceptionalTestCase(unittest.TestCase,
2874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ContextmanagerAssertionMixin):
2884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testSingleArgInlineGeneratorSyntax(self):
2894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with Nested(mock_contextmanager_generator()):
2904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
2914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testSingleArgBoundToNonTuple(self):
2934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        m = mock_contextmanager_generator()
2944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # This will bind all the arguments to nested() into a single list
2954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # assigned to foo.
2964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with Nested(m) as foo:
2974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertInWithManagerInvariants(m)
2984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithManagerInvariantsNoError(m)
2994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testSingleArgBoundToSingleElementParenthesizedList(self):
3014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        m = mock_contextmanager_generator()
3024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # This will bind all the arguments to nested() into a single list
3034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # assigned to foo.
3044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with Nested(m) as (foo):
3054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertInWithManagerInvariants(m)
3064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithManagerInvariantsNoError(m)
3074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testSingleArgBoundToMultipleElementTupleError(self):
3094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def shouldThrowValueError():
3104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with Nested(mock_contextmanager_generator()) as (foo, bar):
3114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                pass
3124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, shouldThrowValueError)
3134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testSingleArgUnbound(self):
3154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mock_contextmanager = mock_contextmanager_generator()
3164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mock_nested = MockNested(mock_contextmanager)
3174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with mock_nested:
3184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertInWithManagerInvariants(mock_contextmanager)
3194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertInWithManagerInvariants(mock_nested)
3204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithManagerInvariantsNoError(mock_contextmanager)
3214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithManagerInvariantsNoError(mock_nested)
3224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testMultipleArgUnbound(self):
3244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        m = mock_contextmanager_generator()
3254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        n = mock_contextmanager_generator()
3264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        o = mock_contextmanager_generator()
3274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mock_nested = MockNested(m, n, o)
3284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with mock_nested:
3294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertInWithManagerInvariants(m)
3304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertInWithManagerInvariants(n)
3314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertInWithManagerInvariants(o)
3324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertInWithManagerInvariants(mock_nested)
3334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithManagerInvariantsNoError(m)
3344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithManagerInvariantsNoError(n)
3354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithManagerInvariantsNoError(o)
3364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithManagerInvariantsNoError(mock_nested)
3374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testMultipleArgBound(self):
3394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mock_nested = MockNested(mock_contextmanager_generator(),
3404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            mock_contextmanager_generator(), mock_contextmanager_generator())
3414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with mock_nested as (m, n, o):
3424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertInWithGeneratorInvariants(m)
3434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertInWithGeneratorInvariants(n)
3444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertInWithGeneratorInvariants(o)
3454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertInWithManagerInvariants(mock_nested)
3464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithGeneratorInvariantsNoError(m)
3474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithGeneratorInvariantsNoError(n)
3484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithGeneratorInvariantsNoError(o)
3494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithManagerInvariantsNoError(mock_nested)
3504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass ExceptionalTestCase(unittest.TestCase, ContextmanagerAssertionMixin):
3534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testSingleResource(self):
3544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cm = mock_contextmanager_generator()
3554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def shouldThrow():
3564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with cm as self.resource:
3574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertInWithManagerInvariants(cm)
3584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertInWithGeneratorInvariants(self.resource)
3594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.raiseTestException()
3604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(RuntimeError, shouldThrow)
3614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithManagerInvariantsWithError(cm)
3624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithGeneratorInvariantsWithError(self.resource)
3634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testExceptionNormalized(self):
3654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cm = mock_contextmanager_generator()
3664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def shouldThrow():
3674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with cm as self.resource:
3684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # Note this relies on the fact that 1 // 0 produces an exception
3694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # that is not normalized immediately.
3704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                1 // 0
3714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ZeroDivisionError, shouldThrow)
3724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithManagerInvariantsWithError(cm, ZeroDivisionError)
3734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testNestedSingleStatements(self):
3754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mock_a = mock_contextmanager_generator()
3764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mock_b = mock_contextmanager_generator()
3774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def shouldThrow():
3784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with mock_a as self.foo:
3794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                with mock_b as self.bar:
3804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.assertInWithManagerInvariants(mock_a)
3814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.assertInWithManagerInvariants(mock_b)
3824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.assertInWithGeneratorInvariants(self.foo)
3834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.assertInWithGeneratorInvariants(self.bar)
3844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.raiseTestException()
3854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(RuntimeError, shouldThrow)
3864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithManagerInvariantsWithError(mock_a)
3874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithManagerInvariantsWithError(mock_b)
3884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithGeneratorInvariantsWithError(self.foo)
3894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithGeneratorInvariantsWithError(self.bar)
3904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testMultipleResourcesInSingleStatement(self):
3924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cm_a = mock_contextmanager_generator()
3934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cm_b = mock_contextmanager_generator()
3944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mock_nested = MockNested(cm_a, cm_b)
3954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def shouldThrow():
3964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with mock_nested as (self.resource_a, self.resource_b):
3974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertInWithManagerInvariants(cm_a)
3984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertInWithManagerInvariants(cm_b)
3994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertInWithManagerInvariants(mock_nested)
4004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertInWithGeneratorInvariants(self.resource_a)
4014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertInWithGeneratorInvariants(self.resource_b)
4024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.raiseTestException()
4034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(RuntimeError, shouldThrow)
4044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithManagerInvariantsWithError(cm_a)
4054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithManagerInvariantsWithError(cm_b)
4064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithManagerInvariantsWithError(mock_nested)
4074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithGeneratorInvariantsWithError(self.resource_a)
4084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithGeneratorInvariantsWithError(self.resource_b)
4094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testNestedExceptionBeforeInnerStatement(self):
4114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mock_a = mock_contextmanager_generator()
4124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mock_b = mock_contextmanager_generator()
4134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.bar = None
4144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def shouldThrow():
4154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with mock_a as self.foo:
4164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertInWithManagerInvariants(mock_a)
4174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertInWithGeneratorInvariants(self.foo)
4184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.raiseTestException()
4194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                with mock_b as self.bar:
4204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    pass
4214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(RuntimeError, shouldThrow)
4224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithManagerInvariantsWithError(mock_a)
4234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithGeneratorInvariantsWithError(self.foo)
4244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # The inner statement stuff should never have been touched
4264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.bar, None)
4274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(mock_b.enter_called)
4284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(mock_b.exit_called)
4294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(mock_b.exit_args, None)
4304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testNestedExceptionAfterInnerStatement(self):
4324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mock_a = mock_contextmanager_generator()
4334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mock_b = mock_contextmanager_generator()
4344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def shouldThrow():
4354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with mock_a as self.foo:
4364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                with mock_b as self.bar:
4374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.assertInWithManagerInvariants(mock_a)
4384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.assertInWithManagerInvariants(mock_b)
4394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.assertInWithGeneratorInvariants(self.foo)
4404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.assertInWithGeneratorInvariants(self.bar)
4414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.raiseTestException()
4424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(RuntimeError, shouldThrow)
4434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithManagerInvariantsWithError(mock_a)
4444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithManagerInvariantsNoError(mock_b)
4454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithGeneratorInvariantsWithError(self.foo)
4464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertAfterWithGeneratorInvariantsNoError(self.bar)
4474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testRaisedStopIteration1(self):
4494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # From bug 1462485
4504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        @contextmanager
4514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def cm():
4524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            yield
4534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def shouldThrow():
4554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with cm():
4564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise StopIteration("from with")
4574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(StopIteration, shouldThrow)
4594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testRaisedStopIteration2(self):
4614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # From bug 1462485
4624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class cm(object):
4634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __enter__(self):
4644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                pass
4654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __exit__(self, type, value, traceback):
4664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                pass
4674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def shouldThrow():
4694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with cm():
4704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise StopIteration("from with")
4714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(StopIteration, shouldThrow)
4734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testRaisedStopIteration3(self):
4754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Another variant where the exception hasn't been instantiated
4764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # From bug 1705170
4774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        @contextmanager
4784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def cm():
4794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            yield
4804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def shouldThrow():
4824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with cm():
4834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise iter([]).next()
4844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(StopIteration, shouldThrow)
4864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testRaisedGeneratorExit1(self):
4884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # From bug 1462485
4894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        @contextmanager
4904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def cm():
4914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            yield
4924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def shouldThrow():
4944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with cm():
4954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise GeneratorExit("from with")
4964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(GeneratorExit, shouldThrow)
4984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testRaisedGeneratorExit2(self):
5004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # From bug 1462485
5014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class cm (object):
5024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __enter__(self):
5034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                pass
5044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __exit__(self, type, value, traceback):
5054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                pass
5064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def shouldThrow():
5084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with cm():
5094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise GeneratorExit("from with")
5104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(GeneratorExit, shouldThrow)
5124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testErrorsInBool(self):
5144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # issue4589: __exit__ return code may raise an exception
5154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # when looking at its truth value.
5164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class cm(object):
5184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __init__(self, bool_conversion):
5194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                class Bool:
5204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    def __nonzero__(self):
5214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        return bool_conversion()
5224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.exit_result = Bool()
5234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __enter__(self):
5244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return 3
5254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __exit__(self, a, b, c):
5264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return self.exit_result
5274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def trueAsBool():
5294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with cm(lambda: True):
5304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.fail("Should NOT see this")
5314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        trueAsBool()
5324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def falseAsBool():
5344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with cm(lambda: False):
5354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.fail("Should raise")
5364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(AssertionError, falseAsBool)
5374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def failAsBool():
5394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with cm(lambda: 1 // 0):
5404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.fail("Should NOT see this")
5414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ZeroDivisionError, failAsBool)
5424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass NonLocalFlowControlTestCase(unittest.TestCase):
5454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testWithBreak(self):
5474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        counter = 0
5484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        while True:
5494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            counter += 1
5504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with mock_contextmanager_generator():
5514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                counter += 10
5524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                break
5534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            counter += 100 # Not reached
5544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(counter, 11)
5554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testWithContinue(self):
5574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        counter = 0
5584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        while True:
5594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            counter += 1
5604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if counter > 2:
5614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                break
5624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with mock_contextmanager_generator():
5634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                counter += 10
5644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                continue
5654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            counter += 100 # Not reached
5664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(counter, 12)
5674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testWithReturn(self):
5694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def foo():
5704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            counter = 0
5714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            while True:
5724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                counter += 1
5734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                with mock_contextmanager_generator():
5744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    counter += 10
5754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    return counter
5764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                counter += 100 # Not reached
5774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(foo(), 11)
5784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testWithYield(self):
5804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def gen():
5814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with mock_contextmanager_generator():
5824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                yield 12
5834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                yield 13
5844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = list(gen())
5854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x, [12, 13])
5864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testWithRaise(self):
5884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        counter = 0
5894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
5904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            counter += 1
5914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with mock_contextmanager_generator():
5924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                counter += 10
5934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise RuntimeError
5944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            counter += 100 # Not reached
5954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except RuntimeError:
5964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(counter, 11)
5974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
5984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.fail("Didn't raise RuntimeError")
5994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass AssignmentTargetTestCase(unittest.TestCase):
6024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testSingleComplexTarget(self):
6044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        targets = {1: [0, 1, 2]}
6054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with mock_contextmanager_generator() as targets[1][0]:
6064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(targets.keys(), [1])
6074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(targets[1][0].__class__, MockResource)
6084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with mock_contextmanager_generator() as targets.values()[0][1]:
6094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(targets.keys(), [1])
6104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(targets[1][1].__class__, MockResource)
6114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with mock_contextmanager_generator() as targets[2]:
6124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            keys = targets.keys()
6134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            keys.sort()
6144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(keys, [1, 2])
6154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class C: pass
6164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        blah = C()
6174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with mock_contextmanager_generator() as blah.foo:
6184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(hasattr(blah, "foo"), True)
6194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testMultipleComplexTargets(self):
6214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class C:
6224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __enter__(self): return 1, 2, 3
6234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __exit__(self, t, v, tb): pass
6244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        targets = {1: [0, 1, 2]}
6254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with C() as (targets[1][0], targets[1][1], targets[1][2]):
6264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(targets, {1: [1, 2, 3]})
6274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with C() as (targets.values()[0][2], targets.values()[0][1], targets.values()[0][0]):
6284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(targets, {1: [3, 2, 1]})
6294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with C() as (targets[1], targets[2], targets[3]):
6304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(targets, {1: 1, 2: 2, 3: 3})
6314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class B: pass
6324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        blah = B()
6334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with C() as (blah.one, blah.two, blah.three):
6344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(blah.one, 1)
6354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(blah.two, 2)
6364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(blah.three, 3)
6374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass ExitSwallowsExceptionTestCase(unittest.TestCase):
6404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testExitTrueSwallowsException(self):
6424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class AfricanSwallow:
6434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __enter__(self): pass
6444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __exit__(self, t, v, tb): return True
6454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
6464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with AfricanSwallow():
6474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                1 // 0
6484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except ZeroDivisionError:
6494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.fail("ZeroDivisionError should have been swallowed")
6504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testExitFalseDoesntSwallowException(self):
6524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class EuropeanSwallow:
6534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __enter__(self): pass
6544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __exit__(self, t, v, tb): return False
6554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
6564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with EuropeanSwallow():
6574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                1 // 0
6584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except ZeroDivisionError:
6594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
6604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
6614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.fail("ZeroDivisionError should have been raised")
6624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass NestedWith(unittest.TestCase):
6654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    class Dummy(object):
6674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __init__(self, value=None, gobble=False):
6684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if value is None:
6694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                value = self
6704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.value = value
6714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.gobble = gobble
6724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.enter_called = False
6734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.exit_called = False
6744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __enter__(self):
6764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.enter_called = True
6774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self.value
6784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __exit__(self, *exc_info):
6804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.exit_called = True
6814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.exc_info = exc_info
6824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if self.gobble:
6834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return True
6844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    class InitRaises(object):
6864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __init__(self): raise RuntimeError()
6874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    class EnterRaises(object):
6894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __enter__(self): raise RuntimeError()
6904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __exit__(self, *exc_info): pass
6914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    class ExitRaises(object):
6934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __enter__(self): pass
6944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __exit__(self, *exc_info): raise RuntimeError()
6954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testNoExceptions(self):
6974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with self.Dummy() as a, self.Dummy() as b:
6984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTrue(a.enter_called)
6994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTrue(b.enter_called)
7004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(a.exit_called)
7014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(b.exit_called)
7024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testExceptionInExprList(self):
7044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
7054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with self.Dummy() as a, self.InitRaises():
7064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                pass
7074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except:
7084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
7094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(a.enter_called)
7104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(a.exit_called)
7114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testExceptionInEnter(self):
7134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
7144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with self.Dummy() as a, self.EnterRaises():
7154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.fail('body of bad with executed')
7164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except RuntimeError:
7174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
7184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
7194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.fail('RuntimeError not reraised')
7204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(a.enter_called)
7214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(a.exit_called)
7224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testExceptionInExit(self):
7244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        body_executed = False
7254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with self.Dummy(gobble=True) as a, self.ExitRaises():
7264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            body_executed = True
7274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(a.enter_called)
7284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(a.exit_called)
7294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(body_executed)
7304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotEqual(a.exc_info[0], None)
7314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testEnterReturnsTuple(self):
7334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with self.Dummy(value=(1,2)) as (a1, a2), \
7344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao             self.Dummy(value=(10, 20)) as (b1, b2):
7354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(1, a1)
7364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(2, a2)
7374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(10, b1)
7384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(20, b2)
7394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef test_main():
7414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    run_unittest(FailureTestCase, NonexceptionalTestCase,
7424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                 NestedNonexceptionalTestCase, ExceptionalTestCase,
7434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                 NonLocalFlowControlTestCase,
7444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                 AssignmentTargetTestCase,
7454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                 ExitSwallowsExceptionTestCase,
7464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                 NestedWith)
7474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == '__main__':
7504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    test_main()
751