From 0f8c5ae4bf553df1dac3a386d8f8d65e3ac61085 Mon Sep 17 00:00:00 2001 From: Stefan Bodewig Date: Wed, 17 Feb 2010 14:21:57 +0000 Subject: [PATCH] VectorSet#remove doesn't work if the vector is at its capacity git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@910989 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/tools/ant/util/VectorSet.java | 6 ++- .../apache/tools/ant/util/VectorSetTest.java | 42 +++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/main/org/apache/tools/ant/util/VectorSet.java b/src/main/org/apache/tools/ant/util/VectorSet.java index ca0573a8b..235027263 100644 --- a/src/main/org/apache/tools/ant/util/VectorSet.java +++ b/src/main/org/apache/tools/ant/util/VectorSet.java @@ -153,8 +153,10 @@ public final class VectorSet extends Vector { // shouldn't trust it if (set.remove(o)) { int index = indexOf(o); - System.arraycopy(elementData, index + 1, elementData, index, - size() - index); + if (index < elementData.length - 1) { + System.arraycopy(elementData, index + 1, elementData, index, + elementData.length - index - 1); + } elementCount--; return true; } diff --git a/src/tests/junit/org/apache/tools/ant/util/VectorSetTest.java b/src/tests/junit/org/apache/tools/ant/util/VectorSetTest.java index 5aac05000..5d038a246 100644 --- a/src/tests/junit/org/apache/tools/ant/util/VectorSetTest.java +++ b/src/tests/junit/org/apache/tools/ant/util/VectorSetTest.java @@ -109,6 +109,48 @@ public class VectorSetTest extends TestCase { assertFalse(v.remove(O)); } + public void testRemoveAtEndWhenSizeEqualsCapacity() { + v = new VectorSet(3, 1); + Object a = new Object(); + v.add(a); + v.add(new Object()); + v.add(O); + assertEquals(3, v.size()); + assertEquals(3, v.capacity()); + assertTrue(v.remove(O)); + assertEquals(2, v.size()); + assertFalse(v.remove(O)); + assertSame(a, v.elementAt(0)); + } + + public void testRemoveAtFrontWhenSizeEqualsCapacity() { + v = new VectorSet(3, 1); + v.add(O); + Object a = new Object(); + v.add(a); + v.add(new Object()); + assertEquals(3, v.size()); + assertEquals(3, v.capacity()); + assertTrue(v.remove(O)); + assertEquals(2, v.size()); + assertFalse(v.remove(O)); + assertSame(a, v.elementAt(0)); + } + + public void testRemoveInMiddleWhenSizeEqualsCapacity() { + v = new VectorSet(3, 1); + Object a = new Object(); + v.add(a); + v.add(O); + v.add(new Object()); + assertEquals(3, v.size()); + assertEquals(3, v.capacity()); + assertTrue(v.remove(O)); + assertEquals(2, v.size()); + assertFalse(v.remove(O)); + assertSame(a, v.elementAt(0)); + } + public void testRemoveAll() { v.add(O); assertTrue(v.removeAll(Arrays.asList(new Object[] {O, O})));