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

Reply via email to