mirror of
https://github.com/python/cpython.git
synced 2025-08-15 22:30:42 +00:00
Issue #10242: backport of more fixes to unittest.TestCase.assertItemsEqual
This commit is contained in:
parent
2ab5994dbe
commit
4c9e91a092
4 changed files with 105 additions and 40 deletions
|
@ -1,4 +1,6 @@
|
|||
"""Various utility functions."""
|
||||
from collections import namedtuple, OrderedDict
|
||||
|
||||
|
||||
__unittest = True
|
||||
|
||||
|
@ -92,3 +94,63 @@ def unorderable_list_difference(expected, actual, ignore_duplicate=False):
|
|||
|
||||
# anything left in actual is unexpected
|
||||
return missing, actual
|
||||
|
||||
_Mismatch = namedtuple('Mismatch', 'actual expected value')
|
||||
|
||||
def _count_diff_all_purpose(actual, expected):
|
||||
'Returns list of (cnt_act, cnt_exp, elem) triples where the counts differ'
|
||||
# elements need not be hashable
|
||||
s, t = list(actual), list(expected)
|
||||
m, n = len(s), len(t)
|
||||
NULL = object()
|
||||
result = []
|
||||
for i, elem in enumerate(s):
|
||||
if elem is NULL:
|
||||
continue
|
||||
cnt_s = cnt_t = 0
|
||||
for j in range(i, m):
|
||||
if s[j] == elem:
|
||||
cnt_s += 1
|
||||
s[j] = NULL
|
||||
for j, other_elem in enumerate(t):
|
||||
if other_elem == elem:
|
||||
cnt_t += 1
|
||||
t[j] = NULL
|
||||
if cnt_s != cnt_t:
|
||||
diff = _Mismatch(cnt_s, cnt_t, elem)
|
||||
result.append(diff)
|
||||
|
||||
for i, elem in enumerate(t):
|
||||
if elem is NULL:
|
||||
continue
|
||||
cnt_t = 0
|
||||
for j in range(i, n):
|
||||
if t[j] == elem:
|
||||
cnt_t += 1
|
||||
t[j] = NULL
|
||||
diff = _Mismatch(0, cnt_t, elem)
|
||||
result.append(diff)
|
||||
return result
|
||||
|
||||
def _ordered_count(iterable):
|
||||
'Return dict of element counts, in the order they were first seen'
|
||||
c = OrderedDict()
|
||||
for elem in iterable:
|
||||
c[elem] = c.get(elem, 0) + 1
|
||||
return c
|
||||
|
||||
def _count_diff_hashable(actual, expected):
|
||||
'Returns list of (cnt_act, cnt_exp, elem) triples where the counts differ'
|
||||
# elements must be hashable
|
||||
s, t = _ordered_count(actual), _ordered_count(expected)
|
||||
result = []
|
||||
for elem, cnt_s in s.items():
|
||||
cnt_t = t.get(elem, 0)
|
||||
if cnt_s != cnt_t:
|
||||
diff = _Mismatch(cnt_s, cnt_t, elem)
|
||||
result.append(diff)
|
||||
for elem, cnt_t in t.items():
|
||||
if elem not in s:
|
||||
diff = _Mismatch(0, cnt_t, elem)
|
||||
result.append(diff)
|
||||
return result
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue