diff options
author | Mark Dickinson <mdickinson@enthought.com> | 2011-10-23 18:53:01 (GMT) |
---|---|---|
committer | Mark Dickinson <mdickinson@enthought.com> | 2011-10-23 18:53:01 (GMT) |
commit | 36645681c8ad9a30d142f1dabb44d1d6c3ed5fab (patch) | |
tree | b98250ba008c4e858e44563e12f232d5ccfb8dd9 /Lib | |
parent | a2a2e480f335b8758a159ea72ab0067127d1d303 (diff) | |
download | cpython-36645681c8ad9a30d142f1dabb44d1d6c3ed5fab.zip cpython-36645681c8ad9a30d142f1dabb44d1d6c3ed5fab.tar.gz cpython-36645681c8ad9a30d142f1dabb44d1d6c3ed5fab.tar.bz2 |
Issue #13201: equality for range objects is now based on equality of the underlying sequences. Thanks Sven Marnach for the patch.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_hash.py | 3 | ||||
-rw-r--r-- | Lib/test/test_range.py | 52 |
2 files changed, 53 insertions, 2 deletions
diff --git a/Lib/test/test_hash.py b/Lib/test/test_hash.py index fea1025..779e485 100644 --- a/Lib/test/test_hash.py +++ b/Lib/test/test_hash.py @@ -107,8 +107,7 @@ class DefaultIterSeq(object): return self.seq[index] class HashBuiltinsTestCase(unittest.TestCase): - hashes_to_check = [range(10), - enumerate(range(10)), + hashes_to_check = [enumerate(range(10)), iter(DefaultIterSeq()), iter(lambda: 0, 0), ] diff --git a/Lib/test/test_range.py b/Lib/test/test_range.py index ede0791..6035e76 100644 --- a/Lib/test/test_range.py +++ b/Lib/test/test_range.py @@ -507,6 +507,58 @@ class RangeTest(unittest.TestCase): for k in values - {0}: r[i:j:k] + def test_comparison(self): + test_ranges = [range(0), range(0, -1), range(1, 1, 3), + range(1), range(5, 6), range(5, 6, 2), + range(5, 7, 2), range(2), range(0, 4, 2), + range(0, 5, 2), range(0, 6, 2)] + test_tuples = list(map(tuple, test_ranges)) + + # Check that equality of ranges matches equality of the corresponding + # tuples for each pair from the test lists above. + ranges_eq = [a == b for a in test_ranges for b in test_ranges] + tuples_eq = [a == b for a in test_tuples for b in test_tuples] + self.assertEqual(ranges_eq, tuples_eq) + + # Check that != correctly gives the logical negation of == + ranges_ne = [a != b for a in test_ranges for b in test_ranges] + self.assertEqual(ranges_ne, [not x for x in ranges_eq]) + + # Equal ranges should have equal hashes. + for a in test_ranges: + for b in test_ranges: + if a == b: + self.assertEqual(hash(a), hash(b)) + + # Ranges are unequal to other types (even sequence types) + self.assertIs(range(0) == (), False) + self.assertIs(() == range(0), False) + self.assertIs(range(2) == [0, 1], False) + + # Huge integers aren't a problem. + self.assertEqual(range(0, 2**100 - 1, 2), + range(0, 2**100, 2)) + self.assertEqual(hash(range(0, 2**100 - 1, 2)), + hash(range(0, 2**100, 2))) + self.assertNotEqual(range(0, 2**100, 2), + range(0, 2**100 + 1, 2)) + self.assertEqual(range(2**200, 2**201 - 2**99, 2**100), + range(2**200, 2**201, 2**100)) + self.assertEqual(hash(range(2**200, 2**201 - 2**99, 2**100)), + hash(range(2**200, 2**201, 2**100))) + self.assertNotEqual(range(2**200, 2**201, 2**100), + range(2**200, 2**201 + 1, 2**100)) + + # Order comparisons are not implemented for ranges. + with self.assertRaises(TypeError): + range(0) < range(0) + with self.assertRaises(TypeError): + range(0) > range(0) + with self.assertRaises(TypeError): + range(0) <= range(0) + with self.assertRaises(TypeError): + range(0) >= range(0) + def test_main(): test.support.run_unittest(RangeTest) |