• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1import contextlib
2import difflib
3import pprint
4import pickle
5import re
6import sys
7import logging
8import warnings
9import weakref
10import inspect
11import types
12
13from copy import deepcopy
14from test import support
15
16import unittest
17
18from test.test_unittest.support import (
19    TestEquality, TestHashing, LoggingResult, LegacyLoggingResult,
20    ResultWithNoStartTestRunStopTestRun
21)
22from test.support import captured_stderr, gc_collect
23
24
25log_foo = logging.getLogger('foo')
26log_foobar = logging.getLogger('foo.bar')
27log_quux = logging.getLogger('quux')
28
29
30class Test(object):
31    "Keep these TestCase classes out of the main namespace"
32
33    class Foo(unittest.TestCase):
34        def runTest(self): pass
35        def test1(self): pass
36
37    class Bar(Foo):
38        def test2(self): pass
39
40    class LoggingTestCase(unittest.TestCase):
41        """A test case which logs its calls."""
42
43        def __init__(self, events):
44            super(Test.LoggingTestCase, self).__init__('test')
45            self.events = events
46
47        def setUp(self):
48            self.events.append('setUp')
49
50        def test(self):
51            self.events.append('test')
52
53        def tearDown(self):
54            self.events.append('tearDown')
55
56
57class Test_TestCase(unittest.TestCase, TestEquality, TestHashing):
58
59    ### Set up attributes used by inherited tests
60    ################################################################
61
62    # Used by TestHashing.test_hash and TestEquality.test_eq
63    eq_pairs = [(Test.Foo('test1'), Test.Foo('test1'))]
64
65    # Used by TestEquality.test_ne
66    ne_pairs = [(Test.Foo('test1'), Test.Foo('runTest')),
67                (Test.Foo('test1'), Test.Bar('test1')),
68                (Test.Foo('test1'), Test.Bar('test2'))]
69
70    ################################################################
71    ### /Set up attributes used by inherited tests
72
73
74    # "class TestCase([methodName])"
75    # ...
76    # "Each instance of TestCase will run a single test method: the
77    # method named methodName."
78    # ...
79    # "methodName defaults to "runTest"."
80    #
81    # Make sure it really is optional, and that it defaults to the proper
82    # thing.
83    def test_init__no_test_name(self):
84        class Test(unittest.TestCase):
85            def runTest(self): raise MyException()
86            def test(self): pass
87
88        self.assertEqual(Test().id()[-13:], '.Test.runTest')
89
90        # test that TestCase can be instantiated with no args
91        # primarily for use at the interactive interpreter
92        test = unittest.TestCase()
93        test.assertEqual(3, 3)
94        with test.assertRaises(test.failureException):
95            test.assertEqual(3, 2)
96
97        with self.assertRaises(AttributeError):
98            test.run()
99
100    # "class TestCase([methodName])"
101    # ...
102    # "Each instance of TestCase will run a single test method: the
103    # method named methodName."
104    def test_init__test_name__valid(self):
105        class Test(unittest.TestCase):
106            def runTest(self): raise MyException()
107            def test(self): pass
108
109        self.assertEqual(Test('test').id()[-10:], '.Test.test')
110
111    # "class TestCase([methodName])"
112    # ...
113    # "Each instance of TestCase will run a single test method: the
114    # method named methodName."
115    def test_init__test_name__invalid(self):
116        class Test(unittest.TestCase):
117            def runTest(self): raise MyException()
118            def test(self): pass
119
120        try:
121            Test('testfoo')
122        except ValueError:
123            pass
124        else:
125            self.fail("Failed to raise ValueError")
126
127    # "Return the number of tests represented by the this test object. For
128    # TestCase instances, this will always be 1"
129    def test_countTestCases(self):
130        class Foo(unittest.TestCase):
131            def test(self): pass
132
133        self.assertEqual(Foo('test').countTestCases(), 1)
134
135    # "Return the default type of test result object to be used to run this
136    # test. For TestCase instances, this will always be
137    # unittest.TestResult;  subclasses of TestCase should
138    # override this as necessary."
139    def test_defaultTestResult(self):
140        class Foo(unittest.TestCase):
141            def runTest(self):
142                pass
143
144        result = Foo().defaultTestResult()
145        self.assertEqual(type(result), unittest.TestResult)
146
147    # "When a setUp() method is defined, the test runner will run that method
148    # prior to each test. Likewise, if a tearDown() method is defined, the
149    # test runner will invoke that method after each test. In the example,
150    # setUp() was used to create a fresh sequence for each test."
151    #
152    # Make sure the proper call order is maintained, even if setUp() raises
153    # an exception.
154    def test_run_call_order__error_in_setUp(self):
155        events = []
156        result = LoggingResult(events)
157
158        class Foo(Test.LoggingTestCase):
159            def setUp(self):
160                super(Foo, self).setUp()
161                raise RuntimeError('raised by Foo.setUp')
162
163        Foo(events).run(result)
164        expected = ['startTest', 'setUp', 'addError', 'stopTest']
165        self.assertEqual(events, expected)
166
167    # "With a temporary result stopTestRun is called when setUp errors.
168    def test_run_call_order__error_in_setUp_default_result(self):
169        events = []
170
171        class Foo(Test.LoggingTestCase):
172            def defaultTestResult(self):
173                return LoggingResult(self.events)
174
175            def setUp(self):
176                super(Foo, self).setUp()
177                raise RuntimeError('raised by Foo.setUp')
178
179        Foo(events).run()
180        expected = ['startTestRun', 'startTest', 'setUp', 'addError',
181                    'stopTest', 'stopTestRun']
182        self.assertEqual(events, expected)
183
184    # "When a setUp() method is defined, the test runner will run that method
185    # prior to each test. Likewise, if a tearDown() method is defined, the
186    # test runner will invoke that method after each test. In the example,
187    # setUp() was used to create a fresh sequence for each test."
188    #
189    # Make sure the proper call order is maintained, even if the test raises
190    # an error (as opposed to a failure).
191    def test_run_call_order__error_in_test(self):
192        events = []
193        result = LoggingResult(events)
194
195        class Foo(Test.LoggingTestCase):
196            def test(self):
197                super(Foo, self).test()
198                raise RuntimeError('raised by Foo.test')
199
200        expected = ['startTest', 'setUp', 'test',
201                    'addError', 'tearDown', 'stopTest']
202        Foo(events).run(result)
203        self.assertEqual(events, expected)
204
205    # "With a default result, an error in the test still results in stopTestRun
206    # being called."
207    def test_run_call_order__error_in_test_default_result(self):
208        events = []
209
210        class Foo(Test.LoggingTestCase):
211            def defaultTestResult(self):
212                return LoggingResult(self.events)
213
214            def test(self):
215                super(Foo, self).test()
216                raise RuntimeError('raised by Foo.test')
217
218        expected = ['startTestRun', 'startTest', 'setUp', 'test',
219                    'addError', 'tearDown', 'stopTest', 'stopTestRun']
220        Foo(events).run()
221        self.assertEqual(events, expected)
222
223    # "When a setUp() method is defined, the test runner will run that method
224    # prior to each test. Likewise, if a tearDown() method is defined, the
225    # test runner will invoke that method after each test. In the example,
226    # setUp() was used to create a fresh sequence for each test."
227    #
228    # Make sure the proper call order is maintained, even if the test signals
229    # a failure (as opposed to an error).
230    def test_run_call_order__failure_in_test(self):
231        events = []
232        result = LoggingResult(events)
233
234        class Foo(Test.LoggingTestCase):
235            def test(self):
236                super(Foo, self).test()
237                self.fail('raised by Foo.test')
238
239        expected = ['startTest', 'setUp', 'test',
240                    'addFailure', 'tearDown', 'stopTest']
241        Foo(events).run(result)
242        self.assertEqual(events, expected)
243
244    # "When a test fails with a default result stopTestRun is still called."
245    def test_run_call_order__failure_in_test_default_result(self):
246
247        class Foo(Test.LoggingTestCase):
248            def defaultTestResult(self):
249                return LoggingResult(self.events)
250            def test(self):
251                super(Foo, self).test()
252                self.fail('raised by Foo.test')
253
254        expected = ['startTestRun', 'startTest', 'setUp', 'test',
255                    'addFailure', 'tearDown', 'stopTest', 'stopTestRun']
256        events = []
257        Foo(events).run()
258        self.assertEqual(events, expected)
259
260    # "When a setUp() method is defined, the test runner will run that method
261    # prior to each test. Likewise, if a tearDown() method is defined, the
262    # test runner will invoke that method after each test. In the example,
263    # setUp() was used to create a fresh sequence for each test."
264    #
265    # Make sure the proper call order is maintained, even if tearDown() raises
266    # an exception.
267    def test_run_call_order__error_in_tearDown(self):
268        events = []
269        result = LoggingResult(events)
270
271        class Foo(Test.LoggingTestCase):
272            def tearDown(self):
273                super(Foo, self).tearDown()
274                raise RuntimeError('raised by Foo.tearDown')
275
276        Foo(events).run(result)
277        expected = ['startTest', 'setUp', 'test', 'tearDown', 'addError',
278                    'stopTest']
279        self.assertEqual(events, expected)
280
281    # "When tearDown errors with a default result stopTestRun is still called."
282    def test_run_call_order__error_in_tearDown_default_result(self):
283
284        class Foo(Test.LoggingTestCase):
285            def defaultTestResult(self):
286                return LoggingResult(self.events)
287            def tearDown(self):
288                super(Foo, self).tearDown()
289                raise RuntimeError('raised by Foo.tearDown')
290
291        events = []
292        Foo(events).run()
293        expected = ['startTestRun', 'startTest', 'setUp', 'test', 'tearDown',
294                    'addError', 'stopTest', 'stopTestRun']
295        self.assertEqual(events, expected)
296
297    # "TestCase.run() still works when the defaultTestResult is a TestResult
298    # that does not support startTestRun and stopTestRun.
299    def test_run_call_order_default_result(self):
300
301        class Foo(unittest.TestCase):
302            def defaultTestResult(self):
303                return ResultWithNoStartTestRunStopTestRun()
304            def test(self):
305                pass
306
307        with self.assertWarns(RuntimeWarning):
308            Foo('test').run()
309
310    def test_deprecation_of_return_val_from_test(self):
311        # Issue 41322 - deprecate return of value that is not None from a test
312        class Nothing:
313            def __eq__(self, o):
314                return o is None
315        class Foo(unittest.TestCase):
316            def test1(self):
317                return 1
318            def test2(self):
319                yield 1
320            def test3(self):
321                return Nothing()
322
323        with self.assertWarns(DeprecationWarning) as w:
324            Foo('test1').run()
325        self.assertIn('It is deprecated to return a value that is not None', str(w.warning))
326        self.assertIn('test1', str(w.warning))
327        self.assertEqual(w.filename, __file__)
328
329        with self.assertWarns(DeprecationWarning) as w:
330            Foo('test2').run()
331        self.assertIn('It is deprecated to return a value that is not None', str(w.warning))
332        self.assertIn('test2', str(w.warning))
333        self.assertEqual(w.filename, __file__)
334
335        with self.assertWarns(DeprecationWarning) as w:
336            Foo('test3').run()
337        self.assertIn('It is deprecated to return a value that is not None', str(w.warning))
338        self.assertIn('test3', str(w.warning))
339        self.assertEqual(w.filename, __file__)
340
341    def _check_call_order__subtests(self, result, events, expected_events):
342        class Foo(Test.LoggingTestCase):
343            def test(self):
344                super(Foo, self).test()
345                for i in [1, 2, 3]:
346                    with self.subTest(i=i):
347                        if i == 1:
348                            self.fail('failure')
349                        for j in [2, 3]:
350                            with self.subTest(j=j):
351                                if i * j == 6:
352                                    raise RuntimeError('raised by Foo.test')
353                1 / 0
354
355        # Order is the following:
356        # i=1 => subtest failure
357        # i=2, j=2 => subtest success
358        # i=2, j=3 => subtest error
359        # i=3, j=2 => subtest error
360        # i=3, j=3 => subtest success
361        # toplevel => error
362        Foo(events).run(result)
363        self.assertEqual(events, expected_events)
364
365    def test_run_call_order__subtests(self):
366        events = []
367        result = LoggingResult(events)
368        expected = ['startTest', 'setUp', 'test',
369                    'addSubTestFailure', 'addSubTestSuccess',
370                    'addSubTestFailure', 'addSubTestFailure',
371                    'addSubTestSuccess', 'addError', 'tearDown', 'stopTest']
372        self._check_call_order__subtests(result, events, expected)
373
374    def test_run_call_order__subtests_legacy(self):
375        # With a legacy result object (without an addSubTest method),
376        # text execution stops after the first subtest failure.
377        events = []
378        result = LegacyLoggingResult(events)
379        expected = ['startTest', 'setUp', 'test',
380                    'addFailure', 'tearDown', 'stopTest']
381        self._check_call_order__subtests(result, events, expected)
382
383    def _check_call_order__subtests_success(self, result, events, expected_events):
384        class Foo(Test.LoggingTestCase):
385            def test(self):
386                super(Foo, self).test()
387                for i in [1, 2]:
388                    with self.subTest(i=i):
389                        for j in [2, 3]:
390                            with self.subTest(j=j):
391                                pass
392
393        Foo(events).run(result)
394        self.assertEqual(events, expected_events)
395
396    def test_run_call_order__subtests_success(self):
397        events = []
398        result = LoggingResult(events)
399        # The 6 subtest successes are individually recorded, in addition
400        # to the whole test success.
401        expected = (['startTest', 'setUp', 'test']
402                    + 6 * ['addSubTestSuccess']
403                    + ['tearDown', 'addSuccess', 'stopTest'])
404        self._check_call_order__subtests_success(result, events, expected)
405
406    def test_run_call_order__subtests_success_legacy(self):
407        # With a legacy result, only the whole test success is recorded.
408        events = []
409        result = LegacyLoggingResult(events)
410        expected = ['startTest', 'setUp', 'test', 'tearDown',
411                    'addSuccess', 'stopTest']
412        self._check_call_order__subtests_success(result, events, expected)
413
414    def test_run_call_order__subtests_failfast(self):
415        events = []
416        result = LoggingResult(events)
417        result.failfast = True
418
419        class Foo(Test.LoggingTestCase):
420            def test(self):
421                super(Foo, self).test()
422                with self.subTest(i=1):
423                    self.fail('failure')
424                with self.subTest(i=2):
425                    self.fail('failure')
426                self.fail('failure')
427
428        expected = ['startTest', 'setUp', 'test',
429                    'addSubTestFailure', 'tearDown', 'stopTest']
430        Foo(events).run(result)
431        self.assertEqual(events, expected)
432
433    def test_subtests_failfast(self):
434        # Ensure proper test flow with subtests and failfast (issue #22894)
435        events = []
436
437        class Foo(unittest.TestCase):
438            def test_a(self):
439                with self.subTest():
440                    events.append('a1')
441                events.append('a2')
442
443            def test_b(self):
444                with self.subTest():
445                    events.append('b1')
446                with self.subTest():
447                    self.fail('failure')
448                events.append('b2')
449
450            def test_c(self):
451                events.append('c')
452
453        result = unittest.TestResult()
454        result.failfast = True
455        suite = unittest.TestLoader().loadTestsFromTestCase(Foo)
456        suite.run(result)
457
458        expected = ['a1', 'a2', 'b1']
459        self.assertEqual(events, expected)
460
461    def test_subtests_debug(self):
462        # Test debug() with a test that uses subTest() (bpo-34900)
463        events = []
464
465        class Foo(unittest.TestCase):
466            def test_a(self):
467                events.append('test case')
468                with self.subTest():
469                    events.append('subtest 1')
470
471        Foo('test_a').debug()
472
473        self.assertEqual(events, ['test case', 'subtest 1'])
474
475    # "This class attribute gives the exception raised by the test() method.
476    # If a test framework needs to use a specialized exception, possibly to
477    # carry additional information, it must subclass this exception in
478    # order to ``play fair'' with the framework.  The initial value of this
479    # attribute is AssertionError"
480    def test_failureException__default(self):
481        class Foo(unittest.TestCase):
482            def test(self):
483                pass
484
485        self.assertIs(Foo('test').failureException, AssertionError)
486
487    # "This class attribute gives the exception raised by the test() method.
488    # If a test framework needs to use a specialized exception, possibly to
489    # carry additional information, it must subclass this exception in
490    # order to ``play fair'' with the framework."
491    #
492    # Make sure TestCase.run() respects the designated failureException
493    def test_failureException__subclassing__explicit_raise(self):
494        events = []
495        result = LoggingResult(events)
496
497        class Foo(unittest.TestCase):
498            def test(self):
499                raise RuntimeError()
500
501            failureException = RuntimeError
502
503        self.assertIs(Foo('test').failureException, RuntimeError)
504
505
506        Foo('test').run(result)
507        expected = ['startTest', 'addFailure', 'stopTest']
508        self.assertEqual(events, expected)
509
510    # "This class attribute gives the exception raised by the test() method.
511    # If a test framework needs to use a specialized exception, possibly to
512    # carry additional information, it must subclass this exception in
513    # order to ``play fair'' with the framework."
514    #
515    # Make sure TestCase.run() respects the designated failureException
516    def test_failureException__subclassing__implicit_raise(self):
517        events = []
518        result = LoggingResult(events)
519
520        class Foo(unittest.TestCase):
521            def test(self):
522                self.fail("foo")
523
524            failureException = RuntimeError
525
526        self.assertIs(Foo('test').failureException, RuntimeError)
527
528
529        Foo('test').run(result)
530        expected = ['startTest', 'addFailure', 'stopTest']
531        self.assertEqual(events, expected)
532
533    # "The default implementation does nothing."
534    def test_setUp(self):
535        class Foo(unittest.TestCase):
536            def runTest(self):
537                pass
538
539        # ... and nothing should happen
540        Foo().setUp()
541
542    # "The default implementation does nothing."
543    def test_tearDown(self):
544        class Foo(unittest.TestCase):
545            def runTest(self):
546                pass
547
548        # ... and nothing should happen
549        Foo().tearDown()
550
551    # "Return a string identifying the specific test case."
552    #
553    # Because of the vague nature of the docs, I'm not going to lock this
554    # test down too much. Really all that can be asserted is that the id()
555    # will be a string (either 8-byte or unicode -- again, because the docs
556    # just say "string")
557    def test_id(self):
558        class Foo(unittest.TestCase):
559            def runTest(self):
560                pass
561
562        self.assertIsInstance(Foo().id(), str)
563
564
565    # "If result is omitted or None, a temporary result object is created,
566    # used, and is made available to the caller. As TestCase owns the
567    # temporary result startTestRun and stopTestRun are called.
568
569    def test_run__uses_defaultTestResult(self):
570        events = []
571        defaultResult = LoggingResult(events)
572
573        class Foo(unittest.TestCase):
574            def test(self):
575                events.append('test')
576
577            def defaultTestResult(self):
578                return defaultResult
579
580        # Make run() find a result object on its own
581        result = Foo('test').run()
582
583        self.assertIs(result, defaultResult)
584        expected = ['startTestRun', 'startTest', 'test', 'addSuccess',
585            'stopTest', 'stopTestRun']
586        self.assertEqual(events, expected)
587
588
589    # "The result object is returned to run's caller"
590    def test_run__returns_given_result(self):
591
592        class Foo(unittest.TestCase):
593            def test(self):
594                pass
595
596        result = unittest.TestResult()
597
598        retval = Foo('test').run(result)
599        self.assertIs(retval, result)
600
601
602    # "The same effect [as method run] may be had by simply calling the
603    # TestCase instance."
604    def test_call__invoking_an_instance_delegates_to_run(self):
605        resultIn = unittest.TestResult()
606        resultOut = unittest.TestResult()
607
608        class Foo(unittest.TestCase):
609            def test(self):
610                pass
611
612            def run(self, result):
613                self.assertIs(result, resultIn)
614                return resultOut
615
616        retval = Foo('test')(resultIn)
617
618        self.assertIs(retval, resultOut)
619
620
621    def testShortDescriptionWithoutDocstring(self):
622        self.assertIsNone(self.shortDescription())
623
624    @unittest.skipIf(sys.flags.optimize >= 2,
625                     "Docstrings are omitted with -O2 and above")
626    def testShortDescriptionWithOneLineDocstring(self):
627        """Tests shortDescription() for a method with a docstring."""
628        self.assertEqual(
629                self.shortDescription(),
630                'Tests shortDescription() for a method with a docstring.')
631
632    @unittest.skipIf(sys.flags.optimize >= 2,
633                     "Docstrings are omitted with -O2 and above")
634    def testShortDescriptionWithMultiLineDocstring(self):
635        """Tests shortDescription() for a method with a longer docstring.
636
637        This method ensures that only the first line of a docstring is
638        returned used in the short description, no matter how long the
639        whole thing is.
640        """
641        self.assertEqual(
642                self.shortDescription(),
643                 'Tests shortDescription() for a method with a longer '
644                 'docstring.')
645
646    @unittest.skipIf(sys.flags.optimize >= 2,
647                     "Docstrings are omitted with -O2 and above")
648    def testShortDescriptionWhitespaceTrimming(self):
649        """
650            Tests shortDescription() whitespace is trimmed, so that the first
651            line of nonwhite-space text becomes the docstring.
652        """
653        self.assertEqual(
654            self.shortDescription(),
655            'Tests shortDescription() whitespace is trimmed, so that the first')
656
657    def testAddTypeEqualityFunc(self):
658        class SadSnake(object):
659            """Dummy class for test_addTypeEqualityFunc."""
660        s1, s2 = SadSnake(), SadSnake()
661        self.assertFalse(s1 == s2)
662        def AllSnakesCreatedEqual(a, b, msg=None):
663            return type(a) == type(b) == SadSnake
664        self.addTypeEqualityFunc(SadSnake, AllSnakesCreatedEqual)
665        self.assertEqual(s1, s2)
666        # No this doesn't clean up and remove the SadSnake equality func
667        # from this TestCase instance but since it's local nothing else
668        # will ever notice that.
669
670    def testAssertIs(self):
671        thing = object()
672        self.assertIs(thing, thing)
673        self.assertRaises(self.failureException, self.assertIs, thing, object())
674
675    def testAssertIsNot(self):
676        thing = object()
677        self.assertIsNot(thing, object())
678        self.assertRaises(self.failureException, self.assertIsNot, thing, thing)
679
680    def testAssertIsInstance(self):
681        thing = []
682        self.assertIsInstance(thing, list)
683        self.assertRaises(self.failureException, self.assertIsInstance,
684                          thing, dict)
685
686    def testAssertNotIsInstance(self):
687        thing = []
688        self.assertNotIsInstance(thing, dict)
689        self.assertRaises(self.failureException, self.assertNotIsInstance,
690                          thing, list)
691
692    def testAssertIn(self):
693        animals = {'monkey': 'banana', 'cow': 'grass', 'seal': 'fish'}
694
695        self.assertIn('a', 'abc')
696        self.assertIn(2, [1, 2, 3])
697        self.assertIn('monkey', animals)
698
699        self.assertNotIn('d', 'abc')
700        self.assertNotIn(0, [1, 2, 3])
701        self.assertNotIn('otter', animals)
702
703        self.assertRaises(self.failureException, self.assertIn, 'x', 'abc')
704        self.assertRaises(self.failureException, self.assertIn, 4, [1, 2, 3])
705        self.assertRaises(self.failureException, self.assertIn, 'elephant',
706                          animals)
707
708        self.assertRaises(self.failureException, self.assertNotIn, 'c', 'abc')
709        self.assertRaises(self.failureException, self.assertNotIn, 1, [1, 2, 3])
710        self.assertRaises(self.failureException, self.assertNotIn, 'cow',
711                          animals)
712
713    def testAssertEqual(self):
714        equal_pairs = [
715                ((), ()),
716                ({}, {}),
717                ([], []),
718                (set(), set()),
719                (frozenset(), frozenset())]
720        for a, b in equal_pairs:
721            # This mess of try excepts is to test the assertEqual behavior
722            # itself.
723            try:
724                self.assertEqual(a, b)
725            except self.failureException:
726                self.fail('assertEqual(%r, %r) failed' % (a, b))
727            try:
728                self.assertEqual(a, b, msg='foo')
729            except self.failureException:
730                self.fail('assertEqual(%r, %r) with msg= failed' % (a, b))
731            try:
732                self.assertEqual(a, b, 'foo')
733            except self.failureException:
734                self.fail('assertEqual(%r, %r) with third parameter failed' %
735                          (a, b))
736
737        unequal_pairs = [
738               ((), []),
739               ({}, set()),
740               (set([4,1]), frozenset([4,2])),
741               (frozenset([4,5]), set([2,3])),
742               (set([3,4]), set([5,4]))]
743        for a, b in unequal_pairs:
744            self.assertRaises(self.failureException, self.assertEqual, a, b)
745            self.assertRaises(self.failureException, self.assertEqual, a, b,
746                              'foo')
747            self.assertRaises(self.failureException, self.assertEqual, a, b,
748                              msg='foo')
749
750    def testEquality(self):
751        self.assertListEqual([], [])
752        self.assertTupleEqual((), ())
753        self.assertSequenceEqual([], ())
754
755        a = [0, 'a', []]
756        b = []
757        self.assertRaises(unittest.TestCase.failureException,
758                          self.assertListEqual, a, b)
759        self.assertRaises(unittest.TestCase.failureException,
760                          self.assertListEqual, tuple(a), tuple(b))
761        self.assertRaises(unittest.TestCase.failureException,
762                          self.assertSequenceEqual, a, tuple(b))
763
764        b.extend(a)
765        self.assertListEqual(a, b)
766        self.assertTupleEqual(tuple(a), tuple(b))
767        self.assertSequenceEqual(a, tuple(b))
768        self.assertSequenceEqual(tuple(a), b)
769
770        self.assertRaises(self.failureException, self.assertListEqual,
771                          a, tuple(b))
772        self.assertRaises(self.failureException, self.assertTupleEqual,
773                          tuple(a), b)
774        self.assertRaises(self.failureException, self.assertListEqual, None, b)
775        self.assertRaises(self.failureException, self.assertTupleEqual, None,
776                          tuple(b))
777        self.assertRaises(self.failureException, self.assertSequenceEqual,
778                          None, tuple(b))
779        self.assertRaises(self.failureException, self.assertListEqual, 1, 1)
780        self.assertRaises(self.failureException, self.assertTupleEqual, 1, 1)
781        self.assertRaises(self.failureException, self.assertSequenceEqual,
782                          1, 1)
783
784        self.assertDictEqual({}, {})
785
786        c = { 'x': 1 }
787        d = {}
788        self.assertRaises(unittest.TestCase.failureException,
789                          self.assertDictEqual, c, d)
790
791        d.update(c)
792        self.assertDictEqual(c, d)
793
794        d['x'] = 0
795        self.assertRaises(unittest.TestCase.failureException,
796                          self.assertDictEqual, c, d, 'These are unequal')
797
798        self.assertRaises(self.failureException, self.assertDictEqual, None, d)
799        self.assertRaises(self.failureException, self.assertDictEqual, [], d)
800        self.assertRaises(self.failureException, self.assertDictEqual, 1, 1)
801
802    def testAssertSequenceEqualMaxDiff(self):
803        self.assertEqual(self.maxDiff, 80*8)
804        seq1 = 'a' + 'x' * 80**2
805        seq2 = 'b' + 'x' * 80**2
806        diff = '\n'.join(difflib.ndiff(pprint.pformat(seq1).splitlines(),
807                                       pprint.pformat(seq2).splitlines()))
808        # the +1 is the leading \n added by assertSequenceEqual
809        omitted = unittest.case.DIFF_OMITTED % (len(diff) + 1,)
810
811        self.maxDiff = len(diff)//2
812        try:
813
814            self.assertSequenceEqual(seq1, seq2)
815        except self.failureException as e:
816            msg = e.args[0]
817        else:
818            self.fail('assertSequenceEqual did not fail.')
819        self.assertLess(len(msg), len(diff))
820        self.assertIn(omitted, msg)
821
822        self.maxDiff = len(diff) * 2
823        try:
824            self.assertSequenceEqual(seq1, seq2)
825        except self.failureException as e:
826            msg = e.args[0]
827        else:
828            self.fail('assertSequenceEqual did not fail.')
829        self.assertGreater(len(msg), len(diff))
830        self.assertNotIn(omitted, msg)
831
832        self.maxDiff = None
833        try:
834            self.assertSequenceEqual(seq1, seq2)
835        except self.failureException as e:
836            msg = e.args[0]
837        else:
838            self.fail('assertSequenceEqual did not fail.')
839        self.assertGreater(len(msg), len(diff))
840        self.assertNotIn(omitted, msg)
841
842    def testTruncateMessage(self):
843        self.maxDiff = 1
844        message = self._truncateMessage('foo', 'bar')
845        omitted = unittest.case.DIFF_OMITTED % len('bar')
846        self.assertEqual(message, 'foo' + omitted)
847
848        self.maxDiff = None
849        message = self._truncateMessage('foo', 'bar')
850        self.assertEqual(message, 'foobar')
851
852        self.maxDiff = 4
853        message = self._truncateMessage('foo', 'bar')
854        self.assertEqual(message, 'foobar')
855
856    def testAssertDictEqualTruncates(self):
857        test = unittest.TestCase('assertEqual')
858        def truncate(msg, diff):
859            return 'foo'
860        test._truncateMessage = truncate
861        try:
862            test.assertDictEqual({}, {1: 0})
863        except self.failureException as e:
864            self.assertEqual(str(e), 'foo')
865        else:
866            self.fail('assertDictEqual did not fail')
867
868    def testAssertMultiLineEqualTruncates(self):
869        test = unittest.TestCase('assertEqual')
870        def truncate(msg, diff):
871            return 'foo'
872        test._truncateMessage = truncate
873        try:
874            test.assertMultiLineEqual('foo', 'bar')
875        except self.failureException as e:
876            self.assertEqual(str(e), 'foo')
877        else:
878            self.fail('assertMultiLineEqual did not fail')
879
880    def testAssertEqual_diffThreshold(self):
881        # check threshold value
882        self.assertEqual(self._diffThreshold, 2**16)
883        # disable madDiff to get diff markers
884        self.maxDiff = None
885
886        # set a lower threshold value and add a cleanup to restore it
887        old_threshold = self._diffThreshold
888        self._diffThreshold = 2**5
889        self.addCleanup(lambda: setattr(self, '_diffThreshold', old_threshold))
890
891        # under the threshold: diff marker (^) in error message
892        s = 'x' * (2**4)
893        with self.assertRaises(self.failureException) as cm:
894            self.assertEqual(s + 'a', s + 'b')
895        self.assertIn('^', str(cm.exception))
896        self.assertEqual(s + 'a', s + 'a')
897
898        # over the threshold: diff not used and marker (^) not in error message
899        s = 'x' * (2**6)
900        # if the path that uses difflib is taken, _truncateMessage will be
901        # called -- replace it with explodingTruncation to verify that this
902        # doesn't happen
903        def explodingTruncation(message, diff):
904            raise SystemError('this should not be raised')
905        old_truncate = self._truncateMessage
906        self._truncateMessage = explodingTruncation
907        self.addCleanup(lambda: setattr(self, '_truncateMessage', old_truncate))
908
909        s1, s2 = s + 'a', s + 'b'
910        with self.assertRaises(self.failureException) as cm:
911            self.assertEqual(s1, s2)
912        self.assertNotIn('^', str(cm.exception))
913        self.assertEqual(str(cm.exception), '%r != %r' % (s1, s2))
914        self.assertEqual(s + 'a', s + 'a')
915
916    def testAssertEqual_shorten(self):
917        # set a lower threshold value and add a cleanup to restore it
918        old_threshold = self._diffThreshold
919        self._diffThreshold = 0
920        self.addCleanup(lambda: setattr(self, '_diffThreshold', old_threshold))
921
922        s = 'x' * 100
923        s1, s2 = s + 'a', s + 'b'
924        with self.assertRaises(self.failureException) as cm:
925            self.assertEqual(s1, s2)
926        c = 'xxxx[35 chars]' + 'x' * 61
927        self.assertEqual(str(cm.exception), "'%sa' != '%sb'" % (c, c))
928        self.assertEqual(s + 'a', s + 'a')
929
930        p = 'y' * 50
931        s1, s2 = s + 'a' + p, s + 'b' + p
932        with self.assertRaises(self.failureException) as cm:
933            self.assertEqual(s1, s2)
934        c = 'xxxx[85 chars]xxxxxxxxxxx'
935        self.assertEqual(str(cm.exception), "'%sa%s' != '%sb%s'" % (c, p, c, p))
936
937        p = 'y' * 100
938        s1, s2 = s + 'a' + p, s + 'b' + p
939        with self.assertRaises(self.failureException) as cm:
940            self.assertEqual(s1, s2)
941        c = 'xxxx[91 chars]xxxxx'
942        d = 'y' * 40 + '[56 chars]yyyy'
943        self.assertEqual(str(cm.exception), "'%sa%s' != '%sb%s'" % (c, d, c, d))
944
945    def testAssertCountEqual(self):
946        a = object()
947        self.assertCountEqual([1, 2, 3], [3, 2, 1])
948        self.assertCountEqual(['foo', 'bar', 'baz'], ['bar', 'baz', 'foo'])
949        self.assertCountEqual([a, a, 2, 2, 3], (a, 2, 3, a, 2))
950        self.assertCountEqual([1, "2", "a", "a"], ["a", "2", True, "a"])
951        self.assertRaises(self.failureException, self.assertCountEqual,
952                          [1, 2] + [3] * 100, [1] * 100 + [2, 3])
953        self.assertRaises(self.failureException, self.assertCountEqual,
954                          [1, "2", "a", "a"], ["a", "2", True, 1])
955        self.assertRaises(self.failureException, self.assertCountEqual,
956                          [10], [10, 11])
957        self.assertRaises(self.failureException, self.assertCountEqual,
958                          [10, 11], [10])
959        self.assertRaises(self.failureException, self.assertCountEqual,
960                          [10, 11, 10], [10, 11])
961
962        # Test that sequences of unhashable objects can be tested for sameness:
963        self.assertCountEqual([[1, 2], [3, 4], 0], [False, [3, 4], [1, 2]])
964        # Test that iterator of unhashable objects can be tested for sameness:
965        self.assertCountEqual(iter([1, 2, [], 3, 4]),
966                              iter([1, 2, [], 3, 4]))
967
968        # hashable types, but not orderable
969        self.assertRaises(self.failureException, self.assertCountEqual,
970                          [], [divmod, 'x', 1, 5j, 2j, frozenset()])
971        # comparing dicts
972        self.assertCountEqual([{'a': 1}, {'b': 2}], [{'b': 2}, {'a': 1}])
973        # comparing heterogeneous non-hashable sequences
974        self.assertCountEqual([1, 'x', divmod, []], [divmod, [], 'x', 1])
975        self.assertRaises(self.failureException, self.assertCountEqual,
976                          [], [divmod, [], 'x', 1, 5j, 2j, set()])
977        self.assertRaises(self.failureException, self.assertCountEqual,
978                          [[1]], [[2]])
979
980        # Same elements, but not same sequence length
981        self.assertRaises(self.failureException, self.assertCountEqual,
982                          [1, 1, 2], [2, 1])
983        self.assertRaises(self.failureException, self.assertCountEqual,
984                          [1, 1, "2", "a", "a"], ["2", "2", True, "a"])
985        self.assertRaises(self.failureException, self.assertCountEqual,
986                          [1, {'b': 2}, None, True], [{'b': 2}, True, None])
987
988        # Same elements which don't reliably compare, in
989        # different order, see issue 10242
990        a = [{2,4}, {1,2}]
991        b = a[::-1]
992        self.assertCountEqual(a, b)
993
994        # test utility functions supporting assertCountEqual()
995
996        diffs = set(unittest.util._count_diff_all_purpose('aaabccd', 'abbbcce'))
997        expected = {(3,1,'a'), (1,3,'b'), (1,0,'d'), (0,1,'e')}
998        self.assertEqual(diffs, expected)
999
1000        diffs = unittest.util._count_diff_all_purpose([[]], [])
1001        self.assertEqual(diffs, [(1, 0, [])])
1002
1003        diffs = set(unittest.util._count_diff_hashable('aaabccd', 'abbbcce'))
1004        expected = {(3,1,'a'), (1,3,'b'), (1,0,'d'), (0,1,'e')}
1005        self.assertEqual(diffs, expected)
1006
1007    def testAssertSetEqual(self):
1008        set1 = set()
1009        set2 = set()
1010        self.assertSetEqual(set1, set2)
1011
1012        self.assertRaises(self.failureException, self.assertSetEqual, None, set2)
1013        self.assertRaises(self.failureException, self.assertSetEqual, [], set2)
1014        self.assertRaises(self.failureException, self.assertSetEqual, set1, None)
1015        self.assertRaises(self.failureException, self.assertSetEqual, set1, [])
1016
1017        set1 = set(['a'])
1018        set2 = set()
1019        self.assertRaises(self.failureException, self.assertSetEqual, set1, set2)
1020
1021        set1 = set(['a'])
1022        set2 = set(['a'])
1023        self.assertSetEqual(set1, set2)
1024
1025        set1 = set(['a'])
1026        set2 = set(['a', 'b'])
1027        self.assertRaises(self.failureException, self.assertSetEqual, set1, set2)
1028
1029        set1 = set(['a'])
1030        set2 = frozenset(['a', 'b'])
1031        self.assertRaises(self.failureException, self.assertSetEqual, set1, set2)
1032
1033        set1 = set(['a', 'b'])
1034        set2 = frozenset(['a', 'b'])
1035        self.assertSetEqual(set1, set2)
1036
1037        set1 = set()
1038        set2 = "foo"
1039        self.assertRaises(self.failureException, self.assertSetEqual, set1, set2)
1040        self.assertRaises(self.failureException, self.assertSetEqual, set2, set1)
1041
1042        # make sure any string formatting is tuple-safe
1043        set1 = set([(0, 1), (2, 3)])
1044        set2 = set([(4, 5)])
1045        self.assertRaises(self.failureException, self.assertSetEqual, set1, set2)
1046
1047    def testInequality(self):
1048        # Try ints
1049        self.assertGreater(2, 1)
1050        self.assertGreaterEqual(2, 1)
1051        self.assertGreaterEqual(1, 1)
1052        self.assertLess(1, 2)
1053        self.assertLessEqual(1, 2)
1054        self.assertLessEqual(1, 1)
1055        self.assertRaises(self.failureException, self.assertGreater, 1, 2)
1056        self.assertRaises(self.failureException, self.assertGreater, 1, 1)
1057        self.assertRaises(self.failureException, self.assertGreaterEqual, 1, 2)
1058        self.assertRaises(self.failureException, self.assertLess, 2, 1)
1059        self.assertRaises(self.failureException, self.assertLess, 1, 1)
1060        self.assertRaises(self.failureException, self.assertLessEqual, 2, 1)
1061
1062        # Try Floats
1063        self.assertGreater(1.1, 1.0)
1064        self.assertGreaterEqual(1.1, 1.0)
1065        self.assertGreaterEqual(1.0, 1.0)
1066        self.assertLess(1.0, 1.1)
1067        self.assertLessEqual(1.0, 1.1)
1068        self.assertLessEqual(1.0, 1.0)
1069        self.assertRaises(self.failureException, self.assertGreater, 1.0, 1.1)
1070        self.assertRaises(self.failureException, self.assertGreater, 1.0, 1.0)
1071        self.assertRaises(self.failureException, self.assertGreaterEqual, 1.0, 1.1)
1072        self.assertRaises(self.failureException, self.assertLess, 1.1, 1.0)
1073        self.assertRaises(self.failureException, self.assertLess, 1.0, 1.0)
1074        self.assertRaises(self.failureException, self.assertLessEqual, 1.1, 1.0)
1075
1076        # Try Strings
1077        self.assertGreater('bug', 'ant')
1078        self.assertGreaterEqual('bug', 'ant')
1079        self.assertGreaterEqual('ant', 'ant')
1080        self.assertLess('ant', 'bug')
1081        self.assertLessEqual('ant', 'bug')
1082        self.assertLessEqual('ant', 'ant')
1083        self.assertRaises(self.failureException, self.assertGreater, 'ant', 'bug')
1084        self.assertRaises(self.failureException, self.assertGreater, 'ant', 'ant')
1085        self.assertRaises(self.failureException, self.assertGreaterEqual, 'ant', 'bug')
1086        self.assertRaises(self.failureException, self.assertLess, 'bug', 'ant')
1087        self.assertRaises(self.failureException, self.assertLess, 'ant', 'ant')
1088        self.assertRaises(self.failureException, self.assertLessEqual, 'bug', 'ant')
1089
1090        # Try bytes
1091        self.assertGreater(b'bug', b'ant')
1092        self.assertGreaterEqual(b'bug', b'ant')
1093        self.assertGreaterEqual(b'ant', b'ant')
1094        self.assertLess(b'ant', b'bug')
1095        self.assertLessEqual(b'ant', b'bug')
1096        self.assertLessEqual(b'ant', b'ant')
1097        self.assertRaises(self.failureException, self.assertGreater, b'ant', b'bug')
1098        self.assertRaises(self.failureException, self.assertGreater, b'ant', b'ant')
1099        self.assertRaises(self.failureException, self.assertGreaterEqual, b'ant',
1100                          b'bug')
1101        self.assertRaises(self.failureException, self.assertLess, b'bug', b'ant')
1102        self.assertRaises(self.failureException, self.assertLess, b'ant', b'ant')
1103        self.assertRaises(self.failureException, self.assertLessEqual, b'bug', b'ant')
1104
1105    def testAssertMultiLineEqual(self):
1106        sample_text = """\
1107http://www.python.org/doc/2.3/lib/module-unittest.html
1108test case
1109    A test case is the smallest unit of testing. [...]
1110"""
1111        revised_sample_text = """\
1112http://www.python.org/doc/2.4.1/lib/module-unittest.html
1113test case
1114    A test case is the smallest unit of testing. [...] You may provide your
1115    own implementation that does not subclass from TestCase, of course.
1116"""
1117        sample_text_error = """\
1118- http://www.python.org/doc/2.3/lib/module-unittest.html
1119?                             ^
1120+ http://www.python.org/doc/2.4.1/lib/module-unittest.html
1121?                             ^^^
1122  test case
1123-     A test case is the smallest unit of testing. [...]
1124+     A test case is the smallest unit of testing. [...] You may provide your
1125?                                                       +++++++++++++++++++++
1126+     own implementation that does not subclass from TestCase, of course.
1127"""
1128        self.maxDiff = None
1129        try:
1130            self.assertMultiLineEqual(sample_text, revised_sample_text)
1131        except self.failureException as e:
1132            # need to remove the first line of the error message
1133            error = str(e).split('\n', 1)[1]
1134            self.assertEqual(sample_text_error, error)
1135        else:
1136            self.fail(f'{self.failureException} not raised')
1137
1138    def testAssertEqualSingleLine(self):
1139        sample_text = "laden swallows fly slowly"
1140        revised_sample_text = "unladen swallows fly quickly"
1141        sample_text_error = """\
1142- laden swallows fly slowly
1143?                    ^^^^
1144+ unladen swallows fly quickly
1145? ++                   ^^^^^
1146"""
1147        try:
1148            self.assertEqual(sample_text, revised_sample_text)
1149        except self.failureException as e:
1150            # need to remove the first line of the error message
1151            error = str(e).split('\n', 1)[1]
1152            self.assertEqual(sample_text_error, error)
1153        else:
1154            self.fail(f'{self.failureException} not raised')
1155
1156    def testAssertEqualwithEmptyString(self):
1157        '''Verify when there is an empty string involved, the diff output
1158         does not treat the empty string as a single empty line. It should
1159         instead be handled as a non-line.
1160        '''
1161        sample_text = ''
1162        revised_sample_text = 'unladen swallows fly quickly'
1163        sample_text_error = '''\
1164+ unladen swallows fly quickly
1165'''
1166        try:
1167            self.assertEqual(sample_text, revised_sample_text)
1168        except self.failureException as e:
1169            # need to remove the first line of the error message
1170            error = str(e).split('\n', 1)[1]
1171            self.assertEqual(sample_text_error, error)
1172        else:
1173            self.fail(f'{self.failureException} not raised')
1174
1175    def testAssertEqualMultipleLinesMissingNewlineTerminator(self):
1176        '''Verifying format of diff output from assertEqual involving strings
1177         with multiple lines, but missing the terminating newline on both.
1178        '''
1179        sample_text = 'laden swallows\nfly sloely'
1180        revised_sample_text = 'laden swallows\nfly slowly'
1181        sample_text_error = '''\
1182  laden swallows
1183- fly sloely
1184?        ^
1185+ fly slowly
1186?        ^
1187'''
1188        try:
1189            self.assertEqual(sample_text, revised_sample_text)
1190        except self.failureException as e:
1191            # need to remove the first line of the error message
1192            error = str(e).split('\n', 1)[1]
1193            self.assertEqual(sample_text_error, error)
1194        else:
1195            self.fail(f'{self.failureException} not raised')
1196
1197    def testAssertEqualMultipleLinesMismatchedNewlinesTerminators(self):
1198        '''Verifying format of diff output from assertEqual involving strings
1199         with multiple lines and mismatched newlines. The output should
1200         include a - on it's own line to indicate the newline difference
1201         between the two strings
1202        '''
1203        sample_text = 'laden swallows\nfly sloely\n'
1204        revised_sample_text = 'laden swallows\nfly slowly'
1205        sample_text_error = '''\
1206  laden swallows
1207- fly sloely
1208?        ^
1209+ fly slowly
1210?        ^
1211-\x20
1212'''
1213        try:
1214            self.assertEqual(sample_text, revised_sample_text)
1215        except self.failureException as e:
1216            # need to remove the first line of the error message
1217            error = str(e).split('\n', 1)[1]
1218            self.assertEqual(sample_text_error, error)
1219        else:
1220            self.fail(f'{self.failureException} not raised')
1221
1222    def testEqualityBytesWarning(self):
1223        if sys.flags.bytes_warning:
1224            def bytes_warning():
1225                return self.assertWarnsRegex(BytesWarning,
1226                            'Comparison between bytes and string')
1227        else:
1228            def bytes_warning():
1229                return contextlib.ExitStack()
1230
1231        with bytes_warning(), self.assertRaises(self.failureException):
1232            self.assertEqual('a', b'a')
1233        with bytes_warning():
1234            self.assertNotEqual('a', b'a')
1235
1236        a = [0, 'a']
1237        b = [0, b'a']
1238        with bytes_warning(), self.assertRaises(self.failureException):
1239            self.assertListEqual(a, b)
1240        with bytes_warning(), self.assertRaises(self.failureException):
1241            self.assertTupleEqual(tuple(a), tuple(b))
1242        with bytes_warning(), self.assertRaises(self.failureException):
1243            self.assertSequenceEqual(a, tuple(b))
1244        with bytes_warning(), self.assertRaises(self.failureException):
1245            self.assertSequenceEqual(tuple(a), b)
1246        with bytes_warning(), self.assertRaises(self.failureException):
1247            self.assertSequenceEqual('a', b'a')
1248        with bytes_warning(), self.assertRaises(self.failureException):
1249            self.assertSetEqual(set(a), set(b))
1250
1251        with self.assertRaises(self.failureException):
1252            self.assertListEqual(a, tuple(b))
1253        with self.assertRaises(self.failureException):
1254            self.assertTupleEqual(tuple(a), b)
1255
1256        a = [0, b'a']
1257        b = [0]
1258        with self.assertRaises(self.failureException):
1259            self.assertListEqual(a, b)
1260        with self.assertRaises(self.failureException):
1261            self.assertTupleEqual(tuple(a), tuple(b))
1262        with self.assertRaises(self.failureException):
1263            self.assertSequenceEqual(a, tuple(b))
1264        with self.assertRaises(self.failureException):
1265            self.assertSequenceEqual(tuple(a), b)
1266        with self.assertRaises(self.failureException):
1267            self.assertSetEqual(set(a), set(b))
1268
1269        a = [0]
1270        b = [0, b'a']
1271        with self.assertRaises(self.failureException):
1272            self.assertListEqual(a, b)
1273        with self.assertRaises(self.failureException):
1274            self.assertTupleEqual(tuple(a), tuple(b))
1275        with self.assertRaises(self.failureException):
1276            self.assertSequenceEqual(a, tuple(b))
1277        with self.assertRaises(self.failureException):
1278            self.assertSequenceEqual(tuple(a), b)
1279        with self.assertRaises(self.failureException):
1280            self.assertSetEqual(set(a), set(b))
1281
1282        with bytes_warning(), self.assertRaises(self.failureException):
1283            self.assertDictEqual({'a': 0}, {b'a': 0})
1284        with self.assertRaises(self.failureException):
1285            self.assertDictEqual({}, {b'a': 0})
1286        with self.assertRaises(self.failureException):
1287            self.assertDictEqual({b'a': 0}, {})
1288
1289        with self.assertRaises(self.failureException):
1290            self.assertCountEqual([b'a', b'a'], [b'a', b'a', b'a'])
1291        with bytes_warning():
1292            self.assertCountEqual(['a', b'a'], ['a', b'a'])
1293        with bytes_warning(), self.assertRaises(self.failureException):
1294            self.assertCountEqual(['a', 'a'], [b'a', b'a'])
1295        with bytes_warning(), self.assertRaises(self.failureException):
1296            self.assertCountEqual(['a', 'a', []], [b'a', b'a', []])
1297
1298    def testAssertIsNone(self):
1299        self.assertIsNone(None)
1300        self.assertRaises(self.failureException, self.assertIsNone, False)
1301        self.assertIsNotNone('DjZoPloGears on Rails')
1302        self.assertRaises(self.failureException, self.assertIsNotNone, None)
1303
1304    def testAssertRegex(self):
1305        self.assertRegex('asdfabasdf', r'ab+')
1306        self.assertRaises(self.failureException, self.assertRegex,
1307                          'saaas', r'aaaa')
1308
1309    def testAssertRaisesCallable(self):
1310        class ExceptionMock(Exception):
1311            pass
1312        def Stub():
1313            raise ExceptionMock('We expect')
1314        self.assertRaises(ExceptionMock, Stub)
1315        # A tuple of exception classes is accepted
1316        self.assertRaises((ValueError, ExceptionMock), Stub)
1317        # *args and **kwargs also work
1318        self.assertRaises(ValueError, int, '19', base=8)
1319        # Failure when no exception is raised
1320        with self.assertRaises(self.failureException):
1321            self.assertRaises(ExceptionMock, lambda: 0)
1322        # Failure when the function is None
1323        with self.assertRaises(TypeError):
1324            self.assertRaises(ExceptionMock, None)
1325        # Failure when another exception is raised
1326        with self.assertRaises(ExceptionMock):
1327            self.assertRaises(ValueError, Stub)
1328
1329    def testAssertRaisesContext(self):
1330        class ExceptionMock(Exception):
1331            pass
1332        def Stub():
1333            raise ExceptionMock('We expect')
1334        with self.assertRaises(ExceptionMock):
1335            Stub()
1336        # A tuple of exception classes is accepted
1337        with self.assertRaises((ValueError, ExceptionMock)) as cm:
1338            Stub()
1339        # The context manager exposes caught exception
1340        self.assertIsInstance(cm.exception, ExceptionMock)
1341        self.assertEqual(cm.exception.args[0], 'We expect')
1342        # *args and **kwargs also work
1343        with self.assertRaises(ValueError):
1344            int('19', base=8)
1345        # Failure when no exception is raised
1346        with self.assertRaises(self.failureException):
1347            with self.assertRaises(ExceptionMock):
1348                pass
1349        # Custom message
1350        with self.assertRaisesRegex(self.failureException, 'foobar'):
1351            with self.assertRaises(ExceptionMock, msg='foobar'):
1352                pass
1353        # Invalid keyword argument
1354        with self.assertRaisesRegex(TypeError, 'foobar'):
1355            with self.assertRaises(ExceptionMock, foobar=42):
1356                pass
1357        # Failure when another exception is raised
1358        with self.assertRaises(ExceptionMock):
1359            self.assertRaises(ValueError, Stub)
1360
1361    def testAssertRaisesNoExceptionType(self):
1362        with self.assertRaises(TypeError):
1363            self.assertRaises()
1364        with self.assertRaises(TypeError):
1365            self.assertRaises(1)
1366        with self.assertRaises(TypeError):
1367            self.assertRaises(object)
1368        with self.assertRaises(TypeError):
1369            self.assertRaises((ValueError, 1))
1370        with self.assertRaises(TypeError):
1371            self.assertRaises((ValueError, object))
1372
1373    def testAssertRaisesRefcount(self):
1374        # bpo-23890: assertRaises() must not keep objects alive longer
1375        # than expected
1376        def func() :
1377            try:
1378                raise ValueError
1379            except ValueError:
1380                raise ValueError
1381
1382        refcount = sys.getrefcount(func)
1383        self.assertRaises(ValueError, func)
1384        self.assertEqual(refcount, sys.getrefcount(func))
1385
1386    def testAssertRaisesRegex(self):
1387        class ExceptionMock(Exception):
1388            pass
1389
1390        def Stub():
1391            raise ExceptionMock('We expect')
1392
1393        self.assertRaisesRegex(ExceptionMock, re.compile('expect$'), Stub)
1394        self.assertRaisesRegex(ExceptionMock, 'expect$', Stub)
1395        with self.assertRaises(TypeError):
1396            self.assertRaisesRegex(ExceptionMock, 'expect$', None)
1397
1398    def testAssertNotRaisesRegex(self):
1399        self.assertRaisesRegex(
1400                self.failureException, '^Exception not raised by <lambda>$',
1401                self.assertRaisesRegex, Exception, re.compile('x'),
1402                lambda: None)
1403        self.assertRaisesRegex(
1404                self.failureException, '^Exception not raised by <lambda>$',
1405                self.assertRaisesRegex, Exception, 'x',
1406                lambda: None)
1407        # Custom message
1408        with self.assertRaisesRegex(self.failureException, 'foobar'):
1409            with self.assertRaisesRegex(Exception, 'expect', msg='foobar'):
1410                pass
1411        # Invalid keyword argument
1412        with self.assertRaisesRegex(TypeError, 'foobar'):
1413            with self.assertRaisesRegex(Exception, 'expect', foobar=42):
1414                pass
1415
1416    def testAssertRaisesRegexInvalidRegex(self):
1417        # Issue 20145.
1418        class MyExc(Exception):
1419            pass
1420        self.assertRaises(TypeError, self.assertRaisesRegex, MyExc, lambda: True)
1421
1422    def testAssertWarnsRegexInvalidRegex(self):
1423        # Issue 20145.
1424        class MyWarn(Warning):
1425            pass
1426        self.assertRaises(TypeError, self.assertWarnsRegex, MyWarn, lambda: True)
1427
1428    def testAssertWarnsModifySysModules(self):
1429        # bpo-29620: handle modified sys.modules during iteration
1430        class Foo(types.ModuleType):
1431            @property
1432            def __warningregistry__(self):
1433                sys.modules['@bar@'] = 'bar'
1434
1435        sys.modules['@foo@'] = Foo('foo')
1436        try:
1437            self.assertWarns(UserWarning, warnings.warn, 'expected')
1438        finally:
1439            del sys.modules['@foo@']
1440            del sys.modules['@bar@']
1441
1442    def testAssertRaisesRegexMismatch(self):
1443        def Stub():
1444            raise Exception('Unexpected')
1445
1446        self.assertRaisesRegex(
1447                self.failureException,
1448                r'"\^Expected\$" does not match "Unexpected"',
1449                self.assertRaisesRegex, Exception, '^Expected$',
1450                Stub)
1451        self.assertRaisesRegex(
1452                self.failureException,
1453                r'"\^Expected\$" does not match "Unexpected"',
1454                self.assertRaisesRegex, Exception,
1455                re.compile('^Expected$'), Stub)
1456
1457    def testAssertRaisesExcValue(self):
1458        class ExceptionMock(Exception):
1459            pass
1460
1461        def Stub(foo):
1462            raise ExceptionMock(foo)
1463        v = "particular value"
1464
1465        ctx = self.assertRaises(ExceptionMock)
1466        with ctx:
1467            Stub(v)
1468        e = ctx.exception
1469        self.assertIsInstance(e, ExceptionMock)
1470        self.assertEqual(e.args[0], v)
1471
1472    def testAssertRaisesRegexNoExceptionType(self):
1473        with self.assertRaises(TypeError):
1474            self.assertRaisesRegex()
1475        with self.assertRaises(TypeError):
1476            self.assertRaisesRegex(ValueError)
1477        with self.assertRaises(TypeError):
1478            self.assertRaisesRegex(1, 'expect')
1479        with self.assertRaises(TypeError):
1480            self.assertRaisesRegex(object, 'expect')
1481        with self.assertRaises(TypeError):
1482            self.assertRaisesRegex((ValueError, 1), 'expect')
1483        with self.assertRaises(TypeError):
1484            self.assertRaisesRegex((ValueError, object), 'expect')
1485
1486    def testAssertWarnsCallable(self):
1487        def _runtime_warn():
1488            warnings.warn("foo", RuntimeWarning)
1489        # Success when the right warning is triggered, even several times
1490        self.assertWarns(RuntimeWarning, _runtime_warn)
1491        self.assertWarns(RuntimeWarning, _runtime_warn)
1492        # A tuple of warning classes is accepted
1493        self.assertWarns((DeprecationWarning, RuntimeWarning), _runtime_warn)
1494        # *args and **kwargs also work
1495        self.assertWarns(RuntimeWarning,
1496                         warnings.warn, "foo", category=RuntimeWarning)
1497        # Failure when no warning is triggered
1498        with self.assertRaises(self.failureException):
1499            self.assertWarns(RuntimeWarning, lambda: 0)
1500        # Failure when the function is None
1501        with self.assertRaises(TypeError):
1502            self.assertWarns(RuntimeWarning, None)
1503        # Failure when another warning is triggered
1504        with warnings.catch_warnings():
1505            # Force default filter (in case tests are run with -We)
1506            warnings.simplefilter("default", RuntimeWarning)
1507            with self.assertRaises(self.failureException):
1508                self.assertWarns(DeprecationWarning, _runtime_warn)
1509        # Filters for other warnings are not modified
1510        with warnings.catch_warnings():
1511            warnings.simplefilter("error", RuntimeWarning)
1512            with self.assertRaises(RuntimeWarning):
1513                self.assertWarns(DeprecationWarning, _runtime_warn)
1514
1515    def testAssertWarnsContext(self):
1516        # Believe it or not, it is preferable to duplicate all tests above,
1517        # to make sure the __warningregistry__ $@ is circumvented correctly.
1518        def _runtime_warn():
1519            warnings.warn("foo", RuntimeWarning)
1520        _runtime_warn_lineno = inspect.getsourcelines(_runtime_warn)[1]
1521        with self.assertWarns(RuntimeWarning) as cm:
1522            _runtime_warn()
1523        # A tuple of warning classes is accepted
1524        with self.assertWarns((DeprecationWarning, RuntimeWarning)) as cm:
1525            _runtime_warn()
1526        # The context manager exposes various useful attributes
1527        self.assertIsInstance(cm.warning, RuntimeWarning)
1528        self.assertEqual(cm.warning.args[0], "foo")
1529        self.assertIn("test_case.py", cm.filename)
1530        self.assertEqual(cm.lineno, _runtime_warn_lineno + 1)
1531        # Same with several warnings
1532        with self.assertWarns(RuntimeWarning):
1533            _runtime_warn()
1534            _runtime_warn()
1535        with self.assertWarns(RuntimeWarning):
1536            warnings.warn("foo", category=RuntimeWarning)
1537        # Failure when no warning is triggered
1538        with self.assertRaises(self.failureException):
1539            with self.assertWarns(RuntimeWarning):
1540                pass
1541        # Custom message
1542        with self.assertRaisesRegex(self.failureException, 'foobar'):
1543            with self.assertWarns(RuntimeWarning, msg='foobar'):
1544                pass
1545        # Invalid keyword argument
1546        with self.assertRaisesRegex(TypeError, 'foobar'):
1547            with self.assertWarns(RuntimeWarning, foobar=42):
1548                pass
1549        # Failure when another warning is triggered
1550        with warnings.catch_warnings():
1551            # Force default filter (in case tests are run with -We)
1552            warnings.simplefilter("default", RuntimeWarning)
1553            with self.assertRaises(self.failureException):
1554                with self.assertWarns(DeprecationWarning):
1555                    _runtime_warn()
1556        # Filters for other warnings are not modified
1557        with warnings.catch_warnings():
1558            warnings.simplefilter("error", RuntimeWarning)
1559            with self.assertRaises(RuntimeWarning):
1560                with self.assertWarns(DeprecationWarning):
1561                    _runtime_warn()
1562
1563    def testAssertWarnsNoExceptionType(self):
1564        with self.assertRaises(TypeError):
1565            self.assertWarns()
1566        with self.assertRaises(TypeError):
1567            self.assertWarns(1)
1568        with self.assertRaises(TypeError):
1569            self.assertWarns(object)
1570        with self.assertRaises(TypeError):
1571            self.assertWarns((UserWarning, 1))
1572        with self.assertRaises(TypeError):
1573            self.assertWarns((UserWarning, object))
1574        with self.assertRaises(TypeError):
1575            self.assertWarns((UserWarning, Exception))
1576
1577    def testAssertWarnsRegexCallable(self):
1578        def _runtime_warn(msg):
1579            warnings.warn(msg, RuntimeWarning)
1580        self.assertWarnsRegex(RuntimeWarning, "o+",
1581                              _runtime_warn, "foox")
1582        # Failure when no warning is triggered
1583        with self.assertRaises(self.failureException):
1584            self.assertWarnsRegex(RuntimeWarning, "o+",
1585                                  lambda: 0)
1586        # Failure when the function is None
1587        with self.assertRaises(TypeError):
1588            self.assertWarnsRegex(RuntimeWarning, "o+", None)
1589        # Failure when another warning is triggered
1590        with warnings.catch_warnings():
1591            # Force default filter (in case tests are run with -We)
1592            warnings.simplefilter("default", RuntimeWarning)
1593            with self.assertRaises(self.failureException):
1594                self.assertWarnsRegex(DeprecationWarning, "o+",
1595                                      _runtime_warn, "foox")
1596        # Failure when message doesn't match
1597        with self.assertRaises(self.failureException):
1598            self.assertWarnsRegex(RuntimeWarning, "o+",
1599                                  _runtime_warn, "barz")
1600        # A little trickier: we ask RuntimeWarnings to be raised, and then
1601        # check for some of them.  It is implementation-defined whether
1602        # non-matching RuntimeWarnings are simply re-raised, or produce a
1603        # failureException.
1604        with warnings.catch_warnings():
1605            warnings.simplefilter("error", RuntimeWarning)
1606            with self.assertRaises((RuntimeWarning, self.failureException)):
1607                self.assertWarnsRegex(RuntimeWarning, "o+",
1608                                      _runtime_warn, "barz")
1609
1610    def testAssertWarnsRegexContext(self):
1611        # Same as above, but with assertWarnsRegex as a context manager
1612        def _runtime_warn(msg):
1613            warnings.warn(msg, RuntimeWarning)
1614        _runtime_warn_lineno = inspect.getsourcelines(_runtime_warn)[1]
1615        with self.assertWarnsRegex(RuntimeWarning, "o+") as cm:
1616            _runtime_warn("foox")
1617        self.assertIsInstance(cm.warning, RuntimeWarning)
1618        self.assertEqual(cm.warning.args[0], "foox")
1619        self.assertIn("test_case.py", cm.filename)
1620        self.assertEqual(cm.lineno, _runtime_warn_lineno + 1)
1621        # Failure when no warning is triggered
1622        with self.assertRaises(self.failureException):
1623            with self.assertWarnsRegex(RuntimeWarning, "o+"):
1624                pass
1625        # Custom message
1626        with self.assertRaisesRegex(self.failureException, 'foobar'):
1627            with self.assertWarnsRegex(RuntimeWarning, 'o+', msg='foobar'):
1628                pass
1629        # Invalid keyword argument
1630        with self.assertRaisesRegex(TypeError, 'foobar'):
1631            with self.assertWarnsRegex(RuntimeWarning, 'o+', foobar=42):
1632                pass
1633        # Failure when another warning is triggered
1634        with warnings.catch_warnings():
1635            # Force default filter (in case tests are run with -We)
1636            warnings.simplefilter("default", RuntimeWarning)
1637            with self.assertRaises(self.failureException):
1638                with self.assertWarnsRegex(DeprecationWarning, "o+"):
1639                    _runtime_warn("foox")
1640        # Failure when message doesn't match
1641        with self.assertRaises(self.failureException):
1642            with self.assertWarnsRegex(RuntimeWarning, "o+"):
1643                _runtime_warn("barz")
1644        # A little trickier: we ask RuntimeWarnings to be raised, and then
1645        # check for some of them.  It is implementation-defined whether
1646        # non-matching RuntimeWarnings are simply re-raised, or produce a
1647        # failureException.
1648        with warnings.catch_warnings():
1649            warnings.simplefilter("error", RuntimeWarning)
1650            with self.assertRaises((RuntimeWarning, self.failureException)):
1651                with self.assertWarnsRegex(RuntimeWarning, "o+"):
1652                    _runtime_warn("barz")
1653
1654    def testAssertWarnsRegexNoExceptionType(self):
1655        with self.assertRaises(TypeError):
1656            self.assertWarnsRegex()
1657        with self.assertRaises(TypeError):
1658            self.assertWarnsRegex(UserWarning)
1659        with self.assertRaises(TypeError):
1660            self.assertWarnsRegex(1, 'expect')
1661        with self.assertRaises(TypeError):
1662            self.assertWarnsRegex(object, 'expect')
1663        with self.assertRaises(TypeError):
1664            self.assertWarnsRegex((UserWarning, 1), 'expect')
1665        with self.assertRaises(TypeError):
1666            self.assertWarnsRegex((UserWarning, object), 'expect')
1667        with self.assertRaises(TypeError):
1668            self.assertWarnsRegex((UserWarning, Exception), 'expect')
1669
1670    @contextlib.contextmanager
1671    def assertNoStderr(self):
1672        with captured_stderr() as buf:
1673            yield
1674        self.assertEqual(buf.getvalue(), "")
1675
1676    def assertLogRecords(self, records, matches):
1677        self.assertEqual(len(records), len(matches))
1678        for rec, match in zip(records, matches):
1679            self.assertIsInstance(rec, logging.LogRecord)
1680            for k, v in match.items():
1681                self.assertEqual(getattr(rec, k), v)
1682
1683    def testAssertLogsDefaults(self):
1684        # defaults: root logger, level INFO
1685        with self.assertNoStderr():
1686            with self.assertLogs() as cm:
1687                log_foo.info("1")
1688                log_foobar.debug("2")
1689            self.assertEqual(cm.output, ["INFO:foo:1"])
1690            self.assertLogRecords(cm.records, [{'name': 'foo'}])
1691
1692    def testAssertLogsTwoMatchingMessages(self):
1693        # Same, but with two matching log messages
1694        with self.assertNoStderr():
1695            with self.assertLogs() as cm:
1696                log_foo.info("1")
1697                log_foobar.debug("2")
1698                log_quux.warning("3")
1699            self.assertEqual(cm.output, ["INFO:foo:1", "WARNING:quux:3"])
1700            self.assertLogRecords(cm.records,
1701                                   [{'name': 'foo'}, {'name': 'quux'}])
1702
1703    def checkAssertLogsPerLevel(self, level):
1704        # Check level filtering
1705        with self.assertNoStderr():
1706            with self.assertLogs(level=level) as cm:
1707                log_foo.warning("1")
1708                log_foobar.error("2")
1709                log_quux.critical("3")
1710            self.assertEqual(cm.output, ["ERROR:foo.bar:2", "CRITICAL:quux:3"])
1711            self.assertLogRecords(cm.records,
1712                                   [{'name': 'foo.bar'}, {'name': 'quux'}])
1713
1714    def testAssertLogsPerLevel(self):
1715        self.checkAssertLogsPerLevel(logging.ERROR)
1716        self.checkAssertLogsPerLevel('ERROR')
1717
1718    def checkAssertLogsPerLogger(self, logger):
1719        # Check per-logger filtering
1720        with self.assertNoStderr():
1721            with self.assertLogs(level='DEBUG') as outer_cm:
1722                with self.assertLogs(logger, level='DEBUG') as cm:
1723                    log_foo.info("1")
1724                    log_foobar.debug("2")
1725                    log_quux.warning("3")
1726                self.assertEqual(cm.output, ["INFO:foo:1", "DEBUG:foo.bar:2"])
1727                self.assertLogRecords(cm.records,
1728                                       [{'name': 'foo'}, {'name': 'foo.bar'}])
1729            # The outer catchall caught the quux log
1730            self.assertEqual(outer_cm.output, ["WARNING:quux:3"])
1731
1732    def testAssertLogsPerLogger(self):
1733        self.checkAssertLogsPerLogger(logging.getLogger('foo'))
1734        self.checkAssertLogsPerLogger('foo')
1735
1736    def testAssertLogsFailureNoLogs(self):
1737        # Failure due to no logs
1738        with self.assertNoStderr():
1739            with self.assertRaises(self.failureException):
1740                with self.assertLogs():
1741                    pass
1742
1743    def testAssertLogsFailureLevelTooHigh(self):
1744        # Failure due to level too high
1745        with self.assertNoStderr():
1746            with self.assertRaises(self.failureException):
1747                with self.assertLogs(level='WARNING'):
1748                    log_foo.info("1")
1749
1750    def testAssertLogsFailureLevelTooHigh_FilterInRootLogger(self):
1751        # Failure due to level too high - message propagated to root
1752        with self.assertNoStderr():
1753            oldLevel = log_foo.level
1754            log_foo.setLevel(logging.INFO)
1755            try:
1756                with self.assertRaises(self.failureException):
1757                    with self.assertLogs(level='WARNING'):
1758                        log_foo.info("1")
1759            finally:
1760                log_foo.setLevel(oldLevel)
1761
1762    def testAssertLogsFailureMismatchingLogger(self):
1763        # Failure due to mismatching logger (and the logged message is
1764        # passed through)
1765        with self.assertLogs('quux', level='ERROR'):
1766            with self.assertRaises(self.failureException):
1767                with self.assertLogs('foo'):
1768                    log_quux.error("1")
1769
1770    def testAssertLogsUnexpectedException(self):
1771        # Check unexpected exception will go through.
1772        with self.assertRaises(ZeroDivisionError):
1773            with self.assertLogs():
1774                raise ZeroDivisionError("Unexpected")
1775
1776    def testAssertNoLogsDefault(self):
1777        with self.assertRaises(self.failureException) as cm:
1778            with self.assertNoLogs():
1779                log_foo.info("1")
1780                log_foobar.debug("2")
1781        self.assertEqual(
1782            str(cm.exception),
1783            "Unexpected logs found: ['INFO:foo:1']",
1784        )
1785
1786    def testAssertNoLogsFailureFoundLogs(self):
1787        with self.assertRaises(self.failureException) as cm:
1788            with self.assertNoLogs():
1789                log_quux.error("1")
1790                log_foo.error("foo")
1791
1792        self.assertEqual(
1793            str(cm.exception),
1794            "Unexpected logs found: ['ERROR:quux:1', 'ERROR:foo:foo']",
1795        )
1796
1797    def testAssertNoLogsPerLogger(self):
1798        with self.assertNoStderr():
1799            with self.assertLogs(log_quux):
1800                with self.assertNoLogs(logger=log_foo):
1801                    log_quux.error("1")
1802
1803    def testAssertNoLogsFailurePerLogger(self):
1804        # Failure due to unexpected logs for the given logger or its
1805        # children.
1806        with self.assertRaises(self.failureException) as cm:
1807            with self.assertLogs(log_quux):
1808                with self.assertNoLogs(logger=log_foo):
1809                    log_quux.error("1")
1810                    log_foobar.info("2")
1811        self.assertEqual(
1812            str(cm.exception),
1813            "Unexpected logs found: ['INFO:foo.bar:2']",
1814        )
1815
1816    def testAssertNoLogsPerLevel(self):
1817        # Check per-level filtering
1818        with self.assertNoStderr():
1819            with self.assertNoLogs(level="ERROR"):
1820                log_foo.info("foo")
1821                log_quux.debug("1")
1822
1823    def testAssertNoLogsFailurePerLevel(self):
1824        # Failure due to unexpected logs at the specified level.
1825        with self.assertRaises(self.failureException) as cm:
1826            with self.assertNoLogs(level="DEBUG"):
1827                log_foo.debug("foo")
1828                log_quux.debug("1")
1829        self.assertEqual(
1830            str(cm.exception),
1831            "Unexpected logs found: ['DEBUG:foo:foo', 'DEBUG:quux:1']",
1832        )
1833
1834    def testAssertNoLogsUnexpectedException(self):
1835        # Check unexpected exception will go through.
1836        with self.assertRaises(ZeroDivisionError):
1837            with self.assertNoLogs():
1838                raise ZeroDivisionError("Unexpected")
1839
1840    def testAssertNoLogsYieldsNone(self):
1841        with self.assertNoLogs() as value:
1842            pass
1843        self.assertIsNone(value)
1844
1845    def testDeprecatedFailMethods(self):
1846        """Test that the deprecated fail* methods get removed in 3.12"""
1847        deprecated_names = [
1848            'failIfEqual', 'failUnlessEqual', 'failUnlessAlmostEqual',
1849            'failIfAlmostEqual', 'failUnless', 'failUnlessRaises', 'failIf',
1850            'assertNotEquals', 'assertEquals', 'assertAlmostEquals',
1851            'assertNotAlmostEquals', 'assert_', 'assertDictContainsSubset',
1852            'assertRaisesRegexp', 'assertRegexpMatches'
1853        ]
1854        for deprecated_name in deprecated_names:
1855            with self.assertRaises(AttributeError):
1856                getattr(self, deprecated_name)
1857
1858    def testDeepcopy(self):
1859        # Issue: 5660
1860        class TestableTest(unittest.TestCase):
1861            def testNothing(self):
1862                pass
1863
1864        test = TestableTest('testNothing')
1865
1866        # This shouldn't blow up
1867        deepcopy(test)
1868
1869    def testPickle(self):
1870        # Issue 10326
1871
1872        # Can't use TestCase classes defined in Test class as
1873        # pickle does not work with inner classes
1874        test = unittest.TestCase('run')
1875        for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1876
1877            # blew up prior to fix
1878            pickled_test = pickle.dumps(test, protocol=protocol)
1879            unpickled_test = pickle.loads(pickled_test)
1880            self.assertEqual(test, unpickled_test)
1881
1882            # exercise the TestCase instance in a way that will invoke
1883            # the type equality lookup mechanism
1884            unpickled_test.assertEqual(set(), set())
1885
1886    def testKeyboardInterrupt(self):
1887        def _raise(self=None):
1888            raise KeyboardInterrupt
1889        def nothing(self):
1890            pass
1891
1892        class Test1(unittest.TestCase):
1893            test_something = _raise
1894
1895        class Test2(unittest.TestCase):
1896            setUp = _raise
1897            test_something = nothing
1898
1899        class Test3(unittest.TestCase):
1900            test_something = nothing
1901            tearDown = _raise
1902
1903        class Test4(unittest.TestCase):
1904            def test_something(self):
1905                self.addCleanup(_raise)
1906
1907        for klass in (Test1, Test2, Test3, Test4):
1908            with self.assertRaises(KeyboardInterrupt):
1909                klass('test_something').run()
1910
1911    def testSkippingEverywhere(self):
1912        def _skip(self=None):
1913            raise unittest.SkipTest('some reason')
1914        def nothing(self):
1915            pass
1916
1917        class Test1(unittest.TestCase):
1918            test_something = _skip
1919
1920        class Test2(unittest.TestCase):
1921            setUp = _skip
1922            test_something = nothing
1923
1924        class Test3(unittest.TestCase):
1925            test_something = nothing
1926            tearDown = _skip
1927
1928        class Test4(unittest.TestCase):
1929            def test_something(self):
1930                self.addCleanup(_skip)
1931
1932        for klass in (Test1, Test2, Test3, Test4):
1933            result = unittest.TestResult()
1934            klass('test_something').run(result)
1935            self.assertEqual(len(result.skipped), 1)
1936            self.assertEqual(result.testsRun, 1)
1937
1938    def testSystemExit(self):
1939        def _raise(self=None):
1940            raise SystemExit
1941        def nothing(self):
1942            pass
1943
1944        class Test1(unittest.TestCase):
1945            test_something = _raise
1946
1947        class Test2(unittest.TestCase):
1948            setUp = _raise
1949            test_something = nothing
1950
1951        class Test3(unittest.TestCase):
1952            test_something = nothing
1953            tearDown = _raise
1954
1955        class Test4(unittest.TestCase):
1956            def test_something(self):
1957                self.addCleanup(_raise)
1958
1959        for klass in (Test1, Test2, Test3, Test4):
1960            result = unittest.TestResult()
1961            klass('test_something').run(result)
1962            self.assertEqual(len(result.errors), 1)
1963            self.assertEqual(result.testsRun, 1)
1964
1965    @support.cpython_only
1966    def testNoCycles(self):
1967        case = unittest.TestCase()
1968        wr = weakref.ref(case)
1969        with support.disable_gc():
1970            del case
1971            self.assertFalse(wr())
1972
1973    def test_no_exception_leak(self):
1974        # Issue #19880: TestCase.run() should not keep a reference
1975        # to the exception
1976        class MyException(Exception):
1977            ninstance = 0
1978
1979            def __init__(self):
1980                MyException.ninstance += 1
1981                Exception.__init__(self)
1982
1983            def __del__(self):
1984                MyException.ninstance -= 1
1985
1986        class TestCase(unittest.TestCase):
1987            def test1(self):
1988                raise MyException()
1989
1990            @unittest.expectedFailure
1991            def test2(self):
1992                raise MyException()
1993
1994        for method_name in ('test1', 'test2'):
1995            testcase = TestCase(method_name)
1996            testcase.run()
1997            gc_collect()  # For PyPy or other GCs.
1998            self.assertEqual(MyException.ninstance, 0)
1999
2000
2001if __name__ == "__main__":
2002    unittest.main()
2003