This is an automated email from the ASF dual-hosted git repository. kinow pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-collections.git
commit cbc5db55408dae5d8744307a5eb379df36d55427 Author: Stefano Cordio <stefano.cor...@gmail.com> AuthorDate: Tue Sep 7 23:21:41 2021 +0200 [COLLECTIONS-799]: Prevent modifications by pollFirst and pollLast --- pom.xml | 3 ++ .../collections4/set/UnmodifiableNavigableSet.java | 16 ++++++ .../set/UnmodifiableNavigableSetTest.java | 60 +++++++--------------- 3 files changed, 37 insertions(+), 42 deletions(-) diff --git a/pom.xml b/pom.xml index 02272cd..ad4348e 100644 --- a/pom.xml +++ b/pom.xml @@ -455,6 +455,9 @@ <contributor> <name>Chen Guoping</name> </contributor> + <contributor> + <name>Stefano Cordio</name> + </contributor> </contributors> <dependencies> diff --git a/src/main/java/org/apache/commons/collections4/set/UnmodifiableNavigableSet.java b/src/main/java/org/apache/commons/collections4/set/UnmodifiableNavigableSet.java index 48bfe39..fcdc5b6 100644 --- a/src/main/java/org/apache/commons/collections4/set/UnmodifiableNavigableSet.java +++ b/src/main/java/org/apache/commons/collections4/set/UnmodifiableNavigableSet.java @@ -107,6 +107,22 @@ public final class UnmodifiableNavigableSet<E> throw new UnsupportedOperationException(); } + /** + * @since 4.5 + */ + @Override + public E pollFirst() { + throw new UnsupportedOperationException(); + } + + /** + * @since 4.5 + */ + @Override + public E pollLast() { + throw new UnsupportedOperationException(); + } + @Override public boolean retainAll(final Collection<?> coll) { throw new UnsupportedOperationException(); diff --git a/src/test/java/org/apache/commons/collections4/set/UnmodifiableNavigableSetTest.java b/src/test/java/org/apache/commons/collections4/set/UnmodifiableNavigableSetTest.java index d335994..51e3792 100644 --- a/src/test/java/org/apache/commons/collections4/set/UnmodifiableNavigableSetTest.java +++ b/src/test/java/org/apache/commons/collections4/set/UnmodifiableNavigableSetTest.java @@ -27,6 +27,8 @@ import junit.framework.Test; import org.apache.commons.collections4.BulkTest; +import static org.junit.jupiter.api.Assertions.assertThrows; + /** * Extension of {@link AbstractNavigableSetTest} for exercising the * {@link UnmodifiableNavigableSet} implementation. @@ -48,7 +50,7 @@ public class UnmodifiableNavigableSetTest<E> extends AbstractNavigableSetTest<E> //------------------------------------------------------------------- @Override public NavigableSet<E> makeObject() { - return UnmodifiableNavigableSet.unmodifiableNavigableSet(new TreeSet<E>()); + return UnmodifiableNavigableSet.unmodifiableNavigableSet(new TreeSet<>()); } @Override @@ -95,11 +97,7 @@ public class UnmodifiableNavigableSetTest<E> extends AbstractNavigableSetTest<E> public void testDecorateFactory() { final NavigableSet<E> set = makeFullCollection(); assertSame(set, UnmodifiableNavigableSet.unmodifiableNavigableSet(set)); - - try { - UnmodifiableNavigableSet.unmodifiableNavigableSet(null); - fail(); - } catch (final NullPointerException ex) {} + assertThrows(NullPointerException.class, () -> UnmodifiableNavigableSet.unmodifiableNavigableSet(null)); } /** @@ -107,48 +105,26 @@ public class UnmodifiableNavigableSetTest<E> extends AbstractNavigableSetTest<E> */ @SuppressWarnings("unchecked") public void verifyUnmodifiable(final Set<E> set) { - try { - set.add((E) "value"); - fail("Expecting UnsupportedOperationException."); - } catch (final UnsupportedOperationException e) { - // expected - } - try { - set.addAll(new TreeSet<E>()); - fail("Expecting UnsupportedOperationException."); - } catch (final UnsupportedOperationException e) { - // expected - } - try { - set.clear(); - fail("Expecting UnsupportedOperationException."); - } catch (final UnsupportedOperationException e) { - // expected - } - try { - set.remove("x"); - fail("Expecting UnsupportedOperationException."); - } catch (final UnsupportedOperationException e) { - // expected - } - try { - set.removeAll(array); - fail("Expecting UnsupportedOperationException."); - } catch (final UnsupportedOperationException e) { - // expected - } - try { - set.retainAll(array); - fail("Expecting UnsupportedOperationException."); - } catch (final UnsupportedOperationException e) { - // expected + assertThrows(UnsupportedOperationException.class, () -> set.add((E) "value")); + assertThrows(UnsupportedOperationException.class, () -> set.addAll(new TreeSet<>())); + assertThrows(UnsupportedOperationException.class, () -> set.clear()); + assertThrows(UnsupportedOperationException.class, () -> set.iterator().remove()); + assertThrows(UnsupportedOperationException.class, () -> set.remove("x")); + assertThrows(UnsupportedOperationException.class, () -> set.removeAll(array)); + assertThrows(UnsupportedOperationException.class, () -> set.removeIf(element -> true)); + assertThrows(UnsupportedOperationException.class, () -> set.retainAll(array)); + + if (set instanceof NavigableSet) { + final NavigableSet<E> navigableSet = (NavigableSet<E>) set; + assertThrows(UnsupportedOperationException.class, () -> navigableSet.pollFirst()); + assertThrows(UnsupportedOperationException.class, () -> navigableSet.pollLast()); } } public void testComparator() { setupSet(); final Comparator<? super E> c = set.comparator(); - assertTrue("natural order, so comparator should be null", c == null); + assertNull("natural order, so comparator should be null", c); }