mirror of
https://github.com/RustPython/RustPython.git
synced 2026-06-02 19:39:49 +09:00
132 lines
2.6 KiB
Python
132 lines
2.6 KiB
Python
from testutils import assert_raises
|
|
|
|
a = []
|
|
assert a[:] == []
|
|
assert a[: 2 ** 100] == []
|
|
assert a[-2 ** 100 :] == []
|
|
assert a[:: 2 ** 100] == []
|
|
assert a[10:20] == []
|
|
assert a[-20:-10] == []
|
|
|
|
b = [1, 2]
|
|
|
|
assert b[:] == [1, 2]
|
|
assert b[slice(None)] == [1, 2]
|
|
assert b[: 2 ** 100] == [1, 2]
|
|
assert b[-2 ** 100 :] == [1, 2]
|
|
assert b[2 ** 100 :] == []
|
|
assert b[:: 2 ** 100] == [1]
|
|
assert b[-10:1] == [1]
|
|
assert b[0:0] == []
|
|
assert b[1:0] == []
|
|
|
|
assert_raises(ValueError, lambda: b[::0], _msg='zero step slice')
|
|
|
|
assert b[::-1] == [2, 1]
|
|
assert b[1::-1] == [2, 1]
|
|
assert b[0::-1] == [1]
|
|
assert b[0:-5:-1] == [1]
|
|
assert b[:0:-1] == [2]
|
|
assert b[5:0:-1] == [2]
|
|
|
|
c = list(range(10))
|
|
|
|
assert c[9:6:-3] == [9]
|
|
assert c[9::-3] == [9, 6, 3, 0]
|
|
assert c[9::-4] == [9, 5, 1]
|
|
assert c[8 :: -2 ** 100] == [8]
|
|
|
|
assert c[7:7:-2] == []
|
|
assert c[7:8:-2] == []
|
|
|
|
d = "123456"
|
|
|
|
assert d[3::-1] == "4321"
|
|
assert d[4::-3] == "52"
|
|
|
|
assert [1, 2, 3, 5, 6][-1:-5:-1] == [6, 5, 3, 2] # #746
|
|
|
|
slice_a = slice(5)
|
|
assert slice_a.start is None
|
|
assert slice_a.stop == 5
|
|
assert slice_a.step is None
|
|
|
|
slice_b = slice(1, 5)
|
|
assert slice_b.start == 1
|
|
assert slice_b.stop == 5
|
|
assert slice_b.step is None
|
|
|
|
slice_c = slice(1, 5, 2)
|
|
assert slice_c.start == 1
|
|
assert slice_c.stop == 5
|
|
assert slice_c.step == 2
|
|
|
|
a = object()
|
|
slice_d = slice(a, "v", 1.0)
|
|
assert slice_d.start is a
|
|
assert slice_d.stop == "v"
|
|
assert slice_d.step == 1.0
|
|
|
|
|
|
class SubScript(object):
|
|
def __getitem__(self, item):
|
|
assert type(item) == slice
|
|
|
|
def __setitem__(self, key, value):
|
|
assert type(key) == slice
|
|
|
|
|
|
ss = SubScript()
|
|
_ = ss[:]
|
|
ss[:1] = 1
|
|
|
|
|
|
class CustomIndex:
|
|
def __init__(self, x):
|
|
self.x = x
|
|
|
|
def __index__(self):
|
|
return self.x
|
|
|
|
|
|
assert c[CustomIndex(1):CustomIndex(3)] == [1, 2]
|
|
assert d[CustomIndex(1):CustomIndex(3)] == "23"
|
|
|
|
|
|
def test_all_slices():
|
|
"""
|
|
test all possible slices except big number
|
|
"""
|
|
|
|
mod = __import__('cpython_generated_slices')
|
|
|
|
ll = mod.LL
|
|
start = mod.START
|
|
end = mod.END
|
|
step = mod.STEP
|
|
slices_res = mod.SLICES_RES
|
|
|
|
count = 0
|
|
failures = []
|
|
for s in start:
|
|
for e in end:
|
|
for t in step:
|
|
lhs = ll[s:e:t]
|
|
try:
|
|
assert lhs == slices_res[count]
|
|
except AssertionError:
|
|
failures.append(
|
|
"start: {} ,stop: {}, step {}. Expected: {}, found: {}".format(
|
|
s, e, t, lhs, slices_res[count]
|
|
)
|
|
)
|
|
count += 1
|
|
|
|
if failures:
|
|
for f in failures:
|
|
print(f)
|
|
print(len(failures), "slices failed")
|
|
|
|
|
|
test_all_slices()
|