• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 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;
18 
19 import com.google.common.collect.testing.SetTestSuiteBuilder;
20 import com.google.common.collect.testing.TestStringSetGenerator;
21 import com.google.common.collect.testing.features.CollectionFeature;
22 import com.google.common.collect.testing.features.CollectionSize;
23 import com.google.common.collect.testing.google.MultisetTestSuiteBuilder;
24 import com.google.common.collect.testing.google.TestStringMultisetGenerator;
25 
26 import junit.framework.Test;
27 import junit.framework.TestSuite;
28 
29 import java.util.Arrays;
30 import java.util.Collection;
31 import java.util.Collections;
32 import java.util.Iterator;
33 import java.util.Set;
34 
35 /**
36  * Tests for {@link ForwardingMultiset}.
37  *
38  * @author Hayward Chan
39  * @author Louis Wasserman
40  */
41 public class ForwardingMultisetTest extends ForwardingTestCase {
42 
43   static final class StandardImplForwardingMultiset<T>
44       extends ForwardingMultiset<T> {
45     private final Multiset<T> backingCollection;
46 
StandardImplForwardingMultiset(Multiset<T> backingMultiset)47     StandardImplForwardingMultiset(Multiset<T> backingMultiset) {
48       this.backingCollection = backingMultiset;
49     }
50 
delegate()51     @Override protected Multiset<T> delegate() {
52       return backingCollection;
53     }
54 
addAll(Collection<? extends T> collection)55     @Override public boolean addAll(Collection<? extends T> collection) {
56       return standardAddAll(collection);
57     }
58 
add(T element)59     @Override public boolean add(T element) {
60       return standardAdd(element);
61     }
62 
clear()63     @Override public void clear() {
64       standardClear();
65     }
66 
count(Object element)67     @Override public int count(Object element) {
68       return standardCount(element);
69     }
70 
contains(Object object)71     @Override public boolean contains(Object object) {
72       return standardContains(object);
73     }
74 
containsAll(Collection<?> collection)75     @Override public boolean containsAll(Collection<?> collection) {
76       return standardContainsAll(collection);
77     }
78 
remove(Object object)79     @Override public boolean remove(Object object) {
80       return standardRemove(object);
81     }
82 
removeAll(Collection<?> collection)83     @Override public boolean removeAll(Collection<?> collection) {
84       return standardRemoveAll(collection);
85     }
86 
retainAll(Collection<?> collection)87     @Override public boolean retainAll(Collection<?> collection) {
88       return standardRetainAll(collection);
89     }
90 
toArray()91     @Override public Object[] toArray() {
92       return standardToArray();
93     }
94 
toArray(T[] array)95     @Override public <T> T[] toArray(T[] array) {
96       return standardToArray(array);
97     }
98 
toString()99     @Override public String toString() {
100       return standardToString();
101     }
102 
equals(Object object)103     @Override public boolean equals(Object object) {
104       return standardEquals(object);
105     }
106 
hashCode()107     @Override public int hashCode() {
108       return standardHashCode();
109     }
110 
setCount(T element, int oldCount, int newCount)111     @Override public boolean setCount(T element, int oldCount, int newCount) {
112       return standardSetCount(element, oldCount, newCount);
113     }
114 
setCount(T element, int count)115     @Override public int setCount(T element, int count) {
116       return standardSetCount(element, count);
117     }
118 
elementSet()119     @Override public Set<T> elementSet() {
120       return new StandardElementSet();
121     }
122 
iterator()123     @Override public Iterator<T> iterator() {
124       return standardIterator();
125     }
126 
isEmpty()127     @Override public boolean isEmpty() {
128       return standardIsEmpty();
129     }
130 
size()131     @Override public int size() {
132       return standardSize();
133     }
134   }
135 
136   private static final Collection<String> EMPTY_COLLECTION =
137       Collections.emptyList();
138 
139   protected Multiset<String> forward;
140 
suite()141   public static Test suite() {
142     TestSuite suite = new TestSuite();
143 
144     suite.addTestSuite(ForwardingMultisetTest.class);
145     suite.addTest(
146         MultisetTestSuiteBuilder.using(new TestStringMultisetGenerator() {
147 
148           @Override protected Multiset<String> create(String[] elements) {
149             return new StandardImplForwardingMultiset<String>(
150                 LinkedHashMultiset.create(Arrays.asList(elements)));
151           }
152         }).named("ForwardingMultiset[LinkedHashMultiset] with standard "
153             + "implementations").withFeatures(CollectionSize.ANY,
154             CollectionFeature.ALLOWS_NULL_VALUES,
155             CollectionFeature.GENERAL_PURPOSE).createTestSuite());
156     suite.addTest(
157         MultisetTestSuiteBuilder.using(new TestStringMultisetGenerator() {
158 
159           @Override protected Multiset<String> create(String[] elements) {
160             return new StandardImplForwardingMultiset<String>(
161                 ImmutableMultiset.copyOf(elements));
162           }
163         }).named("ForwardingMultiset[ImmutableMultiset] with standard "
164             + "implementations")
165             .withFeatures(CollectionSize.ANY,
166                 CollectionFeature.ALLOWS_NULL_QUERIES)
167             .createTestSuite());
168     suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() {
169 
170       /**
171        * Returns a Multiset that throws an exception on any attempt to use a
172        * method not specifically authorized by the elementSet() or hashCode()
173        * docs.
174        */
175       @Override protected Set<String> create(String[] elements) {
176         final Multiset<String> inner =
177             LinkedHashMultiset.create(Arrays.asList(elements));
178         return new ForwardingMultiset<String>() {
179           @Override protected Multiset<String> delegate() {
180             return inner;
181           }
182 
183           @Override public Set<String> elementSet() {
184             return new StandardElementSet();
185           }
186 
187           @Override public int add(String element, int occurrences) {
188             throw new UnsupportedOperationException();
189           }
190           @Override public Set<Entry<String>> entrySet() {
191             final Set<Entry<String>> backingSet = super.entrySet();
192             return new ForwardingSet<Entry<String>>() {
193               @Override protected Set<Entry<String>> delegate() {
194                 return backingSet;
195               }
196               @Override public boolean add(Entry<String> element) {
197                 throw new UnsupportedOperationException();
198               }
199               @Override public boolean addAll(
200                   Collection<? extends Entry<String>> collection) {
201                 throw new UnsupportedOperationException();
202               }
203               @Override public void clear() {
204                 throw new UnsupportedOperationException();
205               }
206               @Override public boolean contains(Object object) {
207                 throw new UnsupportedOperationException();
208               }
209               @Override public boolean containsAll(Collection<?> collection) {
210                 throw new UnsupportedOperationException();
211               }
212               @Override public boolean isEmpty() {
213                 throw new UnsupportedOperationException();
214               }
215               @Override public boolean remove(Object object) {
216                 throw new UnsupportedOperationException();
217               }
218               @Override public boolean removeAll(Collection<?> collection) {
219                 throw new UnsupportedOperationException();
220               }
221               @Override public boolean retainAll(Collection<?> collection) {
222                 throw new UnsupportedOperationException();
223               }
224             };
225           }
226           @Override public boolean equals(Object object) {
227             throw new UnsupportedOperationException();
228           }
229           @Override public boolean remove(Object element) {
230             throw new UnsupportedOperationException();
231           }
232           @Override public boolean setCount(
233               String element, int oldCount, int newCount) {
234             throw new UnsupportedOperationException();
235           }
236           @Override public int setCount(String element, int count) {
237             throw new UnsupportedOperationException();
238           }
239           @Override public boolean add(String element) {
240             throw new UnsupportedOperationException();
241           }
242           @Override public boolean addAll(
243               Collection<? extends String> collection) {
244             throw new UnsupportedOperationException();
245           }
246           @Override public Iterator<String> iterator() {
247             throw new UnsupportedOperationException();
248           }
249           @Override public boolean removeAll(Collection<?> collection) {
250             throw new UnsupportedOperationException();
251           }
252           @Override public boolean retainAll(Collection<?> collection) {
253             throw new UnsupportedOperationException();
254           }
255           @Override public int size() {
256             throw new UnsupportedOperationException();
257           }
258         }.elementSet();
259       }
260     }).named("standardElementSet tripwire").withFeatures(CollectionSize.ANY,
261         CollectionFeature.ALLOWS_NULL_VALUES,
262         CollectionFeature.REMOVE_OPERATIONS).createTestSuite());
263 
264     return suite;
265   }
266 
setUp()267   @Override public void setUp() throws Exception {
268     super.setUp();
269     /*
270      * Class parameters must be raw, so we can't create a proxy with generic
271      * type arguments. The created proxy only records calls and returns null, so
272      * the type is irrelevant at runtime.
273      */
274     @SuppressWarnings("unchecked")
275     final Multiset<String> multiset = createProxyInstance(Multiset.class);
276     forward = new ForwardingMultiset<String>() {
277       @Override protected Multiset<String> delegate() {
278         return multiset;
279       }
280     };
281   }
282 
testAdd_T()283   public void testAdd_T() {
284     forward().add("asdf");
285     assertEquals("[add(Object)]", getCalls());
286   }
287 
testAddAll_Collection()288   public void testAddAll_Collection() {
289     forward().addAll(EMPTY_COLLECTION);
290     assertEquals("[addAll(Collection)]", getCalls());
291   }
292 
testClear()293   public void testClear() {
294     forward().clear();
295     assertEquals("[clear]", getCalls());
296   }
297 
testContains_Object()298   public void testContains_Object() {
299     forward().contains(null);
300     assertEquals("[contains(Object)]", getCalls());
301   }
302 
testContainsAll_Collection()303   public void testContainsAll_Collection() {
304     forward().containsAll(EMPTY_COLLECTION);
305     assertEquals("[containsAll(Collection)]", getCalls());
306   }
307 
testIsEmpty()308   public void testIsEmpty() {
309     forward().isEmpty();
310     assertEquals("[isEmpty]", getCalls());
311   }
312 
testIterator()313   public void testIterator() {
314     forward().iterator();
315     assertEquals("[iterator]", getCalls());
316   }
317 
testRemove_Object()318   public void testRemove_Object() {
319     forward().remove(null);
320     assertEquals("[remove(Object)]", getCalls());
321   }
322 
testRemoveAll_Collection()323   public void testRemoveAll_Collection() {
324     forward().removeAll(EMPTY_COLLECTION);
325     assertEquals("[removeAll(Collection)]", getCalls());
326   }
327 
testRetainAll_Collection()328   public void testRetainAll_Collection() {
329     forward().retainAll(EMPTY_COLLECTION);
330     assertEquals("[retainAll(Collection)]", getCalls());
331   }
332 
testSize()333   public void testSize() {
334     forward().size();
335     assertEquals("[size]", getCalls());
336   }
337 
testToArray()338   public void testToArray() {
339     forward().toArray();
340     assertEquals("[toArray]", getCalls());
341   }
342 
testToArray_TArray()343   public void testToArray_TArray() {
344     forward().toArray(new String[0]);
345     assertEquals("[toArray(Object[])]", getCalls());
346   }
347 
testToString()348   public void testToString() {
349     forward().toString();
350     assertEquals("[toString]", getCalls());
351   }
352 
testEquals_Object()353   public void testEquals_Object() {
354     forward().equals("asdf");
355     assertEquals("[equals(Object)]", getCalls());
356   }
357 
testHashCode()358   public void testHashCode() {
359     forward().hashCode();
360     assertEquals("[hashCode]", getCalls());
361   }
362 
testCount_Object()363   public void testCount_Object() {
364     forward().count(null);
365     assertEquals("[count(Object)]", getCalls());
366   }
367 
testAdd_Object_int()368   public void testAdd_Object_int() {
369     forward().add("asd", 23);
370     assertEquals("[add(Object,int)]", getCalls());
371   }
372 
testRemove_Object_int()373   public void testRemove_Object_int() {
374     forward().remove("asd", 23);
375     assertEquals("[remove(Object,int)]", getCalls());
376   }
377 
testSetCount_Object_int()378   public void testSetCount_Object_int() {
379     forward().setCount("asdf", 233);
380     assertEquals("[setCount(Object,int)]", getCalls());
381   }
382 
testSetCount_Object_oldCount_newCount()383   public void testSetCount_Object_oldCount_newCount() {
384     forward().setCount("asdf", 4552, 1233);
385     assertEquals("[setCount(Object,int,int)]", getCalls());
386   }
387 
testElementSet()388   public void testElementSet() {
389     forward().elementSet();
390     assertEquals("[elementSet]", getCalls());
391   }
392 
testEntrySet()393   public void testEntrySet() {
394     forward().entrySet();
395     assertEquals("[entrySet]", getCalls());
396   }
397 
forward()398   protected Multiset<String> forward() {
399     return forward;
400   }
401 }
402