]> granicus.if.org Git - python/commitdiff
Patch for Py3k with fallback for comparing unsortable sequences in
authorMichael Foord <fuzzyman@voidspace.org.uk>
Sat, 4 Apr 2009 18:55:09 +0000 (18:55 +0000)
committerMichael Foord <fuzzyman@voidspace.org.uk>
Sat, 4 Apr 2009 18:55:09 +0000 (18:55 +0000)
assertSameElements.

Removed the expected failure and added another test case to confirm that
this patch works for unsortable sequences that are the same (no fail)
and different (fail).

Issue #2578

Lib/test/test_unittest.py
Lib/unittest.py

index 33204f87b11b9dc88cfee1c7e7729cc89fdf7a84..aaa3dc545f6f874df89406a52330e601253edb39 100644 (file)
@@ -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()
index 16a866343f7e53e78360480db0f2f266fa5852f5..244a45beec90b46d5a0b8cb34cbeb6be86a9eaec 100644 (file)
@@ -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.