1 /*
2  * Copyright (C) 2012 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.google;
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;
23 import static com.google.common.collect.testing.features.MapFeature.SUPPORTS_REMOVE;
24 import static org.truth0.Truth.ASSERT;
25 
26 import com.google.common.annotations.GwtCompatible;
27 import com.google.common.collect.Multimap;
28 import com.google.common.collect.testing.Helpers;
29 import com.google.common.collect.testing.features.CollectionSize;
30 import com.google.common.collect.testing.features.MapFeature;
31 
32 import java.util.ArrayList;
33 import java.util.Arrays;
34 import java.util.Collection;
35 import java.util.Collections;
36 import java.util.List;
37 
38 /**
39  * Tests for {@link Multimap#replaceValues(Object, Iterable)}.
40  *
41  * @author Louis Wasserman
42  */
43 @GwtCompatible
44 public class MultimapReplaceValuesTester<K, V>
45     extends AbstractMultimapTester<K, V, Multimap<K, V>> {
46 
47   @MapFeature.Require({SUPPORTS_PUT, SUPPORTS_REMOVE, ALLOWS_NULL_VALUES})
testReplaceValuesWithNullValue()48   public void testReplaceValuesWithNullValue() {
49     int size = multimap().size();
50     K key = sampleKeys().e0;
51     @SuppressWarnings("unchecked")
52     List<V> values = Arrays.asList(sampleValues().e0, null, sampleValues().e3);
53     multimap().replaceValues(key, values);
54     assertGet(key, values);
55   }
56 
57   @MapFeature.Require({SUPPORTS_PUT, SUPPORTS_REMOVE, ALLOWS_NULL_KEYS})
testReplaceValuesWithNullKey()58   public void testReplaceValuesWithNullKey() {
59     int size = multimap().size();
60     K key = null;
61     @SuppressWarnings("unchecked")
62     List<V> values = Arrays.asList(sampleValues().e0, sampleValues().e2, sampleValues().e3);
63     multimap().replaceValues(key, values);
64     assertGet(key, values);
65   }
66 
67   @MapFeature.Require({SUPPORTS_PUT, SUPPORTS_REMOVE})
testReplaceEmptyValues()68   public void testReplaceEmptyValues() {
69     int size = multimap().size();
70     K key = sampleKeys().e3;
71     @SuppressWarnings("unchecked")
72     List<V> values = Arrays.asList(sampleValues().e0, sampleValues().e2, sampleValues().e3);
73     multimap().replaceValues(key, values);
74     assertGet(key, values);
75     assertEquals(size + values.size(), multimap().size());
76   }
77 
78   @MapFeature.Require({SUPPORTS_PUT, SUPPORTS_REMOVE})
testReplaceValuesWithEmpty()79   public void testReplaceValuesWithEmpty() {
80     int size = multimap().size();
81     K key = sampleKeys().e0;
82     List<V> oldValues = new ArrayList<V>(multimap().get(key));
83     @SuppressWarnings("unchecked")
84     List<V> values = Collections.emptyList();
85     assertEquals(oldValues, new ArrayList<V>(multimap().replaceValues(key, values)));
86     assertGet(key);
87     assertEquals(size - oldValues.size(), multimap().size());
88   }
89 
90   @MapFeature.Require({SUPPORTS_PUT, SUPPORTS_REMOVE})
testReplaceValuesWithDuplicates()91   public void testReplaceValuesWithDuplicates() {
92     int size = multimap().size();
93     K key = sampleKeys().e0;
94     List<V> oldValues = new ArrayList<V>(multimap().get(key));
95     List<V> values = Arrays.asList(
96         sampleValues().e0,
97         sampleValues().e3,
98         sampleValues().e0);
99     assertEquals(oldValues, new ArrayList<V>(multimap().replaceValues(key, values)));
100     assertEquals(
101         size - oldValues.size() + multimap().get(key).size(),
102         multimap().size());
103     assertTrue(multimap().get(key).containsAll(values));
104   }
105 
106   @CollectionSize.Require(absent = ZERO)
107   @MapFeature.Require({SUPPORTS_PUT, SUPPORTS_REMOVE})
testReplaceNonEmptyValues()108   public void testReplaceNonEmptyValues() {
109     List<K> keys = Helpers.copyToList(multimap().keySet());
110     @SuppressWarnings("unchecked")
111     List<V> values = Arrays.asList(sampleValues().e0, sampleValues().e2, sampleValues().e3);
112 
113     for (K k : keys) {
114       resetContainer();
115 
116       int size = multimap().size();
117       Collection<V> oldKeyValues = Helpers.copyToList(multimap().get(k));
118       multimap().replaceValues(k, values);
119       assertGet(k, values);
120       assertEquals(size + values.size() - oldKeyValues.size(), multimap().size());
121     }
122   }
123 
124   @MapFeature.Require({SUPPORTS_PUT, SUPPORTS_REMOVE})
testReplaceValuesPropagatesToGet()125   public void testReplaceValuesPropagatesToGet() {
126     K key = sampleKeys().e0;
127     Collection<V> getCollection = multimap().get(key);
128     @SuppressWarnings("unchecked")
129     List<V> values = Arrays.asList(sampleValues().e0, sampleValues().e2, sampleValues().e3);
130     multimap().replaceValues(key, values);
131     ASSERT.that(getCollection).has().exactly(
132         sampleValues().e0, sampleValues().e2, sampleValues().e3);
133   }
134 
135   @MapFeature.Require(absent = SUPPORTS_REMOVE)
136   @CollectionSize.Require(absent = ZERO)
testReplaceValuesRemoveNotSupported()137   public void testReplaceValuesRemoveNotSupported() {
138     List<V> values = Collections.singletonList(sampleValues().e3);
139     try {
140       multimap().replaceValues(sampleKeys().e0, values);
141       fail("Expected UnsupportedOperationException");
142     } catch (UnsupportedOperationException expected) {
143       // success
144     }
145   }
146 
147   @MapFeature.Require(absent = SUPPORTS_PUT)
testReplaceValuesPutNotSupported()148   public void testReplaceValuesPutNotSupported() {
149     List<V> values = Collections.singletonList(sampleValues().e3);
150     try {
151       multimap().replaceValues(sampleKeys().e0, values);
152       fail("Expected UnsupportedOperationException");
153     } catch (UnsupportedOperationException expected) {
154       // success
155     }
156   }
157 }
158