Java
328 строк · 10.6 Кб
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
17package com.google.common.collect.testing.testers;
18
19import static com.google.common.collect.testing.features.CollectionFeature.ALLOWS_NULL_VALUES;
20import static com.google.common.collect.testing.features.CollectionFeature.SUPPORTS_REMOVE;
21import static com.google.common.collect.testing.features.CollectionSize.ONE;
22import static com.google.common.collect.testing.features.CollectionSize.ZERO;
23
24import com.google.common.annotations.GwtCompatible;
25import com.google.common.collect.testing.AbstractCollectionTester;
26import com.google.common.collect.testing.MinimalCollection;
27import com.google.common.collect.testing.features.CollectionFeature;
28import com.google.common.collect.testing.features.CollectionSize;
29import java.util.Arrays;
30import java.util.Collection;
31import java.util.Collections;
32import java.util.List;
33import org.junit.Ignore;
34
35/**
36* A generic JUnit test which tests {@code retainAll} operations on a collection. Can't be invoked
37* directly; please see {@link com.google.common.collect.testing.CollectionTestSuiteBuilder}.
38*
39* @author Chris Povirk
40*/
41@GwtCompatible
42@Ignore // Affects only Android test runner, which respects JUnit 4 annotations on JUnit 3 tests.
43@SuppressWarnings("JUnit4ClassUsedInJUnit3")
44public class CollectionRetainAllTester<E> extends AbstractCollectionTester<E> {
45
46/** A collection of elements to retain, along with a description for use in failure messages. */
47private class Target {
48private final Collection<E> toRetain;
49private final String description;
50
51private Target(Collection<E> toRetain, String description) {
52this.toRetain = toRetain;
53this.description = description;
54}
55
56@Override
57public String toString() {
58return description;
59}
60}
61
62private Target empty;
63private Target disjoint;
64private Target superset;
65private Target nonEmptyProperSubset;
66private Target sameElements;
67private Target partialOverlap;
68private Target containsDuplicates;
69private Target nullSingleton;
70
71@Override
72public void setUp() throws Exception {
73super.setUp();
74
75empty = new Target(emptyCollection(), "empty");
76/*
77* We test that nullSingleton.retainAll(disjointList) does NOT throw a
78* NullPointerException when disjointList does not, so we can't use
79* MinimalCollection, which throws NullPointerException on calls to
80* contains(null).
81*/
82List<E> disjointList = Arrays.asList(e3(), e4());
83disjoint = new Target(disjointList, "disjoint");
84superset = new Target(MinimalCollection.of(e0(), e1(), e2(), e3(), e4()), "superset");
85nonEmptyProperSubset = new Target(MinimalCollection.of(e1()), "subset");
86sameElements = new Target(Arrays.asList(createSamplesArray()), "sameElements");
87containsDuplicates =
88new Target(MinimalCollection.of(e0(), e0(), e3(), e3()), "containsDuplicates");
89partialOverlap = new Target(MinimalCollection.of(e2(), e3()), "partialOverlap");
90nullSingleton = new Target(Collections.<E>singleton(null), "nullSingleton");
91}
92
93// retainAll(empty)
94
95@CollectionFeature.Require(SUPPORTS_REMOVE)
96@CollectionSize.Require(ZERO)
97public void testRetainAll_emptyPreviouslyEmpty() {
98expectReturnsFalse(empty);
99expectUnchanged();
100}
101
102@CollectionFeature.Require(absent = SUPPORTS_REMOVE)
103@CollectionSize.Require(ZERO)
104public void testRetainAll_emptyPreviouslyEmptyUnsupported() {
105expectReturnsFalseOrThrows(empty);
106expectUnchanged();
107}
108
109@CollectionFeature.Require(SUPPORTS_REMOVE)
110@CollectionSize.Require(absent = ZERO)
111public void testRetainAll_emptyPreviouslyNonEmpty() {
112expectReturnsTrue(empty);
113expectContents();
114expectMissing(e0(), e1(), e2());
115}
116
117@CollectionFeature.Require(absent = SUPPORTS_REMOVE)
118@CollectionSize.Require(absent = ZERO)
119public void testRetainAll_emptyPreviouslyNonEmptyUnsupported() {
120expectThrows(empty);
121expectUnchanged();
122}
123
124// retainAll(disjoint)
125
126@CollectionFeature.Require(SUPPORTS_REMOVE)
127@CollectionSize.Require(ZERO)
128public void testRetainAll_disjointPreviouslyEmpty() {
129expectReturnsFalse(disjoint);
130expectUnchanged();
131}
132
133@CollectionFeature.Require(absent = SUPPORTS_REMOVE)
134@CollectionSize.Require(ZERO)
135public void testRetainAll_disjointPreviouslyEmptyUnsupported() {
136expectReturnsFalseOrThrows(disjoint);
137expectUnchanged();
138}
139
140@CollectionFeature.Require(SUPPORTS_REMOVE)
141@CollectionSize.Require(absent = ZERO)
142public void testRetainAll_disjointPreviouslyNonEmpty() {
143expectReturnsTrue(disjoint);
144expectContents();
145expectMissing(e0(), e1(), e2());
146}
147
148@CollectionFeature.Require(absent = SUPPORTS_REMOVE)
149@CollectionSize.Require(absent = ZERO)
150public void testRetainAll_disjointPreviouslyNonEmptyUnsupported() {
151expectThrows(disjoint);
152expectUnchanged();
153}
154
155// retainAll(superset)
156
157@CollectionFeature.Require(SUPPORTS_REMOVE)
158public void testRetainAll_superset() {
159expectReturnsFalse(superset);
160expectUnchanged();
161}
162
163@CollectionFeature.Require(absent = SUPPORTS_REMOVE)
164public void testRetainAll_supersetUnsupported() {
165expectReturnsFalseOrThrows(superset);
166expectUnchanged();
167}
168
169// retainAll(subset)
170
171@CollectionFeature.Require(SUPPORTS_REMOVE)
172@CollectionSize.Require(absent = {ZERO, ONE})
173public void testRetainAll_subset() {
174expectReturnsTrue(nonEmptyProperSubset);
175expectContents(nonEmptyProperSubset.toRetain);
176}
177
178@CollectionFeature.Require(absent = SUPPORTS_REMOVE)
179@CollectionSize.Require(absent = {ZERO, ONE})
180public void testRetainAll_subsetUnsupported() {
181expectThrows(nonEmptyProperSubset);
182expectUnchanged();
183}
184
185// retainAll(sameElements)
186
187@CollectionFeature.Require(SUPPORTS_REMOVE)
188public void testRetainAll_sameElements() {
189expectReturnsFalse(sameElements);
190expectUnchanged();
191}
192
193@CollectionFeature.Require(absent = SUPPORTS_REMOVE)
194public void testRetainAll_sameElementsUnsupported() {
195expectReturnsFalseOrThrows(sameElements);
196expectUnchanged();
197}
198
199// retainAll(partialOverlap)
200
201@CollectionFeature.Require(SUPPORTS_REMOVE)
202@CollectionSize.Require(absent = {ZERO, ONE})
203public void testRetainAll_partialOverlap() {
204expectReturnsTrue(partialOverlap);
205expectContents(e2());
206}
207
208@CollectionFeature.Require(absent = SUPPORTS_REMOVE)
209@CollectionSize.Require(absent = {ZERO, ONE})
210public void testRetainAll_partialOverlapUnsupported() {
211expectThrows(partialOverlap);
212expectUnchanged();
213}
214
215// retainAll(containsDuplicates)
216
217@CollectionFeature.Require(SUPPORTS_REMOVE)
218@CollectionSize.Require(ONE)
219public void testRetainAll_containsDuplicatesSizeOne() {
220expectReturnsFalse(containsDuplicates);
221expectContents(e0());
222}
223
224@CollectionFeature.Require(SUPPORTS_REMOVE)
225@CollectionSize.Require(absent = {ZERO, ONE})
226public void testRetainAll_containsDuplicatesSizeSeveral() {
227expectReturnsTrue(containsDuplicates);
228expectContents(e0());
229}
230
231// retainAll(nullSingleton)
232
233@CollectionFeature.Require(SUPPORTS_REMOVE)
234@CollectionSize.Require(ZERO)
235public void testRetainAll_nullSingletonPreviouslyEmpty() {
236expectReturnsFalse(nullSingleton);
237expectUnchanged();
238}
239
240@CollectionFeature.Require(SUPPORTS_REMOVE)
241@CollectionSize.Require(absent = ZERO)
242public void testRetainAll_nullSingletonPreviouslyNonEmpty() {
243expectReturnsTrue(nullSingleton);
244expectContents();
245}
246
247@CollectionFeature.Require({SUPPORTS_REMOVE, ALLOWS_NULL_VALUES})
248@CollectionSize.Require(ONE)
249public void testRetainAll_nullSingletonPreviouslySingletonWithNull() {
250initCollectionWithNullElement();
251expectReturnsFalse(nullSingleton);
252expectContents(createArrayWithNullElement());
253}
254
255@CollectionFeature.Require({SUPPORTS_REMOVE, ALLOWS_NULL_VALUES})
256@CollectionSize.Require(absent = {ZERO, ONE})
257public void testRetainAll_nullSingletonPreviouslySeveralWithNull() {
258initCollectionWithNullElement();
259expectReturnsTrue(nullSingleton);
260expectContents(nullSingleton.toRetain);
261}
262
263// nullSingleton.retainAll()
264
265@CollectionFeature.Require({SUPPORTS_REMOVE, ALLOWS_NULL_VALUES})
266@CollectionSize.Require(absent = ZERO)
267public void testRetainAll_containsNonNullWithNull() {
268initCollectionWithNullElement();
269expectReturnsTrue(disjoint);
270expectContents();
271}
272
273// retainAll(null)
274
275/*
276* AbstractCollection fails the retainAll(null) test when the subject
277* collection is empty, but we'd still like to test retainAll(null) when we
278* can. We split the test into empty and non-empty cases. This allows us to
279* suppress only the former.
280*/
281
282@CollectionFeature.Require(SUPPORTS_REMOVE)
283@CollectionSize.Require(ZERO)
284public void testRetainAll_nullCollectionReferenceEmptySubject() {
285try {
286collection.retainAll(null);
287// Returning successfully is not ideal, but tolerated.
288} catch (NullPointerException tolerated) {
289}
290}
291
292@CollectionFeature.Require(SUPPORTS_REMOVE)
293@CollectionSize.Require(absent = ZERO)
294public void testRetainAll_nullCollectionReferenceNonEmptySubject() {
295try {
296collection.retainAll(null);
297fail("retainAll(null) should throw NullPointerException");
298} catch (NullPointerException expected) {
299}
300}
301
302private void expectReturnsTrue(Target target) {
303String message = Platform.format("retainAll(%s) should return true", target);
304assertTrue(message, collection.retainAll(target.toRetain));
305}
306
307private void expectReturnsFalse(Target target) {
308String message = Platform.format("retainAll(%s) should return false", target);
309assertFalse(message, collection.retainAll(target.toRetain));
310}
311
312private void expectThrows(Target target) {
313try {
314collection.retainAll(target.toRetain);
315String message = Platform.format("retainAll(%s) should throw", target);
316fail(message);
317} catch (UnsupportedOperationException expected) {
318}
319}
320
321private void expectReturnsFalseOrThrows(Target target) {
322String message = Platform.format("retainAll(%s) should return false or throw", target);
323try {
324assertFalse(message, collection.retainAll(target.toRetain));
325} catch (UnsupportedOperationException tolerated) {
326}
327}
328}
329