Commit 04516611 authored by Michael Foord's avatar Michael Foord

Make assertSequenceEqual error messages less cryptic, particularly for nested sequences.

parent 7285a266
...@@ -731,23 +731,32 @@ class TestCase(object): ...@@ -731,23 +731,32 @@ class TestCase(object):
if seq1 == seq2: if seq1 == seq2:
return return
seq1_repr = repr(seq1)
seq2_repr = repr(seq2)
if len(seq1_repr) > 30:
seq1_repr = seq1_repr[:30] + '...'
if len(seq2_repr) > 30:
seq2_repr = seq2_repr[:30] + '...'
elements = (seq_type_name.capitalize(), seq1_repr, seq2_repr)
differing = '%ss differ: %s != %s\n' % elements
for i in xrange(min(len1, len2)): for i in xrange(min(len1, len2)):
try: try:
item1 = seq1[i] item1 = seq1[i]
except (TypeError, IndexError, NotImplementedError): except (TypeError, IndexError, NotImplementedError):
differing = ('Unable to index element %d of first %s\n' % differing += ('\nUnable to index element %d of first %s\n' %
(i, seq_type_name)) (i, seq_type_name))
break break
try: try:
item2 = seq2[i] item2 = seq2[i]
except (TypeError, IndexError, NotImplementedError): except (TypeError, IndexError, NotImplementedError):
differing = ('Unable to index element %d of second %s\n' % differing += ('\nUnable to index element %d of second %s\n' %
(i, seq_type_name)) (i, seq_type_name))
break break
if item1 != item2: if item1 != item2:
differing = ('First differing element %d:\n%s\n%s\n' % differing += ('\nFirst differing element %d:\n%s\n%s\n' %
(i, item1, item2)) (i, item1, item2))
break break
else: else:
...@@ -755,28 +764,26 @@ class TestCase(object): ...@@ -755,28 +764,26 @@ class TestCase(object):
type(seq1) != type(seq2)): type(seq1) != type(seq2)):
# The sequences are the same, but have differing types. # The sequences are the same, but have differing types.
return return
# A catch-all message for handling arbitrary user-defined
# sequences. if len1 > len2:
differing = '%ss differ:\n' % seq_type_name.capitalize() differing += ('\nFirst %s contains %d additional '
if len1 > len2: 'elements.\n' % (seq_type_name, len1 - len2))
differing = ('First %s contains %d additional ' try:
'elements.\n' % (seq_type_name, len1 - len2)) differing += ('First extra element %d:\n%s\n' %
try: (len2, seq1[len2]))
differing += ('First extra element %d:\n%s\n' % except (TypeError, IndexError, NotImplementedError):
(len2, seq1[len2])) differing += ('Unable to index element %d '
except (TypeError, IndexError, NotImplementedError): 'of first %s\n' % (len2, seq_type_name))
differing += ('Unable to index element %d ' elif len1 < len2:
'of first %s\n' % (len2, seq_type_name)) differing += ('\nSecond %s contains %d additional '
elif len1 < len2: 'elements.\n' % (seq_type_name, len2 - len1))
differing = ('Second %s contains %d additional ' try:
'elements.\n' % (seq_type_name, len2 - len1)) differing += ('First extra element %d:\n%s\n' %
try: (len1, seq2[len1]))
differing += ('First extra element %d:\n%s\n' % except (TypeError, IndexError, NotImplementedError):
(len1, seq2[len1])) differing += ('Unable to index element %d '
except (TypeError, IndexError, NotImplementedError): 'of second %s\n' % (len1, seq_type_name))
differing += ('Unable to index element %d ' standardMsg = differing + '\n' + '\n'.join(difflib.ndiff(pprint.pformat(seq1).splitlines(),
'of second %s\n' % (len1, seq_type_name))
standardMsg = differing + '\n'.join(difflib.ndiff(pprint.pformat(seq1).splitlines(),
pprint.pformat(seq2).splitlines())) pprint.pformat(seq2).splitlines()))
msg = self._formatMessage(msg, standardMsg) msg = self._formatMessage(msg, standardMsg)
self.fail(msg) self.fail(msg)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment