diff options
author | Ezio Melotti <ezio.melotti@gmail.com> | 2011-04-27 07:20:38 (GMT) |
---|---|---|
committer | Ezio Melotti <ezio.melotti@gmail.com> | 2011-04-27 07:20:38 (GMT) |
commit | edd117fd279a8c7339ec2d6d88633218ef9d891e (patch) | |
tree | 1f512ccc12aba628fbc5115cc394aabbfc6d6831 /Lib/unittest | |
parent | 40fc59d98b70902f140aaf3c3e4c2b0739a9f1bc (diff) | |
parent | 935a5888255b60b77547e7bdf32e03fbe963ef52 (diff) | |
download | cpython-edd117fd279a8c7339ec2d6d88633218ef9d891e.zip cpython-edd117fd279a8c7339ec2d6d88633218ef9d891e.tar.gz cpython-edd117fd279a8c7339ec2d6d88633218ef9d891e.tar.bz2 |
#11763: merge with 3.1.
Diffstat (limited to 'Lib/unittest')
-rw-r--r-- | Lib/unittest/case.py | 8 | ||||
-rw-r--r-- | Lib/unittest/test/test_case.py | 36 |
2 files changed, 44 insertions, 0 deletions
diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py index 01c5a7b..3f2f37d 100644 --- a/Lib/unittest/case.py +++ b/Lib/unittest/case.py @@ -263,6 +263,10 @@ class TestCase(object): maxDiff = 80*8 + # If a string is longer than _diffThreshold, use normal comparison instead + # of difflib. See #11763. + _diffThreshold = 2**16 + # Attribute used by TestSuite for classSetUp _classSetupFailed = False @@ -1048,6 +1052,10 @@ class TestCase(object): self.assertIsInstance(second, str, 'Second argument is not a string') if first != second: + # don't use difflib if the strings are too long + if (len(first) > self._diffThreshold or + len(second) > self._diffThreshold): + self._baseAssertEqual(first, second, msg) firstlines = first.splitlines(True) secondlines = second.splitlines(True) if len(firstlines) == 1 and first.strip('\r\n') == first: diff --git a/Lib/unittest/test/test_case.py b/Lib/unittest/test/test_case.py index 1db433f..c74a539 100644 --- a/Lib/unittest/test/test_case.py +++ b/Lib/unittest/test/test_case.py @@ -685,6 +685,42 @@ class Test_TestCase(unittest.TestCase, TestEquality, TestHashing): else: self.fail('assertMultiLineEqual did not fail') + def testAssertEqual_diffThreshold(self): + # check threshold value + self.assertEqual(self._diffThreshold, 2**16) + # disable madDiff to get diff markers + self.maxDiff = None + + # set a lower threshold value and add a cleanup to restore it + old_threshold = self._diffThreshold + self._diffThreshold = 2**8 + self.addCleanup(lambda: setattr(self, '_diffThreshold', old_threshold)) + + # under the threshold: diff marker (^) in error message + s = 'x' * (2**7) + with self.assertRaises(self.failureException) as cm: + self.assertEqual(s + 'a', s + 'b') + self.assertIn('^', str(cm.exception)) + self.assertEqual(s + 'a', s + 'a') + + # over the threshold: diff not used and marker (^) not in error message + s = 'x' * (2**9) + # if the path that uses difflib is taken, _truncateMessage will be + # called -- replace it with explodingTruncation to verify that this + # doesn't happen + def explodingTruncation(message, diff): + raise SystemError('this should not be raised') + old_truncate = self._truncateMessage + self._truncateMessage = explodingTruncation + self.addCleanup(lambda: setattr(self, '_truncateMessage', old_truncate)) + + s1, s2 = s + 'a', s + 'b' + with self.assertRaises(self.failureException) as cm: + self.assertEqual(s1, s2) + self.assertNotIn('^', str(cm.exception)) + self.assertEqual(str(cm.exception), '%r != %r' % (s1, s2)) + self.assertEqual(s + 'a', s + 'a') + def testAssertCountEqual(self): a = object() self.assertCountEqual([1, 2, 3], [3, 2, 1]) |