summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_unittest.py4
-rw-r--r--Lib/unittest.py26
2 files changed, 25 insertions, 5 deletions
diff --git a/Lib/test/test_unittest.py b/Lib/test/test_unittest.py
index 33204f87b1..aaa3dc545f 100644
--- a/Lib/test/test_unittest.py
+++ b/Lib/test/test_unittest.py
@@ -2392,8 +2392,6 @@ class Test_TestCase(TestCase, TestEquality, TestHashing):
self.assertRaises(self.failureException, self.assertEqual, a, b,
msg='foo')
- # The fact that dictionaries are unorderable breaks this test for them.
- @unittest.expectedFailure
def testEquality(self):
self.assertListEqual([], [])
self.assertTupleEqual((), ())
@@ -2459,6 +2457,8 @@ class Test_TestCase(TestCase, TestEquality, TestHashing):
self.assertSameElements([{'a': 1}, {'b': 2}], [{'b': 2}, {'a': 1}])
self.assertRaises(self.failureException, self.assertSameElements,
[[1]], [[2]])
+ self.assertRaises(self.failureException, self.assertSameElements,
+ [{'a': 1}, {'b': 2}], [{'b': 2}, {'a': 2}])
def testAssertSetEqual(self):
set1 = set()
diff --git a/Lib/unittest.py b/Lib/unittest.py
index 16a866343f..244a45beec 100644
--- a/Lib/unittest.py
+++ b/Lib/unittest.py
@@ -858,9 +858,13 @@ class TestCase(object):
# not hashable.
expected = list(expected_seq)
actual = list(actual_seq)
- expected.sort()
- actual.sort()
- missing, unexpected = _SortedListDifference(expected, actual)
+ try:
+ expected.sort()
+ actual.sort()
+ except TypeError:
+ missing, unexpected = _UnorderableListDifference(expected, actual)
+ else:
+ missing, unexpected = _SortedListDifference(expected, actual)
errors = []
if missing:
errors.append('Expected, but missing:\n %r' % missing)
@@ -985,6 +989,22 @@ def _SortedListDifference(expected, actual):
break
return missing, unexpected
+def _UnorderableListDifference(expected, actual):
+ """Same behavior as _SortedListDifference 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
class TestSuite(object):
"""A test suite is a composite test consisting of a number of TestCases.