summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Foord <fuzzyman@voidspace.org.uk>2009-04-04 18:55:09 +0000
committerMichael Foord <fuzzyman@voidspace.org.uk>2009-04-04 18:55:09 +0000
commita5809c84b392ef855ac18b17967c9f7e34118053 (patch)
treea50c177030a0710e73b9c96c46a4ed57e3feff29
parent270a9ceb5b5dd72792ee88d5420417105cedcb2b (diff)
downloadcpython-git-a5809c84b392ef855ac18b17967c9f7e34118053.tar.gz
Patch for Py3k with fallback for comparing unsortable sequences in
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
-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.