1 import difflib 2 import pprint 3 import pickle 4 import re 5 import sys 6 7 from copy import deepcopy 8 from test import test_support 9 10 import unittest 11 12 from .support import ( 13 TestEquality, TestHashing, LoggingResult, ResultWithNoStartTestRunStopTestRun 14 ) 15 16 17 class Test(object): 18 "Keep these TestCase classes out of the main namespace" 19 20 class Foo(unittest.TestCase): 21 def runTest(self): pass 22 def test1(self): pass 23 24 class Bar(Foo): 25 def test2(self): pass 26 27 class LoggingTestCase(unittest.TestCase): 28 """A test case which logs its calls.""" 29 30 def __init__(self, events): 31 super(Test.LoggingTestCase, self).__init__('test') 32 self.events = events 33 34 def setUp(self): 35 self.events.append('setUp') 36 37 def test(self): 38 self.events.append('test') 39 40 def tearDown(self): 41 self.events.append('tearDown') 42 43 44 class Test_TestCase(unittest.TestCase, TestEquality, TestHashing): 45 46 ### Set up attributes used by inherited tests 47 ################################################################ 48 49 # Used by TestHashing.test_hash and TestEquality.test_eq 50 eq_pairs = [(Test.Foo('test1'), Test.Foo('test1'))] 51 52 # Used by TestEquality.test_ne 53 ne_pairs = [(Test.Foo('test1'), Test.Foo('runTest')) 54 ,(Test.Foo('test1'), Test.Bar('test1')) 55 ,(Test.Foo('test1'), Test.Bar('test2'))] 56 57 ################################################################ 58 ### /Set up attributes used by inherited tests 59 60 61 # "class TestCase([methodName])" 62 # ... 63 # "Each instance of TestCase will run a single test method: the 64 # method named methodName." 65 # ... 66 # "methodName defaults to "runTest"." 67 # 68 # Make sure it really is optional, and that it defaults to the proper 69 # thing. 70 def test_init__no_test_name(self): 71 class Test(unittest.TestCase): 72 def runTest(self): raise TypeError() 73 def test(self): pass 74 75 self.assertEqual(Test().id()[-13:], '.Test.runTest') 76 77 # "class TestCase([methodName])" 78 # ... 79 # "Each instance of TestCase will run a single test method: the 80 # method named methodName." 81 def test_init__test_name__valid(self): 82 class Test(unittest.TestCase): 83 def runTest(self): raise TypeError() 84 def test(self): pass 85 86 self.assertEqual(Test('test').id()[-10:], '.Test.test') 87 88 # "class TestCase([methodName])" 89 # ... 90 # "Each instance of TestCase will run a single test method: the 91 # method named methodName." 92 def test_init__test_name__invalid(self): 93 class Test(unittest.TestCase): 94 def runTest(self): raise TypeError() 95 def test(self): pass 96 97 try: 98 Test('testfoo') 99 except ValueError: 100 pass 101 else: 102 self.fail("Failed to raise ValueError") 103 104 # "Return the number of tests represented by the this test object. For 105 # TestCase instances, this will always be 1" 106 def test_countTestCases(self): 107 class Foo(unittest.TestCase): 108 def test(self): pass 109 110 self.assertEqual(Foo('test').countTestCases(), 1) 111 112 # "Return the default type of test result object to be used to run this 113 # test. For TestCase instances, this will always be 114 # unittest.TestResult; subclasses of TestCase should 115 # override this as necessary." 116 def test_defaultTestResult(self): 117 class Foo(unittest.TestCase): 118 def runTest(self): 119 pass 120 121 result = Foo().defaultTestResult() 122 self.assertEqual(type(result), unittest.TestResult) 123 124 # "When a setUp() method is defined, the test runner will run that method 125 # prior to each test. Likewise, if a tearDown() method is defined, the 126 # test runner will invoke that method after each test. In the example, 127 # setUp() was used to create a fresh sequence for each test." 128 # 129 # Make sure the proper call order is maintained, even if setUp() raises 130 # an exception. 131 def test_run_call_order__error_in_setUp(self): 132 events = [] 133 result = LoggingResult(events) 134 135 class Foo(Test.LoggingTestCase): 136 def setUp(self): 137 super(Foo, self).setUp() 138 raise RuntimeError('raised by Foo.setUp') 139 140 Foo(events).run(result) 141 expected = ['startTest', 'setUp', 'addError', 'stopTest'] 142 self.assertEqual(events, expected) 143 144 # "With a temporary result stopTestRun is called when setUp errors. 145 def test_run_call_order__error_in_setUp_default_result(self): 146 events = [] 147 148 class Foo(Test.LoggingTestCase): 149 def defaultTestResult(self): 150 return LoggingResult(self.events) 151 152 def setUp(self): 153 super(Foo, self).setUp() 154 raise RuntimeError('raised by Foo.setUp') 155 156 Foo(events).run() 157 expected = ['startTestRun', 'startTest', 'setUp', 'addError', 158 'stopTest', 'stopTestRun'] 159 self.assertEqual(events, expected) 160 161 # "When a setUp() method is defined, the test runner will run that method 162 # prior to each test. Likewise, if a tearDown() method is defined, the 163 # test runner will invoke that method after each test. In the example, 164 # setUp() was used to create a fresh sequence for each test." 165 # 166 # Make sure the proper call order is maintained, even if the test raises 167 # an error (as opposed to a failure). 168 def test_run_call_order__error_in_test(self): 169 events = [] 170 result = LoggingResult(events) 171 172 class Foo(Test.LoggingTestCase): 173 def test(self): 174 super(Foo, self).test() 175 raise RuntimeError('raised by Foo.test') 176 177 expected = ['startTest', 'setUp', 'test', 'addError', 'tearDown', 178 'stopTest'] 179 Foo(events).run(result) 180 self.assertEqual(events, expected) 181 182 # "With a default result, an error in the test still results in stopTestRun 183 # being called." 184 def test_run_call_order__error_in_test_default_result(self): 185 events = [] 186 187 class Foo(Test.LoggingTestCase): 188 def defaultTestResult(self): 189 return LoggingResult(self.events) 190 191 def test(self): 192 super(Foo, self).test() 193 raise RuntimeError('raised by Foo.test') 194 195 expected = ['startTestRun', 'startTest', 'setUp', 'test', 'addError', 196 'tearDown', 'stopTest', 'stopTestRun'] 197 Foo(events).run() 198 self.assertEqual(events, expected) 199 200 # "When a setUp() method is defined, the test runner will run that method 201 # prior to each test. Likewise, if a tearDown() method is defined, the 202 # test runner will invoke that method after each test. In the example, 203 # setUp() was used to create a fresh sequence for each test." 204 # 205 # Make sure the proper call order is maintained, even if the test signals 206 # a failure (as opposed to an error). 207 def test_run_call_order__failure_in_test(self): 208 events = [] 209 result = LoggingResult(events) 210 211 class Foo(Test.LoggingTestCase): 212 def test(self): 213 super(Foo, self).test() 214 self.fail('raised by Foo.test') 215 216 expected = ['startTest', 'setUp', 'test', 'addFailure', 'tearDown', 217 'stopTest'] 218 Foo(events).run(result) 219 self.assertEqual(events, expected) 220 221 # "When a test fails with a default result stopTestRun is still called." 222 def test_run_call_order__failure_in_test_default_result(self): 223 224 class Foo(Test.LoggingTestCase): 225 def defaultTestResult(self): 226 return LoggingResult(self.events) 227 def test(self): 228 super(Foo, self).test() 229 self.fail('raised by Foo.test') 230 231 expected = ['startTestRun', 'startTest', 'setUp', 'test', 'addFailure', 232 'tearDown', 'stopTest', 'stopTestRun'] 233 events = [] 234 Foo(events).run() 235 self.assertEqual(events, expected) 236 237 # "When a setUp() method is defined, the test runner will run that method 238 # prior to each test. Likewise, if a tearDown() method is defined, the 239 # test runner will invoke that method after each test. In the example, 240 # setUp() was used to create a fresh sequence for each test." 241 # 242 # Make sure the proper call order is maintained, even if tearDown() raises 243 # an exception. 244 def test_run_call_order__error_in_tearDown(self): 245 events = [] 246 result = LoggingResult(events) 247 248 class Foo(Test.LoggingTestCase): 249 def tearDown(self): 250 super(Foo, self).tearDown() 251 raise RuntimeError('raised by Foo.tearDown') 252 253 Foo(events).run(result) 254 expected = ['startTest', 'setUp', 'test', 'tearDown', 'addError', 255 'stopTest'] 256 self.assertEqual(events, expected) 257 258 # "When tearDown errors with a default result stopTestRun is still called." 259 def test_run_call_order__error_in_tearDown_default_result(self): 260 261 class Foo(Test.LoggingTestCase): 262 def defaultTestResult(self): 263 return LoggingResult(self.events) 264 def tearDown(self): 265 super(Foo, self).tearDown() 266 raise RuntimeError('raised by Foo.tearDown') 267 268 events = [] 269 Foo(events).run() 270 expected = ['startTestRun', 'startTest', 'setUp', 'test', 'tearDown', 271 'addError', 'stopTest', 'stopTestRun'] 272 self.assertEqual(events, expected) 273 274 # "TestCase.run() still works when the defaultTestResult is a TestResult 275 # that does not support startTestRun and stopTestRun. 276 def test_run_call_order_default_result(self): 277 278 class Foo(unittest.TestCase): 279 def defaultTestResult(self): 280 return ResultWithNoStartTestRunStopTestRun() 281 def test(self): 282 pass 283 284 Foo('test').run() 285 286 # "This class attribute gives the exception raised by the test() method. 287 # If a test framework needs to use a specialized exception, possibly to 288 # carry additional information, it must subclass this exception in 289 # order to ``play fair'' with the framework. The initial value of this 290 # attribute is AssertionError" 291 def test_failureException__default(self): 292 class Foo(unittest.TestCase): 293 def test(self): 294 pass 295 296 self.assertTrue(Foo('test').failureException is AssertionError) 297 298 # "This class attribute gives the exception raised by the test() method. 299 # If a test framework needs to use a specialized exception, possibly to 300 # carry additional information, it must subclass this exception in 301 # order to ``play fair'' with the framework." 302 # 303 # Make sure TestCase.run() respects the designated failureException 304 def test_failureException__subclassing__explicit_raise(self): 305 events = [] 306 result = LoggingResult(events) 307 308 class Foo(unittest.TestCase): 309 def test(self): 310 raise RuntimeError() 311 312 failureException = RuntimeError 313 314 self.assertTrue(Foo('test').failureException is RuntimeError) 315 316 317 Foo('test').run(result) 318 expected = ['startTest', 'addFailure', 'stopTest'] 319 self.assertEqual(events, expected) 320 321 # "This class attribute gives the exception raised by the test() method. 322 # If a test framework needs to use a specialized exception, possibly to 323 # carry additional information, it must subclass this exception in 324 # order to ``play fair'' with the framework." 325 # 326 # Make sure TestCase.run() respects the designated failureException 327 def test_failureException__subclassing__implicit_raise(self): 328 events = [] 329 result = LoggingResult(events) 330 331 class Foo(unittest.TestCase): 332 def test(self): 333 self.fail("foo") 334 335 failureException = RuntimeError 336 337 self.assertTrue(Foo('test').failureException is RuntimeError) 338 339 340 Foo('test').run(result) 341 expected = ['startTest', 'addFailure', 'stopTest'] 342 self.assertEqual(events, expected) 343 344 # "The default implementation does nothing." 345 def test_setUp(self): 346 class Foo(unittest.TestCase): 347 def runTest(self): 348 pass 349 350 # ... and nothing should happen 351 Foo().setUp() 352 353 # "The default implementation does nothing." 354 def test_tearDown(self): 355 class Foo(unittest.TestCase): 356 def runTest(self): 357 pass 358 359 # ... and nothing should happen 360 Foo().tearDown() 361 362 # "Return a string identifying the specific test case." 363 # 364 # Because of the vague nature of the docs, I'm not going to lock this 365 # test down too much. Really all that can be asserted is that the id() 366 # will be a string (either 8-byte or unicode -- again, because the docs 367 # just say "string") 368 def test_id(self): 369 class Foo(unittest.TestCase): 370 def runTest(self): 371 pass 372 373 self.assertIsInstance(Foo().id(), basestring) 374 375 # "If result is omitted or None, a temporary result object is created 376 # and used, but is not made available to the caller. As TestCase owns the 377 # temporary result startTestRun and stopTestRun are called. 378 379 def test_run__uses_defaultTestResult(self): 380 events = [] 381 382 class Foo(unittest.TestCase): 383 def test(self): 384 events.append('test') 385 386 def defaultTestResult(self): 387 return LoggingResult(events) 388 389 # Make run() find a result object on its own 390 Foo('test').run() 391 392 expected = ['startTestRun', 'startTest', 'test', 'addSuccess', 393 'stopTest', 'stopTestRun'] 394 self.assertEqual(events, expected) 395 396 def testShortDescriptionWithoutDocstring(self): 397 self.assertIsNone(self.shortDescription()) 398 399 @unittest.skipIf(sys.flags.optimize >= 2, 400 "Docstrings are omitted with -O2 and above") 401 def testShortDescriptionWithOneLineDocstring(self): 402 """Tests shortDescription() for a method with a docstring.""" 403 self.assertEqual( 404 self.shortDescription(), 405 'Tests shortDescription() for a method with a docstring.') 406 407 @unittest.skipIf(sys.flags.optimize >= 2, 408 "Docstrings are omitted with -O2 and above") 409 def testShortDescriptionWithMultiLineDocstring(self): 410 """Tests shortDescription() for a method with a longer docstring. 411 412 This method ensures that only the first line of a docstring is 413 returned used in the short description, no matter how long the 414 whole thing is. 415 """ 416 self.assertEqual( 417 self.shortDescription(), 418 'Tests shortDescription() for a method with a longer ' 419 'docstring.') 420 421 def testAddTypeEqualityFunc(self): 422 class SadSnake(object): 423 """Dummy class for test_addTypeEqualityFunc.""" 424 s1, s2 = SadSnake(), SadSnake() 425 self.assertNotEqual(s1, s2) 426 def AllSnakesCreatedEqual(a, b, msg=None): 427 return type(a) is type(b) is SadSnake 428 self.addTypeEqualityFunc(SadSnake, AllSnakesCreatedEqual) 429 self.assertEqual(s1, s2) 430 # No this doesn't clean up and remove the SadSnake equality func 431 # from this TestCase instance but since its a local nothing else 432 # will ever notice that. 433 434 def testAssertIs(self): 435 thing = object() 436 self.assertIs(thing, thing) 437 self.assertRaises(self.failureException, self.assertIs, thing, object()) 438 439 def testAssertIsNot(self): 440 thing = object() 441 self.assertIsNot(thing, object()) 442 self.assertRaises(self.failureException, self.assertIsNot, thing, thing) 443 444 def testAssertIsInstance(self): 445 thing = [] 446 self.assertIsInstance(thing, list) 447 self.assertRaises(self.failureException, self.assertIsInstance, 448 thing, dict) 449 450 def testAssertNotIsInstance(self): 451 thing = [] 452 self.assertNotIsInstance(thing, dict) 453 self.assertRaises(self.failureException, self.assertNotIsInstance, 454 thing, list) 455 456 def testAssertIn(self): 457 animals = {'monkey': 'banana', 'cow': 'grass', 'seal': 'fish'} 458 459 self.assertIn('a', 'abc') 460 self.assertIn(2, [1, 2, 3]) 461 self.assertIn('monkey', animals) 462 463 self.assertNotIn('d', 'abc') 464 self.assertNotIn(0, [1, 2, 3]) 465 self.assertNotIn('otter', animals) 466 467 self.assertRaises(self.failureException, self.assertIn, 'x', 'abc') 468 self.assertRaises(self.failureException, self.assertIn, 4, [1, 2, 3]) 469 self.assertRaises(self.failureException, self.assertIn, 'elephant', 470 animals) 471 472 self.assertRaises(self.failureException, self.assertNotIn, 'c', 'abc') 473 self.assertRaises(self.failureException, self.assertNotIn, 1, [1, 2, 3]) 474 self.assertRaises(self.failureException, self.assertNotIn, 'cow', 475 animals) 476 477 def testAssertDictContainsSubset(self): 478 self.assertDictContainsSubset({}, {}) 479 self.assertDictContainsSubset({}, {'a': 1}) 480 self.assertDictContainsSubset({'a': 1}, {'a': 1}) 481 self.assertDictContainsSubset({'a': 1}, {'a': 1, 'b': 2}) 482 self.assertDictContainsSubset({'a': 1, 'b': 2}, {'a': 1, 'b': 2}) 483 484 with self.assertRaises(self.failureException): 485 self.assertDictContainsSubset({1: "one"}, {}) 486 487 with self.assertRaises(self.failureException): 488 self.assertDictContainsSubset({'a': 2}, {'a': 1}) 489 490 with self.assertRaises(self.failureException): 491 self.assertDictContainsSubset({'c': 1}, {'a': 1}) 492 493 with self.assertRaises(self.failureException): 494 self.assertDictContainsSubset({'a': 1, 'c': 1}, {'a': 1}) 495 496 with self.assertRaises(self.failureException): 497 self.assertDictContainsSubset({'a': 1, 'c': 1}, {'a': 1}) 498 499 with test_support.check_warnings(("", UnicodeWarning)): 500 one = ''.join(chr(i) for i in range(255)) 501 # this used to cause a UnicodeDecodeError constructing the failure msg 502 with self.assertRaises(self.failureException): 503 self.assertDictContainsSubset({'foo': one}, {'foo': u'\uFFFD'}) 504 505 def testAssertEqual(self): 506 equal_pairs = [ 507 ((), ()), 508 ({}, {}), 509 ([], []), 510 (set(), set()), 511 (frozenset(), frozenset())] 512 for a, b in equal_pairs: 513 # This mess of try excepts is to test the assertEqual behavior 514 # itself. 515 try: 516 self.assertEqual(a, b) 517 except self.failureException: 518 self.fail('assertEqual(%r, %r) failed' % (a, b)) 519 try: 520 self.assertEqual(a, b, msg='foo') 521 except self.failureException: 522 self.fail('assertEqual(%r, %r) with msg= failed' % (a, b)) 523 try: 524 self.assertEqual(a, b, 'foo') 525 except self.failureException: 526 self.fail('assertEqual(%r, %r) with third parameter failed' % 527 (a, b)) 528 529 unequal_pairs = [ 530 ((), []), 531 ({}, set()), 532 (set([4,1]), frozenset([4,2])), 533 (frozenset([4,5]), set([2,3])), 534 (set([3,4]), set([5,4]))] 535 for a, b in unequal_pairs: 536 self.assertRaises(self.failureException, self.assertEqual, a, b) 537 self.assertRaises(self.failureException, self.assertEqual, a, b, 538 'foo') 539 self.assertRaises(self.failureException, self.assertEqual, a, b, 540 msg='foo') 541 542 def testEquality(self): 543 self.assertListEqual([], []) 544 self.assertTupleEqual((), ()) 545 self.assertSequenceEqual([], ()) 546 547 a = [0, 'a', []] 548 b = [] 549 self.assertRaises(unittest.TestCase.failureException, 550 self.assertListEqual, a, b) 551 self.assertRaises(unittest.TestCase.failureException, 552 self.assertListEqual, tuple(a), tuple(b)) 553 self.assertRaises(unittest.TestCase.failureException, 554 self.assertSequenceEqual, a, tuple(b)) 555 556 b.extend(a) 557 self.assertListEqual(a, b) 558 self.assertTupleEqual(tuple(a), tuple(b)) 559 self.assertSequenceEqual(a, tuple(b)) 560 self.assertSequenceEqual(tuple(a), b) 561 562 self.assertRaises(self.failureException, self.assertListEqual, 563 a, tuple(b)) 564 self.assertRaises(self.failureException, self.assertTupleEqual, 565 tuple(a), b) 566 self.assertRaises(self.failureException, self.assertListEqual, None, b) 567 self.assertRaises(self.failureException, self.assertTupleEqual, None, 568 tuple(b)) 569 self.assertRaises(self.failureException, self.assertSequenceEqual, 570 None, tuple(b)) 571 self.assertRaises(self.failureException, self.assertListEqual, 1, 1) 572 self.assertRaises(self.failureException, self.assertTupleEqual, 1, 1) 573 self.assertRaises(self.failureException, self.assertSequenceEqual, 574 1, 1) 575 576 self.assertDictEqual({}, {}) 577 578 c = { 'x': 1 } 579 d = {} 580 self.assertRaises(unittest.TestCase.failureException, 581 self.assertDictEqual, c, d) 582 583 d.update(c) 584 self.assertDictEqual(c, d) 585 586 d['x'] = 0 587 self.assertRaises(unittest.TestCase.failureException, 588 self.assertDictEqual, c, d, 'These are unequal') 589 590 self.assertRaises(self.failureException, self.assertDictEqual, None, d) 591 self.assertRaises(self.failureException, self.assertDictEqual, [], d) 592 self.assertRaises(self.failureException, self.assertDictEqual, 1, 1) 593 594 def testAssertSequenceEqualMaxDiff(self): 595 self.assertEqual(self.maxDiff, 80*8) 596 seq1 = 'a' + 'x' * 80**2 597 seq2 = 'b' + 'x' * 80**2 598 diff = '\n'.join(difflib.ndiff(pprint.pformat(seq1).splitlines(), 599 pprint.pformat(seq2).splitlines())) 600 # the +1 is the leading \n added by assertSequenceEqual 601 omitted = unittest.case.DIFF_OMITTED % (len(diff) + 1,) 602 603 self.maxDiff = len(diff)//2 604 try: 605 self.assertSequenceEqual(seq1, seq2) 606 except self.failureException as e: 607 msg = e.args[0] 608 else: 609 self.fail('assertSequenceEqual did not fail.') 610 self.assertTrue(len(msg) < len(diff)) 611 self.assertIn(omitted, msg) 612 613 self.maxDiff = len(diff) * 2 614 try: 615 self.assertSequenceEqual(seq1, seq2) 616 except self.failureException as e: 617 msg = e.args[0] 618 else: 619 self.fail('assertSequenceEqual did not fail.') 620 self.assertTrue(len(msg) > len(diff)) 621 self.assertNotIn(omitted, msg) 622 623 self.maxDiff = None 624 try: 625 self.assertSequenceEqual(seq1, seq2) 626 except self.failureException as e: 627 msg = e.args[0] 628 else: 629 self.fail('assertSequenceEqual did not fail.') 630 self.assertTrue(len(msg) > len(diff)) 631 self.assertNotIn(omitted, msg) 632 633 def testTruncateMessage(self): 634 self.maxDiff = 1 635 message = self._truncateMessage('foo', 'bar') 636 omitted = unittest.case.DIFF_OMITTED % len('bar') 637 self.assertEqual(message, 'foo' + omitted) 638 639 self.maxDiff = None 640 message = self._truncateMessage('foo', 'bar') 641 self.assertEqual(message, 'foobar') 642 643 self.maxDiff = 4 644 message = self._truncateMessage('foo', 'bar') 645 self.assertEqual(message, 'foobar') 646 647 def testAssertDictEqualTruncates(self): 648 test = unittest.TestCase('assertEqual') 649 def truncate(msg, diff): 650 return 'foo' 651 test._truncateMessage = truncate 652 try: 653 test.assertDictEqual({}, {1: 0}) 654 except self.failureException as e: 655 self.assertEqual(str(e), 'foo') 656 else: 657 self.fail('assertDictEqual did not fail') 658 659 def testAssertMultiLineEqualTruncates(self): 660 test = unittest.TestCase('assertEqual') 661 def truncate(msg, diff): 662 return 'foo' 663 test._truncateMessage = truncate 664 try: 665 test.assertMultiLineEqual('foo', 'bar') 666 except self.failureException as e: 667 self.assertEqual(str(e), 'foo') 668 else: 669 self.fail('assertMultiLineEqual did not fail') 670 671 def testAssertEqual_diffThreshold(self): 672 # check threshold value 673 self.assertEqual(self._diffThreshold, 2**16) 674 # disable madDiff to get diff markers 675 self.maxDiff = None 676 677 # set a lower threshold value and add a cleanup to restore it 678 old_threshold = self._diffThreshold 679 self._diffThreshold = 2**8 680 self.addCleanup(lambda: setattr(self, '_diffThreshold', old_threshold)) 681 682 # under the threshold: diff marker (^) in error message 683 s = u'x' * (2**7) 684 with self.assertRaises(self.failureException) as cm: 685 self.assertEqual(s + 'a', s + 'b') 686 self.assertIn('^', str(cm.exception)) 687 self.assertEqual(s + 'a', s + 'a') 688 689 # over the threshold: diff not used and marker (^) not in error message 690 s = u'x' * (2**9) 691 # if the path that uses difflib is taken, _truncateMessage will be 692 # called -- replace it with explodingTruncation to verify that this 693 # doesn't happen 694 def explodingTruncation(message, diff): 695 raise SystemError('this should not be raised') 696 old_truncate = self._truncateMessage 697 self._truncateMessage = explodingTruncation 698 self.addCleanup(lambda: setattr(self, '_truncateMessage', old_truncate)) 699 700 s1, s2 = s + 'a', s + 'b' 701 with self.assertRaises(self.failureException) as cm: 702 self.assertEqual(s1, s2) 703 self.assertNotIn('^', str(cm.exception)) 704 self.assertEqual(str(cm.exception), '%r != %r' % (s1, s2)) 705 self.assertEqual(s + 'a', s + 'a') 706 707 def testAssertItemsEqual(self): 708 a = object() 709 self.assertItemsEqual([1, 2, 3], [3, 2, 1]) 710 self.assertItemsEqual(['foo', 'bar', 'baz'], ['bar', 'baz', 'foo']) 711 self.assertItemsEqual([a, a, 2, 2, 3], (a, 2, 3, a, 2)) 712 self.assertItemsEqual([1, "2", "a", "a"], ["a", "2", True, "a"]) 713 self.assertRaises(self.failureException, self.assertItemsEqual, 714 [1, 2] + [3] * 100, [1] * 100 + [2, 3]) 715 self.assertRaises(self.failureException, self.assertItemsEqual, 716 [1, "2", "a", "a"], ["a", "2", True, 1]) 717 self.assertRaises(self.failureException, self.assertItemsEqual, 718 [10], [10, 11]) 719 self.assertRaises(self.failureException, self.assertItemsEqual, 720 [10, 11], [10]) 721 self.assertRaises(self.failureException, self.assertItemsEqual, 722 [10, 11, 10], [10, 11]) 723 724 # Test that sequences of unhashable objects can be tested for sameness: 725 self.assertItemsEqual([[1, 2], [3, 4], 0], [False, [3, 4], [1, 2]]) 726 # Test that iterator of unhashable objects can be tested for sameness: 727 self.assertItemsEqual(iter([1, 2, [], 3, 4]), 728 iter([1, 2, [], 3, 4])) 729 730 # hashable types, but not orderable 731 self.assertRaises(self.failureException, self.assertItemsEqual, 732 [], [divmod, 'x', 1, 5j, 2j, frozenset()]) 733 # comparing dicts 734 self.assertItemsEqual([{'a': 1}, {'b': 2}], [{'b': 2}, {'a': 1}]) 735 # comparing heterogenous non-hashable sequences 736 self.assertItemsEqual([1, 'x', divmod, []], [divmod, [], 'x', 1]) 737 self.assertRaises(self.failureException, self.assertItemsEqual, 738 [], [divmod, [], 'x', 1, 5j, 2j, set()]) 739 self.assertRaises(self.failureException, self.assertItemsEqual, 740 [[1]], [[2]]) 741 742 # Same elements, but not same sequence length 743 self.assertRaises(self.failureException, self.assertItemsEqual, 744 [1, 1, 2], [2, 1]) 745 self.assertRaises(self.failureException, self.assertItemsEqual, 746 [1, 1, "2", "a", "a"], ["2", "2", True, "a"]) 747 self.assertRaises(self.failureException, self.assertItemsEqual, 748 [1, {'b': 2}, None, True], [{'b': 2}, True, None]) 749 750 # Same elements which don't reliably compare, in 751 # different order, see issue 10242 752 a = [{2,4}, {1,2}] 753 b = a[::-1] 754 self.assertItemsEqual(a, b) 755 756 # test utility functions supporting assertItemsEqual() 757 758 diffs = set(unittest.util._count_diff_all_purpose('aaabccd', 'abbbcce')) 759 expected = {(3,1,'a'), (1,3,'b'), (1,0,'d'), (0,1,'e')} 760 self.assertEqual(diffs, expected) 761 762 diffs = unittest.util._count_diff_all_purpose([[]], []) 763 self.assertEqual(diffs, [(1, 0, [])]) 764 765 diffs = set(unittest.util._count_diff_hashable('aaabccd', 'abbbcce')) 766 expected = {(3,1,'a'), (1,3,'b'), (1,0,'d'), (0,1,'e')} 767 self.assertEqual(diffs, expected) 768 769 def testAssertSetEqual(self): 770 set1 = set() 771 set2 = set() 772 self.assertSetEqual(set1, set2) 773 774 self.assertRaises(self.failureException, self.assertSetEqual, None, set2) 775 self.assertRaises(self.failureException, self.assertSetEqual, [], set2) 776 self.assertRaises(self.failureException, self.assertSetEqual, set1, None) 777 self.assertRaises(self.failureException, self.assertSetEqual, set1, []) 778 779 set1 = set(['a']) 780 set2 = set() 781 self.assertRaises(self.failureException, self.assertSetEqual, set1, set2) 782 783 set1 = set(['a']) 784 set2 = set(['a']) 785 self.assertSetEqual(set1, set2) 786 787 set1 = set(['a']) 788 set2 = set(['a', 'b']) 789 self.assertRaises(self.failureException, self.assertSetEqual, set1, set2) 790 791 set1 = set(['a']) 792 set2 = frozenset(['a', 'b']) 793 self.assertRaises(self.failureException, self.assertSetEqual, set1, set2) 794 795 set1 = set(['a', 'b']) 796 set2 = frozenset(['a', 'b']) 797 self.assertSetEqual(set1, set2) 798 799 set1 = set() 800 set2 = "foo" 801 self.assertRaises(self.failureException, self.assertSetEqual, set1, set2) 802 self.assertRaises(self.failureException, self.assertSetEqual, set2, set1) 803 804 # make sure any string formatting is tuple-safe 805 set1 = set([(0, 1), (2, 3)]) 806 set2 = set([(4, 5)]) 807 self.assertRaises(self.failureException, self.assertSetEqual, set1, set2) 808 809 def testInequality(self): 810 # Try ints 811 self.assertGreater(2, 1) 812 self.assertGreaterEqual(2, 1) 813 self.assertGreaterEqual(1, 1) 814 self.assertLess(1, 2) 815 self.assertLessEqual(1, 2) 816 self.assertLessEqual(1, 1) 817 self.assertRaises(self.failureException, self.assertGreater, 1, 2) 818 self.assertRaises(self.failureException, self.assertGreater, 1, 1) 819 self.assertRaises(self.failureException, self.assertGreaterEqual, 1, 2) 820 self.assertRaises(self.failureException, self.assertLess, 2, 1) 821 self.assertRaises(self.failureException, self.assertLess, 1, 1) 822 self.assertRaises(self.failureException, self.assertLessEqual, 2, 1) 823 824 # Try Floats 825 self.assertGreater(1.1, 1.0) 826 self.assertGreaterEqual(1.1, 1.0) 827 self.assertGreaterEqual(1.0, 1.0) 828 self.assertLess(1.0, 1.1) 829 self.assertLessEqual(1.0, 1.1) 830 self.assertLessEqual(1.0, 1.0) 831 self.assertRaises(self.failureException, self.assertGreater, 1.0, 1.1) 832 self.assertRaises(self.failureException, self.assertGreater, 1.0, 1.0) 833 self.assertRaises(self.failureException, self.assertGreaterEqual, 1.0, 1.1) 834 self.assertRaises(self.failureException, self.assertLess, 1.1, 1.0) 835 self.assertRaises(self.failureException, self.assertLess, 1.0, 1.0) 836 self.assertRaises(self.failureException, self.assertLessEqual, 1.1, 1.0) 837 838 # Try Strings 839 self.assertGreater('bug', 'ant') 840 self.assertGreaterEqual('bug', 'ant') 841 self.assertGreaterEqual('ant', 'ant') 842 self.assertLess('ant', 'bug') 843 self.assertLessEqual('ant', 'bug') 844 self.assertLessEqual('ant', 'ant') 845 self.assertRaises(self.failureException, self.assertGreater, 'ant', 'bug') 846 self.assertRaises(self.failureException, self.assertGreater, 'ant', 'ant') 847 self.assertRaises(self.failureException, self.assertGreaterEqual, 'ant', 'bug') 848 self.assertRaises(self.failureException, self.assertLess, 'bug', 'ant') 849 self.assertRaises(self.failureException, self.assertLess, 'ant', 'ant') 850 self.assertRaises(self.failureException, self.assertLessEqual, 'bug', 'ant') 851 852 # Try Unicode 853 self.assertGreater(u'bug', u'ant') 854 self.assertGreaterEqual(u'bug', u'ant') 855 self.assertGreaterEqual(u'ant', u'ant') 856 self.assertLess(u'ant', u'bug') 857 self.assertLessEqual(u'ant', u'bug') 858 self.assertLessEqual(u'ant', u'ant') 859 self.assertRaises(self.failureException, self.assertGreater, u'ant', u'bug') 860 self.assertRaises(self.failureException, self.assertGreater, u'ant', u'ant') 861 self.assertRaises(self.failureException, self.assertGreaterEqual, u'ant', 862 u'bug') 863 self.assertRaises(self.failureException, self.assertLess, u'bug', u'ant') 864 self.assertRaises(self.failureException, self.assertLess, u'ant', u'ant') 865 self.assertRaises(self.failureException, self.assertLessEqual, u'bug', u'ant') 866 867 # Try Mixed String/Unicode 868 self.assertGreater('bug', u'ant') 869 self.assertGreater(u'bug', 'ant') 870 self.assertGreaterEqual('bug', u'ant') 871 self.assertGreaterEqual(u'bug', 'ant') 872 self.assertGreaterEqual('ant', u'ant') 873 self.assertGreaterEqual(u'ant', 'ant') 874 self.assertLess('ant', u'bug') 875 self.assertLess(u'ant', 'bug') 876 self.assertLessEqual('ant', u'bug') 877 self.assertLessEqual(u'ant', 'bug') 878 self.assertLessEqual('ant', u'ant') 879 self.assertLessEqual(u'ant', 'ant') 880 self.assertRaises(self.failureException, self.assertGreater, 'ant', u'bug') 881 self.assertRaises(self.failureException, self.assertGreater, u'ant', 'bug') 882 self.assertRaises(self.failureException, self.assertGreater, 'ant', u'ant') 883 self.assertRaises(self.failureException, self.assertGreater, u'ant', 'ant') 884 self.assertRaises(self.failureException, self.assertGreaterEqual, 'ant', 885 u'bug') 886 self.assertRaises(self.failureException, self.assertGreaterEqual, u'ant', 887 'bug') 888 self.assertRaises(self.failureException, self.assertLess, 'bug', u'ant') 889 self.assertRaises(self.failureException, self.assertLess, u'bug', 'ant') 890 self.assertRaises(self.failureException, self.assertLess, 'ant', u'ant') 891 self.assertRaises(self.failureException, self.assertLess, u'ant', 'ant') 892 self.assertRaises(self.failureException, self.assertLessEqual, 'bug', u'ant') 893 self.assertRaises(self.failureException, self.assertLessEqual, u'bug', 'ant') 894 895 def testAssertMultiLineEqual(self): 896 sample_text = b"""\ 897 http://www.python.org/doc/2.3/lib/module-unittest.html 898 test case 899 A test case is the smallest unit of testing. [...] 900 """ 901 revised_sample_text = b"""\ 902 http://www.python.org/doc/2.4.1/lib/module-unittest.html 903 test case 904 A test case is the smallest unit of testing. [...] You may provide your 905 own implementation that does not subclass from TestCase, of course. 906 """ 907 sample_text_error = b"""\ 908 - http://www.python.org/doc/2.3/lib/module-unittest.html 909 ? ^ 910 + http://www.python.org/doc/2.4.1/lib/module-unittest.html 911 ? ^^^ 912 test case 913 - A test case is the smallest unit of testing. [...] 914 + A test case is the smallest unit of testing. [...] You may provide your 915 ? +++++++++++++++++++++ 916 + own implementation that does not subclass from TestCase, of course. 917 """ 918 self.maxDiff = None 919 for type_changer in (lambda x: x, lambda x: x.decode('utf8')): 920 try: 921 self.assertMultiLineEqual(type_changer(sample_text), 922 type_changer(revised_sample_text)) 923 except self.failureException, e: 924 # need to remove the first line of the error message 925 error = str(e).encode('utf8').split('\n', 1)[1] 926 927 # assertMultiLineEqual is hooked up as the default for 928 # unicode strings - so we can't use it for this check 929 self.assertTrue(sample_text_error == error) 930 931 def testAsertEqualSingleLine(self): 932 sample_text = u"laden swallows fly slowly" 933 revised_sample_text = u"unladen swallows fly quickly" 934 sample_text_error = """\ 935 - laden swallows fly slowly 936 ? ^^^^ 937 + unladen swallows fly quickly 938 ? ++ ^^^^^ 939 """ 940 try: 941 self.assertEqual(sample_text, revised_sample_text) 942 except self.failureException as e: 943 error = str(e).split('\n', 1)[1] 944 self.assertTrue(sample_text_error == error) 945 946 def testAssertIsNone(self): 947 self.assertIsNone(None) 948 self.assertRaises(self.failureException, self.assertIsNone, False) 949 self.assertIsNotNone('DjZoPloGears on Rails') 950 self.assertRaises(self.failureException, self.assertIsNotNone, None) 951 952 def testAssertRegexpMatches(self): 953 self.assertRegexpMatches('asdfabasdf', r'ab+') 954 self.assertRaises(self.failureException, self.assertRegexpMatches, 955 'saaas', r'aaaa') 956 957 def testAssertRaisesRegexp(self): 958 class ExceptionMock(Exception): 959 pass 960 961 def Stub(): 962 raise ExceptionMock('We expect') 963 964 self.assertRaisesRegexp(ExceptionMock, re.compile('expect$'), Stub) 965 self.assertRaisesRegexp(ExceptionMock, 'expect$', Stub) 966 self.assertRaisesRegexp(ExceptionMock, u'expect$', Stub) 967 968 def testAssertNotRaisesRegexp(self): 969 self.assertRaisesRegexp( 970 self.failureException, '^Exception not raised$', 971 self.assertRaisesRegexp, Exception, re.compile('x'), 972 lambda: None) 973 self.assertRaisesRegexp( 974 self.failureException, '^Exception not raised$', 975 self.assertRaisesRegexp, Exception, 'x', 976 lambda: None) 977 self.assertRaisesRegexp( 978 self.failureException, '^Exception not raised$', 979 self.assertRaisesRegexp, Exception, u'x', 980 lambda: None) 981 982 def testAssertRaisesRegexpMismatch(self): 983 def Stub(): 984 raise Exception('Unexpected') 985 986 self.assertRaisesRegexp( 987 self.failureException, 988 r'"\^Expected\$" does not match "Unexpected"', 989 self.assertRaisesRegexp, Exception, '^Expected$', 990 Stub) 991 self.assertRaisesRegexp( 992 self.failureException, 993 r'"\^Expected\$" does not match "Unexpected"', 994 self.assertRaisesRegexp, Exception, u'^Expected$', 995 Stub) 996 self.assertRaisesRegexp( 997 self.failureException, 998 r'"\^Expected\$" does not match "Unexpected"', 999 self.assertRaisesRegexp, Exception, 1000 re.compile('^Expected$'), Stub) 1001 1002 def testAssertRaisesExcValue(self): 1003 class ExceptionMock(Exception): 1004 pass 1005 1006 def Stub(foo): 1007 raise ExceptionMock(foo) 1008 v = "particular value" 1009 1010 ctx = self.assertRaises(ExceptionMock) 1011 with ctx: 1012 Stub(v) 1013 e = ctx.exception 1014 self.assertIsInstance(e, ExceptionMock) 1015 self.assertEqual(e.args[0], v) 1016 1017 def testSynonymAssertMethodNames(self): 1018 """Test undocumented method name synonyms. 1019 1020 Please do not use these methods names in your own code. 1021 1022 This test confirms their continued existence and functionality 1023 in order to avoid breaking existing code. 1024 """ 1025 self.assertNotEquals(3, 5) 1026 self.assertEquals(3, 3) 1027 self.assertAlmostEquals(2.0, 2.0) 1028 self.assertNotAlmostEquals(3.0, 5.0) 1029 self.assert_(True) 1030 1031 def testPendingDeprecationMethodNames(self): 1032 """Test fail* methods pending deprecation, they will warn in 3.2. 1033 1034 Do not use these methods. They will go away in 3.3. 1035 """ 1036 with test_support.check_warnings(): 1037 self.failIfEqual(3, 5) 1038 self.failUnlessEqual(3, 3) 1039 self.failUnlessAlmostEqual(2.0, 2.0) 1040 self.failIfAlmostEqual(3.0, 5.0) 1041 self.failUnless(True) 1042 self.failUnlessRaises(TypeError, lambda _: 3.14 + u'spam') 1043 self.failIf(False) 1044 1045 def testDeepcopy(self): 1046 # Issue: 5660 1047 class TestableTest(unittest.TestCase): 1048 def testNothing(self): 1049 pass 1050 1051 test = TestableTest('testNothing') 1052 1053 # This shouldn't blow up 1054 deepcopy(test) 1055 1056 def testKeyboardInterrupt(self): 1057 def _raise(self=None): 1058 raise KeyboardInterrupt 1059 def nothing(self): 1060 pass 1061 1062 class Test1(unittest.TestCase): 1063 test_something = _raise 1064 1065 class Test2(unittest.TestCase): 1066 setUp = _raise 1067 test_something = nothing 1068 1069 class Test3(unittest.TestCase): 1070 test_something = nothing 1071 tearDown = _raise 1072 1073 class Test4(unittest.TestCase): 1074 def test_something(self): 1075 self.addCleanup(_raise) 1076 1077 for klass in (Test1, Test2, Test3, Test4): 1078 with self.assertRaises(KeyboardInterrupt): 1079 klass('test_something').run() 1080 1081 def testSystemExit(self): 1082 def _raise(self=None): 1083 raise SystemExit 1084 def nothing(self): 1085 pass 1086 1087 class Test1(unittest.TestCase): 1088 test_something = _raise 1089 1090 class Test2(unittest.TestCase): 1091 setUp = _raise 1092 test_something = nothing 1093 1094 class Test3(unittest.TestCase): 1095 test_something = nothing 1096 tearDown = _raise 1097 1098 class Test4(unittest.TestCase): 1099 def test_something(self): 1100 self.addCleanup(_raise) 1101 1102 for klass in (Test1, Test2, Test3, Test4): 1103 result = unittest.TestResult() 1104 klass('test_something').run(result) 1105 self.assertEqual(len(result.errors), 1) 1106 self.assertEqual(result.testsRun, 1) 1107 1108 def testPickle(self): 1109 # Issue 10326 1110 1111 # Can't use TestCase classes defined in Test class as 1112 # pickle does not work with inner classes 1113 test = unittest.TestCase('run') 1114 for protocol in range(pickle.HIGHEST_PROTOCOL + 1): 1115 1116 # blew up prior to fix 1117 pickled_test = pickle.dumps(test, protocol=protocol) 1118 1119 unpickled_test = pickle.loads(pickled_test) 1120 self.assertEqual(test, unpickled_test) 1121 1122 1123 if __name__ == '__main__': 1124 unittest.main() 1125