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