# HG changeset patch # User Jeff Allen # Date 1334235783 -3600 # Node ID 4dfbb2dc0eb1ef5f59893a1c583107f845094645 # Parent bb341fb29093db35b63918b5a88cf9a42451b051 Fix #1873 (slice deletion error with -ve step) and add tests that would have detected it. The new tests in Lib/test/test_list_jy.py should perhaps be moved eventually to CPython's list_tests.py as they are not specific to Jython. diff -r bb341fb29093 -r 4dfbb2dc0eb1 Lib/test/test_list_jy.py --- a/Lib/test/test_list_jy.py Tue Apr 10 19:36:00 2012 -0700 +++ b/Lib/test/test_list_jy.py Thu Apr 12 14:03:03 2012 +0100 @@ -104,9 +104,108 @@ self.assert_(lst[1] in (1,10)) self.run_threads(tester) +class ExtendedSliceTestCase(unittest.TestCase): + '''Really thrash extended slice operations on list.''' + type2test = list + + def test_extended_slice_delete(self): + # Based on list_tests.CommonTest.test_extendedslicing . + # In the cited test case, the stop value is nearly always the default + # (None), meaning the end of the list, and often the start value is too. + # This contributed to the release of http://bugs.jython.org/issue1873 . + # This is a supplementary test focused on correct stopping. + + initial = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13] + expected1 = self.type2test([ 0, 1, 2, 3, 4, 5, 10,11,12,13]) + expected2 = self.type2test([ 0, 1, 2, 4, 6, 8, 10, 12,13]) + expected4 = self.type2test([ 0, 1, 3, 4, 5, 7, 8, 9, 11,12,13]) + + # Positive step + a = self.type2test(initial) + del a[6:10:1] + self.assertEqual(a, expected1) + a = self.type2test(initial) + del a[3:13:2] + self.assertEqual(a, expected2) + a = self.type2test(initial) + del a[3:12:2] + self.assertEqual(a, expected2) + a = self.type2test(initial) + del a[2:11:4] + self.assertEqual(a, expected4) + a = self.type2test(initial) + del a[2::4] + self.assertEqual(a, expected4) + + # Negative step (same results) + a = self.type2test(initial) + del a[9:5:-1] + self.assertEqual(a, expected1) + a = self.type2test(initial) + del a[11:1:-2] + self.assertEqual(a, expected2) + a = self.type2test(initial) + del a[11:2:-2] + self.assertEqual(a, expected2) + a = self.type2test(initial) + del a[10:1:-4] + self.assertEqual(a, expected4) + a = self.type2test(initial) + del a[10::-4] + self.assertEqual(a, expected4) + + def test_extended_slice_assign(self): + # Based on list_tests.CommonTest.test_extendedslicing . + # In the cited test case, the stop value is nearly always the default. + # This is a supplementary test focused on correct stopping. + + aa, bb, cc = 91, 92, 93 + src = self.type2test([aa,bb,cc]) + initial = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13] + expected1 = self.type2test([ 0, 1, 2, 3, 4, 5,aa,bb,cc, 9,10,11,12,13]) + expected2 = self.type2test([ 0, 1, 2,aa, 4,bb, 6,cc, 8, 9,10,11,12,13]) + expected4 = self.type2test([ 0, 1,aa, 3, 4, 5,bb, 7, 8, 9,cc,11,12,13]) + + # Positive step + a = self.type2test(initial) + a[6:9:1] = src + self.assertEqual(a, expected1) + a = self.type2test(initial) + a[3:9:2] = src + self.assertEqual(a, expected2) + a = self.type2test(initial) + a[3:8:2] = src + self.assertEqual(a, expected2) + a = self.type2test(initial) + a[2:11:4] = src + self.assertEqual(a, expected4) + a = self.type2test(initial) + a[2::4] = src + self.assertEqual(a, expected4) + + # Negative step (same results, as src is reversed) + src.reverse() + a = self.type2test(initial) + a[8:5:-1] = src + self.assertEqual(a, expected1) + a = self.type2test(initial) + a[7:2:-2] = src + self.assertEqual(a, expected2) + a = self.type2test(initial) + a[7:1:-2] = src + self.assertEqual(a, expected2) + a = self.type2test(initial) + a[10:1:-4] = src + self.assertEqual(a, expected4) + a = self.type2test(initial) + a[10::-4] = src + self.assertEqual(a, expected4) + + def test_main(): - test_support.run_unittest(ListTestCase, ThreadSafetyTestCase) - + test_support.run_unittest(ListTestCase, + ThreadSafetyTestCase, + ExtendedSliceTestCase) if __name__ == "__main__": test_main() diff -r bb341fb29093 -r 4dfbb2dc0eb1 src/org/python/core/SequenceIndexDelegate.java --- a/src/org/python/core/SequenceIndexDelegate.java Tue Apr 10 19:36:00 2012 -0700 +++ b/src/org/python/core/SequenceIndexDelegate.java Thu Apr 12 14:03:03 2012 +0100 @@ -121,7 +121,7 @@ stop--; } } else if(step < 0) { - for(int i = start; i >= 0 && i >= stop; i += step) { + for(int i = start; i >= 0 && i > stop; i += step) { delItem(i); } }