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})));