• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007 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_VALUES;
20 import static com.google.common.collect.testing.features.CollectionFeature.FAILS_FAST_ON_CONCURRENT_MODIFICATION;
21 import static com.google.common.collect.testing.features.CollectionFeature.RESTRICTS_ELEMENTS;
22 import static com.google.common.collect.testing.features.CollectionFeature.SUPPORTS_ADD;
23 import static com.google.common.collect.testing.features.CollectionSize.ZERO;
24 
25 import com.google.common.annotations.GwtCompatible;
26 import com.google.common.annotations.GwtIncompatible;
27 import com.google.common.collect.testing.AbstractCollectionTester;
28 import com.google.common.collect.testing.Helpers;
29 import com.google.common.collect.testing.features.CollectionFeature;
30 import com.google.common.collect.testing.features.CollectionSize;
31 import java.lang.reflect.Method;
32 import java.util.ConcurrentModificationException;
33 import java.util.Iterator;
34 import org.junit.Ignore;
35 
36 /**
37  * A generic JUnit test which tests {@code add} operations on a collection. Can't be invoked
38  * directly; please see {@link com.google.common.collect.testing.CollectionTestSuiteBuilder}.
39  *
40  * @author Chris Povirk
41  * @author Kevin Bourrillion
42  */
43 @SuppressWarnings("unchecked") // too many "unchecked generic array creations"
44 @GwtCompatible(emulated = true)
45 @Ignore // Affects only Android test runner, which respects JUnit 4 annotations on JUnit 3 tests.
46 public class CollectionAddTester<E> extends AbstractCollectionTester<E> {
47   @CollectionFeature.Require(SUPPORTS_ADD)
testAdd_supportedNotPresent()48   public void testAdd_supportedNotPresent() {
49     assertTrue("add(notPresent) should return true", collection.add(e3()));
50     expectAdded(e3());
51   }
52 
53   @CollectionFeature.Require(absent = SUPPORTS_ADD)
testAdd_unsupportedNotPresent()54   public void testAdd_unsupportedNotPresent() {
55     try {
56       collection.add(e3());
57       fail("add(notPresent) should throw");
58     } catch (UnsupportedOperationException expected) {
59     }
60     expectUnchanged();
61     expectMissing(e3());
62   }
63 
64   @CollectionFeature.Require(absent = SUPPORTS_ADD)
65   @CollectionSize.Require(absent = ZERO)
testAdd_unsupportedPresent()66   public void testAdd_unsupportedPresent() {
67     try {
68       assertFalse("add(present) should return false or throw", collection.add(e0()));
69     } catch (UnsupportedOperationException tolerated) {
70     }
71     expectUnchanged();
72   }
73 
74   @CollectionFeature.Require(
75       value = {SUPPORTS_ADD, ALLOWS_NULL_VALUES},
76       absent = RESTRICTS_ELEMENTS)
testAdd_nullSupported()77   public void testAdd_nullSupported() {
78     assertTrue("add(null) should return true", collection.add(null));
79     expectAdded((E) null);
80   }
81 
82   @CollectionFeature.Require(value = SUPPORTS_ADD, absent = ALLOWS_NULL_VALUES)
testAdd_nullUnsupported()83   public void testAdd_nullUnsupported() {
84     try {
85       collection.add(null);
86       fail("add(null) should throw");
87     } catch (NullPointerException expected) {
88     }
89     expectUnchanged();
90     expectNullMissingWhenNullUnsupported("Should not contain null after unsupported add(null)");
91   }
92 
93   @CollectionFeature.Require({SUPPORTS_ADD, FAILS_FAST_ON_CONCURRENT_MODIFICATION})
94   @CollectionSize.Require(absent = ZERO)
testAddConcurrentWithIteration()95   public void testAddConcurrentWithIteration() {
96     try {
97       Iterator<E> iterator = collection.iterator();
98       assertTrue(collection.add(e3()));
99       iterator.next();
100       fail("Expected ConcurrentModificationException");
101     } catch (ConcurrentModificationException expected) {
102       // success
103     }
104   }
105 
106   /**
107    * Returns the {@link Method} instance for {@link #testAdd_nullSupported()} so that tests of
108    * {@link java.util.Collections#checkedCollection(java.util.Collection, Class)} can suppress it
109    * with {@code FeatureSpecificTestSuiteBuilder.suppressing()} until <a
110    * href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6409434">Sun bug 6409434</a> is fixed.
111    * It's unclear whether nulls were to be permitted or forbidden, but presumably the eventual fix
112    * will be to permit them, as it seems more likely that code would depend on that behavior than on
113    * the other. Thus, we say the bug is in add(), which fails to support null.
114    */
115   @GwtIncompatible // reflection
getAddNullSupportedMethod()116   public static Method getAddNullSupportedMethod() {
117     return Helpers.getMethod(CollectionAddTester.class, "testAdd_nullSupported");
118   }
119 
120   /**
121    * Returns the {@link Method} instance for {@link #testAdd_nullSupported()} so that tests of
122    * {@link java.util.TreeSet} can suppress it with {@code
123    * FeatureSpecificTestSuiteBuilder.suppressing()} until <a
124    * href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5045147">Sun bug 5045147</a> is fixed.
125    */
126   @GwtIncompatible // reflection
getAddNullUnsupportedMethod()127   public static Method getAddNullUnsupportedMethod() {
128     return Helpers.getMethod(CollectionAddTester.class, "testAdd_nullUnsupported");
129   }
130 
131   /**
132    * Returns the {@link Method} instance for {@link #testAdd_unsupportedNotPresent()} so that tests
133    * can suppress it with {@code FeatureSpecificTestSuiteBuilder.suppressing()} while we figure out
134    * what to do with <a href="http://goo.gl/qJBruX">{@code ConcurrentHashMap} support for {@code
135    * entrySet().add()}</a>.
136    */
137   @GwtIncompatible // reflection
getAddUnsupportedNotPresentMethod()138   public static Method getAddUnsupportedNotPresentMethod() {
139     return Helpers.getMethod(CollectionAddTester.class, "testAdd_unsupportedNotPresent");
140   }
141 }
142