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