Author: bodewig
Date: Wed Feb 17 14:21:57 2010
New Revision: 910989

URL: http://svn.apache.org/viewvc?rev=910989&view=rev
Log:
VectorSet#remove doesn't work if the vector is at its capacity

Modified:
    ant/core/trunk/src/main/org/apache/tools/ant/util/VectorSet.java
    ant/core/trunk/src/tests/junit/org/apache/tools/ant/util/VectorSetTest.java

Modified: ant/core/trunk/src/main/org/apache/tools/ant/util/VectorSet.java
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/util/VectorSet.java?rev=910989&r1=910988&r2=910989&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/util/VectorSet.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/util/VectorSet.java Wed Feb 17 
14:21:57 2010
@@ -153,8 +153,10 @@
         // 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;
         }

Modified: 
ant/core/trunk/src/tests/junit/org/apache/tools/ant/util/VectorSetTest.java
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/tests/junit/org/apache/tools/ant/util/VectorSetTest.java?rev=910989&r1=910988&r2=910989&view=diff
==============================================================================
--- ant/core/trunk/src/tests/junit/org/apache/tools/ant/util/VectorSetTest.java 
(original)
+++ ant/core/trunk/src/tests/junit/org/apache/tools/ant/util/VectorSetTest.java 
Wed Feb 17 14:21:57 2010
@@ -109,6 +109,48 @@
         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})));


Reply via email to