14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport unittest
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom cStringIO import StringIO
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport pickle
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom .support import LoggingResult, ResultWithNoStartTestRunStopTestRun
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestCleanUp(unittest.TestCase):
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testCleanUp(self):
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class TestableTest(unittest.TestCase):
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def testNothing(self):
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                pass
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test = TestableTest('testNothing')
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(test._cleanups, [])
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        cleanups = []
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def cleanup1(*args, **kwargs):
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            cleanups.append((1, args, kwargs))
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def cleanup2(*args, **kwargs):
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            cleanups.append((2, args, kwargs))
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test.addCleanup(cleanup1, 1, 2, 3, four='hello', five='goodbye')
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test.addCleanup(cleanup2)
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(test._cleanups,
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                         [(cleanup1, (1, 2, 3), dict(four='hello', five='goodbye')),
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                          (cleanup2, (), {})])
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        result = test.doCleanups()
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(result)
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(cleanups, [(2, (), {}), (1, (1, 2, 3),
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                    dict(four='hello', five='goodbye'))])
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testCleanUpWithErrors(self):
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class TestableTest(unittest.TestCase):
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def testNothing(self):
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                pass
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class MockResult(object):
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            errors = []
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def addError(self, test, exc_info):
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.errors.append((test, exc_info))
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        result = MockResult()
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test = TestableTest('testNothing')
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test._resultForDoCleanups = result
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exc1 = Exception('foo')
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        exc2 = Exception('bar')
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def cleanup1():
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            raise exc1
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def cleanup2():
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            raise exc2
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test.addCleanup(cleanup1)
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test.addCleanup(cleanup2)
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertFalse(test.doCleanups())
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (test1, (Type1, instance1, _)), (test2, (Type2, instance2, _)) = reversed(MockResult.errors)
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual((test1, Type1, instance1), (test, Exception, exc1))
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual((test2, Type2, instance2), (test, Exception, exc2))
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testCleanupInRun(self):
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        blowUp = False
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ordering = []
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class TestableTest(unittest.TestCase):
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def setUp(self):
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ordering.append('setUp')
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if blowUp:
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    raise Exception('foo')
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def testNothing(self):
824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ordering.append('test')
834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def tearDown(self):
854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ordering.append('tearDown')
864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test = TestableTest('testNothing')
884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def cleanup1():
904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ordering.append('cleanup1')
914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def cleanup2():
924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ordering.append('cleanup2')
934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test.addCleanup(cleanup1)
944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test.addCleanup(cleanup2)
954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def success(some_test):
974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertEqual(some_test, test)
984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ordering.append('success')
994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        result = unittest.TestResult()
1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        result.addSuccess = success
1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test.run(result)
1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(ordering, ['setUp', 'test', 'tearDown',
1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                    'cleanup2', 'cleanup1', 'success'])
1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        blowUp = True
1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ordering = []
1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test = TestableTest('testNothing')
1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test.addCleanup(cleanup1)
1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test.run(result)
1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(ordering, ['setUp', 'cleanup1'])
1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testTestCaseDebugExecutesCleanups(self):
1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ordering = []
1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class TestableTest(unittest.TestCase):
1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def setUp(self):
1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ordering.append('setUp')
1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.addCleanup(cleanup1)
1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def testNothing(self):
1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ordering.append('test')
1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def tearDown(self):
1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ordering.append('tearDown')
1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test = TestableTest('testNothing')
1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def cleanup1():
1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ordering.append('cleanup1')
1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            test.addCleanup(cleanup2)
1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def cleanup2():
1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ordering.append('cleanup2')
1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test.debug()
1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(ordering, ['setUp', 'test', 'tearDown', 'cleanup1', 'cleanup2'])
1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass Test_TextTestRunner(unittest.TestCase):
1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Tests for TextTestRunner."""
1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_init(self):
1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        runner = unittest.TextTestRunner()
1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertFalse(runner.failfast)
1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertFalse(runner.buffer)
1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(runner.verbosity, 1)
1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(runner.descriptions)
1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(runner.resultclass, unittest.TextTestResult)
1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testBufferAndFailfast(self):
1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class Test(unittest.TestCase):
1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def testFoo(self):
1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                pass
1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        result = unittest.TestResult()
1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        runner = unittest.TextTestRunner(stream=StringIO(), failfast=True,
1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                           buffer=True)
1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Use our result object
1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        runner._makeResult = lambda: result
1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        runner.run(Test('testFoo'))
1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(result.failfast)
1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(result.buffer)
1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def testRunnerRegistersResult(self):
1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class Test(unittest.TestCase):
1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def testFoo(self):
1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                pass
1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        originalRegisterResult = unittest.runner.registerResult
1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def cleanup():
1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            unittest.runner.registerResult = originalRegisterResult
1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.addCleanup(cleanup)
1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        result = unittest.TestResult()
1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        runner = unittest.TextTestRunner(stream=StringIO())
1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Use our result object
1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        runner._makeResult = lambda: result
1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.wasRegistered = 0
1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def fakeRegisterResult(thisResult):
1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.wasRegistered += 1
1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertEqual(thisResult, result)
1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        unittest.runner.registerResult = fakeRegisterResult
1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        runner.run(unittest.TestSuite())
1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(self.wasRegistered, 1)
1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_works_with_result_without_startTestRun_stopTestRun(self):
1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class OldTextResult(ResultWithNoStartTestRunStopTestRun):
1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            separator2 = ''
1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def printErrors(self):
1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                pass
1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class Runner(unittest.TextTestRunner):
1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __init__(self):
1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                super(Runner, self).__init__(StringIO())
1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def _makeResult(self):
2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return OldTextResult()
2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        runner = Runner()
2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        runner.run(unittest.TestSuite())
2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_startTestRun_stopTestRun_called(self):
2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class LoggingTextResult(LoggingResult):
2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            separator2 = ''
2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def printErrors(self):
2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                pass
2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class LoggingRunner(unittest.TextTestRunner):
2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __init__(self, events):
2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                super(LoggingRunner, self).__init__(StringIO())
2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self._events = events
2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def _makeResult(self):
2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return LoggingTextResult(self._events)
2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        events = []
2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        runner = LoggingRunner(events)
2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        runner.run(unittest.TestSuite())
2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expected = ['startTestRun', 'stopTestRun']
2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(events, expected)
2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_pickle_unpickle(self):
2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # Issue #7197: a TextTestRunner should be (un)pickleable. This is
2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # required by test_multiprocessing under Windows (in verbose mode).
2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        from StringIO import StringIO as PickleableIO
2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # cStringIO objects are not pickleable, but StringIO objects are.
2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        stream = PickleableIO("foo")
2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        runner = unittest.TextTestRunner(stream)
2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            s = pickle.dumps(runner, protocol=protocol)
2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            obj = pickle.loads(s)
2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # StringIO objects never compare equal, a cheap test instead.
2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertEqual(obj.stream.getvalue(), stream.getvalue())
2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_resultclass(self):
2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def MockResultClass(*args):
2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return args
2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        STREAM = object()
2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        DESCRIPTIONS = object()
2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        VERBOSITY = object()
2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        runner = unittest.TextTestRunner(STREAM, DESCRIPTIONS, VERBOSITY,
2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                         resultclass=MockResultClass)
2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(runner.resultclass, MockResultClass)
2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        expectedresult = (runner.stream, DESCRIPTIONS, VERBOSITY)
2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(runner._makeResult(), expectedresult)
2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif __name__ == '__main__':
2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    unittest.main()
254