Skip to content
Permalink
Browse files
[COLLECTIONS-799]: Prevent modifications by pollFirst and pollLast
  • Loading branch information
scordio authored and kinow committed Oct 9, 2021
1 parent dfafc5d commit cbc5db55408dae5d8744307a5eb379df36d55427
Showing 3 changed files with 37 additions and 42 deletions.
@@ -455,6 +455,9 @@
<contributor>
<name>Chen Guoping</name>
</contributor>
<contributor>
<name>Stefano Cordio</name>
</contributor>
</contributors>

<dependencies>
@@ -107,6 +107,22 @@ public boolean removeAll(final Collection<?> coll) {
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();
@@ -27,6 +27,8 @@

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 static Test suite() {
//-------------------------------------------------------------------
@Override
public NavigableSet<E> makeObject() {
return UnmodifiableNavigableSet.unmodifiableNavigableSet(new TreeSet<E>());
return UnmodifiableNavigableSet.unmodifiableNavigableSet(new TreeSet<>());
}

@Override
@@ -95,60 +97,34 @@ public void testUnmodifiable() {
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));
}

/**
* Verifies that a set is not modifiable
*/
@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);
}


0 comments on commit cbc5db5

Please sign in to comment.