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