summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Foord <fuzzyman@voidspace.org.uk>2010-06-05 12:10:52 (GMT)
committerMichael Foord <fuzzyman@voidspace.org.uk>2010-06-05 12:10:52 (GMT)
commite37d75fce22f6c216148102652db64744ac06a6e (patch)
tree888822f5faf9b15b9ee815818de2f23e61f53bd5
parent23f0d6b57bb9427df0ab2305c47f14b9c092e0fe (diff)
downloadcpython-e37d75fce22f6c216148102652db64744ac06a6e.zip
cpython-e37d75fce22f6c216148102652db64744ac06a6e.tar.gz
cpython-e37d75fce22f6c216148102652db64744ac06a6e.tar.bz2
Removed the new max_diff argument to assertSequenceEqual. All unittest.TestCase assert methods that use difflib to produce failure messages now truncate overly long messages. New class attribute unittest.TestCase.maxDiff to configure this if necessary. Issue 8351.
-rw-r--r--Lib/unittest/case.py23
-rw-r--r--Lib/unittest/test/test_case.py25
2 files changed, 35 insertions, 13 deletions
diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py
index de58968..b984bb9 100644
--- a/Lib/unittest/case.py
+++ b/Lib/unittest/case.py
@@ -13,7 +13,6 @@ from .util import (
)
__unittest = True
-TRUNCATED_DIFF = '\n[diff truncated...]'
class SkipTest(Exception):
"""
@@ -157,6 +156,11 @@ class TestCase(object):
longMessage = False
+ # This attribute sets the maximum length of a diff in failure messsages
+ # by assert methods using difflib. It is looked up as an instance attribute
+ # so can be configured by individual tests if required.
+ maxDiff = 80*8
+
# Attribute used by TestSuite for classSetUp
_classSetupFailed = False
@@ -589,8 +593,7 @@ class TestCase(object):
failUnlessRaises = _deprecate(assertRaises)
failIf = _deprecate(assertFalse)
- def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None,
- max_diff=80*8):
+ def assertSequenceEqual(self, seq1, seq2, msg=None, seq_type=None):
"""An equality assertion for ordered sequences (like lists and tuples).
For the purposes of this function, a valid ordered sequence type is one
@@ -603,7 +606,6 @@ class TestCase(object):
datatype should be enforced.
msg: Optional message to use on failure instead of a list of
differences.
- max_diff: Maximum size off the diff, larger diffs are not shown
"""
if seq_type is not None:
seq_type_name = seq_type.__name__
@@ -690,14 +692,15 @@ class TestCase(object):
diffMsg = '\n' + '\n'.join(
difflib.ndiff(pprint.pformat(seq1).splitlines(),
pprint.pformat(seq2).splitlines()))
- standardMsg = self._truncateMessage(standardMsg, diffMsg, max_diff)
+ standardMsg = self._truncateMessage(standardMsg, diffMsg)
msg = self._formatMessage(msg, standardMsg)
self.fail(msg)
- def _truncateMessage(self, message, diff, max_diff):
+ def _truncateMessage(self, message, diff):
+ max_diff = self.maxDiff
if max_diff is None or len(diff) <= max_diff:
return message + diff
- return message + diff[:max_diff] + TRUNCATED_DIFF
+ return message
def assertListEqual(self, list1, list2, msg=None):
"""A list-specific equality assertion.
@@ -797,9 +800,10 @@ class TestCase(object):
self.assert_(isinstance(d2, dict), 'Second argument is not a dictionary')
if d1 != d2:
- standardMsg = ('\n' + '\n'.join(difflib.ndiff(
+ diff = ('\n' + '\n'.join(difflib.ndiff(
pprint.pformat(d1).splitlines(),
pprint.pformat(d2).splitlines())))
+ standardMsg = self._truncateMessage('', diff)
self.fail(self._formatMessage(msg, standardMsg))
def assertDictContainsSubset(self, expected, actual, msg=None):
@@ -882,8 +886,9 @@ class TestCase(object):
'Second argument is not a string'))
if first != second:
- standardMsg = '\n' + ''.join(difflib.ndiff(first.splitlines(True),
+ diff = '\n' + ''.join(difflib.ndiff(first.splitlines(True),
second.splitlines(True)))
+ standardMsg = self._truncateMessage('', diff)
self.fail(self._formatMessage(msg, standardMsg))
def assertLess(self, a, b, msg=None):
diff --git a/Lib/unittest/test/test_case.py b/Lib/unittest/test/test_case.py
index 7dbc009..840defd 100644
--- a/Lib/unittest/test/test_case.py
+++ b/Lib/unittest/test/test_case.py
@@ -591,20 +591,37 @@ class Test_TestCase(unittest.TestCase, TestEquality, TestHashing):
self.assertRaises(self.failureException, self.assertDictEqual, 1, 1)
def testAssertSequenceEqualMaxDiff(self):
+ self.assertEqual(self.maxDiff, 80*8)
seq1 = 'a' + 'x' * 80**2
seq2 = 'b' + 'x' * 80**2
diff = '\n'.join(difflib.ndiff(pprint.pformat(seq1).splitlines(),
pprint.pformat(seq2).splitlines()))
+
+ self.maxDiff = len(diff)//2
try:
- self.assertSequenceEqual(seq1, seq2, max_diff=len(diff)/2)
- except AssertionError as e:
+ self.assertSequenceEqual(seq1, seq2)
+ except self.failureException as e:
msg = e.args[0]
+ else:
+ self.fail('assertSequenceEqual did not fail.')
self.assertTrue(len(msg) < len(diff))
+ self.maxDiff = len(diff) * 2
+ try:
+ self.assertSequenceEqual(seq1, seq2)
+ except self.failureException as e:
+ msg = e.args[0]
+ else:
+ self.fail('assertSequenceEqual did not fail.')
+ self.assertTrue(len(msg) > len(diff))
+
+ self.maxDiff = None
try:
- self.assertSequenceEqual(seq1, seq2, max_diff=len(diff)*2)
- except AssertionError as e:
+ self.assertSequenceEqual(seq1, seq2)
+ except self.failureException as e:
msg = e.args[0]
+ else:
+ self.fail('assertSequenceEqual did not fail.')
self.assertTrue(len(msg) > len(diff))
def testAssertItemsEqual(self):