diff options
-rw-r--r-- | Lib/test/test_unittest.py | 4 | ||||
-rw-r--r-- | Lib/unittest.py | 26 |
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. |