2009-07-19 18:01:52 -03:00
|
|
|
"""Various utility functions."""
|
|
|
|
|
2010-03-21 21:15:53 -03:00
|
|
|
__unittest = True
|
|
|
|
|
|
|
|
|
Merged revisions 78227,78229,78288,78348,78377,78770,78774-78776,78810 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r78227 | michael.foord | 2010-02-18 14:30:09 -0600 (Thu, 18 Feb 2010) | 1 line
unittest.TestCase uses safe_repr for producing failure messages. Partial fix for issue 7956
........
r78229 | michael.foord | 2010-02-18 15:37:07 -0600 (Thu, 18 Feb 2010) | 1 line
Fix unittest.TestCase.assertDictContainsSubset so it can't die with unicode issues when constructing failure messages. Issue 7956
........
r78288 | michael.foord | 2010-02-21 08:48:59 -0600 (Sun, 21 Feb 2010) | 1 line
Silence UnicodeWarning in crazy unittest test.
........
r78348 | michael.foord | 2010-02-22 17:28:32 -0600 (Mon, 22 Feb 2010) | 1 line
Support for old TestResult object (unittest) with warnings when using unsupported features.
........
r78377 | michael.foord | 2010-02-23 11:00:53 -0600 (Tue, 23 Feb 2010) | 1 line
unittest.TestResult can now be used with the TextTestRunner. TextTestRunner compatible with old TestResult objects.
........
r78770 | michael.foord | 2010-03-07 14:22:12 -0600 (Sun, 07 Mar 2010) | 1 line
Fix for potentials errors in constructing unittest failure messages. Plus skipped test methods no longer run setUp and tearDown (Issue 8059)
........
r78774 | michael.foord | 2010-03-07 16:04:55 -0600 (Sun, 07 Mar 2010) | 1 line
Addition of setUpClass and setUpModule shared fixtures to unittest.
........
r78775 | michael.foord | 2010-03-07 17:10:36 -0600 (Sun, 07 Mar 2010) | 1 line
Fix accidental name rebinding in unittest py3k warning filtering.
........
r78776 | michael.foord | 2010-03-07 17:16:20 -0600 (Sun, 07 Mar 2010) | 1 line
Remove accidental print statement from last commit.
........
r78810 | raymond.hettinger | 2010-03-09 02:44:18 -0600 (Tue, 09 Mar 2010) | 5 lines
Improve the basic example.
* Show both the decorator and regular form for assertRaises()
* Use assertTrue() instead of assertIn() to teach useful minimal subset of the API
........
2010-03-14 12:04:17 -03:00
|
|
|
def safe_repr(obj):
|
|
|
|
try:
|
|
|
|
return repr(obj)
|
|
|
|
except Exception:
|
|
|
|
return object.__repr__(obj)
|
|
|
|
|
2009-07-19 18:01:52 -03:00
|
|
|
def strclass(cls):
|
|
|
|
return "%s.%s" % (cls.__module__, cls.__name__)
|
|
|
|
|
|
|
|
def sorted_list_difference(expected, actual):
|
|
|
|
"""Finds elements in only one or the other of two, sorted input lists.
|
|
|
|
|
|
|
|
Returns a two-element tuple of lists. The first list contains those
|
|
|
|
elements in the "expected" list but not in the "actual" list, and the
|
|
|
|
second contains those elements in the "actual" list but not in the
|
|
|
|
"expected" list. Duplicate elements in either input list are ignored.
|
|
|
|
"""
|
|
|
|
i = j = 0
|
|
|
|
missing = []
|
|
|
|
unexpected = []
|
|
|
|
while True:
|
|
|
|
try:
|
|
|
|
e = expected[i]
|
|
|
|
a = actual[j]
|
|
|
|
if e < a:
|
|
|
|
missing.append(e)
|
|
|
|
i += 1
|
|
|
|
while expected[i] == e:
|
|
|
|
i += 1
|
|
|
|
elif e > a:
|
|
|
|
unexpected.append(a)
|
|
|
|
j += 1
|
|
|
|
while actual[j] == a:
|
|
|
|
j += 1
|
|
|
|
else:
|
|
|
|
i += 1
|
|
|
|
try:
|
|
|
|
while expected[i] == e:
|
|
|
|
i += 1
|
|
|
|
finally:
|
|
|
|
j += 1
|
|
|
|
while actual[j] == a:
|
|
|
|
j += 1
|
|
|
|
except IndexError:
|
|
|
|
missing.extend(expected[i:])
|
|
|
|
unexpected.extend(actual[j:])
|
|
|
|
break
|
|
|
|
return missing, unexpected
|
|
|
|
|
|
|
|
|
|
|
|
def unorderable_list_difference(expected, actual):
|
|
|
|
"""Same behavior as sorted_list_difference but
|
|
|
|
for lists of unorderable items (like dicts).
|
|
|
|
|
|
|
|
As it does a linear search per item (remove) it
|
|
|
|
has O(n*n) performance."""
|
|
|
|
missing = []
|
|
|
|
while expected:
|
|
|
|
item = expected.pop()
|
|
|
|
try:
|
|
|
|
actual.remove(item)
|
|
|
|
except ValueError:
|
|
|
|
missing.append(item)
|
|
|
|
|
|
|
|
# anything left in actual is unexpected
|
|
|
|
return missing, actual
|
|
|
|
|
|
|
|
def CmpToKey(mycmp):
|
|
|
|
'Convert a cmp= function into a key= function'
|
|
|
|
class K(object):
|
|
|
|
def __init__(self, obj, *args):
|
|
|
|
self.obj = obj
|
|
|
|
def __lt__(self, other):
|
|
|
|
return mycmp(self.obj, other.obj) == -1
|
|
|
|
return K
|
|
|
|
|
|
|
|
def three_way_cmp(x, y):
|
|
|
|
"""Return -1 if x < y, 0 if x == y and 1 if x > y"""
|
|
|
|
return (x > y) - (x < y)
|