diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2013-09-23 20:07:00 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2013-09-23 20:07:00 (GMT) |
commit | 77622f55c2705014005623fd58020f6f06379e12 (patch) | |
tree | 1a303a515d7bf14d78e0c1955c28845d2f6a7dc8 /Lib/unittest/util.py | |
parent | 463bd4b5c6046f2501b36978ea2732e5bcd4ea19 (diff) | |
download | cpython-77622f55c2705014005623fd58020f6f06379e12.zip cpython-77622f55c2705014005623fd58020f6f06379e12.tar.gz cpython-77622f55c2705014005623fd58020f6f06379e12.tar.bz2 |
Issue #18996: TestCase.assertEqual() now more cleverly shorten differing
strings in error report.
Diffstat (limited to 'Lib/unittest/util.py')
-rw-r--r-- | Lib/unittest/util.py | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/Lib/unittest/util.py b/Lib/unittest/util.py index ccdf0b8..aee498f 100644 --- a/Lib/unittest/util.py +++ b/Lib/unittest/util.py @@ -1,10 +1,47 @@ """Various utility functions.""" from collections import namedtuple, OrderedDict +from os.path import commonprefix __unittest = True _MAX_LENGTH = 80 +_PLACEHOLDER_LEN = 12 +_MIN_BEGIN_LEN = 5 +_MIN_END_LEN = 5 +_MIN_COMMON_LEN = 5 +_MIN_DIFF_LEN = _MAX_LENGTH - \ + (_MIN_BEGIN_LEN + _PLACEHOLDER_LEN + _MIN_COMMON_LEN + + _PLACEHOLDER_LEN + _MIN_END_LEN) +assert _MIN_DIFF_LEN >= 0 + +def _shorten(s, prefixlen, suffixlen): + skip = len(s) - prefixlen - suffixlen + if skip > _PLACEHOLDER_LEN: + s = '%s[%d chars]%s' % (s[:prefixlen], skip, s[len(s) - suffixlen:]) + return s + +def _common_shorten_repr(*args): + args = tuple(map(safe_repr, args)) + maxlen = max(map(len, args)) + if maxlen <= _MAX_LENGTH: + return args + + prefix = commonprefix(args) + prefixlen = len(prefix) + + common_len = _MAX_LENGTH - \ + (maxlen - prefixlen + _MIN_BEGIN_LEN + _PLACEHOLDER_LEN) + if common_len > _MIN_COMMON_LEN: + assert _MIN_BEGIN_LEN + _PLACEHOLDER_LEN + _MIN_COMMON_LEN + \ + (maxlen - prefixlen) < _MAX_LENGTH + prefix = _shorten(prefix, _MIN_BEGIN_LEN, common_len) + return tuple(prefix + s[prefixlen:] for s in args) + + prefix = _shorten(prefix, _MIN_BEGIN_LEN, _MIN_COMMON_LEN) + return tuple(prefix + _shorten(s[prefixlen:], _MIN_DIFF_LEN, _MIN_END_LEN) + for s in args) + def safe_repr(obj, short=False): try: result = repr(obj) |