#11763: merge with 3.2.
This commit is contained in:
commit
9490af2150
|
@ -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
|
||||
|
@ -1006,6 +1010,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:
|
||||
|
|
|
@ -720,6 +720,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])
|
||||
|
|
Loading…
Reference in New Issue