This is an automated email from the ASF dual-hosted git repository.
garydgregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-collections.git
The following commit(s) were added to refs/heads/master by this push:
new 9afdac688 Reset last element in EnumerationIterator.remove (#729)
9afdac688 is described below
commit 9afdac6881976f546cea31e46c4fcfb4ea728618
Author: Naveed Khan <[email protected]>
AuthorDate: Sat Aug 29 21:45:18 2026 +0000
Reset last element in EnumerationIterator.remove (#729)
remove() removed by value but never cleared last, so a repeat call without
next() deleted a second equal element instead of throwing IllegalStateException.
---
.../iterators/EnumerationIterator.java | 1 +
.../iterators/EnumerationIteratorTest.java | 63 ++++++++++++++++++++++
2 files changed, 64 insertions(+)
diff --git
a/src/main/java/org/apache/commons/collections4/iterators/EnumerationIterator.java
b/src/main/java/org/apache/commons/collections4/iterators/EnumerationIterator.java
index f4512b24f..1d97b30ef 100644
---
a/src/main/java/org/apache/commons/collections4/iterators/EnumerationIterator.java
+++
b/src/main/java/org/apache/commons/collections4/iterators/EnumerationIterator.java
@@ -120,6 +120,7 @@ public class EnumerationIterator<E> implements Iterator<E> {
throw new IllegalStateException("next() must have been called for
remove() to function");
}
collection.remove(last);
+ last = null;
}
/**
diff --git
a/src/test/java/org/apache/commons/collections4/iterators/EnumerationIteratorTest.java
b/src/test/java/org/apache/commons/collections4/iterators/EnumerationIteratorTest.java
new file mode 100644
index 000000000..1c6edcfac
--- /dev/null
+++
b/src/test/java/org/apache/commons/collections4/iterators/EnumerationIteratorTest.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.collections4.iterators;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Vector;
+
+import org.junit.jupiter.api.Test;
+
+/**
+ * Tests the EnumerationIterator.
+ */
+public class EnumerationIteratorTest {
+
+ @Test
+ void testRemoveBeforeNext() {
+ final List<String> list = new ArrayList<>(Arrays.asList("a", "b"));
+ final Vector<String> vector = new Vector<>(list);
+ final EnumerationIterator<String> it = new
EnumerationIterator<>(vector.elements(), list);
+ assertThrows(IllegalStateException.class, it::remove);
+ }
+
+ @Test
+ void testRemoveTwiceThrows() {
+ final List<String> list = new ArrayList<>(Arrays.asList("a", "a",
"b"));
+ final Vector<String> vector = new Vector<>(list);
+ final EnumerationIterator<String> it = new
EnumerationIterator<>(vector.elements(), list);
+ it.next();
+ it.remove();
+ assertEquals(Arrays.asList("a", "b"), list);
+ // remove() may only run once per next(); a repeat must not delete a
second element
+ assertThrows(IllegalStateException.class, it::remove);
+ assertEquals(Arrays.asList("a", "b"), list);
+ }
+
+ @Test
+ void testRemoveWithoutCollection() {
+ final Vector<String> vector = new Vector<>(Arrays.asList("a"));
+ final EnumerationIterator<String> it = new
EnumerationIterator<>(vector.elements());
+ it.next();
+ assertThrows(UnsupportedOperationException.class, it::remove);
+ }
+
+}