1 /* 2 * Copyright (C) 2008 The Guava Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.google.common.collect.testing.testers; 18 19 import static com.google.common.collect.testing.features.CollectionFeature.ALLOWS_NULL_QUERIES; 20 import static com.google.common.collect.testing.features.CollectionFeature.ALLOWS_NULL_VALUES; 21 import static com.google.common.collect.testing.features.CollectionFeature.FAILS_FAST_ON_CONCURRENT_MODIFICATION; 22 import static com.google.common.collect.testing.features.CollectionFeature.SUPPORTS_REMOVE; 23 import static com.google.common.collect.testing.features.CollectionSize.SEVERAL; 24 import static com.google.common.collect.testing.features.CollectionSize.ZERO; 25 26 import com.google.common.annotations.GwtCompatible; 27 import com.google.common.collect.testing.AbstractCollectionTester; 28 import com.google.common.collect.testing.MinimalCollection; 29 import com.google.common.collect.testing.WrongType; 30 import com.google.common.collect.testing.features.CollectionFeature; 31 import com.google.common.collect.testing.features.CollectionSize; 32 import java.util.Collections; 33 import java.util.ConcurrentModificationException; 34 import java.util.Iterator; 35 import org.junit.Ignore; 36 37 /** 38 * A generic JUnit test which tests {@code removeAll} operations on a collection. Can't be invoked 39 * directly; please see {@link com.google.common.collect.testing.CollectionTestSuiteBuilder}. 40 * 41 * @author George van den Driessche 42 * @author Chris Povirk 43 */ 44 @SuppressWarnings("unchecked") // too many "unchecked generic array creations" 45 @GwtCompatible 46 @Ignore // Affects only Android test runner, which respects JUnit 4 annotations on JUnit 3 tests. 47 public class CollectionRemoveAllTester<E> extends AbstractCollectionTester<E> { 48 @CollectionFeature.Require(SUPPORTS_REMOVE) testRemoveAll_emptyCollection()49 public void testRemoveAll_emptyCollection() { 50 assertFalse( 51 "removeAll(emptyCollection) should return false", 52 collection.removeAll(MinimalCollection.of())); 53 expectUnchanged(); 54 } 55 56 @CollectionFeature.Require(SUPPORTS_REMOVE) testRemoveAll_nonePresent()57 public void testRemoveAll_nonePresent() { 58 assertFalse( 59 "removeAll(disjointCollection) should return false", 60 collection.removeAll(MinimalCollection.of(e3()))); 61 expectUnchanged(); 62 } 63 64 @CollectionFeature.Require(SUPPORTS_REMOVE) 65 @CollectionSize.Require(absent = ZERO) testRemoveAll_allPresent()66 public void testRemoveAll_allPresent() { 67 assertTrue( 68 "removeAll(intersectingCollection) should return true", 69 collection.removeAll(MinimalCollection.of(e0()))); 70 expectMissing(e0()); 71 } 72 73 @CollectionFeature.Require(SUPPORTS_REMOVE) 74 @CollectionSize.Require(absent = ZERO) testRemoveAll_somePresent()75 public void testRemoveAll_somePresent() { 76 assertTrue( 77 "removeAll(intersectingCollection) should return true", 78 collection.removeAll(MinimalCollection.of(e0(), e3()))); 79 expectMissing(e0()); 80 } 81 82 @CollectionFeature.Require({SUPPORTS_REMOVE, FAILS_FAST_ON_CONCURRENT_MODIFICATION}) 83 @CollectionSize.Require(SEVERAL) testRemoveAllSomePresentConcurrentWithIteration()84 public void testRemoveAllSomePresentConcurrentWithIteration() { 85 try { 86 Iterator<E> iterator = collection.iterator(); 87 assertTrue(collection.removeAll(MinimalCollection.of(e0(), e3()))); 88 iterator.next(); 89 fail("Expected ConcurrentModificationException"); 90 } catch (ConcurrentModificationException expected) { 91 // success 92 } 93 } 94 95 /** Trigger the {@code other.size() >= this.size()} case in {@link AbstractSet#removeAll()}. */ 96 @CollectionFeature.Require(SUPPORTS_REMOVE) 97 @CollectionSize.Require(absent = ZERO) testRemoveAll_somePresentLargeCollectionToRemove()98 public void testRemoveAll_somePresentLargeCollectionToRemove() { 99 assertTrue( 100 "removeAll(largeIntersectingCollection) should return true", 101 collection.removeAll(MinimalCollection.of(e0(), e0(), e0(), e3(), e3(), e3()))); 102 expectMissing(e0()); 103 } 104 105 @CollectionFeature.Require(absent = SUPPORTS_REMOVE) testRemoveAll_unsupportedEmptyCollection()106 public void testRemoveAll_unsupportedEmptyCollection() { 107 try { 108 assertFalse( 109 "removeAll(emptyCollection) should return false or throw " 110 + "UnsupportedOperationException", 111 collection.removeAll(MinimalCollection.of())); 112 } catch (UnsupportedOperationException tolerated) { 113 } 114 expectUnchanged(); 115 } 116 117 @CollectionFeature.Require(absent = SUPPORTS_REMOVE) testRemoveAll_unsupportedNonePresent()118 public void testRemoveAll_unsupportedNonePresent() { 119 try { 120 assertFalse( 121 "removeAll(disjointCollection) should return false or throw " 122 + "UnsupportedOperationException", 123 collection.removeAll(MinimalCollection.of(e3()))); 124 } catch (UnsupportedOperationException tolerated) { 125 } 126 expectUnchanged(); 127 } 128 129 @CollectionFeature.Require(absent = SUPPORTS_REMOVE) 130 @CollectionSize.Require(absent = ZERO) testRemoveAll_unsupportedPresent()131 public void testRemoveAll_unsupportedPresent() { 132 try { 133 collection.removeAll(MinimalCollection.of(e0())); 134 fail("removeAll(intersectingCollection) should throw UnsupportedOperationException"); 135 } catch (UnsupportedOperationException expected) { 136 } 137 expectUnchanged(); 138 assertTrue(collection.contains(e0())); 139 } 140 141 /* 142 * AbstractCollection fails the removeAll(null) test when the subject 143 * collection is empty, but we'd still like to test removeAll(null) when we 144 * can. We split the test into empty and non-empty cases. This allows us to 145 * suppress only the former. 146 */ 147 148 @CollectionFeature.Require(SUPPORTS_REMOVE) 149 @CollectionSize.Require(ZERO) testRemoveAll_nullCollectionReferenceEmptySubject()150 public void testRemoveAll_nullCollectionReferenceEmptySubject() { 151 try { 152 collection.removeAll(null); 153 // Returning successfully is not ideal, but tolerated. 154 } catch (NullPointerException tolerated) { 155 } 156 } 157 158 @CollectionFeature.Require(SUPPORTS_REMOVE) 159 @CollectionSize.Require(absent = ZERO) testRemoveAll_nullCollectionReferenceNonEmptySubject()160 public void testRemoveAll_nullCollectionReferenceNonEmptySubject() { 161 try { 162 collection.removeAll(null); 163 fail("removeAll(null) should throw NullPointerException"); 164 } catch (NullPointerException expected) { 165 } 166 } 167 168 @CollectionFeature.Require(value = SUPPORTS_REMOVE, absent = ALLOWS_NULL_QUERIES) testRemoveAll_containsNullNo()169 public void testRemoveAll_containsNullNo() { 170 MinimalCollection<?> containsNull = MinimalCollection.of((Object) null); 171 try { 172 assertFalse( 173 "removeAll(containsNull) should return false or throw", 174 collection.removeAll(containsNull)); 175 } catch (NullPointerException tolerated) { 176 } 177 expectUnchanged(); 178 } 179 180 @CollectionFeature.Require({SUPPORTS_REMOVE, ALLOWS_NULL_QUERIES}) testRemoveAll_containsNullNoButAllowed()181 public void testRemoveAll_containsNullNoButAllowed() { 182 MinimalCollection<?> containsNull = MinimalCollection.of((Object) null); 183 assertFalse("removeAll(containsNull) should return false", collection.removeAll(containsNull)); 184 expectUnchanged(); 185 } 186 187 @CollectionFeature.Require({SUPPORTS_REMOVE, ALLOWS_NULL_VALUES}) 188 @CollectionSize.Require(absent = ZERO) testRemoveAll_containsNullYes()189 public void testRemoveAll_containsNullYes() { 190 initCollectionWithNullElement(); 191 assertTrue( 192 "removeAll(containsNull) should return true", 193 collection.removeAll(Collections.singleton(null))); 194 // TODO: make this work with MinimalCollection 195 } 196 197 @CollectionFeature.Require(SUPPORTS_REMOVE) testRemoveAll_containsWrongType()198 public void testRemoveAll_containsWrongType() { 199 try { 200 assertFalse( 201 "removeAll(containsWrongType) should return false or throw", 202 collection.removeAll(MinimalCollection.of(WrongType.VALUE))); 203 } catch (ClassCastException tolerated) { 204 } 205 expectUnchanged(); 206 } 207 } 208