• 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.CollectionSize.ZERO;
20 import static com.google.common.collect.testing.features.MapFeature.ALLOWS_NULL_KEYS;
21 import static com.google.common.collect.testing.features.MapFeature.ALLOWS_NULL_VALUES;
22 import static com.google.common.collect.testing.features.MapFeature.SUPPORTS_PUT_ALL;
23 import static java.util.Collections.singletonList;
24 
25 import com.google.common.collect.testing.AbstractMapTester;
26 import com.google.common.collect.testing.MinimalCollection;
27 import com.google.common.collect.testing.features.CollectionSize;
28 import com.google.common.collect.testing.features.MapFeature;
29 
30 import java.util.Collections;
31 import java.util.LinkedHashMap;
32 import java.util.List;
33 import java.util.Map;
34 import java.util.Map.Entry;
35 
36 /**
37  * A generic JUnit test which tests {@code putAll} operations on a map. Can't be
38  * invoked directly; please see
39  * {@link com.google.common.collect.testing.MapTestSuiteBuilder}.
40  *
41  * <p>This class is GWT compatible.
42  *
43  * @author Chris Povirk
44  * @author Kevin Bourrillion
45  */
46 @SuppressWarnings("unchecked") // too many "unchecked generic array creations"
47 public class MapPutAllTester<K, V> extends AbstractMapTester<K, V> {
48   private List<Entry<K, V>> containsNullKey;
49   private List<Entry<K, V>> containsNullValue;
50 
setUp()51   @Override public void setUp() throws Exception {
52     super.setUp();
53     containsNullKey = singletonList(entry(null, samples.e3.getValue()));
54     containsNullValue = singletonList(entry(samples.e3.getKey(), null));
55   }
56 
57   @MapFeature.Require(SUPPORTS_PUT_ALL)
testPutAll_supportedNothing()58   public void testPutAll_supportedNothing() {
59     getMap().putAll(emptyMap());
60     expectUnchanged();
61   }
62 
63   @MapFeature.Require(absent = SUPPORTS_PUT_ALL)
testPutAll_unsupportedNothing()64   public void testPutAll_unsupportedNothing() {
65     try {
66       getMap().putAll(emptyMap());
67     } catch (UnsupportedOperationException tolerated) {
68     }
69     expectUnchanged();
70   }
71 
72   @MapFeature.Require(SUPPORTS_PUT_ALL)
testPutAll_supportedNonePresent()73   public void testPutAll_supportedNonePresent() {
74     putAll(createDisjointCollection());
75     expectAdded(samples.e3, samples.e4);
76   }
77 
78   @MapFeature.Require(absent = SUPPORTS_PUT_ALL)
testPutAll_unsupportedNonePresent()79   public void testPutAll_unsupportedNonePresent() {
80     try {
81       putAll(createDisjointCollection());
82       fail("putAll(nonePresent) should throw");
83     } catch (UnsupportedOperationException expected) {
84     }
85     expectUnchanged();
86     expectMissing(samples.e3, samples.e4);
87   }
88 
89   @MapFeature.Require(SUPPORTS_PUT_ALL)
90   @CollectionSize.Require(absent = ZERO)
testPutAll_supportedSomePresent()91   public void testPutAll_supportedSomePresent() {
92     putAll(MinimalCollection.of(samples.e3, samples.e0));
93     expectAdded(samples.e3);
94   }
95 
96   @MapFeature.Require(absent = SUPPORTS_PUT_ALL)
97   @CollectionSize.Require(absent = ZERO)
testPutAll_unsupportedSomePresent()98   public void testPutAll_unsupportedSomePresent() {
99     try {
100       putAll(MinimalCollection.of(samples.e3, samples.e0));
101       fail("putAll(somePresent) should throw");
102     } catch (UnsupportedOperationException expected) {
103     }
104     expectUnchanged();
105   }
106 
107   @MapFeature.Require(absent = SUPPORTS_PUT_ALL)
108   @CollectionSize.Require(absent = ZERO)
testPutAll_unsupportedAllPresent()109   public void testPutAll_unsupportedAllPresent() {
110     try {
111       putAll(MinimalCollection.of(samples.e0));
112     } catch (UnsupportedOperationException tolerated) {
113     }
114     expectUnchanged();
115   }
116 
117   @MapFeature.Require({SUPPORTS_PUT_ALL,
118       ALLOWS_NULL_KEYS})
testPutAll_nullKeySupported()119   public void testPutAll_nullKeySupported() {
120     putAll(containsNullKey);
121     expectAdded(containsNullKey.get(0));
122   }
123 
124   @MapFeature.Require(value = SUPPORTS_PUT_ALL,
125       absent = ALLOWS_NULL_KEYS)
testAdd_nullKeyUnsupported()126   public void testAdd_nullKeyUnsupported() {
127     try {
128       putAll(containsNullKey);
129       fail("putAll(containsNullKey) should throw");
130     } catch (NullPointerException expected) {
131     }
132     expectUnchanged();
133     expectNullKeyMissingWhenNullKeysUnsupported(
134         "Should not contain null key after unsupported " +
135         "putAll(containsNullKey)");
136   }
137 
138   @MapFeature.Require({SUPPORTS_PUT_ALL,
139       ALLOWS_NULL_VALUES})
testPutAll_nullValueSupported()140   public void testPutAll_nullValueSupported() {
141     putAll(containsNullValue);
142     expectAdded(containsNullValue.get(0));
143   }
144 
145   @MapFeature.Require(value = SUPPORTS_PUT_ALL,
146       absent = ALLOWS_NULL_VALUES)
testAdd_nullValueUnsupported()147   public void testAdd_nullValueUnsupported() {
148     try {
149       putAll(containsNullValue);
150       fail("putAll(containsNullValue) should throw");
151     } catch (NullPointerException expected) {
152     }
153     expectUnchanged();
154     expectNullValueMissingWhenNullValuesUnsupported(
155         "Should not contain null value after unsupported " +
156         "putAll(containsNullValue)");
157   }
158 
159   @MapFeature.Require(SUPPORTS_PUT_ALL)
testPutAll_nullCollectionReference()160   public void testPutAll_nullCollectionReference() {
161     try {
162       getMap().putAll(null);
163       fail("putAll(null) should throw NullPointerException");
164     } catch (NullPointerException expected) {
165     }
166   }
167 
emptyMap()168   private Map<K, V> emptyMap() {
169     return Collections.emptyMap();
170   }
171 
putAll(Iterable<Entry<K, V>> entries)172   private void putAll(Iterable<Entry<K, V>> entries) {
173     Map<K, V> map = new LinkedHashMap<K, V>();
174     for (Entry<K, V> entry : entries) {
175       map.put(entry.getKey(), entry.getValue());
176     }
177     getMap().putAll(map);
178   }
179 }
180