Home | History | Annotate | Download | only in test
      1 import difflib
      2 import pprint
      3 import re
      4 import sys
      5 
      6 from copy import deepcopy
      7 from test import test_support
      8 
      9 import unittest
     10 
     11 from .support import (
     12     TestEquality, TestHashing, LoggingResult, ResultWithNoStartTestRunStopTestRun
     13 )
     14 
     15 
     16 class Test(object):
     17     "Keep these TestCase classes out of the main namespace"
     18 
     19     class Foo(unittest.TestCase):
     20         def runTest(self): pass
     21         def test1(self): pass
     22 
     23     class Bar(Foo):
     24         def test2(self): pass
     25 
     26     class LoggingTestCase(unittest.TestCase):
     27         """A test case which logs its calls."""
     28 
     29         def __init__(self, events):
     30             super(Test.LoggingTestCase, self).__init__('test')
     31             self.events = events
     32 
     33         def setUp(self):
     34             self.events.append('setUp')
     35 
     36         def test(self):
     37             self.events.append('test')
     38 
     39         def tearDown(self):
     40             self.events.append('tearDown')
     41 
     42 
     43 class Test_TestCase(unittest.TestCase, TestEquality, TestHashing):
     44 
     45     ### Set up attributes used by inherited tests

     46     ################################################################

     47 
     48     # Used by TestHashing.test_hash and TestEquality.test_eq

     49     eq_pairs = [(Test.Foo('test1'), Test.Foo('test1'))]
     50 
     51     # Used by TestEquality.test_ne

     52     ne_pairs = [(Test.Foo('test1'), Test.Foo('runTest'))
     53                ,(Test.Foo('test1'), Test.Bar('test1'))
     54                ,(Test.Foo('test1'), Test.Bar('test2'))]
     55 
     56     ################################################################

     57     ### /Set up attributes used by inherited tests

     58 
     59 
     60     # "class TestCase([methodName])"

     61     # ...

     62     # "Each instance of TestCase will run a single test method: the

     63     # method named methodName."

     64     # ...

     65     # "methodName defaults to "runTest"."

     66     #

     67     # Make sure it really is optional, and that it defaults to the proper

     68     # thing.

     69     def test_init__no_test_name(self):
     70         class Test(unittest.TestCase):
     71             def runTest(self): raise TypeError()
     72             def test(self): pass
     73 
     74         self.assertEqual(Test().id()[-13:], '.Test.runTest')
     75 
     76     # "class TestCase([methodName])"

     77     # ...

     78     # "Each instance of TestCase will run a single test method: the

     79     # method named methodName."

     80     def test_init__test_name__valid(self):
     81         class Test(unittest.TestCase):
     82             def runTest(self): raise TypeError()
     83             def test(self): pass
     84 
     85         self.assertEqual(Test('test').id()[-10:], '.Test.test')
     86 
     87     # "class TestCase([methodName])"

     88     # ...

     89     # "Each instance of TestCase will run a single test method: the

     90     # method named methodName."

     91     def test_init__test_name__invalid(self):
     92         class Test(unittest.TestCase):
     93             def runTest(self): raise TypeError()
     94             def test(self): pass
     95 
     96         try:
     97             Test('testfoo')
     98         except ValueError:
     99             pass
    100         else:
    101             self.fail("Failed to raise ValueError")
    102 
    103     # "Return the number of tests represented by the this test object. For

    104     # TestCase instances, this will always be 1"

    105     def test_countTestCases(self):
    106         class Foo(unittest.TestCase):
    107             def test(self): pass
    108 
    109         self.assertEqual(Foo('test').countTestCases(), 1)
    110 
    111     # "Return the default type of test result object to be used to run this

    112     # test. For TestCase instances, this will always be

    113     # unittest.TestResult;  subclasses of TestCase should

    114     # override this as necessary."

    115     def test_defaultTestResult(self):
    116         class Foo(unittest.TestCase):
    117             def runTest(self):
    118                 pass
    119 
    120         result = Foo().defaultTestResult()
    121         self.assertEqual(type(result), unittest.TestResult)
    122 
    123     # "When a setUp() method is defined, the test runner will run that method

    124     # prior to each test. Likewise, if a tearDown() method is defined, the

    125     # test runner will invoke that method after each test. In the example,

    126     # setUp() was used to create a fresh sequence for each test."

    127     #

    128     # Make sure the proper call order is maintained, even if setUp() raises

    129     # an exception.

    130     def test_run_call_order__error_in_setUp(self):
    131         events = []
    132         result = LoggingResult(events)
    133 
    134         class Foo(Test.LoggingTestCase):
    135             def setUp(self):
    136                 super(Foo, self).setUp()
    137                 raise RuntimeError('raised by Foo.setUp')
    138 
    139         Foo(events).run(result)
    140         expected = ['startTest', 'setUp', 'addError', 'stopTest']
    141         self.assertEqual(events, expected)
    142 
    143     # "With a temporary result stopTestRun is called when setUp errors.

    144     def test_run_call_order__error_in_setUp_default_result(self):
    145         events = []
    146 
    147         class Foo(Test.LoggingTestCase):
    148             def defaultTestResult(self):
    149                 return LoggingResult(self.events)
    150 
    151             def setUp(self):
    152                 super(Foo, self).setUp()
    153                 raise RuntimeError('raised by Foo.setUp')
    154 
    155         Foo(events).run()
    156         expected = ['startTestRun', 'startTest', 'setUp', 'addError',
    157                     'stopTest', 'stopTestRun']
    158         self.assertEqual(events, expected)
    159 
    160     # "When a setUp() method is defined, the test runner will run that method

    161     # prior to each test. Likewise, if a tearDown() method is defined, the

    162     # test runner will invoke that method after each test. In the example,

    163     # setUp() was used to create a fresh sequence for each test."

    164     #

    165     # Make sure the proper call order is maintained, even if the test raises

    166     # an error (as opposed to a failure).

    167     def test_run_call_order__error_in_test(self):
    168         events = []
    169         result = LoggingResult(events)
    170 
    171         class Foo(Test.LoggingTestCase):
    172             def test(self):
    173                 super(Foo, self).test()
    174                 raise RuntimeError('raised by Foo.test')
    175 
    176         expected = ['startTest', 'setUp', 'test', 'addError', 'tearDown',
    177                     'stopTest']
    178         Foo(events).run(result)
    179         self.assertEqual(events, expected)
    180 
    181     # "With a default result, an error in the test still results in stopTestRun

    182     # being called."

    183     def test_run_call_order__error_in_test_default_result(self):
    184         events = []
    185 
    186         class Foo(Test.LoggingTestCase):
    187             def defaultTestResult(self):
    188                 return LoggingResult(self.events)
    189 
    190             def test(self):
    191                 super(Foo, self).test()
    192                 raise RuntimeError('raised by Foo.test')
    193 
    194         expected = ['startTestRun', 'startTest', 'setUp', 'test', 'addError',
    195                     'tearDown', 'stopTest', 'stopTestRun']
    196         Foo(events).run()
    197         self.assertEqual(events, expected)
    198 
    199     # "When a setUp() method is defined, the test runner will run that method

    200     # prior to each test. Likewise, if a tearDown() method is defined, the

    201     # test runner will invoke that method after each test. In the example,

    202     # setUp() was used to create a fresh sequence for each test."

    203     #

    204     # Make sure the proper call order is maintained, even if the test signals

    205     # a failure (as opposed to an error).

    206     def test_run_call_order__failure_in_test(self):
    207         events = []
    208         result = LoggingResult(events)
    209 
    210         class Foo(Test.LoggingTestCase):
    211             def test(self):
    212                 super(Foo, self).test()
    213                 self.fail('raised by Foo.test')
    214 
    215         expected = ['startTest', 'setUp', 'test', 'addFailure', 'tearDown',
    216                     'stopTest']
    217         Foo(events).run(result)
    218         self.assertEqual(events, expected)
    219 
    220     # "When a test fails with a default result stopTestRun is still called."

    221     def test_run_call_order__failure_in_test_default_result(self):
    222 
    223         class Foo(Test.LoggingTestCase):
    224             def defaultTestResult(self):
    225                 return LoggingResult(self.events)
    226             def test(self):
    227                 super(Foo, self).test()
    228                 self.fail('raised by Foo.test')
    229 
    230         expected = ['startTestRun', 'startTest', 'setUp', 'test', 'addFailure',
    231                     'tearDown', 'stopTest', 'stopTestRun']
    232         events = []
    233         Foo(events).run()
    234         self.assertEqual(events, expected)
    235 
    236     # "When a setUp() method is defined, the test runner will run that method

    237     # prior to each test. Likewise, if a tearDown() method is defined, the

    238     # test runner will invoke that method after each test. In the example,

    239     # setUp() was used to create a fresh sequence for each test."

    240     #

    241     # Make sure the proper call order is maintained, even if tearDown() raises

    242     # an exception.

    243     def test_run_call_order__error_in_tearDown(self):
    244         events = []
    245         result = LoggingResult(events)
    246 
    247         class Foo(Test.LoggingTestCase):
    248             def tearDown(self):
    249                 super(Foo, self).tearDown()
    250                 raise RuntimeError('raised by Foo.tearDown')
    251 
    252         Foo(events).run(result)
    253         expected = ['startTest', 'setUp', 'test', 'tearDown', 'addError',
    254                     'stopTest']
    255         self.assertEqual(events, expected)
    256 
    257     # "When tearDown errors with a default result stopTestRun is still called."

    258     def test_run_call_order__error_in_tearDown_default_result(self):
    259 
    260         class Foo(Test.LoggingTestCase):
    261             def defaultTestResult(self):
    262                 return LoggingResult(self.events)
    263             def tearDown(self):
    264                 super(Foo, self).tearDown()
    265                 raise RuntimeError('raised by Foo.tearDown')
    266 
    267         events = []
    268         Foo(events).run()
    269         expected = ['startTestRun', 'startTest', 'setUp', 'test', 'tearDown',
    270                     'addError', 'stopTest', 'stopTestRun']
    271         self.assertEqual(events, expected)
    272 
    273     # "TestCase.run() still works when the defaultTestResult is a TestResult

    274     # that does not support startTestRun and stopTestRun.

    275     def test_run_call_order_default_result(self):
    276 
    277         class Foo(unittest.TestCase):
    278             def defaultTestResult(self):
    279                 return ResultWithNoStartTestRunStopTestRun()
    280             def test(self):
    281                 pass
    282 
    283         Foo('test').run()
    284 
    285     # "This class attribute gives the exception raised by the test() method.

    286     # If a test framework needs to use a specialized exception, possibly to

    287     # carry additional information, it must subclass this exception in

    288     # order to ``play fair'' with the framework.  The initial value of this

    289     # attribute is AssertionError"

    290     def test_failureException__default(self):
    291         class Foo(unittest.TestCase):
    292             def test(self):
    293                 pass
    294 
    295         self.assertTrue(Foo('test').failureException is AssertionError)
    296 
    297     # "This class attribute gives the exception raised by the test() method.

    298     # If a test framework needs to use a specialized exception, possibly to

    299     # carry additional information, it must subclass this exception in

    300     # order to ``play fair'' with the framework."

    301     #

    302     # Make sure TestCase.run() respects the designated failureException

    303     def test_failureException__subclassing__explicit_raise(self):
    304         events = []
    305         result = LoggingResult(events)
    306 
    307         class Foo(unittest.TestCase):
    308             def test(self):
    309                 raise RuntimeError()
    310 
    311             failureException = RuntimeError
    312 
    313         self.assertTrue(Foo('test').failureException is RuntimeError)
    314 
    315 
    316         Foo('test').run(result)
    317         expected = ['startTest', 'addFailure', 'stopTest']
    318         self.assertEqual(events, expected)
    319 
    320     # "This class attribute gives the exception raised by the test() method.

    321     # If a test framework needs to use a specialized exception, possibly to

    322     # carry additional information, it must subclass this exception in

    323     # order to ``play fair'' with the framework."

    324     #

    325     # Make sure TestCase.run() respects the designated failureException

    326     def test_failureException__subclassing__implicit_raise(self):
    327         events = []
    328         result = LoggingResult(events)
    329 
    330         class Foo(unittest.TestCase):
    331             def test(self):
    332                 self.fail("foo")
    333 
    334             failureException = RuntimeError
    335 
    336         self.assertTrue(Foo('test').failureException is RuntimeError)
    337 
    338 
    339         Foo('test').run(result)
    340         expected = ['startTest', 'addFailure', 'stopTest']
    341         self.assertEqual(events, expected)
    342 
    343     # "The default implementation does nothing."

    344     def test_setUp(self):
    345         class Foo(unittest.TestCase):
    346             def runTest(self):
    347                 pass
    348 
    349         # ... and nothing should happen

    350         Foo().setUp()
    351 
    352     # "The default implementation does nothing."

    353     def test_tearDown(self):
    354         class Foo(unittest.TestCase):
    355             def runTest(self):
    356                 pass
    357 
    358         # ... and nothing should happen

    359         Foo().tearDown()
    360 
    361     # "Return a string identifying the specific test case."

    362     #

    363     # Because of the vague nature of the docs, I'm not going to lock this

    364     # test down too much. Really all that can be asserted is that the id()

    365     # will be a string (either 8-byte or unicode -- again, because the docs

    366     # just say "string")

    367     def test_id(self):
    368         class Foo(unittest.TestCase):
    369             def runTest(self):
    370                 pass
    371 
    372         self.assertIsInstance(Foo().id(), basestring)
    373 
    374     # "If result is omitted or None, a temporary result object is created

    375     # and used, but is not made available to the caller. As TestCase owns the

    376     # temporary result startTestRun and stopTestRun are called.

    377 
    378     def test_run__uses_defaultTestResult(self):
    379         events = []
    380 
    381         class Foo(unittest.TestCase):
    382             def test(self):
    383                 events.append('test')
    384 
    385             def defaultTestResult(self):
    386                 return LoggingResult(events)
    387 
    388         # Make run() find a result object on its own

    389         Foo('test').run()
    390 
    391         expected = ['startTestRun', 'startTest', 'test', 'addSuccess',
    392             'stopTest', 'stopTestRun']
    393         self.assertEqual(events, expected)
    394 
    395     def testShortDescriptionWithoutDocstring(self):
    396         self.assertIsNone(self.shortDescription())
    397 
    398     @unittest.skipIf(sys.flags.optimize >= 2,
    399                      "Docstrings are omitted with -O2 and above")
    400     def testShortDescriptionWithOneLineDocstring(self):
    401         """Tests shortDescription() for a method with a docstring."""
    402         self.assertEqual(
    403                 self.shortDescription(),
    404                 'Tests shortDescription() for a method with a docstring.')
    405 
    406     @unittest.skipIf(sys.flags.optimize >= 2,
    407                      "Docstrings are omitted with -O2 and above")
    408     def testShortDescriptionWithMultiLineDocstring(self):
    409         """Tests shortDescription() for a method with a longer docstring.
    410 
    411         This method ensures that only the first line of a docstring is
    412         returned used in the short description, no matter how long the
    413         whole thing is.
    414         """
    415         self.assertEqual(
    416                 self.shortDescription(),
    417                  'Tests shortDescription() for a method with a longer '
    418                  'docstring.')
    419 
    420     def testAddTypeEqualityFunc(self):
    421         class SadSnake(object):
    422             """Dummy class for test_addTypeEqualityFunc."""
    423         s1, s2 = SadSnake(), SadSnake()
    424         self.assertNotEqual(s1, s2)
    425         def AllSnakesCreatedEqual(a, b, msg=None):
    426             return type(a) is type(b) is SadSnake
    427         self.addTypeEqualityFunc(SadSnake, AllSnakesCreatedEqual)
    428         self.assertEqual(s1, s2)
    429         # No this doesn't clean up and remove the SadSnake equality func

    430         # from this TestCase instance but since its a local nothing else

    431         # will ever notice that.

    432 
    433     def testAssertIs(self):
    434         thing = object()
    435         self.assertIs(thing, thing)
    436         self.assertRaises(self.failureException, self.assertIs, thing, object())
    437 
    438     def testAssertIsNot(self):
    439         thing = object()
    440         self.assertIsNot(thing, object())
    441         self.assertRaises(self.failureException, self.assertIsNot, thing, thing)
    442 
    443     def testAssertIsInstance(self):
    444         thing = []
    445         self.assertIsInstance(thing, list)
    446         self.assertRaises(self.failureException, self.assertIsInstance,
    447                           thing, dict)
    448 
    449     def testAssertNotIsInstance(self):
    450         thing = []
    451         self.assertNotIsInstance(thing, dict)
    452         self.assertRaises(self.failureException, self.assertNotIsInstance,
    453                           thing, list)
    454 
    455     def testAssertIn(self):
    456         animals = {'monkey': 'banana', 'cow': 'grass', 'seal': 'fish'}
    457 
    458         self.assertIn('a', 'abc')
    459         self.assertIn(2, [1, 2, 3])
    460         self.assertIn('monkey', animals)
    461 
    462         self.assertNotIn('d', 'abc')
    463         self.assertNotIn(0, [1, 2, 3])
    464         self.assertNotIn('otter', animals)
    465 
    466         self.assertRaises(self.failureException, self.assertIn, 'x', 'abc')
    467         self.assertRaises(self.failureException, self.assertIn, 4, [1, 2, 3])
    468         self.assertRaises(self.failureException, self.assertIn, 'elephant',
    469                           animals)
    470 
    471         self.assertRaises(self.failureException, self.assertNotIn, 'c', 'abc')
    472         self.assertRaises(self.failureException, self.assertNotIn, 1, [1, 2, 3])
    473         self.assertRaises(self.failureException, self.assertNotIn, 'cow',
    474                           animals)
    475 
    476     def testAssertDictContainsSubset(self):
    477         self.assertDictContainsSubset({}, {})
    478         self.assertDictContainsSubset({}, {'a': 1})
    479         self.assertDictContainsSubset({'a': 1}, {'a': 1})
    480         self.assertDictContainsSubset({'a': 1}, {'a': 1, 'b': 2})
    481         self.assertDictContainsSubset({'a': 1, 'b': 2}, {'a': 1, 'b': 2})
    482 
    483         with self.assertRaises(self.failureException):
    484             self.assertDictContainsSubset({1: "one"}, {})
    485 
    486         with self.assertRaises(self.failureException):
    487             self.assertDictContainsSubset({'a': 2}, {'a': 1})
    488 
    489         with self.assertRaises(self.failureException):
    490             self.assertDictContainsSubset({'c': 1}, {'a': 1})
    491 
    492         with self.assertRaises(self.failureException):
    493             self.assertDictContainsSubset({'a': 1, 'c': 1}, {'a': 1})
    494 
    495         with self.assertRaises(self.failureException):
    496             self.assertDictContainsSubset({'a': 1, 'c': 1}, {'a': 1})
    497 
    498         with test_support.check_warnings(("", UnicodeWarning)):
    499             one = ''.join(chr(i) for i in range(255))
    500             # this used to cause a UnicodeDecodeError constructing the failure msg

    501             with self.assertRaises(self.failureException):
    502                 self.assertDictContainsSubset({'foo': one}, {'foo': u'\uFFFD'})
    503 
    504     def testAssertEqual(self):
    505         equal_pairs = [
    506                 ((), ()),
    507                 ({}, {}),
    508                 ([], []),
    509                 (set(), set()),
    510                 (frozenset(), frozenset())]
    511         for a, b in equal_pairs:
    512             # This mess of try excepts is to test the assertEqual behavior

    513             # itself.

    514             try:
    515                 self.assertEqual(a, b)
    516             except self.failureException:
    517                 self.fail('assertEqual(%r, %r) failed' % (a, b))
    518             try:
    519                 self.assertEqual(a, b, msg='foo')
    520             except self.failureException:
    521                 self.fail('assertEqual(%r, %r) with msg= failed' % (a, b))
    522             try:
    523                 self.assertEqual(a, b, 'foo')
    524             except self.failureException:
    525                 self.fail('assertEqual(%r, %r) with third parameter failed' %
    526                           (a, b))
    527 
    528         unequal_pairs = [
    529                ((), []),
    530                ({}, set()),
    531                (set([4,1]), frozenset([4,2])),
    532                (frozenset([4,5]), set([2,3])),
    533                (set([3,4]), set([5,4]))]
    534         for a, b in unequal_pairs:
    535             self.assertRaises(self.failureException, self.assertEqual, a, b)
    536             self.assertRaises(self.failureException, self.assertEqual, a, b,
    537                               'foo')
    538             self.assertRaises(self.failureException, self.assertEqual, a, b,
    539                               msg='foo')
    540 
    541     def testEquality(self):
    542         self.assertListEqual([], [])
    543         self.assertTupleEqual((), ())
    544         self.assertSequenceEqual([], ())
    545 
    546         a = [0, 'a', []]
    547         b = []
    548         self.assertRaises(unittest.TestCase.failureException,
    549                           self.assertListEqual, a, b)
    550         self.assertRaises(unittest.TestCase.failureException,
    551                           self.assertListEqual, tuple(a), tuple(b))
    552         self.assertRaises(unittest.TestCase.failureException,
    553                           self.assertSequenceEqual, a, tuple(b))
    554 
    555         b.extend(a)
    556         self.assertListEqual(a, b)
    557         self.assertTupleEqual(tuple(a), tuple(b))
    558         self.assertSequenceEqual(a, tuple(b))
    559         self.assertSequenceEqual(tuple(a), b)
    560 
    561         self.assertRaises(self.failureException, self.assertListEqual,
    562                           a, tuple(b))
    563         self.assertRaises(self.failureException, self.assertTupleEqual,
    564                           tuple(a), b)
    565         self.assertRaises(self.failureException, self.assertListEqual, None, b)
    566         self.assertRaises(self.failureException, self.assertTupleEqual, None,
    567                           tuple(b))
    568         self.assertRaises(self.failureException, self.assertSequenceEqual,
    569                           None, tuple(b))
    570         self.assertRaises(self.failureException, self.assertListEqual, 1, 1)
    571         self.assertRaises(self.failureException, self.assertTupleEqual, 1, 1)
    572         self.assertRaises(self.failureException, self.assertSequenceEqual,
    573                           1, 1)
    574 
    575         self.assertDictEqual({}, {})
    576 
    577         c = { 'x': 1 }
    578         d = {}
    579         self.assertRaises(unittest.TestCase.failureException,
    580                           self.assertDictEqual, c, d)
    581 
    582         d.update(c)
    583         self.assertDictEqual(c, d)
    584 
    585         d['x'] = 0
    586         self.assertRaises(unittest.TestCase.failureException,
    587                           self.assertDictEqual, c, d, 'These are unequal')
    588 
    589         self.assertRaises(self.failureException, self.assertDictEqual, None, d)
    590         self.assertRaises(self.failureException, self.assertDictEqual, [], d)
    591         self.assertRaises(self.failureException, self.assertDictEqual, 1, 1)
    592 
    593     def testAssertSequenceEqualMaxDiff(self):
    594         self.assertEqual(self.maxDiff, 80*8)
    595         seq1 = 'a' + 'x' * 80**2
    596         seq2 = 'b' + 'x' * 80**2
    597         diff = '\n'.join(difflib.ndiff(pprint.pformat(seq1).splitlines(),
    598                                        pprint.pformat(seq2).splitlines()))
    599         # the +1 is the leading \n added by assertSequenceEqual

    600         omitted = unittest.case.DIFF_OMITTED % (len(diff) + 1,)
    601 
    602         self.maxDiff = len(diff)//2
    603         try:
    604             self.assertSequenceEqual(seq1, seq2)
    605         except self.failureException as e:
    606             msg = e.args[0]
    607         else:
    608             self.fail('assertSequenceEqual did not fail.')
    609         self.assertTrue(len(msg) < len(diff))
    610         self.assertIn(omitted, msg)
    611 
    612         self.maxDiff = len(diff) * 2
    613         try:
    614             self.assertSequenceEqual(seq1, seq2)
    615         except self.failureException as e:
    616             msg = e.args[0]
    617         else:
    618             self.fail('assertSequenceEqual did not fail.')
    619         self.assertTrue(len(msg) > len(diff))
    620         self.assertNotIn(omitted, msg)
    621 
    622         self.maxDiff = None
    623         try:
    624             self.assertSequenceEqual(seq1, seq2)
    625         except self.failureException as e:
    626             msg = e.args[0]
    627         else:
    628             self.fail('assertSequenceEqual did not fail.')
    629         self.assertTrue(len(msg) > len(diff))
    630         self.assertNotIn(omitted, msg)
    631 
    632     def testTruncateMessage(self):
    633         self.maxDiff = 1
    634         message = self._truncateMessage('foo', 'bar')
    635         omitted = unittest.case.DIFF_OMITTED % len('bar')
    636         self.assertEqual(message, 'foo' + omitted)
    637 
    638         self.maxDiff = None
    639         message = self._truncateMessage('foo', 'bar')
    640         self.assertEqual(message, 'foobar')
    641 
    642         self.maxDiff = 4
    643         message = self._truncateMessage('foo', 'bar')
    644         self.assertEqual(message, 'foobar')
    645 
    646     def testAssertDictEqualTruncates(self):
    647         test = unittest.TestCase('assertEqual')
    648         def truncate(msg, diff):
    649             return 'foo'
    650         test._truncateMessage = truncate
    651         try:
    652             test.assertDictEqual({}, {1: 0})
    653         except self.failureException as e:
    654             self.assertEqual(str(e), 'foo')
    655         else:
    656             self.fail('assertDictEqual did not fail')
    657 
    658     def testAssertMultiLineEqualTruncates(self):
    659         test = unittest.TestCase('assertEqual')
    660         def truncate(msg, diff):
    661             return 'foo'
    662         test._truncateMessage = truncate
    663         try:
    664             test.assertMultiLineEqual('foo', 'bar')
    665         except self.failureException as e:
    666             self.assertEqual(str(e), 'foo')
    667         else:
    668             self.fail('assertMultiLineEqual did not fail')
    669 
    670     def testAssertEqual_diffThreshold(self):
    671         # check threshold value

    672         self.assertEqual(self._diffThreshold, 2**16)
    673         # disable madDiff to get diff markers

    674         self.maxDiff = None
    675 
    676         # set a lower threshold value and add a cleanup to restore it

    677         old_threshold = self._diffThreshold
    678         self._diffThreshold = 2**8
    679         self.addCleanup(lambda: setattr(self, '_diffThreshold', old_threshold))
    680 
    681         # under the threshold: diff marker (^) in error message

    682         s = u'x' * (2**7)
    683         with self.assertRaises(self.failureException) as cm:
    684             self.assertEqual(s + 'a', s + 'b')
    685         self.assertIn('^', str(cm.exception))
    686         self.assertEqual(s + 'a', s + 'a')
    687 
    688         # over the threshold: diff not used and marker (^) not in error message

    689         s = u'x' * (2**9)
    690         # if the path that uses difflib is taken, _truncateMessage will be

    691         # called -- replace it with explodingTruncation to verify that this

    692         # doesn't happen

    693         def explodingTruncation(message, diff):
    694             raise SystemError('this should not be raised')
    695         old_truncate = self._truncateMessage
    696         self._truncateMessage = explodingTruncation
    697         self.addCleanup(lambda: setattr(self, '_truncateMessage', old_truncate))
    698 
    699         s1, s2 = s + 'a', s + 'b'
    700         with self.assertRaises(self.failureException) as cm:
    701             self.assertEqual(s1, s2)
    702         self.assertNotIn('^', str(cm.exception))
    703         self.assertEqual(str(cm.exception), '%r != %r' % (s1, s2))
    704         self.assertEqual(s + 'a', s + 'a')
    705 
    706     def testAssertItemsEqual(self):
    707         a = object()
    708         self.assertItemsEqual([1, 2, 3], [3, 2, 1])
    709         self.assertItemsEqual(['foo', 'bar', 'baz'], ['bar', 'baz', 'foo'])
    710         self.assertItemsEqual([a, a, 2, 2, 3], (a, 2, 3, a, 2))
    711         self.assertItemsEqual([1, "2", "a", "a"], ["a", "2", True, "a"])
    712         self.assertRaises(self.failureException, self.assertItemsEqual,
    713                           [1, 2] + [3] * 100, [1] * 100 + [2, 3])
    714         self.assertRaises(self.failureException, self.assertItemsEqual,
    715                           [1, "2", "a", "a"], ["a", "2", True, 1])
    716         self.assertRaises(self.failureException, self.assertItemsEqual,
    717                           [10], [10, 11])
    718         self.assertRaises(self.failureException, self.assertItemsEqual,
    719                           [10, 11], [10])
    720         self.assertRaises(self.failureException, self.assertItemsEqual,
    721                           [10, 11, 10], [10, 11])
    722 
    723         # Test that sequences of unhashable objects can be tested for sameness:

    724         self.assertItemsEqual([[1, 2], [3, 4], 0], [False, [3, 4], [1, 2]])
    725         # Test that iterator of unhashable objects can be tested for sameness:

    726         self.assertItemsEqual(iter([1, 2, [], 3, 4]),
    727                               iter([1, 2, [], 3, 4]))
    728 
    729         # hashable types, but not orderable

    730         self.assertRaises(self.failureException, self.assertItemsEqual,
    731                           [], [divmod, 'x', 1, 5j, 2j, frozenset()])
    732         # comparing dicts

    733         self.assertItemsEqual([{'a': 1}, {'b': 2}], [{'b': 2}, {'a': 1}])
    734         # comparing heterogenous non-hashable sequences

    735         self.assertItemsEqual([1, 'x', divmod, []], [divmod, [], 'x', 1])
    736         self.assertRaises(self.failureException, self.assertItemsEqual,
    737                           [], [divmod, [], 'x', 1, 5j, 2j, set()])
    738         self.assertRaises(self.failureException, self.assertItemsEqual,
    739                           [[1]], [[2]])
    740 
    741         # Same elements, but not same sequence length

    742         self.assertRaises(self.failureException, self.assertItemsEqual,
    743                           [1, 1, 2], [2, 1])
    744         self.assertRaises(self.failureException, self.assertItemsEqual,
    745                           [1, 1, "2", "a", "a"], ["2", "2", True, "a"])
    746         self.assertRaises(self.failureException, self.assertItemsEqual,
    747                           [1, {'b': 2}, None, True], [{'b': 2}, True, None])
    748 
    749         # Same elements which don't reliably compare, in

    750         # different order, see issue 10242

    751         a = [{2,4}, {1,2}]
    752         b = a[::-1]
    753         self.assertItemsEqual(a, b)
    754 
    755         # test utility functions supporting assertItemsEqual()

    756 
    757         diffs = set(unittest.util._count_diff_all_purpose('aaabccd', 'abbbcce'))
    758         expected = {(3,1,'a'), (1,3,'b'), (1,0,'d'), (0,1,'e')}
    759         self.assertEqual(diffs, expected)
    760 
    761         diffs = unittest.util._count_diff_all_purpose([[]], [])
    762         self.assertEqual(diffs, [(1, 0, [])])
    763 
    764         diffs = set(unittest.util._count_diff_hashable('aaabccd', 'abbbcce'))
    765         expected = {(3,1,'a'), (1,3,'b'), (1,0,'d'), (0,1,'e')}
    766         self.assertEqual(diffs, expected)
    767 
    768     def testAssertSetEqual(self):
    769         set1 = set()
    770         set2 = set()
    771         self.assertSetEqual(set1, set2)
    772 
    773         self.assertRaises(self.failureException, self.assertSetEqual, None, set2)
    774         self.assertRaises(self.failureException, self.assertSetEqual, [], set2)
    775         self.assertRaises(self.failureException, self.assertSetEqual, set1, None)
    776         self.assertRaises(self.failureException, self.assertSetEqual, set1, [])
    777 
    778         set1 = set(['a'])
    779         set2 = set()
    780         self.assertRaises(self.failureException, self.assertSetEqual, set1, set2)
    781 
    782         set1 = set(['a'])
    783         set2 = set(['a'])
    784         self.assertSetEqual(set1, set2)
    785 
    786         set1 = set(['a'])
    787         set2 = set(['a', 'b'])
    788         self.assertRaises(self.failureException, self.assertSetEqual, set1, set2)
    789 
    790         set1 = set(['a'])
    791         set2 = frozenset(['a', 'b'])
    792         self.assertRaises(self.failureException, self.assertSetEqual, set1, set2)
    793 
    794         set1 = set(['a', 'b'])
    795         set2 = frozenset(['a', 'b'])
    796         self.assertSetEqual(set1, set2)
    797 
    798         set1 = set()
    799         set2 = "foo"
    800         self.assertRaises(self.failureException, self.assertSetEqual, set1, set2)
    801         self.assertRaises(self.failureException, self.assertSetEqual, set2, set1)
    802 
    803         # make sure any string formatting is tuple-safe

    804         set1 = set([(0, 1), (2, 3)])
    805         set2 = set([(4, 5)])
    806         self.assertRaises(self.failureException, self.assertSetEqual, set1, set2)
    807 
    808     def testInequality(self):
    809         # Try ints

    810         self.assertGreater(2, 1)
    811         self.assertGreaterEqual(2, 1)
    812         self.assertGreaterEqual(1, 1)
    813         self.assertLess(1, 2)
    814         self.assertLessEqual(1, 2)
    815         self.assertLessEqual(1, 1)
    816         self.assertRaises(self.failureException, self.assertGreater, 1, 2)
    817         self.assertRaises(self.failureException, self.assertGreater, 1, 1)
    818         self.assertRaises(self.failureException, self.assertGreaterEqual, 1, 2)
    819         self.assertRaises(self.failureException, self.assertLess, 2, 1)
    820         self.assertRaises(self.failureException, self.assertLess, 1, 1)
    821         self.assertRaises(self.failureException, self.assertLessEqual, 2, 1)
    822 
    823         # Try Floats

    824         self.assertGreater(1.1, 1.0)
    825         self.assertGreaterEqual(1.1, 1.0)
    826         self.assertGreaterEqual(1.0, 1.0)
    827         self.assertLess(1.0, 1.1)
    828         self.assertLessEqual(1.0, 1.1)
    829         self.assertLessEqual(1.0, 1.0)
    830         self.assertRaises(self.failureException, self.assertGreater, 1.0, 1.1)
    831         self.assertRaises(self.failureException, self.assertGreater, 1.0, 1.0)
    832         self.assertRaises(self.failureException, self.assertGreaterEqual, 1.0, 1.1)
    833         self.assertRaises(self.failureException, self.assertLess, 1.1, 1.0)
    834         self.assertRaises(self.failureException, self.assertLess, 1.0, 1.0)
    835         self.assertRaises(self.failureException, self.assertLessEqual, 1.1, 1.0)
    836 
    837         # Try Strings

    838         self.assertGreater('bug', 'ant')
    839         self.assertGreaterEqual('bug', 'ant')
    840         self.assertGreaterEqual('ant', 'ant')
    841         self.assertLess('ant', 'bug')
    842         self.assertLessEqual('ant', 'bug')
    843         self.assertLessEqual('ant', 'ant')
    844         self.assertRaises(self.failureException, self.assertGreater, 'ant', 'bug')
    845         self.assertRaises(self.failureException, self.assertGreater, 'ant', 'ant')
    846         self.assertRaises(self.failureException, self.assertGreaterEqual, 'ant', 'bug')
    847         self.assertRaises(self.failureException, self.assertLess, 'bug', 'ant')
    848         self.assertRaises(self.failureException, self.assertLess, 'ant', 'ant')
    849         self.assertRaises(self.failureException, self.assertLessEqual, 'bug', 'ant')
    850 
    851         # Try Unicode

    852         self.assertGreater(u'bug', u'ant')
    853         self.assertGreaterEqual(u'bug', u'ant')
    854         self.assertGreaterEqual(u'ant', u'ant')
    855         self.assertLess(u'ant', u'bug')
    856         self.assertLessEqual(u'ant', u'bug')
    857         self.assertLessEqual(u'ant', u'ant')
    858         self.assertRaises(self.failureException, self.assertGreater, u'ant', u'bug')
    859         self.assertRaises(self.failureException, self.assertGreater, u'ant', u'ant')
    860         self.assertRaises(self.failureException, self.assertGreaterEqual, u'ant',
    861                           u'bug')
    862         self.assertRaises(self.failureException, self.assertLess, u'bug', u'ant')
    863         self.assertRaises(self.failureException, self.assertLess, u'ant', u'ant')
    864         self.assertRaises(self.failureException, self.assertLessEqual, u'bug', u'ant')
    865 
    866         # Try Mixed String/Unicode

    867         self.assertGreater('bug', u'ant')
    868         self.assertGreater(u'bug', 'ant')
    869         self.assertGreaterEqual('bug', u'ant')
    870         self.assertGreaterEqual(u'bug', 'ant')
    871         self.assertGreaterEqual('ant', u'ant')
    872         self.assertGreaterEqual(u'ant', 'ant')
    873         self.assertLess('ant', u'bug')
    874         self.assertLess(u'ant', 'bug')
    875         self.assertLessEqual('ant', u'bug')
    876         self.assertLessEqual(u'ant', 'bug')
    877         self.assertLessEqual('ant', u'ant')
    878         self.assertLessEqual(u'ant', 'ant')
    879         self.assertRaises(self.failureException, self.assertGreater, 'ant', u'bug')
    880         self.assertRaises(self.failureException, self.assertGreater, u'ant', 'bug')
    881         self.assertRaises(self.failureException, self.assertGreater, 'ant', u'ant')
    882         self.assertRaises(self.failureException, self.assertGreater, u'ant', 'ant')
    883         self.assertRaises(self.failureException, self.assertGreaterEqual, 'ant',
    884                           u'bug')
    885         self.assertRaises(self.failureException, self.assertGreaterEqual, u'ant',
    886                           'bug')
    887         self.assertRaises(self.failureException, self.assertLess, 'bug', u'ant')
    888         self.assertRaises(self.failureException, self.assertLess, u'bug', 'ant')
    889         self.assertRaises(self.failureException, self.assertLess, 'ant', u'ant')
    890         self.assertRaises(self.failureException, self.assertLess, u'ant', 'ant')
    891         self.assertRaises(self.failureException, self.assertLessEqual, 'bug', u'ant')
    892         self.assertRaises(self.failureException, self.assertLessEqual, u'bug', 'ant')
    893 
    894     def testAssertMultiLineEqual(self):
    895         sample_text = b"""\
    896 http://www.python.org/doc/2.3/lib/module-unittest.html
    897 test case
    898     A test case is the smallest unit of testing. [...]
    899 """
    900         revised_sample_text = b"""\
    901 http://www.python.org/doc/2.4.1/lib/module-unittest.html
    902 test case
    903     A test case is the smallest unit of testing. [...] You may provide your
    904     own implementation that does not subclass from TestCase, of course.
    905 """
    906         sample_text_error = b"""\
    907 - http://www.python.org/doc/2.3/lib/module-unittest.html
    908 ?                             ^
    909 + http://www.python.org/doc/2.4.1/lib/module-unittest.html
    910 ?                             ^^^
    911   test case
    912 -     A test case is the smallest unit of testing. [...]
    913 +     A test case is the smallest unit of testing. [...] You may provide your
    914 ?                                                       +++++++++++++++++++++
    915 +     own implementation that does not subclass from TestCase, of course.
    916 """
    917         self.maxDiff = None
    918         for type_changer in (lambda x: x, lambda x: x.decode('utf8')):
    919             try:
    920                 self.assertMultiLineEqual(type_changer(sample_text),
    921                                           type_changer(revised_sample_text))
    922             except self.failureException, e:
    923                 # need to remove the first line of the error message

    924                 error = str(e).encode('utf8').split('\n', 1)[1]
    925 
    926                 # assertMultiLineEqual is hooked up as the default for

    927                 # unicode strings - so we can't use it for this check

    928                 self.assertTrue(sample_text_error == error)
    929 
    930     def testAsertEqualSingleLine(self):
    931         sample_text = u"laden swallows fly slowly"
    932         revised_sample_text = u"unladen swallows fly quickly"
    933         sample_text_error = """\
    934 - laden swallows fly slowly
    935 ?                    ^^^^
    936 + unladen swallows fly quickly
    937 ? ++                   ^^^^^
    938 """
    939         try:
    940             self.assertEqual(sample_text, revised_sample_text)
    941         except self.failureException as e:
    942             error = str(e).split('\n', 1)[1]
    943             self.assertTrue(sample_text_error == error)
    944 
    945     def testAssertIsNone(self):
    946         self.assertIsNone(None)
    947         self.assertRaises(self.failureException, self.assertIsNone, False)
    948         self.assertIsNotNone('DjZoPloGears on Rails')
    949         self.assertRaises(self.failureException, self.assertIsNotNone, None)
    950 
    951     def testAssertRegexpMatches(self):
    952         self.assertRegexpMatches('asdfabasdf', r'ab+')
    953         self.assertRaises(self.failureException, self.assertRegexpMatches,
    954                           'saaas', r'aaaa')
    955 
    956     def testAssertRaisesRegexp(self):
    957         class ExceptionMock(Exception):
    958             pass
    959 
    960         def Stub():
    961             raise ExceptionMock('We expect')
    962 
    963         self.assertRaisesRegexp(ExceptionMock, re.compile('expect$'), Stub)
    964         self.assertRaisesRegexp(ExceptionMock, 'expect$', Stub)
    965         self.assertRaisesRegexp(ExceptionMock, u'expect$', Stub)
    966 
    967     def testAssertNotRaisesRegexp(self):
    968         self.assertRaisesRegexp(
    969                 self.failureException, '^Exception not raised$',
    970                 self.assertRaisesRegexp, Exception, re.compile('x'),
    971                 lambda: None)
    972         self.assertRaisesRegexp(
    973                 self.failureException, '^Exception not raised$',
    974                 self.assertRaisesRegexp, Exception, 'x',
    975                 lambda: None)
    976         self.assertRaisesRegexp(
    977                 self.failureException, '^Exception not raised$',
    978                 self.assertRaisesRegexp, Exception, u'x',
    979                 lambda: None)
    980 
    981     def testAssertRaisesRegexpMismatch(self):
    982         def Stub():
    983             raise Exception('Unexpected')
    984 
    985         self.assertRaisesRegexp(
    986                 self.failureException,
    987                 r'"\^Expected\$" does not match "Unexpected"',
    988                 self.assertRaisesRegexp, Exception, '^Expected$',
    989                 Stub)
    990         self.assertRaisesRegexp(
    991                 self.failureException,
    992                 r'"\^Expected\$" does not match "Unexpected"',
    993                 self.assertRaisesRegexp, Exception, u'^Expected$',
    994                 Stub)
    995         self.assertRaisesRegexp(
    996                 self.failureException,
    997                 r'"\^Expected\$" does not match "Unexpected"',
    998                 self.assertRaisesRegexp, Exception,
    999                 re.compile('^Expected$'), Stub)
   1000 
   1001     def testAssertRaisesExcValue(self):
   1002         class ExceptionMock(Exception):
   1003             pass
   1004 
   1005         def Stub(foo):
   1006             raise ExceptionMock(foo)
   1007         v = "particular value"
   1008 
   1009         ctx = self.assertRaises(ExceptionMock)
   1010         with ctx:
   1011             Stub(v)
   1012         e = ctx.exception
   1013         self.assertIsInstance(e, ExceptionMock)
   1014         self.assertEqual(e.args[0], v)
   1015 
   1016     def testSynonymAssertMethodNames(self):
   1017         """Test undocumented method name synonyms.
   1018 
   1019         Please do not use these methods names in your own code.
   1020 
   1021         This test confirms their continued existence and functionality
   1022         in order to avoid breaking existing code.
   1023         """
   1024         self.assertNotEquals(3, 5)
   1025         self.assertEquals(3, 3)
   1026         self.assertAlmostEquals(2.0, 2.0)
   1027         self.assertNotAlmostEquals(3.0, 5.0)
   1028         self.assert_(True)
   1029 
   1030     def testPendingDeprecationMethodNames(self):
   1031         """Test fail* methods pending deprecation, they will warn in 3.2.
   1032 
   1033         Do not use these methods.  They will go away in 3.3.
   1034         """
   1035         with test_support.check_warnings():
   1036             self.failIfEqual(3, 5)
   1037             self.failUnlessEqual(3, 3)
   1038             self.failUnlessAlmostEqual(2.0, 2.0)
   1039             self.failIfAlmostEqual(3.0, 5.0)
   1040             self.failUnless(True)
   1041             self.failUnlessRaises(TypeError, lambda _: 3.14 + u'spam')
   1042             self.failIf(False)
   1043 
   1044     def testDeepcopy(self):
   1045         # Issue: 5660

   1046         class TestableTest(unittest.TestCase):
   1047             def testNothing(self):
   1048                 pass
   1049 
   1050         test = TestableTest('testNothing')
   1051 
   1052         # This shouldn't blow up

   1053         deepcopy(test)
   1054 
   1055     def testKeyboardInterrupt(self):
   1056         def _raise(self=None):
   1057             raise KeyboardInterrupt
   1058         def nothing(self):
   1059             pass
   1060 
   1061         class Test1(unittest.TestCase):
   1062             test_something = _raise
   1063 
   1064         class Test2(unittest.TestCase):
   1065             setUp = _raise
   1066             test_something = nothing
   1067 
   1068         class Test3(unittest.TestCase):
   1069             test_something = nothing
   1070             tearDown = _raise
   1071 
   1072         class Test4(unittest.TestCase):
   1073             def test_something(self):
   1074                 self.addCleanup(_raise)
   1075 
   1076         for klass in (Test1, Test2, Test3, Test4):
   1077             with self.assertRaises(KeyboardInterrupt):
   1078                 klass('test_something').run()
   1079 
   1080     def testSystemExit(self):
   1081         def _raise(self=None):
   1082             raise SystemExit
   1083         def nothing(self):
   1084             pass
   1085 
   1086         class Test1(unittest.TestCase):
   1087             test_something = _raise
   1088 
   1089         class Test2(unittest.TestCase):
   1090             setUp = _raise
   1091             test_something = nothing
   1092 
   1093         class Test3(unittest.TestCase):
   1094             test_something = nothing
   1095             tearDown = _raise
   1096 
   1097         class Test4(unittest.TestCase):
   1098             def test_something(self):
   1099                 self.addCleanup(_raise)
   1100 
   1101         for klass in (Test1, Test2, Test3, Test4):
   1102             result = unittest.TestResult()
   1103             klass('test_something').run(result)
   1104             self.assertEqual(len(result.errors), 1)
   1105             self.assertEqual(result.testsRun, 1)
   1106 
   1107 
   1108 if __name__ == '__main__':
   1109     unittest.main()
   1110