From ff2109ae1bcfd9aedffc9afc559ee4df99bca13f Mon Sep 17 00:00:00 2001 From: Shubham Padkonde Date: Tue, 29 Sep 2026 21:42:39 +0530 Subject: [PATCH] Fix slicing converted Java lists --- src/scyjava/_convert.py | 2 ++ tests/test_convert.py | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/scyjava/_convert.py b/src/scyjava/_convert.py index 2ba7d02..98a204c 100644 --- a/src/scyjava/_convert.py +++ b/src/scyjava/_convert.py @@ -435,6 +435,8 @@ def __init__(self, jobj): JavaObject.__init__(self, jobj, _jc.List) def __getitem__(self, key): + if isinstance(key, slice): + return [self[index] for index in range(*key.indices(len(self)))] # NB: Even if an element cannot be converted, # we still want Pythonic access to elements. return to_python(self.jobj.get(key), gentle=True) diff --git a/tests/test_convert.py b/tests/test_convert.py index 128975d..16eef7e 100644 --- a/tests/test_convert.py +++ b/tests/test_convert.py @@ -29,6 +29,42 @@ class TestConvert: + @pytest.mark.parametrize( + "selection", + [ + slice(None), + slice(1, 4), + slice(-4, -1), + slice(None, None, 2), + slice(None, None, -1), + slice(4, 0, -2), + slice(-100, 100), + slice(3, 1), + ], + ) + def testListSlice(self, selection): + original = ["a", "b", "c", "d", "e"] + converted = to_python(to_java(original)) + result = converted[selection] + assert result == original[selection] + assert all(isinstance(value, str) for value in result) + assert converted == original + + def testListSliceZeroStep(self): + converted = to_python(to_java([1, 2, 3])) + with pytest.raises(ValueError, match="slice step cannot be zero"): + converted[::0] + + def testEmptyListSlice(self): + converted = to_python(to_java([])) + assert converted[:] == [] + assert converted[::-1] == [] + + def testListSliceUnconvertedElement(self): + element = jimport("java.lang.Object")() + converted = to_python(to_java([element])) + assert converted[:] == [element] + def testClass(self): """ Test class detection from Java objects.