|
23 | 23 | import bisect as c_bisect |
24 | 24 |
|
25 | 25 |
|
| 26 | +class Range(object): |
| 27 | + """A trivial range()-like object without any integer width limitations.""" |
| 28 | + def __init__(self, start, stop): |
| 29 | + self.start = start |
| 30 | + self.stop = stop |
| 31 | + self.last_insert = None |
| 32 | + |
| 33 | + def __len__(self): |
| 34 | + return self.stop - self.start |
| 35 | + |
| 36 | + def __getitem__(self, idx): |
| 37 | + n = self.stop - self.start |
| 38 | + if idx < 0: |
| 39 | + idx += n |
| 40 | + if idx >= n: |
| 41 | + raise IndexError(idx) |
| 42 | + return self.start + idx |
| 43 | + |
| 44 | + def insert(self, idx, item): |
| 45 | + self.last_insert = idx, item |
| 46 | + |
| 47 | + |
26 | 48 | class TestBisect(unittest.TestCase): |
27 | 49 | module = None |
28 | 50 |
|
@@ -125,9 +147,28 @@ def test_negative_lo(self): |
125 | 147 | def test_large_range(self): |
126 | 148 | # Issue 13496 |
127 | 149 | mod = self.module |
128 | | - data = range(sys.maxsize-1) |
129 | | - self.assertEqual(mod.bisect_left(data, sys.maxsize-3), sys.maxsize-3) |
130 | | - self.assertEqual(mod.bisect_right(data, sys.maxsize-3), sys.maxsize-2) |
| 150 | + n = sys.maxsize |
| 151 | + data = range(n-1) |
| 152 | + self.assertEqual(mod.bisect_left(data, n-3), n-3) |
| 153 | + self.assertEqual(mod.bisect_right(data, n-3), n-2) |
| 154 | + self.assertEqual(mod.bisect_left(data, n-3, n-10, n), n-3) |
| 155 | + self.assertEqual(mod.bisect_right(data, n-3, n-10, n), n-2) |
| 156 | + |
| 157 | + def test_large_pyrange(self): |
| 158 | + # Same as above, but without C-imposed limits on range() parameters |
| 159 | + mod = self.module |
| 160 | + n = sys.maxsize |
| 161 | + data = Range(0, n-1) |
| 162 | + self.assertEqual(mod.bisect_left(data, n-3), n-3) |
| 163 | + self.assertEqual(mod.bisect_right(data, n-3), n-2) |
| 164 | + self.assertEqual(mod.bisect_left(data, n-3, n-10, n), n-3) |
| 165 | + self.assertEqual(mod.bisect_right(data, n-3, n-10, n), n-2) |
| 166 | + x = n - 100 |
| 167 | + mod.insort_left(data, x, x - 50, x + 50) |
| 168 | + self.assertEqual(data.last_insert, (x, x)) |
| 169 | + x = n - 200 |
| 170 | + mod.insort_right(data, x, x - 50, x + 50) |
| 171 | + self.assertEqual(data.last_insert, (x + 1, x)) |
131 | 172 |
|
132 | 173 | def test_random(self, n=25): |
133 | 174 | from random import randrange |
|
0 commit comments