• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
17 package com.google.common.collect;
18 
19 import static com.google.common.base.Preconditions.checkArgument;
20 import static com.google.common.truth.Truth.assertThat;
21 import static java.util.Arrays.asList;
22 
23 import com.google.common.annotations.GwtCompatible;
24 import com.google.common.annotations.GwtIncompatible;
25 import com.google.common.collect.testing.ListTestSuiteBuilder;
26 import com.google.common.collect.testing.MinimalCollection;
27 import com.google.common.collect.testing.SetTestSuiteBuilder;
28 import com.google.common.collect.testing.TestStringListGenerator;
29 import com.google.common.collect.testing.TestStringSetGenerator;
30 import com.google.common.collect.testing.features.CollectionFeature;
31 import com.google.common.collect.testing.features.CollectionSize;
32 import com.google.common.collect.testing.google.MultisetTestSuiteBuilder;
33 import com.google.common.collect.testing.google.TestStringMultisetGenerator;
34 import com.google.common.collect.testing.google.UnmodifiableCollectionTests;
35 import com.google.common.testing.EqualsTester;
36 import com.google.common.testing.NullPointerTester;
37 import com.google.common.testing.SerializableTester;
38 
39 import junit.framework.Test;
40 import junit.framework.TestCase;
41 import junit.framework.TestSuite;
42 
43 import java.util.ArrayList;
44 import java.util.Collection;
45 import java.util.HashSet;
46 import java.util.Iterator;
47 import java.util.List;
48 import java.util.Set;
49 
50 /**
51  * Tests for {@link ImmutableMultiset}.
52  *
53  * @author Jared Levy
54  */
55 @GwtCompatible(emulated = true)
56 public class ImmutableMultisetTest extends TestCase {
57 
58   @GwtIncompatible("suite") // TODO(cpovirk): add to collect/gwt/suites
suite()59   public static Test suite() {
60     TestSuite suite = new TestSuite();
61     suite.addTestSuite(ImmutableMultisetTest.class);
62 
63     suite.addTest(MultisetTestSuiteBuilder.using(
64         new TestStringMultisetGenerator() {
65           @Override protected Multiset<String> create(String[] elements) {
66             return ImmutableMultiset.copyOf(elements);
67           }
68         })
69         .named("ImmutableMultiset")
70         .withFeatures(CollectionSize.ANY,
71             CollectionFeature.SERIALIZABLE_INCLUDING_VIEWS,
72             CollectionFeature.ALLOWS_NULL_QUERIES)
73         .createTestSuite());
74 
75     suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() {
76           @Override protected Set<String> create(String[] elements) {
77             return ImmutableMultiset.copyOf(elements).elementSet();
78           }
79         })
80         .named("ImmutableMultiset, element set")
81         .withFeatures(CollectionSize.ANY,
82             CollectionFeature.SERIALIZABLE,
83             CollectionFeature.ALLOWS_NULL_QUERIES)
84         .createTestSuite());
85 
86     suite.addTest(ListTestSuiteBuilder.using(new TestStringListGenerator() {
87           @Override protected List<String> create(String[] elements) {
88             return ImmutableMultiset.copyOf(elements).asList();
89           }
90 
91           @Override
92           public List<String> order(List<String> insertionOrder) {
93             List<String> order = new ArrayList<String>();
94             for (String s : insertionOrder) {
95               int index = order.indexOf(s);
96               if (index == -1) {
97                 order.add(s);
98               } else {
99                 order.add(index, s);
100               }
101             }
102             return order;
103           }
104         })
105         .named("ImmutableMultiset.asList")
106         .withFeatures(CollectionSize.ANY,
107             CollectionFeature.SERIALIZABLE,
108             CollectionFeature.ALLOWS_NULL_QUERIES)
109         .createTestSuite());
110 
111     suite.addTest(ListTestSuiteBuilder.using(new TestStringListGenerator() {
112           @Override protected List<String> create(String[] elements) {
113             Set<String> set = new HashSet<String>();
114             ImmutableMultiset.Builder<String> builder = ImmutableMultiset.builder();
115             for (String s : elements) {
116               checkArgument(set.add(s));
117               builder.addCopies(s, 2);
118             }
119             ImmutableSet<String> elementSet = (ImmutableSet<String>) builder.build().elementSet();
120             return elementSet.asList();
121           }
122         })
123         .named("ImmutableMultiset.elementSet.asList")
124         .withFeatures(CollectionSize.ANY,
125             CollectionFeature.REJECTS_DUPLICATES_AT_CREATION,
126             CollectionFeature.SERIALIZABLE,
127             CollectionFeature.ALLOWS_NULL_QUERIES)
128         .createTestSuite());
129 
130     return suite;
131   }
132 
testCreation_noArgs()133   public void testCreation_noArgs() {
134     Multiset<String> multiset = ImmutableMultiset.of();
135     assertTrue(multiset.isEmpty());
136   }
137 
testCreation_oneElement()138   public void testCreation_oneElement() {
139     Multiset<String> multiset = ImmutableMultiset.of("a");
140     assertEquals(HashMultiset.create(asList("a")), multiset);
141   }
142 
testCreation_twoElements()143   public void testCreation_twoElements() {
144     Multiset<String> multiset = ImmutableMultiset.of("a", "b");
145     assertEquals(HashMultiset.create(asList("a", "b")), multiset);
146   }
147 
testCreation_threeElements()148   public void testCreation_threeElements() {
149     Multiset<String> multiset = ImmutableMultiset.of("a", "b", "c");
150     assertEquals(HashMultiset.create(asList("a", "b", "c")), multiset);
151   }
152 
testCreation_fourElements()153   public void testCreation_fourElements() {
154     Multiset<String> multiset = ImmutableMultiset.of("a", "b", "c", "d");
155     assertEquals(HashMultiset.create(asList("a", "b", "c", "d")), multiset);
156   }
157 
testCreation_fiveElements()158   public void testCreation_fiveElements() {
159     Multiset<String> multiset = ImmutableMultiset.of("a", "b", "c", "d", "e");
160     assertEquals(HashMultiset.create(asList("a", "b", "c", "d", "e")),
161         multiset);
162   }
163 
testCreation_sixElements()164   public void testCreation_sixElements() {
165     Multiset<String> multiset = ImmutableMultiset.of(
166         "a", "b", "c", "d", "e", "f");
167     assertEquals(HashMultiset.create(asList("a", "b", "c", "d", "e", "f")),
168         multiset);
169   }
170 
testCreation_sevenElements()171   public void testCreation_sevenElements() {
172     Multiset<String> multiset = ImmutableMultiset.of(
173         "a", "b", "c", "d", "e", "f", "g");
174     assertEquals(
175         HashMultiset.create(asList("a", "b", "c", "d", "e", "f", "g")),
176         multiset);
177   }
178 
testCreation_emptyArray()179   public void testCreation_emptyArray() {
180     String[] array = new String[0];
181     Multiset<String> multiset = ImmutableMultiset.copyOf(array);
182     assertTrue(multiset.isEmpty());
183   }
184 
testCreation_arrayOfOneElement()185   public void testCreation_arrayOfOneElement() {
186     String[] array = new String[] { "a" };
187     Multiset<String> multiset = ImmutableMultiset.copyOf(array);
188     assertEquals(HashMultiset.create(asList("a")), multiset);
189   }
190 
testCreation_arrayOfArray()191   public void testCreation_arrayOfArray() {
192     String[] array = new String[] { "a" };
193     Multiset<String[]> multiset = ImmutableMultiset.<String[]>of(array);
194     Multiset<String[]> expected = HashMultiset.create();
195     expected.add(array);
196     assertEquals(expected, multiset);
197   }
198 
testCreation_arrayContainingOnlyNull()199   public void testCreation_arrayContainingOnlyNull() {
200     String[] array = new String[] { null };
201     try {
202       ImmutableMultiset.copyOf(array);
203       fail();
204     } catch (NullPointerException expected) {}
205   }
206 
testCopyOf_collection_empty()207   public void testCopyOf_collection_empty() {
208     // "<String>" is required to work around a javac 1.5 bug.
209     Collection<String> c = MinimalCollection.<String>of();
210     Multiset<String> multiset = ImmutableMultiset.copyOf(c);
211     assertTrue(multiset.isEmpty());
212   }
213 
testCopyOf_collection_oneElement()214   public void testCopyOf_collection_oneElement() {
215     Collection<String> c = MinimalCollection.of("a");
216     Multiset<String> multiset = ImmutableMultiset.copyOf(c);
217     assertEquals(HashMultiset.create(asList("a")), multiset);
218   }
219 
testCopyOf_collection_general()220   public void testCopyOf_collection_general() {
221     Collection<String> c = MinimalCollection.of("a", "b", "a");
222     Multiset<String> multiset = ImmutableMultiset.copyOf(c);
223     assertEquals(HashMultiset.create(asList("a", "b", "a")), multiset);
224   }
225 
testCopyOf_collectionContainingNull()226   public void testCopyOf_collectionContainingNull() {
227     Collection<String> c = MinimalCollection.of("a", null, "b");
228     try {
229       ImmutableMultiset.copyOf(c);
230       fail();
231     } catch (NullPointerException expected) {}
232   }
233 
testCopyOf_multiset_empty()234   public void testCopyOf_multiset_empty() {
235     Multiset<String> c = HashMultiset.create();
236     Multiset<String> multiset = ImmutableMultiset.copyOf(c);
237     assertTrue(multiset.isEmpty());
238   }
239 
testCopyOf_multiset_oneElement()240   public void testCopyOf_multiset_oneElement() {
241     Multiset<String> c = HashMultiset.create(asList("a"));
242     Multiset<String> multiset = ImmutableMultiset.copyOf(c);
243     assertEquals(HashMultiset.create(asList("a")), multiset);
244   }
245 
testCopyOf_multiset_general()246   public void testCopyOf_multiset_general() {
247     Multiset<String> c = HashMultiset.create(asList("a", "b", "a"));
248     Multiset<String> multiset = ImmutableMultiset.copyOf(c);
249     assertEquals(HashMultiset.create(asList("a", "b", "a")), multiset);
250   }
251 
testCopyOf_multisetContainingNull()252   public void testCopyOf_multisetContainingNull() {
253     Multiset<String> c = HashMultiset.create(asList("a", null, "b"));
254     try {
255       ImmutableMultiset.copyOf(c);
256       fail();
257     } catch (NullPointerException expected) {}
258   }
259 
testCopyOf_iterator_empty()260   public void testCopyOf_iterator_empty() {
261     Iterator<String> iterator = Iterators.emptyIterator();
262     Multiset<String> multiset = ImmutableMultiset.copyOf(iterator);
263     assertTrue(multiset.isEmpty());
264   }
265 
testCopyOf_iterator_oneElement()266   public void testCopyOf_iterator_oneElement() {
267     Iterator<String> iterator = Iterators.singletonIterator("a");
268     Multiset<String> multiset = ImmutableMultiset.copyOf(iterator);
269     assertEquals(HashMultiset.create(asList("a")), multiset);
270   }
271 
testCopyOf_iterator_general()272   public void testCopyOf_iterator_general() {
273     Iterator<String> iterator = asList("a", "b", "a").iterator();
274     Multiset<String> multiset = ImmutableMultiset.copyOf(iterator);
275     assertEquals(HashMultiset.create(asList("a", "b", "a")), multiset);
276   }
277 
testCopyOf_iteratorContainingNull()278   public void testCopyOf_iteratorContainingNull() {
279     Iterator<String> iterator = asList("a", null, "b").iterator();
280     try {
281       ImmutableMultiset.copyOf(iterator);
282       fail();
283     } catch (NullPointerException expected) {}
284   }
285 
286   private static class CountingIterable implements Iterable<String> {
287     int count = 0;
288     @Override
iterator()289     public Iterator<String> iterator() {
290       count++;
291       return asList("a", "b", "a").iterator();
292     }
293   }
294 
testCopyOf_plainIterable()295   public void testCopyOf_plainIterable() {
296     CountingIterable iterable = new CountingIterable();
297     Multiset<String> multiset = ImmutableMultiset.copyOf(iterable);
298     assertEquals(HashMultiset.create(asList("a", "b", "a")), multiset);
299     assertEquals(1, iterable.count);
300   }
301 
testCopyOf_shortcut_empty()302   public void testCopyOf_shortcut_empty() {
303     Collection<String> c = ImmutableMultiset.of();
304     assertSame(c, ImmutableMultiset.copyOf(c));
305   }
306 
testCopyOf_shortcut_singleton()307   public void testCopyOf_shortcut_singleton() {
308     Collection<String> c = ImmutableMultiset.of("a");
309     assertSame(c, ImmutableMultiset.copyOf(c));
310   }
311 
testCopyOf_shortcut_immutableMultiset()312   public void testCopyOf_shortcut_immutableMultiset() {
313     Collection<String> c = ImmutableMultiset.of("a", "b", "c");
314     assertSame(c, ImmutableMultiset.copyOf(c));
315   }
316 
testBuilderAdd()317   public void testBuilderAdd() {
318     ImmutableMultiset<String> multiset = new ImmutableMultiset.Builder<String>()
319         .add("a")
320         .add("b")
321         .add("a")
322         .add("c")
323         .build();
324     assertEquals(HashMultiset.create(asList("a", "b", "a", "c")), multiset);
325   }
326 
testBuilderAddAll()327   public void testBuilderAddAll() {
328     List<String> a = asList("a", "b");
329     List<String> b = asList("c", "d");
330     ImmutableMultiset<String> multiset = new ImmutableMultiset.Builder<String>()
331         .addAll(a)
332         .addAll(b)
333         .build();
334     assertEquals(HashMultiset.create(asList("a", "b", "c", "d")), multiset);
335   }
336 
testBuilderAddAllMultiset()337   public void testBuilderAddAllMultiset() {
338     Multiset<String> a = HashMultiset.create(asList("a", "b", "b"));
339     Multiset<String> b = HashMultiset.create(asList("c", "b"));
340     ImmutableMultiset<String> multiset = new ImmutableMultiset.Builder<String>()
341         .addAll(a)
342         .addAll(b)
343         .build();
344     assertEquals(
345         HashMultiset.create(asList("a", "b", "b", "b", "c")), multiset);
346   }
347 
testBuilderAddAllIterator()348   public void testBuilderAddAllIterator() {
349     Iterator<String> iterator = asList("a", "b", "a", "c").iterator();
350     ImmutableMultiset<String> multiset = new ImmutableMultiset.Builder<String>()
351         .addAll(iterator)
352         .build();
353     assertEquals(HashMultiset.create(asList("a", "b", "a", "c")), multiset);
354   }
355 
testBuilderAddCopies()356   public void testBuilderAddCopies() {
357     ImmutableMultiset<String> multiset = new ImmutableMultiset.Builder<String>()
358         .addCopies("a", 2)
359         .addCopies("b", 3)
360         .addCopies("c", 0)
361         .build();
362     assertEquals(
363         HashMultiset.create(asList("a", "a", "b", "b", "b")), multiset);
364   }
365 
testBuilderSetCount()366   public void testBuilderSetCount() {
367     ImmutableMultiset<String> multiset = new ImmutableMultiset.Builder<String>()
368         .add("a")
369         .setCount("a", 2)
370         .setCount("b", 3)
371         .build();
372     assertEquals(
373         HashMultiset.create(asList("a", "a", "b", "b", "b")), multiset);
374   }
375 
testBuilderAddHandlesNullsCorrectly()376   public void testBuilderAddHandlesNullsCorrectly() {
377     ImmutableMultiset.Builder<String> builder = ImmutableMultiset.builder();
378     try {
379       builder.add((String) null);
380       fail("expected NullPointerException");
381     } catch (NullPointerException expected) {}
382   }
383 
testBuilderAddAllHandlesNullsCorrectly()384   public void testBuilderAddAllHandlesNullsCorrectly() {
385     ImmutableMultiset.Builder<String> builder = ImmutableMultiset.builder();
386     try {
387       builder.addAll((Collection<String>) null);
388       fail("expected NullPointerException");
389     } catch (NullPointerException expected) {}
390 
391     builder = ImmutableMultiset.builder();
392     List<String> listWithNulls = asList("a", null, "b");
393     try {
394       builder.addAll(listWithNulls);
395       fail("expected NullPointerException");
396     } catch (NullPointerException expected) {}
397 
398     builder = ImmutableMultiset.builder();
399     Multiset<String> multisetWithNull
400         = LinkedHashMultiset.create(asList("a", null, "b"));
401     try {
402       builder.addAll(multisetWithNull);
403       fail("expected NullPointerException");
404     } catch (NullPointerException expected) {}
405   }
406 
testBuilderAddCopiesHandlesNullsCorrectly()407   public void testBuilderAddCopiesHandlesNullsCorrectly() {
408     ImmutableMultiset.Builder<String> builder = ImmutableMultiset.builder();
409     try {
410       builder.addCopies(null, 2);
411       fail("expected NullPointerException");
412     } catch (NullPointerException expected) {}
413   }
414 
testBuilderAddCopiesIllegal()415   public void testBuilderAddCopiesIllegal() {
416     ImmutableMultiset.Builder<String> builder = ImmutableMultiset.builder();
417     try {
418       builder.addCopies("a", -2);
419       fail("expected IllegalArgumentException");
420     } catch (IllegalArgumentException expected) {}
421   }
422 
testBuilderSetCountHandlesNullsCorrectly()423   public void testBuilderSetCountHandlesNullsCorrectly() {
424     ImmutableMultiset.Builder<String> builder = ImmutableMultiset.builder();
425     try {
426       builder.setCount(null, 2);
427       fail("expected NullPointerException");
428     } catch (NullPointerException expected) {}
429   }
430 
testBuilderSetCountIllegal()431   public void testBuilderSetCountIllegal() {
432     ImmutableMultiset.Builder<String> builder = ImmutableMultiset.builder();
433     try {
434       builder.setCount("a", -2);
435       fail("expected IllegalArgumentException");
436     } catch (IllegalArgumentException expected) {}
437   }
438 
439   @GwtIncompatible("NullPointerTester")
testNullPointers()440   public void testNullPointers() {
441     NullPointerTester tester = new NullPointerTester();
442     tester.testAllPublicStaticMethods(ImmutableMultiset.class);
443   }
444 
445   @GwtIncompatible("SerializableTester")
testSerialization_empty()446   public void testSerialization_empty() {
447     Collection<String> c = ImmutableMultiset.of();
448     assertSame(c, SerializableTester.reserialize(c));
449   }
450 
451   @GwtIncompatible("SerializableTester")
testSerialization_multiple()452   public void testSerialization_multiple() {
453     Collection<String> c = ImmutableMultiset.of("a", "b", "a");
454     Collection<String> copy = SerializableTester.reserializeAndAssert(c);
455     assertThat(copy).has().exactly("a", "a", "b").inOrder();
456   }
457 
458   @GwtIncompatible("SerializableTester")
testSerialization_elementSet()459   public void testSerialization_elementSet() {
460     Multiset<String> c = ImmutableMultiset.of("a", "b", "a");
461     Collection<String> copy =
462         LenientSerializableTester.reserializeAndAssertLenient(c.elementSet());
463     assertThat(copy).has().exactly("a", "b").inOrder();
464   }
465 
466   @GwtIncompatible("SerializableTester")
testSerialization_entrySet()467   public void testSerialization_entrySet() {
468     Multiset<String> c = ImmutableMultiset.of("a", "b", "c");
469     SerializableTester.reserializeAndAssert(c.entrySet());
470   }
471 
testEquals_immutableMultiset()472   public void testEquals_immutableMultiset() {
473     Collection<String> c = ImmutableMultiset.of("a", "b", "a");
474     assertEquals(c, ImmutableMultiset.of("a", "b", "a"));
475     assertEquals(c, ImmutableMultiset.of("a", "a", "b"));
476     assertThat(c).isNotEqualTo(ImmutableMultiset.of("a", "b"));
477     assertThat(c).isNotEqualTo(ImmutableMultiset.of("a", "b", "c", "d"));
478   }
479 
testIterationOrder()480   public void testIterationOrder() {
481     Collection<String> c = ImmutableMultiset.of("a", "b", "a");
482     assertThat(c).has().exactly("a", "a", "b").inOrder();
483   }
484 
testMultisetWrites()485   public void testMultisetWrites() {
486     Multiset<String> multiset = ImmutableMultiset.of("a", "b", "a");
487     UnmodifiableCollectionTests.assertMultisetIsUnmodifiable(multiset, "test");
488   }
489 
testAsList()490   public void testAsList() {
491     ImmutableMultiset<String> multiset
492         = ImmutableMultiset.of("a", "a", "b", "b", "b");
493     ImmutableList<String> list = multiset.asList();
494     assertEquals(ImmutableList.of("a", "a", "b", "b", "b"), list);
495     assertEquals(2, list.indexOf("b"));
496     assertEquals(4, list.lastIndexOf("b"));
497   }
498 
499   @GwtIncompatible("SerializableTester")
testSerialization_asList()500   public void testSerialization_asList() {
501     ImmutableMultiset<String> multiset
502         = ImmutableMultiset.of("a", "a", "b", "b", "b");
503     SerializableTester.reserializeAndAssert(multiset.asList());
504   }
505 
testEquals()506   public void testEquals() {
507     new EqualsTester()
508         .addEqualityGroup(ImmutableMultiset.of(), ImmutableMultiset.of())
509         .addEqualityGroup(ImmutableMultiset.of(1), ImmutableMultiset.of(1))
510         .addEqualityGroup(ImmutableMultiset.of(1, 1), ImmutableMultiset.of(1, 1))
511         .addEqualityGroup(ImmutableMultiset.of(1, 2, 1), ImmutableMultiset.of(2, 1, 1))
512         .testEquals();
513   }
514 }
515