Home | History | Annotate | Download | only in collect
      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;
     18 
     19 import static java.util.Arrays.asList;
     20 
     21 import com.google.common.annotations.GwtCompatible;
     22 import com.google.common.annotations.GwtIncompatible;
     23 import com.google.common.collect.testing.features.CollectionFeature;
     24 import com.google.common.collect.testing.features.CollectionSize;
     25 import com.google.common.collect.testing.google.MultisetFeature;
     26 import com.google.common.collect.testing.google.MultisetTestSuiteBuilder;
     27 import com.google.common.collect.testing.google.TestStringMultisetGenerator;
     28 import com.google.common.testing.SerializableTester;
     29 
     30 import junit.framework.Test;
     31 import junit.framework.TestCase;
     32 import junit.framework.TestSuite;
     33 
     34 import java.io.Serializable;
     35 import java.util.Arrays;
     36 
     37 /**
     38  * Unit test for {@link HashMultiset}.
     39  *
     40  * @author Kevin Bourrillion
     41  * @author Jared Levy
     42  */
     43 @GwtCompatible(emulated = true)
     44 public class HashMultisetTest extends TestCase {
     45 
     46   @GwtIncompatible("suite")
     47   public static Test suite() {
     48     TestSuite suite = new TestSuite();
     49     suite.addTest(MultisetTestSuiteBuilder.using(hashMultisetGenerator())
     50         .withFeatures(CollectionSize.ANY,
     51             CollectionFeature.FAILS_FAST_ON_CONCURRENT_MODIFICATION,
     52             CollectionFeature.ALLOWS_NULL_VALUES,
     53             CollectionFeature.SERIALIZABLE,
     54             CollectionFeature.GENERAL_PURPOSE,
     55             MultisetFeature.ENTRIES_ARE_VIEWS)
     56         .named("HashMultiset")
     57         .createTestSuite());
     58     suite.addTestSuite(HashMultisetTest.class);
     59     return suite;
     60   }
     61 
     62   private static TestStringMultisetGenerator hashMultisetGenerator() {
     63     return new TestStringMultisetGenerator() {
     64       @Override protected Multiset<String> create(String[] elements) {
     65         return HashMultiset.create(asList(elements));
     66       }
     67     };
     68   }
     69 
     70   public void testCreate() {
     71     Multiset<String> multiset = HashMultiset.create();
     72     multiset.add("foo", 2);
     73     multiset.add("bar");
     74     assertEquals(3, multiset.size());
     75     assertEquals(2, multiset.count("foo"));
     76   }
     77 
     78   public void testCreateWithSize() {
     79     Multiset<String> multiset = HashMultiset.create(50);
     80     multiset.add("foo", 2);
     81     multiset.add("bar");
     82     assertEquals(3, multiset.size());
     83     assertEquals(2, multiset.count("foo"));
     84   }
     85 
     86   public void testCreateFromIterable() {
     87     Multiset<String> multiset
     88         = HashMultiset.create(Arrays.asList("foo", "bar", "foo"));
     89     assertEquals(3, multiset.size());
     90     assertEquals(2, multiset.count("foo"));
     91   }
     92 
     93   @GwtIncompatible("SerializableTester")
     94   public void testSerializationContainingSelf() {
     95     Multiset<Multiset<?>> multiset = HashMultiset.create();
     96     multiset.add(multiset, 2);
     97     Multiset<Multiset<?>> copy = SerializableTester.reserialize(multiset);
     98     assertEquals(2, copy.size());
     99     assertSame(copy, copy.iterator().next());
    100   }
    101 
    102   @GwtIncompatible("Only used by @GwtIncompatible code")
    103   private static class MultisetHolder implements Serializable {
    104     public Multiset<?> member;
    105     MultisetHolder(Multiset<?> multiset) {
    106       this.member = multiset;
    107     }
    108     private static final long serialVersionUID = 1L;
    109   }
    110 
    111   @GwtIncompatible("SerializableTester")
    112   public void testSerializationIndirectSelfReference() {
    113     Multiset<MultisetHolder> multiset = HashMultiset.create();
    114     MultisetHolder holder = new MultisetHolder(multiset);
    115     multiset.add(holder, 2);
    116     Multiset<MultisetHolder> copy = SerializableTester.reserialize(multiset);
    117     assertEquals(2, copy.size());
    118     assertSame(copy, copy.iterator().next().member);
    119   }
    120 
    121   /*
    122    * The behavior of toString() and iteration is tested by LinkedHashMultiset,
    123    * which shares a lot of code with HashMultiset and has deterministic
    124    * iteration order.
    125    */
    126 }
    127