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